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;
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;
@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;
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);
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;
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
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)));
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);
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))) {
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));
*/
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;
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;
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;
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();
this.bgpAppPeerSingletonService = new BgpAppPeerSingletonService(rib, createAppRibId(neighbor),
IetfInetUtil.INSTANCE.ipv4AddressNoZoneFor(neighbor.getNeighborAddress().getIpv4Address()),
tableTypeRegistry);
+ this.stateProviderRegistration = this.stateProviderRegistry.register(this);
}
@Override
@Override
public synchronized void close() {
if (this.bgpAppPeerSingletonService != null) {
+ this.stateProviderRegistration.close();
+ this.stateProviderRegistration = null;
this.bgpAppPeerSingletonService = null;
}
}
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;
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;
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;
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;
this.bgpDispatcher = bgpDispatcher;
this.routingPolicyFactory = routingPolicyFactory;
this.codecsRegistry = codecsRegistry;
+ this.stateProviderRegistry = stateProviderRegistry;
this.domDataBroker = domDataBroker;
this.bgpIid = bgpIid;
final String ribInstanceName = getRibInstanceName(bgpIid);
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);
}
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());
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;
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",
this.bgpPeerSingletonService = new BgpPeerSingletonService(rib, neighbor, bgpIid, peerGroupLoader,
tableTypeRegistry);
this.currentConfiguration = neighbor;
+ this.stateProviderRegistration = this.stateProviderRegistry.register(this);
}
@Override
@Override
public void close() {
if (this.bgpPeerSingletonService != null) {
+ this.stateProviderRegistration.close();
this.bgpPeerSingletonService.closeServiceInstance();
+ this.stateProviderRegistration = null;
this.bgpPeerSingletonService = null;
}
}
}
}
- private final class BgpPeerSingletonService implements BGPPeerStateConsumer {
+ private final class BgpPeerSingletonService implements BGPPeerStateProvider {
private final boolean activeConnection;
private final BGPDispatcher dispatcher;
private final InetSocketAddress inetAddress;
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;
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;
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>() {
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;
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;
@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();
}
*/
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;
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;
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);
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) {
@Override
public void close() {
if (this.ribImpl != null) {
+ this.stateProviderRegistration.close();
this.ribImpl.close();
+ this.stateProviderRegistration = null;
this.ribImpl = null;
}
}
+++ /dev/null
-/*
- * 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();
-}
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;
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;
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;
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")
--- /dev/null
+/*
+ * 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());
+ }
+}
+++ /dev/null
-/*
- * 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;
- }
-}
+++ /dev/null
-/*
- * 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;
- }
-}
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;
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()
@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();
}
}
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;
@Mock
private ClusterSingletonServiceProvider singletonServiceProvider;
+ private final BGPStateProviderRegistry stateProviderRegistry = new BGPStateCollector();
private DefaultBgpDeployer deployer;
private BGPClusterSingletonService spiedBgpSingletonService;
private CountDownLatch bgpSingletonObtainedLatch;
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 =
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;
@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
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;
this.dispatcher,
this.policyProvider,
this.codecsRegistry,
+ new BGPStateCollector(),
this.domDataBroker);
ribImpl.start(createGlobal(), "rib-test", this.tableTypeRegistry);
verify(this.domDataBroker).getExtensions();
+++ /dev/null
-/*
- * 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
--- /dev/null
+/*
+ * 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
/**
* Interface for acquiring BGP Peer State.
*/
-public interface BGPPeerStateConsumer {
+public interface BGPPeerStateProvider {
/**
* Returns Peer Operational State.
*
* Interface for acquiring BGP RIB State.
*/
@NonNullByDefault
-public interface BGPRibStateConsumer {
+public interface BGPRibStateProvider {
/**
* Returns RIB Operational State.
*
+++ /dev/null
-/*
- * 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();
-}
*/
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();
}
--- /dev/null
+/*
+ * 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);
+
+}
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();