public void clean() { try { for (; ; ) { Configuration[] configs = configurationAdmin.listConfigurations( "(|(service.factoryPid=org.fusesource.fabric.zookeeper.server)(service.pid=org.fusesource.fabric.zookeeper))"); if (configs != null && configs.length > 0) { for (Configuration config : configs) { config.delete(); } Thread.sleep(100); } else { break; } } File zkDir = new File("data/zookeeper"); if (zkDir.isDirectory()) { File newZkDir = new File("data/zookeeper." + System.currentTimeMillis()); if (!zkDir.renameTo(newZkDir)) { newZkDir = zkDir; } delete(newZkDir); } } catch (Exception e) { throw new FabricException("Unable to delete zookeeper configuration", e); } }
@Test public void testConfigurationEventAdded() throws Exception { String testPid = SecuredCommandConfigTransformer.PROXY_COMMAND_ACL_PID_PREFIX + "test123"; Configuration conf = EasyMock.createMock(Configuration.class); EasyMock.expect(conf.getPid()).andReturn(testPid).anyTimes(); EasyMock.replay(conf); ConfigurationAdmin cm = EasyMock.createMock(ConfigurationAdmin.class); EasyMock.expect(cm.listConfigurations(EasyMock.isA(String.class))).andReturn(null).anyTimes(); EasyMock.expect(cm.getConfiguration(testPid)).andReturn(conf).anyTimes(); EasyMock.replay(cm); final List<String> generateCalled = new ArrayList<String>(); SecuredCommandConfigTransformer scct = new SecuredCommandConfigTransformer() { @Override void generateServiceGuardConfig(Configuration config) throws IOException { generateCalled.add(config.getPid()); } }; scct.setConfigAdmin(cm); scct.init(); @SuppressWarnings("unchecked") ServiceReference<ConfigurationAdmin> cmRef = EasyMock.createMock(ServiceReference.class); EasyMock.replay(cmRef); ConfigurationEvent event = new ConfigurationEvent(cmRef, ConfigurationEvent.CM_UPDATED, null, testPid); assertEquals("Precondition", 0, generateCalled.size()); scct.configurationEvent(event); assertEquals(1, generateCalled.size()); assertEquals(testPid, generateCalled.iterator().next()); }
@Test public void testConfigurationEventDeletedNonScope() throws Exception { String testPid = SecuredCommandConfigTransformer.PROXY_COMMAND_ACL_PID_PREFIX + "abc.def"; ConfigurationAdmin cm = EasyMock.createMock(ConfigurationAdmin.class); EasyMock.expect(cm.listConfigurations(EasyMock.isA(String.class))).andReturn(null).anyTimes(); EasyMock.replay(cm); SecuredCommandConfigTransformer scct = new SecuredCommandConfigTransformer(); scct.setConfigAdmin(cm); scct.init(); @SuppressWarnings("unchecked") ServiceReference<ConfigurationAdmin> cmRef = EasyMock.createMock(ServiceReference.class); EasyMock.replay(cmRef); ConfigurationEvent event = new ConfigurationEvent(cmRef, ConfigurationEvent.CM_DELETED, null, testPid); EasyMock.reset(cm); // Do not expect any further calls to cm... EasyMock.replay(cm); scct.configurationEvent(event); EasyMock.verify(cm); }
public static Configuration[] getConfigurationsFor(BundleContext bundleContext, String factoryPid) throws IOException, InvalidSyntaxException { ConfigurationAdmin configurationAdminService = getConfigurationAdminService(bundleContext); Configuration[] modeShapeRepositoryConfigurations = configurationAdminService.listConfigurations( "(" + ConfigurationAdmin.SERVICE_FACTORYPID + "=" + factoryPid + ")"); return modeShapeRepositoryConfigurations; }
public void init() { synchronized (this.monitor) { try { for (Configuration configuration : configurationAdmin.listConfigurations(null)) { exportConfiguration(configuration.getPid()); } } catch (Exception e) { logger.warn("Could not enumerate existing configurations"); } } }
@Test public void testConfigurationEventDeleted() throws Exception { String testPid = SecuredCommandConfigTransformer.PROXY_COMMAND_ACL_PID_PREFIX + "test123"; ConfigurationAdmin cm = EasyMock.createMock(ConfigurationAdmin.class); EasyMock.expect(cm.listConfigurations(EasyMock.isA(String.class))).andReturn(null).anyTimes(); EasyMock.replay(cm); SecuredCommandConfigTransformer scct = new SecuredCommandConfigTransformer(); scct.setConfigAdmin(cm); scct.init(); @SuppressWarnings("unchecked") ServiceReference<ConfigurationAdmin> cmRef = EasyMock.createMock(ServiceReference.class); EasyMock.replay(cmRef); ConfigurationEvent event = new ConfigurationEvent(cmRef, ConfigurationEvent.CM_DELETED, null, testPid); Configuration c1 = EasyMock.createMock(Configuration.class); c1.delete(); EasyMock.expectLastCall().once(); EasyMock.replay(c1); Configuration c2 = EasyMock.createMock(Configuration.class); c2.delete(); EasyMock.expectLastCall().once(); EasyMock.replay(c2); EasyMock.reset(cm); EasyMock.expect( cm.listConfigurations("(service.pid=org.apache.karaf.service.acl.command.test123.*)")) .andReturn(new Configuration[] {c1, c2}) .once(); EasyMock.replay(cm); scct.configurationEvent(event); EasyMock.verify(cm); EasyMock.verify(c1); EasyMock.verify(c2); }
private Configuration getLogConfiguration() throws IOException { Configuration logConfiguration = null; try { Configuration[] configs = configurationAdmin.listConfigurations("(" + LOGGER_KEY + "=" + LOGGER_VAL + ")"); if (configs != null && configs.length > 0) { logConfiguration = configs[0]; } } catch (InvalidSyntaxException e) { // ignore this as we'll create what we need } return logConfiguration; }
public static void toJSON(ConfigurationAdmin admin, Writer osw, String filter) throws Exception { Configuration[] list = admin.listConfigurations(filter); Encoder encoder = codec.enc().to(osw); Protocol p = new Protocol(); p.version = 1; p.date = new Date(); p.size = list.length; encoder.put(p).append('\n'); if (list != null) for (Configuration c : list) { Dictionary<String, Object> d = c.getProperties(); Export export = new Export(); export.values = new HashMap<String, Object>(); export.factoryPid = c.getFactoryPid(); export.pid = c.getPid(); for (Enumeration<String> e = d.keys(); e.hasMoreElements(); ) { String k = e.nextElement(); Object v = d.get(k); if (!(v instanceof String)) { if (export.types == null) export.types = new HashMap<String, Type>(); Type type = new Type(); Class<?> clazz = v.getClass(); if (v instanceof Collection) { Collection<?> coll = (Collection<?>) v; clazz = String.class; if (coll.size() > 0) type.vectorOf = shortName(coll.iterator().next().getClass()); else type.vectorOf = shortName(String.class); } else if (v.getClass().isArray()) { type.arrayOf = shortName(clazz.getComponentType()); } else type.scalar = shortName(v.getClass()); export.types.put(k, type); } export.values.put(k, v); } encoder.mark().put(export); // encoder.put(encoder.digest()); encoder.append('\n'); } osw.flush(); }
@Test public void testEmptyConfigurationsSource() throws IOException, InvalidSyntaxException { configureActionProvider(); actionProvider.setConfigurationAdmin(configurationAdmin); Configuration[] configurations = new Configuration[0]; when(source.getId()).thenReturn(SAMPLE_SOURCE_ID); when(configurationAdmin.listConfigurations(String.format("(id=%s)", SAMPLE_SOURCE_ID))) .thenReturn(configurations); List<Action> actions = actionProvider.getActions(source); assertThat(actions.size(), is(0)); }
protected void deleteFactoryConfigurations(String factoryPid) { ConfigurationAdmin ca = getConfigurationAdmin(); try { final String filter = "(service.factoryPid=" + factoryPid + ")"; Configuration[] configs = ca.listConfigurations(filter); if (configs != null) { for (Configuration configuration : configs) { configuration.delete(); } } } catch (InvalidSyntaxException ise) { // unexpected } catch (IOException ioe) { TestCase.fail("Failed deleting configurations " + factoryPid + ": " + ioe.toString()); } }
protected Configuration getConfiguration(final String pid) { final ConfigurationAdmin ca = getConfigurationAdmin(); try { final String filter = "(" + Constants.SERVICE_PID + "=" + pid + ")"; final Configuration[] configs = ca.listConfigurations(filter); if (configs != null && configs.length > 0) { return configs[0]; } } catch (InvalidSyntaxException ise) { // unexpected } catch (IOException ioe) { TestCase.fail("Failed listing configurations " + pid + ": " + ioe.toString()); } TestCase.fail("No Configuration " + pid + " found"); return null; }
private Configuration findExistingConfiguration(String pid, String instanceKey) throws IOException, InvalidSyntaxException { String filter = "(&(" + ConfigurationAdmin.SERVICE_FACTORYPID + "=" + pid + ")(" + OSGI_PROPERTY_KEY_FACTORY_INSTANCE_KEY + "=" + instanceKey + "))"; Configuration[] configurations = configurationAdmin.listConfigurations(filter); if (configurations != null && configurations.length > 0) { return configurations[0]; } else { return null; } }
@Test public void testConfigurationEventAddedNonCommand() throws Exception { ConfigurationAdmin cm = EasyMock.createMock(ConfigurationAdmin.class); EasyMock.expect(cm.listConfigurations(EasyMock.isA(String.class))).andReturn(null).anyTimes(); EasyMock.replay(cm); SecuredCommandConfigTransformer scct = new SecuredCommandConfigTransformer(); scct.setConfigAdmin(cm); scct.init(); @SuppressWarnings("unchecked") ServiceReference<ConfigurationAdmin> cmRef = EasyMock.createMock(ServiceReference.class); EasyMock.replay(cmRef); ConfigurationEvent event = new ConfigurationEvent(cmRef, ConfigurationEvent.CM_UPDATED, null, "test123"); scct.configurationEvent(event); EasyMock.verify(cm); // Ensure that this doesn't cause any unwanted calls on ConfigAdmin }
public List<String> getEnsembleContainers() { try { Configuration[] configs = configurationAdmin.listConfigurations("(service.pid=org.fusesource.fabric.zookeeper)"); if (configs == null || configs.length == 0) { return Collections.emptyList(); } List<String> list = new ArrayList<String>(); if (zooKeeper.exists(ZkPath.CONFIG_ENSEMBLES.getPath()) != null) { String clusterId = ZooKeeperRetriableUtils.get(zooKeeper, ZkPath.CONFIG_ENSEMBLES.getPath()); String containers = ZooKeeperRetriableUtils.get(zooKeeper, ZkPath.CONFIG_ENSEMBLE.getPath(clusterId)); Collections.addAll(list, containers.split(",")); } return list; } catch (Exception e) { throw new FabricException("Unable to load zookeeper quorum containers", e); } }
protected void cleanupConfigurationAdmin() throws IOException, InvalidSyntaxException { Configuration[] configurations = admin.listConfigurations(null); if (configurations != null) { for (Configuration conf : configurations) { if (!conf.getPid().contains("instantiated.at.boot")) { conf.delete(); } } } await() .atMost(1, TimeUnit.MINUTES) .until( new Callable<Boolean>() { @Override public Boolean call() throws Exception { return osgi.getServiceObject(MyComponent.class) == null; } }); }
@Test public void testConfigurationLocationChangedEventNoEffect() throws Exception { String testPid = SecuredCommandConfigTransformer.PROXY_COMMAND_ACL_PID_PREFIX + "test123"; ConfigurationAdmin cm = EasyMock.createMock(ConfigurationAdmin.class); EasyMock.expect(cm.listConfigurations(EasyMock.isA(String.class))).andReturn(null).anyTimes(); EasyMock.replay(cm); SecuredCommandConfigTransformer scct = new SecuredCommandConfigTransformer(); scct.setConfigAdmin(cm); scct.init(); @SuppressWarnings("unchecked") ServiceReference<ConfigurationAdmin> cmRef = EasyMock.createMock(ServiceReference.class); EasyMock.replay(cmRef); ConfigurationEvent event = new ConfigurationEvent(cmRef, ConfigurationEvent.CM_LOCATION_CHANGED, null, testPid); scct.configurationEvent(event); EasyMock.verify(cm); // Ensure that this doesn't cause any unwanted calls on ConfigAdmin }
/** * Constructor for configuration resource manager * * @param configAdmin {@code ConfigurationAdmin} */ public ConfigAdminResourceManager(Object configAdmin) { super(CONFIG_PATH); this.m_configAdmin = (ConfigurationAdmin) configAdmin; this.m_configListener = new ConfigurationListenerHandler(); setRelations( new DefaultRelation( getPath(), Action.CREATE, "create", new DefaultParameter() .name(BUNDLE_LOCATION) .description("bundle location") .type(String.class) .optional(false), new DefaultParameter() .name(PID) .description("Persistent id of configuration") .type(String.class) .optional(true), new DefaultParameter() .name(FACTORY_PID) .description("Persistent id of factory pid") .type(String.class) .optional(true))); try { Configuration[] configs = m_configAdmin.listConfigurations(null); if (configs != null) { for (Configuration cfg : configs) { m_configurationResourceMap.put(cfg.getPid(), new ConfigurationResource(cfg)); } } } catch (IOException e) { // well, this may happen.. throw new RuntimeException(e.getMessage()); } catch (InvalidSyntaxException e) { // should never happen.. throw new RuntimeException(e.getMessage()); } }
/** * Search the configuration admin for the specified factoryPid that refers to the provider. * * @param factoryPid * @param provider * @return * @throws java.io.IOException */ private static Configuration findOrCreateFactoryConfiguration( ConfigurationAdmin configurationAdmin, String factoryPid, String provider) throws IOException { Configuration configuration = null; if (configurationAdmin != null) { try { Configuration[] configurations = configurationAdmin.listConfigurations(String.format(FACTORY_FILTER, factoryPid)); if (configurations != null) { for (Configuration conf : configurations) { Dictionary dictionary = conf.getProperties(); if (dictionary != null && provider.equals(dictionary.get("provider"))) { return conf; } } } } catch (Exception e) { LOGGER.warn("Failed to lookup configuration admin for existing cloud providers.", e); } LOGGER.debug("No configuration found with factoryPid org.jclouds.compute. Creating new one."); configuration = configurationAdmin.createFactoryConfiguration(factoryPid, null); } return configuration; }
@Test public void testTransformation() throws Exception { Dictionary<String, Object> props = new Hashtable<String, Object>(); props.put("foo", "a,b,c"); props.put("bar[/.*[a]+*/]", "d"); props.put("bar", "e"); props.put("zar[/.*HiThere*/]", "f"); props.put("service.pid", SecuredCommandConfigTransformer.PROXY_COMMAND_ACL_PID_PREFIX + "abc"); Configuration commandConfig = mockConfiguration(props); Dictionary<String, Object> props2 = new Hashtable<String, Object>(); props2.put("xxx", "yyy"); props2.put( "service.pid", SecuredCommandConfigTransformer.PROXY_COMMAND_ACL_PID_PREFIX + "xyz.123"); Configuration commandConfig2 = mockConfiguration(props2); Dictionary<String, Object> props3 = new Hashtable<String, Object>(); props3.put("test", "toast"); props3.put("service.pid", "xyz.123"); Configuration otherConfig = mockConfiguration(props3); final Map<String, Configuration> configurations = new HashMap<String, Configuration>(); ConfigurationAdmin ca = EasyMock.createMock(ConfigurationAdmin.class); EasyMock.expect( ca.listConfigurations( "(service.pid=" + SecuredCommandConfigTransformer.PROXY_COMMAND_ACL_PID_PREFIX + "*)")) .andReturn(new Configuration[] {commandConfig, commandConfig2, otherConfig}) .anyTimes(); EasyMock.expect(ca.getConfiguration(EasyMock.isA(String.class))) .andAnswer( new IAnswer<Configuration>() { @Override public Configuration answer() throws Throwable { String pid = (String) EasyMock.getCurrentArguments()[0]; Configuration c = configurations.get(pid); if (c == null) { c = EasyMock.createMock(Configuration.class); // Put some expectations in the various mocks Dictionary<String, Object> m = new Hashtable<String, Object>(); if ("org.apache.karaf.service.acl.command.abc.foo".equals(pid)) { m.put( "service.guard", "(&(osgi.command.scope=abc)(osgi.command.function=foo))"); m.put("execute", "a,b,c"); m.put("foo", "a,b,c"); } else if ("org.apache.karaf.service.acl.command.abc.bar".equals(pid)) { m.put( "service.guard", "(&(osgi.command.scope=abc)(osgi.command.function=bar))"); m.put("execute[/.*/,/.*[a]+*/]", "d"); m.put("execute", "e"); m.put("bar[/.*[a]+*/]", "d"); m.put("bar", "e"); } else if ("org.apache.karaf.service.acl.command.abc.zar".equals(pid)) { m.put( "service.guard", "(&(osgi.command.scope=abc)(osgi.command.function=zar))"); m.put("execute[/.*/,/.*HiThere*/]", "f"); m.put("zar[/.*HiThere*/]", "f"); } else { fail("Unexpected PID: " + pid); } m.put("*", "*"); c.update(m); EasyMock.expectLastCall().once(); EasyMock.replay(c); configurations.put(pid, c); } return c; } }) .anyTimes(); EasyMock.replay(ca); SecuredCommandConfigTransformer scct = new SecuredCommandConfigTransformer(); scct.setConfigAdmin(ca); scct.init(); assertEquals(3, configurations.size()); boolean foundFoo = false; boolean foundBar = false; boolean foundZar = false; for (Map.Entry<String, Configuration> entry : configurations.entrySet()) { Configuration c = entry.getValue(); EasyMock.verify(c); if ("org.apache.karaf.service.acl.command.abc.foo".equals(entry.getKey())) { foundFoo = true; } else if ("org.apache.karaf.service.acl.command.abc.bar".equals(entry.getKey())) { foundBar = true; } else if ("org.apache.karaf.service.acl.command.abc.zar".equals(entry.getKey())) { foundZar = true; } } assertTrue(foundFoo); assertTrue(foundBar); assertTrue(foundZar); }
/** * If we have access to {@link ConfigurationAdmin}, we can add RBAC information * * @param result */ @Override @SuppressWarnings("unchecked") public void decorate(Map<String, Object> result) throws Exception { try { ServiceReference<ConfigurationAdmin> cmRef = bundleContext.getServiceReference(ConfigurationAdmin.class); ServiceReference<JMXSecurityMBean> jmxSecRef = bundleContext.getServiceReference(JMXSecurityMBean.class); if (cmRef != null && jmxSecRef != null) { ConfigurationAdmin configAdmin = bundleContext.getService(cmRef); JMXSecurityMBean jmxSec = bundleContext.getService(jmxSecRef); if (configAdmin != null && jmxSec != null) { // 1. each pair of MBean/operation has to be marked with RBAC flag (can/can't invoke) // 2. the information is provided by // org.apache.karaf.management.JMXSecurityMBean.canInvoke(java.util.Map) // 3. we'll peek into available configadmin jmx.acl* configs, to see which // MBeans/operations have to // be examined and which will produce same results // 4. only then we'll prepare Map as parameter for canInvoke() Configuration[] configurations = configAdmin.listConfigurations("(service.pid=jmx.acl*)"); List<String> allJmxAclPids = new LinkedList<>(); for (Configuration cfg : configurations) { allJmxAclPids.add(cfg.getPid()); } if (allJmxAclPids.size() == 0) { return; } Map<String, Map<String, Object>> domains = (Map<String, Map<String, Object>>) result.get("domains"); // cache contains MBeanInfos for different MBeans/ObjectNames Map<String, Map<String, Object>> cache = (Map<String, Map<String, Object>>) result.get("cache"); // new cache will contain MBeanInfos + RBAC info Map<String, Map<String, Object>> rbacCache = new HashMap<>(); // the fact that some MBeans share JSON MBeanInfo doesn't mean that they can share RBAC // info // - each MBean's name may have RBAC information configured in different PIDs. // when iterating through all reapeating MBeans that share MBeanInfo (that doesn't have // RBAC info // yet), we have to decide if it'll use shared info after RBAC check or will switch to // dedicated // info. we have to be careful not to end with most MBeans *not* sharing MBeanInfo (in // case if // somehow the shared info will be "special case" from RBAC point of view) Map<String, List<String>> queryForMBeans = new HashMap<>(); Map<String, List<String>> queryForMBeanOperations = new HashMap<>(); for (String domain : domains.keySet()) { Map<String, Object> domainMBeansCheck = new HashMap<>(domains.get(domain)); Map<String, Object> domainMBeans = domains.get(domain); for (String name : domainMBeansCheck.keySet()) { Object mBeanInfo = domainMBeansCheck.get(name); String fullName = domain + ":" + name; ObjectName n = new ObjectName(fullName); if (mBeanInfo instanceof Map) { // not shared JSONified MBeanInfo prepareKarafRbacInvocations( fullName, (Map<String, Object>) mBeanInfo, queryForMBeans, queryForMBeanOperations); } else /*if (mBeanInfo instanceof String)*/ { // shared JSONified MBeanInfo // shard mbeanNames sharing MBeanInfo by the hierarchy of jmx.acl* PIDs used to // check RBAC info String key = (String) mBeanInfo; String pidListKey = pidListKey(allJmxAclPids, n); if (!rbacCache.containsKey(key + ":" + pidListKey)) { // shallow copy - we can share op/not/attr/desc, but we put specific // canInvoke/opByString keys HashMap<String, Object> sharedMBeanAndRbacInfo = new HashMap<>(cache.get(key)); rbacCache.put(key + ":" + pidListKey, sharedMBeanAndRbacInfo); // we'll be checking RBAC only for single (first) MBean having this pidListKey prepareKarafRbacInvocations( fullName, sharedMBeanAndRbacInfo, queryForMBeans, queryForMBeanOperations); } // switch key from shared MBeanInfo-only to shared MBean+RbacInfo domainMBeans.put(name, key + ":" + pidListKey); } } } // RBAC per MBeans (can invoke *any* operation or attribute?) TabularData dataForMBeans = jmxSec.canInvoke(queryForMBeans); Collection<?> results = dataForMBeans.values(); for (Object cd : results) { ObjectName objectName = new ObjectName((String) ((CompositeData) cd).get("ObjectName")); boolean canInvoke = ((CompositeData) cd).get("CanInvoke") != null ? (Boolean) ((CompositeData) cd).get("CanInvoke") : false; Object mBeanInfoOrKey = domains.get(objectName.getDomain()).get(objectName.getKeyPropertyListString()); Map<String, Object> mBeanInfo; if (mBeanInfoOrKey instanceof Map) { mBeanInfo = (Map<String, Object>) mBeanInfoOrKey; } else /*if (mBeanInfoOrKey instanceof String) */ { mBeanInfo = rbacCache.get(mBeanInfoOrKey.toString()); } if (mBeanInfo != null) { mBeanInfo.put("canInvoke", canInvoke); } } // RBAC per { MBean,operation } (can invoke status for each operation) TabularData dataForMBeanOperations = jmxSec.canInvoke(queryForMBeanOperations); results = dataForMBeanOperations.values(); for (Object cd : results) { ObjectName objectName = new ObjectName((String) ((CompositeData) cd).get("ObjectName")); String method = (String) ((CompositeData) cd).get("Method"); boolean canInvoke = ((CompositeData) cd).get("CanInvoke") != null ? (Boolean) ((CompositeData) cd).get("CanInvoke") : false; Object mBeanInfoOrKey = domains.get(objectName.getDomain()).get(objectName.getKeyPropertyListString()); Map<String, Object> mBeanInfo; if (mBeanInfoOrKey instanceof Map) { mBeanInfo = (Map<String, Object>) mBeanInfoOrKey; } else /*if (mBeanInfoOrKey instanceof String) */ { mBeanInfo = rbacCache.get(mBeanInfoOrKey.toString()); } if (mBeanInfo != null) { ((Map<String, Object>) ((Map<String, Object>) mBeanInfo.get("opByString")).get(method)) .put("canInvoke", canInvoke); } } result.remove("cache"); result.put("cache", rbacCache); } } } catch (Exception e) { LOG.error(e.getMessage(), e); // simply do not decorate } }