X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fconfig%2Fconfig-manager%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fconfig%2Fmanager%2Fimpl%2Fosgi%2FConfigManagerActivator.java;h=be602e5b2a31fb07f90f837fc81ff63d8d16ebc4;hp=1ee6cca7e22f86b1eb634b3c94c71ee503cd1a84;hb=f43b01b81319959b1907e3e04537f5169e7f33d8;hpb=d7c85bd358cf443737a1b272a78c5e46d66d8270 diff --git a/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/osgi/ConfigManagerActivator.java b/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/osgi/ConfigManagerActivator.java index 1ee6cca7e2..d1c3d767bf 100644 --- a/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/osgi/ConfigManagerActivator.java +++ b/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/osgi/ConfigManagerActivator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. + * Copyright (c) 2013, 2017 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, @@ -8,75 +8,164 @@ package org.opendaylight.controller.config.manager.impl.osgi; import java.lang.management.ManagementFactory; - +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import javax.management.InstanceAlreadyExistsException; import javax.management.MBeanServer; - +import org.opendaylight.controller.config.api.ConfigRegistry; +import org.opendaylight.controller.config.api.ConfigSystemService; import org.opendaylight.controller.config.manager.impl.ConfigRegistryImpl; import org.opendaylight.controller.config.manager.impl.jmx.ConfigRegistryJMXRegistrator; +import org.opendaylight.controller.config.manager.impl.jmx.JMXNotifierConfigRegistry; +import org.opendaylight.controller.config.manager.impl.osgi.mapping.BindingContextProvider; +import org.opendaylight.controller.config.manager.impl.osgi.mapping.ModuleInfoBundleTracker; +import org.opendaylight.controller.config.manager.impl.osgi.mapping.RefreshingSCPModuleInfoRegistry; +import org.opendaylight.controller.config.manager.impl.util.OsgiRegistrationUtil; import org.opendaylight.controller.config.spi.ModuleFactory; +import org.opendaylight.mdsal.binding.generator.api.ClassLoadingStrategy; +import org.opendaylight.mdsal.binding.generator.impl.ModuleInfoBackedContext; +import org.opendaylight.yangtools.concepts.ObjectRegistration; +import org.opendaylight.yangtools.yang.binding.YangModuleInfo; +import org.osgi.framework.Bundle; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; -import org.osgi.framework.ServiceRegistration; +import org.osgi.framework.BundleEvent; +import org.osgi.framework.SynchronousBundleListener; +import org.osgi.util.tracker.BundleTracker; import org.osgi.util.tracker.ServiceTracker; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class ConfigManagerActivator implements BundleActivator { - private static final Logger logger = LoggerFactory - .getLogger(ConfigManagerActivator.class); +public class ConfigManagerActivator implements BundleActivator, SynchronousBundleListener, ConfigSystemService { + + private static final Logger LOG = LoggerFactory.getLogger(ConfigManagerActivator.class); + + private static final long SYSTEM_BUNDLE_ID = 0; + + private final MBeanServer configMBeanServer = ManagementFactory.getPlatformMBeanServer(); + + private AutoCloseable autoCloseable; - private ExtenderBundleTracker extenderBundleTracker; private ConfigRegistryImpl configRegistry; - private ConfigRegistryJMXRegistrator configRegistryJMXRegistrator; - private ServiceRegistration configRegistryServiceRegistration; @Override - public void start(BundleContext context) throws Exception { - BundleContextBackedModuleFactoriesResolver bundleContextBackedModuleFactoriesResolver = - new BundleContextBackedModuleFactoriesResolver(context); - MBeanServer configMBeanServer = ManagementFactory.getPlatformMBeanServer(); - configRegistry = new ConfigRegistryImpl( - bundleContextBackedModuleFactoriesResolver, configMBeanServer); - - // register config registry to OSGi - configRegistryServiceRegistration = context.registerService(ConfigRegistryImpl.class, configRegistry, null); - - // register config registry to jmx - configRegistryJMXRegistrator = new ConfigRegistryJMXRegistrator(configMBeanServer); - configRegistryJMXRegistrator.registerToJMX(configRegistry); - - // track bundles containing factories - extenderBundleTracker = new ExtenderBundleTracker(context); - extenderBundleTracker.open(); - - BlankTransactionServiceTracker customizer = new BlankTransactionServiceTracker(configRegistry); - ServiceTracker serviceTracker = new ServiceTracker(context, ModuleFactory.class, customizer); - serviceTracker.open(); + public void start(final BundleContext context) { + LOG.info("Config manager starting..."); + try { + // the inner strategy is backed by thread context cl? + final ModuleInfoBackedContext moduleInfoBackedContext = ModuleInfoBackedContext.create(); + + final BindingContextProvider bindingContextProvider = new BindingContextProvider(); + + final RefreshingSCPModuleInfoRegistry moduleInfoRegistryWrapper = new RefreshingSCPModuleInfoRegistry( + moduleInfoBackedContext, moduleInfoBackedContext, moduleInfoBackedContext, moduleInfoBackedContext, + bindingContextProvider, context); + + final ModuleInfoBundleTracker moduleInfoBundleTracker = new ModuleInfoBundleTracker( + moduleInfoRegistryWrapper); + + // start config registry + final BundleContextBackedModuleFactoriesResolver bundleContextBackedModuleFactoriesResolver = + new BundleContextBackedModuleFactoriesResolver(context); + this.configRegistry = new ConfigRegistryImpl(bundleContextBackedModuleFactoriesResolver, + this.configMBeanServer, bindingContextProvider); + + // track bundles containing factories + final BlankTransactionServiceTracker blankTransactionServiceTracker = new BlankTransactionServiceTracker( + this.configRegistry); + final ModuleFactoryBundleTracker moduleFactoryTracker = new ModuleFactoryBundleTracker( + blankTransactionServiceTracker); + + BundleTracker>> moduleInfoResolvedBundleTracker = + new BundleTracker<>(context, Bundle.RESOLVED | Bundle.STARTING | Bundle.STOPPING | Bundle.ACTIVE, + moduleInfoBundleTracker); + ExtensibleBundleTracker moduleFactoryBundleTracker = new ExtensibleBundleTracker<>(context, + moduleFactoryTracker); + moduleInfoBundleTracker.open(moduleInfoResolvedBundleTracker); + + // start extensible tracker + moduleFactoryBundleTracker.open(); + + // Wrap config registry with JMX notification publishing adapter + final JMXNotifierConfigRegistry notifyingConfigRegistry = new JMXNotifierConfigRegistry(this.configRegistry, + this.configMBeanServer); + + // register config registry to OSGi + final AutoCloseable clsReg = OsgiRegistrationUtil.registerService(context, moduleInfoBackedContext, + ClassLoadingStrategy.class); + final AutoCloseable configRegReg = OsgiRegistrationUtil.registerService(context, notifyingConfigRegistry, + ConfigRegistry.class); + + // register config registry to jmx + final ConfigRegistryJMXRegistrator configRegistryJMXRegistrator = new ConfigRegistryJMXRegistrator( + this.configMBeanServer); + try { + configRegistryJMXRegistrator.registerToJMXNoNotifications(this.configRegistry); + } catch (final InstanceAlreadyExistsException e) { + configRegistryJMXRegistrator.close(); + throw new IllegalStateException("Config Registry was already registered to JMX", e); + } + + // register config registry to jmx + final ConfigRegistryJMXRegistrator configRegistryJMXRegistratorWithNotifications = + new ConfigRegistryJMXRegistrator(this.configMBeanServer); + try { + configRegistryJMXRegistrator.registerToJMX(notifyingConfigRegistry); + } catch (final InstanceAlreadyExistsException e) { + configRegistryJMXRegistrator.close(); + configRegistryJMXRegistratorWithNotifications.close(); + throw new IllegalStateException("Config Registry was already registered to JMX", e); + } + + // TODO wire directly via moduleInfoBundleTracker + final ServiceTracker serviceTracker = new ServiceTracker<>(context, + ModuleFactory.class, blankTransactionServiceTracker); + serviceTracker.open(); + + final AutoCloseable configMgrReg = OsgiRegistrationUtil.registerService(context, this, + ConfigSystemService.class); + + final List list = Arrays.asList(bindingContextProvider, clsReg, + OsgiRegistrationUtil.wrap(moduleFactoryBundleTracker), moduleInfoBundleTracker, configRegReg, + configRegistryJMXRegistrator, configRegistryJMXRegistratorWithNotifications, + OsgiRegistrationUtil.wrap(serviceTracker), moduleInfoRegistryWrapper, notifyingConfigRegistry, + configMgrReg); + this.autoCloseable = OsgiRegistrationUtil.aggregate(list); + + context.addBundleListener(this); + } catch (final IllegalStateException e) { + LOG.error("Error starting config manager", e); + } + + LOG.info("Config manager start complete"); + } + + @Override + public void stop(final BundleContext context) throws Exception { + LOG.info("Config manager stopping"); + context.removeBundleListener(this); + this.autoCloseable.close(); } @Override - public void stop(BundleContext context) throws Exception { - try { - configRegistry.close(); - } catch (Exception e) { - logger.warn("Exception while closing config registry", e); - } - try { - extenderBundleTracker.close(); - } catch (Exception e) { - logger.warn("Exception while closing extender", e); + public void bundleChanged(final BundleEvent event) { + if (this.configRegistry == null) { + return; } - try { - configRegistryJMXRegistrator.close(); - } catch (Exception e) { - logger.warn( - "Exception while closing config registry jmx registrator", - e); + + // If the system bundle (id 0) is stopping close the ConfigRegistry so it + // destroys all modules. On + // shutdown the system bundle is stopped first. + if (event.getBundle().getBundleId() == SYSTEM_BUNDLE_ID && event.getType() == BundleEvent.STOPPING) { + this.configRegistry.close(); } - try { - configRegistryServiceRegistration.unregister(); - } catch (Exception e) { - logger.warn("Exception while unregistering config registry", e); + } + + @Override + public void closeAllConfigModules() { + if (this.configRegistry != null) { + this.configRegistry.close(); } } }