blob: 15830185fb07f86f601060e78f3e49c2e609657f [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.ranger.biz;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.ranger.common.GUIDUtil;
import org.apache.ranger.common.MessageEnums;
import org.apache.ranger.common.RESTErrorUtil;
import org.apache.ranger.common.RangerAdminTagEnricher;
import org.apache.ranger.common.RangerServiceTagsCache;
import org.apache.ranger.db.RangerDaoManager;
import org.apache.ranger.entity.XXResourceDef;
import org.apache.ranger.entity.XXService;
import org.apache.ranger.entity.XXServiceDef;
import org.apache.ranger.entity.XXServiceResource;
import org.apache.ranger.entity.XXServiceVersionInfo;
import org.apache.ranger.entity.XXTag;
import org.apache.ranger.entity.XXTagAttribute;
import org.apache.ranger.entity.XXTagAttributeDef;
import org.apache.ranger.entity.XXServiceResourceElement;
import org.apache.ranger.entity.XXServiceResourceElementValue;
import org.apache.ranger.entity.XXTagResourceMap;
import org.apache.ranger.plugin.model.*;
import org.apache.ranger.plugin.model.RangerPolicy.RangerPolicyResource;
import org.apache.ranger.plugin.model.RangerTagDef.RangerTagAttributeDef;
import org.apache.ranger.plugin.store.AbstractTagStore;
import org.apache.ranger.plugin.store.PList;
import org.apache.ranger.plugin.store.RangerServiceResourceSignature;
import org.apache.ranger.plugin.util.RangerServiceNotFoundException;
import org.apache.ranger.plugin.util.SearchFilter;
import org.apache.ranger.plugin.util.ServiceTags;
import org.apache.ranger.service.RangerAuditFields;
import org.apache.ranger.service.RangerTagDefService;
import org.apache.ranger.service.RangerTagResourceMapService;
import org.apache.ranger.service.RangerTagService;
import org.apache.ranger.service.RangerServiceResourceService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.servlet.http.HttpServletResponse;
@Component
public class TagDBStore extends AbstractTagStore {
private static final Log LOG = LogFactory.getLog(TagDBStore.class);
@Autowired
RangerTagDefService rangerTagDefService;
@Autowired
RangerTagService rangerTagService;
@Autowired
RangerServiceResourceService rangerServiceResourceService;
@Autowired
RangerTagResourceMapService rangerTagResourceMapService;
@Autowired
RangerDaoManager daoManager;
@Autowired
RESTErrorUtil errorUtil;
@Autowired
RangerAuditFields rangerAuditFields;
@Autowired
GUIDUtil guidUtil;
@Autowired
RESTErrorUtil restErrorUtil;
@PostConstruct
public void initStore() {
RangerAdminTagEnricher.setTagStore(this);
}
@Override
public RangerTagDef createTagDef(RangerTagDef tagDef) throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TagDBStore.createTagDef(" + tagDef + ")");
}
RangerTagDef ret = rangerTagDefService.create(tagDef);
createTagAttributeDefs(ret.getId(), tagDef.getAttributeDefs());
ret = rangerTagDefService.read(ret.getId());
if (LOG.isDebugEnabled()) {
LOG.debug("<== TagDBStore.createTagDef(" + tagDef + "): id=" + (ret == null ? null : ret.getId()));
}
return ret;
}
@Override
public RangerTagDef updateTagDef(RangerTagDef tagDef) throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TagDBStore.updateTagDef(" + tagDef + ")");
}
RangerTagDef existing = rangerTagDefService.read(tagDef.getId());
if (existing == null) {
throw errorUtil.createRESTException("failed to update tag-def [" + tagDef.getName() + "], Reason: No TagDef found with id: [" + tagDef.getId() + "]", MessageEnums.DATA_NOT_UPDATABLE);
}
tagDef.setCreatedBy(existing.getCreatedBy());
tagDef.setCreateTime(existing.getCreateTime());
tagDef.setGuid(existing.getGuid());
tagDef.setVersion(existing.getVersion());
RangerTagDef ret = rangerTagDefService.update(tagDef);
// TODO: delete attributes might fail; so instead of delete+create, following should be updated to deal with only attributes that changed
deleteTagAttributeDefs(ret.getId());
createTagAttributeDefs(ret.getId(), tagDef.getAttributeDefs());
ret = rangerTagDefService.read(ret.getId());
if (LOG.isDebugEnabled()) {
LOG.debug("<== TagDBStore.updateTagDef(" + tagDef + "): " + ret);
}
return ret;
}
@Override
public void deleteTagDefByName(String name) throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TagDBStore.deleteTagDef(" + name + ")");
}
if (StringUtils.isNotBlank(name)) {
RangerTagDef tagDef = getTagDefByName(name);
if(tagDef != null) {
if(LOG.isDebugEnabled()) {
LOG.debug("Deleting tag-def [name=" + name + "; id=" + tagDef.getId() + "]");
}
deleteTagAttributeDefs(tagDef.getId());
rangerTagDefService.delete(tagDef);
}
}
if (LOG.isDebugEnabled()) {
LOG.debug("<== TagDBStore.deleteTagDef(" + name + ")");
}
}
@Override
public void deleteTagDef(Long id) throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TagDBStore.deleteTagDef(" + id + ")");
}
if(id != null) {
RangerTagDef tagDef = rangerTagDefService.read(id);
if(tagDef != null) {
deleteTagAttributeDefs(tagDef.getId());
rangerTagDefService.delete(tagDef);
}
}
if (LOG.isDebugEnabled()) {
LOG.debug("<== TagDBStore.deleteTagDef(" + id + ")");
}
}
@Override
public RangerTagDef getTagDef(Long id) throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TagDBStore.getTagDef(" + id + ")");
}
RangerTagDef ret = rangerTagDefService.read(id);
if (LOG.isDebugEnabled()) {
LOG.debug("<== TagDBStore.getTagDef(" + id + "): " + ret);
}
return ret;
}
@Override
public RangerTagDef getTagDefByGuid(String guid) throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TagDBStore.getTagDefByGuid(" + guid + ")");
}
RangerTagDef ret = rangerTagDefService.getTagDefByGuid(guid);
if (LOG.isDebugEnabled()) {
LOG.debug("<== TagDBStore.getTagDefByGuid(" + guid + "): " + ret);
}
return ret;
}
@Override
public RangerTagDef getTagDefByName(String name) throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TagDBStore.getTagDefByName(" + name + ")");
}
RangerTagDef ret = null;
if (StringUtils.isNotBlank(name)) {
ret = rangerTagDefService.getTagDefByName(name);
}
if (LOG.isDebugEnabled()) {
LOG.debug("<== TagDBStore.getTagDefByName(" + name + "): " + ret);
}
return ret;
}
@Override
public List<RangerTagDef> getTagDefs(SearchFilter filter) throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TagDBStore.getTagDefs(" + filter + ")");
}
List<RangerTagDef> ret = getPaginatedTagDefs(filter).getList();
if (LOG.isDebugEnabled()) {
LOG.debug("<== TagDBStore.getTagDefs(" + filter + "): " + ret);
}
return ret;
}
@Override
public PList<RangerTagDef> getPaginatedTagDefs(SearchFilter filter) throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TagDBStore.getPaginatedTagDefs(" + filter + ")");
}
PList<RangerTagDef> ret = rangerTagDefService.searchRangerTagDefs(filter);
if (LOG.isDebugEnabled()) {
LOG.debug("<== TagDBStore.getPaginatedTagDefs(" + filter + "): " + ret);
}
return ret;
}
@Override
public List<String> getTagTypes() throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TagDBStore.getTagTypes()");
}
List<String> ret = daoManager.getXXTagDef().getAllNames();
if (LOG.isDebugEnabled()) {
LOG.debug("<== TagDBStore.getTagTypes(): count=" + (ret != null ? ret.size() : 0));
}
return ret;
}
@Override
public RangerTag createTag(RangerTag tag) throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TagDBStore.createTag(" + tag + ")");
}
RangerTag ret = rangerTagService.create(tag);
createTagAttributes(ret.getId(), tag.getAttributes());
ret = rangerTagService.read(ret.getId());
if (LOG.isDebugEnabled()) {
LOG.debug("<== TagDBStore.createTag(" + tag + "): " + ret);
}
return ret;
}
@Override
public RangerTag updateTag(RangerTag tag) throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TagDBStore.updateTag(" + tag + ")");
}
RangerTag existing = rangerTagService.read(tag.getId());
if (existing == null) {
throw errorUtil.createRESTException("failed to update tag [" + tag.getType() + "], Reason: No Tag found with id: [" + tag.getId() + "]", MessageEnums.DATA_NOT_UPDATABLE);
}
tag.setCreatedBy(existing.getCreatedBy());
tag.setCreateTime(existing.getCreateTime());
tag.setGuid(existing.getGuid());
tag.setVersion(existing.getVersion());
RangerTag ret = rangerTagService.update(tag);
deleteTagAttributes(existing.getId());
createTagAttributes(existing.getId(), tag.getAttributes());
ret = rangerTagService.read(ret.getId());
if (LOG.isDebugEnabled()) {
LOG.debug("<== TagDBStore.updateTag(" + tag + ") : " + ret);
}
return ret;
}
@Override
public void deleteTag(Long id) throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TagDBStore.deleteTag(" + id + ")");
}
RangerTag tag = rangerTagService.read(id);
deleteTagAttributes(id);
rangerTagService.delete(tag);
if (LOG.isDebugEnabled()) {
LOG.debug("<== TagDBStore.deleteTag(" + id + ")");
}
}
@Override
public RangerTag getTag(Long id) throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TagDBStore.getTag(" + id + ")");
}
RangerTag ret = rangerTagService.read(id);
if (LOG.isDebugEnabled()) {
LOG.debug("<== TagDBStore.getTag(" + id + "): " + ret);
}
return ret;
}
@Override
public RangerTag getTagByGuid(String guid) throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TagDBStore.getTagByGuid(" + guid + ")");
}
RangerTag ret = rangerTagService.getTagByGuid(guid);
if (LOG.isDebugEnabled()) {
LOG.debug("<== TagDBStore.getTagByGuid(" + guid + "): " + ret);
}
return ret;
}
@Override
public List<RangerTag> getTagsByType(String type) throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TagDBStore.getTagsByType(" + type + ")");
}
List<RangerTag> ret = null;
if (StringUtils.isNotBlank(type)) {
ret = rangerTagService.getTagsByType(type);
}
if (LOG.isDebugEnabled()) {
LOG.debug("<== TagDBStore.getTagsByType(" + type + "): count=" + (ret == null ? 0 : ret.size()));
}
return ret;
}
@Override
public List<RangerTag> getTagsForResourceId(Long resourceId) throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TagDBStore.getTagsForResourceId(" + resourceId + ")");
}
List<RangerTag> ret = null;
if (resourceId != null) {
ret = rangerTagService.getTagsForResourceId(resourceId);
}
if (LOG.isDebugEnabled()) {
LOG.debug("<== TagDBStore.getTagsForResourceId(" + resourceId + "): count=" + (ret == null ? 0 : ret.size()));
}
return ret;
}
@Override
public List<RangerTag> getTagsForResourceGuid(String resourceGuid) throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TagDBStore.getTagsForResourceGuid(" + resourceGuid + ")");
}
List<RangerTag> ret = null;
if (resourceGuid != null) {
ret = rangerTagService.getTagsForResourceGuid(resourceGuid);
}
if (LOG.isDebugEnabled()) {
LOG.debug("<== TagDBStore.getTagsForResourceGuid(" + resourceGuid + "): count=" + (ret == null ? 0 : ret.size()));
}
return ret;
}
@Override
public List<RangerTag> getTags(SearchFilter filter) throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TagDBStore.getTags(" + filter + ")");
}
List<RangerTag> ret = rangerTagService.searchRangerTags(filter).getList();
if (LOG.isDebugEnabled()) {
LOG.debug("<== TagDBStore.getTags(" + filter + "): count=" + (ret == null ? 0 : ret.size()));
}
return ret;
}
@Override
public PList<RangerTag> getPaginatedTags(SearchFilter filter) throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TagDBStore.getPaginatedTags(" + filter + ")");
}
PList<RangerTag> ret = rangerTagService.searchRangerTags(filter);
if (LOG.isDebugEnabled()) {
LOG.debug("<== TagDBStore.getPaginatedTags(" + filter + "): count=" + (ret == null ? 0 : ret.getPageSize()));
}
return ret;
}
@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;
}
@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;
}
@Override
public void deleteServiceResource(Long id) throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TagDBStore.deleteServiceResource(" + id + ")");
}
RangerServiceResource resource = getServiceResource(id);
if(resource != null) {
deleteResourceForServiceResource(resource.getId());
rangerServiceResourceService.delete(resource);
}
if (LOG.isDebugEnabled()) {
LOG.debug("<== TagDBStore.deleteServiceResource(" + id + ")");
}
}
@Override
public void deleteServiceResourceByGuid(String guid) throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TagDBStore.deleteServiceResourceByGuid(" + guid + ")");
}
RangerServiceResource resource = getServiceResourceByGuid(guid);
if(resource != null) {
deleteResourceForServiceResource(resource.getId());
rangerServiceResourceService.delete(resource);
}
if (LOG.isDebugEnabled()) {
LOG.debug("<== TagDBStore.deleteServiceResourceByGuid(" + guid + ")");
}
}
@Override
public RangerServiceResource getServiceResource(Long id) throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TagDBStore.getServiceResource(" + id + ")");
}
RangerServiceResource ret = rangerServiceResourceService.read(id);
if (LOG.isDebugEnabled()) {
LOG.debug("<== TagDBStore.getServiceResource(" + id + "): " + ret);
}
return ret;
}
@Override
public RangerServiceResource getServiceResourceByGuid(String guid) throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TagDBStore.getServiceResourceByGuid(" + guid + ")");
}
RangerServiceResource ret = rangerServiceResourceService.getServiceResourceByGuid(guid);
if (LOG.isDebugEnabled()) {
LOG.debug("<== TagDBStore.getServiceResourceByGuid(" + guid + "): " + ret);
}
return ret;
}
@Override
public List<RangerServiceResource> getServiceResourcesByService(String serviceName) throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TagDBStore.getServiceResourcesByService(" + serviceName + ")");
}
List<RangerServiceResource> ret = null;
XXService service = daoManager.getXXService().findByName(serviceName);
if (service != null) {
ret = rangerServiceResourceService.getByServiceId(service.getId());
}
if (LOG.isDebugEnabled()) {
LOG.debug("<== TagDBStore.getServiceResourcesByService(" + serviceName + "): count=" + (ret == null ? 0 : ret.size()));
}
return ret;
}
@Override
public List<String> getServiceResourceGuidsByService(String serviceName) {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TagDBStore.getServiceResourceGuidsByService(" + serviceName + ")");
}
List<String> ret = null;
XXService service = daoManager.getXXService().findByName(serviceName);
if (service != null) {
ret = daoManager.getXXServiceResource().findServiceResourceGuidsInServiceId(service.getId());
}
if (LOG.isDebugEnabled()) {
LOG.debug("<== TagDBStore.getServiceResourceGuidsByService(" + serviceName + "): count=" + (ret == null ? 0 : ret.size()));
}
return ret;
}
@Override
public RangerServiceResource getServiceResourceByServiceAndResourceSignature(String serviceName, String resourceSignature) throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TagDBStore.getServiceResourceByServiceAndResourceSignature(" + serviceName + ", " + resourceSignature + ")");
}
RangerServiceResource ret = null;
XXService service = daoManager.getXXService().findByName(serviceName);
if (service != null) {
ret = rangerServiceResourceService.getByServiceAndResourceSignature(service.getId(), resourceSignature);
}
if (LOG.isDebugEnabled()) {
LOG.debug("<== TagDBStore.getServiceResourceByServiceAndResourceSignature(" + serviceName + ", " + resourceSignature + "): " + ret);
}
return ret;
}
@Override
public List<RangerServiceResource> getServiceResources(SearchFilter filter) throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TagDBStore.getServiceResources(" + filter + ")");
}
List<RangerServiceResource> ret = rangerServiceResourceService.searchServiceResources(filter).getList();
if (LOG.isDebugEnabled()) {
LOG.debug("<== TagDBStore.getServiceResources(" + filter + "): count=" + (ret == null ? 0 : ret.size()));
}
return ret;
}
@Override
public PList<RangerServiceResource> getPaginatedServiceResources(SearchFilter filter) throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TagDBStore.getPaginatedServiceResources(" + filter + ")");
}
PList<RangerServiceResource> ret = rangerServiceResourceService.searchServiceResources(filter);
if (LOG.isDebugEnabled()) {
LOG.debug("<== TagDBStore.getPaginatedServiceResources(" + filter + "): count=" + (ret == null ? 0 : ret.getPageSize()));
}
return ret;
}
@Override
public RangerTagResourceMap createTagResourceMap(RangerTagResourceMap tagResourceMap) throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TagDBStore.createTagResourceMap(" + tagResourceMap + ")");
}
RangerTagResourceMap ret = rangerTagResourceMapService.create(tagResourceMap);
if (LOG.isDebugEnabled()) {
LOG.debug("<== TagDBStore.createTagResourceMap(" + tagResourceMap + "): " + ret);
}
return ret;
}
@Override
public void deleteTagResourceMap(Long id) throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TagDBStore.deleteTagResourceMap(" + id + ")");
}
RangerTagResourceMap tagResourceMap = rangerTagResourceMapService.read(id);
Long tagId = tagResourceMap.getTagId();
RangerTag tag = getTag(tagId);
rangerTagResourceMapService.delete(tagResourceMap);
if (tag.getOwner() == RangerTag.OWNER_SERVICERESOURCE) {
deleteTag(tagId);
}
if (LOG.isDebugEnabled()) {
LOG.debug("<== TagDBStore.deleteTagResourceMap(" + id + ")");
}
}
@Override
public RangerTagResourceMap getTagResourceMap(Long id) throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TagDBStore.getTagResourceMap(" + id + ")");
}
RangerTagResourceMap ret = rangerTagResourceMapService.read(id);
if (LOG.isDebugEnabled()) {
LOG.debug("<== TagDBStore.getTagResourceMap(" + id + ")");
}
return ret;
}
@Override
public RangerTagResourceMap getTagResourceMapByGuid(String guid) throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TagDBStore.getTagResourceMapByGuid(" + guid + ")");
}
RangerTagResourceMap ret = rangerTagResourceMapService.getByGuid(guid);
if (LOG.isDebugEnabled()) {
LOG.debug("<== TagDBStore.getTagResourceMapByGuid(" + guid + ")");
}
return ret;
}
@Override
public List<RangerTagResourceMap> getTagResourceMapsForTagId(Long tagId) throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TagDBStore.getTagResourceMapsForTagId(" + tagId + ")");
}
List<RangerTagResourceMap> ret = rangerTagResourceMapService.getByTagId(tagId);
if (LOG.isDebugEnabled()) {
LOG.debug("<== TagDBStore.getTagResourceMapsForTagId(" + tagId + "): count=" + (ret == null ? 0 : ret.size()));
}
return ret;
}
@Override
public List<RangerTagResourceMap> getTagResourceMapsForTagGuid(String tagGuid) throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TagDBStore.getTagResourceMapsForTagGuid(" + tagGuid + ")");
}
List<RangerTagResourceMap> ret = rangerTagResourceMapService.getByTagGuid(tagGuid);
if (LOG.isDebugEnabled()) {
LOG.debug("<== TagDBStore.getTagResourceMapsForTagGuid(" + tagGuid + "): count=" + (ret == null ? 0 : ret.size()));
}
return ret;
}
@Override
public List<Long> getTagIdsForResourceId(Long resourceId) throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TagDBStore.getTagIdsForResourceId(" + resourceId + ")");
}
List<Long> ret = rangerTagResourceMapService.getTagIdsForResourceId(resourceId);
if (LOG.isDebugEnabled()) {
LOG.debug("<== TagDBStore.getTagIdsForResourceId(" + resourceId + "): count=" + (ret == null ? 0 : ret.size()));
}
return ret;
}
@Override
public List<RangerTagResourceMap> getTagResourceMapsForResourceId(Long resourceId) throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TagDBStore.getTagResourceMapsForResourceId(" + resourceId + ")");
}
List<RangerTagResourceMap> ret = rangerTagResourceMapService.getByResourceId(resourceId);
if (LOG.isDebugEnabled()) {
LOG.debug("<== TagDBStore.getTagResourceMapsForResourceId(" + resourceId + "): count=" + (ret == null ? 0 : ret.size()));
}
return ret;
}
@Override
public List<RangerTagResourceMap> getTagResourceMapsForResourceGuid(String resourceGuid) throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TagDBStore.getTagResourceMapsForResourceGuid(" + resourceGuid + ")");
}
List<RangerTagResourceMap> ret = rangerTagResourceMapService.getByResourceGuid(resourceGuid);
if (LOG.isDebugEnabled()) {
LOG.debug("<== TagDBStore.getTagResourceMapsForResourceGuid(" + resourceGuid + "): count=" + (ret == null ? 0 : ret.size()));
}
return ret;
}
@Override
public RangerTagResourceMap getTagResourceMapForTagAndResourceId(Long tagId, Long resourceId) throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TagDBStore.getTagResourceMapsForTagAndResourceId(" + tagId + ", " + resourceId + ")");
}
RangerTagResourceMap ret = rangerTagResourceMapService.getByTagAndResourceId(tagId, resourceId);
if (LOG.isDebugEnabled()) {
LOG.debug("<== TagDBStore.getTagResourceMapsForTagAndResourceId(" + tagId + ", " + resourceId + "): " + ret);
}
return ret;
}
@Override
public RangerTagResourceMap getTagResourceMapForTagAndResourceGuid(String tagGuid, String resourceGuid) throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TagDBStore.getTagResourceMapForTagAndResourceGuid(" + tagGuid + ", " + resourceGuid + ")");
}
RangerTagResourceMap ret = rangerTagResourceMapService.getByTagAndResourceGuid(tagGuid, resourceGuid);
if (LOG.isDebugEnabled()) {
LOG.debug("<== TagDBStore.getTagResourceMapForTagAndResourceGuid(" + tagGuid + ", " + resourceGuid + "): " + ret);
}
return ret;
}
@Override
public List<RangerTagResourceMap> getTagResourceMaps(SearchFilter filter) throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TagDBStore.getTagResourceMaps(" + filter+ ")");
}
List<RangerTagResourceMap> ret = rangerTagResourceMapService.searchRangerTaggedResources(filter).getList();
if (LOG.isDebugEnabled()) {
LOG.debug("<== TagDBStore.getTagResourceMaps(" + filter + "): count=" + (ret == null ? 0 : ret.size()));
}
return ret;
}
@Override
public PList<RangerTagResourceMap> getPaginatedTagResourceMaps(SearchFilter filter) throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TagDBStore.getPaginatedTagResourceMaps(" + filter+ ")");
}
PList<RangerTagResourceMap> ret = rangerTagResourceMapService.searchRangerTaggedResources(filter);
if (LOG.isDebugEnabled()) {
LOG.debug("<== TagDBStore.getPaginatedTagResourceMaps(" + filter + "): count=" + (ret == null ? 0 : ret.getPageSize()));
}
return ret;
}
@Override
public ServiceTags getServiceTagsIfUpdated(String serviceName, Long lastKnownVersion) throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TagDBStore.getServiceTagsIfUpdated(" + serviceName + ", " + lastKnownVersion + ")");
}
ServiceTags ret = null;
XXService xxService = daoManager.getXXService().findByName(serviceName);
if (xxService == null) {
LOG.error("Requested Service not found. serviceName=" + serviceName);
throw restErrorUtil.createRESTException(HttpServletResponse.SC_NOT_FOUND, RangerServiceNotFoundException.buildExceptionMsg(serviceName),
false);
}
XXServiceVersionInfo serviceVersionInfoDbObj = daoManager.getXXServiceVersionInfo().findByServiceName(serviceName);
if (serviceVersionInfoDbObj == null) {
LOG.warn("serviceVersionInfo does not exist. name=" + serviceName);
}
if (lastKnownVersion == null || serviceVersionInfoDbObj == null || serviceVersionInfoDbObj.getTagVersion() == null || !lastKnownVersion.equals(serviceVersionInfoDbObj.getTagVersion())) {
ret = RangerServiceTagsCache.getInstance().getServiceTags(serviceName, xxService.getId(), this);
}
if (ret != null && lastKnownVersion != null && lastKnownVersion.equals(ret.getTagVersion())) {
// ServiceTags are not changed
ret = null;
}
if (LOG.isDebugEnabled()) {
RangerServiceTagsCache.getInstance().dump();
}
if (LOG.isDebugEnabled()) {
LOG.debug("<== TagDBStore.getServiceTagsIfUpdated(" + serviceName + ", " + lastKnownVersion + "): count=" + ((ret == null || ret.getTags() == null) ? 0 : ret.getTags().size()));
}
return ret;
}
@Override
public Long getTagVersion(String serviceName) {
XXServiceVersionInfo serviceVersionInfoDbObj = daoManager.getXXServiceVersionInfo().findByServiceName(serviceName);
return serviceVersionInfoDbObj != null ? serviceVersionInfoDbObj.getTagVersion() : null;
}
@Override
public ServiceTags getServiceTags(String serviceName) throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TagDBStore.getServiceTags(" + serviceName + ")");
}
ServiceTags ret = null;
XXService xxService = daoManager.getXXService().findByName(serviceName);
if (xxService == null) {
throw new Exception("service does not exist. name=" + serviceName);
}
XXServiceVersionInfo serviceVersionInfoDbObj = daoManager.getXXServiceVersionInfo().findByServiceName(serviceName);
if (serviceVersionInfoDbObj == null) {
LOG.warn("serviceVersionInfo does not exist for service [" + serviceName + "]");
}
RangerServiceDef serviceDef = svcStore.getServiceDef(xxService.getType());
if (serviceDef == null) {
throw new Exception("service-def does not exist. id=" + xxService.getType());
}
RangerTagDBRetriever tagDBRetriever = new RangerTagDBRetriever(daoManager, xxService);
Map<Long, RangerTagDef> tagDefMap = tagDBRetriever.getTagDefs();
Map<Long, RangerTag> tagMap = tagDBRetriever.getTags();
List<RangerServiceResource> resources = tagDBRetriever.getServiceResources();
List<RangerTagResourceMap> tagResourceMaps = tagDBRetriever.getTagResourceMaps();
Map<Long, List<Long>> resourceToTagIds = new HashMap<Long, List<Long>>();
if (CollectionUtils.isNotEmpty(tagResourceMaps)) {
Long resourceId = null;
List<Long> tagIds = null;
for (RangerTagResourceMap tagResourceMap : tagResourceMaps) {
if (!tagResourceMap.getResourceId().equals(resourceId)) {
if (resourceId != null) {
resourceToTagIds.put(resourceId, tagIds);
}
resourceId = tagResourceMap.getResourceId();
tagIds = new ArrayList<Long>();
}
tagIds.add(tagResourceMap.getTagId());
}
if (resourceId != null) {
resourceToTagIds.put(resourceId, tagIds);
}
}
ret = new ServiceTags();
ret.setServiceName(xxService.getName());
ret.setTagVersion(serviceVersionInfoDbObj == null ? null : serviceVersionInfoDbObj.getTagVersion());
ret.setTagUpdateTime(serviceVersionInfoDbObj == null ? null : serviceVersionInfoDbObj.getTagUpdateTime());
ret.setTagDefinitions(tagDefMap);
ret.setTags(tagMap);
ret.setServiceResources(resources);
ret.setResourceToTagIds(resourceToTagIds);
if(LOG.isDebugEnabled()) {
LOG.debug("<== TagDBStore.getServiceTags(" + serviceName + ")");
}
return ret;
}
private List<XXTagAttributeDef> createTagAttributeDefs(Long tagDefId, List<RangerTagAttributeDef> tagAttrDefList) {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TagDBStore.createTagAttributeDefs(" + tagDefId + ", attributeDefCount=" + (tagAttrDefList == null ? 0 : tagAttrDefList.size()) + ")");
}
if (tagDefId == null) {
throw errorUtil.createRESTException("TagDBStore.createTagAttributeDefs(): Error creating tag-attr def. tagDefId can not be null.", MessageEnums.ERROR_CREATING_OBJECT);
}
List<XXTagAttributeDef> ret = new ArrayList<XXTagAttributeDef>();
if (CollectionUtils.isNotEmpty(tagAttrDefList)) {
for (RangerTagDef.RangerTagAttributeDef attrDef : tagAttrDefList) {
XXTagAttributeDef xAttrDef = new XXTagAttributeDef();
xAttrDef.setTagDefId(tagDefId);
xAttrDef.setName(attrDef.getName());
xAttrDef.setType(attrDef.getType());
xAttrDef = rangerAuditFields.populateAuditFieldsForCreate(xAttrDef);
xAttrDef = daoManager.getXXTagAttributeDef().create(xAttrDef);
ret.add(xAttrDef);
}
}
if (LOG.isDebugEnabled()) {
LOG.debug("<== TagDBStore.createTagAttributeDefs(" + tagDefId + ", attributeDefCount=" + (tagAttrDefList == null ? 0 : tagAttrDefList.size()) + "): retCount=" + ret.size());
}
return ret;
}
private void deleteTagAttributeDefs(Long tagDefId) {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TagDBStore.deleteTagAttributeDefs(" + tagDefId + ")");
}
if (tagDefId != null) {
List<XXTagAttributeDef> tagAttrDefList = daoManager.getXXTagAttributeDef().findByTagDefId(tagDefId);
if (CollectionUtils.isNotEmpty(tagAttrDefList)) {
for (XXTagAttributeDef xAttrDef : tagAttrDefList) {
if (LOG.isDebugEnabled()) {
LOG.debug("Deleting tag-attribute def [name=" + xAttrDef.getName() + "; id=" + xAttrDef.getId() + "]");
}
daoManager.getXXTagAttributeDef().remove(xAttrDef);
}
}
}
if (LOG.isDebugEnabled()) {
LOG.debug("<== TagDBStore.deleteTagAttributeDefs(" + tagDefId + ")");
}
}
private List<XXTagAttribute> createTagAttributes(Long tagId, Map<String, String> attributes) {
List<XXTagAttribute> ret = new ArrayList<XXTagAttribute>();
if(MapUtils.isNotEmpty(attributes)) {
for (Map.Entry<String, String> attr : attributes.entrySet()) {
XXTagAttribute xTagAttr = new XXTagAttribute();
xTagAttr.setTagId(tagId);
xTagAttr.setName(attr.getKey());
xTagAttr.setValue(attr.getValue());
xTagAttr = rangerAuditFields.populateAuditFieldsForCreate(xTagAttr);
xTagAttr = daoManager.getXXTagAttribute().create(xTagAttr);
ret.add(xTagAttr);
}
}
return ret;
}
private void deleteTagAttributes(Long tagId) {
List<XXTagAttribute> tagAttrList = daoManager.getXXTagAttribute().findByTagId(tagId);
for (XXTagAttribute tagAttr : tagAttrList) {
daoManager.getXXTagAttribute().remove(tagAttr);
}
}
private void deleteResourceForServiceResource(Long resourceId) {
List<XXServiceResourceElement> resElements = daoManager.getXXServiceResourceElement().findByResourceId(resourceId);
if(CollectionUtils.isNotEmpty(resElements)) {
for(XXServiceResourceElement resElement : resElements) {
List<XXServiceResourceElementValue> elementValues = daoManager.getXXServiceResourceElementValue().findByResValueId(resElement.getId());
if(CollectionUtils.isNotEmpty(elementValues)) {
for(XXServiceResourceElementValue elementValue : elementValues) {
daoManager.getXXServiceResourceElementValue().remove(elementValue.getId());
}
}
daoManager.getXXServiceResourceElement().remove(resElement.getId());
}
}
}
private void createResourceForServiceResource(Long resourceId, RangerServiceResource serviceResource) {
String serviceName = serviceResource.getServiceName();
XXService xService = daoManager.getXXService().findByName(serviceName);
if (xService == null) {
throw errorUtil.createRESTException("No Service found with name: " + serviceName, MessageEnums.ERROR_CREATING_OBJECT);
}
XXServiceDef xServiceDef = daoManager.getXXServiceDef().getById(xService.getType());
if (xServiceDef == null) {
throw errorUtil.createRESTException("No Service-Def found with ID: " + xService.getType(), MessageEnums.ERROR_CREATING_OBJECT);
}
Map<String, RangerPolicy.RangerPolicyResource> resElements = serviceResource.getResourceElements();
for (Map.Entry<String, RangerPolicyResource> resElement : resElements.entrySet()) {
XXResourceDef xResDef = daoManager.getXXResourceDef().findByNameAndServiceDefId(resElement.getKey(), xServiceDef.getId());
if (xResDef == null) {
LOG.error("TagDBStore.createResource: ResourceType is not valid [" + resElement.getKey() + "]");
throw errorUtil.createRESTException("Resource Type is not valid [" + resElement.getKey() + "]", MessageEnums.DATA_NOT_FOUND);
}
RangerPolicyResource policyRes = resElement.getValue();
XXServiceResourceElement resourceElement = new XXServiceResourceElement();
resourceElement.setIsExcludes(policyRes.getIsExcludes());
resourceElement.setIsRecursive(policyRes.getIsRecursive());
resourceElement.setResDefId(xResDef.getId());
resourceElement.setResourceId(resourceId);
resourceElement = rangerAuditFields.populateAuditFieldsForCreate(resourceElement);
resourceElement = daoManager.getXXServiceResourceElement().create(resourceElement);
int sortOrder = 1;
for (String resVal : policyRes.getValues()) {
XXServiceResourceElementValue resourceElementValue = new XXServiceResourceElementValue();
resourceElementValue.setResElementId(resourceElement.getId());
resourceElementValue.setValue(resVal);
resourceElementValue.setSortOrder(sortOrder);
resourceElementValue = rangerAuditFields.populateAuditFieldsForCreate(resourceElementValue);
resourceElementValue = daoManager.getXXServiceResourceElementValue().create(resourceElementValue);
sortOrder++;
}
}
}
@Override
public void deleteAllTagObjectsForService(String serviceName) throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TagDBStore.deleteAllTagObjectsForService(" + serviceName + ")");
}
XXService service = daoManager.getXXService().findByName(serviceName);
if (service != null) {
Long serviceId = service.getId();
List<XXTagAttribute> xxTagAttributes = daoManager.getXXTagAttribute().findByServiceIdAndOwner(serviceId, RangerTag.OWNER_SERVICERESOURCE);
List<XXTag> xxTags = daoManager.getXXTag().findByServiceIdAndOwner(serviceId, RangerTag.OWNER_SERVICERESOURCE);
List<XXTagResourceMap> xxTagResourceMaps = daoManager.getXXTagResourceMap().findByServiceId(serviceId);
if (CollectionUtils.isNotEmpty(xxTagResourceMaps)) {
for (XXTagResourceMap xxTagResourceMap : xxTagResourceMaps) {
try {
daoManager.getXXTagResourceMap().remove(xxTagResourceMap);
} catch (Exception e) {
LOG.error("Error deleting RangerTagResourceMap with id=" + xxTagResourceMap.getId(), e);
throw e;
}
}
}
if (CollectionUtils.isNotEmpty(xxTagAttributes)) {
for (XXTagAttribute xxTagAttribute : xxTagAttributes) {
try {
daoManager.getXXTagAttribute().remove(xxTagAttribute);
} catch (Exception e) {
LOG.error("Error deleting RangerTagAttribute with id=" + xxTagAttribute.getId(), e);
throw e;
}
}
}
if (CollectionUtils.isNotEmpty(xxTags)) {
for (XXTag xxTag : xxTags) {
try {
daoManager.getXXTag().remove(xxTag);
} catch (Exception e) {
LOG.error("Error deleting RangerTag with id=" + xxTag.getId(), e);
throw e;
}
}
}
List<XXServiceResourceElementValue> xxServiceResourceElementValues = daoManager.getXXServiceResourceElementValue().findByServiceId(serviceId);
if (CollectionUtils.isNotEmpty(xxServiceResourceElementValues)) {
for (XXServiceResourceElementValue xxServiceResourceElementValue : xxServiceResourceElementValues) {
try {
daoManager.getXXServiceResourceElementValue().remove(xxServiceResourceElementValue);
} catch (Exception e) {
LOG.error("Error deleting ServiceResourceElementValue with id=" + xxServiceResourceElementValue.getId(), e);
throw e;
}
}
}
List<XXServiceResourceElement> xxServiceResourceElements = daoManager.getXXServiceResourceElement().findByServiceId(serviceId);
if (CollectionUtils.isNotEmpty(xxServiceResourceElements)) {
for (XXServiceResourceElement xxServiceResourceElement : xxServiceResourceElements) {
try {
daoManager.getXXServiceResourceElement().remove(xxServiceResourceElement);
} catch (Exception e) {
LOG.error("Error deleting ServiceResourceElement with id=" + xxServiceResourceElement.getId(), e);
throw e;
}
}
}
List<XXServiceResource> xxServiceResources = daoManager.getXXServiceResource().findByServiceId(serviceId);
if (CollectionUtils.isNotEmpty(xxServiceResources)) {
for (XXServiceResource xxServiceResource : xxServiceResources) {
try {
daoManager.getXXServiceResource().remove(xxServiceResource);
} catch (Exception e) {
LOG.error("Error deleting RangerServiceResource with id=" + xxServiceResource.getId(), e);
throw e;
}
}
}
}
if (LOG.isDebugEnabled()) {
LOG.debug("<== TagDBStore.deleteAllTagObjectsForService(" + serviceName + ")");
}
}
}