Repository: incubator-ranger Updated Branches: refs/heads/stack 1201f2e3f -> ff4a817e5
RANGER-203: updated ServiceStore with SearchFilter; updated plugins to use download policies from REST interface (instead of file store) by default; Project: http://git-wip-us.apache.org/repos/asf/incubator-ranger/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ranger/commit/ff4a817e Tree: http://git-wip-us.apache.org/repos/asf/incubator-ranger/tree/ff4a817e Diff: http://git-wip-us.apache.org/repos/asf/incubator-ranger/diff/ff4a817e Branch: refs/heads/stack Commit: ff4a817e592f423d0b248bacf4823eafdddff766 Parents: 1201f2e Author: Madhan Neethiraj <[email protected]> Authored: Thu Jan 29 18:25:26 2015 -0800 Committer: Madhan Neethiraj <[email protected]> Committed: Thu Jan 29 18:25:26 2015 -0800 ---------------------------------------------------------------------- .../policyengine/RangerPolicyEngineImpl.java | 2 - .../ranger/plugin/service/RangerBasePlugin.java | 28 +- .../ranger/plugin/store/ServiceStore.java | 13 +- .../plugin/store/ServiceStoreFactory.java | 64 +- .../ranger/plugin/store/file/BaseFileStore.java | 4 +- .../plugin/store/file/ServiceFileStore.java | 671 ++++++++++++++----- .../plugin/store/rest/ServiceRESTStore.java | 120 ++-- .../ranger/plugin/util/PolicyRefresher.java | 42 +- .../ranger/plugin/store/TestServiceStore.java | 50 +- .../ranger/plugin/util/TestPolicyRefresher.java | 3 +- .../org/apache/ranger/rest/ServiceREST.java | 32 +- 11 files changed, 756 insertions(+), 273 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/ff4a817e/plugin-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyEngineImpl.java ---------------------------------------------------------------------- diff --git a/plugin-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyEngineImpl.java b/plugin-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyEngineImpl.java index 14d0c92..d2053f5 100644 --- a/plugin-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyEngineImpl.java +++ b/plugin-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyEngineImpl.java @@ -23,8 +23,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; -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.audit.RangerAuditHandler; http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/ff4a817e/plugin-common/src/main/java/org/apache/ranger/plugin/service/RangerBasePlugin.java ---------------------------------------------------------------------- diff --git a/plugin-common/src/main/java/org/apache/ranger/plugin/service/RangerBasePlugin.java b/plugin-common/src/main/java/org/apache/ranger/plugin/service/RangerBasePlugin.java index 8b312af..8f1fa5f 100644 --- a/plugin-common/src/main/java/org/apache/ranger/plugin/service/RangerBasePlugin.java +++ b/plugin-common/src/main/java/org/apache/ranger/plugin/service/RangerBasePlugin.java @@ -65,24 +65,28 @@ public class RangerBasePlugin { public synchronized void init(RangerPolicyEngine policyEngine) { cleanup(); - // get the serviceName from download URL: http://ranger-admin-host:port/service/assets/policyList/serviceName - String policyDownloadUrl = RangerConfiguration.getInstance().get("xasecure." + serviceType + ".policymgr.url"); - if(! StringUtils.isEmpty(policyDownloadUrl)) { - int idx = policyDownloadUrl.lastIndexOf('/'); - - if(idx != -1) { - serviceName = policyDownloadUrl.substring(idx + 1); - } - } + String serviceName = RangerConfiguration.getInstance().get("ranger.plugin." + serviceType + ".service.name"); + String serviceStoreClass = RangerConfiguration.getInstance().get("ranger.plugin." + serviceType + ".service.store.class", "org.apache.ranger.plugin.store.rest.ServiceRESTStore"); + String cacheDir = RangerConfiguration.getInstance().get("ranger.plugin." + serviceType + ".service.store.cache.dir", "/tmp"); + long pollingIntervalMs = RangerConfiguration.getInstance().getLong("ranger.plugin." + serviceType + ".service.store.pollIntervalMs", 30 * 1000); if(StringUtils.isEmpty(serviceName)) { - serviceName = RangerConfiguration.getInstance().get("ranger.plugin." + serviceType + ".service.name"); + // get the serviceName from download URL: http://ranger-admin-host:port/service/assets/policyList/serviceName + String policyDownloadUrl = RangerConfiguration.getInstance().get("xasecure." + serviceType + ".policymgr.url"); + + if(! StringUtils.isEmpty(policyDownloadUrl)) { + int idx = policyDownloadUrl.lastIndexOf('/'); + + if(idx != -1) { + serviceName = policyDownloadUrl.substring(idx + 1); + } + } } - ServiceStore serviceStore = ServiceStoreFactory.instance().getServiceStore(); + ServiceStore serviceStore = ServiceStoreFactory.instance().getServiceStore(serviceStoreClass); - refresher = new PolicyRefresher(policyEngine, serviceName, serviceStore); + refresher = new PolicyRefresher(policyEngine, serviceType, serviceName, serviceStore, pollingIntervalMs, cacheDir); refresher.startRefresher(); this.policyEngine = policyEngine; } http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/ff4a817e/plugin-common/src/main/java/org/apache/ranger/plugin/store/ServiceStore.java ---------------------------------------------------------------------- diff --git a/plugin-common/src/main/java/org/apache/ranger/plugin/store/ServiceStore.java b/plugin-common/src/main/java/org/apache/ranger/plugin/store/ServiceStore.java index 8d48305..e8d970c 100644 --- a/plugin-common/src/main/java/org/apache/ranger/plugin/store/ServiceStore.java +++ b/plugin-common/src/main/java/org/apache/ranger/plugin/store/ServiceStore.java @@ -24,9 +24,12 @@ import java.util.List; import org.apache.ranger.plugin.model.RangerPolicy; import org.apache.ranger.plugin.model.RangerService; import org.apache.ranger.plugin.model.RangerServiceDef; +import org.apache.ranger.plugin.util.SearchFilter; import org.apache.ranger.plugin.util.ServicePolicies; public interface ServiceStore { + void init() throws Exception; + RangerServiceDef createServiceDef(RangerServiceDef serviceDef) throws Exception; RangerServiceDef updateServiceDef(RangerServiceDef serviceDef) throws Exception; @@ -37,7 +40,7 @@ public interface ServiceStore { RangerServiceDef getServiceDefByName(String name) throws Exception; - List<RangerServiceDef> getAllServiceDefs() throws Exception; + List<RangerServiceDef> getServiceDefs(SearchFilter filter) throws Exception; RangerService createService(RangerService service) throws Exception; @@ -50,7 +53,7 @@ public interface ServiceStore { RangerService getServiceByName(String name) throws Exception; - List<RangerService> getAllServices() throws Exception; + List<RangerService> getServices(SearchFilter filter) throws Exception; RangerPolicy createPolicy(RangerPolicy policy) throws Exception; @@ -61,11 +64,11 @@ public interface ServiceStore { RangerPolicy getPolicy(Long id) throws Exception; - List<RangerPolicy> getAllPolicies() throws Exception; + List<RangerPolicy> getPolicies(SearchFilter filter) throws Exception; - List<RangerPolicy> getServicePolicies(Long serviceId) throws Exception; + List<RangerPolicy> getServicePolicies(Long serviceId, SearchFilter filter) throws Exception; - List<RangerPolicy> getServicePolicies(String serviceName) throws Exception; + List<RangerPolicy> getServicePolicies(String serviceName, SearchFilter filter) throws Exception; ServicePolicies getServicePoliciesIfUpdated(String serviceName, Long lastKnownVersion) throws Exception; } http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/ff4a817e/plugin-common/src/main/java/org/apache/ranger/plugin/store/ServiceStoreFactory.java ---------------------------------------------------------------------- diff --git a/plugin-common/src/main/java/org/apache/ranger/plugin/store/ServiceStoreFactory.java b/plugin-common/src/main/java/org/apache/ranger/plugin/store/ServiceStoreFactory.java index 949792b..3d45f89 100644 --- a/plugin-common/src/main/java/org/apache/ranger/plugin/store/ServiceStoreFactory.java +++ b/plugin-common/src/main/java/org/apache/ranger/plugin/store/ServiceStoreFactory.java @@ -19,11 +19,13 @@ package org.apache.ranger.plugin.store; +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.collections.MapUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.apache.ranger.plugin.store.file.ServiceFileStore; -import org.apache.ranger.plugin.store.rest.ServiceRESTStore; -import org.apache.ranger.plugin.util.RangerRESTClient; +import org.apache.ranger.authorization.hadoop.config.RangerConfiguration; public class ServiceStoreFactory { @@ -31,7 +33,8 @@ public class ServiceStoreFactory { private static ServiceStoreFactory sInstance = null; - private ServiceStore serviceStore = null; + private Map<String, ServiceStore> serviceStores = null; + private ServiceStore defaultServiceStore = null; public static ServiceStoreFactory instance() { @@ -43,7 +46,46 @@ public class ServiceStoreFactory { } public ServiceStore getServiceStore() { - return serviceStore; + ServiceStore ret = defaultServiceStore; + + if(ret == null) { // if no service store has been created yet, create the default store. TODO: review the impact and update, if necessary + String defaultServiceStoreClass = RangerConfiguration.getInstance().get("ranger.default.service.store.class", "org.apache.ranger.plugin.store.file.ServiceFileStore"); + + ret = getServiceStore(defaultServiceStoreClass); + } + + return ret; + } + + public ServiceStore getServiceStore(String storeClassname) { + ServiceStore ret = serviceStores.get(storeClassname); + + if(ret == null) { + synchronized(this) { + ret = serviceStores.get(storeClassname); + + if(ret == null) { + try { + @SuppressWarnings("unchecked") + Class<ServiceStore> storeClass = (Class<ServiceStore>)Class.forName(storeClassname); + + ret = storeClass.newInstance(); + + ret.init(); + + serviceStores.put(storeClassname, ret); + + if(defaultServiceStore == null) { + defaultServiceStore = ret; + } + } catch(Exception excp) { + LOG.error("failed to instantiate service store of type " + storeClassname, excp); + } + } + } + } + + return ret; } private ServiceStoreFactory() { @@ -62,18 +104,8 @@ public class ServiceStoreFactory { if(LOG.isDebugEnabled()) { LOG.debug("==> ServiceStoreFactory.init()"); } - - boolean useFileStore = true; - - if(useFileStore) { - serviceStore = new ServiceFileStore(); // TODO: configurable store implementation - } else { - RangerRESTClient restClient = new RangerRESTClient("http://localhost:6080", ""); - restClient.setBasicAuthInfo("admin", "admin"); - - serviceStore = new ServiceRESTStore(restClient); - } + serviceStores = new HashMap<String, ServiceStore>(); if(LOG.isDebugEnabled()) { LOG.debug("<== ServiceStoreFactory.init()"); http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/ff4a817e/plugin-common/src/main/java/org/apache/ranger/plugin/store/file/BaseFileStore.java ---------------------------------------------------------------------- diff --git a/plugin-common/src/main/java/org/apache/ranger/plugin/store/file/BaseFileStore.java b/plugin-common/src/main/java/org/apache/ranger/plugin/store/file/BaseFileStore.java index 9493e16..17b46f9 100644 --- a/plugin-common/src/main/java/org/apache/ranger/plugin/store/file/BaseFileStore.java +++ b/plugin-common/src/main/java/org/apache/ranger/plugin/store/file/BaseFileStore.java @@ -58,8 +58,8 @@ public class BaseFileStore { protected static String FILE_SUFFIX_JSON = ".json"; - protected void init() { - dataDir = RangerConfiguration.getInstance().get("ranger.policystore.file.dir", "file:///etc/ranger/data"); + protected void initStore() { + dataDir = RangerConfiguration.getInstance().get("ranger.service.store.file.dir", "file:///etc/ranger/data"); try { gsonBuilder = new GsonBuilder().setDateFormat("yyyyMMdd-HH:mm:ss.SSS-Z").setPrettyPrinting().create(); http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/ff4a817e/plugin-common/src/main/java/org/apache/ranger/plugin/store/file/ServiceFileStore.java ---------------------------------------------------------------------- diff --git a/plugin-common/src/main/java/org/apache/ranger/plugin/store/file/ServiceFileStore.java b/plugin-common/src/main/java/org/apache/ranger/plugin/store/file/ServiceFileStore.java index 276c87e..b7471f3 100644 --- a/plugin-common/src/main/java/org/apache/ranger/plugin/store/file/ServiceFileStore.java +++ b/plugin-common/src/main/java/org/apache/ranger/plugin/store/file/ServiceFileStore.java @@ -26,15 +26,20 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections.Predicate; +import org.apache.commons.collections.PredicateUtils; import org.apache.commons.lang.ObjectUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.fs.Path; import org.apache.ranger.plugin.model.RangerPolicy; +import org.apache.ranger.plugin.model.RangerPolicy.RangerPolicyItem; import org.apache.ranger.plugin.model.RangerService; import org.apache.ranger.plugin.model.RangerServiceDef; import org.apache.ranger.plugin.store.ServiceStore; +import org.apache.ranger.plugin.util.SearchFilter; import org.apache.ranger.plugin.util.ServicePolicies; @@ -60,13 +65,23 @@ public class ServiceFileStore extends BaseFileStore implements ServiceStore { LOG.debug("==> ServiceFileStore.ServiceFileStore()"); } - init(); - if(LOG.isDebugEnabled()) { LOG.debug("<== ServiceFileStore.ServiceFileStore()"); } } + @Override + public void init() throws Exception { + if(LOG.isDebugEnabled()) { + LOG.debug("==> ServiceFileStore.init()"); + } + + super.initStore(); + + if(LOG.isDebugEnabled()) { + LOG.debug("<== ServiceFileStore.init()"); + } + } @Override public RangerServiceDef createServiceDef(RangerServiceDef serviceDef) throws Exception { @@ -74,7 +89,7 @@ public class ServiceFileStore extends BaseFileStore implements ServiceStore { LOG.debug("==> ServiceDefFileStore.createServiceDef(" + serviceDef + ")"); } - RangerServiceDef existing = findServiceDefByName(serviceDef.getName()); + RangerServiceDef existing = getServiceDefByName(serviceDef.getName()); if(existing != null) { throw new Exception(serviceDef.getName() + ": service-def already exists (id=" + existing.getId() + ")"); @@ -109,7 +124,7 @@ public class ServiceFileStore extends BaseFileStore implements ServiceStore { LOG.debug("==> ServiceDefFileStore.updateServiceDef(" + serviceDef + ")"); } - RangerServiceDef existing = findServiceDefById(serviceDef.getId()); + RangerServiceDef existing = getServiceDef(serviceDef.getId()); if(existing == null) { throw new Exception(serviceDef.getId() + ": service-def does not exist"); @@ -163,7 +178,7 @@ public class ServiceFileStore extends BaseFileStore implements ServiceStore { LOG.debug("==> ServiceDefFileStore.deleteServiceDef(" + id + ")"); } - RangerServiceDef existing = findServiceDefById(id); + RangerServiceDef existing = getServiceDef(id); if(existing == null) { throw new Exception("service-def does not exist. id=" + id); @@ -202,7 +217,17 @@ public class ServiceFileStore extends BaseFileStore implements ServiceStore { LOG.debug("==> ServiceDefFileStore.getServiceDef(" + id + ")"); } - RangerServiceDef ret = findServiceDefById(id); + RangerServiceDef ret = null; + + List<RangerServiceDef> serviceDefs = getAllServiceDefs(); + + for(RangerServiceDef sd : serviceDefs) { + if(sd != null && sd.getId() != null && sd.getId().longValue() == id) { + ret = sd; + + break; + } + } if(LOG.isDebugEnabled()) { LOG.debug("<== ServiceDefFileStore.getServiceDef(" + id + "): " + ret); @@ -217,7 +242,17 @@ public class ServiceFileStore extends BaseFileStore implements ServiceStore { LOG.debug("==> ServiceDefFileStore.getServiceDefByName(" + name + ")"); } - RangerServiceDef ret = findServiceDefByName(name); + RangerServiceDef ret = null; + + List<RangerServiceDef> serviceDefs = getAllServiceDefs(); + + for(RangerServiceDef sd : serviceDefs) { + if(sd != null && StringUtils.equalsIgnoreCase(sd.getName(), name)) { + ret = sd; + + break; + } + } if(LOG.isDebugEnabled()) { LOG.debug("<== ServiceDefFileStore.getServiceDefByName(" + name + "): " + ret); @@ -227,69 +262,19 @@ public class ServiceFileStore extends BaseFileStore implements ServiceStore { } @Override - public List<RangerServiceDef> getAllServiceDefs() throws Exception { + public List<RangerServiceDef> getServiceDefs(SearchFilter filter) throws Exception { if(LOG.isDebugEnabled()) { - LOG.debug("==> ServiceDefFileStore.getAllServiceDefs()"); + LOG.debug("==> ServiceDefFileStore.getServiceDefs()"); } - List<RangerServiceDef> ret = new ArrayList<RangerServiceDef>(); + List<RangerServiceDef> ret = getAllServiceDefs(); - try { - // load definitions for legacy services from embedded resources - String[] legacyServiceDefResources = { - "/service-defs/ranger-servicedef-hdfs.json", - "/service-defs/ranger-servicedef-hive.json", - "/service-defs/ranger-servicedef-hbase.json", - "/service-defs/ranger-servicedef-knox.json", - "/service-defs/ranger-servicedef-storm.json", - }; - - for(String resource : legacyServiceDefResources) { - RangerServiceDef sd = loadFromResource(resource, RangerServiceDef.class); - - if(sd != null) { - ret.add(sd); - } - } - nextServiceDefId = getMaxId(ret) + 1; - - // load service definitions from file system - List<RangerServiceDef> sds = loadFromDir(new Path(getDataDir()), FILE_PREFIX_SERVICE_DEF, RangerServiceDef.class); - - if(sds != null) { - for(RangerServiceDef sd : sds) { - if(sd != null) { - if(isLegacyServiceDef(sd)) { - LOG.warn("Found in-built service-def '" + sd.getName() + "' under " + getDataDir() + ". Ignorning"); - - continue; - } - - // if the ServiceDef is already found, remove the earlier definition - for(int i = 0; i < ret.size(); i++) { - RangerServiceDef currSd = ret.get(i); - - if(StringUtils.equals(currSd.getName(), sd.getName()) || - ObjectUtils.equals(currSd.getId(), sd.getId())) { - ret.remove(i); - } - } - - ret.add(sd); - } - } - } - nextServiceDefId = getMaxId(ret) + 1; - } catch(Exception excp) { - LOG.error("ServiceDefFileStore.getAllServiceDefs(): failed to read service-defs", excp); + if(ret != null && filter != null) { + CollectionUtils.filter(ret, getServiceDefPredicate(filter)); } if(LOG.isDebugEnabled()) { - LOG.debug("<== ServiceDefFileStore.getAllServiceDefs(): count=" + (ret == null ? 0 : ret.size())); - } - - if(ret != null) { - Collections.sort(ret, RangerServiceDef.idComparator); + LOG.debug("<== ServiceDefFileStore.getServiceDefs(): count=" + (ret == null ? 0 : ret.size())); } return ret; @@ -464,27 +449,19 @@ public class ServiceFileStore extends BaseFileStore implements ServiceStore { } @Override - public List<RangerService> getAllServices() throws Exception { + public List<RangerService> getServices(SearchFilter filter) throws Exception { if(LOG.isDebugEnabled()) { - LOG.debug("==> ServiceFileStore.getAllServices()"); + LOG.debug("==> ServiceFileStore.getServices()"); } - List<RangerService> ret = null; - - try { - ret = loadFromDir(new Path(getDataDir()), FILE_PREFIX_SERVICE, RangerService.class); + List<RangerService> ret = getAllServices(); - nextServiceId = getMaxId(ret) + 1; - } catch(Exception excp) { - LOG.error("ServiceFileStore.getAllServices(): failed to read services", excp); + if(ret != null && filter != null) { + CollectionUtils.filter(ret, getServicePredicate(filter)); } if(LOG.isDebugEnabled()) { - LOG.debug("<== ServiceFileStore.getAllServices(): count=" + (ret == null ? 0 : ret.size())); - } - - if(ret != null) { - Collections.sort(ret, RangerService.idComparator); + LOG.debug("<== ServiceFileStore.getServices(): count=" + (ret == null ? 0 : ret.size())); } return ret; @@ -655,36 +632,28 @@ public class ServiceFileStore extends BaseFileStore implements ServiceStore { } @Override - public List<RangerPolicy> getAllPolicies() throws Exception { + public List<RangerPolicy> getPolicies(SearchFilter filter) throws Exception { if(LOG.isDebugEnabled()) { - LOG.debug("==> ServiceFileStore.getAllPolicies()"); + LOG.debug("==> ServiceFileStore.getPolicies()"); } - List<RangerPolicy> ret = null; - - try { - ret = loadFromDir(new Path(getDataDir()), FILE_PREFIX_POLICY, RangerPolicy.class); + List<RangerPolicy> ret = getAllPolicies(); - nextPolicyId = getMaxId(ret) + 1; - } catch(Exception excp) { - LOG.error("ServiceFileStore.getAllPolicies(): failed to read policies", excp); + if(ret != null) { + CollectionUtils.filter(ret, getPolicyPredicate(filter)); } if(LOG.isDebugEnabled()) { - LOG.debug("<== ServiceFileStore.getAllPolicies(): count=" + (ret == null ? 0 : ret.size())); - } - - if(ret != null) { - Collections.sort(ret, RangerPolicy.idComparator); + LOG.debug("<== ServiceFileStore.getPolicies(): count=" + (ret == null ? 0 : ret.size())); } return ret; } @Override - public List<RangerPolicy> getServicePolicies(Long serviceId) throws Exception { + public List<RangerPolicy> getServicePolicies(Long serviceId, SearchFilter filter) throws Exception { if(LOG.isDebugEnabled()) { - LOG.debug("==> ServiceFileStore.getPolicies(" + serviceId + ")"); + LOG.debug("==> ServiceFileStore.getServicePolicies(" + serviceId + ")"); } RangerService service = getService(serviceId); @@ -693,37 +662,25 @@ public class ServiceFileStore extends BaseFileStore implements ServiceStore { throw new Exception("service does not exist - id='" + serviceId); } - List<RangerPolicy> ret = getServicePolicies(service.getName()); + List<RangerPolicy> ret = getServicePolicies(service.getName(), filter); if(LOG.isDebugEnabled()) { - LOG.debug("<== ServiceFileStore.getPolicies(" + serviceId + "): " + ((ret == null) ? 0 : ret.size())); + LOG.debug("<== ServiceFileStore.getServicePolicies(" + serviceId + "): " + ((ret == null) ? 0 : ret.size())); } return ret; } @Override - public List<RangerPolicy> getServicePolicies(String serviceName) throws Exception { + public List<RangerPolicy> getServicePolicies(String serviceName, SearchFilter filter) throws Exception { if(LOG.isDebugEnabled()) { - LOG.debug("==> ServiceFileStore.getPolicies(" + serviceName + ")"); - } - - RangerService service = getServiceByName(serviceName); - - if(service == null) { - throw new Exception("service does not exist - name='" + serviceName); - } - - RangerServiceDef serviceDef = findServiceDefByName(service.getType()); - - if(serviceDef == null) { - throw new Exception(service.getType() + ": unknown service-def)"); + LOG.debug("==> ServiceFileStore.getServicePolicies(" + serviceName + ")"); } List<RangerPolicy> ret = new ArrayList<RangerPolicy>(); try { - List<RangerPolicy> policies = getAllPolicies(); + List<RangerPolicy> policies = getPolicies(filter); if(policies != null) { for(RangerPolicy policy : policies) { @@ -733,11 +690,11 @@ public class ServiceFileStore extends BaseFileStore implements ServiceStore { } } } catch(Exception excp) { - LOG.error("ServiceFileStore.getPolicies(" + serviceName + "): failed to read policies", excp); + LOG.error("ServiceFileStore.getServicePolicies(" + serviceName + "): failed to read policies", excp); } if(LOG.isDebugEnabled()) { - LOG.debug("<== ServiceFileStore.getPolicies(" + serviceName + "): count=" + ((ret == null) ? 0 : ret.size())); + LOG.debug("<== ServiceFileStore.getServicePolicies(" + serviceName + "): count=" + ((ret == null) ? 0 : ret.size())); } if(ret != null) { @@ -759,7 +716,7 @@ public class ServiceFileStore extends BaseFileStore implements ServiceStore { throw new Exception("service does not exist - name=" + serviceName); } - RangerServiceDef serviceDef = findServiceDefByName(service.getType()); + RangerServiceDef serviceDef = getServiceDefByName(service.getType()); if(serviceDef == null) { throw new Exception(service.getType() + ": unknown service-def)"); @@ -801,19 +758,6 @@ public class ServiceFileStore extends BaseFileStore implements ServiceStore { return ret; } - @Override - protected void init() { - if(LOG.isDebugEnabled()) { - LOG.debug("==> ServiceFileStore.init()"); - } - - super.init(); - - if(LOG.isDebugEnabled()) { - LOG.debug("<== ServiceFileStore.init()"); - } - } - private void handleServiceRename(RangerService service, String oldName) throws Exception { List<RangerPolicy> policies = getAllPolicies(); @@ -872,38 +816,6 @@ public class ServiceFileStore extends BaseFileStore implements ServiceStore { saveToFile(service, true); } - private RangerServiceDef findServiceDefById(long id) throws Exception { - RangerServiceDef ret = null; - - List<RangerServiceDef> serviceDefs = getAllServiceDefs(); - - for(RangerServiceDef sd : serviceDefs) { - if(sd != null && sd.getId() != null && sd.getId().longValue() == id) { - ret = sd; - - break; - } - } - - return ret; - } - - private RangerServiceDef findServiceDefByName(String sdName) throws Exception { - RangerServiceDef ret = null; - - List<RangerServiceDef> serviceDefs = getAllServiceDefs(); - - for(RangerServiceDef sd : serviceDefs) { - if(sd != null && StringUtils.equalsIgnoreCase(sd.getName(), sdName)) { - ret = sd; - - break; - } - } - - return ret; - } - private RangerPolicy findPolicyByName(String serviceName, String policyName) throws Exception { if(LOG.isDebugEnabled()) { LOG.debug("==> ServiceFileStore.findPolicyByName(" + serviceName + ", " + policyName + ")"); @@ -952,4 +864,447 @@ public class ServiceFileStore extends BaseFileStore implements ServiceStore { private boolean isLegacyServiceDef(Long id) { return id == null ? false : legacyServiceDefs.containsValue(id); } + + private List<RangerServiceDef> getAllServiceDefs() throws Exception { + if(LOG.isDebugEnabled()) { + LOG.debug("==> ServiceDefFileStore.getAllServiceDefs()"); + } + + List<RangerServiceDef> ret = new ArrayList<RangerServiceDef>(); + + try { + // load definitions for legacy services from embedded resources + String[] legacyServiceDefResources = { + "/service-defs/ranger-servicedef-hdfs.json", + "/service-defs/ranger-servicedef-hive.json", + "/service-defs/ranger-servicedef-hbase.json", + "/service-defs/ranger-servicedef-knox.json", + "/service-defs/ranger-servicedef-storm.json", + }; + + for(String resource : legacyServiceDefResources) { + RangerServiceDef sd = loadFromResource(resource, RangerServiceDef.class); + + if(sd != null) { + ret.add(sd); + } + } + nextServiceDefId = getMaxId(ret) + 1; + + // load service definitions from file system + List<RangerServiceDef> sds = loadFromDir(new Path(getDataDir()), FILE_PREFIX_SERVICE_DEF, RangerServiceDef.class); + + if(sds != null) { + for(RangerServiceDef sd : sds) { + if(sd != null) { + if(isLegacyServiceDef(sd)) { + LOG.warn("Found in-built service-def '" + sd.getName() + "' under " + getDataDir() + ". Ignorning"); + + continue; + } + + // if the ServiceDef is already found, remove the earlier definition + for(int i = 0; i < ret.size(); i++) { + RangerServiceDef currSd = ret.get(i); + + if(StringUtils.equals(currSd.getName(), sd.getName()) || + ObjectUtils.equals(currSd.getId(), sd.getId())) { + ret.remove(i); + } + } + + ret.add(sd); + } + } + } + nextServiceDefId = getMaxId(ret) + 1; + } catch(Exception excp) { + LOG.error("ServiceDefFileStore.getAllServiceDefs(): failed to read service-defs", excp); + } + + if(LOG.isDebugEnabled()) { + LOG.debug("<== ServiceDefFileStore.getAllServiceDefs(): count=" + (ret == null ? 0 : ret.size())); + } + + if(ret != null) { + Collections.sort(ret, RangerServiceDef.idComparator); + } + + return ret; + } + + private List<RangerService> getAllServices() throws Exception { + if(LOG.isDebugEnabled()) { + LOG.debug("==> ServiceFileStore.getAllServices()"); + } + + List<RangerService> ret = null; + + try { + ret = loadFromDir(new Path(getDataDir()), FILE_PREFIX_SERVICE, RangerService.class); + + nextServiceId = getMaxId(ret) + 1; + } catch(Exception excp) { + LOG.error("ServiceFileStore.getAllServices(): failed to read services", excp); + } + + if(LOG.isDebugEnabled()) { + LOG.debug("<== ServiceFileStore.getAllServices(): count=" + (ret == null ? 0 : ret.size())); + } + + if(ret != null) { + Collections.sort(ret, RangerService.idComparator); + } + + return ret; + } + + private List<RangerPolicy> getAllPolicies() throws Exception { + if(LOG.isDebugEnabled()) { + LOG.debug("==> ServiceFileStore.getAllPolicies()"); + } + + List<RangerPolicy> ret = null; + + try { + ret = loadFromDir(new Path(getDataDir()), FILE_PREFIX_POLICY, RangerPolicy.class); + + nextPolicyId = getMaxId(ret) + 1; + } catch(Exception excp) { + LOG.error("ServiceFileStore.getAllPolicies(): failed to read policies", excp); + } + + if(ret != null) { + Collections.sort(ret, RangerPolicy.idComparator); + } + + if(LOG.isDebugEnabled()) { + LOG.debug("<== ServiceFileStore.getAllPolicies(): count=" + (ret == null ? 0 : ret.size())); + } + + return ret; + } + + private String getServiceType(String serviceName) { + RangerService service = null; + + try { + service = getServiceByName(serviceName); + } catch(Exception excp) { + // ignore + } + + return service != null ? service.getType() : null; + } + + private Long getServiceId(String serviceName) { + RangerService service = null; + + try { + service = getServiceByName(serviceName); + } catch(Exception excp) { + // ignore + } + + return service != null ? service.getId() : null; + } + + /* + public static final String LOGIN_USER = "loginUser"; + public static final String SERVICE_TYPE = "serviceType"; + public static final String SERVICE_NAME = "serviceName"; + public static final String SERVICE_ID = "serviceId"; + public static final String POLICY_NAME = "policyName"; + public static final String RESOURCE_PREFIX = "resource:"; + public static final String STATUS = "status"; + public static final String USER_NAME = "userName"; + public static final String GROUP_NAME = "groupName"; + public static final String START_INDEX = "startIndex"; + public static final String PAGE_SIZE = "pageSize"; + public static final String SORT_BY = "sortBy"; + */ + + private Predicate getServiceDefPredicate(SearchFilter filter) { + if(filter == null) { + return null; + } + + List<Predicate> predicates = new ArrayList<Predicate>(); + + final String serviceType = filter.getParam(SearchFilter.SERVICE_TYPE); + if(! StringUtils.isEmpty(serviceType)) { + Predicate p = new Predicate() { + @Override + public boolean evaluate(Object object) { + boolean ret = false; + + if(object != null && object instanceof RangerServiceDef) { + RangerServiceDef serviceDef = (RangerServiceDef)object; + + ret = StringUtils.equals(serviceType, serviceDef.getName()); + } + + return ret; + } + }; + + predicates.add(p); + } + + Predicate ret = CollectionUtils.isEmpty(predicates) ? null : PredicateUtils.allPredicate(predicates); + + return ret; + } + + private Predicate getServicePredicate(SearchFilter filter) { + if(filter == null) { + return null; + } + + List<Predicate> predicates = new ArrayList<Predicate>(); + + final String serviceType = filter.getParam(SearchFilter.SERVICE_TYPE); + if(! StringUtils.isEmpty(serviceType)) { + Predicate p = new Predicate() { + @Override + public boolean evaluate(Object object) { + boolean ret = false; + + if(object != null && object instanceof RangerService) { + RangerService service = (RangerService)object; + + ret = StringUtils.equals(serviceType, service.getType()); + } + + return ret; + } + }; + + predicates.add(p); + } + + final String serviceName = filter.getParam(SearchFilter.SERVICE_NAME); + if(! StringUtils.isEmpty(serviceName)) { + Predicate p = new Predicate() { + @Override + public boolean evaluate(Object object) { + boolean ret = false; + + if(object != null && object instanceof RangerService) { + RangerService service = (RangerService)object; + + ret = StringUtils.equals(serviceName, service.getName()); + } + + return ret; + } + }; + + predicates.add(p); + } + + final String serviceId = filter.getParam(SearchFilter.SERVICE_ID); + if(! StringUtils.isEmpty(serviceId)) { + Predicate p = new Predicate() { + @Override + public boolean evaluate(Object object) { + boolean ret = false; + + if(object != null && object instanceof RangerService) { + RangerService service = (RangerService)object; + Long svcId = service.getId(); + + if(svcId != null) { + ret = StringUtils.equals(serviceId, svcId.toString()); + } + } + + return ret; + } + }; + + predicates.add(p); + } + + Predicate ret = CollectionUtils.isEmpty(predicates) ? null : PredicateUtils.allPredicate(predicates); + + return ret; + } + + private Predicate getPolicyPredicate(SearchFilter filter) { + if(filter == null) { + return null; + } + + List<Predicate> predicates = new ArrayList<Predicate>(); + + final String loginUser = filter.getParam(SearchFilter.LOGIN_USER); + if(! StringUtils.isEmpty(loginUser)) { + Predicate p = new Predicate() { + @Override + public boolean evaluate(Object object) { + boolean ret = false; + + if(object != null && object instanceof RangerPolicy) { + RangerPolicy policy = (RangerPolicy)object; + + for(RangerPolicyItem policyItem : policy.getPolicyItems()) { + if(!policyItem.getDelegateAdmin()) { + continue; + } + + if(policyItem.getUsers().contains(loginUser)) { // TODO: group membership check + ret = true; + + break; + } + } + } + + return ret; + } + }; + + predicates.add(p); + } + + final String serviceType = filter.getParam(SearchFilter.SERVICE_TYPE); + if(! StringUtils.isEmpty(serviceType)) { + Predicate p = new Predicate() { + @Override + public boolean evaluate(Object object) { + boolean ret = false; + + if(object != null && object instanceof RangerPolicy) { + RangerPolicy policy = (RangerPolicy)object; + + ret = StringUtils.equals(serviceType, getServiceType(policy.getService())); + } + + return ret; + } + }; + + predicates.add(p); + } + + final String serviceName = filter.getParam(SearchFilter.SERVICE_NAME); + if(! StringUtils.isEmpty(serviceName)) { + Predicate p = new Predicate() { + @Override + public boolean evaluate(Object object) { + boolean ret = false; + + if(object != null && object instanceof RangerPolicy) { + RangerPolicy policy = (RangerPolicy)object; + + ret = StringUtils.equals(serviceName, policy.getService()); + } + + return ret; + } + }; + + predicates.add(p); + } + + final String serviceId = filter.getParam(SearchFilter.SERVICE_ID); + if(! StringUtils.isEmpty(serviceId)) { + Predicate p = new Predicate() { + @Override + public boolean evaluate(Object object) { + boolean ret = false; + + if(object != null && object instanceof RangerPolicy) { + RangerPolicy policy = (RangerPolicy)object; + Long svcId = getServiceId(policy.getService()); + + if(svcId != null) { + ret = StringUtils.equals(serviceId, svcId.toString()); + } + } + + return ret; + } + }; + + predicates.add(p); + } + + final String policyName = filter.getParam(SearchFilter.POLICY_NAME); + if(! StringUtils.isEmpty(policyName)) { + Predicate p = new Predicate() { + @Override + public boolean evaluate(Object object) { + boolean ret = false; + + if(object != null && object instanceof RangerPolicy) { + RangerPolicy policy = (RangerPolicy)object; + + ret = StringUtils.equals(policyName, policy.getName()); + } + + return ret; + } + }; + + predicates.add(p); + } + + final String userName = filter.getParam(SearchFilter.USER_NAME); + if(! StringUtils.isEmpty(userName)) { + Predicate p = new Predicate() { + @Override + public boolean evaluate(Object object) { + boolean ret = false; + + if(object != null && object instanceof RangerPolicy) { + RangerPolicy policy = (RangerPolicy)object; + + for(RangerPolicyItem policyItem : policy.getPolicyItems()) { + if(policyItem.getUsers().contains(userName)) { // TODO: group membership check + ret = true; + + break; + } + } + } + + return ret; + } + }; + + predicates.add(p); + } + + final String groupName = filter.getParam(SearchFilter.GROUP_NAME); + if(! StringUtils.isEmpty(groupName)) { + Predicate p = new Predicate() { + @Override + public boolean evaluate(Object object) { + boolean ret = false; + + if(object != null && object instanceof RangerPolicy) { + RangerPolicy policy = (RangerPolicy)object; + + for(RangerPolicyItem policyItem : policy.getPolicyItems()) { + if(policyItem.getGroups().contains(groupName)) { + ret = true; + + break; + } + } + } + + return ret; + } + }; + + predicates.add(p); + } + + Predicate ret = CollectionUtils.isEmpty(predicates) ? null : PredicateUtils.allPredicate(predicates); + + return ret; + } } http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/ff4a817e/plugin-common/src/main/java/org/apache/ranger/plugin/store/rest/ServiceRESTStore.java ---------------------------------------------------------------------- diff --git a/plugin-common/src/main/java/org/apache/ranger/plugin/store/rest/ServiceRESTStore.java b/plugin-common/src/main/java/org/apache/ranger/plugin/store/rest/ServiceRESTStore.java index cdb2fa5..dd3624b 100644 --- a/plugin-common/src/main/java/org/apache/ranger/plugin/store/rest/ServiceRESTStore.java +++ b/plugin-common/src/main/java/org/apache/ranger/plugin/store/rest/ServiceRESTStore.java @@ -24,11 +24,13 @@ import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.ranger.admin.client.datatype.RESTResponse; +import org.apache.ranger.authorization.hadoop.config.RangerConfiguration; import org.apache.ranger.plugin.model.RangerPolicy; import org.apache.ranger.plugin.model.RangerService; import org.apache.ranger.plugin.model.RangerServiceDef; import org.apache.ranger.plugin.store.ServiceStore; import org.apache.ranger.plugin.util.RangerRESTClient; +import org.apache.ranger.plugin.util.SearchFilter; import org.apache.ranger.plugin.util.ServicePolicies; import com.sun.jersey.api.client.ClientResponse; @@ -62,23 +64,32 @@ public class ServiceRESTStore implements ServiceStore { public final String REST_URL_POLICY_GET_ALL = "/service/plugins/policies"; public final String REST_URL_POLICY_GET_FOR_SERVICE = "/service/plugins/policies/service/"; public final String REST_URL_POLICY_GET_FOR_SERVICE_BY_NAME = "/service/plugins/policies/service/name/"; + public final String REST_URL_POLICY_GET_FOR_SERVICE_IF_UPDATED = "/service/plugins/policies/service/name/"; public static final String REST_MIME_TYPE_JSON = "application/json" ; private RangerRESTClient restClient; - public ServiceRESTStore(RangerRESTClient restClient) { + public ServiceRESTStore() { if(LOG.isDebugEnabled()) { - LOG.debug("==> ServiceRESTStore.ServiceRESTStore(" + restClient + ")"); + LOG.debug("==> ServiceRESTStore.ServiceRESTStore()"); } - this.restClient = restClient; - if(LOG.isDebugEnabled()) { - LOG.debug("<== ServiceRESTStore.ServiceRESTStore(" + restClient + ")"); + LOG.debug("<== ServiceRESTStore.ServiceRESTStore()"); } } + @Override + public void init() throws Exception { + String restUrl = RangerConfiguration.getInstance().get("ranger.service.store.rest.url", "http://localhost:6080"); + String restUsername = RangerConfiguration.getInstance().get("ranger.service.store.rest.username", "admin"); + String restPassword = RangerConfiguration.getInstance().get("ranger.service.store.rest.password", "admin"); + String sslConfigFile = RangerConfiguration.getInstance().get("ranger.service.store.rest.ssl.config.file", ""); + + restClient = new RangerRESTClient(restUrl, sslConfigFile); + restClient.setBasicAuthInfo(restUsername, restPassword); + } @Override public RangerServiceDef createServiceDef(RangerServiceDef serviceDef) throws Exception { @@ -88,7 +99,7 @@ public class ServiceRESTStore implements ServiceStore { RangerServiceDef ret = null; - WebResource webResource = restClient.getResource(REST_URL_SERVICEDEF_CREATE); + WebResource webResource = createWebResource(REST_URL_SERVICEDEF_CREATE); ClientResponse response = webResource.accept(REST_MIME_TYPE_JSON).type(REST_MIME_TYPE_JSON).post(ClientResponse.class, restClient.toJson(serviceDef)); if(response != null && response.getStatus() == 200) { @@ -114,7 +125,7 @@ public class ServiceRESTStore implements ServiceStore { RangerServiceDef ret = null; - WebResource webResource = restClient.getResource(REST_URL_SERVICEDEF_UPDATE + serviceDef.getId()); + WebResource webResource = createWebResource(REST_URL_SERVICEDEF_UPDATE + serviceDef.getId()); ClientResponse response = webResource.accept(REST_MIME_TYPE_JSON).type(REST_MIME_TYPE_JSON).put(ClientResponse.class, restClient.toJson(serviceDef)); if(response != null && response.getStatus() == 200) { @@ -138,7 +149,7 @@ public class ServiceRESTStore implements ServiceStore { LOG.debug("==> ServiceRESTStore.deleteServiceDef(" + id + ")"); } - WebResource webResource = restClient.getResource(REST_URL_SERVICEDEF_DELETE + id); + WebResource webResource = createWebResource(REST_URL_SERVICEDEF_DELETE + id); ClientResponse response = webResource.accept(REST_MIME_TYPE_JSON).delete(ClientResponse.class); if(response == null || (response.getStatus() != 200 && response.getStatus() != 204)) { @@ -160,7 +171,7 @@ public class ServiceRESTStore implements ServiceStore { RangerServiceDef ret = null; - WebResource webResource = restClient.getResource(REST_URL_SERVICEDEF_GET + id); + WebResource webResource = createWebResource(REST_URL_SERVICEDEF_GET + id); ClientResponse response = webResource.accept(REST_MIME_TYPE_JSON).get(ClientResponse.class); if(response != null && response.getStatus() == 200) { @@ -186,7 +197,7 @@ public class ServiceRESTStore implements ServiceStore { RangerServiceDef ret = null; - WebResource webResource = restClient.getResource(REST_URL_SERVICEDEF_GET_BY_NAME + name); + WebResource webResource = createWebResource(REST_URL_SERVICEDEF_GET_BY_NAME + name); ClientResponse response = webResource.accept(REST_MIME_TYPE_JSON).get(ClientResponse.class); if(response != null && response.getStatus() == 200) { @@ -205,14 +216,14 @@ public class ServiceRESTStore implements ServiceStore { } @Override - public List<RangerServiceDef> getAllServiceDefs() throws Exception { + public List<RangerServiceDef> getServiceDefs(SearchFilter filter) throws Exception { if(LOG.isDebugEnabled()) { - LOG.debug("==> ServiceRESTStore.getAllServiceDefs()"); + LOG.debug("==> ServiceRESTStore.getServiceDefs()"); } List<RangerServiceDef> ret = null; - WebResource webResource = restClient.getResource(REST_URL_SERVICEDEF_GET_ALL); + WebResource webResource = createWebResource(REST_URL_SERVICEDEF_GET_ALL, filter); ClientResponse response = webResource.accept(REST_MIME_TYPE_JSON).get(ClientResponse.class); if(response != null && response.getStatus() == 200) { @@ -238,7 +249,7 @@ public class ServiceRESTStore implements ServiceStore { RangerService ret = null; - WebResource webResource = restClient.getResource(REST_URL_SERVICE_CREATE); + WebResource webResource = createWebResource(REST_URL_SERVICE_CREATE); ClientResponse response = webResource.accept(REST_MIME_TYPE_JSON).type(REST_MIME_TYPE_JSON).post(ClientResponse.class, restClient.toJson(service)); if(response != null && response.getStatus() == 200) { @@ -264,7 +275,7 @@ public class ServiceRESTStore implements ServiceStore { RangerService ret = null; - WebResource webResource = restClient.getResource(REST_URL_SERVICE_UPDATE + service.getId()); + WebResource webResource = createWebResource(REST_URL_SERVICE_UPDATE + service.getId()); ClientResponse response = webResource.accept(REST_MIME_TYPE_JSON).type(REST_MIME_TYPE_JSON).put(ClientResponse.class, restClient.toJson(service)); if(response != null && response.getStatus() == 200) { @@ -288,7 +299,7 @@ public class ServiceRESTStore implements ServiceStore { LOG.debug("==> ServiceRESTStore.deleteService(" + id + ")"); } - WebResource webResource = restClient.getResource(REST_URL_SERVICE_DELETE + id); + WebResource webResource = createWebResource(REST_URL_SERVICE_DELETE + id); ClientResponse response = webResource.accept(REST_MIME_TYPE_JSON).delete(ClientResponse.class); if(response == null || (response.getStatus() != 200 && response.getStatus() != 204)) { @@ -310,7 +321,7 @@ public class ServiceRESTStore implements ServiceStore { RangerService ret = null; - WebResource webResource = restClient.getResource(REST_URL_SERVICE_GET + id); + WebResource webResource = createWebResource(REST_URL_SERVICE_GET + id); ClientResponse response = webResource.accept(REST_MIME_TYPE_JSON).get(ClientResponse.class); if(response != null && response.getStatus() == 200) { @@ -336,7 +347,7 @@ public class ServiceRESTStore implements ServiceStore { RangerService ret = null; - WebResource webResource = restClient.getResource(REST_URL_SERVICE_GET_BY_NAME + name); + WebResource webResource = createWebResource(REST_URL_SERVICE_GET_BY_NAME + name); ClientResponse response = webResource.accept(REST_MIME_TYPE_JSON).get(ClientResponse.class); if(response != null && response.getStatus() == 200) { @@ -355,14 +366,14 @@ public class ServiceRESTStore implements ServiceStore { } @Override - public List<RangerService> getAllServices() throws Exception { + public List<RangerService> getServices(SearchFilter filter) throws Exception { if(LOG.isDebugEnabled()) { - LOG.debug("==> ServiceRESTStore.getAllServices()"); + LOG.debug("==> ServiceRESTStore.getServices()"); } List<RangerService> ret = null; - WebResource webResource = restClient.getResource(REST_URL_SERVICE_GET_ALL); + WebResource webResource = createWebResource(REST_URL_SERVICE_GET_ALL, filter); ClientResponse response = webResource.accept(REST_MIME_TYPE_JSON).get(ClientResponse.class); if(response != null && response.getStatus() == 200) { @@ -374,7 +385,7 @@ public class ServiceRESTStore implements ServiceStore { } if(LOG.isDebugEnabled()) { - LOG.debug("<== ServiceRESTStore.getAllServices(): " + ret); + LOG.debug("<== ServiceRESTStore.getServices(): " + ret); } return ret; @@ -388,7 +399,7 @@ public class ServiceRESTStore implements ServiceStore { RangerPolicy ret = null; - WebResource webResource = restClient.getResource(REST_URL_POLICY_CREATE); + WebResource webResource = createWebResource(REST_URL_POLICY_CREATE); ClientResponse response = webResource.accept(REST_MIME_TYPE_JSON).type(REST_MIME_TYPE_JSON).post(ClientResponse.class, restClient.toJson(policy)); if(response != null && response.getStatus() == 200) { @@ -414,7 +425,7 @@ public class ServiceRESTStore implements ServiceStore { RangerPolicy ret = null; - WebResource webResource = restClient.getResource(REST_URL_POLICY_UPDATE + policy.getId()); + WebResource webResource = createWebResource(REST_URL_POLICY_UPDATE + policy.getId()); ClientResponse response = webResource.accept(REST_MIME_TYPE_JSON).type(REST_MIME_TYPE_JSON).put(ClientResponse.class, restClient.toJson(policy)); if(response != null && response.getStatus() == 200) { @@ -438,7 +449,7 @@ public class ServiceRESTStore implements ServiceStore { LOG.debug("==> ServiceRESTStore.deletePolicy(" + id + ")"); } - WebResource webResource = restClient.getResource(REST_URL_POLICY_DELETE + id); + WebResource webResource = createWebResource(REST_URL_POLICY_DELETE + id); ClientResponse response = webResource.accept(REST_MIME_TYPE_JSON).delete(ClientResponse.class); if(response == null || (response.getStatus() != 200 && response.getStatus() != 204)) { @@ -460,7 +471,7 @@ public class ServiceRESTStore implements ServiceStore { RangerPolicy ret = null; - WebResource webResource = restClient.getResource(REST_URL_POLICY_GET + id); + WebResource webResource = createWebResource(REST_URL_POLICY_GET + id); ClientResponse response = webResource.accept(REST_MIME_TYPE_JSON).get(ClientResponse.class); if(response != null && response.getStatus() == 200) { @@ -479,14 +490,14 @@ public class ServiceRESTStore implements ServiceStore { } @Override - public List<RangerPolicy> getAllPolicies() throws Exception { + public List<RangerPolicy> getPolicies(SearchFilter filter) throws Exception { if(LOG.isDebugEnabled()) { - LOG.debug("==> ServiceRESTStore.getAllPolicies()"); + LOG.debug("==> ServiceRESTStore.getPolicies()"); } List<RangerPolicy> ret = null; - WebResource webResource = restClient.getResource(REST_URL_POLICY_GET_ALL); + WebResource webResource = createWebResource(REST_URL_POLICY_GET_ALL, filter); ClientResponse response = webResource.accept(REST_MIME_TYPE_JSON).get(ClientResponse.class); if(response != null && response.getStatus() == 200) { @@ -498,21 +509,21 @@ public class ServiceRESTStore implements ServiceStore { } if(LOG.isDebugEnabled()) { - LOG.debug("<== ServiceRESTStore.getAllPolicies(): " + ret); + LOG.debug("<== ServiceRESTStore.getPolicies(): " + ret); } return ret; } @Override - public List<RangerPolicy> getServicePolicies(Long serviceId) throws Exception { + public List<RangerPolicy> getServicePolicies(Long serviceId, SearchFilter filter) throws Exception { if(LOG.isDebugEnabled()) { LOG.debug("==> ServiceRESTStore.getServicePolicies(" + serviceId + ")"); } List<RangerPolicy> ret = null; - WebResource webResource = restClient.getResource(REST_URL_POLICY_GET_FOR_SERVICE + serviceId); + WebResource webResource = createWebResource(REST_URL_POLICY_GET_FOR_SERVICE + serviceId, filter); ClientResponse response = webResource.accept(REST_MIME_TYPE_JSON).get(ClientResponse.class); if(response != null && response.getStatus() == 200) { @@ -531,14 +542,14 @@ public class ServiceRESTStore implements ServiceStore { } @Override - public List<RangerPolicy> getServicePolicies(String serviceName) throws Exception { + public List<RangerPolicy> getServicePolicies(String serviceName, SearchFilter filter) throws Exception { if(LOG.isDebugEnabled()) { LOG.debug("==> ServiceRESTStore.getServicePolicies(" + serviceName + ")"); } List<RangerPolicy> ret = null; - WebResource webResource = restClient.getResource(REST_URL_POLICY_GET_FOR_SERVICE_BY_NAME + serviceName); + WebResource webResource = createWebResource(REST_URL_POLICY_GET_FOR_SERVICE_BY_NAME + serviceName, filter); ClientResponse response = webResource.accept(REST_MIME_TYPE_JSON).get(ClientResponse.class); if(response != null && response.getStatus() == 200) { @@ -557,9 +568,42 @@ public class ServiceRESTStore implements ServiceStore { } @Override - public ServicePolicies getServicePoliciesIfUpdated(String serviceName, - Long lastKnownVersion) throws Exception { - // TODO Auto-generated method stub - return null; + public ServicePolicies getServicePoliciesIfUpdated(String serviceName, Long lastKnownVersion) throws Exception { + if(LOG.isDebugEnabled()) { + LOG.debug("==> ServiceRESTStore.getServicePoliciesIfUpdated(" + serviceName + ", " + lastKnownVersion + ")"); + } + + ServicePolicies ret = null; + + WebResource webResource = createWebResource(REST_URL_POLICY_GET_FOR_SERVICE_IF_UPDATED + serviceName + "/" + lastKnownVersion); + ClientResponse response = webResource.accept(REST_MIME_TYPE_JSON).get(ClientResponse.class); + + if(response != null && response.getStatus() == 200) { + ret = response.getEntity(ServicePolicies.class); + } else { + RESTResponse resp = RESTResponse.fromClientResponse(response); + + throw new Exception(resp.getMessage()); + } + + if(LOG.isDebugEnabled()) { + LOG.debug("<== ServiceRESTStore.getServicePoliciesIfUpdated(" + serviceName + ", " + lastKnownVersion + "): " + ret); + } + + return ret; + } + + private WebResource createWebResource(String url) { + return createWebResource(url, null); + } + + private WebResource createWebResource(String url, SearchFilter filter) { + WebResource ret = restClient.getResource(url); + + if(filter != null) { + // TODO: add query params for filter + } + + return ret; } } http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/ff4a817e/plugin-common/src/main/java/org/apache/ranger/plugin/util/PolicyRefresher.java ---------------------------------------------------------------------- diff --git a/plugin-common/src/main/java/org/apache/ranger/plugin/util/PolicyRefresher.java b/plugin-common/src/main/java/org/apache/ranger/plugin/util/PolicyRefresher.java index 1ff87ce..2437b3e 100644 --- a/plugin-common/src/main/java/org/apache/ranger/plugin/util/PolicyRefresher.java +++ b/plugin-common/src/main/java/org/apache/ranger/plugin/util/PolicyRefresher.java @@ -21,7 +21,6 @@ package org.apache.ranger.plugin.util; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.apache.ranger.authorization.hadoop.config.RangerConfiguration; import org.apache.ranger.plugin.policyengine.RangerPolicyEngine; import org.apache.ranger.plugin.store.ServiceStore; @@ -30,24 +29,25 @@ public class PolicyRefresher extends Thread { private static final Log LOG = LogFactory.getLog(PolicyRefresher.class); private RangerPolicyEngine policyEngine = null; + private String serviceType = null; private String serviceName = null; private ServiceStore serviceStore = null; - private ServicePolicies lastKnownPolicies = null; + private long pollingIntervalMs = 30 * 1000; - private boolean shutdownFlag = false; - private long pollingIntervalMilliSeconds = 30 * 1000; + private boolean shutdownFlag = false; + private ServicePolicies lastKnownPolicies = null; - public PolicyRefresher(RangerPolicyEngine policyEngine, String serviceName, ServiceStore serviceStore) { + public PolicyRefresher(RangerPolicyEngine policyEngine, String serviceType, String serviceName, ServiceStore serviceStore, long pollingIntervalMs, String cacheDir) { if(LOG.isDebugEnabled()) { LOG.debug("==> PolicyRefresher.PolicyRefresher(serviceName=" + serviceName + ")"); } - this.policyEngine = policyEngine; - this.serviceName = serviceName; - this.serviceStore = serviceStore; - - this.pollingIntervalMilliSeconds = RangerConfiguration.getInstance().getLong("xasecure.hdfs.policymgr.url.reloadIntervalInMillis", 30 * 1000); + this.policyEngine = policyEngine; + this.serviceType = serviceType; + this.serviceName = serviceName; + this.serviceStore = serviceStore; + this.pollingIntervalMs = pollingIntervalMs; if(LOG.isDebugEnabled()) { LOG.debug("<== PolicyRefresher.PolicyRefresher(serviceName=" + serviceName + ")"); @@ -62,6 +62,13 @@ public class PolicyRefresher extends Thread { } /** + * @return the serviceType + */ + public String getServiceType() { + return serviceType; + } + + /** * @return the serviceName */ public String getServiceName() { @@ -69,17 +76,24 @@ public class PolicyRefresher extends Thread { } /** + * @return the serviceStore + */ + public ServiceStore getServiceStore() { + return serviceStore; + } + + /** * @return the pollingIntervalMilliSeconds */ - public long getPollingIntervalMilliSeconds() { - return pollingIntervalMilliSeconds; + public long getPollingIntervalMs() { + return pollingIntervalMs; } /** * @param pollingIntervalMilliSeconds the pollingIntervalMilliSeconds to set */ public void setPollingIntervalMilliSeconds(long pollingIntervalMilliSeconds) { - this.pollingIntervalMilliSeconds = pollingIntervalMilliSeconds; + this.pollingIntervalMs = pollingIntervalMilliSeconds; } public void startRefresher() { @@ -125,7 +139,7 @@ public class PolicyRefresher extends Thread { } try { - Thread.sleep(pollingIntervalMilliSeconds); + Thread.sleep(pollingIntervalMs); } catch(Exception excp) { LOG.error("PolicyRefresher(serviceName=" + serviceName + ").run(): error while sleep. exiting thread", excp); http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/ff4a817e/plugin-common/src/test/java/org/apache/ranger/plugin/store/TestServiceStore.java ---------------------------------------------------------------------- diff --git a/plugin-common/src/test/java/org/apache/ranger/plugin/store/TestServiceStore.java b/plugin-common/src/test/java/org/apache/ranger/plugin/store/TestServiceStore.java index d0ef299..a365240 100644 --- a/plugin-common/src/test/java/org/apache/ranger/plugin/store/TestServiceStore.java +++ b/plugin-common/src/test/java/org/apache/ranger/plugin/store/TestServiceStore.java @@ -31,12 +31,14 @@ import org.apache.ranger.plugin.model.RangerPolicy.RangerPolicyItem; import org.apache.ranger.plugin.model.RangerPolicy.RangerPolicyResource; import org.apache.ranger.plugin.store.ServiceStore; import org.apache.ranger.plugin.store.ServiceStoreFactory; +import org.apache.ranger.plugin.util.SearchFilter; import org.apache.ranger.plugin.util.ServicePolicies; import org.junit.BeforeClass; import org.junit.Test; public class TestServiceStore { - static ServiceStore svcStore = null; + static ServiceStore svcStore = null; + static SearchFilter filter = null; static final String sdName = "svcDef-unit-test-TestServiceStore"; static final String serviceName = "svc-unit-test-TestServiceStore"; @@ -47,14 +49,14 @@ public class TestServiceStore { svcStore = ServiceStoreFactory.instance().getServiceStore(); // cleanup if the test service and service-def if they already exist - List<RangerService> services = svcStore.getAllServices(); + List<RangerService> services = svcStore.getServices(filter); for(RangerService service : services) { if(service.getName().startsWith(serviceName)) { svcStore.deleteService(service.getId()); } } - List<RangerServiceDef> serviceDefs = svcStore.getAllServiceDefs(); + List<RangerServiceDef> serviceDefs = svcStore.getServiceDefs(filter); for(RangerServiceDef serviceDef : serviceDefs) { if(serviceDef.getName().startsWith(sdName)) { svcStore.deleteServiceDef(serviceDef.getId()); @@ -66,7 +68,7 @@ public class TestServiceStore { public void testServiceStore() throws Exception { String updatedName, updatedDescription; - List<RangerServiceDef> sds = svcStore.getAllServiceDefs(); + List<RangerServiceDef> sds = svcStore.getServiceDefs(filter); int initSdCount = sds == null ? 0 : sds.size(); @@ -75,7 +77,7 @@ public class TestServiceStore { RangerServiceDef createdSd = svcStore.createServiceDef(sd); assertNotNull("createServiceDef() failed", createdSd != null); - sds = svcStore.getAllServiceDefs(); + sds = svcStore.getServiceDefs(filter); assertEquals("createServiceDef() failed", initSdCount + 1, sds == null ? 0 : sds.size()); updatedDescription = sd.getDescription() + ": updated"; @@ -84,7 +86,7 @@ public class TestServiceStore { assertNotNull("updateServiceDef(updatedDescription) failed", updatedSd); assertEquals("updateServiceDef(updatedDescription) failed", updatedDescription, updatedSd.getDescription()); - sds = svcStore.getAllServiceDefs(); + sds = svcStore.getServiceDefs(filter); assertEquals("updateServiceDef(updatedDescription) failed", initSdCount + 1, sds == null ? 0 : sds.size()); /* @@ -98,7 +100,7 @@ public class TestServiceStore { assertEquals("updateServiceDef(updatedName) failed", initSdCount + 1, sds == null ? 0 : sds.size()); */ - List<RangerService> services = svcStore.getAllServices(); + List<RangerService> services = svcStore.getServices(filter); int initServiceCount = services == null ? 0 : services.size(); @@ -107,7 +109,7 @@ public class TestServiceStore { RangerService createdSvc = svcStore.createService(svc); assertNotNull("createService() failed", createdSvc); - services = svcStore.getAllServices(); + services = svcStore.getServices(filter); assertEquals("createServiceDef() failed", initServiceCount + 1, services == null ? 0 : services.size()); updatedDescription = createdSvc.getDescription() + ": updated"; @@ -116,7 +118,7 @@ public class TestServiceStore { assertNotNull("updateService(updatedDescription) failed", updatedSvc); assertEquals("updateService(updatedDescription) failed", updatedDescription, updatedSvc.getDescription()); - services = svcStore.getAllServices(); + services = svcStore.getServices(filter); assertEquals("updateService(updatedDescription) failed", initServiceCount + 1, services == null ? 0 : services.size()); updatedName = serviceName + "-Renamed"; @@ -125,10 +127,10 @@ public class TestServiceStore { assertNotNull("updateService(updatedName) failed", updatedSvc); assertEquals("updateService(updatedName) failed", updatedName, updatedSvc.getName()); - services = svcStore.getAllServices(); + services = svcStore.getServices(filter); assertEquals("updateService(updatedName) failed", initServiceCount + 1, services == null ? 0 : services.size()); - List<RangerPolicy> policies = svcStore.getAllPolicies(); + List<RangerPolicy> policies = svcStore.getPolicies(filter); int initPolicyCount = policies == null ? 0 : policies.size(); @@ -171,7 +173,7 @@ public class TestServiceStore { assertNotNull(createItem2.getGroups()); assertEquals(createItem2.getGroups().size(), 1); - policies = svcStore.getAllPolicies(); + policies = svcStore.getPolicies(filter); assertEquals("createPolicy() failed", initPolicyCount + 1, policies == null ? 0 : policies.size()); updatedDescription = policy.getDescription() + ":updated"; @@ -179,7 +181,7 @@ public class TestServiceStore { RangerPolicy updatedPolicy = svcStore.updatePolicy(createdPolicy); assertNotNull("updatePolicy(updatedDescription) failed", updatedPolicy != null); - policies = svcStore.getAllPolicies(); + policies = svcStore.getPolicies(filter); assertEquals("updatePolicy(updatedDescription) failed", initPolicyCount + 1, policies == null ? 0 : policies.size()); updatedName = policyName + "-Renamed"; @@ -187,7 +189,7 @@ public class TestServiceStore { updatedPolicy = svcStore.updatePolicy(updatedPolicy); assertNotNull("updatePolicy(updatedName) failed", updatedPolicy); - policies = svcStore.getAllPolicies(); + policies = svcStore.getPolicies(filter); assertEquals("updatePolicy(updatedName) failed", initPolicyCount + 1, policies == null ? 0 : policies.size()); // rename the service; all the policies for this service should reflect the new service name @@ -197,7 +199,7 @@ public class TestServiceStore { assertNotNull("updateService(updatedName2) failed", updatedSvc); assertEquals("updateService(updatedName2) failed", updatedName, updatedSvc.getName()); - services = svcStore.getAllServices(); + services = svcStore.getServices(filter); assertEquals("updateService(updatedName2) failed", initServiceCount + 1, services == null ? 0 : services.size()); updatedPolicy = svcStore.getPolicy(createdPolicy.getId()); @@ -219,16 +221,28 @@ public class TestServiceStore { assertNotNull(updatedPolicies); assertEquals(0, updatedPolicies.getPolicies().size()); + filter = new SearchFilter(); + filter.setParam(SearchFilter.POLICY_NAME, policyName); + policies = svcStore.getPolicies(filter); + assertEquals("getPolicies(filter=origPolicyName) failed", 0, policies == null ? 0 : policies.size()); + filter = null; + + filter = new SearchFilter(); + filter.setParam(SearchFilter.POLICY_NAME, updatedPolicy.getName()); + policies = svcStore.getPolicies(filter); + assertEquals("getPolicies(filter=origPolicyName) failed", 1, policies == null ? 0 : policies.size()); + filter = null; + svcStore.deletePolicy(policy.getId()); - policies = svcStore.getAllPolicies(); + policies = svcStore.getPolicies(filter); assertEquals("deletePolicy() failed", initPolicyCount, policies == null ? 0 : policies.size()); svcStore.deleteService(svc.getId()); - services = svcStore.getAllServices(); + services = svcStore.getServices(filter); assertEquals("deleteService() failed", initServiceCount, services == null ? 0 : services.size()); svcStore.deleteServiceDef(sd.getId()); - sds = svcStore.getAllServiceDefs(); + sds = svcStore.getServiceDefs(filter); assertEquals("deleteServiceDef() failed", initSdCount, sds == null ? 0 : sds.size()); } } http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/ff4a817e/plugin-common/src/test/java/org/apache/ranger/plugin/util/TestPolicyRefresher.java ---------------------------------------------------------------------- diff --git a/plugin-common/src/test/java/org/apache/ranger/plugin/util/TestPolicyRefresher.java b/plugin-common/src/test/java/org/apache/ranger/plugin/util/TestPolicyRefresher.java index a1da8c2..3dedbec 100644 --- a/plugin-common/src/test/java/org/apache/ranger/plugin/util/TestPolicyRefresher.java +++ b/plugin-common/src/test/java/org/apache/ranger/plugin/util/TestPolicyRefresher.java @@ -78,8 +78,7 @@ public class TestPolicyRefresher { } }; - refresher = new PolicyRefresher(policyEngine, svcName, svcStore); - refresher.setPollingIntervalMilliSeconds(pollingIntervalInMs); + refresher = new PolicyRefresher(policyEngine, sdName, svcName, svcStore, pollingIntervalInMs, null); refresher.start(); // create a service http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/ff4a817e/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java ---------------------------------------------------------------------- diff --git a/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java b/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java index cfe07d0..1cfc0a8 100644 --- a/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java +++ b/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java @@ -39,6 +39,7 @@ import org.apache.ranger.plugin.model.RangerService; import org.apache.ranger.plugin.model.RangerServiceDef; import org.apache.ranger.plugin.store.ServiceStore; import org.apache.ranger.plugin.store.ServiceStoreFactory; +import org.apache.ranger.plugin.util.SearchFilter; import org.apache.ranger.plugin.util.ServicePolicies; import org.apache.ranger.view.VXResponse; import org.springframework.beans.factory.annotation.Autowired; @@ -196,8 +197,10 @@ public class ServiceREST { List<RangerServiceDef> ret = null; + SearchFilter filter = getSearchFilter(request); + try { - ret = svcStore.getAllServiceDefs(); + ret = svcStore.getServiceDefs(filter); } catch(Exception excp) { throw restErrorUtil.createRESTException(HttpServletResponse.SC_BAD_REQUEST, excp.getMessage(), true); } @@ -340,8 +343,10 @@ public class ServiceREST { List<RangerService> ret = null; + SearchFilter filter = getSearchFilter(request); + try { - ret = svcStore.getAllServices(); + ret = svcStore.getServices(filter); } catch(Exception excp) { throw restErrorUtil.createRESTException(HttpServletResponse.SC_BAD_REQUEST, excp.getMessage(), true); } @@ -506,8 +511,10 @@ public class ServiceREST { List<RangerPolicy> ret = null; + SearchFilter filter = getSearchFilter(request); + try { - ret = svcStore.getAllPolicies(); + ret = svcStore.getPolicies(filter); } catch(Exception excp) { throw restErrorUtil.createRESTException(HttpServletResponse.SC_BAD_REQUEST, excp.getMessage(), true); } @@ -522,7 +529,7 @@ public class ServiceREST { @GET @Path("/policies/count") @Produces({ "application/json", "application/xml" }) - public Long countPolicies(@Context HttpServletRequest request) { + public Long countPolicies( @Context HttpServletRequest request) { if(LOG.isDebugEnabled()) { LOG.debug("==> ServiceREST.countPolicies():"); } @@ -554,8 +561,10 @@ public class ServiceREST { List<RangerPolicy> ret = null; + SearchFilter filter = getSearchFilter(request); + try { - ret = svcStore.getServicePolicies(serviceId); + ret = svcStore.getServicePolicies(serviceId, filter); } catch(Exception excp) { throw restErrorUtil.createRESTException(HttpServletResponse.SC_BAD_REQUEST, excp.getMessage(), true); } @@ -581,8 +590,10 @@ public class ServiceREST { List<RangerPolicy> ret = null; + SearchFilter filter = getSearchFilter(request); + try { - ret = svcStore.getServicePolicies(serviceName); + ret = svcStore.getServicePolicies(serviceName, filter); } catch(Exception excp) { throw restErrorUtil.createRESTException(HttpServletResponse.SC_BAD_REQUEST, excp.getMessage(), true); } @@ -624,4 +635,13 @@ public class ServiceREST { return ret; } + + + private SearchFilter getSearchFilter(HttpServletRequest request) { + SearchFilter ret = null; + + // TODO: create SearchFilter from HttpServletRequest params + + return ret; + } }
