BGPCEP-577: Neighbor’s local AS configurable 00/70300/3
authorClaudio D. Gasparini <claudio.gasparini@pantheon.tech>
Tue, 3 Apr 2018 15:10:44 +0000 (17:10 +0200)
committerClaudio D. Gasparini <claudio.gasparini@pantheon.tech>
Wed, 4 Apr 2018 15:14:31 +0000 (17:14 +0200)
Change-Id: I4dab50d048c2c61900251959d06c909c55722df5
Signed-off-by: Claudio D. Gasparini <claudio.gasparini@pantheon.tech>
24 files changed:
bgp/config-example/src/main/resources/initial/protocols-config.xml
bgp/config-example/src/main/resources/initial/routing-policy-config.xml
bgp/openconfig-api/src/main/yang/odl-bgp-default-policy.yang
bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/StatementActivator.java
bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/actions/AbstractPrependAsPath.java [new file with mode: 0644]
bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/actions/AsPathPrepend.java
bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/actions/LocalAsPathPrependHandler.java [new file with mode: 0644]
bgp/openconfig-rp-statement/src/test/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/ExportAttributeTestUtil.java
bgp/openconfig-rp-statement/src/test/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/ExportDefaultStatementTest.java
bgp/openconfig-rp-statement/src/test/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/ImportAttributeTestUtil.java
bgp/openconfig-rp-statement/src/test/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/ImportDefaultStatementTest.java
bgp/openconfig-rp-statement/src/test/resources/initial/routing-policy-config.xml
bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/BGPRouteEntryExportParametersImpl.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/ApplicationPeer.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPPeer.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/StrictBGPPeerRegistry.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpPeer.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/OpenConfigMappingUtil.java
bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/AbstractConfig.java
bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpPeerTest.java
bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/OpenConfigMappingUtilTest.java
bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/PeerTrackerInformation.java
bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/policy/BGPRouteEntryExportParameters.java
bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/policy/BGPRouteEntryImportParameters.java

index 9eb837a58e8ef1bd3bcdeb990dbb494d3865f572..24729868e6197b8d0c743088bfa50d4243ffbbdd 100644 (file)
                         </config>
                     </transport>
                 </neighbor>
+                <neighbor>
+                    <neighbor-address>192.0.2.5</neighbor-address>
+                    <config>
+                        <peer-group>/bgp/neighbors/neighbor/bgp/peer-groups/peer-group[peer-group-name="external-neighbor"]</peer-group>
+                        <local-as>65001</local-as>
+                    </config>
+                    <transport>
+                        <config>
+                            <remote-port>179</remote-port>
+                            <passive-mode>true</passive-mode>
+                        </config>
+                    </transport>
+                </neighbor>
                 <neighbor>
                     <neighbor-address>192.0.2.6</neighbor-address>
                     <config>
                         </afi-safi>
                     </afi-safis>
                 </peer-group>
+                <peer-group>
+                    <peer-group-name>external-neighbor</peer-group-name>
+                    <config>
+                        <peer-type>EXTERNAL</peer-type>
+                        <peer-as>65000</peer-as>
+                    </config>
+                    <afi-safis>
+                        <afi-safi>
+                            <afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types">x:IPV4-UNICAST</afi-safi-name>
+                        </afi-safi>
+                        <afi-safi>
+                            <afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types">x:IPV6-UNICAST</afi-safi-name>
+                        </afi-safi>
+                        <afi-safi>
+                            <afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types">x:IPV4-LABELLED-UNICAST</afi-safi-name>
+                        </afi-safi>
+                        <afi-safi>
+                            <afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types">x:IPV6-LABELLED-UNICAST</afi-safi-name>
+                        </afi-safi>
+                        <afi-safi>
+                            <afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types">x:L3VPN-IPV4-UNICAST</afi-safi-name>
+                        </afi-safi>
+                        <afi-safi>
+                            <afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types">x:L3VPN-IPV6-UNICAST</afi-safi-name>
+                        </afi-safi>
+                        <afi-safi>
+                            <afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types">x:L2VPN-EVPN</afi-safi-name>
+                        </afi-safi>
+                        <afi-safi>
+                            <afi-safi-name>LINKSTATE</afi-safi-name>
+                        </afi-safi>
+                        <afi-safi>
+                            <afi-safi-name>IPV4-FLOW</afi-safi-name>
+                        </afi-safi>
+                        <afi-safi>
+                            <afi-safi-name>IPV6-FLOW</afi-safi-name>
+                        </afi-safi>
+                        <afi-safi>
+                            <afi-safi-name>IPV4-L3VPN-FLOW</afi-safi-name>
+                        </afi-safi>
+                        <afi-safi>
+                            <afi-safi-name>IPV6-L3VPN-FLOW</afi-safi-name>
+                        </afi-safi>
+                    </afi-safis>
+                </peer-group>
             </peer-groups>
         </bgp>
     </protocol>
index 7a3c127dde7bee15926c85495ce3847a19b5a174..9c3c760c4ce0d7892306465eb3a9af9056d888c7 100644 (file)
@@ -26,6 +26,7 @@
                     <actions>
                         <bgp-actions xmlns="http://openconfig.net/yang/bgp-policy">
                             <non-transitive-attributes-filter xmlns="urn:opendaylight:params:xml:ns:yang:odl:bgp:default:policy"/>
+                            <local-as-path-prepend xmlns="urn:opendaylight:params:xml:ns:yang:odl:bgp:default:policy"/>
                         </bgp-actions>
                     </actions>
                 </statement>
@@ -91,6 +92,7 @@
                     <actions>
                         <bgp-actions xmlns="http://openconfig.net/yang/bgp-policy">
                             <non-transitive-attributes-filter xmlns="urn:opendaylight:params:xml:ns:yang:odl:bgp:default:policy"/>
+                            <local-as-path-prepend xmlns="urn:opendaylight:params:xml:ns:yang:odl:bgp:default:policy"/>
                             <set-as-path-prepend/>
                         </bgp-actions>
                     </actions>
index 2dce469f4e637cefa39a7a358d2d46dfdf14ff65..4d2d85f5482a09fbe379b4fb05819a576f622c54 100644 (file)
@@ -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 {
index 4c6fb2b9d1363fac84b90a7266878ea750e5ad1e..d29eca3d01685aa07e5ed85186331dfaedbbf731 100644 (file)
@@ -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<AutoCloseable> startImpl(final StatementRegistryProvider provider) {
-        final List<AutoCloseable> registration = new ArrayList<>(13);
+        final List<AutoCloseable> 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<AutoCloseable> 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 (file)
index 0000000..062fe7d
--- /dev/null
@@ -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<Segments> 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<AsNumber> newAsSequence = new ArrayList<>();
+        newAsSequence.add(new AsNumber(as));
+
+        List<Segments> 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<AsNumber> 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();
+    }
+}
index 063169f645938efcb156668f5dccdadc4d6c1ca9..569f7124c4c0c323be4c4246f2a0843a164f5ef2 100644 (file)
@@ -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<SetAsPathPrepend> {
+public final class AsPathPrepend extends AbstractPrependAsPath implements BgpActionPolicy<SetAsPathPrepend> {
     @Override
     public Attributes applyImportAction(
             final RouteEntryBaseAttributes routeEntryInfo,
@@ -43,33 +35,6 @@ public final class AsPathPrepend implements BgpActionPolicy<SetAsPathPrepend> {
             final BGPRouteEntryExportParameters exportParameters,
             final Attributes attributes,
             final SetAsPathPrepend actions) {
-
-        final List<Segments> 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<AsNumber> newAsSequence = new ArrayList<>();
-        newAsSequence.add(new AsNumber(routeEntryInfo.getLocalAs()));
-
-        List<Segments> 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<AsNumber> 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 (file)
index 0000000..d3e0208
--- /dev/null
@@ -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<LocalAsPathPrepend> {
+    @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;
+    }
+}
index 4fcac08e8a98e3ab0898bad44585109104b1535a..6f5c5adf92c6b844ae183fe39cf7bfaf0271fffa 100644 (file)
@@ -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<Segments> 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());
     }
 }
index 97286e02791650b9092097bf7ca5d7c24b53fa5a..9280b158221b828215ed161d6b3b7f4aeb03460b 100644 (file)
@@ -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();
     }
index d1c412b2c540fcc5cb2c3468dc6e94a170d968e7..e4187ee76d9f8fada065f5fd9fcf5e2c13e69621 100644 (file)
@@ -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();
     }
 
index 71326b8cbdc3ebd4c3d7d9d93775de0dc89bc70f..ebe47e6ef938f70c2c291e5ef06e1c59e1dcca69 100644 (file)
@@ -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,
index d1ec5190641c68897fc29743a329e9390b1c34f4..aa3075ad41059bb4ad838155a95cd4c5e05e766c 100644 (file)
@@ -25,8 +25,8 @@
                     </conditions>
                     <actions>
                         <bgp-actions xmlns="http://openconfig.net/yang/bgp-policy">
-                            <non-transitive-attributes-filter
-                                    xmlns="urn:opendaylight:params:xml:ns:yang:odl:bgp:default:policy"/>
+                            <non-transitive-attributes-filter xmlns="urn:opendaylight:params:xml:ns:yang:odl:bgp:default:policy"/>
+                            <local-as-path-prepend xmlns="urn:opendaylight:params:xml:ns:yang:odl:bgp:default:policy"/>
                         </bgp-actions>
                     </actions>
                 </statement>
@@ -97,8 +97,8 @@
                     </conditions>
                     <actions>
                         <bgp-actions xmlns="http://openconfig.net/yang/bgp-policy">
-                            <non-transitive-attributes-filter
-                                    xmlns="urn:opendaylight:params:xml:ns:yang:odl:bgp:default:policy"/>
+                            <non-transitive-attributes-filter xmlns="urn:opendaylight:params:xml:ns:yang:odl:bgp:default:policy"/>
+                            <local-as-path-prepend xmlns="urn:opendaylight:params:xml:ns:yang:odl:bgp:default:policy"/>
                             <set-as-path-prepend/>
                         </bgp-actions>
                     </actions>
index e3439c9c89e159a6e6253de6af88baa2bc120f29..c29475244ffe5672396442b2afa6b60b93876463 100644 (file)
@@ -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();
index c1d10ca41c98e84c03b9925869505074f315919b..56e6d8708ec4e79425acad4e6c76eceba980be3d 100644 (file)
@@ -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<Tables, TablesKey> 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;
+    }
 }
index 146f52c2d9a47a8bd4a603e85f7fed0825d5ca09..c6ad91c37f6f3aaa2b397813cdcbf93cf42bae9a 100644 (file)
@@ -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<TablesKey> 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<TablesKey> afiSafisAdvertized,
             final Set<TablesKey> 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<TablesKey> afiSafisAdvertized,
             final Set<TablesKey> 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<Tables, TablesKey> getRibOutIId(final TablesKey tablesKey) {
         return this.tablesIId.getUnchecked(tablesKey);
index 4a09d9fe715712f978f9c1ae3b0bdeaa9629a241..332d4768efb330ef18b56bb37491e21703b6f295 100644 (file)
@@ -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);
         }
 
index fe4beb7b64215790bf9d987f97dcd5cece51c3d4..45fc73aa58a3e33f6c83fbdce835a610761bc356 100644 (file)
@@ -251,23 +251,22 @@ public final class BgpPeer implements PeerBean, BGPPeerStateConsumer {
 
             final Set<TablesKey> 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> 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();
index 30ccb2ec56a2d34e7145c8acd36bf0cdce573769..636955acc10ef4f2e44f5716cdd0d36293d00ac3 100644 (file)
@@ -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) {
index 30875e25835dbf0641cb7dd7c1819869e9f73000..969df0405e77029f1bfeb925d3ad75dac0d7e38d 100644 (file)
@@ -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
index 8de2f9878468fa6f6862c139ea48fa6c4fda0523..22317a1f3e62cfa735294b8986358f2f29e1e690 100644 (file)
@@ -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)
index 673136b8735460b338fa0a33b9cce7c21b641815..b409ba3dffcee95d675a7abc905eaadd77e58abe 100644 (file)
@@ -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<AddressFamilies> FAMILIES;
     private static final List<BgpTableType> TABLE_TYPES;
     private static final List<AfiSafi> 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();
index 05e3cd1f37d77b42d3f1ec8845e22c65048b672f..9b7fbe096cf6aec1666c415e0cf37ab17346afb0 100644 (file)
@@ -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();
 }
index 348ef4fbb343dc3020a69d4cf3a6db255f6caddd..e836790ab01ea87c5a8b5a299f67f2f13c0548c7 100644 (file)
@@ -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();
 }
index 422adb061049f2af2bb746f8959154143685159a..ec09b8e53bdc27e8ee9d96901f334e6ca5a77ca3 100644 (file)
@@ -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();
 }