Fix BGP operational state 37/98137/14
authormarekzatko <Marek.Zatko@pantheon.tech>
Tue, 26 Oct 2021 10:57:03 +0000 (12:57 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Thu, 28 Oct 2021 15:07:29 +0000 (17:07 +0200)
- Operational state of BGP was not present in datastore
   due to missing registrations of RIB/Peers state providers.
   (registration was deleted in
        I3ff92bedc6f6c7b215fb7dba7ef0eb4df9f59072)
- Rename/cleanup some classes to be more transparent

JIRA: BGPCEP-958
Change-Id: I8217c008b044133fabea6258e824416497e011e6
Signed-off-by: marekzatko <Marek.Zatko@pantheon.tech>
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
26 files changed:
bgp/openconfig-state/src/main/java/org/opendaylight/protocol/bgp/state/StateProviderImpl.java
bgp/openconfig-state/src/test/java/org/opendaylight/protocol/bgp/state/StateProviderImplTest.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/AppPeer.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/BGPClusterSingletonService.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpPeer.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/DefaultBgpDeployer.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/OSGiBgpDeployer.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/RibImpl.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/state/AbstractBGPStateConsumer.java [deleted file]
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/state/BGPPeerStateImpl.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/state/BGPRibStateImpl.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/state/BGPStateCollector.java [new file with mode: 0644]
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/state/BGPStateCollectorImpl.java [deleted file]
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/state/OSGiBGPStateConsumer.java [deleted file]
bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/AppPeerTest.java
bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpDeployerTest.java
bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpPeerTest.java
bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/RibImplTest.java
bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/state/BGPStateCollectorImplTest.java [deleted file]
bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/state/BGPStateCollectorTest.java [new file with mode: 0644]
bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/state/BGPPeerStateProvider.java [moved from bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/state/BGPPeerStateConsumer.java with 93% similarity]
bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/state/BGPRibStateProvider.java [moved from bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/state/BGPRibStateConsumer.java with 93% similarity]
bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/state/BGPStateConsumer.java [deleted file]
bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/state/BGPStateProvider.java
bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/state/BGPStateProviderRegistry.java [new file with mode: 0644]
bmp/bmp-impl/src/test/java/org/opendaylight/protocol/bmp/impl/session/BmpDispatcherImplTest.java

index 44e377e95fd52b0f13105c8b04840ebceafab59e..12c9497636a868d939953b91511d2b066539230a 100644 (file)
@@ -41,7 +41,7 @@ import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.protocol.bgp.openconfig.spi.BGPTableTypeRegistryConsumer;
 import org.opendaylight.protocol.bgp.rib.spi.state.BGPPeerState;
 import org.opendaylight.protocol.bgp.rib.spi.state.BGPRibState;
-import org.opendaylight.protocol.bgp.rib.spi.state.BGPStateConsumer;
+import org.opendaylight.protocol.bgp.rib.spi.state.BGPStateProvider;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.Bgp;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.BgpBuilder;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.Global;
@@ -87,7 +87,7 @@ public final class StateProviderImpl implements TransactionChainListener, AutoCl
 
     private static final Logger LOG = LoggerFactory.getLogger(StateProviderImpl.class);
 
-    private final BGPStateConsumer stateCollector;
+    private final BGPStateProvider stateProvider;
     private final BGPTableTypeRegistryConsumer bgpTableTypeRegistry;
     private final KeyedInstanceIdentifier<NetworkInstance, NetworkInstanceKey> networkInstanceIId;
     private final DataBroker dataBroker;
@@ -103,27 +103,28 @@ public final class StateProviderImpl implements TransactionChainListener, AutoCl
     @Activate
     public StateProviderImpl(@Reference final @NonNull DataBroker dataBroker,
             @Reference final @NonNull BGPTableTypeRegistryConsumer bgpTableTypeRegistry,
-            @Reference final @NonNull BGPStateConsumer stateCollector, final @NonNull Configuration configuration) {
-        this(dataBroker, configuration.updateIntervalSeconds(), bgpTableTypeRegistry, stateCollector,
-            configuration.networkInstanceName());
+            @Reference final @NonNull BGPStateProvider stateProvider, final @NonNull Configuration configuration) {
+        this(dataBroker, configuration.updateIntervalSeconds(), bgpTableTypeRegistry, stateProvider,
+                configuration.networkInstanceName());
     }
 
     @Inject
     public StateProviderImpl(final @NonNull DataBroker dataBroker, final int timeout,
             final @NonNull BGPTableTypeRegistryConsumer bgpTableTypeRegistry,
-            final @NonNull BGPStateConsumer stateCollector, final @NonNull String networkInstanceName) {
-        this(dataBroker, timeout, TimeUnit.SECONDS, bgpTableTypeRegistry, stateCollector, networkInstanceName,
+            final @NonNull BGPStateProvider stateProvider,
+            final @NonNull String networkInstanceName) {
+        this(dataBroker, timeout, TimeUnit.SECONDS, bgpTableTypeRegistry, stateProvider, networkInstanceName,
                 Executors.newScheduledThreadPool(1));
     }
 
     @VisibleForTesting
     StateProviderImpl(final @NonNull DataBroker dataBroker, final long period, final TimeUnit timeUnit,
             final @NonNull BGPTableTypeRegistryConsumer bgpTableTypeRegistry,
-            final @NonNull BGPStateConsumer stateCollector,
+            final @NonNull BGPStateProvider stateProvider,
             final @NonNull String networkInstanceName, final @NonNull ScheduledExecutorService scheduler) {
         this.dataBroker = requireNonNull(dataBroker);
         this.bgpTableTypeRegistry = requireNonNull(bgpTableTypeRegistry);
-        this.stateCollector = requireNonNull(stateCollector);
+        this.stateProvider = requireNonNull(stateProvider);
         this.networkInstanceIId = InstanceIdentifier.create(NetworkInstances.class)
                 .child(NetworkInstance.class, new NetworkInstanceKey(networkInstanceName));
         this.scheduler = scheduler;
@@ -165,9 +166,9 @@ public final class StateProviderImpl implements TransactionChainListener, AutoCl
             justification = "https://github.com/spotbugs/spotbugs/issues/811")
     private synchronized void updateBGPStats(final WriteOperations wtx) {
         final Set<String> oldStats = new HashSet<>(this.instanceIdentifiersCache.keySet());
-        this.stateCollector.getRibStats().stream().filter(BGPRibState::isActive).forEach(bgpStateConsumer -> {
+        this.stateProvider.getRibStats().stream().filter(BGPRibState::isActive).forEach(bgpStateConsumer -> {
             final KeyedInstanceIdentifier<Rib, RibKey> ribId = bgpStateConsumer.getInstanceIdentifier();
-            final List<BGPPeerState> peerStats = this.stateCollector.getPeerStats().stream()
+            final List<BGPPeerState> peerStats = this.stateProvider.getPeerStats().stream()
                     .filter(BGPPeerState::isActive).filter(peerState -> ribId.equals(peerState.getInstanceIdentifier()))
                     .collect(Collectors.toList());
             storeOperationalState(bgpStateConsumer, peerStats, ribId.getKey().getId().getValue(), wtx);
index 42a62dc6e0f0f4e288b9c14d8ba314b9a799319c..35349cb77599bf5b3252b8e994a82b87c419e7ff 100644 (file)
@@ -65,7 +65,7 @@ import org.opendaylight.protocol.bgp.rib.spi.state.BGPPeerMessagesState;
 import org.opendaylight.protocol.bgp.rib.spi.state.BGPPeerState;
 import org.opendaylight.protocol.bgp.rib.spi.state.BGPRibState;
 import org.opendaylight.protocol.bgp.rib.spi.state.BGPSessionState;
-import org.opendaylight.protocol.bgp.rib.spi.state.BGPStateConsumer;
+import org.opendaylight.protocol.bgp.rib.spi.state.BGPStateProvider;
 import org.opendaylight.protocol.bgp.rib.spi.state.BGPTimersState;
 import org.opendaylight.protocol.bgp.rib.spi.state.BGPTransportState;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafi;
@@ -163,7 +163,7 @@ public class StateProviderImplTest extends AbstractDataBrokerTest {
     private final List<Class<? extends BgpCapability>> supportedCap = List.of(ASN32.class, ROUTEREFRESH.class,
             MPBGP.class, ADDPATHS.class, GRACEFULRESTART.class);
     @Mock
-    private BGPStateConsumer stateCollector;
+    private BGPStateProvider stateProvider;
     @Mock
     private BGPTableTypeRegistryConsumer tableTypeRegistry;
     @Mock
@@ -195,8 +195,8 @@ public class StateProviderImplTest extends AbstractDataBrokerTest {
     public void setUp() {
         doReturn(IPV4UNICAST.class).when(this.tableTypeRegistry).getAfiSafiType(eq(TABLES_KEY));
 
-        doReturn(this.bgpRibStates).when(this.stateCollector).getRibStats();
-        doReturn(this.bgpPeerStates).when(this.stateCollector).getPeerStats();
+        doReturn(this.bgpRibStates).when(this.stateProvider).getRibStats();
+        doReturn(this.bgpPeerStates).when(this.stateProvider).getPeerStats();
 
         final KeyedInstanceIdentifier<Rib, RibKey> iid = InstanceIdentifier.create(BgpRib.class)
             .child(Rib.class, new RibKey(new RibId(this.ribId)));
@@ -292,7 +292,7 @@ public class StateProviderImplTest extends AbstractDataBrokerTest {
 
         try (StateProviderImpl stateProvider =
                 // FIXME: use a properly-controlled executor service
-                new StateProviderImpl(getDataBroker(), 1, tableTypeRegistry, stateCollector, "global-bgp")) {
+                new StateProviderImpl(getDataBroker(), 1, tableTypeRegistry, this.stateProvider, "global-bgp")) {
 
             final Global globalExpected = buildGlobalExpected(0);
             this.bgpRibStates.add(this.bgpRibState);
@@ -370,7 +370,8 @@ public class StateProviderImplTest extends AbstractDataBrokerTest {
         doReturn(false).when(this.bgpRibState).isActive();
 
         try (StateProviderImpl stateProvider =
-                new StateProviderImpl(getDataBroker(), 100, TimeUnit.MILLISECONDS, tableTypeRegistry, stateCollector,
+                new StateProviderImpl(getDataBroker(), 100, TimeUnit.MILLISECONDS, tableTypeRegistry,
+                        this.stateProvider,
                     // FIXME: use a properly-controlled executor service ...
                     "global-bgp", Executors.newScheduledThreadPool(1))) {
 
@@ -432,7 +433,7 @@ public class StateProviderImplTest extends AbstractDataBrokerTest {
         final int period = 100;
         final TimeUnit unit = TimeUnit.MILLISECONDS;
         try (StateProviderImpl stateProvider = new StateProviderImpl(getDataBroker(), period, unit, tableTypeRegistry,
-                stateCollector, "global-bgp", mockScheduler)) {
+                this.stateProvider, "global-bgp", mockScheduler)) {
 
             ArgumentCaptor<Runnable> timerTask = ArgumentCaptor.forClass(Runnable.class);
             verify(mockScheduler).scheduleAtFixedRate(timerTask.capture(), eq(0L), eq((long)period), eq(unit));
index 31b0205af1eccf6fa03955613ab78f92dd1fdcf6..b162d810fcda2186f56cc77b2482cce2b620b495 100644 (file)
@@ -7,6 +7,7 @@
  */
 package org.opendaylight.protocol.bgp.rib.impl.config;
 
+import static java.util.Objects.requireNonNull;
 import static org.opendaylight.protocol.bgp.rib.spi.RIBNodeIdentifiers.TABLES_NID;
 
 import com.google.common.base.Preconditions;
@@ -22,7 +23,8 @@ import org.opendaylight.protocol.bgp.openconfig.spi.BGPTableTypeRegistryConsumer
 import org.opendaylight.protocol.bgp.rib.impl.ApplicationPeer;
 import org.opendaylight.protocol.bgp.rib.impl.spi.RIB;
 import org.opendaylight.protocol.bgp.rib.spi.state.BGPPeerState;
-import org.opendaylight.protocol.bgp.rib.spi.state.BGPPeerStateConsumer;
+import org.opendaylight.protocol.bgp.rib.spi.state.BGPPeerStateProvider;
+import org.opendaylight.protocol.bgp.rib.spi.state.BGPStateProviderRegistry;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.Config;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.Neighbor;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.Bgp;
@@ -30,6 +32,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4AddressNoZone;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.ApplicationRib;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.ApplicationRibId;
+import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
@@ -37,14 +40,20 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdent
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public final class AppPeer implements PeerBean, BGPPeerStateConsumer {
+public final class AppPeer implements PeerBean, BGPPeerStateProvider {
     private static final Logger LOG = LoggerFactory.getLogger(AppPeer.class);
     private static final NodeIdentifier APPRIB = NodeIdentifier.create(ApplicationRib.QNAME);
     private static final QName APP_ID_QNAME = QName.create(ApplicationRib.QNAME, "id").intern();
+    private final BGPStateProviderRegistry stateProviderRegistry;
     @GuardedBy("this")
     private Neighbor currentConfiguration;
     @GuardedBy("this")
     private BgpAppPeerSingletonService bgpAppPeerSingletonService;
+    private Registration stateProviderRegistration;
+
+    public AppPeer(final BGPStateProviderRegistry stateProviderRegistry) {
+        this.stateProviderRegistry = requireNonNull(stateProviderRegistry);
+    }
 
     private static ApplicationRibId createAppRibId(final Neighbor neighbor) {
         final Config config = neighbor.getConfig();
@@ -63,6 +72,7 @@ public final class AppPeer implements PeerBean, BGPPeerStateConsumer {
         this.bgpAppPeerSingletonService = new BgpAppPeerSingletonService(rib, createAppRibId(neighbor),
             IetfInetUtil.INSTANCE.ipv4AddressNoZoneFor(neighbor.getNeighborAddress().getIpv4Address()),
             tableTypeRegistry);
+        this.stateProviderRegistration = this.stateProviderRegistry.register(this);
     }
 
     @Override
@@ -75,6 +85,8 @@ public final class AppPeer implements PeerBean, BGPPeerStateConsumer {
     @Override
     public synchronized void close() {
         if (this.bgpAppPeerSingletonService != null) {
+            this.stateProviderRegistration.close();
+            this.stateProviderRegistration = null;
             this.bgpAppPeerSingletonService = null;
         }
     }
@@ -106,7 +118,7 @@ public final class AppPeer implements PeerBean, BGPPeerStateConsumer {
         return this.bgpAppPeerSingletonService.getPeerState();
     }
 
-    private static final class BgpAppPeerSingletonService implements BGPPeerStateConsumer {
+    private static final class BgpAppPeerSingletonService implements BGPPeerStateProvider {
         private final ApplicationPeer applicationPeer;
         private final DOMDataTreeChangeService dataTreeChangeService;
         private final ApplicationRibId appRibId;
index fc65b65ac0e372ee26ab0479e4142492d21ca759..f21d776d334de375c36d65ab2b373a2307adc4a2 100644 (file)
@@ -42,6 +42,7 @@ import org.opendaylight.protocol.bgp.openconfig.spi.BGPTableTypeRegistryConsumer
 import org.opendaylight.protocol.bgp.rib.impl.spi.BGPDispatcher;
 import org.opendaylight.protocol.bgp.rib.impl.spi.CodecsRegistry;
 import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionConsumerContext;
+import org.opendaylight.protocol.bgp.rib.spi.state.BGPStateProviderRegistry;
 import org.opendaylight.protocol.bgp.rib.spi.util.ClusterSingletonServiceRegistrationHelper;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.Config;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.Neighbor;
@@ -74,6 +75,7 @@ public class BGPClusterSingletonService implements ClusterSingletonService, Auto
     private final BGPDispatcher bgpDispatcher;
     private final BGPRibRoutingPolicyFactory routingPolicyFactory;
     private final CodecsRegistry codecsRegistry;
+    private final BGPStateProviderRegistry stateProviderRegistry;
     private final DOMDataBroker domDataBroker;
     @GuardedBy("this")
     private RibImpl ribImpl;
@@ -88,6 +90,7 @@ public class BGPClusterSingletonService implements ClusterSingletonService, Auto
             final @NonNull BGPDispatcher bgpDispatcher,
             final @NonNull BGPRibRoutingPolicyFactory routingPolicyFactory,
             final @NonNull CodecsRegistry codecsRegistry,
+            final @NonNull BGPStateProviderRegistry stateProviderRegistry,
             final @NonNull DOMDataBroker domDataBroker,
             final @NonNull InstanceIdentifier<Bgp> bgpIid) {
         this.peerGroupLoader = peerGroupLoader;
@@ -97,6 +100,7 @@ public class BGPClusterSingletonService implements ClusterSingletonService, Auto
         this.bgpDispatcher = bgpDispatcher;
         this.routingPolicyFactory = routingPolicyFactory;
         this.codecsRegistry = codecsRegistry;
+        this.stateProviderRegistry = stateProviderRegistry;
         this.domDataBroker = domDataBroker;
         this.bgpIid = bgpIid;
         final String ribInstanceName = getRibInstanceName(bgpIid);
@@ -181,7 +185,7 @@ public class BGPClusterSingletonService implements ClusterSingletonService, Auto
     private synchronized void onGlobalCreated(final Global global) {
         LOG.debug("Creating RIB instance with configuration: {}", global);
         this.ribImpl = new RibImpl(this.ribExtensionContext, this.bgpDispatcher, this.routingPolicyFactory,
-                this.codecsRegistry, this.domDataBroker);
+                this.codecsRegistry, this.stateProviderRegistry, this.domDataBroker);
         initiateRibInstance(global);
         LOG.debug("RIB instance created: {}", this.ribImpl);
     }
@@ -278,9 +282,9 @@ public class BGPClusterSingletonService implements ClusterSingletonService, Auto
         LOG.debug("Creating Peer instance with configuration: {}", neighbor);
         final PeerBean bgpPeer;
         if (OpenConfigMappingUtil.isApplicationPeer(neighbor)) {
-            bgpPeer = new AppPeer();
+            bgpPeer = new AppPeer(this.stateProviderRegistry);
         } else {
-            bgpPeer = new BgpPeer(this.rpcRegistry);
+            bgpPeer = new BgpPeer(this.rpcRegistry, this.stateProviderRegistry);
         }
         final InstanceIdentifier<Neighbor> neighborInstanceIdentifier =
                 getNeighborInstanceIdentifier(this.bgpIid, neighbor.key());
index 2b8051975d757ef198f4e6ec5d22389140c5aaef..cc397952357a52e6665af0d6eb2c0ff9e7420261 100644 (file)
@@ -39,7 +39,8 @@ import org.opendaylight.protocol.bgp.rib.impl.spi.BGPPeerRegistry;
 import org.opendaylight.protocol.bgp.rib.impl.spi.BGPSessionPreferences;
 import org.opendaylight.protocol.bgp.rib.impl.spi.RIB;
 import org.opendaylight.protocol.bgp.rib.spi.state.BGPPeerState;
-import org.opendaylight.protocol.bgp.rib.spi.state.BGPPeerStateConsumer;
+import org.opendaylight.protocol.bgp.rib.spi.state.BGPPeerStateProvider;
+import org.opendaylight.protocol.bgp.rib.spi.state.BGPStateProviderRegistry;
 import org.opendaylight.protocol.concepts.KeyMapping;
 import org.opendaylight.protocol.util.Ipv4Util;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafi;
@@ -65,22 +66,26 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.open
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.PeerRole;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.rib.TablesKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.ClusterIdentifier;
+import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class BgpPeer implements PeerBean, BGPPeerStateConsumer {
+public class BgpPeer implements PeerBean, BGPPeerStateProvider {
 
     private static final Logger LOG = LoggerFactory.getLogger(BgpPeer.class);
 
     private final RpcProviderService rpcRegistry;
+    private final BGPStateProviderRegistry stateProviderRegistry;
     @GuardedBy("this")
     private Neighbor currentConfiguration;
     @GuardedBy("this")
     private BgpPeerSingletonService bgpPeerSingletonService;
+    private Registration stateProviderRegistration;
 
-    public BgpPeer(final RpcProviderService rpcRegistry) {
-        this.rpcRegistry = rpcRegistry;
+    public BgpPeer(final RpcProviderService rpcRegistry, final BGPStateProviderRegistry stateProviderRegistry) {
+        this.rpcRegistry = requireNonNull(rpcRegistry);
+        this.stateProviderRegistry = requireNonNull(stateProviderRegistry);
     }
 
     @SuppressFBWarnings(value = "UPM_UNCALLED_PRIVATE_METHOD",
@@ -147,6 +152,7 @@ public class BgpPeer implements PeerBean, BGPPeerStateConsumer {
         this.bgpPeerSingletonService = new BgpPeerSingletonService(rib, neighbor, bgpIid, peerGroupLoader,
                 tableTypeRegistry);
         this.currentConfiguration = neighbor;
+        this.stateProviderRegistration = this.stateProviderRegistry.register(this);
     }
 
     @Override
@@ -163,7 +169,9 @@ public class BgpPeer implements PeerBean, BGPPeerStateConsumer {
     @Override
     public void close() {
         if (this.bgpPeerSingletonService != null) {
+            this.stateProviderRegistration.close();
             this.bgpPeerSingletonService.closeServiceInstance();
+            this.stateProviderRegistration = null;
             this.bgpPeerSingletonService = null;
         }
     }
@@ -225,7 +233,7 @@ public class BgpPeer implements PeerBean, BGPPeerStateConsumer {
         }
     }
 
-    private final class BgpPeerSingletonService implements BGPPeerStateConsumer {
+    private final class BgpPeerSingletonService implements BGPPeerStateProvider {
         private final boolean activeConnection;
         private final BGPDispatcher dispatcher;
         private final InetSocketAddress inetAddress;
index bef7e5e6084ce6265d8e8d20d659cf579fb979cd..a7feb2fb5a673db96889133dd04c6a0810a6c885 100644 (file)
@@ -46,6 +46,7 @@ import org.opendaylight.protocol.bgp.openconfig.spi.BGPTableTypeRegistryConsumer
 import org.opendaylight.protocol.bgp.rib.impl.spi.BGPDispatcher;
 import org.opendaylight.protocol.bgp.rib.impl.spi.CodecsRegistry;
 import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionConsumerContext;
+import org.opendaylight.protocol.bgp.rib.spi.state.BGPStateProviderRegistry;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.peer.group.PeerGroup;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.peer.group.PeerGroupKey;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.Bgp;
@@ -78,6 +79,7 @@ public class DefaultBgpDeployer implements ClusteredDataTreeChangeListener<Bgp>,
     private final RIBExtensionConsumerContext ribExtensionConsumerContext;
     private final BGPDispatcher bgpDispatcher;
     private final BGPRibRoutingPolicyFactory routingPolicyFactory;
+    private final BGPStateProviderRegistry stateProviderRegistry;
     private final CodecsRegistry codecsRegistry;
     private final DOMDataBroker domDataBroker;
     private final DataBroker dataBroker;
@@ -101,23 +103,25 @@ public class DefaultBgpDeployer implements ClusteredDataTreeChangeListener<Bgp>,
     public DefaultBgpDeployer(final String networkInstanceName,
                               final ClusterSingletonServiceProvider provider,
                               final RpcProviderService rpcRegistry,
-                              final RIBExtensionConsumerContext ribExtensionContext,
+                              final RIBExtensionConsumerContext ribExtensionConsumerContext,
                               final BGPDispatcher bgpDispatcher,
                               final BGPRibRoutingPolicyFactory routingPolicyFactory,
                               final CodecsRegistry codecsRegistry,
                               final DOMDataBroker domDataBroker,
                               final DataBroker dataBroker,
-                              final BGPTableTypeRegistryConsumer mappingService) {
+                              final BGPTableTypeRegistryConsumer tableTypeRegistry,
+                              final BGPStateProviderRegistry stateProviderRegistry) {
         this.dataBroker = requireNonNull(dataBroker);
         this.provider = requireNonNull(provider);
         this.networkInstanceName = requireNonNull(networkInstanceName);
-        tableTypeRegistry = requireNonNull(mappingService);
-        this.rpcRegistry = rpcRegistry;
-        ribExtensionConsumerContext = ribExtensionContext;
-        this.bgpDispatcher = bgpDispatcher;
-        this.routingPolicyFactory = routingPolicyFactory;
-        this.codecsRegistry = codecsRegistry;
-        this.domDataBroker = domDataBroker;
+        this.tableTypeRegistry = requireNonNull(tableTypeRegistry);
+        this.stateProviderRegistry = requireNonNull(stateProviderRegistry);
+        this.rpcRegistry = requireNonNull(rpcRegistry);
+        this.ribExtensionConsumerContext = requireNonNull(ribExtensionConsumerContext);
+        this.bgpDispatcher = requireNonNull(bgpDispatcher);
+        this.routingPolicyFactory = requireNonNull(routingPolicyFactory);
+        this.codecsRegistry = requireNonNull(codecsRegistry);
+        this.domDataBroker = requireNonNull(domDataBroker);
         networkInstanceIId = InstanceIdentifier.create(NetworkInstances.class)
                 .child(NetworkInstance.class, new NetworkInstanceKey(this.networkInstanceName));
         initializeNetworkInstance(dataBroker, networkInstanceIId).addCallback(new FutureCallback<CommitInfo>() {
@@ -288,7 +292,7 @@ public class DefaultBgpDeployer implements ClusteredDataTreeChangeListener<Bgp>,
         if (old == null) {
             old = new BGPClusterSingletonService(this, provider, tableTypeRegistry,
                     rpcRegistry, ribExtensionConsumerContext, bgpDispatcher, routingPolicyFactory,
-                    codecsRegistry, domDataBroker, bgpInstanceIdentifier);
+                    codecsRegistry, stateProviderRegistry, domDataBroker, bgpInstanceIdentifier);
             bgpCss.put(bgpInstanceIdentifier, old);
         }
         return old;
index 20b79718ec337a13ba3fad7433fc5bab94ca1f87..6be6f3ff5b728c6bb0909a0f4f10698262989670 100644 (file)
@@ -16,6 +16,7 @@ import org.opendaylight.protocol.bgp.openconfig.spi.BGPTableTypeRegistryConsumer
 import org.opendaylight.protocol.bgp.rib.impl.spi.BGPDispatcher;
 import org.opendaylight.protocol.bgp.rib.impl.spi.CodecsRegistry;
 import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionConsumerContext;
+import org.opendaylight.protocol.bgp.rib.spi.state.BGPStateProviderRegistry;
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.Deactivate;
@@ -43,9 +44,10 @@ public final class OSGiBgpDeployer extends DefaultBgpDeployer {
                            @Reference final DOMDataBroker domDataBroker,
                            @Reference final DataBroker dataBroker,
                            @Reference final BGPTableTypeRegistryConsumer mappingService,
+                           @Reference final BGPStateProviderRegistry stateProviderRegistry,
                            final Configuration configuration) {
         super(configuration.networkInstanceName(), provider, rpcRegistry, ribExtensionContext, bgpDispatcher,
-                routingPolicyFactory, codecsRegistry, domDataBroker, dataBroker, mappingService);
+                routingPolicyFactory, codecsRegistry, domDataBroker, dataBroker, mappingService, stateProviderRegistry);
         init();
     }
 
index 18d9e1552d507cdd78d74c6d0d8bcb5e04d102be..8b1bc897639bdd8a6a317163bd34b5457095fdae 100644 (file)
@@ -7,6 +7,7 @@
  */
 package org.opendaylight.protocol.bgp.rib.impl.config;
 
+import static java.util.Objects.requireNonNull;
 import static org.opendaylight.protocol.bgp.rib.impl.config.OpenConfigMappingUtil.getAfiSafiWithDefault;
 import static org.opendaylight.protocol.bgp.rib.impl.config.OpenConfigMappingUtil.getGlobalClusterIdentifier;
 import static org.opendaylight.protocol.bgp.rib.impl.config.OpenConfigMappingUtil.toTableTypes;
@@ -34,7 +35,8 @@ import org.opendaylight.protocol.bgp.rib.spi.BGPPeerTracker;
 import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionConsumerContext;
 import org.opendaylight.protocol.bgp.rib.spi.policy.BGPRibRoutingPolicy;
 import org.opendaylight.protocol.bgp.rib.spi.state.BGPRibState;
-import org.opendaylight.protocol.bgp.rib.spi.state.BGPRibStateConsumer;
+import org.opendaylight.protocol.bgp.rib.spi.state.BGPRibStateProvider;
+import org.opendaylight.protocol.bgp.rib.spi.state.BGPStateProviderRegistry;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafi;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.global.base.Config;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.Global;
@@ -50,12 +52,13 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.rib.TablesKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.BgpId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.ClusterIdentifier;
+import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public final class RibImpl implements RIB, BGPRibStateConsumer, AutoCloseable {
+public final class RibImpl implements RIB, BGPRibStateProvider, AutoCloseable {
 
     private static final Logger LOG = LoggerFactory.getLogger(RibImpl.class);
 
@@ -64,31 +67,34 @@ public final class RibImpl implements RIB, BGPRibStateConsumer, AutoCloseable {
     private final CodecsRegistry codecsRegistry;
     private final DOMDataBroker domBroker;
     private final BGPRibRoutingPolicyFactory policyProvider;
+    private final BGPStateProviderRegistry stateProviderRegistry;
     private RIBImpl ribImpl;
     private Collection<AfiSafi> afiSafi;
     private AsNumber asNumber;
     private Ipv4AddressNoZone routerId;
-
     private ClusterIdentifier clusterId;
+    private Registration stateProviderRegistration;
 
     public RibImpl(
             final RIBExtensionConsumerContext contextProvider,
             final BGPDispatcher dispatcher,
             final BGPRibRoutingPolicyFactory policyProvider,
             final CodecsRegistry codecsRegistry,
-            final DOMDataBroker domBroker
-    ) {
-        this.extensions = contextProvider;
-        this.dispatcher = dispatcher;
-        this.codecsRegistry = codecsRegistry;
-        this.domBroker = domBroker;
-        this.policyProvider = policyProvider;
+            final BGPStateProviderRegistry stateProviderRegistry,
+            final DOMDataBroker domBroker) {
+        this.extensions = requireNonNull(contextProvider);
+        this.dispatcher = requireNonNull(dispatcher);
+        this.codecsRegistry = requireNonNull(codecsRegistry);
+        this.domBroker = requireNonNull(domBroker);
+        this.policyProvider = requireNonNull(policyProvider);
+        this.stateProviderRegistry = requireNonNull(stateProviderRegistry);
     }
 
     void start(final Global global, final String instanceName, final BGPTableTypeRegistryConsumer tableTypeRegistry) {
         Preconditions.checkState(this.ribImpl == null,
                 "Previous instance %s was not closed.", this);
         this.ribImpl = createRib(global, instanceName, tableTypeRegistry);
+        this.stateProviderRegistration =  this.stateProviderRegistry.register(this);
     }
 
     Boolean isGlobalEqual(final Global global) {
@@ -168,7 +174,9 @@ public final class RibImpl implements RIB, BGPRibStateConsumer, AutoCloseable {
     @Override
     public void close() {
         if (this.ribImpl != null) {
+            this.stateProviderRegistration.close();
             this.ribImpl.close();
+            this.stateProviderRegistration = null;
             this.ribImpl = null;
         }
     }
diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/state/AbstractBGPStateConsumer.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/state/AbstractBGPStateConsumer.java
deleted file mode 100644 (file)
index 90ee118..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (c) 2021 PANTHEON.tech, s.r.o. 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.impl.state;
-
-import com.google.common.collect.ImmutableList;
-import java.util.List;
-import java.util.Objects;
-import org.opendaylight.protocol.bgp.rib.spi.state.BGPPeerState;
-import org.opendaylight.protocol.bgp.rib.spi.state.BGPPeerStateConsumer;
-import org.opendaylight.protocol.bgp.rib.spi.state.BGPRibState;
-import org.opendaylight.protocol.bgp.rib.spi.state.BGPRibStateConsumer;
-import org.opendaylight.protocol.bgp.rib.spi.state.BGPStateConsumer;
-
-abstract class AbstractBGPStateConsumer implements BGPStateConsumer {
-    @Override
-    public final List<BGPRibState> getRibStats() {
-        return bgpRibStates().stream()
-            .map(BGPRibStateConsumer::getRIBState)
-            .filter(Objects::nonNull)
-            .collect(ImmutableList.toImmutableList());
-    }
-
-    @Override
-    public final List<BGPPeerState> getPeerStats() {
-        return bgpPeerStates().stream()
-            .map(BGPPeerStateConsumer::getPeerState)
-            .filter(Objects::nonNull)
-            .collect(ImmutableList.toImmutableList());
-    }
-
-    abstract List<BGPRibStateConsumer> bgpRibStates();
-
-    abstract List<BGPPeerStateConsumer> bgpPeerStates();
-}
index 63535a1c6c54d7f6970c3e922782f5c65bdeeb36..24fa869973ed0f92d059646caa8d74ca989b06c2 100644 (file)
@@ -32,7 +32,7 @@ import org.opendaylight.protocol.bgp.rib.spi.state.BGPGracelfulRestartState;
 import org.opendaylight.protocol.bgp.rib.spi.state.BGPLlGracelfulRestartState;
 import org.opendaylight.protocol.bgp.rib.spi.state.BGPPeerMessagesState;
 import org.opendaylight.protocol.bgp.rib.spi.state.BGPPeerState;
-import org.opendaylight.protocol.bgp.rib.spi.state.BGPPeerStateConsumer;
+import org.opendaylight.protocol.bgp.rib.spi.state.BGPPeerStateProvider;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.operational.rev151009.BgpAfiSafiGracefulRestartState.Mode;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddressNoZone;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev200120.Notify;
@@ -45,7 +45,7 @@ import org.opendaylight.yangtools.yang.binding.Notification;
 
 public abstract class BGPPeerStateImpl extends DefaultRibReference implements BGPPeerState, BGPAfiSafiState,
         BGPGracelfulRestartState, BGPLlGracelfulRestartState,BGPErrorHandlingState, BGPPeerMessagesState,
-        BGPPeerStateConsumer, BGPMessagesListener {
+        BGPPeerStateProvider, BGPMessagesListener {
     private static final long NONE = 0L;
     private final IpAddressNoZone neighborAddress;
     private final Set<TablesKey> afiSafisAdvertized;
index e88615b34dc91c10cb523d81153752455f27627b..3e5794b3549a2b17a5d19b95caaff7d86b236007 100644 (file)
@@ -18,7 +18,7 @@ import org.opendaylight.protocol.bgp.rib.DefaultRibReference;
 import org.opendaylight.protocol.bgp.rib.impl.state.rib.TotalPathsCounter;
 import org.opendaylight.protocol.bgp.rib.impl.state.rib.TotalPrefixesCounter;
 import org.opendaylight.protocol.bgp.rib.spi.state.BGPRibState;
-import org.opendaylight.protocol.bgp.rib.spi.state.BGPRibStateConsumer;
+import org.opendaylight.protocol.bgp.rib.spi.state.BGPRibStateProvider;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.AsNumber;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.bgp.rib.Rib;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.bgp.rib.RibKey;
@@ -26,7 +26,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.BgpId;
 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
 
-public class BGPRibStateImpl extends DefaultRibReference implements BGPRibState, BGPRibStateConsumer {
+public class BGPRibStateImpl extends DefaultRibReference implements BGPRibState, BGPRibStateProvider {
     private final BgpId routeId;
     private final AsNumber localAs;
     @GuardedBy("this")
diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/state/BGPStateCollector.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/state/BGPStateCollector.java
new file mode 100644 (file)
index 0000000..2b77720
--- /dev/null
@@ -0,0 +1,93 @@
+/*
+ * Copyright (c) 2016 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.protocol.bgp.rib.impl.state;
+
+import com.google.common.collect.ImmutableList;
+import java.util.List;
+import java.util.Objects;
+import java.util.concurrent.CopyOnWriteArrayList;
+import javax.inject.Inject;
+import javax.inject.Singleton;
+import org.eclipse.jdt.annotation.NonNull;
+import org.kohsuke.MetaInfServices;
+import org.opendaylight.protocol.bgp.rib.spi.state.BGPPeerState;
+import org.opendaylight.protocol.bgp.rib.spi.state.BGPPeerStateProvider;
+import org.opendaylight.protocol.bgp.rib.spi.state.BGPRibState;
+import org.opendaylight.protocol.bgp.rib.spi.state.BGPRibStateProvider;
+import org.opendaylight.protocol.bgp.rib.spi.state.BGPStateProvider;
+import org.opendaylight.protocol.bgp.rib.spi.state.BGPStateProviderRegistry;
+import org.opendaylight.yangtools.concepts.AbstractObjectRegistration;
+import org.opendaylight.yangtools.concepts.Registration;
+import org.osgi.service.component.annotations.Component;
+
+@Singleton
+@MetaInfServices
+@Component(immediate = true, service = {BGPStateProvider.class, BGPStateProviderRegistry.class})
+public final class BGPStateCollector implements BGPStateProviderRegistry, BGPStateProvider {
+    private final class BGPPeerStateProviderRegistration extends AbstractObjectRegistration<BGPPeerStateProvider> {
+        BGPPeerStateProviderRegistration(final @NonNull BGPPeerStateProvider instance) {
+            super(instance);
+        }
+
+        @Override
+        protected void removeRegistration() {
+            bgpPeerStates.remove(this);
+        }
+    }
+
+    private final class BGPRibStateProviderRegistration extends AbstractObjectRegistration<BGPRibStateProvider> {
+        BGPRibStateProviderRegistration(final @NonNull BGPRibStateProvider instance) {
+            super(instance);
+        }
+
+        @Override
+        protected void removeRegistration() {
+            bgpRibStates.remove(this);
+        }
+    }
+
+    private final List<BGPPeerStateProviderRegistration> bgpPeerStates = new CopyOnWriteArrayList<>();
+    private final List<BGPRibStateProviderRegistration> bgpRibStates = new CopyOnWriteArrayList<>();
+
+    @Inject
+    public BGPStateCollector() {
+        // Exposed for DI
+    }
+
+    @Override
+    public Registration register(final BGPRibStateProvider ribStateProvider) {
+        final var reg = new BGPRibStateProviderRegistration(ribStateProvider);
+        bgpRibStates.add(reg);
+        return reg;
+    }
+
+    @Override
+    public Registration register(final BGPPeerStateProvider peerStateProvider) {
+        final var reg = new BGPPeerStateProviderRegistration(peerStateProvider);
+        bgpPeerStates.add(reg);
+        return reg;
+    }
+
+    @Override
+    public List<BGPRibState> getRibStats() {
+        return bgpRibStates.stream()
+            .filter(AbstractObjectRegistration::notClosed)
+            .map(reg -> reg.getInstance().getRIBState())
+            .filter(Objects::nonNull)
+            .collect(ImmutableList.toImmutableList());
+    }
+
+    @Override
+    public List<BGPPeerState> getPeerStats() {
+        return bgpPeerStates.stream()
+            .filter(AbstractObjectRegistration::notClosed)
+            .map(reg -> reg.getInstance().getPeerState())
+            .filter(Objects::nonNull)
+            .collect(ImmutableList.toImmutableList());
+    }
+}
diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/state/BGPStateCollectorImpl.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/state/BGPStateCollectorImpl.java
deleted file mode 100644 (file)
index 933f141..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (c) 2016 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.protocol.bgp.rib.impl.state;
-
-import java.util.List;
-import java.util.concurrent.CopyOnWriteArrayList;
-import javax.inject.Inject;
-import javax.inject.Singleton;
-import org.opendaylight.protocol.bgp.rib.spi.state.BGPPeerStateConsumer;
-import org.opendaylight.protocol.bgp.rib.spi.state.BGPRibStateConsumer;
-import org.opendaylight.protocol.bgp.rib.spi.state.BGPStateProvider;
-
-@Singleton
-// This class is thread-safe
-public final class BGPStateCollectorImpl extends AbstractBGPStateConsumer implements BGPStateProvider {
-    private final List<BGPRibStateConsumer> bgpRibStates = new CopyOnWriteArrayList<>();
-    private final List<BGPPeerStateConsumer> bgpPeerStates = new CopyOnWriteArrayList<>();
-
-    @Inject
-    public BGPStateCollectorImpl() {
-        // Exposed for DI
-    }
-
-    @Override
-    public void bind(final BGPRibStateConsumer bgpState) {
-        bgpRibStates.add(bgpState);
-    }
-
-    @Override
-    public void bind(final BGPPeerStateConsumer bgpState) {
-        bgpPeerStates.add(bgpState);
-    }
-
-    @Override
-    public void unbind(final BGPRibStateConsumer bgpState) {
-        bgpRibStates.remove(bgpState);
-    }
-
-    @Override
-    public void unbind(final BGPPeerStateConsumer bgpState) {
-        bgpPeerStates.remove(bgpState);
-    }
-
-    @Override
-    List<BGPRibStateConsumer> bgpRibStates() {
-        return bgpRibStates;
-    }
-
-    @Override
-    List<BGPPeerStateConsumer> bgpPeerStates() {
-        return bgpPeerStates;
-    }
-}
diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/state/OSGiBGPStateConsumer.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/state/OSGiBGPStateConsumer.java
deleted file mode 100644 (file)
index 878666b..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (c) 2021 PANTHEON.tech, s.r.o. 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.impl.state;
-
-import java.util.List;
-import org.opendaylight.protocol.bgp.rib.spi.state.BGPPeerStateConsumer;
-import org.opendaylight.protocol.bgp.rib.spi.state.BGPRibStateConsumer;
-import org.opendaylight.protocol.bgp.rib.spi.state.BGPStateConsumer;
-import org.osgi.service.component.annotations.Component;
-import org.osgi.service.component.annotations.Reference;
-import org.osgi.service.component.annotations.ReferencePolicyOption;
-
-@Component(immediate = true, service = BGPStateConsumer.class)
-public final class OSGiBGPStateConsumer extends AbstractBGPStateConsumer {
-    @Reference(policyOption = ReferencePolicyOption.GREEDY)
-    volatile List<BGPRibStateConsumer> ribStates;
-    @Reference(policyOption = ReferencePolicyOption.GREEDY)
-    volatile List<BGPPeerStateConsumer> peerStates;
-
-    @Override
-    List<BGPRibStateConsumer> bgpRibStates() {
-        return ribStates;
-    }
-
-    @Override
-    List<BGPPeerStateConsumer> bgpPeerStates() {
-        return peerStates;
-    }
-}
index 3ea0cda17c924559d12b43ffeb46f9d71a08fd10..cd368716862d51a58c124c0829c91cbca93796a4 100644 (file)
@@ -16,6 +16,7 @@ import org.junit.Before;
 import org.junit.Test;
 import org.mockito.Mockito;
 import org.opendaylight.mdsal.dom.api.DOMTransactionChainListener;
+import org.opendaylight.protocol.bgp.rib.impl.state.BGPStateCollector;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.ConfigBuilder;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.Neighbor;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.NeighborBuilder;
@@ -24,7 +25,8 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.NeighborPeerGroupConfigBuilder;
 
 public class AppPeerTest extends AbstractConfig {
-    private static final AppPeer APP_PEER = new AppPeer();
+    private final AppPeer appPeer = new AppPeer(new BGPStateCollector());
+
     private final Neighbor neighbor = new NeighborBuilder()
             .setConfig(new ConfigBuilder()
                 .addAugmentation(new NeighborPeerGroupConfigBuilder()
@@ -41,40 +43,40 @@ public class AppPeerTest extends AbstractConfig {
 
     @Test
     public void testAppPeer() {
-        APP_PEER.start(this.rib, this.neighbor, null, this.peerGroupLoader, this.tableTypeRegistry);
+        appPeer.start(this.rib, this.neighbor, null, this.peerGroupLoader, this.tableTypeRegistry);
         Mockito.verify(this.rib).getYangRibId();
         Mockito.verify(this.rib).getService();
         Mockito.verify(this.rib).createPeerDOMChain(any(DOMTransactionChainListener.class));
         Mockito.verify(this.rib, times(1)).getLocalTablesKeys();
 
-        APP_PEER.instantiateServiceInstance();
+        appPeer.instantiateServiceInstance();
         Mockito.verify(this.rib, times(3)).getYangRibId();
         Mockito.verify(this.rib, times(2)).getRibSupportContext();
         Mockito.verify(this.rib, times(2)).getLocalTablesKeys();
         Mockito.verify(this.rib, times(2)).createPeerDOMChain(any(DOMTransactionChainListener.class));
         Mockito.verify(this.domTx).newWriteOnlyTransaction();
 
-        APP_PEER.closeServiceInstance();
+        appPeer.closeServiceInstance();
         Mockito.verify(this.domTx, times(2)).close();
-        APP_PEER.close();
+        appPeer.close();
 
-        APP_PEER.restart(this.rib, null, this.peerGroupLoader, this.tableTypeRegistry);
-        APP_PEER.instantiateServiceInstance();
+        appPeer.restart(this.rib, null, this.peerGroupLoader, this.tableTypeRegistry);
+        appPeer.instantiateServiceInstance();
         Mockito.verify(this.rib, times(6)).getYangRibId();
         Mockito.verify(this.rib, times(4)).getService();
         Mockito.verify(this.rib, times(4)).createPeerDOMChain(any(DOMTransactionChainListener.class));
         Mockito.verify(this.listener, times(2)).close();
 
-        assertTrue(APP_PEER.containsEqualConfiguration(this.neighbor));
-        assertFalse(APP_PEER.containsEqualConfiguration(new NeighborBuilder()
+        assertTrue(appPeer.containsEqualConfiguration(this.neighbor));
+        assertFalse(appPeer.containsEqualConfiguration(new NeighborBuilder()
                 .setNeighborAddress(new IpAddress(new Ipv4Address("127.0.0.2"))).build()));
-        APP_PEER.closeServiceInstance();
+        appPeer.closeServiceInstance();
         Mockito.verify(this.domTx, times(4)).close();
 
-        APP_PEER.instantiateServiceInstance();
+        appPeer.instantiateServiceInstance();
         Mockito.verify(this.rib, times(6)).createPeerDOMChain(any(DOMTransactionChainListener.class));
-        APP_PEER.closeServiceInstance();
+        appPeer.closeServiceInstance();
         Mockito.verify(this.domTx, times(6)).close();
-        APP_PEER.close();
+        appPeer.close();
     }
 }
index e6086e9fb4a01018585f762fb07ee10fccb7c686..0459e0a7479ab284ba9bb0b9548a55d310ac71a9 100644 (file)
@@ -44,7 +44,9 @@ import org.opendaylight.protocol.bgp.rib.impl.DefaultRibPoliciesMockTest;
 import org.opendaylight.protocol.bgp.rib.impl.protocol.BGPReconnectPromise;
 import org.opendaylight.protocol.bgp.rib.impl.spi.BGPDispatcher;
 import org.opendaylight.protocol.bgp.rib.impl.spi.CodecsRegistry;
+import org.opendaylight.protocol.bgp.rib.impl.state.BGPStateCollector;
 import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionConsumerContext;
+import org.opendaylight.protocol.bgp.rib.spi.state.BGPStateProviderRegistry;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.Bgp;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.Global;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.Neighbors;
@@ -92,6 +94,7 @@ public class BgpDeployerTest extends DefaultRibPoliciesMockTest {
     @Mock
     private ClusterSingletonServiceProvider singletonServiceProvider;
 
+    private final BGPStateProviderRegistry stateProviderRegistry = new BGPStateCollector();
     private DefaultBgpDeployer deployer;
     private BGPClusterSingletonService spiedBgpSingletonService;
     private CountDownLatch bgpSingletonObtainedLatch;
@@ -112,11 +115,10 @@ public class BgpDeployerTest extends DefaultRibPoliciesMockTest {
         final Future future = mock(BGPReconnectPromise.class);
         doReturn(true).when(future).cancel(true);
         doReturn(future).when(this.dispatcher).createReconnectingClient(any(), any(), anyInt(), any());
-
         this.deployer = spy(new DefaultBgpDeployer(NETWORK_INSTANCE_NAME, this.singletonServiceProvider,
                 this.rpcRegistry, this.extensionContext, this.dispatcher,
                 new DefaultBGPRibRoutingPolicyFactory(getDataBroker(), new StatementRegistry()),
-                this.codecsRegistry, getDomBroker(), getDataBroker(), this.tableTypeRegistry));
+                this.codecsRegistry, getDomBroker(), getDataBroker(), this.tableTypeRegistry, stateProviderRegistry));
         this.bgpSingletonObtainedLatch = new CountDownLatch(1);
         doAnswer(invocationOnMock -> {
                 final BGPClusterSingletonService real =
index 9182c78bc474a30ce2cfe5790302727913e24a95..9bf476e32bbbef223495ae6e7db51db523f081fb 100644 (file)
@@ -24,6 +24,7 @@ import java.util.Map;
 import org.junit.Before;
 import org.junit.Test;
 import org.opendaylight.mdsal.binding.api.RpcProviderService;
+import org.opendaylight.protocol.bgp.rib.impl.state.BGPStateCollector;
 import org.opendaylight.protocol.concepts.KeyMapping;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafi;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafiBuilder;
@@ -127,7 +128,7 @@ public class BgpPeerTest extends AbstractConfig {
     @Before
     public void setUp() throws Exception {
         super.setUp();
-        this.bgpPeer = new BgpPeer(mock(RpcProviderService.class));
+        this.bgpPeer = new BgpPeer(mock(RpcProviderService.class), new BGPStateCollector());
     }
 
     @Test
index a04bcd408ec79292cc40fc5dda2ce7cafc939c8b..0ec3ce9a251d555124160201b115584b805ac4e7 100644 (file)
@@ -25,6 +25,7 @@ import org.opendaylight.mdsal.dom.api.DOMDataBroker;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeService;
 import org.opendaylight.protocol.bgp.parser.BgpTableTypeImpl;
 import org.opendaylight.protocol.bgp.rib.impl.spi.CodecsRegistry;
+import org.opendaylight.protocol.bgp.rib.impl.state.BGPStateCollector;
 import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionConsumerContext;
 import org.opendaylight.protocol.bgp.rib.spi.RIBSupport;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafi;
@@ -97,6 +98,7 @@ public class RibImplTest extends AbstractConfig {
                 this.dispatcher,
                 this.policyProvider,
                 this.codecsRegistry,
+                new BGPStateCollector(),
                 this.domDataBroker);
         ribImpl.start(createGlobal(), "rib-test", this.tableTypeRegistry);
         verify(this.domDataBroker).getExtensions();
diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/state/BGPStateCollectorImplTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/state/BGPStateCollectorImplTest.java
deleted file mode 100644 (file)
index 62b1f1d..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (c) 2016 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.protocol.bgp.rib.impl.state;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.opendaylight.protocol.bgp.rib.spi.state.BGPPeerState;
-import org.opendaylight.protocol.bgp.rib.spi.state.BGPPeerStateConsumer;
-import org.opendaylight.protocol.bgp.rib.spi.state.BGPRibState;
-import org.opendaylight.protocol.bgp.rib.spi.state.BGPRibStateConsumer;
-
-public class BGPStateCollectorImplTest {
-    @Mock
-    private BGPRibStateConsumer bgpribStateConsumer;
-    @Mock
-    private BGPPeerStateConsumer bgpPeerStateConsumer;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-    }
-
-    @Test
-    public void getRibStatsTest() {
-        doReturn(mock(BGPPeerState.class)).when(this.bgpPeerStateConsumer).getPeerState();
-        doReturn(mock(BGPRibState.class)).when(this.bgpribStateConsumer).getRIBState();
-        final BGPStateCollectorImpl collector = new BGPStateCollectorImpl();
-
-        collector.bind(this.bgpribStateConsumer);
-        collector.bind(this.bgpPeerStateConsumer);
-        assertFalse(collector.getRibStats().isEmpty());
-        assertFalse(collector.getPeerStats().isEmpty());
-
-        collector.unbind(this.bgpribStateConsumer);
-        collector.unbind(this.bgpPeerStateConsumer);
-        assertTrue(collector.getRibStats().isEmpty());
-        assertTrue(collector.getPeerStats().isEmpty());
-    }
-
-    @Test
-    public void getRibStatsEmptyPeerTest() {
-        doReturn(mock(BGPRibState.class)).when(this.bgpribStateConsumer).getRIBState();
-        doReturn(null).when(this.bgpPeerStateConsumer).getPeerState();
-        final BGPStateCollectorImpl collector = new BGPStateCollectorImpl();
-
-        collector.bind(this.bgpribStateConsumer);
-        collector.bind(this.bgpPeerStateConsumer);
-        assertFalse(collector.getRibStats().isEmpty());
-        assertTrue(collector.getPeerStats().isEmpty());
-    }
-
-    @Test
-    public void getRibStatsEmptyRibTest() {
-        doReturn(null).when(this.bgpribStateConsumer).getRIBState();
-        doReturn(null).when(this.bgpPeerStateConsumer).getPeerState();
-        final BGPStateCollectorImpl collector = new BGPStateCollectorImpl();
-        assertTrue(collector.getRibStats().isEmpty());
-        assertTrue(collector.getPeerStats().isEmpty());
-
-        collector.bind(this.bgpribStateConsumer);
-        collector.bind(this.bgpPeerStateConsumer);
-        assertTrue(collector.getRibStats().isEmpty());
-        assertTrue(collector.getPeerStats().isEmpty());
-    }
-}
\ No newline at end of file
diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/state/BGPStateCollectorTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/state/BGPStateCollectorTest.java
new file mode 100644 (file)
index 0000000..4dde564
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2016 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.protocol.bgp.rib.impl.state;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+
+import java.util.List;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+import org.opendaylight.protocol.bgp.rib.spi.state.BGPPeerState;
+import org.opendaylight.protocol.bgp.rib.spi.state.BGPPeerStateProvider;
+import org.opendaylight.protocol.bgp.rib.spi.state.BGPRibState;
+import org.opendaylight.protocol.bgp.rib.spi.state.BGPRibStateProvider;
+import org.opendaylight.yangtools.concepts.Registration;
+
+@RunWith(MockitoJUnitRunner.StrictStubs.class)
+public class BGPStateCollectorTest {
+    @Mock
+    private BGPRibStateProvider bgpribStateProvider;
+    @Mock
+    private BGPPeerStateProvider bgpPeerStateProvider;
+
+    private final BGPStateCollector collector = new BGPStateCollector();
+
+    @Test
+    public void getRibStatsTest() {
+        assertEquals(List.of(), collector.getRibStats());
+        assertEquals(List.of(), collector.getPeerStats());
+
+        doReturn(mock(BGPPeerState.class)).when(bgpPeerStateProvider).getPeerState();
+        doReturn(mock(BGPRibState.class)).when(bgpribStateProvider).getRIBState();
+        try (Registration ribStateReg = collector.register(bgpribStateProvider)) {
+            try (Registration peerStateReg = collector.register(bgpPeerStateProvider)) {
+                assertEquals(1, collector.getRibStats().size());
+                assertEquals(1, collector.getPeerStats().size());
+            }
+        }
+
+        assertEquals(List.of(), collector.getRibStats());
+        assertEquals(List.of(), collector.getPeerStats());
+    }
+
+    @Test
+    public void getRibStatsEmptyPeerTest() {
+        doReturn(null).when(bgpPeerStateProvider).getPeerState();
+        try (Registration peerStateReg = collector.register(bgpPeerStateProvider)) {
+            assertEquals(List.of(), collector.getPeerStats());
+        }
+    }
+
+    @Test
+    public void getRibStatsEmptyRibTest() {
+        // FIXME: this is weird, getRIBState() specifies @NonNull return
+        doReturn(null).when(bgpribStateProvider).getRIBState();
+        try (Registration ribStateReg = collector.register(bgpribStateProvider)) {
+            assertEquals(List.of(), collector.getRibStats());
+        }
+    }
+}
\ No newline at end of file
similarity index 93%
rename from bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/state/BGPPeerStateConsumer.java
rename to bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/state/BGPPeerStateProvider.java
index 5dacb7f013e7766a8c4cb7c5917c59fa350a6602..a67b996c732fc6dd13b0c8b5d10a8f05e5c3d980 100644 (file)
@@ -12,7 +12,7 @@ import org.eclipse.jdt.annotation.Nullable;
 /**
  * Interface for acquiring BGP Peer State.
  */
-public interface BGPPeerStateConsumer {
+public interface BGPPeerStateProvider {
     /**
      * Returns Peer Operational State.
      *
similarity index 93%
rename from bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/state/BGPRibStateConsumer.java
rename to bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/state/BGPRibStateProvider.java
index e3d911fc084387c257751ce641a1b4352002c7cd..6a3793fcc89ccc109c03fda88ccadf9e81d4118e 100644 (file)
@@ -13,7 +13,7 @@ import org.eclipse.jdt.annotation.NonNullByDefault;
  * Interface for acquiring BGP RIB State.
  */
 @NonNullByDefault
-public interface BGPRibStateConsumer {
+public interface BGPRibStateProvider {
     /**
      * Returns RIB Operational State.
      *
diff --git a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/state/BGPStateConsumer.java b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/state/BGPStateConsumer.java
deleted file mode 100644 (file)
index 7f61c7b..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (c) 2016 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.protocol.bgp.rib.spi.state;
-
-import java.util.List;
-import org.eclipse.jdt.annotation.NonNull;
-
-/**
- * Provides list with Operational State of BGP RIBs.
- */
-public interface BGPStateConsumer {
-    /**
-     * List of Registered BGP Rib States.
-     *
-     * @return ribs stats
-     */
-    @NonNull List<BGPRibState> getRibStats();
-
-    /**
-     * List of Registered BGP Peer State.
-     *
-     * @return peers stats
-     */
-    @NonNull List<BGPPeerState> getPeerStats();
-}
index 9057601c142dce9507dce348801105b2f928fe58..e9c4022384a06d5964907a75e8eb6c29cec5b7e3 100644 (file)
@@ -7,38 +7,25 @@
  */
 package org.opendaylight.protocol.bgp.rib.spi.state;
 
+import java.util.List;
 import org.eclipse.jdt.annotation.NonNullByDefault;
 
 /**
- * Provider of BGP Operational state.
+ * Provides operational state of BGP ({@link BGPRibState}s /{@link BGPPeerState}s).
  */
 @NonNullByDefault
 public interface BGPStateProvider {
     /**
-     * register Rib state.
+     * List of Registered BGP Rib States.
      *
-     * @param bgpState rib State
+     * @return ribs stats
      */
-    void bind(BGPRibStateConsumer bgpState);
+    List<BGPRibState> getRibStats();
 
     /**
-     * registerRib/Peer state.
+     * List of Registered BGP Peer States.
      *
-     * @param bgpState rib State
+     * @return peers stats
      */
-    void bind(BGPPeerStateConsumer bgpState);
-
-    /**
-     * Unregister Rib state.
-     *
-     * @param bgpState Rib/Peer State
-     */
-    void unbind(BGPRibStateConsumer bgpState);
-
-    /**
-     * Unregister Peer state.
-     *
-     * @param bgpState Peer State
-     */
-    void unbind(BGPPeerStateConsumer bgpState);
+    List<BGPPeerState> getPeerStats();
 }
diff --git a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/state/BGPStateProviderRegistry.java b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/state/BGPStateProviderRegistry.java
new file mode 100644 (file)
index 0000000..c2d0563
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2016 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.protocol.bgp.rib.spi.state;
+
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.opendaylight.yangtools.concepts.Registration;
+
+/**
+ * Registers BGP operational state providers.
+ */
+@NonNullByDefault
+public interface BGPStateProviderRegistry {
+    /**
+     * Register rib state provider.
+     *
+     * @param ribStateProvider rib state provider
+     */
+    Registration register(BGPRibStateProvider ribStateProvider);
+
+    /**
+     * Register peer state provider.
+     *
+     * @param peerStateProvider peer state provider
+     */
+    Registration register(BGPPeerStateProvider peerStateProvider);
+
+}
index ecb5e27195b8f8073921f8654e9782e60a0d9cc1..c97bea49bc9a4b90dec37e08178d2a1e7d59b254 100644 (file)
@@ -59,7 +59,6 @@ public class BmpDispatcherImplTest {
         doNothing().when(mockedSession).channelActive(any(ChannelHandlerContext.class));
         doNothing().when(mockedSession).channelInactive(any(ChannelHandlerContext.class));
         doNothing().when(mockedSession).channelUnregistered(any(ChannelHandlerContext.class));
-        doNothing().when(mockedSession).channelReadComplete(any(ChannelHandlerContext.class));
 
         bgpActivator = new BGPActivator();
         final BGPExtensionProviderContext context = new SimpleBGPExtensionProviderContext();