From: Claudio D. Gasparini Date: Mon, 26 Feb 2018 11:01:55 +0000 (+0100) Subject: BGPCEP-754: Start using default import policy X-Git-Tag: release/fluorine~198 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=e0ef1ee6ca1e66e96a8adb5e0e96b330326c8f11;p=bgpcep.git BGPCEP-754: Start using default import policy configuration with configurable rib policies. Change-Id: I6aeb4c4261aafb7faf1ff0a08edfefb443590830 Signed-off-by: Claudio D. Gasparini --- diff --git a/bgp/bgp-artifacts/pom.xml b/bgp/bgp-artifacts/pom.xml index b420ad74a4..c18162dbdd 100644 --- a/bgp/bgp-artifacts/pom.xml +++ b/bgp/bgp-artifacts/pom.xml @@ -169,6 +169,13 @@ bgp-config-example ${project.version} + + ${project.groupId} + bgp-config-example + ${project.version} + test-jar + test + ${project.groupId} bgp-config-example diff --git a/bgp/config-example/pom.xml b/bgp/config-example/pom.xml index 6fa8c86875..103953ddc3 100644 --- a/bgp/config-example/pom.xml +++ b/bgp/config-example/pom.xml @@ -55,6 +55,7 @@ **/network-topology-config.xml **/protocols-config.xml + **/routing-policy-config.xml @@ -90,6 +91,18 @@ + + org.apache.maven.plugins + maven-jar-plugin + + + package + + test-jar + + + + diff --git a/bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/EvpnRibSupport.java b/bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/EvpnRibSupport.java index 7f96c1a707..a88c67168d 100644 --- a/bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/EvpnRibSupport.java +++ b/bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/EvpnRibSupport.java @@ -48,7 +48,7 @@ import org.slf4j.LoggerFactory; final class EvpnRibSupport extends AbstractRIBSupport { private static final EvpnRibSupport SINGLETON = new EvpnRibSupport(); private static final Logger LOG = LoggerFactory.getLogger(EvpnRibSupport.class); - private static final QName ROUTE_KEY = QName.create(EvpnRoute.QNAME, "route-key").intern(); + private static final QName ROUTE_KEY_QNAME = QName.create(EvpnRoute.QNAME, ROUTE_KEY).intern(); private static final NodeIdentifier NLRI_ROUTES_LIST = NodeIdentifier.create(EvpnDestination.QNAME); private EvpnRibSupport() { @@ -123,7 +123,7 @@ final class EvpnRibSupport extends AbstractRIBSupport { final ByteBuf buffer = Unpooled.buffer(); final EvpnDestination dest = EvpnNlriParser.extractRouteKeyDestination(evpn); EvpnNlriParser.serializeNlri(Collections.singletonList(dest), buffer); - return new NodeIdentifierWithPredicates(routeQName(), ROUTE_KEY, ByteArray.encodeBase64(buffer)); + return new NodeIdentifierWithPredicates(routeQName(), ROUTE_KEY_QNAME, ByteArray.encodeBase64(buffer)); } } diff --git a/bgp/flowspec/src/main/java/org/opendaylight/protocol/bgp/flowspec/AbstractFlowspecRIBSupport.java b/bgp/flowspec/src/main/java/org/opendaylight/protocol/bgp/flowspec/AbstractFlowspecRIBSupport.java index bafebd74c6..24d8eecdd4 100644 --- a/bgp/flowspec/src/main/java/org/opendaylight/protocol/bgp/flowspec/AbstractFlowspecRIBSupport.java +++ b/bgp/flowspec/src/main/java/org/opendaylight/protocol/bgp/flowspec/AbstractFlowspecRIBSupport.java @@ -45,7 +45,7 @@ public abstract class AbstractFlowspecRIBSupport cazeClass, final Class containerClass, final Class listClass, final Class addressFamilyClass, final Class safiClass, final QName destinationQname) { - super(cazeClass, containerClass, listClass, addressFamilyClass, safiClass, "route-key", destinationQname); + super(cazeClass, containerClass, listClass, addressFamilyClass, safiClass, ROUTE_KEY, destinationQname); } @Override diff --git a/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/impl/LinkstateRIBSupport.java b/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/impl/LinkstateRIBSupport.java index 1ee205b908..edbba00ca6 100644 --- a/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/impl/LinkstateRIBSupport.java +++ b/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/impl/LinkstateRIBSupport.java @@ -47,7 +47,7 @@ import org.slf4j.LoggerFactory; public final class LinkstateRIBSupport extends AbstractRIBSupport { private static final Logger LOG = LoggerFactory.getLogger(LinkstateRIBSupport.class); - private static final QName ROUTE_KEY = QName.create(LinkstateRoute.QNAME, "route-key").intern(); + private static final QName ROUTE_KEY_QNAME = QName.create(LinkstateRoute.QNAME, ROUTE_KEY).intern(); private static final LinkstateRIBSupport SINGLETON = new LinkstateRIBSupport(); private final NodeIdentifier route = new NodeIdentifier(LinkstateRoute.QNAME); private final NodeIdentifier nlriRoutesList = new NodeIdentifier(CLinkstateDestination.QNAME); @@ -106,7 +106,7 @@ public final class LinkstateRIBSupport extends AbstractRIBSupport { final CLinkstateDestination cLinkstateDestination = LinkstateNlriParser.extractLinkstateDestination(linkstate); SimpleNlriTypeRegistry.getInstance().serializeNlriType(cLinkstateDestination, buffer); - return new NodeIdentifierWithPredicates(LinkstateRoute.QNAME, ROUTE_KEY, ByteArray.readAllBytes(buffer)); + return new NodeIdentifierWithPredicates(LinkstateRoute.QNAME, ROUTE_KEY_QNAME, ByteArray.readAllBytes(buffer)); } @Nonnull diff --git a/bgp/openconfig-rp-statement/pom.xml b/bgp/openconfig-rp-statement/pom.xml index 3be0071295..e5c395cd1e 100644 --- a/bgp/openconfig-rp-statement/pom.xml +++ b/bgp/openconfig-rp-statement/pom.xml @@ -104,6 +104,12 @@ test-jar test + + ${project.groupId} + bgp-openconfig-rp-spi + test-jar + test + diff --git a/bgp/openconfig-rp-statement/src/test/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/AbstractStatementRegistryConsumerTest.java b/bgp/openconfig-rp-statement/src/test/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/AbstractStatementRegistryConsumerTest.java index b87c8d6a21..8ca584a25c 100644 --- a/bgp/openconfig-rp-statement/src/test/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/AbstractStatementRegistryConsumerTest.java +++ b/bgp/openconfig-rp-statement/src/test/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/AbstractStatementRegistryConsumerTest.java @@ -12,16 +12,16 @@ import static org.opendaylight.bgpcep.config.loader.routing.policy.OpenconfigRou import java.util.List; import java.util.concurrent.ExecutionException; import org.junit.Before; -import org.opendaylight.bgpcep.config.loader.routing.policy.AbstractOpenconfigRoutingPolicyLoaderTest; import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.AbstractStatementRegistryTest; import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.registry.StatementRegistry; import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.routing.policy.rev151009.routing.policy.top.routing.policy.PolicyDefinitions; import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.routing.policy.rev151009.routing.policy.top.routing.policy.policy.definitions.PolicyDefinition; import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.routing.policy.rev151009.routing.policy.top.routing.policy.policy.definitions.PolicyDefinitionKey; import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.routing.policy.rev151009.routing.policy.top.routing.policy.policy.definitions.policy.definition.statements.Statement; -public class AbstractStatementRegistryConsumerTest extends AbstractOpenconfigRoutingPolicyLoaderTest { +public class AbstractStatementRegistryConsumerTest extends AbstractStatementRegistryTest { protected StatementRegistry statementRegistry; @Before diff --git a/bgp/rib-impl/pom.xml b/bgp/rib-impl/pom.xml index 07d5efccc5..0d47cc1640 100644 --- a/bgp/rib-impl/pom.xml +++ b/bgp/rib-impl/pom.xml @@ -37,6 +37,10 @@ ${project.groupId} config-loader-spi + + ${project.groupId} + bgp-openconfig-api + ${project.groupId} bgp-openconfig-spi @@ -45,6 +49,10 @@ ${project.groupId} bgp-path-selection-mode + + ${project.groupId} + bgp-openconfig-rp-spi + ${project.groupId} bgp-inet @@ -86,6 +94,17 @@ linux-x86_64 + + ${project.groupId} + bgp-openconfig-rp-impl + test + + + ${project.groupId} + bgp-openconfig-rp-impl + test-jar + test + ${project.groupId} bgp-rib-spi @@ -223,6 +242,40 @@ yang-test-util test + + ${project.groupId} + routing-policy-config-loader + test + + + ${project.groupId} + routing-policy-config-loader + test + test-jar + + + ${project.groupId} + bgp-openconfig-rp-statement + test + + + ${project.groupId} + bgp-openconfig-rp-statement + test-jar + test + + + ${project.groupId} + bgp-openconfig-rp-spi + test-jar + test + + + ${project.groupId} + bgp-config-example + test-jar + 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 264e04662f..f8333d8e5f 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 @@ -145,8 +145,8 @@ public class ApplicationPeer extends BGPPeerStateImpl implements org.opendayligh this.adjRibInWriter = this.adjRibInWriter.transform(this.peerId, context, localTables, Collections.emptyMap(), registerAppPeerListener); this.effectiveRibInWriter = EffectiveRibInWriter - .create(this.rib.getService(), this.rib.createPeerChain(this), this.peerIId, - this.rib.getImportPolicyPeerTracker(), context, PeerRole.Internal, + .create(this.rib, this.rib.createPeerChain(this), this.peerIId, + this.rib.getImportPolicyPeerTracker(), PeerRole.Internal, localTables); this.bgpSessionState.registerMessagesCounter(this); this.trackerRegistration = this.rib.getPeerTracker().registerPeer(this); diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPPeer.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPPeer.java index a1d4043947..c5d55cae9a 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPPeer.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPPeer.java @@ -327,10 +327,9 @@ public class BGPPeer extends BGPPeerStateImpl implements BGPSessionListener, Pee } addBgp4Support(); - this.effRibInWriter = EffectiveRibInWriter.create(this.rib.getService(), + this.effRibInWriter = EffectiveRibInWriter.create(this.rib, this.rib.createPeerChain(this), this.peerIId, this.rib.getImportPolicyPeerTracker(), - this.rib.getRibSupportContext(), this.peerRole, this.tables); registerPrefixesCounters(this.effRibInWriter, this.effRibInWriter); diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPRouteEntryImportParametersImpl.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPRouteEntryImportParametersImpl.java new file mode 100644 index 0000000000..0ef61a91ff --- /dev/null +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPRouteEntryImportParametersImpl.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2018 AT&T Intellectual Property. 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 org.opendaylight.protocol.bgp.rib.spi.policy.BGPRouteEntryImportParameters; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev171207.PeerId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev171207.PeerRole; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates; + +public class BGPRouteEntryImportParametersImpl implements BGPRouteEntryImportParameters { + private final PeerId peerId; + private final NodeIdentifierWithPredicates routeId; + private final PeerRole fromPeerRole; + + public BGPRouteEntryImportParametersImpl( + final NodeIdentifierWithPredicates routeId, + final PeerId peerId, + final PeerRole fromPeerRole) { + this.routeId = routeId; + this.peerId = peerId; + this.fromPeerRole = fromPeerRole; + } + + @Override + public NodeIdentifierWithPredicates getRouteId() { + return this.routeId; + } + + @Override + public PeerId getFromPeerId() { + return this.peerId; + } + + @Override + public PeerRole getFromPeerRole() { + return this.fromPeerRole; + } + +} diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/EffectiveRibInWriter.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/EffectiveRibInWriter.java index 8a8b22cd5d..e39e6f9e01 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/EffectiveRibInWriter.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/EffectiveRibInWriter.java @@ -21,18 +21,24 @@ import javax.annotation.Nonnull; import javax.annotation.concurrent.NotThreadSafe; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.controller.md.sal.dom.api.ClusteredDOMDataTreeChangeListener; -import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeService; import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeIdentifier; import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction; import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain; import org.opendaylight.protocol.bgp.rib.impl.spi.AbstractImportPolicy; 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.RIBSupportContext; import org.opendaylight.protocol.bgp.rib.impl.spi.RIBSupportContextRegistry; import org.opendaylight.protocol.bgp.rib.impl.state.peer.PrefixesInstalledCounters; import org.opendaylight.protocol.bgp.rib.impl.state.peer.PrefixesReceivedCounters; +import org.opendaylight.protocol.bgp.rib.spi.BGPPeerTracker; import org.opendaylight.protocol.bgp.rib.spi.IdentifierUtils; import org.opendaylight.protocol.bgp.rib.spi.RIBSupport; +import org.opendaylight.protocol.bgp.rib.spi.entry.AttributeBindingCodecSerializer; +import org.opendaylight.protocol.bgp.rib.spi.policy.BGPRibRoutingPolicy; +import org.opendaylight.protocol.bgp.rib.spi.policy.BGPRouteEntryImportParameters; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev171207.path.attributes.Attributes; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev171207.PeerId; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev171207.PeerRole; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev171207.bgp.rib.rib.peer.AdjRibIn; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev171207.bgp.rib.rib.peer.EffectiveRibIn; @@ -46,7 +52,6 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdent import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodes; import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate; import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidateNode; import org.opendaylight.yangtools.yang.data.api.schema.tree.ModificationType; @@ -78,21 +83,29 @@ final class EffectiveRibInWriter implements PrefixesReceivedCounters, PrefixesIn private final DOMTransactionChain chain; private final Map prefixesReceived; private final Map prefixesInstalled; - - AdjInTracker(final DOMDataTreeChangeService service, final RIBSupportContextRegistry registry, - final DOMTransactionChain chain, final YangInstanceIdentifier peerIId, + private final BGPRibRoutingPolicy ribPolicies; + private final BGPPeerTracker peerTracker; + private final AttributeBindingCodecSerializer attBindingCodecSerializer; + private final PeerId peerId; + + AdjInTracker(final RIB rib, + final DOMTransactionChain chain, + final YangInstanceIdentifier peerIId, @Nonnull final Set tables) { - this.registry = requireNonNull(registry); + this.registry = requireNonNull(rib.getRibSupportContext()); this.chain = requireNonNull(chain); this.peerIId = requireNonNull(peerIId); this.effRibTables = this.peerIId.node(EffectiveRibIn.QNAME).node(Tables.QNAME); this.prefixesInstalled = buildPrefixesTables(tables); this.prefixesReceived = buildPrefixesTables(tables); - + this.ribPolicies = requireNonNull(rib.getRibPolicies()); + this.peerTracker = requireNonNull(rib.getPeerTracker()); + this.attBindingCodecSerializer = rib; + this.peerId = IdentifierUtils.peerId((NodeIdentifierWithPredicates) peerIId.getLastPathArgument()); final DOMDataTreeIdentifier treeId = new DOMDataTreeIdentifier(LogicalDatastoreType.OPERATIONAL, this.peerIId.node(AdjRibIn.QNAME).node(Tables.QNAME)); LOG.debug("Registered Effective RIB on {}", this.peerIId); - this.reg = service.registerDataTreeChangeListener(treeId, this); + this.reg = requireNonNull(rib.getService()).registerDataTreeChangeListener(treeId, this); } private Map buildPrefixesTables(final Set tables) { @@ -119,22 +132,38 @@ final class EffectiveRibInWriter implements PrefixesReceivedCounters, PrefixesIn case APPEARED: case SUBTREE_MODIFIED: case WRITE: - tx.put(LogicalDatastoreType.OPERATIONAL, routeId, route.getDataAfter().get()); + final NormalizedNode advRoute = route.getDataAfter().get(); + tx.put(LogicalDatastoreType.OPERATIONAL, routeId, advRoute); CountersUtil.increment(this.prefixesReceived.get(tablesKey), tablesKey); // Lookup per-table attributes from RIBSupport - final ContainerNode advertisedAttrs = (ContainerNode) NormalizedNodes.findNode(route.getDataAfter(), ribSupport.routeAttributesIdentifier()).orElse(null); - final ContainerNode effectiveAttrs; - if (advertisedAttrs != null) { - effectiveAttrs = policy.effectiveAttributes(advertisedAttrs); + final NodeIdentifierWithPredicates routeIdentifier = ribSupport + .createRouteKeyPathArgument((NodeIdentifierWithPredicates) route.getIdentifier()); + Optional advertisedAttrs = this.attBindingCodecSerializer + .getAttributes(ribSupport, routeIdentifier, advRoute); + + final Optional effectiveAttrs; + if (advertisedAttrs.isPresent()) { + final PeerRole peerRole = this.peerTracker.getRole(this.peerId); + final BGPRouteEntryImportParameters ribPolicyParameters = + new BGPRouteEntryImportParametersImpl( + (NodeIdentifierWithPredicates) route.getIdentifier(), this.peerId, peerRole); + effectiveAttrs = this.ribPolicies + .applyImportPolicies(ribPolicyParameters, advertisedAttrs.get()); + LOG.debug("Route {} effective attributes {} towards {}", route.getIdentifier(), effectiveAttrs, + routeId); + } else { - effectiveAttrs = null; + effectiveAttrs = Optional.empty(); } LOG.debug("Route {} effective attributes {} towards {}", route.getIdentifier(), effectiveAttrs, routeId); - if (effectiveAttrs != null) { - tx.put(LogicalDatastoreType.OPERATIONAL, routeId.node(ribSupport.routeAttributesIdentifier()), effectiveAttrs); + final Optional normEffAtt = this.attBindingCodecSerializer + .toNormalizedNodeAttribute(ribSupport, routeIdentifier, effectiveAttrs); + if (normEffAtt.isPresent()) { + tx.put(LogicalDatastoreType.OPERATIONAL, + routeId.node(ribSupport.routeAttributesIdentifier()), normEffAtt.get()); if (route.getModificationType() == ModificationType.WRITE) { CountersUtil.increment(this.prefixesInstalled.get(tablesKey), tablesKey); } @@ -334,26 +363,20 @@ final class EffectiveRibInWriter implements PrefixesReceivedCounters, PrefixesIn private final AdjInTracker adjInTracker; private final AbstractImportPolicy importPolicy; - static EffectiveRibInWriter create(@Nonnull final DOMDataTreeChangeService service, + static EffectiveRibInWriter create(@Nonnull final RIB rib, @Nonnull final DOMTransactionChain chain, @Nonnull final YangInstanceIdentifier peerIId, @Nonnull final ImportPolicyPeerTracker importPolicyPeerTracker, - @Nonnull final RIBSupportContextRegistry registry, final PeerRole peerRole, @Nonnull final Set tables) { - return new EffectiveRibInWriter(service, chain, peerIId, importPolicyPeerTracker, registry, peerRole, tables); + return new EffectiveRibInWriter(rib, chain, peerIId, importPolicyPeerTracker, peerRole, tables); } - private EffectiveRibInWriter(final DOMDataTreeChangeService service, - final DOMTransactionChain chain, - final YangInstanceIdentifier peerIId, - final ImportPolicyPeerTracker importPolicyPeerTracker, - final RIBSupportContextRegistry registry, - final PeerRole peerRole, - @Nonnull final Set tables) { + private EffectiveRibInWriter(final RIB rib, final DOMTransactionChain chain, final YangInstanceIdentifier peerIId, + final ImportPolicyPeerTracker importPolicyPeerTracker, final PeerRole peerRole, @Nonnull final Set tables) { importPolicyPeerTracker.peerRoleChanged(peerIId, peerRole); this.importPolicy = importPolicyPeerTracker.policyFor(IdentifierUtils.peerId((NodeIdentifierWithPredicates) peerIId.getLastPathArgument())); - this.adjInTracker = new AdjInTracker(service, registry, chain, peerIId, tables); + this.adjInTracker = new AdjInTracker(rib, chain, peerIId, tables); } @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 637f3baf5b..038b217f6b 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 @@ -35,6 +35,7 @@ import org.opendaylight.controller.md.sal.dom.api.DOMDataBrokerExtension; 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.binding.dom.codec.api.BindingNormalizedNodeSerializer; import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration; import org.opendaylight.protocol.bgp.mode.api.PathSelectionMode; import org.opendaylight.protocol.bgp.mode.impl.base.BasePathSelectionModeFactory; @@ -50,6 +51,7 @@ import org.opendaylight.protocol.bgp.rib.spi.ExportPolicyPeerTracker; import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionConsumerContext; import org.opendaylight.protocol.bgp.rib.spi.RIBSupport; import org.opendaylight.protocol.bgp.rib.spi.RibSupportUtils; +import org.opendaylight.protocol.bgp.rib.spi.policy.BGPRibRoutingPolicy; 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.message.rev171207.path.attributes.Attributes; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev171207.BgpTableType; @@ -97,6 +99,7 @@ public final class RIBImpl extends BGPRIBStateImpl implements RIB, TransactionCh private final DOMDataBroker domDataBroker; private final RIBExtensionConsumerContext extensions; private final YangInstanceIdentifier yangRibId; + private final YangInstanceIdentifier yangTables; private final RIBSupportContextRegistryImpl ribContextRegistry; private final CodecsRegistryImpl codecsRegistry; @GuardedBy("this") @@ -107,7 +110,10 @@ public final class RIBImpl extends BGPRIBStateImpl implements RIB, TransactionCh private final ImportPolicyPeerTracker importPolicyPeerTracker; private final RibId ribId; private final BGPPeerTracker peerTracker; + private final BGPRibRoutingPolicy ribPolicies; private final Map exportPolicyPeerTrackerMap; + private final BindingNormalizedNodeSerializer bindingSerializer; + @GuardedBy("this") private DOMTransactionChain domChain; @GuardedBy("this") @@ -121,9 +127,12 @@ public final class RIBImpl extends BGPRIBStateImpl implements RIB, TransactionCh final BGPDispatcher dispatcher, final CodecsRegistryImpl codecsRegistry, final DOMDataBroker domDataBroker, + final BGPRibRoutingPolicy ribPolicies, final BGPPeerTracker bgpPeerTracker, final List localTables, - @Nonnull final Map bestPathSelectionStrategies) { + final Map bestPathSelectionStrategies, + final BindingNormalizedNodeSerializer bindingSerializer + ) { super(InstanceIdentifier.create(BgpRib.class).child(Rib.class, new RibKey(requireNonNull(ribId))), localBgpId, localAs); this.localAs = requireNonNull(localAs); @@ -134,11 +143,13 @@ public final class RIBImpl extends BGPRIBStateImpl implements RIB, TransactionCh this.domDataBroker = requireNonNull(domDataBroker); this.service = this.domDataBroker.getSupportedExtensions().get(DOMDataTreeChangeService.class); this.extensions = requireNonNull(extensions); + this.ribPolicies = requireNonNull(ribPolicies); this.peerTracker = requireNonNull(bgpPeerTracker); this.codecsRegistry = codecsRegistry; this.ribContextRegistry = RIBSupportContextRegistryImpl.create(extensions, this.codecsRegistry); final InstanceIdentifierBuilder yangRibIdBuilder = YangInstanceIdentifier.builder().node(BgpRib.QNAME).node(Rib.QNAME); this.yangRibId = yangRibIdBuilder.nodeWithKey(Rib.QNAME, RIB_ID_QNAME, ribId.getValue()).build(); + this.yangTables = this.yangRibId.node(LocRib.QNAME).node(Tables.QNAME); this.bestPathSelectionStrategies = requireNonNull(bestPathSelectionStrategies); final ClusterIdentifier cId = clusterId == null ? new ClusterIdentifier(localBgpId) : clusterId; this.ribId = ribId; @@ -152,6 +163,7 @@ public final class RIBImpl extends BGPRIBStateImpl implements RIB, TransactionCh exportPolicies.put(key, new ExportPolicyPeerTrackerImpl(policyDatabase, key)); } this.exportPolicyPeerTrackerMap = exportPolicies.build(); + this.bindingSerializer = requireNonNull(bindingSerializer); } private synchronized void startLocRib(final TablesKey key) { @@ -266,6 +278,11 @@ public final class RIBImpl extends BGPRIBStateImpl implements RIB, TransactionCh return this.localTablesKeys.contains(tableKey); } + @Override + public BGPRibRoutingPolicy getRibPolicies() { + return this.ribPolicies; + } + @Override public BGPPeerTracker getPeerTracker() { return this.peerTracker; @@ -381,7 +398,10 @@ public final class RIBImpl extends BGPRIBStateImpl implements RIB, TransactionCh if (!attributes.isPresent()) { return Optional.empty(); } - return Optional.empty(); + final InstanceIdentifier yii + = (InstanceIdentifier) this.bindingSerializer + .fromYangInstanceIdentifier(ribSupport.buildRouteAttributeYii(this.yangTables, routeIdentifier)); + return Optional.of((ContainerNode) this.bindingSerializer.toNormalizedNode(yii, attributes.get()).getValue()); } @Override @@ -395,6 +415,8 @@ public final class RIBImpl extends BGPRIBStateImpl implements RIB, TransactionCh return Optional.empty(); } - return Optional.empty(); + return Optional.ofNullable((Attributes) this.bindingSerializer + .fromNormalizedNode(ribSupport.buildRouteAttributeYii(this.yangTables, routeIdentifier), + advertisedAttrs).getValue()); } } diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBSupportContextRegistryImpl.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBSupportContextRegistryImpl.java index 84ed7f8086..7e3ef252f3 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBSupportContextRegistryImpl.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBSupportContextRegistryImpl.java @@ -46,10 +46,19 @@ final class RIBSupportContextRegistryImpl implements RIBSupportContextRegistry { return new RIBSupportContextImpl(support, this.codecs); } + @Override + public RIBSupport getRIBSupport(final TablesKey key) { + final RIBSupportContext ribSupport = getRIBSupportContext(key); + if (ribSupport != null) { + return ribSupport.getRibSupport(); + } + return null; + } + @Override public RIBSupportContext getRIBSupportContext(final TablesKey key) { final RIBSupport ribSupport = this.extensionContext.getRIBSupport(key); - if(ribSupport != null) { + if (ribSupport != null) { return this.contexts.getUnchecked(ribSupport); } return null; @@ -58,7 +67,7 @@ final class RIBSupportContextRegistryImpl implements RIBSupportContextRegistry { @Override public RIBSupportContext getRIBSupportContext(final NodeIdentifierWithPredicates key) { final RIBSupport ribSupport = this.extensionContext.getRIBSupport(key); - if(ribSupport != null) { + if (ribSupport != null) { return this.contexts.getUnchecked(ribSupport); } return null; diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/RibImpl.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/RibImpl.java index f6eccdc545..fe2bd8aba8 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/RibImpl.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/RibImpl.java @@ -25,8 +25,10 @@ import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker; import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeService; import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain; import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeFactory; +import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer; import org.opendaylight.mdsal.dom.api.DOMSchemaService; import org.opendaylight.protocol.bgp.mode.api.PathSelectionMode; +import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.BGPRibRoutingPolicyFactory; import org.opendaylight.protocol.bgp.openconfig.spi.BGPTableTypeRegistryConsumer; import org.opendaylight.protocol.bgp.rib.impl.BGPPeerTrackerImpl; import org.opendaylight.protocol.bgp.rib.impl.CodecsRegistryImpl; @@ -40,6 +42,7 @@ import org.opendaylight.protocol.bgp.rib.spi.BGPPeerTracker; import org.opendaylight.protocol.bgp.rib.spi.ExportPolicyPeerTracker; import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionConsumerContext; import org.opendaylight.protocol.bgp.rib.spi.RIBSupport; +import org.opendaylight.protocol.bgp.rib.spi.policy.BGPRibRoutingPolicy; import org.opendaylight.protocol.bgp.rib.spi.state.BGPRIBState; import org.opendaylight.protocol.bgp.rib.spi.state.BGPRIBStateConsumer; import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafi; @@ -75,6 +78,8 @@ public final class RibImpl implements RIB, BGPRIBStateConsumer, AutoCloseable { private final BindingCodecTreeFactory codecTreeFactory; private final DOMDataBroker domBroker; private final DOMSchemaService domSchemaService; + private final BGPRibRoutingPolicyFactory policyProvider; + private final BindingNormalizedNodeSerializer bindingSerializer; private RIBImpl ribImpl; private ServiceRegistration serviceRegistration; private ListenerRegistration schemaContextRegistration; @@ -84,14 +89,22 @@ public final class RibImpl implements RIB, BGPRIBStateConsumer, AutoCloseable { private ClusterIdentifier clusterId; - public RibImpl(final RIBExtensionConsumerContext contextProvider, final BGPDispatcher dispatcher, - final BindingCodecTreeFactory codecTreeFactory, final DOMDataBroker domBroker, - final DOMSchemaService domSchemaService) { + public RibImpl( + final RIBExtensionConsumerContext contextProvider, + final BGPDispatcher dispatcher, + final BGPRibRoutingPolicyFactory policyProvider, + final BindingCodecTreeFactory codecTreeFactory, + final DOMDataBroker domBroker, + final DOMSchemaService domSchemaService, + final BindingNormalizedNodeSerializer bindingSerializer + ) { this.extensions = contextProvider; this.dispatcher = dispatcher; this.codecTreeFactory = codecTreeFactory; this.domBroker = domBroker; this.domSchemaService = domSchemaService; + this.policyProvider = policyProvider; + this.bindingSerializer = bindingSerializer; } void start(final Global global, final String instanceName, final BGPTableTypeRegistryConsumer tableTypeRegistry) { @@ -223,6 +236,11 @@ public final class RibImpl implements RIB, BGPRIBStateConsumer, AutoCloseable { return this.ribImpl.supportsTable(tableKey); } + @Override + public BGPRibRoutingPolicy getRibPolicies() { + return this.ribImpl.getRibPolicies(); + } + @Override public BGPPeerTracker getPeerTracker() { return this.ribImpl.getPeerTracker(); @@ -242,7 +260,6 @@ public final class RibImpl implements RIB, BGPRIBStateConsumer, AutoCloseable { this.asNumber = globalConfig.getAs(); this.routerId = globalConfig.getRouterId(); this.clusterId = getClusterIdentifier(globalConfig); - final BGPPeerTrackerImpl peerTracker = new BGPPeerTrackerImpl(); final Map pathSelectionModes = OpenConfigMappingUtil .toPathSelectionMode(this.afiSafi, tableTypeRegistry, peerTracker).entrySet() @@ -250,6 +267,8 @@ public final class RibImpl implements RIB, BGPRIBStateConsumer, AutoCloseable { .collect(Collectors.toMap(entry -> new TablesKey(entry.getKey().getAfi(), entry.getKey().getSafi()), Map.Entry::getValue)); + final BGPRibRoutingPolicy ribPolicy = this.policyProvider.buildBGPRibPolicy(this.asNumber.getValue(), + this.routerId, this.clusterId, RoutingPolicyUtil.getApplyPolicy(global.getApplyPolicy())); final CodecsRegistryImpl codecsRegistry = CodecsRegistryImpl.create(codecTreeFactory, this.extensions.getClassLoadingStrategy()); @@ -262,9 +281,11 @@ public final class RibImpl implements RIB, BGPRIBStateConsumer, AutoCloseable { this.dispatcher, codecsRegistry, this.domBroker, + ribPolicy, peerTracker, toTableTypes(this.afiSafi, tableTypeRegistry), - pathSelectionModes); + pathSelectionModes, + this.bindingSerializer); } @Override diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/RoutingPolicyUtil.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/RoutingPolicyUtil.java new file mode 100644 index 0000000000..e92358fc59 --- /dev/null +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/RoutingPolicyUtil.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018 AT&T Intellectual Property. 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.opendaylight.yang.gen.v1.http.openconfig.net.yang.routing.policy.rev151009.DefaultPolicyType.ACCEPTROUTE; + +import java.util.Collections; +import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.routing.policy.rev151009.apply.policy.group.ApplyPolicy; +import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.routing.policy.rev151009.apply.policy.group.apply.policy.Config; +import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.routing.policy.rev151009.apply.policy.group.apply.policy.ConfigBuilder; + +public final class RoutingPolicyUtil { + + private static final Config DEFAULT_POLICY = new ConfigBuilder().setDefaultImportPolicy(ACCEPTROUTE) + .setDefaultExportPolicy(ACCEPTROUTE).setImportPolicy(Collections.emptyList()) + .setExportPolicy(Collections.emptyList()).build(); + + private RoutingPolicyUtil() { + throw new UnsupportedOperationException(); + } + + public static Config getApplyPolicy(final ApplyPolicy applyPolicy) { + if (applyPolicy == null) { + return DEFAULT_POLICY; + } + return applyPolicy.getConfig(); + } +} diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/spi/RIB.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/spi/RIB.java index ceb3270469..3282d462d1 100755 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/spi/RIB.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/spi/RIB.java @@ -17,6 +17,7 @@ import org.opendaylight.protocol.bgp.rib.spi.BGPPeerTracker; import org.opendaylight.protocol.bgp.rib.spi.ExportPolicyPeerTracker; import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionConsumerContext; import org.opendaylight.protocol.bgp.rib.spi.entry.AttributeBindingCodecSerializer; +import org.opendaylight.protocol.bgp.rib.spi.policy.BGPRibRoutingPolicy; 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.multiprotocol.rev171207.BgpTableType; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev171207.rib.TablesKey; @@ -110,6 +111,13 @@ public interface RIB extends AttributeBindingCodecSerializer, RibReference { Set getLocalTablesKeys(); + /** + * Return Policies Container. + * + * @return policies + */ + BGPRibRoutingPolicy getRibPolicies(); + /** * Returns peer tracker for the rib. * diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/spi/RIBSupportContextRegistry.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/spi/RIBSupportContextRegistry.java index d120f8b57a..eb7e871a9d 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/spi/RIBSupportContextRegistry.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/spi/RIBSupportContextRegistry.java @@ -8,24 +8,39 @@ package org.opendaylight.protocol.bgp.rib.impl.spi; import javax.annotation.Nullable; +import org.opendaylight.protocol.bgp.rib.spi.RIBSupport; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev171207.rib.TablesKey; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates; public interface RIBSupportContextRegistry { + /** + * Acquire a RIB Support for a AFI/SAFI combination. + * + * @param key AFI/SAFI key + * @return RIBSupport instance, or null if the AFI/SAFI is + * not implemented. + */ + @Nullable + RIBSupport getRIBSupport(TablesKey key); + /** * Acquire a RIB Support Context for a AFI/SAFI combination. + * * @param key AFI/SAFI key * @return RIBSupport instance, or null if the AFI/SAFI is - * not implemented. - */ - @Nullable RIBSupportContext getRIBSupportContext(TablesKey key); + * not implemented. + */ + @Nullable + RIBSupportContext getRIBSupportContext(TablesKey key); /** * Acquire a RIB Support Context for a AFI/SAFI combination. + * * @param key Tables key with AFI/SAFI key * @return RIBSupport instance, or null if the AFI/SAFI is - * not implemented. - */ - @Nullable RIBSupportContext getRIBSupportContext(NodeIdentifierWithPredicates key); + * not implemented. + */ + @Nullable + RIBSupportContext getRIBSupportContext(NodeIdentifierWithPredicates key); } diff --git a/bgp/rib-impl/src/main/resources/org/opendaylight/blueprint/bgp-rib.xml b/bgp/rib-impl/src/main/resources/org/opendaylight/blueprint/bgp-rib.xml index 6047545cd6..fc2cb66789 100644 --- a/bgp/rib-impl/src/main/resources/org/opendaylight/blueprint/bgp-rib.xml +++ b/bgp/rib-impl/src/main/resources/org/opendaylight/blueprint/bgp-rib.xml @@ -50,12 +50,16 @@ + + + + diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/AbstractAddPathTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/AbstractAddPathTest.java index 4f603808fa..950b30042f 100644 --- a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/AbstractAddPathTest.java +++ b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/AbstractAddPathTest.java @@ -30,8 +30,6 @@ import org.junit.Assert; import org.junit.Before; import org.mockito.Mock; import org.mockito.Mockito; -import org.mockito.MockitoAnnotations; -import org.opendaylight.controller.md.sal.binding.test.AbstractConcurrentDataBrokerTest; import org.opendaylight.mdsal.binding.dom.adapter.BindingToNormalizedNodeCodec; import org.opendaylight.mdsal.binding.dom.codec.gen.impl.StreamWriterGenerator; import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry; @@ -110,7 +108,7 @@ import org.opendaylight.yangtools.yang.binding.Notification; import org.opendaylight.yangtools.yang.binding.util.BindingReflections; import org.opendaylight.yangtools.yang.model.api.SchemaContext; -public abstract class AbstractAddPathTest extends AbstractConcurrentDataBrokerTest { +public abstract class AbstractAddPathTest extends DefaultRibPoliciesMockTest { private static final int RETRY_TIMER = 10; static final String RIB_ID = "127.0.0.1"; static final BgpId BGP_ID = new BgpId(RIB_ID); @@ -120,7 +118,7 @@ public abstract class AbstractAddPathTest extends AbstractConcurrentDataBrokerTe static final Ipv4Address PEER4 = new Ipv4Address("127.0.0.5"); static final Ipv4Address PEER5 = new Ipv4Address("127.0.0.6"); static final Ipv4Address PEER6 = new Ipv4Address("127.0.0.7"); - static final AsNumber AS_NUMBER = new AsNumber(72L); + static final AsNumber AS_NUMBER = new AsNumber(AS); static final int PORT = InetSocketAddressUtil.getRandomPort(); static final Ipv4Prefix PREFIX1 = new Ipv4Prefix("1.1.1.1/32"); private static final ClusterIdentifier CLUSTER_ID = new ClusterIdentifier(RIB_ID); @@ -157,7 +155,7 @@ public abstract class AbstractAddPathTest extends AbstractConcurrentDataBrokerTe @Before public void setUp() throws Exception { - MockitoAnnotations.initMocks(this); + super.setUp(); this.ribActivator = new RIBActivator(); this.ribExtension = new SimpleRIBExtensionProviderContext(); diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/AbstractRIBTestSetup.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/AbstractRIBTestSetup.java index 03fc23604d..1dd972e662 100644 --- a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/AbstractRIBTestSetup.java +++ b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/AbstractRIBTestSetup.java @@ -95,12 +95,10 @@ import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder; import org.opendaylight.yangtools.yang.model.api.SchemaContext; -public class AbstractRIBTestSetup { +public class AbstractRIBTestSetup extends DefaultRibPoliciesMockTest { protected static final Class AFI = Ipv4AddressFamily.class; protected static final Class SAFI = UnicastSubsequentAddressFamily.class; - protected static final QName AFI_QNAME = BindingReflections.findQName(AFI).intern(); - protected static final QName SAFI_QNAME = BindingReflections.findQName(SAFI).intern(); protected static final TablesKey KEY = new TablesKey(AFI, SAFI); protected static final QName PREFIX_QNAME = QName.create(Ipv4Route.QNAME, "prefix").intern(); private static final ClusterIdentifier CLUSTER_ID = new ClusterIdentifier("128.0.0.1"); @@ -162,6 +160,7 @@ public class AbstractRIBTestSetup { @Before public void setUp() throws Exception { + super.setUp(); mockRib(); } @@ -183,9 +182,11 @@ public class AbstractRIBTestSetup { doReturn(mock(ClusterSingletonServiceRegistration.class)).when(this.clusterSingletonServiceProvider) .registerClusterSingletonService(any(ClusterSingletonService.class)); this.rib = new RIBImpl(new RibId("test"), new AsNumber(5L), RIB_ID, CLUSTER_ID, context, - this.dispatcher, codecsRegistry, this.dom, this.peerTracker, localTables, + this.dispatcher, codecsRegistry, this.dom, this.policies, this.peerTracker, localTables, Collections.singletonMap(new TablesKey(AFI, SAFI), - BasePathSelectionModeFactory.createBestPathSelectionStrategy(this.peerTracker))); + BasePathSelectionModeFactory.createBestPathSelectionStrategy(this.peerTracker)), + this.mappingService + ); this.rib.onGlobalContextUpdated(schemaContext); this.ribSupport = getRib().getRibSupportContext().getRIBSupportContext(KEY).getRibSupport(); } diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/AddPathAllPathsTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/AddPathAllPathsTest.java index a4173326f0..234f407e27 100644 --- a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/AddPathAllPathsTest.java +++ b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/AddPathAllPathsTest.java @@ -57,7 +57,7 @@ public class AddPathAllPathsTest extends AbstractAddPathTest { this.ribImpl = new RIBImpl(new RibId("test-rib"), AS_NUMBER, BGP_ID, null, this.ribExtension, this.serverDispatcher, this.codecsRegistry, - getDomBroker(), this.peerTracker, TABLES_TYPE, pathTables); + getDomBroker(), this.policies, this.peerTracker, TABLES_TYPE, pathTables, this.mappingService); this.ribImpl.instantiateServiceInstance(); this.ribImpl.onGlobalContextUpdated(this.schemaContext); diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/AddPathBasePathsTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/AddPathBasePathsTest.java index 15ffd7e1b9..3a31761d0e 100644 --- a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/AddPathBasePathsTest.java +++ b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/AddPathBasePathsTest.java @@ -44,8 +44,8 @@ public class AddPathBasePathsTest extends AbstractAddPathTest { this.ribImpl = new RIBImpl(new RibId("test-rib"), AS_NUMBER, new BgpId(RIB_ID), null, this.ribExtension, this.serverDispatcher, - this.codecsRegistry, getDomBroker(), this.peerTracker, TABLES_TYPE, pathTables - ); + this.codecsRegistry, getDomBroker(), this.policies, this.peerTracker, TABLES_TYPE, pathTables, + this.mappingService); this.ribImpl.instantiateServiceInstance(); this.ribImpl.onGlobalContextUpdated(this.schemaContext); final ChannelFuture channelFuture = this.serverDispatcher.createServer(new InetSocketAddress(RIB_ID, PORT)); diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/AddPathNPathsTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/AddPathNPathsTest.java index 5bff0fcc52..c87ac6e4ae 100644 --- a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/AddPathNPathsTest.java +++ b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/AddPathNPathsTest.java @@ -44,7 +44,7 @@ public class AddPathNPathsTest extends AbstractAddPathTest { this.ribImpl = new RIBImpl(new RibId("test-rib"), AS_NUMBER, new BgpId(RIB_ID), null, this.ribExtension, this.serverDispatcher, - this.codecsRegistry, getDomBroker(), this.peerTracker, TABLES_TYPE, pathTables); + this.codecsRegistry, getDomBroker(), this.policies, this.peerTracker, TABLES_TYPE, pathTables, this.mappingService); this.ribImpl.instantiateServiceInstance(); this.ribImpl.onGlobalContextUpdated(this.schemaContext); diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/DefaultRibPoliciesMockTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/DefaultRibPoliciesMockTest.java new file mode 100644 index 0000000000..049da689e2 --- /dev/null +++ b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/DefaultRibPoliciesMockTest.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2018 AT&T Intellectual Property. 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.mockito.Mockito.doReturn; + +import java.util.Collections; +import org.junit.Before; +import org.mockito.Mock; +import org.opendaylight.protocol.bgp.openconfig.routing.policy.impl.BGPRibRoutingPolicyFactoryImpl; +import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.BGPRibRoutingPolicyFactory; +import org.opendaylight.protocol.bgp.openconfig.routing.policy.statement.AbstractStatementRegistryConsumerTest; +import org.opendaylight.protocol.bgp.rib.spi.policy.BGPRibRoutingPolicy; +import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.routing.policy.rev151009.DefaultPolicyType; +import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.routing.policy.rev151009.apply.policy.group.apply.policy.Config; +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.types.rev130919.BgpId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.ClusterIdentifier; + +public class DefaultRibPoliciesMockTest extends AbstractStatementRegistryConsumerTest { + protected static final long AS = 64496; + private final Ipv4Address bgpID = new BgpId(new Ipv4Address("127.0.0.1")); + private final ClusterIdentifier ci = new ClusterIdentifier(new Ipv4Address("127.0.0.1")); + protected BGPRibRoutingPolicy policies; + protected BGPRibRoutingPolicyFactory policyProvider; + @Mock + private Config config; + + @Before + public void setUp() throws Exception { + super.setUp(); + doReturn(DefaultPolicyType.REJECTROUTE).when(this.config).getDefaultImportPolicy(); + doReturn(DefaultPolicyType.REJECTROUTE).when(this.config).getDefaultExportPolicy(); + doReturn(Collections.singletonList("default-odl-import-policy")).when(this.config).getImportPolicy(); + doReturn(Collections.singletonList("default-odl-export-policy")).when(this.config).getExportPolicy(); + + this.policyProvider = new BGPRibRoutingPolicyFactoryImpl(getDataBroker(), this.statementRegistry); + this.policies = this.policyProvider.buildBGPRibPolicy(AS, this.bgpID, this.ci, this.config); + } +} diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/ParserToSalTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/ParserToSalTest.java index 2bc8de4c6c..e3596a3504 100755 --- a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/ParserToSalTest.java +++ b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/ParserToSalTest.java @@ -22,19 +22,13 @@ import java.net.InetSocketAddress; import java.util.Collection; import java.util.Collections; import java.util.List; -import java.util.concurrent.ExecutionException; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.mockito.Mockito; -import org.mockito.MockitoAnnotations; -import org.opendaylight.controller.md.sal.binding.test.AbstractConcurrentDataBrokerTest; -import org.opendaylight.controller.md.sal.binding.test.AbstractDataBrokerTestCustomizer; import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException; -import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeFactory; import org.opendaylight.mdsal.binding.generator.impl.GeneratedClassLoadingStrategy; -import org.opendaylight.mdsal.dom.api.DOMSchemaService; import org.opendaylight.protocol.bgp.inet.RIBActivator; import org.opendaylight.protocol.bgp.mode.impl.base.BasePathSelectionModeFactory; import org.opendaylight.protocol.bgp.parser.BgpTableTypeImpl; @@ -49,11 +43,8 @@ import org.opendaylight.protocol.bgp.util.HexDumpBGPFileParser; import org.opendaylight.protocol.concepts.KeyMapping; 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.opendaylight.params.xml.ns.yang.bgp.inet.rev171207.ipv4.routes.ipv4.routes.Ipv4Route; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev171207.ipv6.routes.ipv6.routes.Ipv6Route; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev171207.LinkstateAddressFamily; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev171207.LinkstateSubsequentAddressFamily; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev171207.linkstate.routes.linkstate.routes.LinkstateRoute; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev171207.BgpTableType; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev171207.BgpRib; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev171207.PeerRole; @@ -65,10 +56,8 @@ 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.UnicastSubsequentAddressFamily; import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import org.opendaylight.yangtools.yang.binding.YangModuleInfo; -import org.opendaylight.yangtools.yang.binding.util.BindingReflections; -public class ParserToSalTest extends AbstractConcurrentDataBrokerTest { +public class ParserToSalTest extends DefaultRibPoliciesMockTest { private static final String TEST_RIB_ID = "testRib"; private static final TablesKey TABLE_KEY = new TablesKey(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class); @@ -80,16 +69,12 @@ public class ParserToSalTest extends AbstractConcurrentDataBrokerTest { @Mock private BGPDispatcher dispatcher; - private BindingCodecTreeFactory codecFactory; - - private DOMSchemaService schemaService; private BGPPeerTracker peerTracker = new BGPPeerTrackerImpl(); private CodecsRegistryImpl codecsRegistry; @Before public void setUp() throws Exception { - super.setup(); - MockitoAnnotations.initMocks(this); + super.setUp(); final String hexMessages = "/bgp_hex.txt"; final List bgpMessages = HexDumpBGPFileParser .parseMessages(ParserToSalTest.class.getResourceAsStream(hexMessages)); @@ -107,26 +92,10 @@ public class ParserToSalTest extends AbstractConcurrentDataBrokerTest { this.baseact.startRIBExtensionProvider(this.ext1); this.lsact.startRIBExtensionProvider(this.ext2); - this.codecsRegistry = CodecsRegistryImpl.create(this.codecFactory, + this.codecsRegistry = CodecsRegistryImpl.create(this.bindingCodecTreeFactory, GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy()); } - @Override - protected Iterable getModuleInfos() throws Exception { - return ImmutableList.of( - BindingReflections.getModuleInfo(Ipv4Route.class), - BindingReflections.getModuleInfo(Ipv6Route.class), - BindingReflections.getModuleInfo(LinkstateRoute.class)); - } - - @Override - protected AbstractDataBrokerTestCustomizer createDataBrokerTestCustomizer() { - final AbstractDataBrokerTestCustomizer customizer = super.createDataBrokerTestCustomizer(); - this.codecFactory = customizer.getBindingToNormalized(); - this.schemaService = customizer.getSchemaService(); - return customizer; - } - @After public void tearDown() { this.lsact.close(); @@ -134,15 +103,15 @@ public class ParserToSalTest extends AbstractConcurrentDataBrokerTest { } @Test - public void testWithLinkstate() throws InterruptedException, ExecutionException, ReadFailedException { + public void testWithLinkstate() throws ReadFailedException { final List tables = ImmutableList.of(new BgpTableTypeImpl(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class)); final RIBImpl rib = new RIBImpl(new RibId(TEST_RIB_ID), AS_NUMBER, new BgpId("127.0.0.1"), null, this.ext2, this.dispatcher, - this.codecsRegistry, getDomBroker(),this.peerTracker, tables, + this.codecsRegistry, getDomBroker(), this.policies, this.peerTracker, tables, Collections.singletonMap(TABLE_KEY, BasePathSelectionModeFactory - .createBestPathSelectionStrategy(this.peerTracker))); + .createBestPathSelectionStrategy(this.peerTracker)), this.mappingService); rib.instantiateServiceInstance(); assertTablesExists(tables); rib.onGlobalContextUpdated(this.schemaService.getGlobalContext()); @@ -154,14 +123,14 @@ public class ParserToSalTest extends AbstractConcurrentDataBrokerTest { } @Test - public void testWithoutLinkstate() throws InterruptedException, ExecutionException, ReadFailedException { + public void testWithoutLinkstate() throws ReadFailedException { final List tables = ImmutableList.of(new BgpTableTypeImpl(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class)); final RIBImpl rib = new RIBImpl(new RibId(TEST_RIB_ID), AS_NUMBER, BGP_ID, null, this.ext1, this.dispatcher, this.codecsRegistry, getDomBroker(), - this.peerTracker, tables, + this.policies, this.peerTracker, tables, Collections.singletonMap(TABLE_KEY, BasePathSelectionModeFactory - .createBestPathSelectionStrategy(this.peerTracker))); + .createBestPathSelectionStrategy(this.peerTracker)), this.mappingService); rib.instantiateServiceInstance(); rib.onGlobalContextUpdated(this.schemaService.getGlobalContext()); assertTablesExists(tables); @@ -182,8 +151,7 @@ public class ParserToSalTest extends AbstractConcurrentDataBrokerTest { }); } - private void assertTablesExists(final List expectedTables) - throws InterruptedException, ExecutionException, ReadFailedException { + private void assertTablesExists(final List expectedTables) throws ReadFailedException { readDataOperational(getDataBroker(), BGP_IID, bgpRib -> { final List tables = bgpRib.getRib().get(0).getLocRib().getTables(); assertFalse(tables.isEmpty()); diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/SynchronizationAndExceptionTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/SynchronizationAndExceptionTest.java index 0cc82b6b17..92cff2a112 100644 --- a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/SynchronizationAndExceptionTest.java +++ b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/SynchronizationAndExceptionTest.java @@ -204,12 +204,13 @@ public class SynchronizationAndExceptionTest extends AbstractAddPathTest { } @Test - public void testHandleMessageAfterException() throws InterruptedException { + public void testHandleMessageAfterException() { final Map pathTables = ImmutableMap.of(TABLES_KEY, BasePathSelectionModeFactory.createBestPathSelectionStrategy(this.peerTracker)); final RIBImpl ribImpl = new RIBImpl( new RibId(RIB_ID), AS_NUMBER, new BgpId(RIB_ID), null, this.ribExtension, this.serverDispatcher, this.codecsRegistry, - this.domBroker, this.peerTracker, ImmutableList.of(this.ipv4tt), pathTables); + this.domBroker, this.policies, this.peerTracker, ImmutableList.of(this.ipv4tt), pathTables, + this.mappingService); ribImpl.instantiateServiceInstance(); ribImpl.onGlobalContextUpdated(this.schemaContext); @@ -252,12 +253,13 @@ public class SynchronizationAndExceptionTest extends AbstractAddPathTest { } @Test - public void testUseCase1() throws InterruptedException { + public void testUseCase1() { final Map pathTables = ImmutableMap.of(TABLES_KEY, BasePathSelectionModeFactory.createBestPathSelectionStrategy(this.peerTracker)); final RIBImpl ribImpl = new RIBImpl( new RibId(RIB_ID), AS_NUMBER, new BgpId(RIB_ID), null, this.ribExtension, this.serverDispatcher, this.codecsRegistry, - this.domBroker, this.peerTracker, ImmutableList.of(this.ipv4tt), pathTables); + this.domBroker, this.policies, this.peerTracker, ImmutableList.of(this.ipv4tt), pathTables, + this.mappingService); ribImpl.instantiateServiceInstance(); ribImpl.onGlobalContextUpdated(this.schemaContext); 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 index 3fef90d95d..c2695274dc 100644 --- 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 @@ -24,7 +24,6 @@ import java.util.concurrent.Executor; import org.junit.Before; import org.mockito.Mock; import org.mockito.Mockito; -import org.mockito.MockitoAnnotations; 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; @@ -33,6 +32,7 @@ import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain; import org.opendaylight.protocol.bgp.openconfig.spi.BGPTableTypeRegistryConsumer; import org.opendaylight.protocol.bgp.parser.BgpTableTypeImpl; import org.opendaylight.protocol.bgp.rib.impl.BGPPeerTrackerImpl; +import org.opendaylight.protocol.bgp.rib.impl.DefaultRibPoliciesMockTest; 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; @@ -62,9 +62,10 @@ 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 { - static final TablesKey TABLES_KEY = new TablesKey(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class); +class AbstractConfig extends DefaultRibPoliciesMockTest { protected static final AsNumber AS = new AsNumber(72L); + protected static final RibId RIB_ID = new RibId("test"); + static final TablesKey TABLES_KEY = new TablesKey(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class); @Mock protected RIB rib; @Mock @@ -87,12 +88,11 @@ class AbstractConfig { private ImportPolicyPeerTracker importPolicyPeerTracker; @Mock private DOMDataTreeChangeService dataTreeChangeService; - protected static final RibId RIB_ID = new RibId("test"); private BGPPeerTracker peerTracker = new BGPPeerTrackerImpl(); @Before public void setUp() throws Exception { - MockitoAnnotations.initMocks(this); + super.setUp(); doReturn(InstanceIdentifier.create(BgpRib.class).child(org.opendaylight.yang.gen.v1.urn.opendaylight .params.xml.ns.yang.bgp.rib.rev171207.bgp.rib.Rib.class, new RibKey(RIB_ID))).when(this.rib) .getInstanceIdentifier(); @@ -147,6 +147,7 @@ class AbstractConfig { doReturn("registry").when(this.bgpPeerRegistry).toString(); doNothing().when(this.listener).close(); doReturn(this.bgpPeerRegistry).when(this.dispatcher).getBGPPeerRegistry(); - doReturn(peerTracker).when(this.rib).getPeerTracker(); + doReturn(this.peerTracker).when(this.rib).getPeerTracker(); + doReturn(this.policies).when(this.rib).getRibPolicies(); } -} +} \ No newline at end of file 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 index bed3355531..c5efcc4b96 100644 --- 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 @@ -38,7 +38,7 @@ public class AppPeerTest extends AbstractConfig { } @Test - public void testAppPeer() throws Exception { + public void testAppPeer() { APP_PEER.start(this.rib, this.neighbor, this.tableTypeRegistry); Mockito.verify(this.rib).getYangRibId(); Mockito.verify(this.rib).getService(); @@ -46,7 +46,7 @@ public class AppPeerTest extends AbstractConfig { APP_PEER.instantiateServiceInstance(); Mockito.verify(this.rib, times(2)).getYangRibId(); - Mockito.verify(this.rib).getRibSupportContext(); + Mockito.verify(this.rib, times(2)).getRibSupportContext(); Mockito.verify(this.rib, times(2)).getLocalTablesKeys(); Mockito.verify(this.domTx).newWriteOnlyTransaction(); 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 index 8dd5d97612..5acfc5ae3a 100644 --- 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 @@ -8,46 +8,29 @@ 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.eq; +import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; 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.AbstractConfig.TABLES_KEY; -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.util.ArrayList; -import java.util.Collection; -import java.util.Collections; +import static org.opendaylight.protocol.bgp.rib.impl.config.RIBTestsUtil.createGlobalIpv4; +import static org.opendaylight.protocol.bgp.rib.impl.config.RIBTestsUtil.createGlobalIpv6; +import static org.opendaylight.protocol.bgp.rib.impl.config.RIBTestsUtil.createNeighbors; +import static org.opendaylight.protocol.bgp.rib.impl.config.RIBTestsUtil.createNeighborsNoRR; +import static org.opendaylight.protocol.util.CheckUtil.checkPresentConfiguration; + import java.util.Dictionary; import java.util.Optional; +import java.util.concurrent.ExecutionException; 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.mdsal.binding.dom.codec.api.BindingCodecTreeFactory; import org.opendaylight.mdsal.binding.generator.impl.GeneratedClassLoadingStrategy; @@ -56,43 +39,22 @@ import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvid import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration; import org.opendaylight.protocol.bgp.openconfig.spi.BGPTableTypeRegistryConsumer; import org.opendaylight.protocol.bgp.parser.BgpTableTypeImpl; +import org.opendaylight.protocol.bgp.rib.impl.DefaultRibPoliciesMockTest; import org.opendaylight.protocol.bgp.rib.impl.spi.BGPDispatcher; 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.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.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.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.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev171207.BgpTableType; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.AfiSafi1; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.AfiSafi1Builder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.AfiSafi2; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.AfiSafi2Builder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.Protocol1; -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; @@ -101,34 +63,28 @@ 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()); +public class BgpDeployerImplTest extends DefaultRibPoliciesMockTest { private static final BgpTableType TABLE_TYPE = new BgpTableTypeImpl(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class); + private static final String NETWORK_INSTANCE_NAME = "network-test"; + private static final KeyedInstanceIdentifier NETWORK_II = + InstanceIdentifier.create(NetworkInstances.class) + .child(NetworkInstance.class, new NetworkInstanceKey(NETWORK_INSTANCE_NAME)); + private static final String KEY = "bgp"; + private static final InstanceIdentifier BGP_II = NETWORK_II.child(Protocols.class) + .child(Protocol.class, new ProtocolKey(BGP.class, KEY)) + .augmentation(Protocol1.class).child(Bgp.class); + private static final InstanceIdentifier GLOBAL_II = BGP_II.child(Global.class); + private static final InstanceIdentifier NEIGHBORS_II = BGP_II.child(Neighbors.class); - private static final short SHORT = 0; - - @Mock - private DataObjectModification dObject; @Mock private BlueprintContainer blueprintContainer; @Mock private BundleContext bundleContext; @Mock - private DataBroker dataBroker; - @Mock private BGPTableTypeRegistryConsumer tableTypeRegistry; @Mock - private WriteTransaction wTx; - @Mock private DataTreeModification modification; @Mock private ListenerRegistration dataTreeRegistration; @@ -136,247 +92,139 @@ public class BgpDeployerImplTest { private ServiceRegistration registration; @Mock private ClusterSingletonServiceProvider singletonServiceProvider; - - private Collection> collection = Collections.singleton(this.modification); - - private static 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(); - } + private BgpDeployerImpl deployer; @Before public void setUp() throws Exception { - MockitoAnnotations.initMocks(this); - final DOMDataBroker domDataBroker = mock(DOMDataBroker.class); + super.setUp(); - doReturn(this.wTx).when(this.dataBroker).newWriteOnlyTransaction(); doReturn("mapping").when(this.tableTypeRegistry).toString(); - - doReturn(null).when(domDataBroker).createTransactionChain(any()); - doReturn(Collections.singletonMap(DOMDataTreeChangeService.class, mock(DOMDataBrokerExtension.class))) - .when(domDataBroker).getSupportedExtensions(); - doReturn(Optional.of(TABLE_TYPE)).when(this.tableTypeRegistry).getTableType(any()); doReturn(Optional.of(TABLES_KEY)).when(this.tableTypeRegistry).getTableKey(any()); - Mockito.doNothing().when(this.registration).unregister(); - doReturn(this.registration).when(this.bundleContext).registerService(eq(InstanceType.RIB.getServices()), any() - , any(Dictionary.class)); - 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); - doReturn(future).when(this.wTx).submit(); - Mockito.doNothing().when(future).addListener(any(), any()); - 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); - - doReturn(new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL, bgpIID)) - .when(this.modification).getRootPath(); - doReturn(this.dObject).when(this.modification).getRootNode(); - doReturn("bgpPeer").when(this.modification).toString(); - - doReturn(Collections.singleton(this.dObject)).when(this.dObject).getModifiedChildren(); - doReturn("dObject").when(this.dObject).toString(); + doNothing().when(this.registration).unregister(); + doReturn(this.registration).when(this.bundleContext).registerService(eq(InstanceType.RIB.getServices()), + any(), any(Dictionary.class)); + doReturn(this.registration).when(this.bundleContext).registerService(eq(InstanceType.PEER.getServices()), + any(), any(Dictionary.class)); + doNothing().when(this.dataTreeRegistration).close(); + doReturn("bgpPeer").when(this.modification).toString(); final RIBExtensionConsumerContext extension = mock(RIBExtensionConsumerContext.class); - doReturn(mock(GeneratedClassLoadingStrategy.class)).when(extension).getClassLoadingStrategy(); + doReturn(GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy()).when(extension).getClassLoadingStrategy(); final ClusterSingletonServiceRegistration serviceRegistration = mock(ClusterSingletonServiceRegistration.class); doReturn(serviceRegistration).when(this.singletonServiceProvider).registerClusterSingletonService(any()); - Mockito.doNothing().when(serviceRegistration).close(); + doNothing().when(serviceRegistration).close(); final DOMSchemaService schemaService = mock(DOMSchemaService.class); - Mockito.doNothing().when(this.dataTreeRegistration).close(); + doNothing().when(this.dataTreeRegistration).close(); doReturn(this.dataTreeRegistration).when(schemaService).registerSchemaContextListener(any()); - final RibImpl ribImpl = new RibImpl(extension, mock(BGPDispatcher.class), mock(BindingCodecTreeFactory.class), - domDataBroker, schemaService); + final RibImpl ribImpl = new RibImpl(extension, mock(BGPDispatcher.class), this.policyProvider, + mock(BindingCodecTreeFactory.class), getDomBroker(), schemaService, this.mappingService); doReturn(ribImpl).when(this.blueprintContainer).getComponentInstance(eq("ribImpl")); - final BgpPeer bgpPeer = new BgpPeer(mock(RpcProviderRegistry.class)); - doReturn(bgpPeer).when(this.blueprintContainer).getComponentInstance(eq("bgpPeer")); - this.collection = Collections.singleton(this.modification); + doReturn(new BgpPeer(mock(RpcProviderRegistry.class))) + .when(this.blueprintContainer).getComponentInstance(eq("bgpPeer")); + + this.deployer = new BgpDeployerImpl(NETWORK_INSTANCE_NAME, this.singletonServiceProvider, + this.blueprintContainer, this.bundleContext, getDataBroker(), this.tableTypeRegistry); } @Test public void testDeployerRib() throws Exception { - doReturn(Global.class).when(this.dObject).getDataType(); - final BgpDeployerImpl deployer = new BgpDeployerImpl(NETWORK_INSTANCE_NAME, this.singletonServiceProvider, - this.blueprintContainer, this.bundleContext, this.dataBroker, this.tableTypeRegistry); - final BgpDeployerImpl spyDeployer = spy(deployer); deployer.init(); - configureGlobal(IPV4UNICAST.class); - 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), eq(netII)); - verify(this.dataBroker).registerDataTreeChangeListener(any(DataTreeIdentifier.class), - any(BgpDeployerImpl.class)); - - assertEquals(this.tableTypeRegistry, spyDeployer.getTableTypeRegistry()); - - spyDeployer.onDataTreeChanged(this.collection); - verifyPrivate(spyDeployer).invoke("onGlobalChanged", any(DataObjectModification.class), - any(InstanceIdentifier.class)); + checkPresentConfiguration(getDataBroker(), NETWORK_II); + createRib(createGlobalIpv4()); + verify(this.blueprintContainer).getComponentInstance(eq("ribImpl")); verify(this.bundleContext).registerService(eq(InstanceType.RIB.getServices()), any(), any(Dictionary.class)); - 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)); + createRib(createGlobalIpv4()); 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)); //Update for existing rib - configureGlobal(IPV6UNICAST.class); - spyDeployer.onDataTreeChanged(this.collection); - verifyPrivate(spyDeployer, times(3)).invoke("onGlobalChanged", - any(DataObjectModification.class), any(InstanceIdentifier.class)); + createRib(createGlobalIpv6()); + 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(this.dataTreeRegistration).close(); verify(this.registration).unregister(); - verify(spyDeployer, times(3)).onDataTreeChanged(any(Collection.class)); //Delete for existing rib - doReturn(DELETE).when(this.dObject).getModificationType(); + deleteRib(); - 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(this.dataTreeRegistration, times(2)).close(); verify(this.registration, times(2)).unregister(); - 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(); - 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.singletonServiceProvider, - this.blueprintContainer, this.bundleContext, this.dataBroker, this.tableTypeRegistry); - final BgpDeployerImpl spyDeployer = spy(deployer); deployer.init(); - //First create Rib - doReturn(Global.class).when(this.dObject).getDataType(); - 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)); - - doReturn(Neighbors.class).when(this.dObject).getDataType(); - 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), eq(netII)); - verify(this.dataBroker) - .registerDataTreeChangeListener(any(DataTreeIdentifier.class), any(BgpDeployerImpl.class)); - - assertEquals(this.tableTypeRegistry, spyDeployer.getTableTypeRegistry()); - - spyDeployer.onDataTreeChanged(this.collection); - verify(spyDeployer, times(2)).onDataTreeChanged(any(Collection.class)); - verifyPrivate(spyDeployer).invoke("onNeighborsChanged", - any(DataObjectModification.class), any(InstanceIdentifier.class)); + checkPresentConfiguration(getDataBroker(), NETWORK_II); + + createRib(createGlobalIpv4()); + createNeighbor(createNeighbors()); verify(this.blueprintContainer).getComponentInstance(eq("bgpPeer")); 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)); + createNeighbor(createNeighbors()); verify(this.blueprintContainer).getComponentInstance(eq("bgpPeer")); 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)); + //Update for peer + createNeighbor(createNeighborsNoRR()); + verify(this.blueprintContainer).getComponentInstance(eq("bgpPeer")); verify(this.bundleContext, times(2)) .registerService(eq(InstanceType.PEER.getServices()), any(BgpPeer.class), any(Dictionary.class)); + verify(this.registration).unregister(); + deleteNeighbors(); //Delete existing Peer - 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(this.bundleContext, times(2)) .registerService(eq(InstanceType.PEER.getServices()), any(BgpPeer.class), any(Dictionary.class)); + verify(this.registration, times(2)).unregister(); deployer.close(); } - private void configureNeighbor(final Class afi) { - doReturn(createNeighborExpected(afi)).when(this.dObject).getDataAfter(); - doReturn(createNeighborExpected(afi)).when(this.dObject).getDataBefore(); + private void createRib(final Global global) throws ExecutionException, InterruptedException { + final WriteTransaction wr = getDataBroker().newWriteOnlyTransaction(); + wr.put(LogicalDatastoreType.CONFIGURATION, GLOBAL_II, global, true); + wr.submit().get(); + } + + private void deleteRib() throws ExecutionException, InterruptedException { + final WriteTransaction wr = getDataBroker().newWriteOnlyTransaction(); + wr.delete(LogicalDatastoreType.CONFIGURATION, BGP_II); + wr.submit().get(); + } + + private void createNeighbor(final Neighbors neighbors) throws ExecutionException, InterruptedException { + final WriteTransaction wr = getDataBroker().newWriteOnlyTransaction(); + wr.put(LogicalDatastoreType.CONFIGURATION, NEIGHBORS_II, neighbors, true); + wr.submit().get(); + } + + private void deleteNeighbors() throws ExecutionException, InterruptedException { + final WriteTransaction wr = getDataBroker().newWriteOnlyTransaction(); + wr.delete(LogicalDatastoreType.CONFIGURATION, NEIGHBORS_II); + wr.submit().get(); } } \ No newline at end of file diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/RIBTestsUtil.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/RIBTestsUtil.java new file mode 100644 index 0000000000..e426b6aa32 --- /dev/null +++ b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/RIBTestsUtil.java @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2018 AT&T Intellectual Property. 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.opendaylight.protocol.bgp.rib.impl.config.AbstractConfig.AS; +import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.NEIGHBOR_ADDRESS; +import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.createAddPath; +import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.createAfiSafi; +import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.createConfig; +import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.createNeighborExpected; +import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.createTimers; +import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.createTransport; + +import com.google.common.primitives.Shorts; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +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.global.base.ConfigBuilder; +import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.global.base.StateBuilder; +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.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.rev151009.bgp.top.bgp.NeighborsBuilder; +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.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.AfiSafi2; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.AfiSafi2Builder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.BgpId; + +public final class RIBTestsUtil { + static final Ipv4Address BGP_ID = new BgpId(new Ipv4Address("127.0.0.1")); + private static final List AFISAFIS_IPV4 = new ArrayList<>(); + private static final List AFISAFIS_IPV6 = new ArrayList<>(); + private static final Long ALL_PATHS = 0L; + + static { + AFISAFIS_IPV4.add(new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.class) + .addAugmentation(AfiSafi2.class, new AfiSafi2Builder().setReceive(true) + .setSendMax(Shorts.checkedCast(ALL_PATHS)).build()).build()); + } + + static { + AFISAFIS_IPV6.add(new AfiSafiBuilder().setAfiSafiName(IPV6UNICAST.class) + .addAugmentation(AfiSafi2.class, new AfiSafi2Builder().setReceive(true) + .setSendMax(Shorts.checkedCast(ALL_PATHS)).build()).build()); + } + + private RIBTestsUtil() { + throw new UnsupportedOperationException(); + } + + + public static Global createGlobalIpv4() { + return new GlobalBuilder() + .setAfiSafis(new AfiSafisBuilder().setAfiSafi(AFISAFIS_IPV4).build()) + .setConfig(new ConfigBuilder().setAs(AS).setRouterId(BGP_ID).build()) + .setState(new StateBuilder().setAs(AS).build()) + .build(); + } + + public static Global createGlobalIpv6() { + return new GlobalBuilder() + .setAfiSafis(new AfiSafisBuilder().setAfiSafi(AFISAFIS_IPV6).build()) + .setConfig(new ConfigBuilder().setAs(AS).setRouterId(BGP_ID).build()) + .setState(new StateBuilder().setAs(AS).build()) + .build(); + } + + public static Neighbors createNeighbors() { + return new NeighborsBuilder() + .setNeighbor(Collections.singletonList(createNeighbor())) + .build(); + } + + private static Neighbor createNeighbor() { + return createNeighborExpected(NEIGHBOR_ADDRESS); + } + + public static Neighbors createNeighborsNoRR() { + return new NeighborsBuilder() + .setNeighbor(Collections.singletonList(createNeighborNoRR())) + .build(); + } + + private static Neighbor createNeighborNoRR() { + return new NeighborBuilder() + .setAfiSafis(createAfiSafi()) + .setConfig(createConfig()) + .setNeighborAddress(NEIGHBOR_ADDRESS) + .setTimers(createTimers()) + .setTransport(createTransport()) + .setAddPaths(createAddPath()) + .build(); + } +} 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 index 8a779ba34a..500b0eab0c 100644 --- 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 @@ -106,9 +106,15 @@ public class RibImplTest extends AbstractConfig { } @Test - public void testRibImpl() throws Exception { - final RibImpl ribImpl = new RibImpl(this.extension, this.dispatcher, - this.bindingCodecTreeFactory, this.domDataBroker, this.domSchemaService); + public void testRibImpl() { + final RibImpl ribImpl = new RibImpl( + this.extension, + this.dispatcher, + this.policyProvider, + this.bindingCodecTreeFactory, + this.domDataBroker, + this.domSchemaService, + this.mappingService); ribImpl.setServiceRegistration(this.serviceRegistration); ribImpl.start(createGlobal(), "rib-test", this.tableTypeRegistry); verify(this.extension).getClassLoadingStrategy(); diff --git a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/AbstractRIBSupport.java b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/AbstractRIBSupport.java index 0a7bebcbfe..37caa02608 100644 --- a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/AbstractRIBSupport.java +++ b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/AbstractRIBSupport.java @@ -61,13 +61,13 @@ import org.slf4j.LoggerFactory; @Beta public abstract class AbstractRIBSupport implements RIBSupport { + public static final String ROUTE_KEY = "route-key"; private static final Logger LOG = LoggerFactory.getLogger(AbstractRIBSupport.class); private static final NodeIdentifier ADVERTISED_ROUTES = new NodeIdentifier(AdvertizedRoutes.QNAME); private static final NodeIdentifier WITHDRAWN_ROUTES = new NodeIdentifier(WithdrawnRoutes.QNAME); private static final NodeIdentifier DESTINATION_TYPE = new NodeIdentifier(DestinationType.QNAME); private static final NodeIdentifier ROUTES = new NodeIdentifier(Routes.QNAME); private static final ApplyRoute DELETE_ROUTE = new DeleteRoute(); - public static final String ROUTE_KEY = "route-key"; private final NodeIdentifier routesContainerIdentifier; private final NodeIdentifier routesListIdentifier; private final NodeIdentifier routeAttributesIdentifier; @@ -178,7 +178,7 @@ public abstract class AbstractRIBSupport implements RIBSupport { * Build MpReachNlri object from DOM representation. * * @param routes Collection of MapEntryNode DOM representation of routes - * @param hop CNextHop as it was parsed from Attributes, to be included in MpReach object + * @param hop CNextHop as it was parsed from Attributes, to be included in MpReach object * @return MpReachNlri */ private MpReachNlri buildReach(final Collection routes, final CNextHop hop) { @@ -234,13 +234,13 @@ public abstract class AbstractRIBSupport implements RIBSupport { /** * Given the destination as ContainerNode, implementation needs to parse the DOM model * from this point onward: - * + *

* {@code /bgp-mp:mp-unreach-nlri/bgp-mp:withdrawn-routes/bgp-mp:destination-type} * and delete the routes from its RIBs. * - * @param tx DOMDataWriteTransaction to be passed into implementation - * @param tablePath YangInstanceIdentifier to be passed into implementation - * @param destination ContainerNode DOM representation of NLRI in Update message + * @param tx DOMDataWriteTransaction to be passed into implementation + * @param tablePath YangInstanceIdentifier to be passed into implementation + * @param destination ContainerNode DOM representation of NLRI in Update message * @param routesNodeId NodeIdentifier */ private void deleteDestinationRoutes(final DOMDataWriteTransaction tx, final YangInstanceIdentifier tablePath, @@ -251,18 +251,18 @@ public abstract class AbstractRIBSupport implements RIBSupport { /** * Given the destination as ContainerNode, implementation needs to parse the DOM model * from this point onward: - * + *

* {@code /bgp-mp:mp-reach-nlri/bgp-mp:advertized-routes/bgp-mp:destination-type} * and put the routes to its RIBs. * - * @param tx DOMDataWriteTransaction to be passed into implementation - * @param tablePath YangInstanceIdentifier to be passed into implementation - * @param destination ContainerNode DOM representation of NLRI in Update message - * @param attributes ContainerNode to be passed into implementation + * @param tx DOMDataWriteTransaction to be passed into implementation + * @param tablePath YangInstanceIdentifier to be passed into implementation + * @param destination ContainerNode DOM representation of NLRI in Update message + * @param attributes ContainerNode to be passed into implementation * @param routesNodeId NodeIdentifier */ private void putDestinationRoutes(final DOMDataWriteTransaction tx, final YangInstanceIdentifier tablePath, - final ContainerNode destination, final ContainerNode attributes, final NodeIdentifier routesNodeId) { + final ContainerNode destination, final ContainerNode attributes, final NodeIdentifier routesNodeId) { processDestination(tx, tablePath.node(routesNodeId), destination, attributes, this.putRoute); } diff --git a/features/bgp/odl-bgpcep-bgp-rib-impl/pom.xml b/features/bgp/odl-bgpcep-bgp-rib-impl/pom.xml index c14b0e6581..f1e0c8fbce 100644 --- a/features/bgp/odl-bgpcep-bgp-rib-impl/pom.xml +++ b/features/bgp/odl-bgpcep-bgp-rib-impl/pom.xml @@ -61,6 +61,12 @@ xml features + + ${project.groupId} + odl-bgpcep-bgp-openconfig-rp-impl + xml + features + org.opendaylight.controller odl-mdsal-broker