From 542dfab18ce3a8af9535870ece0faf611ac5f7d2 Mon Sep 17 00:00:00 2001 From: "Claudio D. Gasparini" Date: Tue, 3 Apr 2018 17:10:44 +0200 Subject: [PATCH] =?utf8?q?BGPCEP-577:=20Neighbor=E2=80=99s=20local=20AS=20?= =?utf8?q?configurable?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Change-Id: I4dab50d048c2c61900251959d06c909c55722df5 Signed-off-by: Claudio D. Gasparini --- .../resources/initial/protocols-config.xml | 58 +++++++++++++++++++ .../initial/routing-policy-config.xml | 2 + .../src/main/yang/odl-bgp-default-policy.yang | 7 +++ .../policy/statement/StatementActivator.java | 7 ++- .../actions/AbstractPrependAsPath.java | 53 +++++++++++++++++ .../statement/actions/AsPathPrepend.java | 39 +------------ .../actions/LocalAsPathPrependHandler.java | 43 ++++++++++++++ .../statement/ExportAttributeTestUtil.java | 5 +- .../statement/ExportDefaultStatementTest.java | 6 +- .../statement/ImportAttributeTestUtil.java | 10 ++++ .../statement/ImportDefaultStatementTest.java | 2 + .../initial/routing-policy-config.xml | 8 +-- .../BGPRouteEntryExportParametersImpl.java | 11 ++++ .../bgp/rib/impl/ApplicationPeer.java | 13 ++++- .../protocol/bgp/rib/impl/BGPPeer.java | 17 +++++- .../bgp/rib/impl/StrictBGPPeerRegistry.java | 2 +- .../protocol/bgp/rib/impl/config/BgpPeer.java | 17 +++--- .../impl/config/OpenConfigMappingUtil.java | 20 +++++-- .../bgp/rib/impl/config/AbstractConfig.java | 1 + .../bgp/rib/impl/config/BgpPeerTest.java | 1 + .../config/OpenConfigMappingUtilTest.java | 23 ++++++-- .../bgp/rib/spi/PeerTrackerInformation.java | 9 +++ .../policy/BGPRouteEntryExportParameters.java | 10 ++++ .../policy/BGPRouteEntryImportParameters.java | 9 +++ 24 files changed, 304 insertions(+), 69 deletions(-) create mode 100644 bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/actions/AbstractPrependAsPath.java create mode 100644 bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/actions/LocalAsPathPrependHandler.java diff --git a/bgp/config-example/src/main/resources/initial/protocols-config.xml b/bgp/config-example/src/main/resources/initial/protocols-config.xml index 9eb837a58e..24729868e6 100644 --- a/bgp/config-example/src/main/resources/initial/protocols-config.xml +++ b/bgp/config-example/src/main/resources/initial/protocols-config.xml @@ -82,6 +82,19 @@ + + 192.0.2.5 + + /bgp/neighbors/neighbor/bgp/peer-groups/peer-group[peer-group-name="external-neighbor"] + 65001 + + + + 179 + true + + + 192.0.2.6 @@ -149,6 +162,51 @@ + + external-neighbor + + EXTERNAL + 65000 + + + + x:IPV4-UNICAST + + + x:IPV6-UNICAST + + + x:IPV4-LABELLED-UNICAST + + + x:IPV6-LABELLED-UNICAST + + + x:L3VPN-IPV4-UNICAST + + + x:L3VPN-IPV6-UNICAST + + + x:L2VPN-EVPN + + + LINKSTATE + + + IPV4-FLOW + + + IPV6-FLOW + + + IPV4-L3VPN-FLOW + + + IPV6-L3VPN-FLOW + + + diff --git a/bgp/config-example/src/main/resources/initial/routing-policy-config.xml b/bgp/config-example/src/main/resources/initial/routing-policy-config.xml index 7a3c127dde..9c3c760c4c 100644 --- a/bgp/config-example/src/main/resources/initial/routing-policy-config.xml +++ b/bgp/config-example/src/main/resources/initial/routing-policy-config.xml @@ -26,6 +26,7 @@ + @@ -91,6 +92,7 @@ + diff --git a/bgp/openconfig-api/src/main/yang/odl-bgp-default-policy.yang b/bgp/openconfig-api/src/main/yang/odl-bgp-default-policy.yang index 2dce469f4e..4d2d85f548 100644 --- a/bgp/openconfig-api/src/main/yang/odl-bgp-default-policy.yang +++ b/bgp/openconfig-api/src/main/yang/odl-bgp-default-policy.yang @@ -259,6 +259,13 @@ module odl-bgp-policy { } } + augment /rpol:routing-policy/rpol:policy-definitions/rpol:policy-definition/rpol:statements/rpol:statement/rpol:actions/bgp-pol:bgp-actions { + ext:augment-identifier local-as-path-prepend; + container local-as-path-prepend { + presence "Prepends local AS Path"; + } + } + augment /rpol:routing-policy/rpol:policy-definitions/rpol:policy-definition/rpol:statements/rpol:statement/rpol:actions/bgp-pol:bgp-actions { ext:augment-identifier set-cluster-id-prepend; container set-cluster-id-prepend { diff --git a/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/StatementActivator.java b/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/StatementActivator.java index 4c6fb2b9d1..d29eca3d01 100644 --- a/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/StatementActivator.java +++ b/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/StatementActivator.java @@ -16,6 +16,7 @@ import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.registry.AbstractBGPStatementProviderActivator; import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.registry.StatementRegistryProvider; import org.opendaylight.protocol.bgp.openconfig.routing.policy.statement.actions.AsPathPrepend; +import org.opendaylight.protocol.bgp.openconfig.routing.policy.statement.actions.LocalAsPathPrependHandler; import org.opendaylight.protocol.bgp.openconfig.routing.policy.statement.actions.NonTransitiveAttributesFilterHandler; import org.opendaylight.protocol.bgp.openconfig.routing.policy.statement.actions.SetClusterIdPrependHandler; import org.opendaylight.protocol.bgp.openconfig.routing.policy.statement.actions.SetCommunityHandler; @@ -34,6 +35,7 @@ import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.policy.rev15100 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.policy.rev151009.routing.policy.policy.definitions.policy.definition.statements.statement.actions.bgp.actions.SetAsPathPrepend; import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.policy.rev151009.routing.policy.policy.definitions.policy.definition.statements.statement.actions.bgp.actions.SetCommunity; import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.policy.rev151009.routing.policy.policy.definitions.policy.definition.statements.statement.actions.bgp.actions.SetExtCommunity; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.odl.bgp._default.policy.rev180109.LocalAsPathPrepend; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.odl.bgp._default.policy.rev180109.MatchBgpNeighborCondition; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.odl.bgp._default.policy.rev180109.MatchClusterIdSetCondition; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.odl.bgp._default.policy.rev180109.MatchOriginatorIdSetCondition; @@ -51,7 +53,7 @@ public final class StatementActivator extends AbstractBGPStatementProviderActiva @Override protected synchronized List startImpl(final StatementRegistryProvider provider) { - final List registration = new ArrayList<>(13); + final List registration = new ArrayList<>(14); registerActions(provider, registration); registerConditions(provider, registration); return registration; @@ -83,6 +85,9 @@ public final class StatementActivator extends AbstractBGPStatementProviderActiva private void registerActions(final StatementRegistryProvider provider, final List registration) { registration.add(provider.registerBgpActionPolicy(SetAsPathPrepend.class, new AsPathPrepend())); + registration.add(provider.registerBgpActionAugmentationPolicy(LocalAsPathPrepend.class, + new LocalAsPathPrependHandler())); + registration.add(provider.registerBgpActionPolicy(SetCommunity.class, new SetCommunityHandler(this.dataBroker))); diff --git a/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/actions/AbstractPrependAsPath.java b/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/actions/AbstractPrependAsPath.java new file mode 100644 index 0000000000..062fe7da2b --- /dev/null +++ b/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/actions/AbstractPrependAsPath.java @@ -0,0 +1,53 @@ +/* + * 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.openconfig.routing.policy.statement.actions; + +import java.util.ArrayList; +import java.util.List; +import org.opendaylight.protocol.util.Values; +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.message.rev171207.path.attributes.AttributesBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev171207.path.attributes.attributes.AsPathBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev171207.path.attributes.attributes.as.path.Segments; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev171207.path.attributes.attributes.as.path.SegmentsBuilder; + +class AbstractPrependAsPath { + + final Attributes prependAS(final Attributes attributes, final AsNumber as) { + final List oldSegments = attributes.getAsPath().getSegments(); + /* + * We need to check the first segment. + * If it has as-set then new as-sequence with local AS is prepended. + * If it has as-sequence, we may add local AS when it has less than 255 elements. + * Otherwise we need to create new as-sequence for local AS. + */ + final ArrayList newAsSequence = new ArrayList<>(); + newAsSequence.add(new AsNumber(as)); + + List newSegments = new ArrayList<>(); + if (oldSegments == null || oldSegments.isEmpty()) { + newSegments = new ArrayList<>(); + newSegments.add(new SegmentsBuilder().setAsSequence(newAsSequence).build()); + } else { + final Segments firstSegment = oldSegments.remove(0); + final List firstAsSequence = firstSegment.getAsSequence(); + if (firstAsSequence != null && firstAsSequence.size() < Values.UNSIGNED_BYTE_MAX_VALUE) { + newAsSequence.addAll(firstAsSequence); + newSegments.add(new SegmentsBuilder().setAsSequence(newAsSequence).build()); + } else { + newSegments.add(new SegmentsBuilder().setAsSequence(newAsSequence).build()); + newSegments.add(firstSegment); + } + newSegments.addAll(oldSegments); + } + return new AttributesBuilder(attributes).setAsPath(new AsPathBuilder() + .setSegments(newSegments).build()).build(); + } +} diff --git a/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/actions/AsPathPrepend.java b/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/actions/AsPathPrepend.java index 063169f645..569f7124c4 100644 --- a/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/actions/AsPathPrepend.java +++ b/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/actions/AsPathPrepend.java @@ -8,26 +8,18 @@ package org.opendaylight.protocol.bgp.openconfig.routing.policy.statement.actions; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.RouteEntryBaseAttributes; import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.policy.action.BgpActionPolicy; import org.opendaylight.protocol.bgp.rib.spi.policy.BGPRouteEntryExportParameters; import org.opendaylight.protocol.bgp.rib.spi.policy.BGPRouteEntryImportParameters; -import org.opendaylight.protocol.util.Values; import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.policy.rev151009.routing.policy.policy.definitions.policy.definition.statements.statement.actions.bgp.actions.SetAsPathPrepend; 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.message.rev171207.path.attributes.AttributesBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev171207.path.attributes.attributes.AsPathBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev171207.path.attributes.attributes.as.path.Segments; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev171207.path.attributes.attributes.as.path.SegmentsBuilder; /** * Prepend local AS, one time(n times not supported yet). */ -public final class AsPathPrepend implements BgpActionPolicy { +public final class AsPathPrepend extends AbstractPrependAsPath implements BgpActionPolicy { @Override public Attributes applyImportAction( final RouteEntryBaseAttributes routeEntryInfo, @@ -43,33 +35,6 @@ public final class AsPathPrepend implements BgpActionPolicy { final BGPRouteEntryExportParameters exportParameters, final Attributes attributes, final SetAsPathPrepend actions) { - - final List oldSegments = attributes.getAsPath().getSegments(); - /* - * We need to check the first segment. - * If it has as-set then new as-sequence with local AS is prepended. - * If it has as-sequence, we may add local AS when it has less than 255 elements. - * Otherwise we need to create new as-sequence for local AS. - */ - final ArrayList newAsSequence = new ArrayList<>(); - newAsSequence.add(new AsNumber(routeEntryInfo.getLocalAs())); - - List newSegments = new ArrayList<>(); - if (oldSegments == null || oldSegments.isEmpty()) { - newSegments = Collections.singletonList(new SegmentsBuilder().setAsSequence(newAsSequence).build()); - } else { - final Segments firstSegment = oldSegments.remove(0); - final List firstAsSequence = firstSegment.getAsSequence(); - if (firstAsSequence != null && firstAsSequence.size() < Values.UNSIGNED_BYTE_MAX_VALUE) { - newAsSequence.addAll(firstAsSequence); - newSegments.add(new SegmentsBuilder().setAsSequence(newAsSequence).build()); - } else { - newSegments.add(new SegmentsBuilder().setAsSequence(newAsSequence).build()); - newSegments.add(firstSegment); - } - newSegments.addAll(oldSegments); - } - return new AttributesBuilder(attributes).setAsPath(new AsPathBuilder() - .setSegments(newSegments).build()).build(); + return prependAS(attributes, new AsNumber(routeEntryInfo.getLocalAs())); } } \ No newline at end of file diff --git a/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/actions/LocalAsPathPrependHandler.java b/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/actions/LocalAsPathPrependHandler.java new file mode 100644 index 0000000000..d3e02085fe --- /dev/null +++ b/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/actions/LocalAsPathPrependHandler.java @@ -0,0 +1,43 @@ +/* + * 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.openconfig.routing.policy.statement.actions; + +import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.RouteEntryBaseAttributes; +import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.policy.action.BgpActionAugPolicy; +import org.opendaylight.protocol.bgp.rib.spi.policy.BGPRouteEntryExportParameters; +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.odl.bgp._default.policy.rev180109.LocalAsPathPrepend; + +public final class LocalAsPathPrependHandler extends AbstractPrependAsPath + implements BgpActionAugPolicy { + @Override + public Attributes applyImportAction( + final RouteEntryBaseAttributes routeEntryInfo, + final BGPRouteEntryImportParameters parameters, + final Attributes attributes, + final LocalAsPathPrepend actions) { + if (parameters.getFromPeerLocalAs() != null) { + return prependAS(attributes, parameters.getFromPeerLocalAs()); + } + return attributes; + } + + @Override + public Attributes applyExportAction( + final RouteEntryBaseAttributes routeEntryInfo, + final BGPRouteEntryExportParameters parameters, + final Attributes attributes, + final LocalAsPathPrepend actions) { + if (parameters.getToPeerLocalAs() != null) { + return prependAS(attributes, parameters.getToPeerLocalAs()); + } + return attributes; + } +} diff --git a/bgp/openconfig-rp-statement/src/test/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/ExportAttributeTestUtil.java b/bgp/openconfig-rp-statement/src/test/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/ExportAttributeTestUtil.java index 4fcac08e8a..6f5c5adf92 100644 --- a/bgp/openconfig-rp-statement/src/test/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/ExportAttributeTestUtil.java +++ b/bgp/openconfig-rp-statement/src/test/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/ExportAttributeTestUtil.java @@ -24,7 +24,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mess import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.ClusterIdentifier; public final class ExportAttributeTestUtil { - public static final long LOCAL_AS = 8; + public static final long REMOTE_AS = 8; + public static final AsNumber LOCAL_AS = new AsNumber(65L); public static final Ipv4Address IPV4 = new Ipv4Address("1.2.3.4"); public static final ClusterIdentifier CLUSTER = new ClusterIdentifier(IPV4); @@ -82,6 +83,6 @@ public final class ExportAttributeTestUtil { private static List createSequenceWithLocalAs() { return Collections.singletonList(new SegmentsBuilder() - .setAsSequence(Collections.singletonList(new AsNumber(LOCAL_AS))).build()); + .setAsSequence(Arrays.asList(new AsNumber(LOCAL_AS), new AsNumber(REMOTE_AS))).build()); } } diff --git a/bgp/openconfig-rp-statement/src/test/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/ExportDefaultStatementTest.java b/bgp/openconfig-rp-statement/src/test/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/ExportDefaultStatementTest.java index 97286e0279..9280b15822 100644 --- a/bgp/openconfig-rp-statement/src/test/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/ExportDefaultStatementTest.java +++ b/bgp/openconfig-rp-statement/src/test/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/ExportDefaultStatementTest.java @@ -14,7 +14,9 @@ import static org.opendaylight.protocol.bgp.openconfig.routing.policy.statement. import static org.opendaylight.protocol.bgp.openconfig.routing.policy.statement.ExportAttributeTestUtil.createInputWithOriginator; import static org.opendaylight.protocol.bgp.openconfig.routing.policy.statement.ExportAttributeTestUtil.createPathInput; import static org.opendaylight.protocol.bgp.openconfig.routing.policy.statement.ExportAttributeTestUtil.createPathInputWithAs; +import static org.opendaylight.protocol.bgp.openconfig.routing.policy.statement.ImportAttributeTestUtil.AS; +import java.util.Collections; import java.util.List; import org.junit.Before; import org.junit.Test; @@ -45,7 +47,8 @@ public class ExportDefaultStatementTest extends AbstractStatementRegistryConsume final Statement statement = getStatementAndSetToRole("to-external", PeerRole.Ebgp); final Attributes expectedOutput = createPathInputWithAs(); - final RouteAttributeContainer attributeContainer = routeAttributeContainerFalse(createPathInput(null)); + final RouteAttributeContainer attributeContainer + = routeAttributeContainerFalse(createPathInput(Collections.emptyList())); assertApplyExportStatement(statement, PeerRole.Ebgp, attributeContainer, expectedOutput); assertApplyExportStatement(statement, PeerRole.Ibgp, attributeContainer, expectedOutput); @@ -121,6 +124,7 @@ public class ExportDefaultStatementTest extends AbstractStatementRegistryConsume private Statement getStatementAndSetToRole(final String statementName, final PeerRole toPeerRole) { doReturn(toPeerRole).when(this.exportParameters).getToPeerRole(); + doReturn(AS).when(this.exportParameters).getToPeerLocalAs(); return this.defaultExportStatements.stream() .filter(st -> st.getName().equals(statementName)).findFirst().get(); } diff --git a/bgp/openconfig-rp-statement/src/test/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/ImportAttributeTestUtil.java b/bgp/openconfig-rp-statement/src/test/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/ImportAttributeTestUtil.java index d1c412b2c5..e4187ee76d 100644 --- a/bgp/openconfig-rp-statement/src/test/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/ImportAttributeTestUtil.java +++ b/bgp/openconfig-rp-statement/src/test/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/ImportAttributeTestUtil.java @@ -8,15 +8,18 @@ package org.opendaylight.protocol.bgp.openconfig.routing.policy.statement; import java.util.Collections; +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.Ipv4Address; 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.message.rev171207.path.attributes.AttributesBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev171207.path.attributes.attributes.AsPathBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev171207.path.attributes.attributes.ClusterIdBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev171207.path.attributes.attributes.LocalPrefBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev171207.path.attributes.attributes.MultiExitDiscBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev171207.path.attributes.attributes.Origin; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev171207.path.attributes.attributes.OriginBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev171207.path.attributes.attributes.OriginatorIdBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev171207.path.attributes.attributes.as.path.SegmentsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.BgpOrigin; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.ClusterIdentifier; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.Ipv4NextHopCase; @@ -24,6 +27,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.next.hop.c.next.hop.ipv4.next.hop._case.Ipv4NextHopBuilder; public final class ImportAttributeTestUtil { + static final AsNumber AS = new AsNumber(65L); + private ImportAttributeTestUtil() { throw new UnsupportedOperationException(); } @@ -47,6 +52,9 @@ public final class ImportAttributeTestUtil { // origin pref attBuilder.setOrigin(createOrigin()); + // as path + attBuilder.setAsPath(new AsPathBuilder().build()); + // multi-exit-disc pref attBuilder.setMultiExitDisc(new MultiExitDiscBuilder().setMed(0L).build()); return attBuilder.build(); @@ -56,6 +64,8 @@ public final class ImportAttributeTestUtil { final AttributesBuilder attBuilder = new AttributesBuilder(); attBuilder.setCNextHop(createNexHop()); attBuilder.setOrigin(createOrigin()); + attBuilder.setAsPath(new AsPathBuilder().setSegments(Collections.singletonList(new SegmentsBuilder() + .setAsSequence(Collections.singletonList(AS)).build())).build()); return attBuilder.build(); } diff --git a/bgp/openconfig-rp-statement/src/test/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/ImportDefaultStatementTest.java b/bgp/openconfig-rp-statement/src/test/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/ImportDefaultStatementTest.java index 71326b8cbd..ebe47e6ef9 100644 --- a/bgp/openconfig-rp-statement/src/test/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/ImportDefaultStatementTest.java +++ b/bgp/openconfig-rp-statement/src/test/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/ImportDefaultStatementTest.java @@ -10,6 +10,7 @@ package org.opendaylight.protocol.bgp.openconfig.routing.policy.statement; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.doReturn; import static org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.registry.RouteAttributeContainer.routeAttributeContainerFalse; +import static org.opendaylight.protocol.bgp.openconfig.routing.policy.statement.ImportAttributeTestUtil.AS; import java.util.List; import org.junit.Before; @@ -72,6 +73,7 @@ public class ImportDefaultStatementTest extends AbstractStatementRegistryConsume final Attributes attExpected) { doReturn(fromPeerRole).when(this.importParameters).getFromPeerRole(); + doReturn(AS).when(this.importParameters).getFromPeerLocalAs(); RouteAttributeContainer result = this.statementRegistry.applyImportStatement( this.baseAttributes, diff --git a/bgp/openconfig-rp-statement/src/test/resources/initial/routing-policy-config.xml b/bgp/openconfig-rp-statement/src/test/resources/initial/routing-policy-config.xml index d1ec519064..aa3075ad41 100644 --- a/bgp/openconfig-rp-statement/src/test/resources/initial/routing-policy-config.xml +++ b/bgp/openconfig-rp-statement/src/test/resources/initial/routing-policy-config.xml @@ -25,8 +25,8 @@ - + + @@ -97,8 +97,8 @@ - + + diff --git a/bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/BGPRouteEntryExportParametersImpl.java b/bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/BGPRouteEntryExportParametersImpl.java index e3439c9c89..c29475244f 100644 --- a/bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/BGPRouteEntryExportParametersImpl.java +++ b/bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/BGPRouteEntryExportParametersImpl.java @@ -9,6 +9,7 @@ package org.opendaylight.protocol.bgp.mode.impl; import org.opendaylight.protocol.bgp.rib.spi.Peer; import org.opendaylight.protocol.bgp.rib.spi.policy.BGPRouteEntryExportParameters; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.AsNumber; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.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.types.rev130919.ClusterIdentifier; @@ -37,11 +38,21 @@ public final class BGPRouteEntryExportParametersImpl implements BGPRouteEntryExp return this.fromPeer.getClusterId(); } + @Override + public AsNumber getFromPeerLocalAs() { + return this.fromPeer.getLocalAs(); + } + @Override public PeerRole getToPeerRole() { return this.toPeer.getRole(); } + @Override + public AsNumber getToPeerLocalAs() { + return this.toPeer.getLocalAs(); + } + @Override public PeerId getToPeerId() { return this.toPeer.getPeerId(); 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 c1d10ca41c..56e6d8708e 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 @@ -21,8 +21,6 @@ import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.Set; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; import org.opendaylight.controller.md.sal.common.api.data.AsyncTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.controller.md.sal.common.api.data.TransactionChain; @@ -46,6 +44,7 @@ import org.opendaylight.protocol.bgp.rib.spi.state.BGPSessionState; import org.opendaylight.protocol.bgp.rib.spi.state.BGPTimersState; import org.opendaylight.protocol.bgp.rib.spi.state.BGPTransportState; import org.opendaylight.protocol.concepts.AbstractRegistration; +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.SendReceive; @@ -329,6 +328,11 @@ public class ApplicationPeer extends BGPPeerStateImpl implements org.opendayligh return null; } + @Override + public AsNumber getLocalAs() { + return null; + } + @Override public KeyedInstanceIdentifier getRibOutIId(final TablesKey tablesKey) { return this.tablesIId.getUnchecked(tablesKey); @@ -385,4 +389,9 @@ public class ApplicationPeer extends BGPPeerStateImpl implements org.opendayligh public ClusterIdentifier getFromClusterId() { return getClusterId(); } + + @Override + public AsNumber getFromPeerLocalAs() { + return null; + } } 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 146f52c2d9..c6ad91c37f 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 @@ -31,7 +31,6 @@ import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; -import javax.annotation.Nullable; import javax.annotation.concurrent.GuardedBy; import org.opendaylight.controller.md.sal.common.api.data.AsyncTransaction; import org.opendaylight.controller.md.sal.common.api.data.TransactionChain; @@ -60,6 +59,7 @@ import org.opendaylight.protocol.bgp.rib.spi.state.BGPTimersState; import org.opendaylight.protocol.bgp.rib.spi.state.BGPTransportState; import org.opendaylight.protocol.concepts.AbstractRegistration; import org.opendaylight.protocol.util.Ipv4Util; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.AsNumber; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev171207.ipv4.prefixes.DestinationIpv4Builder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev171207.ipv4.prefixes.destination.ipv4.Ipv4Prefixes; @@ -107,6 +107,7 @@ public class BGPPeer extends BGPPeerStateImpl implements BGPRouteEntryImportPara BGPSessionListener, Peer, TransactionChainListener { private static final Logger LOG = LoggerFactory.getLogger(BGPPeer.class); private final ClusterIdentifier clusterId; + private final AsNumber localAs; private Set tables = Collections.emptySet(); private final RIB rib; @@ -148,6 +149,7 @@ public class BGPPeer extends BGPPeerStateImpl implements BGPRouteEntryImportPara final RIB rib, final PeerRole role, final ClusterIdentifier clusterId, + final AsNumber localAs, final RpcProviderRegistry rpcRegistry, final Set afiSafisAdvertized, final Set afiSafisGracefulAdvertized) { @@ -156,6 +158,7 @@ public class BGPPeer extends BGPPeerStateImpl implements BGPRouteEntryImportPara this.peerRole = role; this.rib = requireNonNull(rib); this.clusterId = clusterId; + this.localAs = localAs; this.name = Ipv4Util.toStringIP(neighborAddress); this.rpcRegistry = rpcRegistry; this.peerIId = getInstanceIdentifier().child(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns @@ -171,7 +174,7 @@ public class BGPPeer extends BGPPeerStateImpl implements BGPRouteEntryImportPara final RpcProviderRegistry rpcRegistry, final Set afiSafisAdvertized, final Set afiSafisGracefulAdvertized) { - this(neighborAddress, null, rib, role, null, rpcRegistry, afiSafisAdvertized, + this(neighborAddress, null, rib, role, null, null, rpcRegistry, afiSafisAdvertized, afiSafisGracefulAdvertized); } @@ -507,6 +510,16 @@ public class BGPPeer extends BGPPeerStateImpl implements BGPRouteEntryImportPara return this.clusterId; } + @Override + public AsNumber getLocalAs() { + return this.localAs; + } + + @Override + public AsNumber getFromPeerLocalAs() { + return getLocalAs(); + } + @Override public KeyedInstanceIdentifier getRibOutIId(final TablesKey tablesKey) { return this.tablesIId.getUnchecked(tablesKey); diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/StrictBGPPeerRegistry.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/StrictBGPPeerRegistry.java index 4a09d9fe71..332d4768ef 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/StrictBGPPeerRegistry.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/StrictBGPPeerRegistry.java @@ -201,7 +201,7 @@ public final class StrictBGPPeerRegistry implements BGPPeerRegistry { private static void validateAs(final AsNumber remoteAs, final Open openObj, final BGPSessionPreferences localPref) throws BGPDocumentedException { if (!remoteAs.equals(localPref.getExpectedRemoteAs())) { - LOG.warn("Unexpected remote AS number. Expecting {}, got {}", remoteAs, localPref.getExpectedRemoteAs()); + LOG.warn("Unexpected remote AS number. Expecting {}, got {}", localPref.getExpectedRemoteAs(), remoteAs); throw new BGPDocumentedException("Peer AS number mismatch", BGPError.BAD_PEER_AS); } diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpPeer.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpPeer.java index fe4beb7b64..45fc73aa58 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpPeer.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpPeer.java @@ -251,23 +251,22 @@ public final class BgpPeer implements PeerBean, BGPPeerStateConsumer { final Set afiSafisAdvertized = OpenConfigMappingUtil .toTableKey(afisSAfis.getAfiSafi(), tableTypeRegistry); - final PeerRole role = OpenConfigMappingUtil.toPeerRole(neighbor, peerGroup); final ClusterIdentifier clusterId = OpenConfigMappingUtil .getNeighborClusterIdentifier(neighbor.getConfig()); - - this.bgpPeer = new BGPPeer(this.neighborAddress, peerGroupName, rib, role, clusterId, - BgpPeer.this.rpcRegistry, afiSafisAdvertized, Collections.emptySet()); - final List bgpParameters = getBgpParameters(afisSAfis, rib, tableTypeRegistry); final KeyMapping keyMapping = OpenConfigMappingUtil.getNeighborKey(neighbor); final IpAddress neighborLocalAddress = OpenConfigMappingUtil.getLocalAddress(neighbor.getTransport()); int hold = OpenConfigMappingUtil.getHoldTimer(neighbor, peerGroup); - final AsNumber ribAs = rib.getLocalAs(); - final AsNumber neighborAs = OpenConfigMappingUtil.getPeerAs(neighbor, peerGroup, ribAs); + final AsNumber globalAs = rib.getLocalAs(); + final AsNumber neighborRemoteAs = OpenConfigMappingUtil + .getRemotePeerAs(neighbor.getConfig(), peerGroup, globalAs); + final AsNumber neighborLocalAs = OpenConfigMappingUtil.getLocalPeerAs(neighbor.getConfig(), globalAs); - this.prefs = new BGPSessionPreferences(ribAs, hold, rib.getBgpIdentifier(), - neighborAs, bgpParameters, getPassword(keyMapping)); + this.bgpPeer = new BGPPeer(this.neighborAddress, peerGroupName, rib, role, clusterId, neighborLocalAs, + BgpPeer.this.rpcRegistry, afiSafisAdvertized, Collections.emptySet()); + this.prefs = new BGPSessionPreferences(neighborLocalAs, hold, rib.getBgpIdentifier(), + neighborRemoteAs, bgpParameters, getPassword(keyMapping)); this.activeConnection = OpenConfigMappingUtil.isActive(neighbor, peerGroup); this.retryTimer = OpenConfigMappingUtil.getRetryTimer(neighbor, peerGroup); this.dispatcher = rib.getDispatcher(); diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/OpenConfigMappingUtil.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/OpenConfigMappingUtil.java index 30ccb2ec56..636955acc1 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/OpenConfigMappingUtil.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/OpenConfigMappingUtil.java @@ -97,7 +97,7 @@ public final class OpenConfigMappingUtil { } @Nullable - private static AsNumber getPeerAs(final org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp + private static AsNumber getRemotePeerAs(final org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp .rev151009.bgp.neighbor.group.Config config) { if (config != null) { final AsNumber peerAs = config.getPeerAs(); @@ -362,14 +362,15 @@ public final class OpenConfigMappingUtil { } @Nonnull - public static AsNumber getPeerAs(final Neighbor neighbor, final PeerGroup peerGroup, final AsNumber localAs) { + public static AsNumber getRemotePeerAs(final org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009 + .bgp.neighbor.group.Config config, final PeerGroup peerGroup, final AsNumber localAs) { AsNumber neighborAs = null; if (peerGroup != null) { - neighborAs = getPeerAs(peerGroup.getConfig()); + neighborAs = getRemotePeerAs(peerGroup.getConfig()); } if (neighborAs == null) { - neighborAs = getPeerAs(neighbor.getConfig()); + neighborAs = getRemotePeerAs(config); } if (neighborAs == null) { @@ -379,6 +380,17 @@ public final class OpenConfigMappingUtil { } @Nonnull + public static AsNumber getLocalPeerAs(@Nullable final org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp + .rev151009.bgp.neighbor.group.Config config, @Nonnull final AsNumber globalAs) { + if (config != null) { + final AsNumber peerAs = config.getLocalAs(); + if (peerAs != null) { + return peerAs; + } + } + return globalAs; + } + public static int getRetryTimer(final Neighbor neighbor, final PeerGroup peerGroup) { Integer retryTimer = null; if (peerGroup != null) { 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 30875e2583..969df0405e 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 @@ -60,6 +60,7 @@ import org.osgi.framework.ServiceRegistration; class AbstractConfig extends DefaultRibPoliciesMockTest { protected static final AsNumber AS = new AsNumber(72L); + protected static final AsNumber lOCAL_AS = new AsNumber(73L); protected static final RibId RIB_ID = new RibId("test"); static final TablesKey TABLES_KEY = new TablesKey(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class); @Mock diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpPeerTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpPeerTest.java index 8de2f98784..22317a1f3e 100644 --- a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpPeerTest.java +++ b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpPeerTest.java @@ -105,6 +105,7 @@ public class BgpPeerTest extends AbstractConfig { return new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group. ConfigBuilder() .setPeerAs(AS) + .setLocalAs(lOCAL_AS) .setPeerType(PeerType.INTERNAL) .setAuthPassword(MD5_PASSWORD) .setRouteFlapDamping(false) diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/OpenConfigMappingUtilTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/OpenConfigMappingUtilTest.java index 673136b873..b409ba3dff 100644 --- a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/OpenConfigMappingUtilTest.java +++ b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/OpenConfigMappingUtilTest.java @@ -129,6 +129,7 @@ public class OpenConfigMappingUtilTest { = new BgpTableTypeImpl(Ipv6AddressFamily.class, UnicastSubsequentAddressFamily.class); private static final AsNumber AS = new AsNumber(72L); + private static final AsNumber GLOBAL_AS = new AsNumber(73L); private static final List FAMILIES; private static final List TABLE_TYPES; private static final List AFISAFIS = new ArrayList<>(); @@ -201,18 +202,28 @@ public class OpenConfigMappingUtilTest { } @Test - public void testGetPeerAs() { - assertEquals(AS, OpenConfigMappingUtil.getPeerAs(NEIGHBOR, null, null)); - assertEquals(AS, OpenConfigMappingUtil.getPeerAs(new NeighborBuilder().build(), null, this.rib.getLocalAs())); + public void testGetRemotePeerAs() { + final ConfigBuilder configBuilder = new ConfigBuilder(); + assertEquals(AS, OpenConfigMappingUtil.getRemotePeerAs(NEIGHBOR.getConfig(), null, null)); + assertEquals(AS, OpenConfigMappingUtil.getRemotePeerAs(configBuilder.build(), null, + this.rib.getLocalAs())); - assertEquals(AS, OpenConfigMappingUtil.getPeerAs(NEIGHBOR, new PeerGroupBuilder().build(), null)); - assertEquals(AS, OpenConfigMappingUtil.getPeerAs(new NeighborBuilder().build(), new PeerGroupBuilder().build(), + assertEquals(AS, OpenConfigMappingUtil.getRemotePeerAs(NEIGHBOR.getConfig(), + new PeerGroupBuilder().build(), null)); + assertEquals(AS, OpenConfigMappingUtil.getRemotePeerAs(configBuilder.build(), new PeerGroupBuilder().build(), this.rib.getLocalAs())); - assertEquals(AS, OpenConfigMappingUtil.getPeerAs(null, new PeerGroupBuilder() + assertEquals(AS, OpenConfigMappingUtil.getRemotePeerAs(null, new PeerGroupBuilder() .setConfig(new ConfigBuilder().setPeerAs(AS).build()).build(), null)); } + @Test + public void testGetLocalPeerAs() { + final ConfigBuilder configBuilder = new ConfigBuilder(); + assertEquals(GLOBAL_AS,OpenConfigMappingUtil.getLocalPeerAs(null, GLOBAL_AS)); + assertEquals(AS, OpenConfigMappingUtil.getLocalPeerAs(configBuilder.setLocalAs(AS).build(), GLOBAL_AS)); + } + @Test public void testIsActive() { final TransportBuilder builder = new TransportBuilder(); diff --git a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/PeerTrackerInformation.java b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/PeerTrackerInformation.java index 05e3cd1f37..9b7fbe096c 100644 --- a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/PeerTrackerInformation.java +++ b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/PeerTrackerInformation.java @@ -10,6 +10,7 @@ package org.opendaylight.protocol.bgp.rib.spi; import javax.annotation.Nonnull; import javax.annotation.Nullable; +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.SendReceive; 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; @@ -83,4 +84,12 @@ public interface PeerTrackerInformation { */ @Nullable ClusterIdentifier getClusterId(); + + /** + * Returns Local AS. + * + * @return AS + */ + @Nullable + AsNumber getLocalAs(); } diff --git a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/policy/BGPRouteEntryExportParameters.java b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/policy/BGPRouteEntryExportParameters.java index 348ef4fbb3..e836790ab0 100644 --- a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/policy/BGPRouteEntryExportParameters.java +++ b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/policy/BGPRouteEntryExportParameters.java @@ -8,6 +8,8 @@ package org.opendaylight.protocol.bgp.rib.spi.policy; import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.AsNumber; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev171207.PeerId; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev171207.PeerRole; @@ -31,4 +33,12 @@ public interface BGPRouteEntryExportParameters extends BGPRouteEntryImportParame */ @Nonnull PeerRole getToPeerRole(); + + /** + * Peer local AS of Peer route entry destiny. + * + * @return peer Local AS of destiny Peer + */ + @Nullable + AsNumber getToPeerLocalAs(); } diff --git a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/policy/BGPRouteEntryImportParameters.java b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/policy/BGPRouteEntryImportParameters.java index 422adb0610..ec09b8e53b 100644 --- a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/policy/BGPRouteEntryImportParameters.java +++ b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/policy/BGPRouteEntryImportParameters.java @@ -9,6 +9,7 @@ package org.opendaylight.protocol.bgp.rib.spi.policy; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.AsNumber; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.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.types.rev130919.ClusterIdentifier; @@ -40,4 +41,12 @@ public interface BGPRouteEntryImportParameters { */ @Nullable ClusterIdentifier getFromClusterId(); + + /** + * Peer local AS of route entry announcer. + * + * @return peer Local AS + */ + @Nullable + AsNumber getFromPeerLocalAs(); } -- 2.36.6