Add blueprint XML for bgp-rib-spi 11/40411/5
authorTom Pantelis <tpanteli@brocade.com>
Wed, 15 Jun 2016 12:48:05 +0000 (08:48 -0400)
committerTom Pantelis <tpanteli@brocade.com>
Mon, 11 Jul 2016 15:13:19 +0000 (11:13 -0400)
Added blueprint XML file, bgp-rib-spi.xml, to the rib-spi bundle that
Utilizes the new blueprint extension, "specific-reference-list" (added by
https://git.opendaylight.org/gerrit/#/c/40267/), to obtain the
specific list of RIBExtensionProviderActivator OSGi service instances.
The specific expected services are announced via
META-INF/services/org.opendaylight.protocol.bgp.rib.spi.RIBExtensionProviderActivator
resources in the provider bundles which the "specific-reference-list"
extension scans so it knows which services to look for. Once all
expected services are obtained, the RIBExtensionProviderActivator
instance List bean is created and injected into the
SimpleRIBExtensionProviderContextActivator bean instance which calls start on each.

The SimpleRIBExtensionProviderContextModule was deprecated but still
remains for now to provide the RIBExtensionProviderContext instance
created via blueprint to the config system so it can be injected
into other users. Once the other user(s) are converted to blueprint then
the config yang and Module classes can be removed.

Change-Id: I2e3698ad08f021191c9c66ee4e27d55d7bd5e24a
Signed-off-by: Tom Pantelis <tpanteli@brocade.com>
15 files changed:
bgp/bmp-impl/src/test/java/org/opendaylight/controller/config/yang/bmp/impl/AbstractBmpModuleTest.java
bgp/bmp-impl/src/test/java/org/opendaylight/controller/config/yang/bmp/impl/BmpMonitorImplModuleTest.java
bgp/controller-config/src/main/resources/initial/31-bgp.xml
bgp/rib-impl/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BaseBGPRIBModule.java [deleted file]
bgp/rib-impl/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BaseBGPRIBModuleFactory.java [deleted file]
bgp/rib-impl/src/main/resources/org/opendaylight/blueprint/bgp-rib.xml [new file with mode: 0644]
bgp/rib-impl/src/main/yang/odl-bgp-rib-impl-cfg.yang
bgp/rib-impl/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/impl/AbstractRIBImplModuleTest.java
bgp/rib-impl/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BaseBGPRIBModuleTest.java [deleted file]
bgp/rib-spi/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/spi/RIBExtensionsImplModule.java
bgp/rib-spi/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/spi/RIBExtensionsImplModuleFactory.java
bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/SimpleRIBExtensionProviderContextActivator.java [new file with mode: 0644]
bgp/rib-spi/src/main/resources/org/opendaylight/blueprint/bgp-rib-spi.xml [new file with mode: 0644]
bgp/rib-spi/src/main/yang/odl-bgp-rib-spi-cfg.yang
bgp/rib-spi/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/spi/RIBExtensionsImplModuleTest.java [deleted file]

index cb4eadc02037ba3f015e3f16033cefc1b6901724..322e48c4fe17ed5d22c1d29676ac521ccf57a785 100644 (file)
@@ -22,6 +22,8 @@ import org.opendaylight.protocol.bgp.parser.spi.AddressFamilyRegistry;
 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;
@@ -52,6 +54,8 @@ public class AbstractBmpModuleTest extends AbstractConfigTest {
         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 {
index c03cafa238698adf43fca1fa0174a4aa2b7d43f4..633e2cc323ffd62f7403908f9b2b09440a5a982f 100644 (file)
@@ -30,7 +30,6 @@ import org.junit.After;
 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;
@@ -118,8 +117,6 @@ public class BmpMonitorImplModuleTest extends AbstractBmpModuleTest {
 
         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();
index 2cb0cd1102f6dc11d895ec96b7251cfb110ddc85..a5f88dc60dc7bc761502318c3c2b540c851d5986 100644 (file)
                 <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>
diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BaseBGPRIBModule.java b/bgp/rib-impl/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BaseBGPRIBModule.java
deleted file mode 100644 (file)
index 4e3a8f1..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * 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();
-    }
-}
diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BaseBGPRIBModuleFactory.java b/bgp/rib-impl/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BaseBGPRIBModuleFactory.java
deleted file mode 100644 (file)
index d8cd2a3..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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 {
-
-}
diff --git a/bgp/rib-impl/src/main/resources/org/opendaylight/blueprint/bgp-rib.xml b/bgp/rib-impl/src/main/resources/org/opendaylight/blueprint/bgp-rib.xml
new file mode 100644 (file)
index 0000000..3f05a96
--- /dev/null
@@ -0,0 +1,9 @@
+<?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
index 3c12ba345703d05d1b4058635fe88e1542a16542..b12744d537453ef84a984aa05a0d96e4cb7ddb97 100644 (file)
@@ -115,18 +115,6 @@ module odl-bgp-rib-impl-cfg {
         }
     }
 
-    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";
index 797bcb8cfc5559945a567ab255296750df7692ba..4e4a8784cbea4d13257fc42e761b6a18549ad78b 100755 (executable)
@@ -80,6 +80,8 @@ import org.opendaylight.controller.sal.core.api.model.SchemaService;
 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;
@@ -220,6 +222,8 @@ public abstract class AbstractRIBImplModuleTest extends AbstractConfigTest {
         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 {
diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BaseBGPRIBModuleTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BaseBGPRIBModuleTest.java
deleted file mode 100644 (file)
index 4e1155f..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * 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();
-    }
-}
index 0ffcb011da5575e86b93764a36be60113fe3e726..b372b80bc30cd05ea6e3710aa1126f888c379061 100644 (file)
  */
 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) {
@@ -41,21 +48,32 @@ public final class RIBExtensionsImplModule extends org.opendaylight.controller.c
     }
 
     @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 {
     }
 }
index a72510a60a3dd02ae58ee20eab8df1fab67d6332..04bd573bd36635a7bab9fd50c98ab9fec78f8e31 100644 (file)
  */
 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;
+    }
 }
diff --git a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/SimpleRIBExtensionProviderContextActivator.java b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/SimpleRIBExtensionProviderContextActivator.java
new file mode 100644 (file)
index 0000000..4a0329a
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * 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();
+        }
+    }
+}
diff --git a/bgp/rib-spi/src/main/resources/org/opendaylight/blueprint/bgp-rib-spi.xml b/bgp/rib-spi/src/main/resources/org/opendaylight/blueprint/bgp-rib-spi.xml
new file mode 100644 (file)
index 0000000..7e85d72
--- /dev/null
@@ -0,0 +1,24 @@
+<?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
index ca1c079e442f457c53c9b5032894eb34a70243de..d9a45a1447b95f5cbdb3aaf43b60a158837496d6 100644 (file)
@@ -62,15 +62,6 @@ module odl-bgp-rib-spi-cfg {
     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;
-                    }
-                }
-            }
         }
     }
 
diff --git a/bgp/rib-spi/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/spi/RIBExtensionsImplModuleTest.java b/bgp/rib-spi/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/spi/RIBExtensionsImplModuleTest.java
deleted file mode 100644 (file)
index a93a880..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * 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;
-    }
-}