RANGER-753: Optimized tag-download implementation. Instrumented policy download and policy evaluation for performance measurement.
Signed-off-by: Madhan Neethiraj <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/incubator-ranger/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ranger/commit/7a80c8e3 Tree: http://git-wip-us.apache.org/repos/asf/incubator-ranger/tree/7a80c8e3 Diff: http://git-wip-us.apache.org/repos/asf/incubator-ranger/diff/7a80c8e3 Branch: refs/heads/master Commit: 7a80c8e3522fb62ae5f3f53f6df786720a0569be Parents: 68ab77b Author: Abhay Kulkarni <[email protected]> Authored: Thu Nov 12 06:57:41 2015 -0800 Committer: Madhan Neethiraj <[email protected]> Committed: Tue Dec 1 21:14:37 2015 -0800 ---------------------------------------------------------------------- .../RangerAbstractConditionEvaluator.java | 3 + .../RangerConditionEvaluator.java | 1 - .../contextenricher/RangerTagEnricher.java | 50 +- .../ranger/plugin/model/RangerTagDef.java | 1 + .../policyengine/RangerPolicyEngineImpl.java | 62 +- .../policyengine/RangerPolicyRepository.java | 25 + .../RangerAbstractPolicyItemEvaluator.java | 9 +- .../RangerCachedPolicyEvaluator.java | 26 +- .../RangerDefaultPolicyEvaluator.java | 61 +- .../RangerDefaultPolicyItemEvaluator.java | 40 +- .../RangerOptimizedPolicyEvaluator.java | 12 +- .../RangerPolicyItemEvaluator.java | 2 + .../RangerAbstractResourceMatcher.java | 6 +- .../ranger/plugin/store/AbstractTagStore.java | 45 ++ .../apache/ranger/plugin/store/TagStore.java | 1 + .../ranger/plugin/util/PolicyRefresher.java | 11 +- .../plugin/policyengine/TestPolicyEngine.java | 2 +- .../src/test/resources/log4j.properties | 35 -- agents-common/src/test/resources/log4j.xml | 53 ++ security-admin/.gitignore | 2 - .../ranger/biz/RangerPolicyRetriever.java | 2 +- .../apache/ranger/biz/RangerTagDBRetriever.java | 597 +++++++++++++++++++ .../java/org/apache/ranger/biz/TagDBStore.java | 24 +- .../ranger/db/XXServiceResourceElementDao.java | 12 + .../db/XXServiceResourceElementValueDao.java | 25 + .../org/apache/ranger/db/XXTagAttributeDao.java | 23 + .../apache/ranger/db/XXTagAttributeDefDao.java | 23 + .../java/org/apache/ranger/db/XXTagDefDao.java | 13 + .../org/apache/ranger/rest/ServiceREST.java | 198 +++--- .../ranger/rest/ServiceTagsProcessor.java | 27 +- .../resources/META-INF/jpa_named_queries.xml | 77 ++- .../src/test/resources/log4j.properties | 35 -- security-admin/src/test/resources/log4j.xml | 53 ++ 33 files changed, 1287 insertions(+), 269 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/7a80c8e3/agents-common/src/main/java/org/apache/ranger/plugin/conditionevaluator/RangerAbstractConditionEvaluator.java ---------------------------------------------------------------------- diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/conditionevaluator/RangerAbstractConditionEvaluator.java b/agents-common/src/main/java/org/apache/ranger/plugin/conditionevaluator/RangerAbstractConditionEvaluator.java index 0bcb744..06263d1 100644 --- a/agents-common/src/main/java/org/apache/ranger/plugin/conditionevaluator/RangerAbstractConditionEvaluator.java +++ b/agents-common/src/main/java/org/apache/ranger/plugin/conditionevaluator/RangerAbstractConditionEvaluator.java @@ -47,4 +47,7 @@ public abstract class RangerAbstractConditionEvaluator implements RangerConditio @Override public void init() { } + + public RangerPolicyItemCondition getPolicyItemCondition() { return condition; } + } http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/7a80c8e3/agents-common/src/main/java/org/apache/ranger/plugin/conditionevaluator/RangerConditionEvaluator.java ---------------------------------------------------------------------- diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/conditionevaluator/RangerConditionEvaluator.java b/agents-common/src/main/java/org/apache/ranger/plugin/conditionevaluator/RangerConditionEvaluator.java index 602b80e..9515000 100644 --- a/agents-common/src/main/java/org/apache/ranger/plugin/conditionevaluator/RangerConditionEvaluator.java +++ b/agents-common/src/main/java/org/apache/ranger/plugin/conditionevaluator/RangerConditionEvaluator.java @@ -31,7 +31,6 @@ public interface RangerConditionEvaluator { void setServiceDef(RangerServiceDef serviceDef); - void init(); boolean isMatched(RangerAccessRequest request); http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/7a80c8e3/agents-common/src/main/java/org/apache/ranger/plugin/contextenricher/RangerTagEnricher.java ---------------------------------------------------------------------- diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/contextenricher/RangerTagEnricher.java b/agents-common/src/main/java/org/apache/ranger/plugin/contextenricher/RangerTagEnricher.java index b5662bf..e9fc42c 100644 --- a/agents-common/src/main/java/org/apache/ranger/plugin/contextenricher/RangerTagEnricher.java +++ b/agents-common/src/main/java/org/apache/ranger/plugin/contextenricher/RangerTagEnricher.java @@ -33,6 +33,7 @@ import org.apache.ranger.plugin.policyengine.RangerAccessRequest; import org.apache.ranger.plugin.policyengine.RangerAccessResource; import org.apache.ranger.plugin.policyresourcematcher.RangerDefaultPolicyResourceMatcher; import org.apache.ranger.plugin.util.RangerAccessRequestUtil; +import org.apache.ranger.plugin.util.RangerPerfTracer; import org.apache.ranger.plugin.util.ServiceTags; import java.io.*; @@ -43,6 +44,8 @@ import java.util.Map; public class RangerTagEnricher extends RangerAbstractContextEnricher { private static final Log LOG = LogFactory.getLog(RangerTagEnricher.class); + private static final Log PERF_ENRICHER_LOG = RangerPerfTracer.getPerfLogger("enricher"); + public static final String TAG_REFRESHER_POLLINGINTERVAL_OPTION = "tagRefresherPollingInterval"; public static final String TAG_RETRIEVER_CLASSNAME_OPTION = "tagRetrieverClassName"; @@ -51,8 +54,6 @@ public class RangerTagEnricher extends RangerAbstractContextEnricher { private RangerTagRetriever tagRetriever = null; - private long lastKnownVersion = -1L; - ServiceTags serviceTags = null; List<RangerServiceResourceMatcher> serviceResourceMatchers; @@ -100,7 +101,7 @@ public class RangerTagEnricher extends RangerAbstractContextEnricher { tagRetriever.setAppId(appId); tagRetriever.init(enricherDef.getEnricherOptions()); - tagRefresher = new RangerTagRefresher(tagRetriever, this, lastKnownVersion, cacheFile, pollingIntervalMs); + tagRefresher = new RangerTagRefresher(tagRetriever, this, -1L, cacheFile, pollingIntervalMs); try { tagRefresher.populateTags(); @@ -125,9 +126,7 @@ public class RangerTagEnricher extends RangerAbstractContextEnricher { LOG.debug("==> RangerTagEnricher.enrich(" + request + ")"); } - List<RangerServiceResourceMatcher> serviceResourceMatchersCopy = serviceResourceMatchers; - - List<RangerTag> matchedTags = findMatchingTags(request.getResource(), serviceResourceMatchersCopy); + List<RangerTag> matchedTags = findMatchingTags(request.getResource()); RangerAccessRequestUtil.setRequestTagsInContext(request.getContext(), matchedTags); @@ -137,15 +136,19 @@ public class RangerTagEnricher extends RangerAbstractContextEnricher { } public void setServiceTags(final ServiceTags serviceTags) { - this.serviceTags = serviceTags; - this.lastKnownVersion = serviceTags.getTagVersion(); List<RangerServiceResourceMatcher> resourceMatchers = new ArrayList<RangerServiceResourceMatcher>(); - List<RangerServiceResource> serviceResources = this.serviceTags.getServiceResources(); + List<RangerServiceResource> serviceResources = serviceTags.getServiceResources(); if (CollectionUtils.isNotEmpty(serviceResources)) { + RangerPerfTracer perf = null; + + if(RangerPerfTracer.isPerfTraceEnabled(PERF_ENRICHER_LOG)) { + perf = RangerPerfTracer.getPerfTracer(PERF_ENRICHER_LOG, "RangerTagEnricher.setServiceTags(serviceName=" + tagRetriever.getServiceName() + ",lastKnownVersion=" + serviceTags.getTagVersion() + ")"); + } + for (RangerServiceResource serviceResource : serviceResources) { RangerDefaultPolicyResourceMatcher matcher = new RangerDefaultPolicyResourceMatcher(); @@ -163,10 +166,12 @@ public class RangerTagEnricher extends RangerAbstractContextEnricher { resourceMatchers.add(serviceResourceMatcher); } - } - serviceResourceMatchers = resourceMatchers; + RangerPerfTracer.log(perf); + } + this.serviceResourceMatchers = resourceMatchers; + this.serviceTags = serviceTags; } @Override @@ -188,16 +193,19 @@ public class RangerTagEnricher extends RangerAbstractContextEnricher { return ret; } - private List<RangerTag> findMatchingTags(final RangerAccessResource resource, final List<RangerServiceResourceMatcher> resourceMatchers) { + private List<RangerTag> findMatchingTags(final RangerAccessResource resource) { if (LOG.isDebugEnabled()) { LOG.debug("==> RangerTagEnricher.findMatchingTags(" + resource + ")"); } List<RangerTag> ret = null; + final List<RangerServiceResourceMatcher> serviceResourceMatchers = this.serviceResourceMatchers; - if (CollectionUtils.isNotEmpty(resourceMatchers)) { + if (CollectionUtils.isNotEmpty(serviceResourceMatchers)) { - for (RangerServiceResourceMatcher resourceMatcher : resourceMatchers) { + final ServiceTags serviceTags = this.serviceTags; + + for (RangerServiceResourceMatcher resourceMatcher : serviceResourceMatchers) { boolean matchResult = resourceMatcher.isMatch(resource); @@ -226,14 +234,14 @@ public class RangerTagEnricher extends RangerAbstractContextEnricher { return ret; } - static private List<RangerTag> getTagsForServiceResource(ServiceTags serviceTags, RangerServiceResource serviceResource) { + static private List<RangerTag> getTagsForServiceResource(final ServiceTags serviceTags, final RangerServiceResource serviceResource) { List<RangerTag> ret = new ArrayList<RangerTag>(); - Long resourceId = serviceResource.getId(); + final Long resourceId = serviceResource.getId(); - Map<Long, List<Long>> resourceToTagIds = serviceTags.getResourceToTagIds(); - Map<Long, RangerTag> tags = serviceTags.getTags(); + final Map<Long, List<Long>> resourceToTagIds = serviceTags.getResourceToTagIds(); + final Map<Long, RangerTag> tags = serviceTags.getTags(); if (resourceId != null && MapUtils.isNotEmpty(resourceToTagIds) && MapUtils.isNotEmpty(tags)) { @@ -318,7 +326,11 @@ public class RangerTagEnricher extends RangerAbstractContextEnricher { if (tagEnricher != null) { ServiceTags serviceTags = null; + RangerPerfTracer perf = null; + if(RangerPerfTracer.isPerfTraceEnabled(PERF_ENRICHER_LOG)) { + perf = RangerPerfTracer.getPerfTracer(PERF_ENRICHER_LOG, "RangerTagRefresher.populateTags(serviceName=" + tagRetriever.getServiceName() + ",lastKnownVersion" + lastKnownVersion + ")"); + } serviceTags = tagRetriever.retrieveTags(lastKnownVersion); if (serviceTags == null) { @@ -329,6 +341,8 @@ public class RangerTagEnricher extends RangerAbstractContextEnricher { saveToCache(serviceTags); } + RangerPerfTracer.log(perf); + if (serviceTags != null) { tagEnricher.setServiceTags(serviceTags); LOG.info("RangerTagRefresher.populateTags() - Updated tags-cache to new version of tags, lastKnownVersion=" + lastKnownVersion + "; newVersion=" + serviceTags.getTagVersion()); http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/7a80c8e3/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerTagDef.java ---------------------------------------------------------------------- diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerTagDef.java b/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerTagDef.java index ba2a5d7..93f7b14 100644 --- a/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerTagDef.java +++ b/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerTagDef.java @@ -61,6 +61,7 @@ public class RangerTagDef extends RangerBaseModelObject { super(); setName(name); setSource(source); + setAttributeDefs(null); } public String getName() { http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/7a80c8e3/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyEngineImpl.java ---------------------------------------------------------------------- diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyEngineImpl.java b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyEngineImpl.java index 8adab7b..df6ca41 100644 --- a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyEngineImpl.java +++ b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyEngineImpl.java @@ -30,12 +30,15 @@ import org.apache.ranger.plugin.model.RangerServiceDef; import org.apache.ranger.plugin.model.RangerPolicy.RangerPolicyResource; import org.apache.ranger.plugin.policyevaluator.RangerPolicyEvaluator; import org.apache.ranger.plugin.util.RangerAccessRequestUtil; +import org.apache.ranger.plugin.util.RangerPerfTracer; import org.apache.ranger.plugin.util.ServicePolicies; import java.util.*; public class RangerPolicyEngineImpl implements RangerPolicyEngine { private static final Log LOG = LogFactory.getLog(RangerPolicyEngineImpl.class); + private static final Log PERF_POLICY_LOG = RangerPerfTracer.getPerfLogger("policy"); + private static final Log PERF_ENRICHER_LOG = RangerPerfTracer.getPerfLogger("enricher"); private final RangerPolicyRepository policyRepository; private final RangerPolicyRepository tagPolicyRepository; @@ -47,6 +50,12 @@ public class RangerPolicyEngineImpl implements RangerPolicyEngine { LOG.debug("==> RangerPolicyEngineImpl(" + appId + ", " + servicePolicies + ", " + options + ")"); } + RangerPerfTracer perf = null; + + if(RangerPerfTracer.isPerfTraceEnabled(PERF_POLICY_LOG)) { + perf = RangerPerfTracer.getPerfTracer(PERF_POLICY_LOG, "RangerPolicyEngine.init(appId=" + appId + ",hashCode=" + Integer.toHexString(System.identityHashCode(this)) + ")"); + } + if (options == null) { options = new RangerPolicyEngineOptions(); } @@ -90,6 +99,8 @@ public class RangerPolicyEngineImpl implements RangerPolicyEngine { this.allContextEnrichers = tmpList; + RangerPerfTracer.log(perf); + if (LOG.isDebugEnabled()) { LOG.debug("<== RangerPolicyEngineImpl()"); } @@ -126,11 +137,21 @@ public class RangerPolicyEngineImpl implements RangerPolicyEngine { List<RangerContextEnricher> enrichers = allContextEnrichers; if(!CollectionUtils.isEmpty(enrichers)) { + + RangerPerfTracer perf = null; + + if(RangerPerfTracer.isPerfTraceEnabled(PERF_ENRICHER_LOG)) { + perf = RangerPerfTracer.getPerfTracer(PERF_ENRICHER_LOG, "RangerPolicyEngine.preProcess(requestHashCode=" + Integer.toHexString(System.identityHashCode(request)) + ")"); + } + for(RangerContextEnricher enricher : enrichers) { enricher.enrich(request); } + + RangerPerfTracer.log(perf); } + if(LOG.isDebugEnabled()) { LOG.debug("<== RangerPolicyEngineImpl.preProcess(" + request + ")"); } @@ -168,6 +189,11 @@ public class RangerPolicyEngineImpl implements RangerPolicyEngine { if (LOG.isDebugEnabled()) { LOG.debug("==> RangerPolicyEngineImpl.isAccessAllowed(" + request + ")"); } + RangerPerfTracer perf = null; + + if(RangerPerfTracer.isPerfTraceEnabled(PERF_POLICY_LOG)) { + perf = RangerPerfTracer.getPerfTracer(PERF_POLICY_LOG, "RangerPolicyEngine.isAccessAllowed(requestHashCode=" + Integer.toHexString(System.identityHashCode(request)) + ")"); + } RangerAccessResult ret = isAccessAllowedNoAudit(request); @@ -175,6 +201,8 @@ public class RangerPolicyEngineImpl implements RangerPolicyEngine { resultProcessor.processResult(ret); } + RangerPerfTracer.log(perf); + if (LOG.isDebugEnabled()) { LOG.debug("<== RangerPolicyEngineImpl.isAccessAllowed(" + request + "): " + ret); } @@ -216,6 +244,11 @@ public class RangerPolicyEngineImpl implements RangerPolicyEngine { LOG.debug("==> RangerPolicyEngineImpl.isAccessAllowed(" + resource + ", " + user + ", " + userGroups + ", " + accessType + ")"); } + RangerPerfTracer perf = null; + + if(RangerPerfTracer.isPerfTraceEnabled(PERF_POLICY_LOG)) { + perf = RangerPerfTracer.getPerfTracer(PERF_POLICY_LOG, "RangerPolicyEngine.isAccessAllowed(user=" + user + ",accessType=" + accessType + ")"); + } boolean ret = false; for (RangerPolicyEvaluator evaluator : policyRepository.getPolicyEvaluators()) { @@ -226,6 +259,8 @@ public class RangerPolicyEngineImpl implements RangerPolicyEngine { } } + RangerPerfTracer.log(perf); + if (LOG.isDebugEnabled()) { LOG.debug("<== RangerPolicyEngineImpl.isAccessAllowed(" + resource + ", " + user + ", " + userGroups + ", " + accessType + "): " + ret); } @@ -311,6 +346,12 @@ public class RangerPolicyEngineImpl implements RangerPolicyEngine { LOG.debug("==> RangerPolicyEngineImpl.isAccessAllowedNoAudit(" + request + ")"); } + RangerPerfTracer perf = null; + + if(RangerPerfTracer.isPerfTraceEnabled(PERF_POLICY_LOG)) { + perf = RangerPerfTracer.getPerfTracer(PERF_POLICY_LOG, "RangerPolicyEngine.isAccessAllowedNoAudit(requestHashCode=" + Integer.toHexString(System.identityHashCode(request)) + ")"); + } + RangerAccessResult ret = createAccessResult(request); if (ret != null && request != null) { @@ -359,6 +400,8 @@ public class RangerPolicyEngineImpl implements RangerPolicyEngine { } } + RangerPerfTracer.log(perf); + if (LOG.isDebugEnabled()) { LOG.debug("<== RangerPolicyEngineImpl.isAccessAllowedNoAudit(" + request + "): " + ret); } @@ -371,6 +414,12 @@ public class RangerPolicyEngineImpl implements RangerPolicyEngine { LOG.debug("==> RangerPolicyEngineImpl.isAccessAllowedForTagPolicies(" + request + ", " + result + ")"); } + RangerPerfTracer perf = null; + + if(RangerPerfTracer.isPerfTraceEnabled(PERF_POLICY_LOG)) { + perf = RangerPerfTracer.getPerfTracer(PERF_POLICY_LOG, "RangerPolicyEngine.isAccessAllowedForTagPolicies(requestHashCode=" + Integer.toHexString(System.identityHashCode(request)) + ")"); + } + List<RangerPolicyEvaluator> evaluators = tagPolicyRepository.getPolicyEvaluators(); if (CollectionUtils.isNotEmpty(evaluators)) { @@ -436,13 +485,11 @@ public class RangerPolicyEngineImpl implements RangerPolicyEngine { break; // Break out of policy-evaluation loop } } - - if (LOG.isDebugEnabled()) { - LOG.debug("RangerPolicyEngineImpl.isAccessAllowedForTagPolicies() : result=" + result); - } } } + RangerPerfTracer.log(perf); + if (LOG.isDebugEnabled()) { LOG.debug("<== RangerPolicyEngineImpl.isAccessAllowedForTagPolicies(" + request + ", " + result + ")" ); } @@ -503,6 +550,11 @@ public class RangerPolicyEngineImpl implements RangerPolicyEngine { LOG.debug("==> RangerPolicyEngineImpl.cleanup()"); } + RangerPerfTracer perf = null; + + if(RangerPerfTracer.isPerfTraceEnabled(PERF_POLICY_LOG)) { + perf = RangerPerfTracer.getPerfTracer(PERF_POLICY_LOG, "RangerPolicyEngine.cleanUp(hashCode=" + Integer.toHexString(System.identityHashCode(this)) + ")"); + } preCleanup(); if (CollectionUtils.isNotEmpty(allContextEnrichers)) { @@ -513,6 +565,8 @@ public class RangerPolicyEngineImpl implements RangerPolicyEngine { this.allContextEnrichers = null; + RangerPerfTracer.log(perf); + if (LOG.isDebugEnabled()) { LOG.debug("<== RangerPolicyEngineImpl.cleanup()"); } http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/7a80c8e3/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyRepository.java ---------------------------------------------------------------------- diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyRepository.java b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyRepository.java index 57b1b7d..0cde01a 100644 --- a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyRepository.java +++ b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyRepository.java @@ -31,12 +31,14 @@ import org.apache.ranger.plugin.policyevaluator.RangerCachedPolicyEvaluator; import org.apache.ranger.plugin.policyevaluator.RangerOptimizedPolicyEvaluator; import org.apache.ranger.plugin.policyevaluator.RangerPolicyEvaluator; import org.apache.ranger.plugin.store.AbstractServiceStore; +import org.apache.ranger.plugin.util.RangerPerfTracer; import org.apache.ranger.plugin.util.ServicePolicies; import java.util.*; public class RangerPolicyRepository { private static final Log LOG = LogFactory.getLog(RangerPolicyRepository.class); + private static final Log PERF_LOG = RangerPerfTracer.getPerfLogger("policy"); private final String serviceName; private final String appId; @@ -53,6 +55,12 @@ public class RangerPolicyRepository { RangerPolicyRepository(String appId, ServicePolicies servicePolicies, RangerPolicyEngineOptions options) { super(); + RangerPerfTracer perf = null; + + if(RangerPerfTracer.isPerfTraceEnabled(PERF_LOG)) { + perf = RangerPerfTracer.getPerfTracer(PERF_LOG, "RangerPolicyRepository.init(appId=" + appId + ",hashCode=" + Integer.toHexString(System.identityHashCode(this)) + ")"); + } + this.componentServiceName = this.serviceName = servicePolicies.getServiceName(); this.componentServiceDef = this.serviceDef = servicePolicies.getServiceDef(); @@ -78,6 +86,7 @@ public class RangerPolicyRepository { init(options); + RangerPerfTracer.log(perf); } RangerPolicyRepository(String appId, ServicePolicies.TagPolicies tagPolicies, RangerPolicyEngineOptions options, @@ -321,6 +330,12 @@ public class RangerPolicyRepository { RangerContextEnricher ret = null; + RangerPerfTracer perf = null; + + if(RangerPerfTracer.isPerfTraceEnabled(PERF_LOG)) { + perf = RangerPerfTracer.getPerfTracer(PERF_LOG, "RangerPolicyRepository.buildContextEnricher(name=" + enricherDef.getName() + ")"); + } + String name = enricherDef != null ? enricherDef.getName() : null; String clsName = enricherDef != null ? enricherDef.getEnricher() : null; @@ -343,6 +358,8 @@ public class RangerPolicyRepository { ret.init(); } + RangerPerfTracer.log(perf); + if(LOG.isDebugEnabled()) { LOG.debug("<== RangerPolicyRepository.buildContextEnricher(" + enricherDef + "): " + ret); } @@ -356,6 +373,12 @@ public class RangerPolicyRepository { RangerPolicyEvaluator ret; + RangerPerfTracer perf = null; + + if(RangerPerfTracer.isPerfTraceEnabled(PERF_LOG)) { + perf = RangerPerfTracer.getPerfTracer(PERF_LOG, "RangerPolicyRepository.buildPolicyEvaluator(name=" + policy.getName() + ")"); + } + if(StringUtils.equalsIgnoreCase(options.evaluatorType, RangerPolicyEvaluator.EVALUATOR_TYPE_DEFAULT)) { ret = new RangerOptimizedPolicyEvaluator(); } else if(StringUtils.equalsIgnoreCase(options.evaluatorType, RangerPolicyEvaluator.EVALUATOR_TYPE_OPTIMIZED)) { @@ -366,6 +389,8 @@ public class RangerPolicyRepository { ret.init(policy, serviceDef, options); + RangerPerfTracer.log(perf); + if(LOG.isDebugEnabled()) { LOG.debug("<== RangerPolicyRepository.buildPolicyEvaluator(" + policy + "," + serviceDef + "): " + ret); } http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/7a80c8e3/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerAbstractPolicyItemEvaluator.java ---------------------------------------------------------------------- diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerAbstractPolicyItemEvaluator.java b/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerAbstractPolicyItemEvaluator.java index ffd1d79..d592182 100644 --- a/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerAbstractPolicyItemEvaluator.java +++ b/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerAbstractPolicyItemEvaluator.java @@ -47,15 +47,17 @@ public abstract class RangerAbstractPolicyItemEvaluator implements RangerPolicyI final RangerServiceDef serviceDef; final RangerPolicyItem policyItem; final int policyItemType; + final int policyItemIndex; final long policyId; final int evalOrder; List<RangerConditionEvaluator> conditionEvaluators = Collections.<RangerConditionEvaluator>emptyList(); - RangerAbstractPolicyItemEvaluator(RangerServiceDef serviceDef, RangerPolicy policy, RangerPolicyItem policyItem, int policyItemType, RangerPolicyEngineOptions options) { + RangerAbstractPolicyItemEvaluator(RangerServiceDef serviceDef, RangerPolicy policy, RangerPolicyItem policyItem, int policyItemType, int policyItemIndex, RangerPolicyEngineOptions options) { this.serviceDef = serviceDef; this.policyItem = policyItem; this.policyItemType = policyItemType; + this.policyItemIndex = policyItemIndex; this.options = options; this.policyId = policy != null && policy.getId() != null ? policy.getId() : -1; this.evalOrder = computeEvalOrder(); @@ -82,6 +84,11 @@ public abstract class RangerAbstractPolicyItemEvaluator implements RangerPolicyI } @Override + public int getPolicyItemIndex() { + return policyItemIndex; + } + + @Override public String getComments() { return policyItem == null ? null : policyItem.getComments(); } http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/7a80c8e3/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerCachedPolicyEvaluator.java ---------------------------------------------------------------------- diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerCachedPolicyEvaluator.java b/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerCachedPolicyEvaluator.java index d67777c..580447b 100644 --- a/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerCachedPolicyEvaluator.java +++ b/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerCachedPolicyEvaluator.java @@ -25,11 +25,14 @@ import org.apache.ranger.plugin.model.RangerPolicy; import org.apache.ranger.plugin.model.RangerServiceDef; import org.apache.ranger.plugin.policyengine.RangerAccessResource; import org.apache.ranger.plugin.policyengine.RangerPolicyEngineOptions; +import org.apache.ranger.plugin.util.RangerPerfTracer; public class RangerCachedPolicyEvaluator extends RangerOptimizedPolicyEvaluator { private static final Log LOG = LogFactory.getLog(RangerCachedPolicyEvaluator.class); + private static final Log PERF_LOG = RangerPerfTracer.getPerfLogger("policy"); private RangerResourceAccessCache cache = null; + private String perfTag; @Override public void init(RangerPolicy policy, RangerServiceDef serviceDef, RangerPolicyEngineOptions options) { @@ -37,10 +40,23 @@ public class RangerCachedPolicyEvaluator extends RangerOptimizedPolicyEvaluator LOG.debug("==> RangerCachedPolicyEvaluator.init()"); } + StringBuffer perfTagBuffer = new StringBuffer(); + perfTagBuffer.append("policyId=").append(policy.getId()).append(",policyName=").append(policy.getName()); + + perfTag = perfTagBuffer.toString(); + + RangerPerfTracer perf = null; + + if(RangerPerfTracer.isPerfTraceEnabled(PERF_LOG)) { + perf = RangerPerfTracer.getPerfTracer(PERF_LOG, "RangerCachedPolicyEvaluator.init(" + perfTag + ")"); + } + super.init(policy, serviceDef, options); cache = RangerResourceAccessCacheImpl.getInstance(serviceDef, policy); - + + RangerPerfTracer.log(perf); + if(LOG.isDebugEnabled()) { LOG.debug("<== RangerCachedPolicyEvaluator.init()"); } @@ -54,6 +70,12 @@ public class RangerCachedPolicyEvaluator extends RangerOptimizedPolicyEvaluator boolean result = false; + RangerPerfTracer perf = null; + + if(RangerPerfTracer.isPerfTraceEnabled(PERF_LOG)) { + perf = RangerPerfTracer.getPerfTracer(PERF_LOG, "RangerCachedPolicyEvaluator.isMatch(" + perfTag + ",accessResource=" + resource.getAsString() + ")"); + } + // Check in the evaluator-owned cache for the match, if found return. else call super.isMatch(), add result to cache RangerResourceAccessCache.LookupResult lookup = cache.lookup(resource); @@ -73,6 +95,8 @@ public class RangerCachedPolicyEvaluator extends RangerOptimizedPolicyEvaluator } } + RangerPerfTracer.log(perf); + if (LOG.isDebugEnabled()) { LOG.debug("<== RangerCachedPolicyEvaluator.isMatch(" + resource + "): " + result); } http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/7a80c8e3/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerDefaultPolicyEvaluator.java ---------------------------------------------------------------------- diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerDefaultPolicyEvaluator.java b/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerDefaultPolicyEvaluator.java index da15c00..439b58d 100644 --- a/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerDefaultPolicyEvaluator.java +++ b/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerDefaultPolicyEvaluator.java @@ -44,10 +44,12 @@ import org.apache.ranger.plugin.policyengine.RangerAccessResult; import org.apache.ranger.plugin.policyengine.RangerPolicyEngineOptions; import org.apache.ranger.plugin.policyresourcematcher.RangerDefaultPolicyResourceMatcher; import org.apache.ranger.plugin.policyresourcematcher.RangerPolicyResourceMatcher; +import org.apache.ranger.plugin.util.RangerPerfTracer; public class RangerDefaultPolicyEvaluator extends RangerAbstractPolicyEvaluator { private static final Log LOG = LogFactory.getLog(RangerDefaultPolicyEvaluator.class); + private static final Log PERF_LOG = RangerPerfTracer.getPerfLogger("policy"); private RangerPolicyResourceMatcher resourceMatcher = null; private List<RangerPolicyItemEvaluator> allowEvaluators = null; @@ -55,6 +57,7 @@ public class RangerDefaultPolicyEvaluator extends RangerAbstractPolicyEvaluator private List<RangerPolicyItemEvaluator> allowExceptionEvaluators = null; private List<RangerPolicyItemEvaluator> denyExceptionEvaluators = null; private int customConditionsCount = 0; + private String perfTag; @Override public int getCustomConditionsCount() { @@ -67,6 +70,17 @@ public class RangerDefaultPolicyEvaluator extends RangerAbstractPolicyEvaluator LOG.debug("==> RangerDefaultPolicyEvaluator.init()"); } + StringBuffer perfTagBuffer = new StringBuffer(); + perfTagBuffer.append("policyId=").append(policy.getId()).append(", policyName=").append(policy.getName()); + + perfTag = perfTagBuffer.toString(); + + RangerPerfTracer perf = null; + + if(RangerPerfTracer.isPerfTraceEnabled(PERF_LOG)) { + perf = RangerPerfTracer.getPerfTracer(PERF_LOG, "RangerDefaultPolicyEvaluator.init(" + perfTag + ")"); + } + super.init(policy, serviceDef, options); preprocessPolicy(policy, serviceDef); @@ -94,6 +108,8 @@ public class RangerDefaultPolicyEvaluator extends RangerAbstractPolicyEvaluator Collections.sort(allowExceptionEvaluators); Collections.sort(denyExceptionEvaluators); + RangerPerfTracer.log(perf); + if(LOG.isDebugEnabled()) { LOG.debug("<== RangerDefaultPolicyEvaluator.init()"); } @@ -105,6 +121,13 @@ public class RangerDefaultPolicyEvaluator extends RangerAbstractPolicyEvaluator LOG.debug("==> RangerDefaultPolicyEvaluator.evaluate(" + request + ", " + result + ")"); } + RangerPerfTracer perf = null; + + if(RangerPerfTracer.isPerfTraceEnabled(PERF_LOG)) { + perf = RangerPerfTracer.getPerfTracer(PERF_LOG, "RangerDefaultPolicyEvaluator.evaluate(requestHashCode=" + Integer.toHexString(System.identityHashCode(request)) + "," + + perfTag + ")"); + } + if (request != null && result != null) { boolean isResourceMatch = false; boolean isResourceHeadMatch = false; @@ -158,6 +181,8 @@ public class RangerDefaultPolicyEvaluator extends RangerAbstractPolicyEvaluator } } + RangerPerfTracer.log(perf); + if(LOG.isDebugEnabled()) { LOG.debug("<== RangerDefaultPolicyEvaluator.evaluate(" + request + ", " + result + ")"); } @@ -168,6 +193,12 @@ public class RangerDefaultPolicyEvaluator extends RangerAbstractPolicyEvaluator LOG.debug("==> RangerDefaultPolicyEvaluator.evaluatePolicyItems(" + request + ", " + result + ", " + isResourceMatch + ")"); } + RangerPerfTracer perf = null; + + if(RangerPerfTracer.isPerfTraceEnabled(PERF_LOG)) { + perf = RangerPerfTracer.getPerfTracer(PERF_LOG, "RangerDefaultPolicyEvaluator.evaluatePolicyItems(requestHashCode=" + Integer.toHexString(System.identityHashCode(request)) + "," + perfTag + ")"); + } + RangerPolicyItemEvaluator matchedPolicyItem = getMatchingPolicyItem(request, denyEvaluators, denyExceptionEvaluators); if(matchedPolicyItem == null && !result.getIsAllowed()) { // if not denied, evaluate allowItems only if not already allowed @@ -192,6 +223,8 @@ public class RangerDefaultPolicyEvaluator extends RangerAbstractPolicyEvaluator } } + RangerPerfTracer.log(perf); + if(LOG.isDebugEnabled()) { LOG.debug("<== RangerDefaultPolicyEvaluator.evaluatePolicyItems(" + request + ", " + result + ", " + isResourceMatch + ")"); } @@ -229,10 +262,18 @@ public class RangerDefaultPolicyEvaluator extends RangerAbstractPolicyEvaluator boolean ret = false; + RangerPerfTracer perf = null; + + if(RangerPerfTracer.isPerfTraceEnabled(PERF_LOG)) { + perf = RangerPerfTracer.getPerfTracer(PERF_LOG, "RangerDefaultPolicyEvaluator.isMatch(resource=" + resource.getAsString() + "," + perfTag + ")"); + } + if(resourceMatcher != null) { ret = resourceMatcher.isMatch(resource); } + RangerPerfTracer.log(perf); + if(LOG.isDebugEnabled()) { LOG.debug("<== RangerDefaultPolicyEvaluator.isMatch(" + resource + "): " + ret); } @@ -333,12 +374,20 @@ public class RangerDefaultPolicyEvaluator extends RangerAbstractPolicyEvaluator boolean ret = false; + RangerPerfTracer perf = null; + + if(RangerPerfTracer.isPerfTraceEnabled(PERF_LOG)) { + perf = RangerPerfTracer.getPerfTracer(PERF_LOG, "RangerDefaultPolicyEvaluator.isAccessAllowed(hashCode=" + Integer.toHexString(System.identityHashCode(this)) + "," + perfTag + ")"); + } + RangerPolicyItemEvaluator item = this.getDeterminingPolicyItem(user, userGroups, accessType); if(item != null && item.getPolicyItemType() == RangerPolicyItemEvaluator.POLICY_ITEM_TYPE_ALLOW) { ret = true; } + RangerPerfTracer.log(perf); + if(LOG.isDebugEnabled()) { LOG.debug("<== RangerDefaultPolicyEvaluator.isAccessAllowed(" + user + ", " + userGroups + ", " + accessType + "): " + ret); } @@ -464,8 +513,10 @@ public class RangerDefaultPolicyEvaluator extends RangerAbstractPolicyEvaluator if(CollectionUtils.isNotEmpty(policyItems)) { ret = new ArrayList<RangerPolicyItemEvaluator>(); + int policyItemCounter = 1; + for(RangerPolicyItem policyItem : policyItems) { - RangerPolicyItemEvaluator itemEvaluator = new RangerDefaultPolicyItemEvaluator(serviceDef, policy, policyItem, policyItemType, options); + RangerPolicyItemEvaluator itemEvaluator = new RangerDefaultPolicyItemEvaluator(serviceDef, policy, policyItem, policyItemType, policyItemCounter++, options); itemEvaluator.init(); @@ -489,6 +540,12 @@ public class RangerDefaultPolicyEvaluator extends RangerAbstractPolicyEvaluator RangerPolicyItemEvaluator ret = null; + RangerPerfTracer perf = null; + + if(RangerPerfTracer.isPerfTraceEnabled(PERF_LOG)) { + perf = RangerPerfTracer.getPerfTracer(PERF_LOG, "RangerDefaultPolicyEvaluator.getMatchingPolicyItem(requestHashCode=" + Integer.toHexString(System.identityHashCode(request)) + "," + perfTag + ")"); + } + if(CollectionUtils.isNotEmpty(evaluators)) { for (RangerPolicyItemEvaluator evaluator : evaluators) { if(evaluator.isMatch(request)) { @@ -513,6 +570,8 @@ public class RangerDefaultPolicyEvaluator extends RangerAbstractPolicyEvaluator } } + RangerPerfTracer.log(perf); + if(LOG.isDebugEnabled()) { LOG.debug("<== RangerDefaultPolicyEvaluator.getMatchingPolicyItem(" + request + "): " + ret); } http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/7a80c8e3/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerDefaultPolicyItemEvaluator.java ---------------------------------------------------------------------- diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerDefaultPolicyItemEvaluator.java b/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerDefaultPolicyItemEvaluator.java index 39a0a5e..7f40bda 100644 --- a/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerDefaultPolicyItemEvaluator.java +++ b/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerDefaultPolicyItemEvaluator.java @@ -26,6 +26,7 @@ import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.ranger.plugin.conditionevaluator.RangerAbstractConditionEvaluator; import org.apache.ranger.plugin.conditionevaluator.RangerConditionEvaluator; import org.apache.ranger.plugin.model.RangerPolicy; import org.apache.ranger.plugin.model.RangerServiceDef; @@ -36,14 +37,18 @@ import org.apache.ranger.plugin.model.RangerServiceDef.RangerPolicyConditionDef; import org.apache.ranger.plugin.policyengine.RangerAccessRequest; import org.apache.ranger.plugin.policyengine.RangerPolicyEngine; import org.apache.ranger.plugin.policyengine.RangerPolicyEngineOptions; +import org.apache.ranger.plugin.util.RangerPerfTracer; public class RangerDefaultPolicyItemEvaluator extends RangerAbstractPolicyItemEvaluator { private static final Log LOG = LogFactory.getLog(RangerDefaultPolicyItemEvaluator.class); + private static final Log PERF_POLICY_LOG = RangerPerfTracer.getPerfLogger("policy"); + private static final Log PERF_ITEM_LOG = RangerPerfTracer.getPerfLogger("item"); + private static final Log PERF_CONDITION_LOG = RangerPerfTracer.getPerfLogger("condition"); - public RangerDefaultPolicyItemEvaluator(RangerServiceDef serviceDef, RangerPolicy policy, RangerPolicyItem policyItem, int policyItemType, RangerPolicyEngineOptions options) { - super(serviceDef, policy, policyItem, policyItemType, options); + public RangerDefaultPolicyItemEvaluator(RangerServiceDef serviceDef, RangerPolicy policy, RangerPolicyItem policyItem, int policyItemType, int policyItemIndex, RangerPolicyEngineOptions options) { + super(serviceDef, policy, policyItem, policyItemType, policyItemIndex, options); } public void init() { @@ -54,6 +59,12 @@ public class RangerDefaultPolicyItemEvaluator extends RangerAbstractPolicyItemEv if (!getConditionsDisabledOption() && policyItem != null && CollectionUtils.isNotEmpty(policyItem.getConditions())) { conditionEvaluators = new ArrayList<RangerConditionEvaluator>(); + RangerPerfTracer perf = null; + + if(RangerPerfTracer.isPerfTraceEnabled(PERF_POLICY_LOG)) { + perf = RangerPerfTracer.getPerfTracer(PERF_POLICY_LOG, "RangerDefaultPolicyItemEvaluator.init(policyId=" + policyId + ",policyItemIndex=" + getPolicyItemIndex() + ")"); + } + for (RangerPolicyItemCondition condition : policyItem.getConditions()) { RangerPolicyConditionDef conditionDef = getConditionDef(condition.getType()); @@ -76,6 +87,7 @@ public class RangerDefaultPolicyItemEvaluator extends RangerAbstractPolicyItemEv LOG.error("RangerDefaultPolicyItemEvaluator(policyId=" + policyId + "): failed to instantiate condition evaluator '" + condition.getType() + "'; evaluatorClassName='" + conditionDef.getEvaluator() + "'"); } } + RangerPerfTracer.log(perf); } if(LOG.isDebugEnabled()) { @@ -90,6 +102,12 @@ public class RangerDefaultPolicyItemEvaluator extends RangerAbstractPolicyItemEv } boolean ret = false; + RangerPerfTracer perf = null; + + if(RangerPerfTracer.isPerfTraceEnabled(PERF_ITEM_LOG)) { + perf = RangerPerfTracer.getPerfTracer(PERF_ITEM_LOG, "RangerDefaultPolicyItemEvaluator.isMatch(policyId=" + policyId + ",policyItemIndex=" + getPolicyItemIndex() + ")"); + } + if(policyItem != null) { if(matchUserGroup(request.getUser(), request.getUserGroups())) { @@ -125,6 +143,8 @@ public class RangerDefaultPolicyItemEvaluator extends RangerAbstractPolicyItemEv } } + RangerPerfTracer.log(perf); + if(LOG.isDebugEnabled()) { LOG.debug("<== RangerDefaultPolicyItemEvaluator.isMatch(" + request + "): " + ret); } @@ -217,8 +237,22 @@ public class RangerDefaultPolicyItemEvaluator extends RangerAbstractPolicyItemEv if(LOG.isDebugEnabled()) { LOG.debug("evaluating condition: " + conditionEvaluator); } + RangerPerfTracer perf = null; + + if(RangerPerfTracer.isPerfTraceEnabled(PERF_CONDITION_LOG)) { + String conditionType = null; + if (conditionEvaluator instanceof RangerAbstractConditionEvaluator) { + conditionType = ((RangerAbstractConditionEvaluator)conditionEvaluator).getPolicyItemCondition().getType(); + } + + perf = RangerPerfTracer.getPerfTracer(PERF_CONDITION_LOG, "RangerDefaultPolicyItemEvaluator.matchCustomConditions(policyId=" + policyId + ",policyItemIndex=" + getPolicyItemIndex() + ",policyConditionType=" + conditionType + ")"); + } + + boolean conditionEvalResult = conditionEvaluator.isMatched(request); + + RangerPerfTracer.log(perf); - if(!conditionEvaluator.isMatched(request)) { + if (!conditionEvalResult) { if(LOG.isDebugEnabled()) { LOG.debug(conditionEvaluator + " returned false"); } http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/7a80c8e3/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerOptimizedPolicyEvaluator.java ---------------------------------------------------------------------- diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerOptimizedPolicyEvaluator.java b/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerOptimizedPolicyEvaluator.java index e81280f..8cd854f 100644 --- a/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerOptimizedPolicyEvaluator.java +++ b/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerOptimizedPolicyEvaluator.java @@ -29,12 +29,14 @@ import org.apache.ranger.plugin.policyengine.RangerAccessRequest; import org.apache.ranger.plugin.policyengine.RangerAccessResult; import org.apache.ranger.plugin.policyengine.RangerPolicyEngine; import org.apache.ranger.plugin.policyengine.RangerPolicyEngineOptions; +import org.apache.ranger.plugin.util.RangerPerfTracer; import java.util.*; import java.lang.Math; public class RangerOptimizedPolicyEvaluator extends RangerDefaultPolicyEvaluator { private static final Log LOG = LogFactory.getLog(RangerOptimizedPolicyEvaluator.class); + private static final Log PERF_LOG = RangerPerfTracer.getPerfLogger("policy"); private Set<String> groups = new HashSet<String>(); private Set<String> users = new HashSet<String>(); @@ -70,6 +72,12 @@ public class RangerOptimizedPolicyEvaluator extends RangerDefaultPolicyEvaluator LOG.debug("==> RangerOptimizedPolicyEvaluator.init()"); } + RangerPerfTracer perf = null; + + if(RangerPerfTracer.isPerfTraceEnabled(PERF_LOG)) { + perf = RangerPerfTracer.getPerfTracer(PERF_LOG, "RangerOptimizedPolicyEvaluator.init(policyId=" + policy.getId() + ",policyName=" + policy.getName() + ")"); + } + super.init(policy, serviceDef, options); preprocessPolicyItems(policy.getPolicyItems()); @@ -87,6 +95,8 @@ public class RangerOptimizedPolicyEvaluator extends RangerDefaultPolicyEvaluator setEvalOrder(computeEvalOrder()); + RangerPerfTracer.log(perf); + if(LOG.isDebugEnabled()) { LOG.debug("<== RangerOptimizedPolicyEvaluator.init()"); } @@ -222,7 +232,7 @@ public class RangerOptimizedPolicyEvaluator extends RangerDefaultPolicyEvaluator boolean ret = false; - if (hasPublicGroup || users.contains(user) || CollectionUtils.containsAny(groups, userGroups)) { + if (hasPublicGroup || users.contains(user) || CollectionUtils.containsAny(groups, userGroups)) { if (StringUtils.isEmpty(accessType)) { accessType = RangerPolicyEngine.ANY_ACCESS; } http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/7a80c8e3/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerPolicyItemEvaluator.java ---------------------------------------------------------------------- diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerPolicyItemEvaluator.java b/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerPolicyItemEvaluator.java index 95d2b4e..1dfc8cf 100644 --- a/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerPolicyItemEvaluator.java +++ b/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerPolicyItemEvaluator.java @@ -37,6 +37,8 @@ public interface RangerPolicyItemEvaluator extends Comparable<RangerPolicyItemEv int getPolicyItemType(); + int getPolicyItemIndex(); + String getComments(); List<RangerConditionEvaluator> getConditionEvaluators(); http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/7a80c8e3/agents-common/src/main/java/org/apache/ranger/plugin/resourcematcher/RangerAbstractResourceMatcher.java ---------------------------------------------------------------------- diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/resourcematcher/RangerAbstractResourceMatcher.java b/agents-common/src/main/java/org/apache/ranger/plugin/resourcematcher/RangerAbstractResourceMatcher.java index 56c4cfb..fd5133f 100644 --- a/agents-common/src/main/java/org/apache/ranger/plugin/resourcematcher/RangerAbstractResourceMatcher.java +++ b/agents-common/src/main/java/org/apache/ranger/plugin/resourcematcher/RangerAbstractResourceMatcher.java @@ -35,6 +35,7 @@ public abstract class RangerAbstractResourceMatcher implements RangerResourceMat private static final Log LOG = LogFactory.getLog(RangerAbstractResourceMatcher.class); public final static String WILDCARD_ASTERISK = "*"; + public final static String WILDCARDS = "*?"; public final static String OPTIONS_SEP = ";"; public final static String OPTION_NV_SEP = "="; @@ -74,6 +75,7 @@ public abstract class RangerAbstractResourceMatcher implements RangerResourceMat policyIsExcludes = policyResource == null ? false : policyResource.getIsExcludes(); if(policyResource != null && policyResource.getValues() != null) { + boolean isWildCardPresent = !optWildCard; for(String policyValue : policyResource.getValues()) { if(StringUtils.isEmpty(policyValue)) { continue; @@ -81,10 +83,12 @@ public abstract class RangerAbstractResourceMatcher implements RangerResourceMat if(StringUtils.containsOnly(policyValue, WILDCARD_ASTERISK)) { isMatchAny = true; + } else if (!isWildCardPresent && StringUtils.containsAny(policyValue, WILDCARDS)) { + isWildCardPresent = true; } - policyValues.add(policyValue); } + optWildCard = optWildCard && isWildCardPresent; } if(policyValues.isEmpty()) { http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/7a80c8e3/agents-common/src/main/java/org/apache/ranger/plugin/store/AbstractTagStore.java ---------------------------------------------------------------------- diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/store/AbstractTagStore.java b/agents-common/src/main/java/org/apache/ranger/plugin/store/AbstractTagStore.java index ed1b64d..f22a87a 100644 --- a/agents-common/src/main/java/org/apache/ranger/plugin/store/AbstractTagStore.java +++ b/agents-common/src/main/java/org/apache/ranger/plugin/store/AbstractTagStore.java @@ -22,6 +22,7 @@ package org.apache.ranger.plugin.store; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.ranger.plugin.model.*; +import org.apache.ranger.plugin.util.SearchFilter; import java.util.*; @@ -102,6 +103,50 @@ public abstract class AbstractTagStore implements TagStore { } return ret; } + + @Override + public void deleteAllTagObjectsForService(String serviceName, boolean isResourePrivateTag) throws Exception { + + if (LOG.isDebugEnabled()) { + LOG.debug("==> AbstractTagStore.deleteAllTagObjectsForService(serviceName=" + serviceName + ", isResourcePrivateTag=" + isResourePrivateTag + ")"); + } + + List<RangerServiceResource> serviceResources = getServiceResourcesByService(serviceName); + + Set<Long> tagsToDelete = new HashSet<Long>(); + + + for (RangerServiceResource serviceResource : serviceResources) { + Long resourceId = serviceResource.getId(); + + List<RangerTagResourceMap> tagResourceMapsForService = getTagResourceMapsForResourceId(resourceId); + + if (isResourePrivateTag) { + for (RangerTagResourceMap tagResourceMap : tagResourceMapsForService) { + Long tagId = tagResourceMap.getTagId(); + RangerTag tag = getTag(tagId); + tagsToDelete.add(tag.getId()); + } + } + for (RangerTagResourceMap tagResourceMap : tagResourceMapsForService) { + deleteTagResourceMap(tagResourceMap.getId()); + } + } + + for (RangerServiceResource serviceResource : serviceResources) { + deleteServiceResource(serviceResource.getId()); + } + + for (Long tagId : tagsToDelete) { + deleteTag(tagId); + } + + if (LOG.isDebugEnabled()) { + LOG.debug("<== AbstractTagStore.deleteAllTagObjectsForService(serviceName=" + serviceName + ", isResourcePrivateTag=" + isResourePrivateTag + ")"); + } + + } + } http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/7a80c8e3/agents-common/src/main/java/org/apache/ranger/plugin/store/TagStore.java ---------------------------------------------------------------------- diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/store/TagStore.java b/agents-common/src/main/java/org/apache/ranger/plugin/store/TagStore.java index ed20c51..104459d 100644 --- a/agents-common/src/main/java/org/apache/ranger/plugin/store/TagStore.java +++ b/agents-common/src/main/java/org/apache/ranger/plugin/store/TagStore.java @@ -124,4 +124,5 @@ public interface TagStore { ServiceTags getServiceTagsIfUpdated(String serviceName, Long lastKnownVersion) throws Exception; + void deleteAllTagObjectsForService(String serviceName, boolean isResourePrivateTag) throws Exception; } http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/7a80c8e3/agents-common/src/main/java/org/apache/ranger/plugin/util/PolicyRefresher.java ---------------------------------------------------------------------- diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/util/PolicyRefresher.java b/agents-common/src/main/java/org/apache/ranger/plugin/util/PolicyRefresher.java index 0729339..58d99bb 100644 --- a/agents-common/src/main/java/org/apache/ranger/plugin/util/PolicyRefresher.java +++ b/agents-common/src/main/java/org/apache/ranger/plugin/util/PolicyRefresher.java @@ -37,6 +37,7 @@ import com.google.gson.GsonBuilder; public class PolicyRefresher extends Thread { private static final Log LOG = LogFactory.getLog(PolicyRefresher.class); + private static final Log PERF_LOG = RangerPerfTracer.getPerfLogger("policy"); private final RangerBasePlugin plugIn; private final String serviceType; @@ -171,7 +172,13 @@ public class PolicyRefresher extends Thread { LOG.debug("==> PolicyRefresher(serviceName=" + serviceName + ").loadPolicy()"); } - //load policy from PolicyAmdin + RangerPerfTracer perf = null; + + if(RangerPerfTracer.isPerfTraceEnabled(PERF_LOG)) { + perf = RangerPerfTracer.getPerfTracer(PERF_LOG, "PolicyRefresher.loadPolicy(serviceName=" + serviceName + ")"); + } + + //load policy from PolicyAdmin ServicePolicies svcPolicies = loadPolicyfromPolicyAdmin(); if ( svcPolicies == null) { @@ -183,6 +190,8 @@ public class PolicyRefresher extends Thread { saveToCache(svcPolicies); } + RangerPerfTracer.log(perf); + if (svcPolicies != null) { plugIn.setPolicies(svcPolicies); policiesSetInPlugin = true; http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/7a80c8e3/agents-common/src/test/java/org/apache/ranger/plugin/policyengine/TestPolicyEngine.java ---------------------------------------------------------------------- diff --git a/agents-common/src/test/java/org/apache/ranger/plugin/policyengine/TestPolicyEngine.java b/agents-common/src/test/java/org/apache/ranger/plugin/policyengine/TestPolicyEngine.java index b59ae1f..f199c44 100644 --- a/agents-common/src/test/java/org/apache/ranger/plugin/policyengine/TestPolicyEngine.java +++ b/agents-common/src/test/java/org/apache/ranger/plugin/policyengine/TestPolicyEngine.java @@ -219,7 +219,7 @@ public class TestPolicyEngine { policyEngineOptions.disableTagPolicyEvaluation = false; - policyEngine = new RangerPolicyEngineImpl("test-policyengine", servicePolicies, policyEngineOptions); + policyEngine = new RangerPolicyEngineImpl(testName, servicePolicies, policyEngineOptions); RangerAccessRequest request = null; http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/7a80c8e3/agents-common/src/test/resources/log4j.properties ---------------------------------------------------------------------- diff --git a/agents-common/src/test/resources/log4j.properties b/agents-common/src/test/resources/log4j.properties deleted file mode 100644 index cb409e8..0000000 --- a/agents-common/src/test/resources/log4j.properties +++ /dev/null @@ -1,35 +0,0 @@ -# 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. - -##-- To prevent junits from cluttering the build run by default all test runs send output to null appender -log4j.appender.devnull=org.apache.log4j.varia.NullAppender -ranger.root.logger=FATAL,devnull - -##-- uncomment the following line during during development/debugging so see debug messages during test run to be emitted to console -# ranger.root.logger=DEBUG,console - -log4j.rootLogger=${ranger.root.logger} - -# Logging Threshold -log4j.threshold=ALL - -# -# console -# Add "console" to rootlogger above if you want to use this -# -log4j.appender.console=org.apache.log4j.ConsoleAppender -log4j.appender.console.target=System.err -log4j.appender.console.layout=org.apache.log4j.PatternLayout -log4j.appender.console.layout.ConversionPattern=%d{ISO8601} %-5p [%t] %c{2}: %m%n http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/7a80c8e3/agents-common/src/test/resources/log4j.xml ---------------------------------------------------------------------- diff --git a/agents-common/src/test/resources/log4j.xml b/agents-common/src/test/resources/log4j.xml new file mode 100644 index 0000000..48ed214 --- /dev/null +++ b/agents-common/src/test/resources/log4j.xml @@ -0,0 +1,53 @@ +<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> + +<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false"> + + <appender name="console" class="org.apache.log4j.ConsoleAppender"> + <param name="target" value="System.err" /> + <layout class="org.apache.log4j.PatternLayout"> + <param name="ConversionPattern" value="%d{ISO8601} %-5p [%t] %c{2}: %m%n" /> + </layout> + </appender> + + <!-- + <appender name="perf_appender" class="org.apache.log4j.DailyRollingFileAppender"> + <param name="file" value="./ranger_admin_perf_test.log" /> + <param name="datePattern" value="'.'yyyy-MM-dd" /> + <param name="append" value="true" /> + <layout class="org.apache.log4j.PatternLayout"> + <param name="ConversionPattern" value="%d [%t] %m%n" /> + </layout> + </appender> + + <category name="ranger.perf" additivity="false"> + <priority value="info" /> + <appender-ref ref="perf_appender" /> + </category> + + <category name="ranger.perf.policy" additivity="false"> + <priority value="warn" /> + <appender-ref ref="perf_appender" /> + </category> + + <category name="ranger.perf.item" additivity="false"> + <priority value="warn" /> + <appender-ref ref="perf_appender" /> + </category> + + <category name="ranger.perf.condition" additivity="false"> + <priority value="warn" /> + <appender-ref ref="perf_appender" /> + </category> + + <category name="ranger.perf.enricher" additivity="false"> + <priority value="warn" /> + <appender-ref ref="perf_appender" /> + </category> + --> + + <root> + <priority value="warn" /> + <appender-ref ref="console" /> + </root> + +</log4j:configuration> http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/7a80c8e3/security-admin/.gitignore ---------------------------------------------------------------------- diff --git a/security-admin/.gitignore b/security-admin/.gitignore index bf7dc37..5a3a673 100644 --- a/security-admin/.gitignore +++ b/security-admin/.gitignore @@ -1,8 +1,6 @@ /target/ /bin/ -/bin/ /target .settings/ .pydevproject -log4j.xml *.log http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/7a80c8e3/security-admin/src/main/java/org/apache/ranger/biz/RangerPolicyRetriever.java ---------------------------------------------------------------------- diff --git a/security-admin/src/main/java/org/apache/ranger/biz/RangerPolicyRetriever.java b/security-admin/src/main/java/org/apache/ranger/biz/RangerPolicyRetriever.java index e3adc1d..6e164f3 100644 --- a/security-admin/src/main/java/org/apache/ranger/biz/RangerPolicyRetriever.java +++ b/security-admin/src/main/java/org/apache/ranger/biz/RangerPolicyRetriever.java @@ -114,7 +114,7 @@ public class RangerPolicyRetriever { RangerPerfTracer perf = null; if(RangerPerfTracer.isPerfTraceEnabled(PERF_LOG)) { - perf = RangerPerfTracer.getPerfTracer(PERF_LOG, "RangerPolicyRetriever.getServicePolicies(serviceName=" + serviceName + ", serviceId=" + serviceId + ")"); + perf = RangerPerfTracer.getPerfTracer(PERF_LOG, "RangerPolicyRetriever.getServicePolicies(serviceName=" + serviceName + ",serviceId=" + serviceId + ")"); } if(xService != null) { http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/7a80c8e3/security-admin/src/main/java/org/apache/ranger/biz/RangerTagDBRetriever.java ---------------------------------------------------------------------- diff --git a/security-admin/src/main/java/org/apache/ranger/biz/RangerTagDBRetriever.java b/security-admin/src/main/java/org/apache/ranger/biz/RangerTagDBRetriever.java new file mode 100644 index 0000000..6cc4e5e --- /dev/null +++ b/security-admin/src/main/java/org/apache/ranger/biz/RangerTagDBRetriever.java @@ -0,0 +1,597 @@ +/* + * 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.ListIterator; +import java.util.Map; + +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.ranger.authorization.utils.StringUtil; +import org.apache.ranger.db.RangerDaoManager; +import org.apache.ranger.entity.*; +import org.apache.ranger.plugin.model.*; +import org.apache.ranger.plugin.model.RangerPolicy.RangerPolicyResource; +import org.apache.ranger.plugin.util.RangerPerfTracer; + + +public class RangerTagDBRetriever { + static final Log LOG = LogFactory.getLog(RangerTagDBRetriever.class); + static final Log PERF_LOG = RangerPerfTracer.getPerfLogger("db.RangerTagDBRetriever"); + + private final RangerDaoManager daoMgr; + private final XXService xService; + private final LookupCache lookupCache; + + private List<RangerServiceResource> serviceResources; + private Map<Long, RangerTagDef> tagDefs; + private Map<Long, RangerTag> tags; + private List<RangerTagResourceMap> tagResourceMaps; + + + public RangerTagDBRetriever(final RangerDaoManager daoMgr, final XXService xService) { + this.daoMgr = daoMgr; + this.xService = xService; + this.lookupCache = new LookupCache(); + + + if (this.daoMgr != null && this.xService != null) { + + RangerPerfTracer perf = null; + + if (RangerPerfTracer.isPerfTraceEnabled(PERF_LOG)) { + perf = RangerPerfTracer.getPerfTracer(PERF_LOG, "RangerTagDBReceiver-Optimized(serviceName=" + xService.getName()); + } + + TagRetrieverServiceResourceContext serviceResourceContext = new TagRetrieverServiceResourceContext(xService); + TagRetrieverTagDefContext tagDefContext = new TagRetrieverTagDefContext(xService); + TagRetrieverTagContext tagContext = new TagRetrieverTagContext(xService); + + serviceResources = serviceResourceContext.getAllServiceResources(); + tagDefs = tagDefContext.getAllTagDefs(); + tags = tagContext.getAllTags(); + tagResourceMaps = getAllTagResourceMaps(); + + RangerPerfTracer.log(perf); + + } + } + + public List<RangerTagResourceMap> getTagResourceMaps() { + return tagResourceMaps; + } + + public List<RangerServiceResource> getServiceResources() { + return serviceResources; + } + + public Map<Long, RangerTagDef> getTagDefs() { + return tagDefs; + } + + public Map<Long, RangerTag> getTags() { + return tags; + } + + private List<RangerTagResourceMap> getAllTagResourceMaps() { + + List<XXTagResourceMap> xTagResourceMaps = daoMgr.getXXTagResourceMap().findByServiceId(xService.getId()); + ListIterator<XXTagResourceMap> iterTagResourceMap = xTagResourceMaps.listIterator(); + + List<RangerTagResourceMap> ret = new ArrayList<RangerTagResourceMap>(); + + while (iterTagResourceMap.hasNext()) { + + XXTagResourceMap xTagResourceMap = iterTagResourceMap.next(); + + if (xTagResourceMap != null) { + + RangerTagResourceMap tagResourceMap = new RangerTagResourceMap(); + + tagResourceMap.setId(xTagResourceMap.getId()); + tagResourceMap.setGuid(xTagResourceMap.getGuid()); + tagResourceMap.setCreatedBy(lookupCache.getUserScreenName(xTagResourceMap.getAddedByUserId())); + tagResourceMap.setUpdatedBy(lookupCache.getUserScreenName(xTagResourceMap.getUpdatedByUserId())); + tagResourceMap.setCreateTime(xTagResourceMap.getCreateTime()); + tagResourceMap.setUpdateTime(xTagResourceMap.getUpdateTime()); + tagResourceMap.setResourceId(xTagResourceMap.getResourceId()); + tagResourceMap.setTagId(xTagResourceMap.getTagId()); + + ret.add(tagResourceMap); + } + } + return ret; + } + + static <T> List<T> asList(T obj) { + List<T> ret = new ArrayList<T>(); + + if (obj != null) { + ret.add(obj); + } + + return ret; + } + + private class LookupCache { + final Map<Long, String> userScreenNames = new HashMap<Long, String>(); + final Map<Long, String> resourceDefs = new HashMap<Long, String>(); + + String getUserScreenName(Long userId) { + String ret = null; + + if (userId != null) { + ret = userScreenNames.get(userId); + + if (ret == null) { + XXPortalUser user = daoMgr.getXXPortalUser().getById(userId); + + if (user != null) { + ret = user.getPublicScreenName(); + + if (StringUtil.isEmpty(ret)) { + ret = user.getFirstName(); + + if (StringUtil.isEmpty(ret)) { + ret = user.getLoginId(); + } else { + if (!StringUtil.isEmpty(user.getLastName())) { + ret += (" " + user.getLastName()); + } + } + } + + if (ret != null) { + userScreenNames.put(userId, ret); + } + } + } + } + + return ret; + } + + String getResourceName(Long resourceDefId) { + String ret = null; + + if (resourceDefId != null) { + ret = resourceDefs.get(resourceDefId); + + if (ret == null) { + XXResourceDef xResourceDef = daoMgr.getXXResourceDef().getById(resourceDefId); + + if (xResourceDef != null) { + ret = xResourceDef.getName(); + + resourceDefs.put(resourceDefId, ret); + } + } + } + + return ret; + } + } + + private class TagRetrieverServiceResourceContext { + + final XXService service; + final ListIterator<XXServiceResource> iterServiceResource; + final ListIterator<XXServiceResourceElement> iterServiceResourceElement; + final ListIterator<XXServiceResourceElementValue> iterServiceResourceElementValue; + + TagRetrieverServiceResourceContext(XXService xService) { + Long serviceId = xService == null ? null : xService.getId(); + + List<XXServiceResource> xServiceResources = daoMgr.getXXServiceResource().findTaggedResourcesInServiceId(serviceId); + List<XXServiceResourceElement> xServiceResourceElements = daoMgr.getXXServiceResourceElement().findByServiceId(serviceId); + List<XXServiceResourceElementValue> xServiceResourceElementValues = daoMgr.getXXServiceResourceElementValue().findByServiceId(serviceId); + + this.service = xService; + this.iterServiceResource = xServiceResources.listIterator(); + this.iterServiceResourceElement = xServiceResourceElements.listIterator(); + this.iterServiceResourceElementValue = xServiceResourceElementValues.listIterator(); + + } + + TagRetrieverServiceResourceContext(XXServiceResource xServiceResource, XXService xService) { + Long resourceId = xServiceResource == null ? null : xServiceResource.getId(); + + List<XXServiceResource> xServiceResources = asList(xServiceResource); + List<XXServiceResourceElement> xServiceResourceElements = daoMgr.getXXServiceResourceElement().findByResourceId(resourceId); + List<XXServiceResourceElementValue> xServiceResourceElementValues = daoMgr.getXXServiceResourceElementValue().findByResourceId(resourceId); + + this.service = xService; + this.iterServiceResource = xServiceResources.listIterator(); + this.iterServiceResourceElement = xServiceResourceElements.listIterator(); + this.iterServiceResourceElementValue = xServiceResourceElementValues.listIterator(); + + } + + List<RangerServiceResource> getAllServiceResources() { + List<RangerServiceResource> ret = new ArrayList<RangerServiceResource>(); + + while (iterServiceResource.hasNext()) { + RangerServiceResource serviceResource = getNextServiceResource(); + + if (serviceResource != null) { + ret.add(serviceResource); + } + } + + if (!hasProcessedAll()) { + LOG.warn("getAllServiceResources(): perhaps one or more serviceResources got updated during retrieval. Using fallback ... "); + + ret = getServiceResourcesBySecondary(); + } + + return ret; + } + + RangerServiceResource getNextServiceResource() { + RangerServiceResource ret = null; + + if (iterServiceResource.hasNext()) { + XXServiceResource xServiceResource = iterServiceResource.next(); + + if (xServiceResource != null) { + ret = new RangerServiceResource(); + + ret.setId(xServiceResource.getId()); + ret.setGuid(xServiceResource.getGuid()); + ret.setIsEnabled(xServiceResource.getIsEnabled()); + ret.setCreatedBy(lookupCache.getUserScreenName(xServiceResource.getAddedByUserId())); + ret.setUpdatedBy(lookupCache.getUserScreenName(xServiceResource.getUpdatedByUserId())); + ret.setCreateTime(xServiceResource.getCreateTime()); + ret.setUpdateTime(xServiceResource.getUpdateTime()); + ret.setVersion(xServiceResource.getVersion()); + ret.setResourceSignature(xServiceResource.getResourceSignature()); + + getServiceResourceElements(ret); + } + } + + return ret; + } + + void getServiceResourceElements(RangerServiceResource serviceResource) { + while (iterServiceResourceElement.hasNext()) { + XXServiceResourceElement xServiceResourceElement = iterServiceResourceElement.next(); + + if (xServiceResourceElement.getResourceId().equals(serviceResource.getId())) { + RangerPolicyResource resource = new RangerPolicyResource(); + + resource.setIsExcludes(xServiceResourceElement.getIsExcludes()); + resource.setIsRecursive(xServiceResourceElement.getIsRecursive()); + + while (iterServiceResourceElementValue.hasNext()) { + XXServiceResourceElementValue xServiceResourceElementValue = iterServiceResourceElementValue.next(); + + if (xServiceResourceElementValue.getResElementId().equals(xServiceResourceElement.getId())) { + resource.getValues().add(xServiceResourceElementValue.getValue()); + } else { + if (iterServiceResourceElementValue.hasPrevious()) { + iterServiceResourceElementValue.previous(); + } + break; + } + } + + serviceResource.getResourceElements().put(lookupCache.getResourceName(xServiceResourceElement.getResDefId()), resource); + } else if (xServiceResourceElement.getResourceId().compareTo(serviceResource.getId()) > 0) { + if (iterServiceResourceElement.hasPrevious()) { + iterServiceResourceElement.previous(); + } + break; + } + } + } + + boolean hasProcessedAll() { + boolean moreToProcess = iterServiceResource.hasNext() + || iterServiceResourceElement.hasNext() + || iterServiceResourceElementValue.hasNext(); + return !moreToProcess; + } + + List<RangerServiceResource> getServiceResourcesBySecondary() { + List<RangerServiceResource> ret = null; + + if (service != null) { + List<XXServiceResource> xServiceResources = daoMgr.getXXServiceResource().findByServiceId(service.getId()); + + if (CollectionUtils.isNotEmpty(xServiceResources)) { + ret = new ArrayList<RangerServiceResource>(xServiceResources.size()); + + for (XXServiceResource xServiceResource : xServiceResources) { + TagRetrieverServiceResourceContext ctx = new TagRetrieverServiceResourceContext(xServiceResource, service); + + RangerServiceResource serviceResource = ctx.getNextServiceResource(); + + if (serviceResource != null) { + ret.add(serviceResource); + } + } + } + } + return ret; + } + } + + private class TagRetrieverTagDefContext { + + final XXService service; + final ListIterator<XXTagDef> iterTagDef; + final ListIterator<XXTagAttributeDef> iterTagAttributeDef; + + + TagRetrieverTagDefContext(XXService xService) { + Long serviceId = xService == null ? null : xService.getId(); + + List<XXTagDef> xTagDefs = daoMgr.getXXTagDef().findByServiceId(serviceId); + List<XXTagAttributeDef> xTagAttributeDefs = daoMgr.getXXTagAttributeDef().findByServiceId(serviceId); + + this.service = xService; + this.iterTagDef = xTagDefs.listIterator(); + this.iterTagAttributeDef = xTagAttributeDefs.listIterator(); + } + + TagRetrieverTagDefContext(XXTagDef xTagDef, XXService xService) { + Long tagDefId = xTagDef == null ? null : xTagDef.getId(); + + List<XXTagDef> xTagDefs = asList(xTagDef); + List<XXTagAttributeDef> xTagAttributeDefs = daoMgr.getXXTagAttributeDef().findByTagDefId(tagDefId); + + this.service = xService; + this.iterTagDef = xTagDefs.listIterator(); + this.iterTagAttributeDef = xTagAttributeDefs.listIterator(); + } + + Map<Long, RangerTagDef> getAllTagDefs() { + Map<Long, RangerTagDef> ret = new HashMap<Long, RangerTagDef>(); + + while (iterTagDef.hasNext()) { + RangerTagDef tagDef = getNextTagDef(); + + if (tagDef != null) { + ret.put(tagDef.getId(), tagDef); + } + } + + if (!hasProcessedAllTagDefs()) { + LOG.warn("getAllTagDefs(): perhaps one or more tag-definitions got updated during retrieval. Using fallback ... "); + + ret = getTagDefsBySecondary(); + + } + + return ret; + } + + RangerTagDef getNextTagDef() { + RangerTagDef ret = null; + + if (iterTagDef.hasNext()) { + XXTagDef xTagDef = iterTagDef.next(); + + if (xTagDef != null) { + ret = new RangerTagDef(); + + ret.setId(xTagDef.getId()); + ret.setGuid(xTagDef.getGuid()); + ret.setIsEnabled(xTagDef.getIsEnabled()); + ret.setCreatedBy(lookupCache.getUserScreenName(xTagDef.getAddedByUserId())); + ret.setUpdatedBy(lookupCache.getUserScreenName(xTagDef.getUpdatedByUserId())); + ret.setCreateTime(xTagDef.getCreateTime()); + ret.setUpdateTime(xTagDef.getUpdateTime()); + ret.setVersion(xTagDef.getVersion()); + ret.setName(xTagDef.getName()); + ret.setSource(xTagDef.getSource()); + + getTagAttributeDefs(ret); + } + } + + return ret; + } + + void getTagAttributeDefs(RangerTagDef tagDef) { + while (iterTagAttributeDef.hasNext()) { + XXTagAttributeDef xTagAttributeDef = iterTagAttributeDef.next(); + + if (xTagAttributeDef.getTagDefId().equals(tagDef.getId())) { + RangerTagDef.RangerTagAttributeDef tagAttributeDef = new RangerTagDef.RangerTagAttributeDef(); + + tagAttributeDef.setName(xTagAttributeDef.getName()); + tagAttributeDef.setType(xTagAttributeDef.getType()); + + tagDef.getAttributeDefs().add(tagAttributeDef); + } else if (xTagAttributeDef.getTagDefId().compareTo(tagDef.getId()) > 0) { + if (iterTagAttributeDef.hasPrevious()) { + iterTagAttributeDef.previous(); + } + break; + } + } + } + + boolean hasProcessedAllTagDefs() { + boolean moreToProcess = iterTagAttributeDef.hasNext(); + return !moreToProcess; + } + + Map<Long, RangerTagDef> getTagDefsBySecondary() { + Map<Long, RangerTagDef> ret = null; + + if (service != null) { + List<XXTagDef> xTagDefs = daoMgr.getXXTagDef().findByServiceId(service.getId()); + + if (CollectionUtils.isNotEmpty(xTagDefs)) { + ret = new HashMap<Long, RangerTagDef>(xTagDefs.size()); + + for (XXTagDef xTagDef : xTagDefs) { + TagRetrieverTagDefContext ctx = new TagRetrieverTagDefContext(xTagDef, service); + + RangerTagDef tagDef = ctx.getNextTagDef(); + + if (tagDef != null) { + ret.put(tagDef.getId(), tagDef); + } + } + } + } + return ret; + } + } + + private class TagRetrieverTagContext { + + final XXService service; + final ListIterator<XXTag> iterTag; + final ListIterator<XXTagAttribute> iterTagAttribute; + + TagRetrieverTagContext(XXService xService) { + Long serviceId = xService == null ? null : xService.getId(); + + List<XXTag> xTags = daoMgr.getXXTag().findByServiceId(serviceId); + List<XXTagAttribute> xTagAttributes = daoMgr.getXXTagAttribute().findByServiceId(serviceId); + + this.service = xService; + this.iterTag = xTags.listIterator(); + this.iterTagAttribute = xTagAttributes.listIterator(); + + } + + TagRetrieverTagContext(XXTag xTag, XXService xService) { + Long tagId = xTag == null ? null : xTag.getId(); + + List<XXTag> xTags = asList(xTag); + List<XXTagAttribute> xTagAttributes = daoMgr.getXXTagAttribute().findByTagId(tagId); + + this.service = xService; + this.iterTag = xTags.listIterator(); + this.iterTagAttribute = xTagAttributes.listIterator(); + } + + + Map<Long, RangerTag> getAllTags() { + Map<Long, RangerTag> ret = new HashMap<Long, RangerTag>(); + + while (iterTag.hasNext()) { + RangerTag tag = getNextTag(); + + if (tag != null) { + ret.put(tag.getId(), tag); + } + } + + if (!hasProcessedAllTags()) { + LOG.warn("getAllTags(): perhaps one or more tags got updated during retrieval. Using fallback ... "); + + ret = getTagsBySecondary(); + } + + return ret; + } + + RangerTag getNextTag() { + RangerTag ret = null; + + if (iterTag.hasNext()) { + XXTag xTag = iterTag.next(); + + if (xTag != null) { + ret = new RangerTag(); + + ret.setId(xTag.getId()); + ret.setGuid(xTag.getGuid()); + ret.setCreatedBy(lookupCache.getUserScreenName(xTag.getAddedByUserId())); + ret.setUpdatedBy(lookupCache.getUserScreenName(xTag.getUpdatedByUserId())); + ret.setCreateTime(xTag.getCreateTime()); + ret.setUpdateTime(xTag.getUpdateTime()); + ret.setVersion(xTag.getVersion()); + + Map<Long, RangerTagDef> tagDefs = getTagDefs(); + if (tagDefs != null) { + RangerTagDef tagDef = tagDefs.get(xTag.getType()); + if (tagDef != null) { + ret.setType(tagDef.getName()); + } + } + + getTagAttributes(ret); + } + } + + return ret; + } + + void getTagAttributes(RangerTag tag) { + while (iterTagAttribute.hasNext()) { + XXTagAttribute xTagAttribute = iterTagAttribute.next(); + + if (xTagAttribute.getTagId().equals(tag.getId())) { + String attributeName = xTagAttribute.getName(); + String attributeValue = xTagAttribute.getValue(); + + + tag.getAttributes().put(attributeName, attributeValue); + } else if (xTagAttribute.getTagId().compareTo(tag.getId()) > 0) { + if (iterTagAttribute.hasPrevious()) { + iterTagAttribute.previous(); + } + break; + } + } + } + + boolean hasProcessedAllTags() { + boolean moreToProcess = iterTagAttribute.hasNext(); + return !moreToProcess; + } + + Map<Long, RangerTag> getTagsBySecondary() { + Map<Long, RangerTag> ret = null; + + if (service != null) { + List<XXTag> xTags = daoMgr.getXXTag().findByServiceId(service.getId()); + + if (CollectionUtils.isNotEmpty(xTags)) { + ret = new HashMap<Long, RangerTag>(xTags.size()); + + for (XXTag xTag : xTags) { + TagRetrieverTagContext ctx = new TagRetrieverTagContext(xTag, service); + + RangerTag tag = ctx.getNextTag(); + + if (tag != null) { + ret.put(tag.getId(), tag); + } + } + } + } + return ret; + } + } +} + http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/7a80c8e3/security-admin/src/main/java/org/apache/ranger/biz/TagDBStore.java ---------------------------------------------------------------------- diff --git a/security-admin/src/main/java/org/apache/ranger/biz/TagDBStore.java b/security-admin/src/main/java/org/apache/ranger/biz/TagDBStore.java index 300ba8d..f89a434 100644 --- a/security-admin/src/main/java/org/apache/ranger/biz/TagDBStore.java +++ b/security-admin/src/main/java/org/apache/ranger/biz/TagDBStore.java @@ -846,26 +846,14 @@ public class TagDBStore extends AbstractTagStore { throw new Exception("service-def does not exist. id=" + xxService.getType()); } - List<RangerTagDef> tagDefs = rangerTagDefService.getTagDefsByServiceId(xxService.getId()); - List<RangerTag> tags = rangerTagService.getTagsByServiceId(xxService.getId()); - List<RangerServiceResource> resources = rangerServiceResourceService.getTaggedResourcesInServiceId(xxService.getId()); - List<RangerTagResourceMap> tagResourceMaps = rangerTagResourceMapService.getTagResourceMapsByServiceId(xxService.getId()); + RangerTagDBRetriever tagDBRetriever = new RangerTagDBRetriever(daoManager, xxService); - Map<Long, RangerTagDef> tagDefMap = new HashMap<Long, RangerTagDef>(); - Map<Long, RangerTag> tagMap = new HashMap<Long, RangerTag>(); - Map<Long, List<Long>> resourceToTagIds = new HashMap<Long, List<Long>>(); - - if(CollectionUtils.isNotEmpty(tagDefs)) { - for(RangerTagDef tagDef : tagDefs) { - tagDefMap.put(tagDef.getId(), tagDef); - } - } + Map<Long, RangerTagDef> tagDefMap = tagDBRetriever.getTagDefs(); + Map<Long, RangerTag> tagMap = tagDBRetriever.getTags(); + List<RangerServiceResource> resources = tagDBRetriever.getServiceResources(); + List<RangerTagResourceMap> tagResourceMaps = tagDBRetriever.getTagResourceMaps(); - if(CollectionUtils.isNotEmpty(tags)) { - for(RangerTag tag : tags) { - tagMap.put(tag.getId(), tag); - } - } + Map<Long, List<Long>> resourceToTagIds = new HashMap<Long, List<Long>>(); if(CollectionUtils.isNotEmpty(tagResourceMaps)) { Long resourceId = null; http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/7a80c8e3/security-admin/src/main/java/org/apache/ranger/db/XXServiceResourceElementDao.java ---------------------------------------------------------------------- diff --git a/security-admin/src/main/java/org/apache/ranger/db/XXServiceResourceElementDao.java b/security-admin/src/main/java/org/apache/ranger/db/XXServiceResourceElementDao.java index 8e2baab..56abeaf 100644 --- a/security-admin/src/main/java/org/apache/ranger/db/XXServiceResourceElementDao.java +++ b/security-admin/src/main/java/org/apache/ranger/db/XXServiceResourceElementDao.java @@ -46,4 +46,16 @@ public class XXServiceResourceElementDao extends BaseDao<XXServiceResourceElemen } } + public List<XXServiceResourceElement> findByServiceId(Long serviceId) { + if (serviceId == null) { + return new ArrayList<XXServiceResourceElement>(); + } + try { + return getEntityManager().createNamedQuery("XXServiceResourceElement.findByServiceId", tClass) + .setParameter("serviceId", serviceId) + .getResultList(); + } catch (NoResultException e) { + return new ArrayList<XXServiceResourceElement>(); + } + } } http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/7a80c8e3/security-admin/src/main/java/org/apache/ranger/db/XXServiceResourceElementValueDao.java ---------------------------------------------------------------------- diff --git a/security-admin/src/main/java/org/apache/ranger/db/XXServiceResourceElementValueDao.java b/security-admin/src/main/java/org/apache/ranger/db/XXServiceResourceElementValueDao.java index 04942a7..48cdbbb 100644 --- a/security-admin/src/main/java/org/apache/ranger/db/XXServiceResourceElementValueDao.java +++ b/security-admin/src/main/java/org/apache/ranger/db/XXServiceResourceElementValueDao.java @@ -58,4 +58,29 @@ public class XXServiceResourceElementValueDao extends BaseDao<XXServiceResourceE } } + @SuppressWarnings("unchecked") + public List<XXServiceResourceElementValue> findByServiceId(Long serviceId) { + if (serviceId == null) { + return new ArrayList<XXServiceResourceElementValue>(); + } + try { + return getEntityManager().createNamedQuery("XXServiceResourceElementValue.findByServiceId") + .setParameter("serviceId", serviceId).getResultList(); + } catch (NoResultException e) { + return new ArrayList<XXServiceResourceElementValue>(); + } + } + + @SuppressWarnings("unchecked") + public List<XXServiceResourceElementValue> findByResourceId(Long resourceId) { + if (resourceId == null) { + return new ArrayList<XXServiceResourceElementValue>(); + } + try { + return getEntityManager().createNamedQuery("XXServiceResourceElementValue.findByResourceId") + .setParameter("resourceId", resourceId).getResultList(); + } catch (NoResultException e) { + return new ArrayList<XXServiceResourceElementValue>(); + } + } } http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/7a80c8e3/security-admin/src/main/java/org/apache/ranger/db/XXTagAttributeDao.java ---------------------------------------------------------------------- diff --git a/security-admin/src/main/java/org/apache/ranger/db/XXTagAttributeDao.java b/security-admin/src/main/java/org/apache/ranger/db/XXTagAttributeDao.java index 5ba3b74..c993477 100644 --- a/security-admin/src/main/java/org/apache/ranger/db/XXTagAttributeDao.java +++ b/security-admin/src/main/java/org/apache/ranger/db/XXTagAttributeDao.java @@ -45,4 +45,27 @@ public class XXTagAttributeDao extends BaseDao<XXTagAttribute> { } } + public List<XXTagAttribute> findByServiceId(Long serviceId) { + if (serviceId == null) { + return new ArrayList<XXTagAttribute>(); + } + try { + return getEntityManager().createNamedQuery("XXTagAttribute.findByServiceId", tClass) + .setParameter("serviceId", serviceId).getResultList(); + } catch (NoResultException e) { + return new ArrayList<XXTagAttribute>(); + } + } + + public List<XXTagAttribute> findByResourceId(Long resourceId) { + if (resourceId == null) { + return new ArrayList<XXTagAttribute>(); + } + try { + return getEntityManager().createNamedQuery("XXTagAttribute.findByResourceId", tClass) + .setParameter("resourceId", resourceId).getResultList(); + } catch (NoResultException e) { + return new ArrayList<XXTagAttribute>(); + } + } } http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/7a80c8e3/security-admin/src/main/java/org/apache/ranger/db/XXTagAttributeDefDao.java ---------------------------------------------------------------------- diff --git a/security-admin/src/main/java/org/apache/ranger/db/XXTagAttributeDefDao.java b/security-admin/src/main/java/org/apache/ranger/db/XXTagAttributeDefDao.java index c8cb91d..56b5d1a 100644 --- a/security-admin/src/main/java/org/apache/ranger/db/XXTagAttributeDefDao.java +++ b/security-admin/src/main/java/org/apache/ranger/db/XXTagAttributeDefDao.java @@ -45,4 +45,27 @@ public class XXTagAttributeDefDao extends BaseDao<XXTagAttributeDef> { } } + public List<XXTagAttributeDef> findByServiceId(Long serviceId) { + if (serviceId == null) { + return new ArrayList<XXTagAttributeDef>(); + } + try { + return getEntityManager().createNamedQuery("XXTagAttributeDef.findByServiceId", tClass) + .setParameter("serviceId", serviceId).getResultList(); + } catch (NoResultException e) { + return new ArrayList<XXTagAttributeDef>(); + } + } + + public List<XXTagAttributeDef> findByResourceId(Long resourceId) { + if (resourceId == null) { + return new ArrayList<XXTagAttributeDef>(); + } + try { + return getEntityManager().createNamedQuery("XXTagAttributeDef.findByResourceId", tClass) + .setParameter("resourceId", resourceId).getResultList(); + } catch (NoResultException e) { + return new ArrayList<XXTagAttributeDef>(); + } + } } http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/7a80c8e3/security-admin/src/main/java/org/apache/ranger/db/XXTagDefDao.java ---------------------------------------------------------------------- diff --git a/security-admin/src/main/java/org/apache/ranger/db/XXTagDefDao.java b/security-admin/src/main/java/org/apache/ranger/db/XXTagDefDao.java index 28ddfde..9a3ed59 100644 --- a/security-admin/src/main/java/org/apache/ranger/db/XXTagDefDao.java +++ b/security-admin/src/main/java/org/apache/ranger/db/XXTagDefDao.java @@ -100,4 +100,17 @@ public class XXTagDefDao extends BaseDao<XXTagDef> { return; } } + + public List<XXTagDef> findByResourceId(Long resourceId) { + if (resourceId == null) { + return new ArrayList<XXTagDef>(); + } + + try { + return getEntityManager().createNamedQuery("XXTagDef.findByResourceId", tClass) + .setParameter("resourceId", resourceId).getResultList(); + } catch (NoResultException e) { + return new ArrayList<XXTagDef>(); + } + } }
