From 3faf4d25e7bd98255499b866e340ae6704ba65ba Mon Sep 17 00:00:00 2001 From: "Claudio D. Gasparini" Date: Sun, 18 Sep 2016 16:00:34 +0200 Subject: [PATCH] BUG-6647 Increase code coverage and clean up IV -Implemet Rib-impl test Change-Id: Idc952503dddae027e5a48d7b866ed8e94771287f Signed-off-by: Claudio D. Gasparini --- .../impl/add/AddPathAbstractRouteEntry.java | 12 - bgp/rib-impl/pom.xml | 23 +- .../bgp/rib/impl/ApplicationPeer.java | 16 +- .../protocol/bgp/rib/impl/RIBImpl.java | 5 +- .../protocol/bgp/rib/impl/config/AppPeer.java | 6 +- .../bgp/rib/impl/config/BgpDeployerImpl.java | 13 +- .../protocol/bgp/rib/impl/config/BgpPeer.java | 23 +- .../impl/config/OpenConfigMappingUtil.java | 9 +- .../stats/rib/impl/BGPRenderStatsImpl.java | 37 +- .../bgp/rib/impl/RouteUpdateKeyTest.java | 41 ++ .../bgp/rib/impl/config/AbstractConfig.java | 150 ++++++ .../bgp/rib/impl/config/AppPeerTest.java | 65 +++ .../rib/impl/config/BgpDeployerImplTest.java | 440 ++++++++++++++++++ .../bgp/rib/impl/config/BgpPeerTest.java | 178 +++++++ .../config/OpenConfigMappingUtilTest.java | 276 +++++++++++ .../bgp/rib/impl/config/RibImplTest.java | 179 +++++++ .../rib/impl/BGPRenderStatsImplTest.java | 54 +++ .../protocol/bgp/rib/spi/PeerRoleUtil.java | 2 +- .../bgp/testtool/CommunitiesBuilder.java | 10 +- .../bgp/testtool/PrefixesBuilder.java | 4 +- .../bgp/testtool/TestingListener.java | 2 +- .../SimpleRSVPExtensionProviderContext.java | 5 +- 22 files changed, 1476 insertions(+), 74 deletions(-) create mode 100644 bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/RouteUpdateKeyTest.java create mode 100644 bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/AbstractConfig.java create mode 100644 bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/AppPeerTest.java create mode 100644 bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpDeployerImplTest.java create mode 100644 bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpPeerTest.java create mode 100644 bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/OpenConfigMappingUtilTest.java create mode 100644 bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/RibImplTest.java create mode 100644 bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/stats/rib/impl/BGPRenderStatsImplTest.java diff --git a/bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/add/AddPathAbstractRouteEntry.java b/bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/add/AddPathAbstractRouteEntry.java index 33fabba719..cc664dc647 100644 --- a/bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/add/AddPathAbstractRouteEntry.java +++ b/bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/add/AddPathAbstractRouteEntry.java @@ -24,7 +24,6 @@ import org.opendaylight.protocol.bgp.rib.spi.PeerExportGroup; 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; @@ -186,17 +185,6 @@ public abstract class AddPathAbstractRouteEntry extends AbstractRouteEntry { 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) { diff --git a/bgp/rib-impl/pom.xml b/bgp/rib-impl/pom.xml index cd6b0f1a3a..06fc456ed7 100644 --- a/bgp/rib-impl/pom.xml +++ b/bgp/rib-impl/pom.xml @@ -30,6 +30,9 @@ 3.0.4 + + 1.6.4 + @@ -294,8 +297,24 @@ ch.qos.logback logback-classic - - + + org.powermock + powermock + ${powermock.version} + pom + + + org.powermock + powermock-module-junit4 + ${powermock.version} + test + + + org.powermock + powermock-api-mockito + ${powermock.version} + test + diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/ApplicationPeer.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/ApplicationPeer.java index 73fdf42504..7ed275f93f 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/ApplicationPeer.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/ApplicationPeer.java @@ -185,10 +185,18 @@ public class ApplicationPeer implements AutoCloseable, org.opendaylight.protocol @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(); + } } @Override diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBImpl.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBImpl.java index 7b30f0b3b2..842e92c4b4 100755 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBImpl.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBImpl.java @@ -192,11 +192,13 @@ public final class RIBImpl extends DefaultRibReference implements ClusterSinglet @Override public synchronized void close() throws Exception { - this.domChain.close(); if (this.registration != null) { this.registration.close(); this.registration = null; } + if(this.domChain != null) { + this.domChain.close(); + } } @Override @@ -209,6 +211,7 @@ public final class RIBImpl extends DefaultRibReference implements ClusterSinglet return this.bgpIdentifier; } + @Nonnull @Override public Set getLocalTables() { return this.localTables; diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/AppPeer.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/AppPeer.java index edcc322755..61e5ce2252 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/AppPeer.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/AppPeer.java @@ -35,7 +35,7 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; 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; @@ -123,7 +123,9 @@ public class AppPeer implements PeerBean { @Override public ListenableFuture 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); } diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpDeployerImpl.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpDeployerImpl.java index 02fdcaa3be..bc863d64c4 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpDeployerImpl.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpDeployerImpl.java @@ -165,10 +165,7 @@ public final class BgpDeployerImpl implements BgpDeployer, ClusteredDataTreeChan if(ribImpl == null ) { onGlobalCreated(rootIdentifier, global, configurationWriter); } else if (!ribImpl.isGlobalEqual(global)) { - final List closedPeers = closeAllBindedPeers(rootIdentifier); - ribImpl.close(); - initiateRibInstance(rootIdentifier, global, ribImpl, configurationWriter); - closedPeers.forEach(peer -> peer.restart(ribImpl, this.mappingService)); + onGlobalUpdated(rootIdentifier, global, ribImpl, configurationWriter); } } @@ -191,6 +188,14 @@ public final class BgpDeployerImpl implements BgpDeployer, ClusteredDataTreeChan LOG.debug("RIB instance created {}", ribImpl); } + private void onGlobalUpdated(final InstanceIdentifier rootIdentifier, final Global global, final RibImpl ribImpl, + final WriteConfiguration configurationWriter) { + final List 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 rootIdentifier) { LOG.debug("Removing RIB instance: {}", rootIdentifier); diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpPeer.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpPeer.java index 6f5c4f57de..6f22fd90cc 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpPeer.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpPeer.java @@ -60,7 +60,7 @@ import org.slf4j.Logger; 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); @@ -86,22 +86,27 @@ public class BgpPeer implements PeerBean, BGPPeerRuntimeMXBean { @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 @@ -209,14 +214,14 @@ public class BgpPeer implements PeerBean, BGPPeerRuntimeMXBean { this.neighborAddress = neighbor.getNeighborAddress(); this.bgpPeer = new BGPPeer(Ipv4Util.toStringIP(this.neighborAddress), rib, mappingService.toPeerRole(neighbor), BgpPeer.this.rpcRegistry); final List 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); diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/OpenConfigMappingUtil.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/OpenConfigMappingUtil.java index cc0564c811..61c29030a1 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/OpenConfigMappingUtil.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/OpenConfigMappingUtil.java @@ -10,8 +10,6 @@ package org.opendaylight.protocol.bgp.rib.impl.config; 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; @@ -127,12 +125,7 @@ final class OpenConfigMappingUtil { } final List afiSafi = afiSAfis.getAfiSafi(); if (setDeafultIPv4) { - final boolean anyMatch = FluentIterable.from(afiSafi).anyMatch(new Predicate() { - @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); } diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/stats/rib/impl/BGPRenderStatsImpl.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/stats/rib/impl/BGPRenderStatsImpl.java index 9d6b409685..c5495ccb9e 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/stats/rib/impl/BGPRenderStatsImpl.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/stats/rib/impl/BGPRenderStatsImpl.java @@ -10,6 +10,7 @@ package org.opendaylight.protocol.bgp.rib.impl.stats.rib.impl; 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; @@ -19,14 +20,12 @@ import org.opendaylight.protocol.bgp.rib.impl.stats.UnsignedInt32Counter; 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; @@ -41,8 +40,8 @@ public class BGPRenderStatsImpl implements BGPRenderStats { 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 @@ -57,25 +56,25 @@ public class BGPRenderStatsImpl implements BGPRenderStats { // fill in the the statistic part final UnsignedInt32Counter totalRouteCount = new UnsignedInt32Counter("Total Loc-Rib Route Count"); final List 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 e, final List 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; diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/RouteUpdateKeyTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/RouteUpdateKeyTest.java new file mode 100644 index 0000000000..53cfc58ada --- /dev/null +++ b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/RouteUpdateKeyTest.java @@ -0,0 +1,41 @@ +/* + * 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 diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/AbstractConfig.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/AbstractConfig.java new file mode 100644 index 0000000000..4afe252575 --- /dev/null +++ b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/AbstractConfig.java @@ -0,0 +1,150 @@ +/* + * 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() { + @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(); + } +} diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/AppPeerTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/AppPeerTest.java new file mode 100644 index 0000000000..91325e1a21 --- /dev/null +++ b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/AppPeerTest.java @@ -0,0 +1,65 @@ +/* + * 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 diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpDeployerImplTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpDeployerImplTest.java new file mode 100644 index 0000000000..64a8e79afc --- /dev/null +++ b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpDeployerImplTest.java @@ -0,0 +1,440 @@ +/* + * 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 modification; + @Mock + private ListenerRegistration dataTreeRegistration; + @Mock + private ServiceRegistration registration; + + private Collection> 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 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 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 afi) { + final Config config = new ConfigBuilder().setAs(AS).setRouterId(BGP_ID).build(); + final ArrayList 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 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 afi) { + Mockito.doReturn(createNeighborExpected(afi)).when(this.dObject).getDataAfter(); + Mockito.doReturn(createNeighborExpected(afi)).when(this.dObject).getDataBefore(); + } + + + private Neighbor createNeighborExpected(final Class 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 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 diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpPeerTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpPeerTest.java new file mode 100644 index 0000000000..0b0ddefdfb --- /dev/null +++ b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpPeerTest.java @@ -0,0 +1,178 @@ +/* + * 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 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 diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/OpenConfigMappingUtilTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/OpenConfigMappingUtilTest.java new file mode 100644 index 0000000000..18bcf6a407 --- /dev/null +++ b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/OpenConfigMappingUtilTest.java @@ -0,0 +1,276 @@ +/* + * 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.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.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_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 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 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 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 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 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 afiSafiIpv6List = new ArrayList<>(); + afiSafiIpv6List.add(afiSafiIpv6); + + final List 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 diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/RibImplTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/RibImplTest.java new file mode 100644 index 0000000000..7b3b4a2d80 --- /dev/null +++ b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/RibImplTest.java @@ -0,0 +1,179 @@ +/* + * 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 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() { + @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 diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/stats/rib/impl/BGPRenderStatsImplTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/stats/rib/impl/BGPRenderStatsImplTest.java new file mode 100644 index 0000000000..ee50556107 --- /dev/null +++ b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/stats/rib/impl/BGPRenderStatsImplTest.java @@ -0,0 +1,54 @@ +/* + * 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 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 diff --git a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/PeerRoleUtil.java b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/PeerRoleUtil.java index ef714486e1..8b0f301206 100644 --- a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/PeerRoleUtil.java +++ b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/PeerRoleUtil.java @@ -17,7 +17,7 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdent 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() { diff --git a/bgp/testtool/src/main/java/org/opendaylight/protocol/bgp/testtool/CommunitiesBuilder.java b/bgp/testtool/src/main/java/org/opendaylight/protocol/bgp/testtool/CommunitiesBuilder.java index 66928b6d19..d8b41fcb93 100644 --- a/bgp/testtool/src/main/java/org/opendaylight/protocol/bgp/testtool/CommunitiesBuilder.java +++ b/bgp/testtool/src/main/java/org/opendaylight/protocol/bgp/testtool/CommunitiesBuilder.java @@ -47,11 +47,11 @@ import org.slf4j.LoggerFactory; 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(); diff --git a/bgp/testtool/src/main/java/org/opendaylight/protocol/bgp/testtool/PrefixesBuilder.java b/bgp/testtool/src/main/java/org/opendaylight/protocol/bgp/testtool/PrefixesBuilder.java index 286e0efda2..0fb984c768 100644 --- a/bgp/testtool/src/main/java/org/opendaylight/protocol/bgp/testtool/PrefixesBuilder.java +++ b/bgp/testtool/src/main/java/org/opendaylight/protocol/bgp/testtool/PrefixesBuilder.java @@ -41,7 +41,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.type 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(); @@ -51,7 +51,7 @@ final class PrefixesBuilder { throw new UnsupportedOperationException(); } - static void AdvertiseIpv4Prefixes(final ChannelOutputLimiter session, final int nPrefixes, final List extCom, final boolean multipartSupport) { + static void advertiseIpv4Prefixes(final ChannelOutputLimiter session, final int nPrefixes, final List 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); diff --git a/bgp/testtool/src/main/java/org/opendaylight/protocol/bgp/testtool/TestingListener.java b/bgp/testtool/src/main/java/org/opendaylight/protocol/bgp/testtool/TestingListener.java index 2297de7525..c022aad549 100644 --- a/bgp/testtool/src/main/java/org/opendaylight/protocol/bgp/testtool/TestingListener.java +++ b/bgp/testtool/src/main/java/org/opendaylight/protocol/bgp/testtool/TestingListener.java @@ -43,7 +43,7 @@ final class TestingListener implements BGPSessionListener { 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); } } diff --git a/rsvp/spi/src/main/java/org/opendaylight/protocol/rsvp/parser/spi/pojo/SimpleRSVPExtensionProviderContext.java b/rsvp/spi/src/main/java/org/opendaylight/protocol/rsvp/parser/spi/pojo/SimpleRSVPExtensionProviderContext.java index 6a2eb86b49..c8767df248 100644 --- a/rsvp/spi/src/main/java/org/opendaylight/protocol/rsvp/parser/spi/pojo/SimpleRSVPExtensionProviderContext.java +++ b/rsvp/spi/src/main/java/org/opendaylight/protocol/rsvp/parser/spi/pojo/SimpleRSVPExtensionProviderContext.java @@ -29,7 +29,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev 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> cacheRef; private final ReferenceCache referenceCache = new ReferenceCache() { @@ -47,15 +47,12 @@ public class SimpleRSVPExtensionProviderContext extends SimpleRSVPExtensionConsu return ret; } }; - private final int maximumCachedObjects; public SimpleRSVPExtensionProviderContext() { this(DEFAULT_MAXIMUM_CACHED_OBJECTS); } public SimpleRSVPExtensionProviderContext(final int maximumCachedObjects) { - this.maximumCachedObjects = maximumCachedObjects; - final Cache cache = CacheBuilder.newBuilder().maximumSize(maximumCachedObjects).build(); this.cacheRef = new AtomicReference>(cache); } -- 2.36.6