import org.opendaylight.protocol.bgp.rib.spi.PeerExportGroup.PeerExporTuple;
import org.opendaylight.protocol.bgp.rib.spi.RIBSupport;
import org.opendaylight.protocol.bgp.rib.spi.RouterIds;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.PeerId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.PeerRole;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey;
ribSup, discPeers, tx);
}
- private void removePathFromDataStore(final BestPath path, final boolean isFirstBestPath, final PathArgument routeIdPA,
- final YangInstanceIdentifier locRibTarget, final RIBSupport ribSup, final ExportPolicyPeerTracker peerPT, final TablesKey localTK,
- final CacheDisconnectedPeers discPeers, final DOMDataWriteTransaction tx) {
- LOG.trace("Best Path removed {}", path);
- final PathArgument routeIdAddPath = ribSup.getRouteIdAddPath(path.getPathId(), routeIdPA);
- final YangInstanceIdentifier pathAddPathTarget = ribSup.routePath(locRibTarget.node(ROUTES_IDENTIFIER), routeIdAddPath);
-
- fillLocRib(pathAddPathTarget, null, tx);
- fillAdjRibsOut(isFirstBestPath, null, null, null, routeIdPA, routeIdAddPath, path.getPeerId(), peerPT, localTK, ribSup, discPeers, tx);
- }
-
private void fillAdjRibsOut(final boolean isFirstBestPath, final ContainerNode attributes, final NormalizedNode<?, ?> value, final MapEntryNode addPathValue,
final PathArgument routeId, final PathArgument routeIdAddPath, final PeerId routePeerId, final ExportPolicyPeerTracker peerPT, final TablesKey
localTK, final RIBSupport ribSup, final CacheDisconnectedPeers discPeers, final DOMDataWriteTransaction tx) {
<prerequisites>
<maven>3.0.4</maven>
</prerequisites>
+ <properties>
+ <powermock.version>1.6.4</powermock.version>
+ </properties>
<dependencies>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
-
-
+ <dependency>
+ <groupId>org.powermock</groupId>
+ <artifactId>powermock</artifactId>
+ <version>${powermock.version}</version>
+ <type>pom</type>
+ </dependency>
+ <dependency>
+ <groupId>org.powermock</groupId>
+ <artifactId>powermock-module-junit4</artifactId>
+ <version>${powermock.version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.powermock</groupId>
+ <artifactId>powermock-api-mockito</artifactId>
+ <version>${powermock.version}</version>
+ <scope>test</scope>
+ </dependency>
</dependencies>
<build>
@Override
public void close() {
- this.effectiveRibInWriter.close();
- this.writer.removePeer();
- this.chain.close();
- this.writerChain.close();
+ if(this.effectiveRibInWriter != null) {
+ this.effectiveRibInWriter.close();
+ }
+ if(this.writer != null) {
+ this.writer.removePeer();
+ }
+ if(this.chain != null) {
+ this.chain.close();
+ }
+ if(this.writerChain != null) {
+ this.writerChain.close();
+ }
if (this.moduleTracker != null) {
this.moduleTracker.onInstanceClose();
}
Preconditions.checkNotNull(provider, "ClusterSingletonServiceProvider is null");
this.provider = provider;
this.configurationWriter = configurationWriter;
- LOG.info("RIB Singleton Service {} registered", this.getIdentifier());
+ LOG.info("RIB Singleton Service {} registered", getIdentifier());
//this need to be always the last step
this.registration = registerClusterSingletonService(this);
}
@Override
public synchronized void close() throws Exception {
- this.domChain.close();
- if (registration != null) {
- registration.close();
- registration = null;
+ if (this.registration != null) {
+ this.registration.close();
+ this.registration = null;
+ }
+ if(this.domChain != null) {
+ this.domChain.close();
}
}
return this.bgpIdentifier;
}
+ @Nonnull
@Override
public Set<? extends BgpTableType> getLocalTables() {
return this.localTables;
if(this.configurationWriter != null) {
this.configurationWriter.apply();
}
- LOG.info("RIB Singleton Service {} instantiated", this.getIdentifier());
+ LOG.info("RIB Singleton Service {} instantiated", getIdentifier());
LOG.debug("Instantiating RIB table {} at {}", this.ribId , this.yangRibId);
final ContainerNode bgpRib = Builders.containerBuilder().withNodeIdentifier(new NodeIdentifier(BgpRib.QNAME))
for (final BgpTableType t : this.localTables) {
final TablesKey key = new TablesKey(t.getAfi(), t.getSafi());
this.localTablesKeys.add(key);
- startLocRib(key, policyDatabase);
+ startLocRib(key, this.policyDatabase);
}
if (this.configModuleTracker != null) {
@Override
public ListenableFuture<Void> closeServiceInstance() {
- LOG.info("Close RIB Singleton Service {}", this.getIdentifier());
+ LOG.info("Close RIB Singleton Service {}", getIdentifier());
for (final LocRibWriter locRib : this.locRibs) {
try {
locRib.close();
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-public class AppPeer implements PeerBean {
+public final class AppPeer implements PeerBean {
private static final Logger LOG = LoggerFactory.getLogger(AppPeer.class);
private static final QName APP_ID_QNAME = QName.create(ApplicationRib.QNAME, "id").intern();
private Neighbor currentConfiguration;
@Override
public ListenableFuture<Void> closeServiceInstance() {
LOG.info("Application Peer Singleton Service {} instance closed", getIdentifier());
- this.registration.close();
+ if(this.registration != null) {
+ this.registration.close();
+ }
this.applicationPeer.close();
return Futures.immediateFuture(null);
}
if(ribImpl == null ) {
onGlobalCreated(rootIdentifier, global, configurationWriter);
} else if (!ribImpl.isGlobalEqual(global)) {
- final List<PeerBean> closedPeers = closeAllBindedPeers(rootIdentifier);
- ribImpl.close();
- initiateRibInstance(rootIdentifier, global, ribImpl, configurationWriter);
- closedPeers.forEach(peer -> peer.restart(ribImpl, this.mappingService));
+ onGlobalUpdated(rootIdentifier, global, ribImpl, configurationWriter);
}
}
LOG.debug("RIB instance created {}", ribImpl);
}
+ private void onGlobalUpdated(final InstanceIdentifier<Bgp> rootIdentifier, final Global global, final RibImpl ribImpl,
+ final WriteConfiguration configurationWriter) {
+ final List<PeerBean> closedPeers = closeAllBindedPeers(rootIdentifier);
+ ribImpl.close();
+ initiateRibInstance(rootIdentifier, global, ribImpl, configurationWriter);
+ closedPeers.forEach(peer -> peer.restart(ribImpl, this.mappingService));
+ }
+
@Override
public synchronized void onGlobalRemoved(final InstanceIdentifier<Bgp> rootIdentifier) {
LOG.debug("Removing RIB instance: {}", rootIdentifier);
import org.slf4j.LoggerFactory;
-public class BgpPeer implements PeerBean, BGPPeerRuntimeMXBean {
+public final class BgpPeer implements PeerBean, BGPPeerRuntimeMXBean {
private static final Logger LOG = LoggerFactory.getLogger(BgpPeer.class);
@Override
public void restart(final RIB rib, final BGPOpenConfigMappingService mappingService) {
Preconditions.checkState(this.currentConfiguration != null);
+ closeSingletonService();
start(rib, this.currentConfiguration, mappingService, null);
}
@Override
public void close() {
+ closeSingletonService();
+ this.currentConfiguration = null;
+ if (this.serviceRegistration != null) {
+ this.serviceRegistration.unregister();
+ this.serviceRegistration = null;
+ }
+ }
+
+ private void closeSingletonService() {
try {
this.bgpPeerSingletonService.close();
this.bgpPeerSingletonService = null;
} catch (final Exception e) {
LOG.warn("Failed to close peer instance", e);
}
- this.currentConfiguration = null;
- if (this.serviceRegistration != null) {
- this.serviceRegistration.unregister();
- this.serviceRegistration = null;
- }
}
@Override
this.neighborAddress = neighbor.getNeighborAddress();
this.bgpPeer = new BGPPeer(Ipv4Util.toStringIP(this.neighborAddress), rib, mappingService.toPeerRole(neighbor), BgpPeer.this.rpcRegistry);
final List<BgpParameters> bgpParameters = getBgpParameters(neighbor, rib, mappingService);
- final KeyMapping key = OpenConfigMappingUtil.getNeighborKey(neighbor);
+ final KeyMapping keyMapping = OpenConfigMappingUtil.getNeighborKey(neighbor);
this.prefs = new BGPSessionPreferences(rib.getLocalAs(), getHoldTimer(neighbor), rib.getBgpIdentifier(), getPeerAs(neighbor, rib),
- bgpParameters, getPassword(key));
+ bgpParameters, getPassword(keyMapping));
this.activeConnection = OpenConfigMappingUtil.isActive(neighbor);
this.dispatcher = rib.getDispatcher();
this.inetAddress = Ipv4Util.toInetSocketAddress(this.neighborAddress, OpenConfigMappingUtil.getPort(neighbor));
this.retryTimer = OpenConfigMappingUtil.getRetryTimer(neighbor);
- this.key = Optional.fromNullable(key);
+ this.key = Optional.fromNullable(keyMapping);
this.configurationWriter = configurationWriter;
this.serviceGroupIdentifier = rib.getRibIServiceGroupIdentifier();
LOG.info("Peer Singleton Service {} registered", this.serviceGroupIdentifier);
import static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IetfInetUtil.INSTANCE;
-import com.google.common.base.Predicate;
-import com.google.common.collect.FluentIterable;
import com.google.common.collect.ImmutableList;
import java.util.Collections;
import java.util.List;
}
final List<AfiSafi> afiSafi = afiSAfis.getAfiSafi();
if (setDeafultIPv4) {
- final boolean anyMatch = FluentIterable.from(afiSafi).anyMatch(new Predicate<AfiSafi>() {
- @Override
- public boolean apply(final AfiSafi input) {
- return input.getAfiSafiName().getName().equals(IPV4UNICAST.class);
- }
- });
+ final boolean anyMatch = afiSafi.stream().anyMatch(input -> input.getAfiSafiName().equals(IPV4UNICAST.class));
if (!anyMatch) {
afiSafi.add(IPV4_AFISAFI);
}
import com.google.common.base.Preconditions;
import java.util.ArrayList;
import java.util.List;
+import java.util.Map;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import org.opendaylight.controller.config.api.IdentityAttributeRef;
import org.opendaylight.protocol.bgp.rib.impl.stats.peer.route.PerTableTypeRouteCounter;
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.rev130925.RibId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.BgpId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.ClusterIdentifier;
import org.opendaylight.yangtools.yang.binding.util.BindingReflections;
import org.opendaylight.yangtools.yang.common.QName;
-/**
- * @author Kevin Wang
- */
public class BGPRenderStatsImpl implements BGPRenderStats {
private final PerTableTypeRouteCounter locRibRouteCounter = new PerTableTypeRouteCounter("loc-rib route");
private final BgpId bgpId;
this.ribId = Preconditions.checkNotNull(ribId);
this.localAs = localAs;
this.clusterId = clusterId;
- this.configuredPeerCounter = new UnsignedInt32Counter("Configured Peer of BGP-RIB "+ this.ribId.getValue());
- this.connectedPeerCounter = new UnsignedInt32Counter("Connected Peer of BGP-RIB "+ this.ribId.getValue());
+ this.configuredPeerCounter = new UnsignedInt32Counter("Configured Peer of BGP-RIB " + this.ribId.getValue());
+ this.connectedPeerCounter = new UnsignedInt32Counter("Connected Peer of BGP-RIB " + this.ribId.getValue());
}
@Override
// fill in the the statistic part
final UnsignedInt32Counter totalRouteCount = new UnsignedInt32Counter("Total Loc-Rib Route Count");
final List<LocRibRouteTable> locRibRouteTableList = new ArrayList<>();
- this.locRibRouteCounter.getCounters()
- .entrySet()
- .stream()
- .forEach(e -> {
- final LocRibRouteTable table = new LocRibRouteTable();
- final QName afi = BindingReflections.getQName(e.getKey().getAfi()).intern();
- final QName safi = BindingReflections.getQName(e.getKey().getSafi()).intern();
- table.setAfi(new IdentityAttributeRef(afi.toString()));
- table.setSafi(new IdentityAttributeRef(safi.toString()));
- table.setRoutesCount(e.getValue().getCountAsZeroBasedCounter32());
-
- locRibRouteTableList.add(table);
- totalRouteCount.increaseCount(e.getValue().getCount());
- });
+ this.locRibRouteCounter.getCounters().entrySet().stream().forEach(e -> generateCounters(e, locRibRouteTableList, totalRouteCount));
renderState.setLocRibRouteTable(locRibRouteTableList);
renderState.setLocRibRoutesCount(totalRouteCount.getCountAsZeroBasedCounter32());
return renderState;
}
+ private void generateCounters(final Map.Entry<TablesKey, UnsignedInt32Counter> e, final List<LocRibRouteTable> locRibRouteTableList,
+ final UnsignedInt32Counter totalRouteCount) {
+ final LocRibRouteTable table = new LocRibRouteTable();
+ final QName afi = BindingReflections.getQName(e.getKey().getAfi()).intern();
+ final QName safi = BindingReflections.getQName(e.getKey().getSafi()).intern();
+ table.setAfi(new IdentityAttributeRef(afi.toString()));
+ table.setSafi(new IdentityAttributeRef(safi.toString()));
+ table.setRoutesCount(e.getValue().getCountAsZeroBasedCounter32());
+ locRibRouteTableList.add(table);
+ totalRouteCount.increaseCount(e.getValue().getCount());
+
+ }
+
@Override
public PerTableTypeRouteCounter getLocRibRouteCounter() {
return this.locRibRouteCounter;
--- /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;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.opendaylight.protocol.bgp.rib.impl.AdjRibInWriter.PEER_ID_QNAME;
+
+import com.google.common.collect.ImmutableMap;
+import org.junit.Test;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.PeerId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.rib.Peer;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
+
+public class RouteUpdateKeyTest {
+ private static final PeerId PEER_ID = new PeerId("127.0.0.1");
+ private static final PeerId PEER_ID_2 = new PeerId("127.0.0.2");
+ private static final NodeIdentifierWithPredicates NIWP_PEER = new NodeIdentifierWithPredicates(Peer.QNAME,
+ ImmutableMap.of(PEER_ID_QNAME, PEER_ID.getValue()));
+
+ @Test
+ public void testRouteUpdateKey() {
+ final RouteUpdateKey rk = new RouteUpdateKey(PEER_ID, NIWP_PEER);
+ assertEquals(PEER_ID, rk.getPeerId());
+ assertEquals(NIWP_PEER, rk.getRouteId());
+ assertTrue(rk.equals(new RouteUpdateKey(PEER_ID, NIWP_PEER)));
+ assertTrue(rk.equals(rk));
+ assertFalse(rk.equals(null));
+ assertFalse(rk.equals(new RouteUpdateKey(PEER_ID_2, NIWP_PEER)));
+ assertFalse(rk.equals(new RouteUpdateKey(PEER_ID, new NodeIdentifierWithPredicates(Peer.QNAME,
+ ImmutableMap.of(PEER_ID_QNAME, PEER_ID_2.getValue())))));
+ }
+
+}
\ 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.config;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+
+import com.google.common.base.Optional;
+import com.google.common.util.concurrent.CheckedFuture;
+import io.netty.util.concurrent.Future;
+import java.net.InetSocketAddress;
+import java.util.Collections;
+import org.junit.Before;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListener;
+import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeService;
+import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction;
+import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain;
+import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService;
+import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration;
+import org.opendaylight.mdsal.singleton.common.api.ServiceGroupIdentifier;
+import org.opendaylight.protocol.bgp.openconfig.spi.BGPOpenConfigMappingService;
+import org.opendaylight.protocol.bgp.parser.BgpTableTypeImpl;
+import org.opendaylight.protocol.bgp.rib.impl.spi.AbstractImportPolicy;
+import org.opendaylight.protocol.bgp.rib.impl.spi.BGPDispatcher;
+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.BgpDeployer;
+import org.opendaylight.protocol.bgp.rib.impl.spi.ImportPolicyPeerTracker;
+import org.opendaylight.protocol.bgp.rib.impl.spi.RIB;
+import org.opendaylight.protocol.bgp.rib.impl.spi.RIBSupportContextRegistry;
+import org.opendaylight.protocol.bgp.rib.impl.stats.UnsignedInt32Counter;
+import org.opendaylight.protocol.bgp.rib.impl.stats.rib.impl.BGPRenderStats;
+import org.opendaylight.protocol.bgp.rib.spi.BGPSessionListener;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.AsNumber;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.SendReceive;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.mp.capabilities.add.path.capability.AddressFamiliesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.PeerId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.PeerRole;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.Rib;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.BgpId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv4AddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily;
+import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
+import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
+import org.osgi.framework.ServiceRegistration;
+
+class AbstractConfig {
+ protected static final AsNumber AS = new AsNumber(123456L);
+ @Mock
+ protected RIB rib;
+ @Mock
+ protected ClusterSingletonServiceRegistration singletonServiceRegistration;
+ @Mock
+ protected BGPOpenConfigMappingService mappingService;
+ @Mock
+ protected BgpDeployer.WriteConfiguration configurationWriter;
+ @Mock
+ protected DOMTransactionChain domTx;
+ @Mock
+ protected BGPRenderStats render;
+ @Mock
+ protected BGPDispatcher dispatcher;
+ @Mock
+ protected ServiceRegistration serviceRegistration;
+ @Mock
+ protected BGPPeerRegistry bgpPeerRegistry;
+ @Mock
+ protected ListenerRegistration listener;
+ @Mock
+ protected Future future;
+ protected ClusterSingletonService singletonService;
+ @Mock
+ protected DOMDataWriteTransaction domDW;
+ @Mock
+ private ImportPolicyPeerTracker importPolicyPeerTracker;
+ @Mock
+ private DOMDataTreeChangeService dataTreeChangeService;
+
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+ Mockito.doAnswer(new Answer<ClusterSingletonServiceRegistration>() {
+ @Override
+ public ClusterSingletonServiceRegistration answer(final InvocationOnMock invocationOnMock) throws Throwable {
+ singletonService = (ClusterSingletonService) invocationOnMock.getArguments()[0];
+ return singletonServiceRegistration;
+ }
+ }).when(this.rib).registerClusterSingletonService(any(ClusterSingletonService.class));
+
+ Mockito.doReturn(new UnsignedInt32Counter("counter")).when(this.render).getConfiguredPeerCounter();
+ Mockito.doReturn(this.render).when(this.rib).getRenderStats();
+ Mockito.doReturn(this.domTx).when(this.rib).createPeerChain(any(TransactionChainListener.class));
+ Mockito.doReturn(AS).when(this.rib).getLocalAs();
+ Mockito.doReturn(this.importPolicyPeerTracker).when(this.rib).getImportPolicyPeerTracker();
+ Mockito.doNothing().when(this.importPolicyPeerTracker).peerRoleChanged(any(YangInstanceIdentifier.class), any(PeerRole.class));
+ Mockito.doReturn(mock(AbstractImportPolicy.class)).when(this.importPolicyPeerTracker).policyFor(any(PeerId.class));
+ Mockito.doReturn(mock(RIBSupportContextRegistry.class)).when(this.rib).getRibSupportContext();
+ Mockito.doReturn(Collections.emptySet()).when(this.rib).getLocalTablesKeys();
+ Mockito.doNothing().when(this.domTx).close();
+ Mockito.doReturn(this.domDW).when(this.domTx).newWriteOnlyTransaction();
+ Mockito.doNothing().when(this.domDW).put(eq(LogicalDatastoreType.OPERATIONAL), any(YangInstanceIdentifier.class), any(MapEntryNode.class));
+ Mockito.doNothing().when(this.domDW).delete(eq(LogicalDatastoreType.OPERATIONAL), any(YangInstanceIdentifier.class));
+ Mockito.doNothing().when(this.domDW).merge(eq(LogicalDatastoreType.OPERATIONAL), any(YangInstanceIdentifier.class), any(NormalizedNode.class));
+ final CheckedFuture checkedFuture = mock(CheckedFuture.class);
+ Mockito.doReturn(checkedFuture).when(this.domDW).submit();
+ Mockito.doReturn(null).when(checkedFuture).checkedGet();
+
+ Mockito.doNothing().when(this.singletonServiceRegistration).close();
+ Mockito.doReturn(YangInstanceIdentifier.of(Rib.QNAME)).when(this.rib).getYangRibId();
+ Mockito.doReturn(this.dataTreeChangeService).when(this.rib).getService();
+ Mockito.doReturn(this.listener).when(this.dataTreeChangeService).registerDataTreeChangeListener(any(), any());
+ Mockito.doReturn(mock(ServiceGroupIdentifier.class)).when(this.rib).getRibIServiceGroupIdentifier();
+ Mockito.doReturn(new BgpId("127.0.0.1")).when(this.rib).getBgpIdentifier();
+ Mockito.doReturn(true).when(future).cancel(true);
+ Mockito.doReturn(future).when(this.dispatcher)
+ .createReconnectingClient(any(InetSocketAddress.class), any(BGPPeerRegistry.class), anyInt(), any(Optional.class));
+ Mockito.doReturn(this.dispatcher).when(this.rib).getDispatcher();
+
+ Mockito.doReturn(PeerRole.Ibgp).when(this.mappingService).toPeerRole(any());
+ Mockito.doReturn(Collections.singletonList(new AddressFamiliesBuilder().setAfi(Ipv4AddressFamily.class).setSafi(UnicastSubsequentAddressFamily.class)
+ .setSendReceive(SendReceive.Both).build())).when(this.mappingService).toAddPathCapability(any());
+ Mockito.doReturn(Collections.singletonList(new BgpTableTypeImpl(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class)))
+ .when(this.mappingService).toTableTypes(any());
+ Mockito.doReturn(Collections.singleton(new BgpTableTypeImpl(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class)))
+ .when(this.rib).getLocalTables();
+ Mockito.doNothing().when(this.configurationWriter).apply();
+
+ Mockito.doNothing().when(this.bgpPeerRegistry).addPeer(any(IpAddress.class), any(BGPSessionListener.class), any(BGPSessionPreferences.class));
+ Mockito.doNothing().when(this.bgpPeerRegistry).removePeer(any(IpAddress.class));
+ Mockito.doReturn("registry").when(this.bgpPeerRegistry).toString();
+ Mockito.doNothing().when(this.listener).close();
+ }
+}
--- /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.config;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Matchers.any;
+import static org.mockito.internal.verification.VerificationModeFactory.times;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService;
+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.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
+
+public class AppPeerTest extends AbstractConfig {
+ private static final AppPeer APP_PEER = new AppPeer();
+
+
+ @Before
+ public void setUp() throws Exception {
+ super.setUp();
+ Mockito.doReturn(true).when(this.mappingService).isApplicationPeer(any(Neighbor.class));
+ }
+
+ @Test
+ public void testAppPeer() throws Exception {
+ final Neighbor neighbor = new NeighborBuilder().setNeighborAddress(new IpAddress(new Ipv4Address("127.0.0.1"))).build();
+ APP_PEER.start(this.rib, neighbor, this.mappingService, this.configurationWriter);
+ Mockito.verify(this.rib).getYangRibId();
+ Mockito.verify(this.rib).getService();
+ Mockito.verify(this.rib).getRibIServiceGroupIdentifier();
+ Mockito.verify(this.rib).registerClusterSingletonService(any(ClusterSingletonService.class));
+
+ this.singletonService.instantiateServiceInstance();
+ Mockito.verify(this.configurationWriter).apply();
+ Mockito.verify(this.rib, times(2)).getRibSupportContext();
+ Mockito.verify(this.rib).getLocalTablesKeys();
+ Mockito.verify(this.domTx).newWriteOnlyTransaction();
+
+ APP_PEER.restart(this.rib, this.mappingService);
+ this.singletonService.instantiateServiceInstance();
+ Mockito.verify(this.rib, times(4)).getYangRibId();
+ Mockito.verify(this.rib, times(4)).getService();
+ Mockito.verify(this.rib, times(2)).getRibIServiceGroupIdentifier();
+ Mockito.verify(this.rib, times(2)).registerClusterSingletonService(any(ClusterSingletonService.class));
+
+ this.singletonService.closeServiceInstance();
+ Mockito.verify(this.listener, times(2)).close();
+
+ assertTrue(APP_PEER.containsEqualConfiguration(new NeighborBuilder().setNeighborAddress(new IpAddress(new Ipv4Address("127.0.0.1"))).build()));
+ assertFalse(APP_PEER.containsEqualConfiguration(new NeighborBuilder().setNeighborAddress(new IpAddress(new Ipv4Address("127.0.0.2"))).build()));
+ APP_PEER.close();
+ Mockito.verify(this.singletonServiceRegistration).close();
+ }
+}
\ 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.config;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.opendaylight.controller.md.sal.binding.api.DataObjectModification.ModificationType.DELETE;
+import static org.opendaylight.controller.md.sal.binding.api.DataObjectModification.ModificationType.WRITE;
+import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.createAddPath;
+import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.createConfig;
+import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.createRR;
+import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.createTimers;
+import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.createTransport;
+import static org.powermock.api.mockito.PowerMockito.spy;
+import static org.powermock.api.mockito.PowerMockito.verifyPrivate;
+
+import com.google.common.primitives.Shorts;
+import com.google.common.util.concurrent.CheckedFuture;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Dictionary;
+import java.util.List;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
+import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
+import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
+import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
+import org.opendaylight.controller.md.sal.dom.api.DOMDataBrokerExtension;
+import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeService;
+import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
+import org.opendaylight.controller.sal.core.api.model.SchemaService;
+import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeFactory;
+import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider;
+import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration;
+import org.opendaylight.protocol.bgp.mode.impl.add.all.paths.AllPathSelection;
+import org.opendaylight.protocol.bgp.openconfig.spi.BGPOpenConfigMappingService;
+import org.opendaylight.protocol.bgp.parser.BgpTableTypeImpl;
+import org.opendaylight.protocol.bgp.rib.impl.spi.BGPDispatcher;
+import org.opendaylight.protocol.bgp.rib.impl.spi.BGPPeerRegistry;
+import org.opendaylight.protocol.bgp.rib.impl.spi.BgpDeployer;
+import org.opendaylight.protocol.bgp.rib.impl.spi.InstanceType;
+import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionConsumerContext;
+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;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.global.base.AfiSafis;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.global.base.AfiSafisBuilder;
+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.global.base.ConfigBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.AddPaths;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.AddPathsBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.RouteReflector;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.RouteReflectorBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.Timers;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.TimersBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.Transport;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.TransportBuilder;
+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.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.GlobalBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.Neighbors;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.AfiSafiType;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.CommunityType;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV4UNICAST;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV6UNICAST;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.PeerType;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.RrClusterIdTypeBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.NetworkInstances;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.NetworkInstance;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.NetworkInstanceBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.NetworkInstanceKey;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.Protocols;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.ProtocolsBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.Protocol;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.ProtocolKey;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.policy.types.rev151009.BGP;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.AsNumber;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.BgpTableType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.SendReceive;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.mp.capabilities.add.path.capability.AddressFamiliesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi1;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi1Builder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi2;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi2Builder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.Config1;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.Config1Builder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.Protocol1;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.PeerRole;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.BgpId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv4AddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily;
+import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.sal.binding.generator.impl.GeneratedClassLoadingStrategy;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.blueprint.container.BlueprintContainer;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({BgpDeployerImpl.class})
+public class BgpDeployerImplTest {
+ private static final String NETWORK_INSTANCE_NAME = "network-test";
+ private static final AsNumber AS = new AsNumber(72L);
+ private static final IpAddress IPADDRESS = new IpAddress(new Ipv4Address("127.0.0.1"));
+ private static final BgpId BGP_ID = new BgpId(IPADDRESS.getIpv4Address());
+ private static final BgpTableType TABLE_TYPE = new BgpTableTypeImpl(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class);
+ private static final short SHORT = 0;
+
+ @Mock
+ DataObjectModification dObject;
+ @Mock
+ private BlueprintContainer blueprintContainer;
+ @Mock
+ private BundleContext bundleContext;
+ @Mock
+ private DataBroker dataBroker;
+ @Mock
+ private BGPOpenConfigMappingService mappingService;
+ @Mock
+ private WriteTransaction wTx;
+ @Mock
+ private DataTreeModification<Bgp> modification;
+ @Mock
+ private ListenerRegistration dataTreeRegistration;
+ @Mock
+ private ServiceRegistration registration;
+
+ private Collection<DataTreeModification<Bgp>> collection = Collections.singleton(modification);
+
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+ final DOMDataBroker domDataBroker = mock(DOMDataBroker.class);
+
+ Mockito.doReturn(this.wTx).when(this.dataBroker).newWriteOnlyTransaction();
+ Mockito.doReturn("mapping").when(this.mappingService).toString();
+ Mockito.doReturn(false).when(this.mappingService).isApplicationPeer(any(Neighbor.class));
+ Mockito.doReturn(PeerRole.RrClient).when(this.mappingService).toPeerRole(any(Neighbor.class));
+ Mockito.doReturn(Collections.singletonList(new AddressFamiliesBuilder().setAfi(Ipv4AddressFamily.class).setSafi(UnicastSubsequentAddressFamily.class)
+ .setSendReceive(SendReceive.Both).build())).when(this.mappingService).toAddPathCapability(any(List.class));
+
+ Mockito.doReturn(null).when(domDataBroker).createTransactionChain(any());
+ Mockito.doReturn(Collections.singletonMap(DOMDataTreeChangeService.class, mock(DOMDataBrokerExtension.class)))
+ .when(domDataBroker).getSupportedExtensions();
+
+ Mockito.doReturn(Collections.singletonList(TABLE_TYPE)).when(this.mappingService).toTableTypes(any());
+ Mockito.doReturn(Collections.singletonMap(TABLE_TYPE, new AllPathSelection()))
+ .when(this.mappingService).toPathSelectionMode(any());
+ Mockito.doNothing().when(this.registration).unregister();
+ Mockito.doReturn(this.registration).when(this.bundleContext).registerService(eq(InstanceType.RIB.getServices()), any()
+ , any(Dictionary.class));
+ Mockito.doReturn(this.registration).when(this.bundleContext).registerService(eq(InstanceType.PEER.getServices()), any()
+ , any(Dictionary.class));
+
+
+ Mockito.doNothing().when(this.wTx).merge(any(LogicalDatastoreType.class), any(InstanceIdentifier.class), any(NetworkInstance.class));
+ final CheckedFuture future = mock(CheckedFuture.class);
+ Mockito.doReturn(future).when(this.wTx).submit();
+ Mockito.doNothing().when(future).addListener(any(), any());
+ Mockito.doReturn(this.dataTreeRegistration).when(this.dataBroker).registerDataTreeChangeListener(any(), any());
+ Mockito.doNothing().when(this.dataTreeRegistration).close();
+
+ final InstanceIdentifier<Bgp> bgpIID = InstanceIdentifier.create(NetworkInstances.class)
+ .child(NetworkInstance.class, new NetworkInstanceKey(NETWORK_INSTANCE_NAME)).child(Protocols.class)
+ .child(Protocol.class, new ProtocolKey(BGP.class, "bgp")).augmentation(Protocol1.class).child(Bgp.class);
+
+ Mockito.doReturn(new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL, bgpIID)).when(this.modification).getRootPath();
+ Mockito.doReturn(this.dObject).when(this.modification).getRootNode();
+ Mockito.doReturn("bgpPeer").when(this.modification).toString();
+
+ Mockito.doReturn(Collections.singleton(this.dObject)).when(this.dObject).getModifiedChildren();
+ Mockito.doReturn("dObject").when(this.dObject).toString();
+
+ final RIBExtensionConsumerContext extension = mock(RIBExtensionConsumerContext.class);
+ Mockito.doReturn(mock(GeneratedClassLoadingStrategy.class)).when(extension).getClassLoadingStrategy();
+
+ final ClusterSingletonServiceProvider singletonServiceProvider = mock(ClusterSingletonServiceProvider.class);
+ final ClusterSingletonServiceRegistration serviceRegistration = mock(ClusterSingletonServiceRegistration.class);
+ Mockito.doReturn(serviceRegistration).when(singletonServiceProvider).registerClusterSingletonService(any());
+ Mockito.doNothing().when(serviceRegistration).close();
+
+ final SchemaService schemaService = mock(SchemaService.class);
+ Mockito.doNothing().when(this.dataTreeRegistration).close();
+
+ Mockito.doReturn(this.dataTreeRegistration).when(schemaService).registerSchemaContextListener(any());
+
+ final RibImpl ribImpl = new RibImpl(singletonServiceProvider, extension,
+ mock(BGPDispatcher.class), mock(BindingCodecTreeFactory.class), domDataBroker, schemaService);
+ Mockito.doReturn(ribImpl).when(this.blueprintContainer).getComponentInstance(eq("ribImpl"));
+
+ final BgpPeer bgpPeer = new BgpPeer(mock(RpcProviderRegistry.class), mock(BGPPeerRegistry.class));
+ Mockito.doReturn(bgpPeer).when(this.blueprintContainer).getComponentInstance(eq("bgpPeer"));
+ this.collection = Collections.singleton(modification);
+ }
+
+ @Test
+ public void testDeployerRib() throws Exception {
+ Mockito.doReturn(Global.class).when(this.dObject).getDataType();
+ final BgpDeployerImpl deployer = new BgpDeployerImpl(NETWORK_INSTANCE_NAME, this.blueprintContainer, this.bundleContext, this.dataBroker, this.mappingService);
+ final BgpDeployerImpl spyDeployer = spy(deployer);
+ configureGlobal(IPV4UNICAST.class);
+ Mockito.doReturn(WRITE).when(this.dObject).getModificationType();
+
+ final KeyedInstanceIdentifier<NetworkInstance, NetworkInstanceKey> networkInstanceIId = InstanceIdentifier.create(NetworkInstances.class)
+ .child(NetworkInstance.class, new NetworkInstanceKey(NETWORK_INSTANCE_NAME));
+ final NetworkInstance netII = new NetworkInstanceBuilder().setName(networkInstanceIId.firstKeyOf(NetworkInstance.class).getName())
+ .setProtocols(new ProtocolsBuilder().build()).build();
+ verify(this.wTx).merge(any(LogicalDatastoreType.class), any(InstanceIdentifier.class), Mockito.eq(netII));
+ verify(this.dataBroker).registerDataTreeChangeListener(Mockito.any(DataTreeIdentifier.class), Mockito.any(BgpDeployerImpl.class));
+
+ assertEquals(networkInstanceIId, spyDeployer.getInstanceIdentifier());
+ assertEquals(this.mappingService, spyDeployer.getMappingService());
+
+ spyDeployer.onDataTreeChanged(this.collection);
+ verifyPrivate(spyDeployer).invoke("onGlobalChanged", any(DataObjectModification.class), any(InstanceIdentifier.class));
+ verify(this.blueprintContainer).getComponentInstance(eq("ribImpl"));
+ verify(this.bundleContext).registerService(eq(InstanceType.RIB.getServices()), any(), any(Dictionary.class));
+ verify(spyDeployer).onDataTreeChanged(any(Collection.class));
+ verify(spyDeployer).onGlobalModified(any(InstanceIdentifier.class), any(), any());
+ verifyPrivate(spyDeployer).invoke("onGlobalCreated", any(InstanceIdentifier.class), any(Global.class), any(BgpDeployer.WriteConfiguration.class));
+ verifyPrivate(spyDeployer).invoke("initiateRibInstance", any(InstanceIdentifier.class), any(Global.class), any(RibImpl.class), any(BgpDeployer
+ .WriteConfiguration.class));
+ verifyPrivate(spyDeployer).invoke("registerRibInstance", any(RibImpl.class), anyString());
+ verify(spyDeployer).onDataTreeChanged(any(Collection.class));
+
+ //change with same rib already existing
+ spyDeployer.onDataTreeChanged(this.collection);
+ verifyPrivate(spyDeployer, times(2)).invoke("onGlobalChanged", any(DataObjectModification.class), any(InstanceIdentifier.class));
+ verify(this.blueprintContainer).getComponentInstance(eq("ribImpl"));
+ verify(this.bundleContext).registerService(eq(InstanceType.RIB.getServices()), any(), any(Dictionary.class));
+ verify(spyDeployer, times(2)).onDataTreeChanged(any(Collection.class));
+ verify(spyDeployer, times(2)).onGlobalModified(any(InstanceIdentifier.class), any(), any());
+ verifyPrivate(spyDeployer).invoke("onGlobalCreated", any(InstanceIdentifier.class), any(Global.class), any(BgpDeployer
+ .WriteConfiguration.class));
+ verifyPrivate(spyDeployer).invoke("initiateRibInstance", any(InstanceIdentifier.class), any(Global.class), any(RibImpl.class), any(BgpDeployer
+ .WriteConfiguration.class));
+ verifyPrivate(spyDeployer).invoke("registerRibInstance", any(RibImpl.class), anyString());
+ verify(spyDeployer, times(2)).onDataTreeChanged(any(Collection.class));
+
+ //Update for existing rib
+ configureGlobal(IPV6UNICAST.class);
+ spyDeployer.onDataTreeChanged(this.collection);
+ verifyPrivate(spyDeployer, times(3)).invoke("onGlobalChanged", any(DataObjectModification.class), any(InstanceIdentifier.class));
+ verify(this.blueprintContainer).getComponentInstance(eq("ribImpl"));
+ verify(this.bundleContext, times(2)).registerService(eq(InstanceType.RIB.getServices()), any(), any(Dictionary.class));
+ verify(spyDeployer, times(3)).onDataTreeChanged(any(Collection.class));
+ verify(spyDeployer, times(3)).onGlobalModified(any(InstanceIdentifier.class), any(), any());
+ verifyPrivate(spyDeployer).invoke("onGlobalCreated", any(InstanceIdentifier.class), any(Global.class),
+ any(BgpDeployer.WriteConfiguration.class));
+ verifyPrivate(spyDeployer).invoke("onGlobalUpdated", any(InstanceIdentifier.class), any(Global.class), any(RibImpl.class), any(BgpDeployer.WriteConfiguration.class));
+ verify(this.dataTreeRegistration).close();
+ verify(this.registration).unregister();
+ verifyPrivate(spyDeployer).invoke("closeAllBindedPeers", any(InstanceIdentifier.class));
+ verifyPrivate(spyDeployer, times(2)).invoke("initiateRibInstance", any(InstanceIdentifier.class), any(Global.class), any(RibImpl.class), any
+ (BgpDeployer.WriteConfiguration.class));
+ verifyPrivate(spyDeployer, times(2)).invoke("registerRibInstance", any(RibImpl.class), anyString());
+ verify(spyDeployer, times(3)).onDataTreeChanged(any(Collection.class));
+
+ //Delete for existing rib
+ Mockito.doReturn(DELETE).when(this.dObject).getModificationType();
+
+ spyDeployer.onDataTreeChanged(this.collection);
+ verifyPrivate(spyDeployer, times(4)).invoke("onGlobalChanged", any(DataObjectModification.class), any(InstanceIdentifier.class));
+ verify(this.blueprintContainer).getComponentInstance(eq("ribImpl"));
+ verify(this.bundleContext, times(2)).registerService(eq(InstanceType.RIB.getServices()), any(), any(Dictionary.class));
+ verify(spyDeployer, times(4)).onDataTreeChanged(any(Collection.class));
+ verify(spyDeployer, times(3)).onGlobalModified(any(InstanceIdentifier.class), any(), any());
+ verify(spyDeployer).onGlobalRemoved(any(InstanceIdentifier.class));
+ verify(this.dataTreeRegistration, times(2)).close();
+ verify(this.registration, times(2)).unregister();
+ verifyPrivate(spyDeployer).invoke("onGlobalCreated", any(InstanceIdentifier.class), any(Global.class),
+ any(BgpDeployer.WriteConfiguration.class));
+ verifyPrivate(spyDeployer).invoke("onGlobalUpdated", any(InstanceIdentifier.class), any(Global.class), any(RibImpl.class), any(BgpDeployer.WriteConfiguration.class));
+ verifyPrivate(spyDeployer).invoke("closeAllBindedPeers", any(InstanceIdentifier.class));
+ verifyPrivate(spyDeployer, times(2)).invoke("initiateRibInstance", any(InstanceIdentifier.class), any(Global.class), any(RibImpl.class), any
+ (BgpDeployer.WriteConfiguration.class));
+ verifyPrivate(spyDeployer, times(2)).invoke("registerRibInstance", any(RibImpl.class), anyString());
+ verify(spyDeployer, times(4)).onDataTreeChanged(any(Collection.class));
+
+ deployer.close();
+ }
+
+ private void configureGlobal(final Class<? extends AfiSafiType> afi) {
+ final Config config = new ConfigBuilder().setAs(AS).setRouterId(BGP_ID).build();
+ final ArrayList<AfiSafi> afiSafiList = new ArrayList<>();
+ afiSafiList.add(new AfiSafiBuilder().setAfiSafiName(afi).addAugmentation(AfiSafi2.class, new AfiSafi2Builder().setReceive(true)
+ .setSendMax(Shorts.checkedCast(0L)).build()).build());
+ final AfiSafis afiSafi = new AfiSafisBuilder().setAfiSafi(afiSafiList).build();
+ Mockito.doReturn(new GlobalBuilder().setConfig(config).setAfiSafis(afiSafi).build()).when(this.dObject).getDataAfter();
+ }
+
+ /**
+ * Test create Rib
+ */
+ @Test
+ public void testDeployerCreateNeighbor() throws Exception {
+
+ final BgpDeployerImpl deployer = new BgpDeployerImpl(NETWORK_INSTANCE_NAME, this.blueprintContainer, this.bundleContext, this.dataBroker, this.mappingService);
+ final BgpDeployerImpl spyDeployer = spy(deployer);
+
+ //First create Rib
+ Mockito.doReturn(Global.class).when(this.dObject).getDataType();
+ Mockito.doReturn(WRITE).when(this.dObject).getModificationType();
+ configureGlobal(IPV4UNICAST.class);
+
+ spyDeployer.onDataTreeChanged(this.collection);
+ verifyPrivate(spyDeployer).invoke("onGlobalChanged", any(DataObjectModification.class), any(InstanceIdentifier.class));
+ verify(this.blueprintContainer).getComponentInstance(eq("ribImpl"));
+ verify(this.bundleContext).registerService(eq(InstanceType.RIB.getServices()), any(), any(Dictionary.class));
+ verify(spyDeployer).onDataTreeChanged(any(Collection.class));
+ verify(spyDeployer).onGlobalModified(any(InstanceIdentifier.class), any(), any());
+ verifyPrivate(spyDeployer).invoke("onGlobalCreated", any(InstanceIdentifier.class), any(Global.class), any(BgpDeployer.WriteConfiguration.class));
+ verifyPrivate(spyDeployer).invoke("initiateRibInstance", any(InstanceIdentifier.class), any(Global.class), any(RibImpl.class), any(BgpDeployer
+ .WriteConfiguration.class));
+ verifyPrivate(spyDeployer).invoke("registerRibInstance", any(RibImpl.class), anyString());
+ verify(spyDeployer).onDataTreeChanged(any(Collection.class));
+
+
+ Mockito.doReturn(Neighbors.class).when(this.dObject).getDataType();
+ Mockito.doReturn(WRITE).when(this.dObject).getModificationType();
+ configureNeighbor(IPV4UNICAST.class);
+
+
+ final KeyedInstanceIdentifier<NetworkInstance, NetworkInstanceKey> networkInstanceIId = InstanceIdentifier.create(NetworkInstances.class)
+ .child(NetworkInstance.class, new NetworkInstanceKey(NETWORK_INSTANCE_NAME));
+ final NetworkInstance netII = new NetworkInstanceBuilder().setName(networkInstanceIId.firstKeyOf(NetworkInstance.class).getName())
+ .setProtocols(new ProtocolsBuilder().build()).build();
+ verify(this.wTx).merge(any(LogicalDatastoreType.class), any(InstanceIdentifier.class), Mockito.eq(netII));
+ verify(this.dataBroker).registerDataTreeChangeListener(Mockito.any(DataTreeIdentifier.class), Mockito.any(BgpDeployerImpl.class));
+
+ assertEquals(networkInstanceIId, spyDeployer.getInstanceIdentifier());
+ assertEquals(this.mappingService, spyDeployer.getMappingService());
+
+ spyDeployer.onDataTreeChanged(this.collection);
+ verify(spyDeployer, times(2)).onDataTreeChanged(any(Collection.class));
+ verifyPrivate(spyDeployer).invoke("onNeighborsChanged", any(DataObjectModification.class), any(InstanceIdentifier.class));
+ verify(spyDeployer).onNeighborModified(any(InstanceIdentifier.class), any(Neighbor.class), any());
+ verifyPrivate(spyDeployer).invoke("onNeighborCreated", any(InstanceIdentifier.class), any(Neighbor.class), any(BgpDeployer.WriteConfiguration.class));
+ verify(this.blueprintContainer).getComponentInstance(eq("bgpPeer"));
+ verifyPrivate(spyDeployer).invoke("initiatePeerInstance", any(InstanceIdentifier.class), any(InstanceIdentifier.class), any(Neighbor.class),
+ any(PeerBean.class), any(BgpDeployer.WriteConfiguration.class));
+ verifyPrivate(spyDeployer).invoke("registerPeerInstance", any(Neighbor.class), anyString());
+ verify(this.bundleContext).registerService(eq(InstanceType.PEER.getServices()), any(BgpPeer.class), any(Dictionary.class));
+
+ //change with same peer already existing
+ spyDeployer.onDataTreeChanged(this.collection);
+ verify(spyDeployer, times(3)).onDataTreeChanged(any(Collection.class));
+ verifyPrivate(spyDeployer, times(2)).invoke("onNeighborsChanged", any(DataObjectModification.class), any(InstanceIdentifier.class));
+ verify(spyDeployer, times(2)).onNeighborModified(any(InstanceIdentifier.class), any(Neighbor.class), any());
+ verifyPrivate(spyDeployer).invoke("onNeighborCreated", any(InstanceIdentifier.class), any(Neighbor.class), any(BgpDeployer.WriteConfiguration.class));
+ verify(this.blueprintContainer).getComponentInstance(eq("bgpPeer"));
+ verifyPrivate(spyDeployer).invoke("initiatePeerInstance", any(InstanceIdentifier.class), any(InstanceIdentifier.class), any(Neighbor.class),
+ any(PeerBean.class), any(BgpDeployer.WriteConfiguration.class));
+ verifyPrivate(spyDeployer).invoke("registerPeerInstance", any(Neighbor.class), anyString());
+ verify(this.bundleContext).registerService(eq(InstanceType.PEER.getServices()), any(BgpPeer.class), any(Dictionary.class));
+
+ //Update for existing rib
+ configureNeighbor(IPV6UNICAST.class);
+ spyDeployer.onDataTreeChanged(this.collection);
+ verify(spyDeployer, times(4)).onDataTreeChanged(any(Collection.class));
+ verifyPrivate(spyDeployer, times(3)).invoke("onNeighborsChanged", any(DataObjectModification.class), any(InstanceIdentifier.class));
+ verify(spyDeployer, times(3)).onNeighborModified(any(InstanceIdentifier.class), any(Neighbor.class), any());
+ verifyPrivate(spyDeployer).invoke("onNeighborCreated", any(InstanceIdentifier.class), any(Neighbor.class), any(BgpDeployer.WriteConfiguration.class));
+ verify(this.blueprintContainer).getComponentInstance(eq("bgpPeer"));
+ verifyPrivate(spyDeployer, times(2)).invoke("initiatePeerInstance", any(InstanceIdentifier.class), any(InstanceIdentifier.class), any(Neighbor.class),
+ any(PeerBean.class), any(BgpDeployer.WriteConfiguration.class));
+ verifyPrivate(spyDeployer, times(2)).invoke("registerPeerInstance", any(Neighbor.class), anyString());
+ verify(this.bundleContext, times(2)).registerService(eq(InstanceType.PEER.getServices()), any(BgpPeer.class), any(Dictionary.class));
+
+ //Delete existing Peer
+ Mockito.doReturn(DELETE).when(this.dObject).getModificationType();
+
+ spyDeployer.onDataTreeChanged(this.collection);
+ verify(spyDeployer, times(5)).onDataTreeChanged(any(Collection.class));
+ verify( this.dObject).getDataBefore();
+ verifyPrivate(spyDeployer, times(4)).invoke("onNeighborsChanged", any(DataObjectModification.class), any(InstanceIdentifier.class));
+ verify(spyDeployer, times(3)).onNeighborModified(any(InstanceIdentifier.class), any(Neighbor.class), any());
+ verify(spyDeployer, times(1)).onNeighborRemoved(any(InstanceIdentifier.class), any(Neighbor.class));
+ verifyPrivate(spyDeployer).invoke("onNeighborCreated", any(InstanceIdentifier.class), any(Neighbor.class), any(BgpDeployer.WriteConfiguration.class));
+ verify(this.blueprintContainer).getComponentInstance(eq("bgpPeer"));
+ verifyPrivate(spyDeployer, times(2)).invoke("initiatePeerInstance", any(InstanceIdentifier.class), any(InstanceIdentifier.class), any(Neighbor.class),
+ any(PeerBean.class), any(BgpDeployer.WriteConfiguration.class));
+ verifyPrivate(spyDeployer, times(2)).invoke("registerPeerInstance", any(Neighbor.class), anyString());
+ verify(this.bundleContext, times(2)).registerService(eq(InstanceType.PEER.getServices()), any(BgpPeer.class), any(Dictionary.class));
+
+ deployer.close();
+ }
+
+ private void configureNeighbor(final Class<? extends AfiSafiType> afi) {
+ Mockito.doReturn(createNeighborExpected(afi)).when(this.dObject).getDataAfter();
+ Mockito.doReturn(createNeighborExpected(afi)).when(this.dObject).getDataBefore();
+ }
+
+
+ private Neighbor createNeighborExpected(final Class<? extends AfiSafiType> afi) {
+ return new NeighborBuilder()
+ .setAfiSafis(createAfiSafi(afi))
+ .setConfig(createConfig())
+ .setNeighborAddress(IPADDRESS)
+ .setRouteReflector(createRR())
+ .setTimers(createTimers())
+ .setTransport(createTransport())
+ .setAddPaths(createAddPath())
+ .build();
+ }
+
+ private static org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.AfiSafis createAfiSafi(final Class<? extends AfiSafiType> afi) {
+ return new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.AfiSafisBuilder()
+ .setAfiSafi(Collections.singletonList(new AfiSafiBuilder().setAfiSafiName(afi)
+ .addAugmentation(AfiSafi1.class, new AfiSafi1Builder().setReceive(true).setSendMax(SHORT).build()).build())).build();
+ }
+}
\ 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.config;
+
+import static junit.framework.TestCase.fail;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.anyList;
+import static org.mockito.Mockito.times;
+
+import com.google.common.base.Optional;
+import java.math.BigDecimal;
+import java.net.InetSocketAddress;
+import java.util.Collections;
+import java.util.List;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
+import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService;
+import org.opendaylight.protocol.bgp.rib.impl.spi.BGPPeerRegistry;
+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;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.AddPaths;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.AddPathsBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.AfiSafis;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.AfiSafisBuilder;
+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.neighbor.group.RouteReflector;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.RouteReflectorBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.Timers;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.TimersBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.Transport;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.TransportBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.add.paths.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.http.openconfig.net.yang.bgp.types.rev151009.CommunityType;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV4UNICAST;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.PeerType;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.RrClusterIdTypeBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi1;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi1Builder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.Config1;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.Config1Builder;
+
+public class BgpPeerTest extends AbstractConfig {
+ static final short SHORT = 0;
+ static final IpAddress NEIGHBOR_ADDRESS = new IpAddress(new Ipv4Address("127.0.0.1"));
+ static final BigDecimal DEFAULT_TIMERS = BigDecimal.valueOf(30);
+ static final String MD5_PASSWORD = "123";
+ static final PortNumber PORT = new PortNumber(179);
+ static final AfiSafi AFI_SAFI_IPV4 = new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.class)
+ .addAugmentation(AfiSafi1.class, new AfiSafi1Builder().setReceive(true).setSendMax(SHORT).build()).build();
+ static final List<AfiSafi> AFI_SAFI = Collections.singletonList(AFI_SAFI_IPV4);
+ private BgpPeer bgpPeer;
+
+ @Before
+ public void setUp() throws Exception {
+ super.setUp();
+ this.bgpPeer = new BgpPeer(Mockito.mock(RpcProviderRegistry.class), this.bgpPeerRegistry);
+ Mockito.doNothing().when(this.serviceRegistration).unregister();
+ }
+
+ @Test
+ public void testBgpPeer() throws Exception {
+ final Neighbor neighbor = new NeighborBuilder().setAfiSafis(createAfiSafi()).setConfig(createConfig()).setNeighborAddress(NEIGHBOR_ADDRESS)
+ .setRouteReflector(createRR()).setTimers(createTimers()).setTransport(createTransport()).setAddPaths(createAddPath()).build();
+
+ this.bgpPeer.start(this.rib, neighbor, this.mappingService, this.configurationWriter);
+ Mockito.verify(this.mappingService).toPeerRole(any());
+ Mockito.verify(this.render).getConfiguredPeerCounter();
+ Mockito.verify(this.rib).createPeerChain(any());
+ Mockito.verify(this.rib, times(2)).getLocalAs();
+ Mockito.verify(this.rib).getLocalTables();
+ Mockito.verify(this.mappingService).toAddPathCapability(anyList());
+ Mockito.verify(this.mappingService).toTableTypes(anyList());
+ Mockito.verify(this.rib).getRibIServiceGroupIdentifier();
+ Mockito.verify(this.rib).registerClusterSingletonService(any(ClusterSingletonService.class));
+
+ this.singletonService.instantiateServiceInstance();
+ Mockito.verify(this.configurationWriter).apply();
+ Mockito.verify(this.bgpPeerRegistry).addPeer(any(), any(), any());
+ Mockito.verify(this.dispatcher).createReconnectingClient(any(InetSocketAddress.class), any(BGPPeerRegistry.class), anyInt(), any(Optional.class));
+
+ try {
+ this.bgpPeer.start(this.rib, neighbor, this.mappingService, this.configurationWriter);
+ fail("Expected Exception");
+ } catch (final IllegalStateException expected) {
+ assertEquals("Previous peer instance {} was not closed.", expected.getMessage());
+ }
+ this.bgpPeer.setServiceRegistration(serviceRegistration);
+ this.bgpPeer.restart(this.rib, this.mappingService);
+ Mockito.verify(this.mappingService, times(2)).toPeerRole(any());
+ Mockito.verify(this.render, times(2)).getConfiguredPeerCounter();
+ Mockito.verify(this.rib, times(2)).createPeerChain(any());
+ Mockito.verify(this.rib, times(4)).getLocalAs();
+ Mockito.verify(this.rib, times(2)).getLocalTables();
+ Mockito.verify(this.mappingService, times(2)).toAddPathCapability(anyList());
+ Mockito.verify(this.mappingService, times(2)).toTableTypes(anyList());
+ Mockito.verify(this.rib, times(2)).getRibIServiceGroupIdentifier();
+ Mockito.verify(this.rib, times(2)).registerClusterSingletonService(any(ClusterSingletonService.class));
+ this.singletonService.instantiateServiceInstance();
+
+ assertNotNull(this.bgpPeer.getBgpPeerState());
+ assertNotNull(this.bgpPeer.getBgpSessionState());
+ this.bgpPeer.resetStats();
+ this.bgpPeer.resetSession();
+
+ final Neighbor neighborExpected = createNeighborExpected(NEIGHBOR_ADDRESS);
+ assertTrue(this.bgpPeer.containsEqualConfiguration(neighborExpected));
+ assertFalse(this.bgpPeer.containsEqualConfiguration(createNeighborExpected(new IpAddress(new Ipv4Address("127.0.0.2")))));
+
+ this.singletonService.closeServiceInstance();
+ Mockito.verify(this.bgpPeerRegistry).removePeer(any(IpAddress.class));
+
+ this.bgpPeer.close();
+ Mockito.verify(this.singletonServiceRegistration, times(2)).close();
+ Mockito.verify(serviceRegistration).unregister();
+ Mockito.verify(this.future).cancel(true);
+ }
+
+ static Neighbor createNeighborExpected(final IpAddress neighborAddress) {
+ return new NeighborBuilder()
+ .setAfiSafis(createAfiSafi())
+ .setConfig(createConfig())
+ .setNeighborAddress(neighborAddress)
+ .setRouteReflector(createRR())
+ .setTimers(createTimers())
+ .setTransport(createTransport())
+ .setAddPaths(createAddPath())
+ .build();
+ }
+
+ static Transport createTransport() {
+ return new TransportBuilder().setConfig(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor
+ .group.transport.ConfigBuilder().setMtuDiscovery(false).setPassiveMode(false).addAugmentation(Config1.class, new Config1Builder()
+ .setRemotePort(PORT).build()).build()).build();
+ }
+
+ static Timers createTimers() {
+ return new TimersBuilder().setConfig(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group
+ .timers.ConfigBuilder().setHoldTime(DEFAULT_TIMERS).setMinimumAdvertisementInterval(DEFAULT_TIMERS)
+ .setKeepaliveInterval(DEFAULT_TIMERS).setConnectRetry(DEFAULT_TIMERS).build()).build();
+ }
+
+ static RouteReflector createRR() {
+ return new RouteReflectorBuilder().setConfig(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp
+ .neighbor.group.route.reflector.ConfigBuilder().setRouteReflectorClusterId(RrClusterIdTypeBuilder.getDefaultInstance("127.0.0.1"))
+ .setRouteReflectorClient(false).build()).build();
+ }
+
+ static Config createConfig() {
+ return new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.ConfigBuilder().setPeerAs(AS)
+ .setPeerType(PeerType.INTERNAL).setAuthPassword(MD5_PASSWORD).setRouteFlapDamping(false).setSendCommunity(CommunityType.NONE).build();
+ }
+
+ static AfiSafis createAfiSafi() {
+ return new AfiSafisBuilder().setAfiSafi(AFI_SAFI).build();
+ }
+
+ static AddPaths createAddPath() {
+ return new AddPathsBuilder().setConfig(new ConfigBuilder().setReceive(true).setSendMax(SHORT).build()).build();
+ }
+}
\ 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.config;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.opendaylight.protocol.bgp.rib.impl.config.AbstractConfig.AS;
+import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.AFI_SAFI;
+import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.AFI_SAFI_IPV4;
+import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.DEFAULT_TIMERS;
+import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.MD5_PASSWORD;
+import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.NEIGHBOR_ADDRESS;
+import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.PORT;
+import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.SHORT;
+import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.createAfiSafi;
+import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.createNeighborExpected;
+import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.createTransport;
+import static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IetfInetUtil.INSTANCE;
+
+import com.google.common.base.Optional;
+import com.google.common.collect.ImmutableList;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+import javax.annotation.Nonnull;
+import org.junit.Test;
+import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListener;
+import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeService;
+import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain;
+import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService;
+import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration;
+import org.opendaylight.mdsal.singleton.common.api.ServiceGroupIdentifier;
+import org.opendaylight.protocol.bgp.openconfig.spi.BGPOpenConfigProvider;
+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.spi.ImportPolicyPeerTracker;
+import org.opendaylight.protocol.bgp.rib.impl.spi.RIB;
+import org.opendaylight.protocol.bgp.rib.impl.spi.RIBSupportContextRegistry;
+import org.opendaylight.protocol.bgp.rib.impl.stats.rib.impl.BGPRenderStats;
+import org.opendaylight.protocol.bgp.rib.spi.CacheDisconnectedPeers;
+import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionConsumerContext;
+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;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.AfiSafis;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.AfiSafisBuilder;
+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.neighbor.group.TransportBuilder;
+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.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.NeighborKey;
+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.Neighbors;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV4UNICAST;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV6UNICAST;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.NetworkInstances;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.NetworkInstance;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.NetworkInstanceKey;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.Protocols;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.Protocol;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.ProtocolKey;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.policy.types.rev151009.BGP;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.AsNumber;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.BgpTableType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi1;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi1Builder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.Config1;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.Config1Builder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.Protocol1;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.Rib;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.RibKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.BgpId;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+
+public class OpenConfigMappingUtilTest {
+ private static final Neighbor NEIGHBOR = createNeighborExpected(NEIGHBOR_ADDRESS);
+ private static final String KEY = "bgp";
+ private static final InstanceIdentifier<Bgp> BGP_II = InstanceIdentifier.create(NetworkInstances.class)
+ .child(NetworkInstance.class, new NetworkInstanceKey("identifier-test")).child(Protocols.class)
+ .child(Protocol.class, new ProtocolKey(BGP.class, KEY)).augmentation(Protocol1.class).child(Bgp.class);
+ private static final NeighborKey NEIGHBOR_KEY = new NeighborKey(NEIGHBOR_ADDRESS);
+
+ private static class RibMock implements RIB {
+
+ @Override
+ public AsNumber getLocalAs() {
+ return AS;
+ }
+
+ @Override
+ public BgpId getBgpIdentifier() {
+ return null;
+ }
+
+ @Nonnull
+ @Override
+ public Set<? extends BgpTableType> getLocalTables() {
+ return null;
+ }
+
+ @Override
+ public BGPDispatcher getDispatcher() {
+ return null;
+ }
+
+ @Override
+ public DOMTransactionChain createPeerChain(final TransactionChainListener listener) {
+ return null;
+ }
+
+ @Override
+ public RIBExtensionConsumerContext getRibExtensions() {
+ return null;
+ }
+
+ @Override
+ public RIBSupportContextRegistry getRibSupportContext() {
+ return null;
+ }
+
+ @Override
+ public YangInstanceIdentifier getYangRibId() {
+ return null;
+ }
+
+ @Override
+ public CodecsRegistry getCodecsRegistry() {
+ return null;
+ }
+
+ @Override
+ public Optional<BGPOpenConfigProvider> getOpenConfigProvider() {
+ return null;
+ }
+
+ @Override
+ public CacheDisconnectedPeers getCacheDisconnectedPeers() {
+ return null;
+ }
+
+ @Override
+ public DOMDataTreeChangeService getService() {
+ return null;
+ }
+
+ @Override
+ public BGPRenderStats getRenderStats() {
+ return null;
+ }
+
+ @Override
+ public ImportPolicyPeerTracker getImportPolicyPeerTracker() {
+ return null;
+ }
+
+ @Override
+ public Set<TablesKey> getLocalTablesKeys() {
+ return null;
+ }
+
+ @Override
+ public ServiceGroupIdentifier getRibIServiceGroupIdentifier() {
+ return null;
+ }
+
+ @Override
+ public ClusterSingletonServiceRegistration registerClusterSingletonService(final ClusterSingletonService clusterSingletonService) {
+ return null;
+ }
+
+ @Override
+ public void close() throws Exception {
+
+ }
+
+ @Override
+ public KeyedInstanceIdentifier<Rib, RibKey> getInstanceIdentifier() {
+ return null;
+ }
+ }
+
+ @Test
+ public void testGetRibInstanceName() throws Exception {
+ assertEquals(KEY, OpenConfigMappingUtil.getRibInstanceName(BGP_II));
+ }
+
+ @Test
+ public void testGetHoldTimer() throws Exception {
+ assertEquals(DEFAULT_TIMERS.toBigInteger().intValue(), OpenConfigMappingUtil.getHoldTimer(NEIGHBOR));
+ }
+
+ @Test
+ public void testGetPeerAs() throws Exception {
+ assertEquals(AS, OpenConfigMappingUtil.getPeerAs(NEIGHBOR, null));
+ assertEquals(AS, OpenConfigMappingUtil.getPeerAs(new NeighborBuilder().build(), new RibMock()));
+ }
+
+ @Test
+ public void testIsActive() throws Exception {
+ assertTrue(OpenConfigMappingUtil.isActive(new NeighborBuilder().build()));
+ assertTrue(OpenConfigMappingUtil.isActive(new NeighborBuilder().setTransport(new TransportBuilder().build()).build()));
+ assertTrue(OpenConfigMappingUtil.isActive(new NeighborBuilder().setTransport(createTransport()).build()));
+ }
+
+ @Test
+ public void testGetRetryTimer() throws Exception {
+ assertEquals(DEFAULT_TIMERS.toBigInteger().intValue(), OpenConfigMappingUtil.getRetryTimer(NEIGHBOR));
+ assertEquals(DEFAULT_TIMERS.toBigInteger().intValue(), OpenConfigMappingUtil.getRetryTimer(new NeighborBuilder().build()));
+ }
+
+ @Test
+ public void testGetNeighborKey() throws Exception {
+ assertArrayEquals(MD5_PASSWORD.getBytes(StandardCharsets.US_ASCII),
+ OpenConfigMappingUtil.getNeighborKey(NEIGHBOR).get(INSTANCE.inetAddressFor(NEIGHBOR_ADDRESS)));
+ assertNull(OpenConfigMappingUtil.getNeighborKey(new NeighborBuilder().build()));
+ assertNull(OpenConfigMappingUtil.getNeighborKey(new NeighborBuilder().setConfig(new ConfigBuilder().build()).build()));
+ }
+
+ @Test
+ public void testGetNeighborInstanceIdentifier() throws Exception {
+ assertEquals(BGP_II.child(Neighbors.class).child(Neighbor.class, NEIGHBOR_KEY),
+ OpenConfigMappingUtil.getNeighborInstanceIdentifier(BGP_II, NEIGHBOR_KEY));
+
+ }
+
+ @Test
+ public void testGetNeighborInstanceName() throws Exception {
+ assertEquals(NEIGHBOR_ADDRESS.getIpv4Address().getValue(),
+ OpenConfigMappingUtil.getNeighborInstanceName(BGP_II.child(Neighbors.class).child(Neighbor.class, NEIGHBOR_KEY)));
+ }
+
+ @Test
+ public void testGetPort() throws Exception {
+ assertEquals(PORT, OpenConfigMappingUtil.getPort(NEIGHBOR));
+ assertEquals(PORT, OpenConfigMappingUtil.getPort(new NeighborBuilder().setTransport(new TransportBuilder().build()).build()));
+ assertEquals(PORT, OpenConfigMappingUtil.getPort(new NeighborBuilder().setTransport(
+ new TransportBuilder().setConfig(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.transport.
+ ConfigBuilder().build()).build()).build()));
+ assertEquals(PORT, OpenConfigMappingUtil.getPort(new NeighborBuilder().setTransport(
+ new TransportBuilder().setConfig(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.transport.
+ ConfigBuilder().addAugmentation(Config1.class, new Config1Builder().build()).build()).build()).build()));
+ }
+
+ @Test
+ public void testGetAfiSafiWithDefault() throws Exception {
+ final ImmutableList<AfiSafi> defaultValue = ImmutableList.of(new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.class).build());
+ assertEquals(defaultValue, OpenConfigMappingUtil.getAfiSafiWithDefault(null, true));
+ final AfiSafis afiSafi = new AfiSafisBuilder().build();
+ assertEquals(defaultValue, OpenConfigMappingUtil.getAfiSafiWithDefault(afiSafi, true));
+
+ final AfiSafi afiSafiIpv6 = new AfiSafiBuilder().setAfiSafiName(IPV6UNICAST.class).addAugmentation(AfiSafi1.class,
+ new AfiSafi1Builder().setReceive(true).setSendMax(SHORT).build()).build();
+ final List<AfiSafi> afiSafiIpv6List = new ArrayList<>();
+ afiSafiIpv6List.add(afiSafiIpv6);
+
+ final List<AfiSafi> expected = new ArrayList<>(afiSafiIpv6List);
+ expected.add(AFI_SAFI_IPV4);
+ assertEquals(afiSafiIpv6, OpenConfigMappingUtil.getAfiSafiWithDefault(new AfiSafisBuilder().setAfiSafi(afiSafiIpv6List).build(), true).get(0));
+ assertEquals(new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.class).build(),
+ OpenConfigMappingUtil.getAfiSafiWithDefault(new AfiSafisBuilder().setAfiSafi(afiSafiIpv6List).build(), true).get(1));
+ assertEquals(AFI_SAFI, OpenConfigMappingUtil.getAfiSafiWithDefault(createAfiSafi(), true));
+
+ assertTrue(OpenConfigMappingUtil.getAfiSafiWithDefault(null, false).isEmpty());
+ assertTrue(OpenConfigMappingUtil.getAfiSafiWithDefault(afiSafi, false).isEmpty());
+ assertEquals(afiSafiIpv6, OpenConfigMappingUtil.getAfiSafiWithDefault(new AfiSafisBuilder().setAfiSafi(afiSafiIpv6List).build(), false).get(0));
+ assertEquals(new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.class).build(),
+ OpenConfigMappingUtil.getAfiSafiWithDefault(new AfiSafisBuilder().setAfiSafi(afiSafiIpv6List).build(), false).get(1));
+ assertEquals(AFI_SAFI, OpenConfigMappingUtil.getAfiSafiWithDefault(createAfiSafi(), false));
+ }
+}
\ 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.config;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyList;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.primitives.Shorts;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
+import org.opendaylight.controller.md.sal.dom.api.DOMDataBrokerExtension;
+import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeService;
+import org.opendaylight.controller.sal.core.api.model.SchemaService;
+import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeFactory;
+import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService;
+import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider;
+import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration;
+import org.opendaylight.mdsal.singleton.common.api.ServiceGroupIdentifier;
+import org.opendaylight.protocol.bgp.mode.impl.add.all.paths.AllPathSelection;
+import org.opendaylight.protocol.bgp.openconfig.spi.BGPOpenConfigMappingService;
+import org.opendaylight.protocol.bgp.parser.BgpTableTypeImpl;
+import org.opendaylight.protocol.bgp.rib.DefaultRibReference;
+import org.opendaylight.protocol.bgp.rib.RibReference;
+import org.opendaylight.protocol.bgp.rib.impl.RIBImpl;
+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;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafiBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.global.base.AfiSafisBuilder;
+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.GlobalBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV4UNICAST;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.BgpTableType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi2;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi2Builder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.BgpRib;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.RibId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.Rib;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.RibKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.BgpId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv4AddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily;
+import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.sal.binding.generator.impl.GeneratedClassLoadingStrategy;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode;
+import org.osgi.framework.ServiceRegistration;
+
+public class RibImplTest extends AbstractConfig {
+ private static final List<AfiSafi> AFISAFIS = new ArrayList<>();
+ private static final Long ALL_PATHS = 0L;
+ private static final BgpTableType TABLE_TYPE = new BgpTableTypeImpl(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class);
+ private static final Ipv4Address BGP_ID = new BgpId(new Ipv4Address("127.0.0.1"));
+
+ static {
+ AFISAFIS.add(new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.class)
+ .addAugmentation(AfiSafi2.class, new AfiSafi2Builder().setReceive(true).setSendMax(Shorts.checkedCast(ALL_PATHS)).build()).build());
+ }
+
+ @Mock
+ private RIBExtensionConsumerContext extension;
+ @Mock
+ private BindingCodecTreeFactory bindingCodecTreeFactory;
+ @Mock
+ private DOMDataBroker domDataBroker;
+ @Mock
+ private SchemaService schemaService;
+ @Mock
+ private ClusterSingletonServiceProvider clusterSingletonServiceProvider;
+ @Mock
+ private BGPOpenConfigMappingService mappingService;
+ @Mock
+ private ListenerRegistration dataTreeRegistration;
+ @Mock
+ private RIBSupport ribSupport;
+ @Mock
+ private ServiceRegistration serviceRegistration;
+
+ @Before
+ public void setUp() throws Exception {
+ super.setUp();
+ Mockito.doAnswer(new Answer<ClusterSingletonServiceRegistration>() {
+ @Override
+ public ClusterSingletonServiceRegistration answer(final InvocationOnMock invocationOnMock) throws Throwable {
+ singletonService = (ClusterSingletonService) invocationOnMock.getArguments()[0];
+ return singletonServiceRegistration;
+ }
+ }).when(this.clusterSingletonServiceProvider).registerClusterSingletonService(any(ClusterSingletonService.class));
+
+ Mockito.doReturn(Collections.singletonMap(TABLE_TYPE, new AllPathSelection()))
+ .when(this.mappingService).toPathSelectionMode(any());
+ Mockito.doReturn(Collections.singletonList(TABLE_TYPE)).when(this.mappingService).toTableTypes(any());
+ Mockito.doReturn(mock(GeneratedClassLoadingStrategy.class)).when(this.extension).getClassLoadingStrategy();
+ Mockito.doReturn(this.ribSupport).when(this.extension).getRIBSupport(any(TablesKey.class));
+ final NodeIdentifier nii = new NodeIdentifier(QName.create("test").intern());
+ Mockito.doReturn(nii).when(this.ribSupport).routeAttributesIdentifier();
+ Mockito.doReturn(ImmutableSet.of()).when(this.ribSupport).cacheableAttributeObjects();
+ final ChoiceNode choiceNode = mock(ChoiceNode.class);
+ Mockito.doReturn(choiceNode).when(this.ribSupport).emptyRoutes();
+ Mockito.doReturn(nii).when(choiceNode).getIdentifier();
+ Mockito.doReturn(QName.create("test").intern()).when(choiceNode).getNodeType();
+ Mockito.doReturn(this.domTx).when(this.domDataBroker).createTransactionChain(any());
+ final DOMDataTreeChangeService dOMDataTreeChangeService = mock(DOMDataTreeChangeService.class);
+ Mockito.doReturn(Collections.singletonMap(DOMDataTreeChangeService.class, dOMDataTreeChangeService))
+ .when(this.domDataBroker).getSupportedExtensions();
+ Mockito.doReturn(this.dataTreeRegistration).when(this.schemaService).registerSchemaContextListener(any());
+ Mockito.doNothing().when(this.dataTreeRegistration).close();
+ Mockito.doReturn(mock(ListenerRegistration.class)).when(dOMDataTreeChangeService).registerDataTreeChangeListener(any(), any());
+ Mockito.doNothing().when(this.serviceRegistration).unregister();
+ }
+
+ @Test
+ public void testRibImpl() throws Exception {
+ final RibImpl ribImpl = new RibImpl(this.clusterSingletonServiceProvider, this.extension, this.dispatcher,
+ this.bindingCodecTreeFactory, this.domDataBroker, this.schemaService);
+ ribImpl.setServiceRegistration(this.serviceRegistration);
+ ribImpl.start(createGlobal(), "rib-test", this.mappingService, this.configurationWriter);
+ verify(this.mappingService).toPathSelectionMode(anyList());
+ verify(this.mappingService).toTableTypes(anyList());
+ verify(this.extension).getClassLoadingStrategy();
+ verify(this.domDataBroker).createTransactionChain(any(RIBImpl.class));
+ verify(this.domDataBroker).getSupportedExtensions();
+ verify(this.clusterSingletonServiceProvider).registerClusterSingletonService(any());
+ verify(this.schemaService).registerSchemaContextListener(any(RIBImpl.class));
+ this.singletonService.instantiateServiceInstance();
+ Mockito.verify(this.configurationWriter).apply();
+ assertEquals("RIBImpl{}", ribImpl.toString());
+ assertEquals(ServiceGroupIdentifier.create(new RibId("rib-test") + "-service-group"), ribImpl.getRibIServiceGroupIdentifier());
+ assertEquals(Collections.singleton(new TablesKey(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class)), ribImpl.getLocalTablesKeys());
+ assertNotNull(ribImpl.getImportPolicyPeerTracker());
+ assertNotNull(ribImpl.getService());
+ assertNotNull(ribImpl.getCacheDisconnectedPeers());
+ assertNotNull(ribImpl.getInstanceIdentifier());
+ assertEquals(AS, ribImpl.getLocalAs());
+ assertEquals(BGP_ID, ribImpl.getBgpIdentifier());
+ assertEquals(Collections.singleton(TABLE_TYPE), ribImpl.getLocalTables());
+ assertEquals(this.dispatcher, ribImpl.getDispatcher());
+ assertEquals(this.extension, ribImpl.getRibExtensions());
+ assertNotNull(ribImpl.getRibSupportContext());
+ assertNotNull(ribImpl.getCodecsRegistry());
+
+ ribImpl.close();
+ verify(this.dataTreeRegistration).close();
+ verify(this.dataTreeRegistration).close();
+ verify(this.serviceRegistration).unregister();
+ }
+
+ private Global createGlobal() {
+ return new GlobalBuilder()
+ .setAfiSafis(new AfiSafisBuilder().setAfiSafi(AFISAFIS).build())
+ .setConfig(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.global.base
+ .ConfigBuilder().setAs(AS).setRouterId(BGP_ID).build()).build();
+ }
+}
\ 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.stats.rib.impl;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.Test;
+import org.opendaylight.controller.config.yang.bgp.rib.impl.BgpRenderState;
+import org.opendaylight.controller.config.yang.bgp.rib.impl.LocRibRouteTable;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.AsNumber;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.ZeroBasedCounter32;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.RibId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.BgpId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.ClusterIdentifier;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv4AddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily;
+
+public class BGPRenderStatsImplTest {
+ private final static BgpId BGP_ID = new BgpId("127.0.0.1");
+ private static final RibId RIB_ID = new RibId("test-rib");
+ private static final ClusterIdentifier CLUSTER_ID = new ClusterIdentifier("192.168.1.2");
+ private static final AsNumber AS = new AsNumber(0x10L);
+ private static final ZeroBasedCounter32 COUTER = new ZeroBasedCounter32(0L);
+
+ @Test
+ public void getBgpRenderState() throws Exception {
+ final BGPRenderStatsImpl render = new BGPRenderStatsImpl(BGP_ID, RIB_ID, AS, CLUSTER_ID);
+
+ final BgpRenderState renderStateExpected = new BgpRenderState();
+ renderStateExpected.setRibId(RIB_ID);
+ renderStateExpected.setBgpRibId(BGP_ID);
+ renderStateExpected.setClusterId(CLUSTER_ID);
+ renderStateExpected.setLocalAs(AS);
+ renderStateExpected.setConfiguredPeerCount(COUTER);
+ renderStateExpected.setConnectedPeerCount(COUTER);
+ final List<LocRibRouteTable> locRibRouteTableList = new ArrayList<>();
+ renderStateExpected.setLocRibRouteTable(locRibRouteTableList);
+ renderStateExpected.setLocRibRoutesCount(COUTER);
+
+ assertEquals(renderStateExpected, render.getBgpRenderState());
+ assertEquals(1L, render.getLocRibRouteCounter().init(new TablesKey(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class)).increaseCount());
+ assertEquals(1L, render.getConfiguredPeerCounter().increaseCount());
+ assertEquals(1L, render.getConnectedPeerCounter().increaseCount());
+ }
+}
\ No newline at end of file
import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-final public class PeerRoleUtil {
+public final class PeerRoleUtil {
public static final NodeIdentifier PEER_ROLE_NID = new NodeIdentifier(QName.create(Peer.QNAME, "peer-role").intern());
private PeerRoleUtil() {
final class CommunitiesBuilder {
private static final Logger LOG = LoggerFactory.getLogger(CommunitiesBuilder.class);
- private final static As4SpecificCommon AS_4_COMMON = new As4SpecificCommonBuilder().setAsNumber(new AsNumber(20L)).setLocalAdministrator(100).build();
- private final static Ipv4Address IPV4 = new Ipv4Address("192.168.1.0");
- private final static byte[] BYTE = new byte[]{(byte) 0x4f, (byte) 0x70, (byte) 0x00, (byte) 0x00};
- private final static int LA = 4660;
- private final static ShortAsNumber SHORT_AS = new ShortAsNumber(20L);
+ private static final As4SpecificCommon AS_4_COMMON = new As4SpecificCommonBuilder().setAsNumber(new AsNumber(20L)).setLocalAdministrator(100).build();
+ private static final Ipv4Address IPV4 = new Ipv4Address("192.168.1.0");
+ private static final byte[] BYTE = new byte[]{(byte) 0x4f, (byte) 0x70, (byte) 0x00, (byte) 0x00};
+ private static final int LA = 4660;
+ private static final ShortAsNumber SHORT_AS = new ShortAsNumber(20L);
private CommunitiesBuilder() {
throw new UnsupportedOperationException();
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.ipv4.next.hop._case.Ipv4NextHopBuilder;
final class PrefixesBuilder {
- private final static Ipv4NextHopCase NEXT_HOP;
+ private static final Ipv4NextHopCase NEXT_HOP;
static {
NEXT_HOP = new Ipv4NextHopCaseBuilder().setIpv4NextHop(new Ipv4NextHopBuilder().setGlobal(new Ipv4Address("127.1.1.1")).build()).build();
throw new UnsupportedOperationException();
}
- static void AdvertiseIpv4Prefixes(final ChannelOutputLimiter session, final int nPrefixes, final List<String> extCom, final boolean multipartSupport) {
+ static void advertiseIpv4Prefixes(final ChannelOutputLimiter session, final int nPrefixes, final List<String> extCom, final boolean multipartSupport) {
Ipv4Prefix addressPrefix = new Ipv4Prefix("1.1.1.1/31");
for (int i = 0; i < nPrefixes; i++) {
buildAndSend(session, addressPrefix, extCom, multipartSupport);
public void onSessionUp(final BGPSession session) {
LOG.info("Client Listener: Session Up.");
if (this.nPrefixes > 0) {
- PrefixesBuilder.AdvertiseIpv4Prefixes(((BGPSessionImpl) session).getLimiter(), this.nPrefixes, this.extCom, this.multiPathSupport);
+ PrefixesBuilder.advertiseIpv4Prefixes(((BGPSessionImpl) session).getLimiter(), this.nPrefixes, this.extCom, this.multiPathSupport);
}
}
public class SimpleRSVPExtensionProviderContext extends SimpleRSVPExtensionConsumerContext implements RSVPExtensionProviderContext {
- public static final int DEFAULT_MAXIMUM_CACHED_OBJECTS = 100000;
+ private static final int DEFAULT_MAXIMUM_CACHED_OBJECTS = 100000;
private final AtomicReference<Cache<Object, Object>> cacheRef;
private final ReferenceCache referenceCache = new ReferenceCache() {
return ret;
}
};
- private final int maximumCachedObjects;
public SimpleRSVPExtensionProviderContext() {
this(DEFAULT_MAXIMUM_CACHED_OBJECTS);
}
public SimpleRSVPExtensionProviderContext(final int maximumCachedObjects) {
- this.maximumCachedObjects = maximumCachedObjects;
-
final Cache<Object, Object> cache = CacheBuilder.newBuilder().maximumSize(maximumCachedObjects).build();
this.cacheRef = new AtomicReference<Cache<Object,Object>>(cache);
}