Search in sources :

Example 1 with RangerServiceResourceSignature

use of org.apache.ranger.plugin.store.RangerServiceResourceSignature in project ranger by apache.

the class TagDBStore method createServiceResource.

@Override
public RangerServiceResource createServiceResource(RangerServiceResource resource) throws Exception {
    if (LOG.isDebugEnabled()) {
        LOG.debug("==> TagDBStore.createServiceResource(" + resource + ")");
    }
    if (StringUtils.isEmpty(resource.getResourceSignature())) {
        RangerServiceResourceSignature serializer = new RangerServiceResourceSignature(resource);
        resource.setResourceSignature(serializer.getSignature());
    }
    RangerServiceResource ret = rangerServiceResourceService.create(resource);
    createResourceForServiceResource(ret.getId(), resource);
    ret = rangerServiceResourceService.read(ret.getId());
    if (LOG.isDebugEnabled()) {
        LOG.debug("<== TagDBStore.createServiceResource(" + resource + ")");
    }
    return ret;
}
Also used : RangerServiceResourceSignature(org.apache.ranger.plugin.store.RangerServiceResourceSignature)

Example 2 with RangerServiceResourceSignature

use of org.apache.ranger.plugin.store.RangerServiceResourceSignature in project ranger by apache.

the class TagDBStore method updateServiceResource.

@Override
public RangerServiceResource updateServiceResource(RangerServiceResource resource) throws Exception {
    if (LOG.isDebugEnabled()) {
        LOG.debug("==> TagDBStore.updateResource(" + resource + ")");
    }
    RangerServiceResource existing = rangerServiceResourceService.read(resource.getId());
    if (existing == null) {
        throw errorUtil.createRESTException("failed to update tag [" + resource.getId() + "], Reason: No resource found with id: [" + resource.getId() + "]", MessageEnums.DATA_NOT_UPDATABLE);
    }
    if (StringUtils.isEmpty(resource.getResourceSignature())) {
        RangerServiceResourceSignature serializer = new RangerServiceResourceSignature(resource);
        resource.setResourceSignature(serializer.getSignature());
    }
    boolean serviceResourceElementUpdateNeeded = !StringUtils.equals(existing.getResourceSignature(), resource.getResourceSignature());
    resource.setCreatedBy(existing.getCreatedBy());
    resource.setCreateTime(existing.getCreateTime());
    resource.setGuid(existing.getGuid());
    resource.setVersion(existing.getVersion());
    rangerServiceResourceService.update(resource);
    if (serviceResourceElementUpdateNeeded) {
        deleteResourceForServiceResource(existing.getId());
        createResourceForServiceResource(existing.getId(), resource);
    }
    RangerServiceResource ret = rangerServiceResourceService.read(existing.getId());
    if (LOG.isDebugEnabled()) {
        LOG.debug("<== TagDBStore.updateResource(" + resource + ") : " + ret);
    }
    return ret;
}
Also used : RangerServiceResourceSignature(org.apache.ranger.plugin.store.RangerServiceResourceSignature)

Example 3 with RangerServiceResourceSignature

use of org.apache.ranger.plugin.store.RangerServiceResourceSignature in project ranger by apache.

the class ServiceTagsProcessor method addOrUpdate.

// Map tagdef, tag, serviceResource ids to created ids and use them in tag-resource-mapping
private void addOrUpdate(ServiceTags serviceTags) throws Exception {
    if (LOG.isDebugEnabled()) {
        LOG.debug("==> ServiceTagsProcessor.createOrUpdate()");
    }
    Map<Long, RangerTagDef> tagDefsInStore = new HashMap<Long, RangerTagDef>();
    Map<Long, RangerServiceResource> resourcesInStore = new HashMap<Long, RangerServiceResource>();
    if (MapUtils.isNotEmpty(serviceTags.getTagDefinitions())) {
        RangerTagDef tagDef = null;
        try {
            for (Map.Entry<Long, RangerTagDef> entry : serviceTags.getTagDefinitions().entrySet()) {
                tagDef = entry.getValue();
                RangerTagDef existing = null;
                if (StringUtils.isNotEmpty(tagDef.getGuid())) {
                    existing = tagStore.getTagDefByGuid(tagDef.getGuid());
                }
                if (existing == null && StringUtils.isNotEmpty(tagDef.getName())) {
                    existing = tagStore.getTagDefByName(tagDef.getName());
                }
                RangerTagDef tagDefInStore = null;
                if (existing == null) {
                    tagDefInStore = tagStore.createTagDef(tagDef);
                } else {
                    if (LOG.isDebugEnabled()) {
                        LOG.debug("tagDef for name:" + tagDef.getName() + " exists, will not update it");
                    }
                    tagDefInStore = existing;
                }
                tagDefsInStore.put(entry.getKey(), tagDefInStore);
            }
        } catch (Exception exception) {
            LOG.error("createTagDef failed, tagDef=" + tagDef, exception);
            throw exception;
        }
    }
    List<RangerServiceResource> resources = serviceTags.getServiceResources();
    if (CollectionUtils.isNotEmpty(resources)) {
        RangerServiceResource resource = null;
        try {
            for (int i = 0; i < resources.size(); i++) {
                resource = resources.get(i);
                RangerServiceResource existing = null;
                String resourceSignature = null;
                Long resourceId = resource.getId();
                if (StringUtils.isNotEmpty(resource.getGuid())) {
                    existing = tagStore.getServiceResourceByGuid(resource.getGuid());
                }
                if (existing == null) {
                    if (MapUtils.isNotEmpty(resource.getResourceElements())) {
                        RangerServiceResourceSignature serializer = new RangerServiceResourceSignature(resource);
                        resourceSignature = serializer.getSignature();
                        resource.setResourceSignature(resourceSignature);
                        existing = tagStore.getServiceResourceByServiceAndResourceSignature(resource.getServiceName(), resourceSignature);
                    }
                }
                RangerServiceResource resourceInStore = null;
                if (existing == null) {
                    resourceInStore = tagStore.createServiceResource(resource);
                } else if (StringUtils.isEmpty(resource.getServiceName()) || MapUtils.isEmpty(resource.getResourceElements())) {
                    resourceInStore = existing;
                } else {
                    resource.setId(existing.getId());
                    resource.setGuid(existing.getGuid());
                    resourceInStore = tagStore.updateServiceResource(resource);
                }
                resourcesInStore.put(resourceId, resourceInStore);
            }
        } catch (Exception exception) {
            LOG.error("createServiceResource failed, resource=" + resource, exception);
            throw exception;
        }
    }
    if (MapUtils.isNotEmpty(serviceTags.getResourceToTagIds())) {
        for (Map.Entry<Long, List<Long>> entry : serviceTags.getResourceToTagIds().entrySet()) {
            Long resourceId = entry.getKey();
            RangerServiceResource resourceInStore = resourcesInStore.get(resourceId);
            if (resourceInStore == null) {
                LOG.error("Resource (id=" + resourceId + ") not found. Skipping tags update");
                continue;
            }
            // Get all tags associated with this resourceId
            List<RangerTag> associatedTags = null;
            try {
                associatedTags = tagStore.getTagsForResourceId(resourceInStore.getId());
            } catch (Exception exception) {
                LOG.error("RangerTags cannot be retrieved for resource with guid=" + resourceInStore.getGuid());
                throw exception;
            }
            List<RangerTag> tagsToRetain = new ArrayList<RangerTag>();
            List<Long> tagIds = entry.getValue();
            try {
                for (Long tagId : tagIds) {
                    RangerTag incomingTag = MapUtils.isNotEmpty(serviceTags.getTags()) ? serviceTags.getTags().get(tagId) : null;
                    if (incomingTag == null) {
                        LOG.error("Tag (id=" + tagId + ") not found. Skipping addition of this tag for resource (id=" + resourceId + ")");
                        continue;
                    }
                    RangerTag matchingTag = findMatchingTag(incomingTag, associatedTags);
                    if (matchingTag == null) {
                        if (LOG.isDebugEnabled()) {
                            LOG.debug("Did not find matching tag for tagId=" + tagId);
                        }
                        // create new tag from incoming tag and associate it with service-resource
                        RangerTag newTag = tagStore.createTag(incomingTag);
                        RangerTagResourceMap tagResourceMap = new RangerTagResourceMap();
                        tagResourceMap.setTagId(newTag.getId());
                        tagResourceMap.setResourceId(resourceInStore.getId());
                        tagResourceMap = tagStore.createTagResourceMap(tagResourceMap);
                        associatedTags.add(newTag);
                        tagsToRetain.add(newTag);
                        continue;
                    }
                    if (LOG.isDebugEnabled()) {
                        LOG.debug("Found matching tag for tagId=" + tagId + ", matchingTag=" + matchingTag);
                    }
                    if (isResourcePrivateTag(incomingTag)) {
                        if (!isResourcePrivateTag(matchingTag)) {
                            // create new tag from incoming tag and associate it with service-resource
                            RangerTag newTag = tagStore.createTag(incomingTag);
                            RangerTagResourceMap tagResourceMap = new RangerTagResourceMap();
                            tagResourceMap.setTagId(newTag.getId());
                            tagResourceMap.setResourceId(resourceInStore.getId());
                            tagResourceMap = tagStore.createTagResourceMap(tagResourceMap);
                            associatedTags.add(newTag);
                            tagsToRetain.add(newTag);
                        } else {
                            // Keep this tag, but update it with attribute-values from incoming tag
                            tagsToRetain.add(matchingTag);
                            if (StringUtils.equals(incomingTag.getGuid(), matchingTag.getGuid())) {
                                // matching tag was found because of Guid match
                                if (LOG.isDebugEnabled()) {
                                    LOG.debug("Updating existing private tag with id=" + matchingTag.getId());
                                }
                                // update private tag with new values
                                incomingTag.setId(matchingTag.getId());
                                tagStore.updateTag(incomingTag);
                            }
                        }
                    } else {
                        // shared model
                        if (isResourcePrivateTag(matchingTag)) {
                            // create new tag from incoming tag and associate it with service-resource
                            RangerTag newTag = tagStore.createTag(incomingTag);
                            RangerTagResourceMap tagResourceMap = new RangerTagResourceMap();
                            tagResourceMap.setTagId(newTag.getId());
                            tagResourceMap.setResourceId(resourceInStore.getId());
                            tagResourceMap = tagStore.createTagResourceMap(tagResourceMap);
                            associatedTags.add(newTag);
                            tagsToRetain.add(newTag);
                        } else {
                            // Keep this tag, but update it with attribute-values from incoming tag
                            tagsToRetain.add(matchingTag);
                            // Update shared tag with new values
                            incomingTag.setId(matchingTag.getId());
                            tagStore.updateTag(incomingTag);
                            // associate with service-resource if not already associated
                            if (findTagInList(matchingTag, associatedTags) == null) {
                                RangerTagResourceMap tagResourceMap = new RangerTagResourceMap();
                                tagResourceMap.setTagId(matchingTag.getId());
                                tagResourceMap.setResourceId(resourceInStore.getId());
                                tagResourceMap = tagStore.createTagResourceMap(tagResourceMap);
                            }
                        }
                    }
                }
            } catch (Exception exception) {
                LOG.error("createRangerTagResourceMap failed", exception);
                throw exception;
            }
            if (CollectionUtils.isNotEmpty(associatedTags)) {
                Long tagId = null;
                try {
                    for (RangerTag associatedTag : associatedTags) {
                        if (findTagInList(associatedTag, tagsToRetain) == null) {
                            tagId = associatedTag.getId();
                            RangerTagResourceMap tagResourceMap = tagStore.getTagResourceMapForTagAndResourceId(tagId, resourceInStore.getId());
                            if (tagResourceMap != null) {
                                tagStore.deleteTagResourceMap(tagResourceMap.getId());
                            }
                            if (LOG.isDebugEnabled()) {
                                LOG.debug("Deleted tagResourceMap(tagId=" + tagId + ", resourceId=" + resourceInStore.getId());
                            }
                        }
                    }
                } catch (Exception exception) {
                    LOG.error("deleteTagResourceMap failed, tagId=" + tagId + ", resourceId=" + resourceInStore.getId());
                    throw exception;
                }
            }
        }
    }
    if (LOG.isDebugEnabled()) {
        LOG.debug("<== ServiceTagsProcessor.createOrUpdate()");
    }
}
Also used : RangerTagDef(org.apache.ranger.plugin.model.RangerTagDef) HashMap(java.util.HashMap) RangerServiceResource(org.apache.ranger.plugin.model.RangerServiceResource) ArrayList(java.util.ArrayList) RangerServiceResourceSignature(org.apache.ranger.plugin.store.RangerServiceResourceSignature) RangerTag(org.apache.ranger.plugin.model.RangerTag) ArrayList(java.util.ArrayList) List(java.util.List) RangerTagResourceMap(org.apache.ranger.plugin.model.RangerTagResourceMap) RangerTagResourceMap(org.apache.ranger.plugin.model.RangerTagResourceMap) HashMap(java.util.HashMap) Map(java.util.Map)

Example 4 with RangerServiceResourceSignature

use of org.apache.ranger.plugin.store.RangerServiceResourceSignature in project ranger by apache.

the class ServiceTagsProcessor method delete.

private void delete(ServiceTags serviceTags) throws Exception {
    if (LOG.isDebugEnabled()) {
        LOG.debug("==> ServiceTagsProcessor.delete()");
    }
    // We dont expect any resourceId->tagId mappings in delete operation, so ignoring them if specified
    List<RangerServiceResource> serviceResources = serviceTags.getServiceResources();
    if (CollectionUtils.isNotEmpty(serviceResources)) {
        for (RangerServiceResource serviceResource : serviceResources) {
            RangerServiceResource objToDelete = null;
            try {
                if (StringUtils.isNotBlank(serviceResource.getGuid())) {
                    objToDelete = tagStore.getServiceResourceByGuid(serviceResource.getGuid());
                }
                if (objToDelete == null) {
                    if (MapUtils.isNotEmpty(serviceResource.getResourceElements())) {
                        RangerServiceResourceSignature serializer = new RangerServiceResourceSignature(serviceResource);
                        String serviceResourceSignature = serializer.getSignature();
                        objToDelete = tagStore.getServiceResourceByServiceAndResourceSignature(serviceResource.getServiceName(), serviceResourceSignature);
                    }
                }
                if (objToDelete != null) {
                    List<RangerTagResourceMap> tagResourceMaps = tagStore.getTagResourceMapsForResourceGuid(objToDelete.getGuid());
                    if (CollectionUtils.isNotEmpty(tagResourceMaps)) {
                        for (RangerTagResourceMap tagResourceMap : tagResourceMaps) {
                            tagStore.deleteTagResourceMap(tagResourceMap.getId());
                        }
                    }
                    tagStore.deleteServiceResource(objToDelete.getId());
                }
            } catch (Exception exception) {
                LOG.error("deleteServiceResourceByGuid failed, guid=" + serviceResource.getGuid(), exception);
                throw exception;
            }
        }
    }
    Map<Long, RangerTag> tagsMap = serviceTags.getTags();
    if (MapUtils.isNotEmpty(tagsMap)) {
        for (Map.Entry<Long, RangerTag> entry : tagsMap.entrySet()) {
            RangerTag tag = entry.getValue();
            try {
                RangerTag objToDelete = tagStore.getTagByGuid(tag.getGuid());
                if (objToDelete != null) {
                    tagStore.deleteTag(objToDelete.getId());
                }
            } catch (Exception exception) {
                LOG.error("deleteTag failed, guid=" + tag.getGuid(), exception);
                throw exception;
            }
        }
    }
    Map<Long, RangerTagDef> tagDefsMap = serviceTags.getTagDefinitions();
    if (MapUtils.isNotEmpty(tagDefsMap)) {
        for (Map.Entry<Long, RangerTagDef> entry : tagDefsMap.entrySet()) {
            RangerTagDef tagDef = entry.getValue();
            try {
                RangerTagDef objToDelete = tagStore.getTagDefByGuid(tagDef.getGuid());
                if (objToDelete != null) {
                    tagStore.deleteTagDef(objToDelete.getId());
                }
            } catch (Exception exception) {
                LOG.error("deleteTagDef failed, guid=" + tagDef.getGuid(), exception);
                throw exception;
            }
        }
    }
    if (LOG.isDebugEnabled()) {
        LOG.debug("<== ServiceTagsProcessor.delete()");
    }
}
Also used : RangerTagDef(org.apache.ranger.plugin.model.RangerTagDef) RangerServiceResource(org.apache.ranger.plugin.model.RangerServiceResource) RangerServiceResourceSignature(org.apache.ranger.plugin.store.RangerServiceResourceSignature) RangerTag(org.apache.ranger.plugin.model.RangerTag) RangerTagResourceMap(org.apache.ranger.plugin.model.RangerTagResourceMap) RangerTagResourceMap(org.apache.ranger.plugin.model.RangerTagResourceMap) HashMap(java.util.HashMap) Map(java.util.Map)

Aggregations

RangerServiceResourceSignature (org.apache.ranger.plugin.store.RangerServiceResourceSignature)4 HashMap (java.util.HashMap)2 Map (java.util.Map)2 RangerServiceResource (org.apache.ranger.plugin.model.RangerServiceResource)2 RangerTag (org.apache.ranger.plugin.model.RangerTag)2 RangerTagDef (org.apache.ranger.plugin.model.RangerTagDef)2 RangerTagResourceMap (org.apache.ranger.plugin.model.RangerTagResourceMap)2 ArrayList (java.util.ArrayList)1 List (java.util.List)1