import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderContext;
import org.opendaylight.protocol.bgp.parser.spi.MessageRegistry;
import org.opendaylight.protocol.bgp.parser.spi.SubsequentAddressFamilyRegistry;
+import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionProviderContext;
+import org.opendaylight.protocol.bgp.rib.spi.SimpleRIBExtensionProviderContext;
import org.osgi.framework.Filter;
import org.osgi.framework.ServiceListener;
import org.osgi.framework.ServiceReference;
doReturn(mock(MessageRegistry.class)).when(mockContext).getMessageRegistry();
doReturn(mock(SubsequentAddressFamilyRegistry.class)).when(mockContext).getSubsequentAddressFamilyRegistry();
setupMockService(BGPExtensionProviderContext.class, mockContext);
+
+ setupMockService(RIBExtensionProviderContext.class, new SimpleRIBExtensionProviderContext());
}
void setupMockService(final Class<?> serviceInterface, final Object instance) throws Exception {
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
-import org.mockito.Matchers;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
Mockito.doReturn(new Bundle[] {}).when(this.mockedContext).getBundles();
- Mockito.doReturn(new ServiceReference[] {}).when(this.mockedContext).getServiceReferences(Matchers.anyString(), Matchers.anyString());
-
Mockito.doReturn("Empty reference").when(emptyServiceReference).toString();
Mockito.doReturn("Data Provider Service Reference").when(dataProviderServiceReference).toString();
Mockito.doReturn("Class loading stategy reference").when(classLoadingStrategySR).toString();
<module>
<type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:spi">prefix:bgp-rib-extensions-impl</type>
<name>global-rib-extensions</name>
- <extension>
- <type xmlns:ribspi="urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:spi">ribspi:extension</type>
- <name>base-bgp-rib</name>
- </extension>
- <extension>
- <type xmlns:ribspi="urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:spi">ribspi:extension</type>
- <name>bgp-linkstate</name>
- </extension>
- <extension>
- <type xmlns:ribspi="urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:spi">ribspi:extension</type>
- <name>bgp-flowspec</name>
- </extension>
- <extension>
- <type xmlns:ribspi="urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:spi">ribspi:extension</type>
- <name>bgp-labeled-unicast</name>
- </extension>
- <extension>
- <type xmlns:ribspi="urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:spi">ribspi:extension</type>
- <name>bgp-vpn-ipv4</name>
- </extension>
- <extension>
- <type xmlns:ribspi="urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:spi">ribspi:extension</type>
- <name>bgp-vpn-ipv6</name>
- </extension>
- <extension>
- <type xmlns:ribspi="urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:spi">ribspi:extension</type>
- <name>bgp-evpn</name>
- </extension>
- </module>
- <module>
- <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">prefix:base-bgp-rib</type>
- <name>base-bgp-rib</name>
</module>
<module>
<type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:bgp:linkstate">prefix:bgp-linkstate</type>
</service>
<service>
<type xmlns:ribspi="urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:spi">ribspi:extension</type>
- <instance>
- <name>base-bgp-rib</name>
- <provider>/modules/module[type='base-bgp-rib'][name='base-bgp-rib']</provider>
- </instance>
<instance>
<name>bgp-linkstate</name>
<provider>/modules/module[type='bgp-linkstate'][name='bgp-linkstate']</provider>
+++ /dev/null
-/*
- * Copyright (c) 2013 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,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-/**
- * Generated file
-
- * Generated from: yang module name: bgp-rib-impl yang module local name: base-bgp-rib
- * Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
- * Generated at: Tue Dec 03 09:13:09 CET 2013
- *
- * Do not modify this file unless it is present under src/main directory
- */
-package org.opendaylight.controller.config.yang.bgp.rib.impl;
-
-import org.opendaylight.protocol.bgp.rib.impl.RIBActivator;
-
-/**
- *
- */
-public final class BaseBGPRIBModule extends org.opendaylight.controller.config.yang.bgp.rib.impl.AbstractBaseBGPRIBModule {
-
- public BaseBGPRIBModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier,
- final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
- super(identifier, dependencyResolver);
- }
-
- public BaseBGPRIBModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier,
- final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, final BaseBGPRIBModule oldModule,
- final java.lang.AutoCloseable oldInstance) {
-
- super(identifier, dependencyResolver, oldModule, oldInstance);
- }
-
- @Override
- protected void customValidation() {
- // Add custom validation for module attributes here.
- }
-
- @Override
- public java.lang.AutoCloseable createInstance() {
- return new RIBActivator();
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 2013 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,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-/**
- * Generated file
-
- * Generated from: yang module name: bgp-rib-impl yang module local name: base-bgp-rib
- * Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
- * Generated at: Tue Dec 03 09:13:09 CET 2013
- *
- * Do not modify this file unless it is present under src/main directory
- */
-package org.opendaylight.controller.config.yang.bgp.rib.impl;
-
-/**
-*
-*/
-public class BaseBGPRIBModuleFactory extends org.opendaylight.controller.config.yang.bgp.rib.impl.AbstractBaseBGPRIBModuleFactory {
-
-}
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+ xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0">
+
+ <bean id="RIBActivator" class="org.opendaylight.protocol.bgp.rib.impl.RIBActivator"/>
+
+ <service ref="RIBActivator" interface="org.opendaylight.protocol.bgp.rib.spi.RIBExtensionProviderActivator"
+ odl:type="org.opendaylight.protocol.bgp.rib.impl.RIBActivator"/>
+</blueprint>
\ No newline at end of file
}
}
- identity base-bgp-rib {
- base config:module-type;
- config:provided-service ribspi:extension;
- config:java-name-prefix BaseBGPRIB;
- }
-
- augment "/config:modules/config:module/config:configuration" {
- case base-bgp-rib {
- when "/config:modules/config:module/config:type = 'base-bgp-rib'";
- }
- }
-
identity rib-instance {
description
"Service representing a RIB instance";
import org.opendaylight.controller.sal.core.api.model.YangTextSourceProvider;
import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderContext;
import org.opendaylight.protocol.bgp.parser.spi.MessageRegistry;
+import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionProviderContext;
+import org.opendaylight.protocol.bgp.rib.spi.SimpleRIBExtensionProviderContext;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.RibId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.BgpId;
setupMockService(DOMRpcService.class, mock(DOMRpcService.class));
setupMockService(DOMRpcProviderService.class, mock(DOMRpcProviderService.class));
setupMockService(DOMMountPointService.class, mock(DOMMountPointService.class));
+
+ setupMockService(RIBExtensionProviderContext.class, new SimpleRIBExtensionProviderContext());
}
protected void setupMockService(final Class<?> serviceInterface, final Object instance) throws Exception {
+++ /dev/null
-/*
- * Copyright (c) 2014 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,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.controller.config.yang.bgp.rib.impl;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.opendaylight.controller.config.api.jmx.CommitStatus;
-import org.opendaylight.controller.config.manager.impl.AbstractConfigTest;
-import org.opendaylight.controller.config.manager.impl.factoriesresolver.HardcodedModuleFactoriesResolver;
-import org.opendaylight.controller.config.util.ConfigTransactionJMXClient;
-
-public class BaseBGPRIBModuleTest extends AbstractConfigTest {
-
- private static final String INSTANCE_NAME = "bgp-rib-instance";
- private static final String FACTORY_NAME = BaseBGPRIBModuleFactory.NAME;
-
- @Before
- public void setUp() throws Exception {
- super.initConfigTransactionManagerImpl(new HardcodedModuleFactoriesResolver(this.mockedContext, new BaseBGPRIBModuleFactory()));
- }
-
- @Test
- public void testCreateBean() throws Exception {
- final CommitStatus status = createInstance();
- assertBeanCount(1, FACTORY_NAME);
- assertStatus(status, 1, 0, 0);
- }
-
- @Test
- public void testReusingOldInstance() throws Exception {
- createInstance();
- final ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
- assertBeanCount(1, FACTORY_NAME);
- final CommitStatus status = transaction.commit();
- assertBeanCount(1, FACTORY_NAME);
- assertStatus(status, 0, 0, 1);
- }
-
- private CommitStatus createInstance() throws Exception {
- final ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
- transaction.createModule(FACTORY_NAME, INSTANCE_NAME);
- return transaction.commit();
- }
-}
*/
package org.opendaylight.controller.config.yang.bgp.rib.spi;
-import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionProviderActivator;
-import org.opendaylight.protocol.bgp.rib.spi.SimpleRIBExtensionProviderContext;
+import com.google.common.reflect.AbstractInvocationHandler;
+import com.google.common.reflect.Reflection;
+import java.lang.reflect.Method;
+import org.opendaylight.controller.config.api.osgi.WaitingServiceTracker;
+import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionProviderContext;
+import org.osgi.framework.BundleContext;
/**
- *
+ * @deprecated Replaced by blueprint wiring but remains for backwards compatibility until downstream users
+ * of the provided config system service are converted to blueprint.
*/
+@Deprecated
public final class RIBExtensionsImplModule extends org.opendaylight.controller.config.yang.bgp.rib.spi.AbstractRIBExtensionsImplModule {
+ private BundleContext bundleContext;
public RIBExtensionsImplModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier,
final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
}
@Override
- public java.lang.AutoCloseable createInstance() {
- final class RIBExtensionProviderContextImplCloseable extends SimpleRIBExtensionProviderContext implements AutoCloseable {
+ public AutoCloseable createInstance() {
+ // The RIBExtensionProviderContext instance is created and advertised as an OSGi service via blueprint
+ // so obtain it here (waiting if necessary).
+ final WaitingServiceTracker<RIBExtensionProviderContext> tracker =
+ WaitingServiceTracker.create(RIBExtensionProviderContext.class, bundleContext);
+ final RIBExtensionProviderContext service = tracker.waitForService(WaitingServiceTracker.FIVE_MINUTES);
+
+ // Create a proxy to override close to close the ServiceTracker. The actual RIBExtensionProviderContext
+ // instance will be closed via blueprint.
+ return Reflection.newProxy(AutoCloseableRIBExtensionProviderContext.class, new AbstractInvocationHandler() {
@Override
- public void close() {
- for (final RIBExtensionProviderActivator e : getExtensionDependency()) {
- e.stopRIBExtensionProvider();
+ protected Object handleInvocation(Object proxy, Method method, Object[] args) throws Throwable {
+ if (method.getName().equals("close")) {
+ tracker.close();
+ return null;
+ } else {
+ return method.invoke(service, args);
}
}
- }
+ });
+ }
- final RIBExtensionProviderContextImplCloseable ret = new RIBExtensionProviderContextImplCloseable();
- for (final RIBExtensionProviderActivator e : getExtensionDependency()) {
- e.startRIBExtensionProvider(ret);
- }
+ void setBundleContext(BundleContext bundleContext) {
+ this.bundleContext = bundleContext;
+ }
- return ret;
+ private static interface AutoCloseableRIBExtensionProviderContext extends RIBExtensionProviderContext, AutoCloseable {
}
}
*/
package org.opendaylight.controller.config.yang.bgp.rib.spi;
+import org.opendaylight.controller.config.api.DependencyResolver;
+import org.osgi.framework.BundleContext;
+
/**
-*
-*/
-public class RIBExtensionsImplModuleFactory extends
- org.opendaylight.controller.config.yang.bgp.rib.spi.AbstractRIBExtensionsImplModuleFactory {
+ * @deprecated Replaced by blueprint wiring but remains for backwards compatibility until downstream users
+ * of the provided config system service are converted to blueprint.
+ */
+@Deprecated
+public class RIBExtensionsImplModuleFactory extends AbstractRIBExtensionsImplModuleFactory {
+ @Override
+ public RIBExtensionsImplModule instantiateModule(String instanceName, DependencyResolver dependencyResolver,
+ RIBExtensionsImplModule oldModule, AutoCloseable oldInstance, BundleContext bundleContext) {
+ RIBExtensionsImplModule module = super.instantiateModule(instanceName, dependencyResolver, oldModule,
+ oldInstance, bundleContext);
+ module.setBundleContext(bundleContext);
+ return module;
+ }
+ @Override
+ public RIBExtensionsImplModule instantiateModule(String instanceName, DependencyResolver dependencyResolver,
+ BundleContext bundleContext) {
+ RIBExtensionsImplModule module = super.instantiateModule(instanceName, dependencyResolver, bundleContext);
+ module.setBundleContext(bundleContext);
+ return module;
+ }
}
--- /dev/null
+/*
+ * Copyright (c) 2016 Brocade Communications 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,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.protocol.bgp.rib.spi;
+
+import com.google.common.base.Preconditions;
+import java.util.List;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Starts and stops RIBExtensionProviderActivator instances for a RIBExtensionProviderContext.
+ *
+ * @author Thomas Pantelis
+ */
+public class SimpleRIBExtensionProviderContextActivator implements AutoCloseable {
+ private static final Logger LOG = LoggerFactory.getLogger(SimpleRIBExtensionProviderContextActivator.class);
+
+ private final RIBExtensionProviderContext providerContext;
+ private final List<RIBExtensionProviderActivator> extensionActivators;
+
+ public SimpleRIBExtensionProviderContextActivator(final RIBExtensionProviderContext providerContext,
+ final List<RIBExtensionProviderActivator> extensionActivators) {
+ this.providerContext = Preconditions.checkNotNull(providerContext);
+ this.extensionActivators = Preconditions.checkNotNull(extensionActivators);
+ }
+
+ public void start() {
+ LOG.info("Starting {} RIBExtensionProviderActivator instances", extensionActivators.size());
+
+ for(final RIBExtensionProviderActivator e : extensionActivators) {
+ e.startRIBExtensionProvider(providerContext);
+ }
+ }
+
+ @Override
+ public void close() {
+ LOG.info("Stopping {} RIBExtensionProviderActivator instances", extensionActivators.size());
+
+ for(final RIBExtensionProviderActivator e : extensionActivators) {
+ e.stopRIBExtensionProvider();
+ }
+ }
+}
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+ xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0">
+
+ <!-- Obtains the specific list of RIBExtensionProviderActivator OSGi services announced via
+ META-INF/services/org.opendaylight.protocol.bgp.rib.spi.RIBExtensionProviderActivator resources.
+ -->
+ <odl:specific-reference-list id="extensionActivators" interface="org.opendaylight.protocol.bgp.rib.spi.RIBExtensionProviderActivator"/>
+
+ <bean id="extensionProviderContext" class="org.opendaylight.protocol.bgp.rib.spi.SimpleRIBExtensionProviderContext"/>
+
+ <bean id="extensionProviderContextActivator" class="org.opendaylight.protocol.bgp.rib.spi.SimpleRIBExtensionProviderContextActivator"
+ init-method="start" destroy-method="close">
+ <argument ref="extensionProviderContext"/>
+ <argument ref="extensionActivators"/>
+ </bean>
+
+ <service ref="extensionProviderContext">
+ <interfaces>
+ <value>org.opendaylight.protocol.bgp.rib.spi.RIBExtensionProviderContext</value>
+ <value>org.opendaylight.protocol.bgp.rib.spi.RIBExtensionConsumerContext</value>
+ </interfaces>
+ </service>
+</blueprint>
\ No newline at end of file
augment "/config:modules/config:module/config:configuration" {
case bgp-rib-extensions-impl {
when "/config:modules/config:module/config:type = 'bgp-rib-extensions-impl'";
-
- list extension {
- uses config:service-ref {
- refine type {
- mandatory true;
- config:required-identity extension;
- }
- }
- }
}
}
+++ /dev/null
-/*
- * Copyright (c) 2014 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,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.controller.config.yang.bgp.rib.spi;
-
-import java.util.List;
-
-import javax.management.ObjectName;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.opendaylight.controller.config.api.jmx.CommitStatus;
-import org.opendaylight.controller.config.manager.impl.AbstractConfigTest;
-import org.opendaylight.controller.config.manager.impl.factoriesresolver.HardcodedModuleFactoriesResolver;
-import org.opendaylight.controller.config.util.ConfigTransactionJMXClient;
-
-public class RIBExtensionsImplModuleTest extends AbstractConfigTest {
-
- private static final String FACTORY_NAME = RIBExtensionsImplModuleFactory.NAME;
- private static final String INSTANCE_NAME = "bgp-rib-extensions-impl";
-
- @Before
- public void setUp() throws Exception {
- super.initConfigTransactionManagerImpl(new HardcodedModuleFactoriesResolver(mockedContext, new RIBExtensionsImplModuleFactory()));
- }
-
- @Test
- public void testCreateBean() throws Exception {
- CommitStatus status = createInstance();
- assertBeanCount(1, FACTORY_NAME);
- assertStatus(status, 1, 0, 0);
- }
-
- @Test
- public void testReusingOldInstance() throws Exception {
- createInstance();
- ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();
- assertBeanCount(1, FACTORY_NAME);
- CommitStatus status = transaction.commit();
- assertBeanCount(1, FACTORY_NAME);
- assertStatus(status, 0, 0, 1);
- }
-
- private CommitStatus createInstance() throws Exception {
- ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();
- transaction.createModule(FACTORY_NAME, INSTANCE_NAME);
- return transaction.commit();
- }
-
- public static ObjectName createRIBExtensionsModuleInstance(final ConfigTransactionJMXClient transaction,
- final List<ObjectName> extensions) throws Exception {
- final ObjectName objectName = transaction.createModule(FACTORY_NAME, INSTANCE_NAME);
- RIBExtensionsImplModuleMXBean mxBean = transaction.newMXBeanProxy(objectName, RIBExtensionsImplModuleMXBean.class);
- mxBean.setExtension(extensions);
- return objectName;
- }
-}