Route Constrain policies 49/73349/6
authorClaudio D. Gasparini <claudio.gasparini@pantheon.tech>
Fri, 22 Jun 2018 06:03:58 +0000 (08:03 +0200)
committerClaudio D. Gasparini <claudio.gasparini@pantheon.tech>
Thu, 28 Jun 2018 10:05:15 +0000 (12:05 +0200)
Conditions
- afi-safi-not-in

Actions
- set-local-address-as-next-hop
- set-originator-id-to-advertizer-router-id

JIRA: BGPCEP-527
Change-Id: I9f784175440fa6f5ab7e7d33cd1d9a72e4bf1ad5
Signed-off-by: Claudio D. Gasparini <claudio.gasparini@pantheon.tech>
34 files changed:
bgp/concepts/src/main/yang/bgp-types.yang
bgp/extensions/route-target/src/main/java/org/opendaylight/protocol/bgp/route/targetcontrain/impl/nlri/RouteTargetDefaultHandler.java
bgp/extensions/route-target/src/main/yang/bgp-route-target-constrain.yang
bgp/extensions/route-target/src/test/java/org/opendaylight/protocol/bgp/route/targetcontrain/impl/nlri/SimpleRouteTargetConstrainNlriRegistryTest.java
bgp/openconfig-api/src/main/yang/odl-bgp-default-policy.yang
bgp/openconfig-rp-impl/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/impl/BGPRibPolicyImpl.java
bgp/openconfig-rp-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/spi/policy/condition/ConditionsPolicy.java
bgp/openconfig-rp-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/spi/registry/BgpConditionsRegistry.java
bgp/openconfig-rp-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/spi/registry/ConditionsRegistryImpl.java
bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/SetLocalAddressAsNextHopHandler.java [new file with mode: 0644]
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/SetOriginatorIdToAdvertizerRouterIdHandler.java [new file with mode: 0644]
bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/conditions/MatchAfiSafiNotInHandler.java [new file with mode: 0644]
bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/conditions/MatchAsPathSetHandler.java
bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/conditions/MatchBgpNeighborSetHandler.java
bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/conditions/MatchClusterIdSetHandler.java
bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/conditions/MatchCommunitySetHandler.java
bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/conditions/MatchExtCommunitySetHandler.java
bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/conditions/MatchOriginatorIdSetHandler.java
bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/conditions/MatchRoleSetHandler.java
bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/conditions/VpnNonMemberHandler.java [new file with mode: 0644]
bgp/openconfig-rp-statement/src/test/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/MatchAfiSafiNotInTest.java [new file with mode: 0644]
bgp/openconfig-rp-statement/src/test/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/SetLocalAddressAsNextHopHandlerTest.java [new file with mode: 0644]
bgp/openconfig-rp-statement/src/test/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/SetOriginatorIdToAdvertizerRouterIdHandlerTest.java [new file with mode: 0644]
bgp/openconfig-rp-statement/src/test/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/VpnNonMemberHandlerTest.java [new file with mode: 0644]
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-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/Peer.java
bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/RouterIds.java
bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/policy/BGPRibRoutingPolicy.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/RouteTargetMembershipConsumer.java [new file with mode: 0644]

index b19b1ded0e9a1903b267ace001f52c412be5b902..03e1abce0b038dd12f1afc869e986e59b49f1f28 100644 (file)
@@ -301,10 +301,24 @@ module bgp-types {
         }
     }
 
+    grouping route-target {
+        description "Marker grouping for Route Target extended communities.";
+    }
+
+    grouping route-target-constrain-default-route-grouping {
+        container route-target-constrain-default-route {
+            uses route-target;
+            presence
+                "The presence of this container indicates that the routes
+                is a default route target";
+        }
+    }
+
     grouping route-target-extended-community-grouping {
         container route-target-extended-community {
             description "Type 0x00 / Subtype 0x02";
             reference "http://tools.ietf.org/html/rfc4360#section-4";
+            uses route-target;
 
             leaf global-administrator {
                 type short-as-number;
@@ -321,6 +335,7 @@ module bgp-types {
         container route-target-ipv4 {
             description "Type 0x01 / Subtype 0x02";
             reference "http://tools.ietf.org/html/rfc4360#section-4";
+            uses route-target;
             uses route-ipv4-extended-community;
         }
     }
@@ -329,6 +344,7 @@ module bgp-types {
         container as-4-route-target-extended-community {
             description "Type 0x02 / Subtype 0x02";
             reference "https://tools.ietf.org/html/rfc5668";
+            uses route-target;
             uses as-4-spec-common;
         }
     }
index e760ad7728e3ac06e2472ce43d900365beecea94..b1faf96efe22b4e87a2687c36d811ec477e8e05d 100644 (file)
@@ -13,7 +13,7 @@ import io.netty.buffer.Unpooled;
 import org.opendaylight.protocol.bgp.route.targetcontrain.spi.nlri.RouteTargetHandler;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.route.target.constrain.rev180618.route.target.constrain.route.target.constrain.choice.RouteTargetConstrainDefaultCase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.route.target.constrain.rev180618.route.target.constrain.route.target.constrain.choice.RouteTargetConstrainDefaultCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.route.target.constrain.rev180618.route.target.constrain.route.target.constrain.choice.route.target.constrain._default._case.RouteTargetConstrainDefaultRouteBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.route.target.constrain._default.route.grouping.RouteTargetConstrainDefaultRouteBuilder;
 
 /**
  * Default Route Target nlri.
index e65989d2b6d2b67e8ff93f61b01e0dd3668924f3..ea063192018bbe132299e005c565fecedbaafb14 100644 (file)
@@ -47,11 +47,7 @@ module bgp-route-target-constrain {
 
         choice route-target-constrain-choice {
             case route-target-constrain-default-case {
-                container route-target-constrain-default-route {
-                    presence
-                        "The presence of this container indicates that the routes
-                        is a default route target";
-                }
+                uses bgp-t:route-target-constrain-default-route-grouping;
             }
             case route-target-constrain-route-case {
                 uses bgp-t:route-target-extended-community-grouping;
index a892bee4fa069f6ea1956fa27490102ee0d496f9..8356955eee20830b2e0d7215468ff3bc5e486dd0 100644 (file)
@@ -28,11 +28,11 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rout
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.route.target.constrain.rev180618.route.target.constrain.route.target.constrain.choice.RouteTargetConstrainDefaultCaseBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.route.target.constrain.rev180618.route.target.constrain.route.target.constrain.choice.RouteTargetConstrainIpv4RouteCaseBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.route.target.constrain.rev180618.route.target.constrain.route.target.constrain.choice.RouteTargetConstrainRouteCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.route.target.constrain.rev180618.route.target.constrain.route.target.constrain.choice.route.target.constrain._default._case.RouteTargetConstrainDefaultRouteBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.ShortAsNumber;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.as._4.route.target.extended.community.grouping.As4RouteTargetExtendedCommunityBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.as._4.spec.common.As4SpecificCommon;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.as._4.spec.common.As4SpecificCommonBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.route.target.constrain._default.route.grouping.RouteTargetConstrainDefaultRouteBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.route.target.extended.community.grouping.RouteTargetExtendedCommunityBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.route.target.ipv4.grouping.RouteTargetIpv4Builder;
 
index 24d8739c2f0706170e3a00b7d6af08f84a05898e..e2c57e38bd49f3d4046b26bb88beed570e752732 100644 (file)
@@ -229,6 +229,17 @@ module odl-bgp-policy {
         }
     }
 
+    augment /rpol:routing-policy/rpol:policy-definitions/rpol:policy-definition/rpol:statements/rpol:statement/rpol:conditions/bgppol:bgp-conditions {
+        ext:augment-identifier match-afi-safi-not-in-condition;
+        leaf-list afi-safi-not-in {
+            type identityref {
+              base "bgp-types:afi-safi-type";
+            }
+            description
+              "List of address families which the NLRI must not be within";
+        }
+    }
+
     augment /rpol:routing-policy/rpol:policy-definitions/rpol:policy-definition/rpol:statements/rpol:statement/rpol:conditions/bgppol:bgp-conditions {
         ext:augment-identifier match-bgp-neighbor-condition;
         uses match-bgp-neighbor-grouping;
@@ -249,6 +260,13 @@ module odl-bgp-policy {
         uses match-cluster-id-set-condition-grouping;
     }
 
+    augment /rpol:routing-policy/rpol:policy-definitions/rpol:policy-definition/rpol:statements/rpol:statement/rpol:conditions/bgppol:bgp-conditions {
+        ext:augment-identifier vpn-non-member-condition;
+        container vpn-non-member {
+            presence "Match Route Target Attribute with Route Target memberships of destiny peer. Asserts peers is a non member.";
+        }
+    }
+
     augment /rpol:routing-policy/rpol:policy-definitions/rpol:policy-definition/rpol:statements/rpol:statement/rpol:actions/bgp-pol:bgp-actions {
         ext:augment-identifier reflect-attributes-actions;
         container reflect-attributes-actions {
@@ -279,6 +297,24 @@ 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 set-originator-id-to-advertizer-router-id;
+        container set-originator-id-to-advertizer-router-id {
+
+        presence "node is present in the config data to apply the set-originator-id-to-advertizer-router-id action";
+        description "action to set router-id of the advertiser as Originator attribute";
+        }
+    }
+
+    augment /rpol:routing-policy/rpol:policy-definitions/rpol:policy-definition/rpol:statements/rpol:statement/rpol:actions/bgp-pol:bgp-actions {
+        ext:augment-identifier set-local-address-as-next-hop;
+        container set-local-address-as-next-hop {
+
+        presence "node is present in the config data to apply set-local-address-as-next-hop action";
+        description "action to set local address as next hop";
+        }
+    }
+
     augment /rpol:routing-policy/rpol:policy-definitions/rpol:policy-definition/rpol:statements/rpol:statement/rpol:actions/bgp-pol:bgp-actions {
         ext:augment-identifier set-originator-id-prepend;
         container set-originator-id-prepend {
index 20c8eaf36622702156cee0f6154a647b10967dac..3fd2ed04911436157410c393e864a9c2b264b060 100644 (file)
@@ -98,12 +98,12 @@ final class BGPRibPolicyImpl implements BGPRibRoutingPolicy {
 
     @Override
     public Optional<Attributes> applyImportPolicies(final BGPRouteEntryImportParameters policyParameters,
-            final Attributes attributes, final Class<? extends AfiSafiType> afiSafi) {
+            final Attributes attributes, final Class<? extends AfiSafiType> afiSafiType) {
         RouteAttributeContainer currentAttributes = routeAttributeContainerFalse(attributes);
         for (final String policyName : this.importPolicy) {
             for (final Statement statement : this.statements.getUnchecked(policyName)) {
                 currentAttributes = this.policyRegistry
-                        .applyImportStatement(this.ribBaseParameters, afiSafi, policyParameters, currentAttributes,
+                        .applyImportStatement(this.ribBaseParameters, afiSafiType, policyParameters, currentAttributes,
                                 statement);
             }
         }
index 0e4fd675d182c70977654c950c86ce9bd0a6807f..68de765bd7b49acfa50634636494d1db02bc7d31 100644 (file)
@@ -13,6 +13,7 @@ import javax.annotation.Nullable;
 import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.RouteEntryBaseAttributes;
 import org.opendaylight.protocol.bgp.rib.spi.policy.BGPRouteEntryExportParameters;
 import org.opendaylight.protocol.bgp.rib.spi.policy.BGPRouteEntryImportParameters;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.AfiSafiType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.path.attributes.Attributes;
 
 /**
@@ -22,6 +23,7 @@ public interface ConditionsPolicy<T, N> {
     /**
      * Check if route matches defined condition (Import Policy).
      *
+     * @param afiSafiType                Afi Safi Type
      * @param routeEntryInfo             contains route Entry Info(AS, ClusterId, OriginatorId)
      * @param routeEntryImportParameters contains route basic information
      * @param attributes                 attributes
@@ -29,6 +31,7 @@ public interface ConditionsPolicy<T, N> {
      * @return true if all defined condition matches
      */
     boolean matchImportCondition(
+            @Nonnull Class<? extends AfiSafiType> afiSafiType,
             @Nonnull RouteEntryBaseAttributes routeEntryInfo,
             @Nonnull BGPRouteEntryImportParameters routeEntryImportParameters,
             @Nullable N attributes,
@@ -37,6 +40,7 @@ public interface ConditionsPolicy<T, N> {
     /**
      * Check if route matches defined condition (Export Policy).
      *
+     * @param afiSafiType                Afi Safi Type
      * @param routeEntryInfo             contains route Entry Info(AS, ClusterId, OriginatorId)
      * @param routeEntryExportParameters route basic export information
      * @param attributes                 attributes
@@ -44,6 +48,7 @@ public interface ConditionsPolicy<T, N> {
      * @return true if all defined condition matches
      */
     boolean matchExportCondition(
+            @Nonnull Class<? extends AfiSafiType> afiSafiType,
             @Nonnull RouteEntryBaseAttributes routeEntryInfo,
             @Nonnull BGPRouteEntryExportParameters routeEntryExportParameters,
             @Nullable N attributes,
index 7626a1db0002ba55b35c9ba157c33ab4cca6a23b..786798c16c5f8bfb683e3fe30eec9331159d4615 100644 (file)
@@ -98,7 +98,7 @@ final class BgpConditionsRegistry {
                 if (handler == null) {
                     continue;
                 }
-                if (!handler.matchExportCondition(entryInfo, routeEntryExportParameters,
+                if (!handler.matchExportCondition(afiSafi, entryInfo, routeEntryExportParameters,
                         handler.getConditionParameter(attributes), entry.getValue())) {
                     return false;
                 }
@@ -131,7 +131,7 @@ final class BgpConditionsRegistry {
                 if (handler == null) {
                     continue;
                 }
-                if (!handler.matchImportCondition(entryInfo, routeEntryImportParameters,
+                if (!handler.matchImportCondition(afiSafi, entryInfo, routeEntryImportParameters,
                         handler.getConditionParameter(attributes), entry.getValue())) {
                     return false;
                 }
@@ -155,7 +155,7 @@ final class BgpConditionsRegistry {
         final MatchCommunitySet matchCond = conditions.getMatchCommunitySet();
         if (matchCond != null) {
             final BgpConditionsPolicy handler = this.bgpConditionsRegistry.get(MatchCommunitySet.class);
-            if (!handler.matchImportCondition(routeEntryInfo, routeEntryImportParameters,
+            if (!handler.matchImportCondition(afiSafi, routeEntryInfo, routeEntryImportParameters,
                     handler.getConditionParameter(attributes), matchCond)) {
                 return false;
             }
@@ -164,7 +164,7 @@ final class BgpConditionsRegistry {
         final MatchAsPathSet matchAsPathSet = conditions.getMatchAsPathSet();
         if (matchCond != null) {
             final BgpConditionsPolicy handler = this.bgpConditionsRegistry.get(MatchAsPathSet.class);
-            if (!handler.matchImportCondition(routeEntryInfo, routeEntryImportParameters,
+            if (!handler.matchImportCondition(afiSafi, routeEntryInfo, routeEntryImportParameters,
                     handler.getConditionParameter(attributes), matchAsPathSet)) {
                 return false;
             }
@@ -173,7 +173,7 @@ final class BgpConditionsRegistry {
         final MatchExtCommunitySet matchExtCommSet = conditions.getMatchExtCommunitySet();
         if (matchExtCommSet != null) {
             final BgpConditionsPolicy handler = this.bgpConditionsRegistry.get(MatchAsPathSet.class);
-            if (!handler.matchImportCondition(routeEntryInfo, routeEntryImportParameters,
+            if (!handler.matchImportCondition(afiSafi, routeEntryInfo, routeEntryImportParameters,
                     handler.getConditionParameter(attributes), matchExtCommSet)) {
                 return false;
             }
@@ -196,7 +196,7 @@ final class BgpConditionsRegistry {
         final MatchCommunitySet matchCond = conditions.getMatchCommunitySet();
         if (matchCond != null) {
             final BgpConditionsPolicy handler = this.bgpConditionsRegistry.get(MatchCommunitySet.class);
-            if (!handler.matchExportCondition(routeEntryInfo, routeEntryExportParameters,
+            if (!handler.matchExportCondition(afiSafi, routeEntryInfo, routeEntryExportParameters,
                     handler.getConditionParameter(attributes), matchCond)) {
                 return false;
             }
@@ -205,7 +205,7 @@ final class BgpConditionsRegistry {
         final MatchAsPathSet matchAsPathSet = conditions.getMatchAsPathSet();
         if (matchAsPathSet != null) {
             final BgpConditionsPolicy handler = this.bgpConditionsRegistry.get(MatchAsPathSet.class);
-            if (!handler.matchExportCondition(routeEntryInfo, routeEntryExportParameters,
+            if (!handler.matchExportCondition(afiSafi, routeEntryInfo, routeEntryExportParameters,
                     handler.getConditionParameter(attributes), matchAsPathSet)) {
                 return false;
             }
@@ -214,7 +214,7 @@ final class BgpConditionsRegistry {
         final MatchExtCommunitySet matchExtCommSet = conditions.getMatchExtCommunitySet();
         if (matchExtCommSet != null) {
             final BgpConditionsPolicy handler = this.bgpConditionsRegistry.get(MatchExtCommunitySet.class);
-            if (!handler.matchExportCondition(routeEntryInfo, routeEntryExportParameters,
+            if (!handler.matchExportCondition(afiSafi, routeEntryInfo, routeEntryExportParameters,
                     handler.getConditionParameter(attributes), matchExtCommSet)) {
                 return false;
             }
index 7e96d1d2e3a1b8ae56077b94e0a73c7f0cb4114c..74dfc8ce809b54300fa27b2213bc98f18dd17fee 100644 (file)
@@ -92,7 +92,7 @@ final class ConditionsRegistryImpl {
                 if (handler == null) {
                     continue;
                 }
-                if (!handler.matchExportCondition(entryInfo, routeEntryExportParameters,
+                if (!handler.matchExportCondition(afiSafi, entryInfo, routeEntryExportParameters,
                         handler.getConditionParameter(attributes), entry.getValue())) {
                     return false;
                 }
@@ -121,7 +121,7 @@ final class ConditionsRegistryImpl {
                 final ConditionsAugPolicy handler = this.conditionsRegistry.get(entry.getKey());
                 if (handler != null) {
                     final Augmentation<Conditions> conditionConfig = (Augmentation<Conditions>) entry.getValue();
-                    if (!handler.matchImportCondition(entryInfo, routeEntryImportParameters,
+                    if (!handler.matchImportCondition(afiSafi, entryInfo, routeEntryImportParameters,
                             handler.getConditionParameter(attributes), conditionConfig)) {
                         return false;
                     }
diff --git a/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/SetLocalAddressAsNextHopHandler.java b/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/SetLocalAddressAsNextHopHandler.java
new file mode 100644 (file)
index 0000000..a5768b5
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+ * 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;
+
+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.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.path.attributes.Attributes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.path.attributes.AttributesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.next.hop.c.next.hop.Ipv4NextHopCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.next.hop.c.next.hop.ipv4.next.hop._case.Ipv4NextHopBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.odl.bgp._default.policy.rev180329.SetLocalAddressAsNextHop;
+
+/**
+ * Local Address shall be set as next Hop.
+ * https://tools.ietf.org/html/rfc4684
+ *
+ * @author Claudio D. Gasparini
+ */
+public final class SetLocalAddressAsNextHopHandler implements BgpActionAugPolicy<SetLocalAddressAsNextHop> {
+    private static final SetLocalAddressAsNextHopHandler INSTANCE = new SetLocalAddressAsNextHopHandler();
+
+    private SetLocalAddressAsNextHopHandler() {
+
+    }
+
+    public static SetLocalAddressAsNextHopHandler getInstance() {
+        return INSTANCE;
+    }
+
+    @Override
+    public Attributes applyImportAction(
+            final RouteEntryBaseAttributes routeEntryInfo,
+            final BGPRouteEntryImportParameters routeBaseParameters,
+            final Attributes attributes,
+            final SetLocalAddressAsNextHop actions) {
+        return setNextHop(attributes, routeEntryInfo.getOriginatorId());
+    }
+
+    private Attributes setNextHop(final Attributes attributes, final Ipv4Address localAddress) {
+        return new AttributesBuilder(attributes)
+                .setCNextHop(new Ipv4NextHopCaseBuilder()
+                        .setIpv4NextHop(new Ipv4NextHopBuilder().setGlobal(localAddress).build())
+                        .build()).build();
+    }
+
+    @Override
+    public Attributes applyExportAction(
+            final RouteEntryBaseAttributes routeEntryInfo,
+            final BGPRouteEntryExportParameters exportParameters,
+            final Attributes attributes,
+            final SetLocalAddressAsNextHop actions) {
+        return setNextHop(attributes, routeEntryInfo.getOriginatorId());
+    }
+}
index 89ab5263d63fffc8b39bceb1219600901e583601..c1e3f29a6ab2af84b996687aed15093e94c8aaa4 100644 (file)
@@ -22,6 +22,8 @@ import org.opendaylight.protocol.bgp.openconfig.routing.policy.statement.actions
 import org.opendaylight.protocol.bgp.openconfig.routing.policy.statement.actions.SetCommunityHandler;
 import org.opendaylight.protocol.bgp.openconfig.routing.policy.statement.actions.SetExtCommunityHandler;
 import org.opendaylight.protocol.bgp.openconfig.routing.policy.statement.actions.SetOriginatorIdPrependHandler;
+import org.opendaylight.protocol.bgp.openconfig.routing.policy.statement.actions.SetOriginatorIdToAdvertizerRouterIdHandler;
+import org.opendaylight.protocol.bgp.openconfig.routing.policy.statement.conditions.MatchAfiSafiNotInHandler;
 import org.opendaylight.protocol.bgp.openconfig.routing.policy.statement.conditions.MatchAsPathSetHandler;
 import org.opendaylight.protocol.bgp.openconfig.routing.policy.statement.conditions.MatchBgpNeighborSetHandler;
 import org.opendaylight.protocol.bgp.openconfig.routing.policy.statement.conditions.MatchClusterIdSetHandler;
@@ -29,6 +31,7 @@ import org.opendaylight.protocol.bgp.openconfig.routing.policy.statement.conditi
 import org.opendaylight.protocol.bgp.openconfig.routing.policy.statement.conditions.MatchExtCommunitySetHandler;
 import org.opendaylight.protocol.bgp.openconfig.routing.policy.statement.conditions.MatchOriginatorIdSetHandler;
 import org.opendaylight.protocol.bgp.openconfig.routing.policy.statement.conditions.MatchRoleSetHandler;
+import org.opendaylight.protocol.bgp.openconfig.routing.policy.statement.conditions.VpnNonMemberHandler;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.policy.rev151009.bgp.match.conditions.MatchAsPathSet;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.policy.rev151009.bgp.match.conditions.MatchCommunitySet;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.policy.rev151009.bgp.match.conditions.MatchExtCommunitySet;
@@ -36,13 +39,17 @@ 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.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.rev180329.LocalAsPathPrepend;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.odl.bgp._default.policy.rev180329.MatchAfiSafiNotInCondition;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.odl.bgp._default.policy.rev180329.MatchBgpNeighborCondition;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.odl.bgp._default.policy.rev180329.MatchClusterIdSetCondition;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.odl.bgp._default.policy.rev180329.MatchOriginatorIdSetCondition;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.odl.bgp._default.policy.rev180329.MatchRoleSetCondition;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.odl.bgp._default.policy.rev180329.NonTransitiveAttributesFilter;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.odl.bgp._default.policy.rev180329.SetClusterIdPrepend;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.odl.bgp._default.policy.rev180329.SetLocalAddressAsNextHop;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.odl.bgp._default.policy.rev180329.SetOriginatorIdPrepend;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.odl.bgp._default.policy.rev180329.SetOriginatorIdToAdvertizerRouterId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.odl.bgp._default.policy.rev180329.VpnNonMemberCondition;
 
 public final class StatementActivator extends AbstractBGPStatementProviderActivator {
     private final DataBroker dataBroker;
@@ -80,6 +87,12 @@ public final class StatementActivator extends AbstractBGPStatementProviderActiva
 
         registration.add(provider.registerBgpConditionsAugmentationPolicy(MatchBgpNeighborCondition.class,
                 new MatchBgpNeighborSetHandler(this.dataBroker)));
+
+        registration.add(provider.registerBgpConditionsAugmentationPolicy(MatchAfiSafiNotInCondition.class,
+                MatchAfiSafiNotInHandler.getInstance()));
+
+        registration.add(provider.registerBgpConditionsAugmentationPolicy(VpnNonMemberCondition.class,
+                VpnNonMemberHandler.getInstance()));
     }
 
     private void registerActions(final StatementRegistryProvider provider, final List<AutoCloseable> registration) {
@@ -102,5 +115,11 @@ public final class StatementActivator extends AbstractBGPStatementProviderActiva
 
         registration.add(provider.registerBgpActionAugmentationPolicy(SetClusterIdPrepend.class,
                 new SetClusterIdPrependHandler()));
+
+        registration.add(provider.registerBgpActionAugmentationPolicy(SetOriginatorIdToAdvertizerRouterId.class,
+                SetOriginatorIdToAdvertizerRouterIdHandler.getInstance()));
+
+        registration.add(provider.registerBgpActionAugmentationPolicy(SetLocalAddressAsNextHop.class,
+                SetLocalAddressAsNextHopHandler.getInstance()));
     }
 }
diff --git a/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/actions/SetOriginatorIdToAdvertizerRouterIdHandler.java b/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/actions/SetOriginatorIdToAdvertizerRouterIdHandler.java
new file mode 100644 (file)
index 0000000..e757a2b
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * 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.RouterIds;
+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.rev180329.path.attributes.Attributes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.path.attributes.AttributesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.path.attributes.attributes.OriginatorIdBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.PeerId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.odl.bgp._default.policy.rev180329.SetOriginatorIdToAdvertizerRouterId;
+
+/**
+ * Originator attribute shall be set to the router-id of the advertiser.
+ * https://tools.ietf.org/html/rfc4684
+ *
+ * @author Claudio D. Gasparini
+ */
+public final class SetOriginatorIdToAdvertizerRouterIdHandler
+        implements BgpActionAugPolicy<SetOriginatorIdToAdvertizerRouterId> {
+    private static SetOriginatorIdToAdvertizerRouterIdHandler INSTANCE
+            = new SetOriginatorIdToAdvertizerRouterIdHandler();
+
+    private SetOriginatorIdToAdvertizerRouterIdHandler() {
+
+    }
+
+    public static SetOriginatorIdToAdvertizerRouterIdHandler getInstance() {
+        return INSTANCE;
+    }
+
+    @Override
+    public Attributes applyImportAction(
+            final RouteEntryBaseAttributes routeEntryInfo,
+            final BGPRouteEntryImportParameters routeBaseParameters,
+            final Attributes attributes,
+            final SetOriginatorIdToAdvertizerRouterId actions) {
+        return setOriginatorId(attributes, routeBaseParameters.getFromPeerId());
+    }
+
+    private Attributes setOriginatorId(final Attributes attributes, final PeerId peerId) {
+        if (attributes.getOriginatorId() != null) {
+            return attributes;
+        }
+        return new AttributesBuilder(attributes)
+                .setOriginatorId(new OriginatorIdBuilder()
+                        .setOriginator(RouterIds.inetFromPeerId(peerId)).build()).build();
+    }
+
+    @Override
+    public Attributes applyExportAction(
+            final RouteEntryBaseAttributes routeEntryInfo,
+            final BGPRouteEntryExportParameters routeBaseParameters,
+            final Attributes attributes,
+            final SetOriginatorIdToAdvertizerRouterId actions) {
+        return setOriginatorId(attributes, routeBaseParameters.getFromPeerId());
+    }
+}
diff --git a/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/conditions/MatchAfiSafiNotInHandler.java b/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/conditions/MatchAfiSafiNotInHandler.java
new file mode 100644 (file)
index 0000000..5155d0e
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * 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.conditions;
+
+import java.util.List;
+import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.RouteEntryBaseAttributes;
+import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.policy.condition.BgpConditionsAugmentationPolicy;
+import org.opendaylight.protocol.bgp.rib.spi.policy.BGPRouteEntryExportParameters;
+import org.opendaylight.protocol.bgp.rib.spi.policy.BGPRouteEntryImportParameters;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.AfiSafiType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.path.attributes.Attributes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.odl.bgp._default.policy.rev180329.MatchAfiSafiNotInCondition;
+
+/**
+ * Match NLRI does not pertain to specific AFI/SAFI.
+ */
+public final class MatchAfiSafiNotInHandler implements
+        BgpConditionsAugmentationPolicy<MatchAfiSafiNotInCondition, Void> {
+
+    private static final MatchAfiSafiNotInHandler INSTANCE = new MatchAfiSafiNotInHandler();
+
+    private MatchAfiSafiNotInHandler() {
+
+    }
+
+    public static MatchAfiSafiNotInHandler getInstance() {
+        return INSTANCE;
+    }
+
+    private static boolean matchAfiSafi(
+            final Class<? extends AfiSafiType> afiSafi,
+            final List<Class<? extends AfiSafiType>> afiSafiNotIn) {
+        return !afiSafiNotIn.contains(afiSafi);
+    }
+
+    @Override
+    public boolean matchImportCondition(
+            final Class<? extends AfiSafiType> afiSafi,
+            final RouteEntryBaseAttributes routeEntryInfo,
+            final BGPRouteEntryImportParameters routeEntryImportParameters,
+            final Void attributes,
+            final MatchAfiSafiNotInCondition conditions) {
+        return matchAfiSafi(afiSafi, conditions.getAfiSafiNotIn());
+    }
+
+    @Override
+    public boolean matchExportCondition(
+            final Class<? extends AfiSafiType> afiSafi,
+            final RouteEntryBaseAttributes routeEntryInfo,
+            final BGPRouteEntryExportParameters routeEntryExportParameters,
+            final Void attributes,
+            final MatchAfiSafiNotInCondition conditions) {
+        return matchAfiSafi(afiSafi, conditions.getAfiSafiNotIn());
+    }
+
+    @Override
+    public Void getConditionParameter(final Attributes attributes) {
+        return null;
+    }
+}
index 2f86b475113d9485623bdfd0647037b1b29b1e33..d0746257d2cf6754e0611a7c765911471dfbb621 100644 (file)
@@ -35,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.defined.sets.bgp.defined.sets.AsPathSets;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.policy.rev151009.routing.policy.defined.sets.bgp.defined.sets.as.path.sets.AsPathSet;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.policy.rev151009.routing.policy.defined.sets.bgp.defined.sets.as.path.sets.AsPathSetKey;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.AfiSafiType;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.policy.types.rev151009.MatchSetOptionsType;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.routing.policy.rev151009.routing.policy.top.RoutingPolicy;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.routing.policy.rev151009.routing.policy.top.routing.policy.DefinedSets;
@@ -75,6 +76,7 @@ public final class MatchAsPathSetHandler implements BgpConditionsPolicy<MatchAsP
 
     @Override
     public boolean matchImportCondition(
+            final Class<? extends AfiSafiType> afiSafi,
             final RouteEntryBaseAttributes routeEntryInfo,
             final BGPRouteEntryImportParameters routeEntryImportParameters,
             final AsPath asPath,
@@ -86,6 +88,7 @@ public final class MatchAsPathSetHandler implements BgpConditionsPolicy<MatchAsP
 
     @Override
     public boolean matchExportCondition(
+            final Class<? extends AfiSafiType> afiSafi,
             final RouteEntryBaseAttributes routeEntryInfo,
             final BGPRouteEntryExportParameters routeEntryExportParameters,
             final AsPath asPath,
index 4425ebe7d04ca3ac0136672a9e897e479be9cb72..c3c96e6f6d854d2d57068b1704202342843ba21d 100644 (file)
@@ -29,6 +29,7 @@ import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.policy.condit
 import org.opendaylight.protocol.bgp.rib.spi.RouterIds;
 import org.opendaylight.protocol.bgp.rib.spi.policy.BGPRouteEntryExportParameters;
 import org.opendaylight.protocol.bgp.rib.spi.policy.BGPRouteEntryImportParameters;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.AfiSafiType;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.policy.types.rev151009.MatchSetOptionsRestrictedType;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.routing.policy.rev151009.generic.defined.sets.NeighborSets;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.routing.policy.rev151009.neighbor.set.NeighborSet;
@@ -78,6 +79,7 @@ public final class MatchBgpNeighborSetHandler
 
     @Override
     public boolean matchImportCondition(
+            final Class<? extends AfiSafiType> afiSafi,
             final RouteEntryBaseAttributes routeEntryInfo,
             final BGPRouteEntryImportParameters importParameters,
             final Void nonAttributres,
@@ -88,6 +90,7 @@ public final class MatchBgpNeighborSetHandler
 
     @Override
     public boolean matchExportCondition(
+            final Class<? extends AfiSafiType> afiSafi,
             final RouteEntryBaseAttributes routeEntryInfo,
             final BGPRouteEntryExportParameters exportParameters,
             final Void nonAttributres,
index e5675a9ae58738186970ec9eb552ef53cebbd814..64f00f7ae452409511ff4a5beabaafa16b3c1140 100644 (file)
@@ -28,6 +28,7 @@ import org.opendaylight.protocol.bgp.rib.spi.policy.BGPRouteEntryExportParameter
 import org.opendaylight.protocol.bgp.rib.spi.policy.BGPRouteEntryImportParameters;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.policy.rev151009.DefinedSets1;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.policy.rev151009.routing.policy.defined.sets.BgpDefinedSets;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.AfiSafiType;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.policy.types.rev151009.MatchSetOptionsType;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.routing.policy.rev151009.routing.policy.top.RoutingPolicy;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.routing.policy.rev151009.routing.policy.top.routing.policy.DefinedSets;
@@ -72,6 +73,7 @@ public final class MatchClusterIdSetHandler
 
     @Override
     public boolean matchImportCondition(
+            final Class<? extends AfiSafiType> afiSafi,
             final RouteEntryBaseAttributes routeEntryInfo,
             final BGPRouteEntryImportParameters importParameters,
             final ClusterId clusterIdAtt,
@@ -84,6 +86,7 @@ public final class MatchClusterIdSetHandler
 
     @Override
     public boolean matchExportCondition(
+            final Class<? extends AfiSafiType> afiSafi,
             final RouteEntryBaseAttributes routeEntryInfo,
             final BGPRouteEntryExportParameters exportParameters,
             final ClusterId clusterIdAtt,
index 61f2eb20007e61a2426d07da5a7ffb537562fe48..cc8c0db6f0fb4ee943f992c8418f311236225bbd 100644 (file)
@@ -18,6 +18,7 @@ import org.opendaylight.protocol.bgp.openconfig.routing.policy.statement.Abstrac
 import org.opendaylight.protocol.bgp.rib.spi.policy.BGPRouteEntryExportParameters;
 import org.opendaylight.protocol.bgp.rib.spi.policy.BGPRouteEntryImportParameters;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.policy.rev151009.bgp.match.conditions.MatchCommunitySet;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.AfiSafiType;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.policy.types.rev151009.MatchSetOptionsType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.path.attributes.Attributes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.path.attributes.attributes.Communities;
@@ -34,6 +35,7 @@ public final class MatchCommunitySetHandler
 
     @Override
     public boolean matchImportCondition(
+            final Class<? extends AfiSafiType> afiSafi,
             final RouteEntryBaseAttributes routeEntryInfo,
             final BGPRouteEntryImportParameters routeEntryImportParameters,
             final List<Communities> communities,
@@ -43,6 +45,7 @@ public final class MatchCommunitySetHandler
 
     @Override
     public boolean matchExportCondition(
+            final Class<? extends AfiSafiType> afiSafi,
             final RouteEntryBaseAttributes routeEntryInfo,
             final BGPRouteEntryExportParameters routeEntryExportParameters,
             final List<Communities> communities,
index 0b2af9e87b838af28fbe46aa9e166258c6b929fd..330b3db6bfef3d4e1ab0fd7c7045679be73665ce 100644 (file)
@@ -17,6 +17,7 @@ import org.opendaylight.protocol.bgp.openconfig.routing.policy.statement.Abstrac
 import org.opendaylight.protocol.bgp.rib.spi.policy.BGPRouteEntryExportParameters;
 import org.opendaylight.protocol.bgp.rib.spi.policy.BGPRouteEntryImportParameters;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.policy.rev151009.bgp.match.conditions.MatchExtCommunitySet;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.AfiSafiType;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.policy.types.rev151009.MatchSetOptionsType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.path.attributes.Attributes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.path.attributes.attributes.ExtendedCommunities;
@@ -64,6 +65,7 @@ public final class MatchExtCommunitySetHandler extends AbstractExtCommunityHandl
 
     @Override
     public boolean matchImportCondition(
+            final Class<? extends AfiSafiType> afiSafi,
             final RouteEntryBaseAttributes routeEntryInfo,
             final BGPRouteEntryImportParameters routeEntryImportParameters,
             final List<ExtendedCommunities> extendedCommunities,
@@ -74,6 +76,7 @@ public final class MatchExtCommunitySetHandler extends AbstractExtCommunityHandl
 
     @Override
     public boolean matchExportCondition(
+            final Class<? extends AfiSafiType> afiSafi,
             final RouteEntryBaseAttributes routeEntryInfo,
             final BGPRouteEntryExportParameters routeEntryExportParameters,
             final List<ExtendedCommunities> extendedCommunities,
index 3c16faed7acf4b6cfbc9b3cc0ae5fe0b48b4678c..04236c6bd18a3a450ded6fed032d8173c6e996c9 100644 (file)
@@ -25,6 +25,7 @@ import org.opendaylight.protocol.bgp.rib.spi.policy.BGPRouteEntryExportParameter
 import org.opendaylight.protocol.bgp.rib.spi.policy.BGPRouteEntryImportParameters;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.policy.rev151009.DefinedSets1;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.policy.rev151009.routing.policy.defined.sets.BgpDefinedSets;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.AfiSafiType;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.policy.types.rev151009.MatchSetOptionsRestrictedType;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.routing.policy.rev151009.routing.policy.top.RoutingPolicy;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.routing.policy.rev151009.routing.policy.top.routing.policy.DefinedSets;
@@ -69,6 +70,7 @@ public final class MatchOriginatorIdSetHandler
 
     @Override
     public boolean matchImportCondition(
+            final Class<? extends AfiSafiType> afiSafi,
             final RouteEntryBaseAttributes routeEntryInfo,
             final BGPRouteEntryImportParameters routeEntryImportParameters,
             final OriginatorId originatorId,
@@ -80,6 +82,7 @@ public final class MatchOriginatorIdSetHandler
 
     @Override
     public boolean matchExportCondition(
+            final Class<? extends AfiSafiType> afiSafi,
             final RouteEntryBaseAttributes routeEntryInfo,
             final BGPRouteEntryExportParameters routeEntryExportParameters,
             final OriginatorId originatorId,
index 874899a1a9f6081f1e5f5775e83baebf87d6b3b0..ed870e351deabe28e07ea8c8d47a1e870c1cde58 100644 (file)
@@ -27,6 +27,7 @@ import org.opendaylight.protocol.bgp.rib.spi.policy.BGPRouteEntryExportParameter
 import org.opendaylight.protocol.bgp.rib.spi.policy.BGPRouteEntryImportParameters;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.policy.rev151009.DefinedSets1;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.policy.rev151009.routing.policy.defined.sets.BgpDefinedSets;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.AfiSafiType;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.policy.types.rev151009.MatchSetOptionsRestrictedType;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.routing.policy.rev151009.routing.policy.top.RoutingPolicy;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.routing.policy.rev151009.routing.policy.top.routing.policy.DefinedSets;
@@ -75,6 +76,7 @@ public final class MatchRoleSetHandler implements BgpConditionsAugmentationPolic
 
     @Override
     public boolean matchImportCondition(
+            final Class<? extends AfiSafiType> afiSafi,
             final RouteEntryBaseAttributes routeEntryInfo,
             final BGPRouteEntryImportParameters importParameters,
             final Void attributes,
@@ -118,6 +120,7 @@ public final class MatchRoleSetHandler implements BgpConditionsAugmentationPolic
 
     @Override
     public boolean matchExportCondition(
+            final Class<? extends AfiSafiType> afiSafi,
             final RouteEntryBaseAttributes routeEntryInfo,
             final BGPRouteEntryExportParameters exportParameters,
             final Void attributes,
diff --git a/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/conditions/VpnNonMemberHandler.java b/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/conditions/VpnNonMemberHandler.java
new file mode 100644 (file)
index 0000000..096af45
--- /dev/null
@@ -0,0 +1,96 @@
+/*
+ * 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.conditions;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.RouteEntryBaseAttributes;
+import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.policy.condition.BgpConditionsAugmentationPolicy;
+import org.opendaylight.protocol.bgp.rib.spi.policy.BGPRouteEntryExportParameters;
+import org.opendaylight.protocol.bgp.rib.spi.policy.BGPRouteEntryImportParameters;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.AfiSafiType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.path.attributes.Attributes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.path.attributes.attributes.ExtendedCommunities;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.RouteTarget;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.extended.community.ExtendedCommunity;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.extended.community.extended.community.As4RouteTargetExtendedCommunityCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.extended.community.extended.community.RouteTargetExtendedCommunityCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.extended.community.extended.community.RouteTargetIpv4Case;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.route.target.constrain._default.route.grouping.RouteTargetConstrainDefaultRoute;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.route.target.constrain._default.route.grouping.RouteTargetConstrainDefaultRouteBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.odl.bgp._default.policy.rev180329.VpnNonMemberCondition;
+
+/**
+ * Returns true if Route Target extended communities attributes are not part of the VPN membership of destiny peer.
+ *
+ * @author Claudio D. Gasparini
+ */
+public final class VpnNonMemberHandler implements
+        BgpConditionsAugmentationPolicy<VpnNonMemberCondition, List<ExtendedCommunities>> {
+    private static final VpnNonMemberHandler INSTANCE = new VpnNonMemberHandler();
+    private static final RouteTargetConstrainDefaultRoute DEFAULT = new RouteTargetConstrainDefaultRouteBuilder()
+            .build();
+
+    private VpnNonMemberHandler() {
+
+    }
+
+    public static VpnNonMemberHandler getInstance() {
+        return INSTANCE;
+    }
+
+    @Override
+    public boolean matchImportCondition(
+            final Class<? extends AfiSafiType> afiSafiType,
+            final RouteEntryBaseAttributes routeEntryInfo,
+            final BGPRouteEntryImportParameters routeEntryImportParameters,
+            final List<ExtendedCommunities> attributes,
+            final VpnNonMemberCondition conditions) {
+        return false;
+    }
+
+    @Override
+    public boolean matchExportCondition(
+            final Class<? extends AfiSafiType> afiSafiType,
+            final RouteEntryBaseAttributes routeEntryInfo,
+            final BGPRouteEntryExportParameters routeEntryExportParameters,
+            final List<ExtendedCommunities> attributes,
+            final VpnNonMemberCondition conditions) {
+        final List<RouteTarget> allowedRouteTarget = routeEntryExportParameters.getMemberships();
+        if (allowedRouteTarget.contains(DEFAULT)) {
+            return false;
+        }
+        final List<RouteTarget> toRT = attributes.stream()
+                .map(ext -> ext.getExtendedCommunity())
+                .filter(this::filterRTExtComm)
+                .map(this::extendedCommunityToRouteTarget)
+                .collect(Collectors.toList());
+        return Collections.disjoint(allowedRouteTarget, toRT);
+    }
+
+    private RouteTarget extendedCommunityToRouteTarget(final ExtendedCommunity rt) {
+        if (rt instanceof RouteTargetExtendedCommunityCase) {
+            return ((RouteTargetExtendedCommunityCase) rt).getRouteTargetExtendedCommunity();
+        } else if (rt instanceof As4RouteTargetExtendedCommunityCase) {
+            return ((As4RouteTargetExtendedCommunityCase) rt).getAs4RouteTargetExtendedCommunity();
+        }
+        return ((RouteTargetIpv4Case) rt).getRouteTargetIpv4();
+    }
+
+    private boolean filterRTExtComm(final ExtendedCommunity rt) {
+        return rt instanceof RouteTargetExtendedCommunityCase || rt instanceof As4RouteTargetExtendedCommunityCase
+                || rt instanceof RouteTargetIpv4Case;
+    }
+
+    @Override
+    public List<ExtendedCommunities> getConditionParameter(final Attributes attributes) {
+        return attributes.getExtendedCommunities();
+    }
+}
diff --git a/bgp/openconfig-rp-statement/src/test/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/MatchAfiSafiNotInTest.java b/bgp/openconfig-rp-statement/src/test/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/MatchAfiSafiNotInTest.java
new file mode 100644 (file)
index 0000000..05c43f4
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * 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;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.registry.RouteAttributeContainer.routeAttributeContainerFalse;
+
+import java.util.Collections;
+import java.util.List;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.opendaylight.protocol.bgp.openconfig.routing.policy.impl.PolicyRIBBaseParametersImpl;
+import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.registry.RouteAttributeContainer;
+import org.opendaylight.protocol.bgp.rib.spi.policy.BGPRouteEntryExportParameters;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV4UNICAST;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV6UNICAST;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.routing.policy.rev151009.routing.policy.top.routing.policy.policy.definitions.policy.definition.statements.Statement;
+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.rev180329.path.attributes.AttributesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.path.attributes.attributes.ExtendedCommunitiesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.as._4.spec.common.As4SpecificCommonBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.extended.community.extended.community.As4RouteOriginExtendedCommunityCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.extended.community.extended.community.as._4.route.origin.extended.community._case.As4RouteOriginExtendedCommunityBuilder;
+
+public class MatchAfiSafiNotInTest extends AbstractStatementRegistryConsumerTest {
+    @Mock
+    private BGPRouteEntryExportParameters exportParameters;
+    private List<Statement> basicStatements;
+    private PolicyRIBBaseParametersImpl baseAttributes;
+
+    @Before
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+        this.basicStatements = loadStatement("match-afi-safi-not-in-test");
+        this.baseAttributes = new PolicyRIBBaseParametersImpl(LOCAL_AS, IPV4, CLUSTER);
+    }
+
+    @Test
+    public void testExtComAny() {
+        Statement statement = this.basicStatements.stream()
+                .filter(st -> st.getName().equals("match-afi-safi-not-in-test")).findFirst().get();
+        RouteAttributeContainer attributeContainer = routeAttributeContainerFalse(
+                new AttributesBuilder().build());
+        RouteAttributeContainer result = this.statementRegistry.applyExportStatement(
+                this.baseAttributes,
+                IPV4UNICAST.class,
+                this.exportParameters,
+                attributeContainer,
+                statement);
+        assertNotNull(result.getAttributes());
+
+
+        attributeContainer = routeAttributeContainerFalse(new AttributesBuilder()
+                .setExtendedCommunities(Collections.singletonList(new ExtendedCommunitiesBuilder()
+                        .setExtendedCommunity(new As4RouteOriginExtendedCommunityCaseBuilder()
+                                .setAs4RouteOriginExtendedCommunity(new As4RouteOriginExtendedCommunityBuilder()
+                                        .setAs4SpecificCommon(new As4SpecificCommonBuilder()
+                                                .setAsNumber(AsNumber.getDefaultInstance("65000"))
+                                                .setLocalAdministrator(123)
+                                                .build()).build()).build()).build())).build());
+
+        result = this.statementRegistry.applyExportStatement(
+                this.baseAttributes,
+                IPV6UNICAST.class,
+                this.exportParameters,
+                attributeContainer,
+                statement);
+        assertNull(result.getAttributes());
+    }
+}
\ No newline at end of file
diff --git a/bgp/openconfig-rp-statement/src/test/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/SetLocalAddressAsNextHopHandlerTest.java b/bgp/openconfig-rp-statement/src/test/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/SetLocalAddressAsNextHopHandlerTest.java
new file mode 100644 (file)
index 0000000..fe71d7d
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ * 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;
+
+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 java.util.List;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.opendaylight.protocol.bgp.openconfig.routing.policy.impl.PolicyRIBBaseParametersImpl;
+import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.registry.RouteAttributeContainer;
+import org.opendaylight.protocol.bgp.rib.spi.policy.BGPRouteEntryExportParameters;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV4UNICAST;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.routing.policy.rev151009.routing.policy.top.routing.policy.policy.definitions.policy.definition.statements.Statement;
+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.rev180329.path.attributes.Attributes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.path.attributes.AttributesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.PeerRole;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.next.hop.c.next.hop.Ipv4NextHopCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.next.hop.c.next.hop.ipv4.next.hop._case.Ipv4NextHopBuilder;
+
+public class SetLocalAddressAsNextHopHandlerTest extends AbstractStatementRegistryConsumerTest {
+    private final Attributes multipleCom = new AttributesBuilder()
+            .setCNextHop(new Ipv4NextHopCaseBuilder().setIpv4NextHop(new Ipv4NextHopBuilder()
+                    .setGlobal(new Ipv4Address("1.2.3.4")).build()).build())
+            .build();
+    @Mock
+    private BGPRouteEntryExportParameters exportParameters;
+    private List<Statement> basicStatements;
+    private PolicyRIBBaseParametersImpl baseAttributes;
+
+    @Before
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+        this.basicStatements = loadStatement("set-local-address-as-next-hop");
+        this.baseAttributes = new PolicyRIBBaseParametersImpl(LOCAL_AS, IPV4, CLUSTER);
+        doReturn(PeerRole.Ibgp).when(this.exportParameters).getFromPeerRole();
+    }
+
+    @Test
+    public void testInlineAdd() {
+        Statement statement = this.basicStatements.stream()
+                .filter(st -> st.getName().equals("set-local-address-as-next-hop")).findFirst().get();
+        RouteAttributeContainer attributeContainer = routeAttributeContainerFalse(
+                new AttributesBuilder().build());
+        RouteAttributeContainer result = this.statementRegistry.applyExportStatement(
+                this.baseAttributes,
+                IPV4UNICAST.class,
+                this.exportParameters,
+                attributeContainer,
+                statement);
+
+        assertEquals(this.multipleCom, result.getAttributes());
+    }
+}
\ No newline at end of file
diff --git a/bgp/openconfig-rp-statement/src/test/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/SetOriginatorIdToAdvertizerRouterIdHandlerTest.java b/bgp/openconfig-rp-statement/src/test/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/SetOriginatorIdToAdvertizerRouterIdHandlerTest.java
new file mode 100644 (file)
index 0000000..919e3d0
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * 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;
+
+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 java.util.List;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.opendaylight.protocol.bgp.openconfig.routing.policy.impl.PolicyRIBBaseParametersImpl;
+import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.registry.RouteAttributeContainer;
+import org.opendaylight.protocol.bgp.rib.spi.RouterIds;
+import org.opendaylight.protocol.bgp.rib.spi.policy.BGPRouteEntryExportParameters;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV4UNICAST;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.routing.policy.rev151009.routing.policy.top.routing.policy.policy.definitions.policy.definition.statements.Statement;
+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.rev180329.path.attributes.Attributes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.path.attributes.AttributesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.path.attributes.attributes.OriginatorIdBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.PeerRole;
+
+public class SetOriginatorIdToAdvertizerRouterIdHandlerTest extends AbstractStatementRegistryConsumerTest {
+    private Ipv4Address ipv4 = Ipv4Address.getDefaultInstance("42.42.42.42");
+    private final Attributes multipleCom = new AttributesBuilder()
+            .setOriginatorId(new OriginatorIdBuilder().setOriginator(ipv4).build())
+            .build();
+    @Mock
+    private BGPRouteEntryExportParameters exportParameters;
+    private List<Statement> basicStatements;
+    private PolicyRIBBaseParametersImpl baseAttributes;
+
+    @Before
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+        this.basicStatements = loadStatement("set-originator-id-to-advertizer-router-id");
+        this.baseAttributes = new PolicyRIBBaseParametersImpl(LOCAL_AS, IPV4, CLUSTER);
+        doReturn(PeerRole.Ibgp).when(this.exportParameters).getFromPeerRole();
+        doReturn(RouterIds.createPeerId(ipv4)).when(this.exportParameters).getFromPeerId();
+    }
+
+    @Test
+    public void testInlineAdd() {
+        Statement statement = this.basicStatements.stream()
+                .filter(st -> st.getName().equals("set-originator-id-to-advertizer-router-id")).findFirst().get();
+        RouteAttributeContainer attributeContainer = routeAttributeContainerFalse(
+                new AttributesBuilder().build());
+        RouteAttributeContainer result = this.statementRegistry.applyExportStatement(
+                this.baseAttributes,
+                IPV4UNICAST.class,
+                this.exportParameters,
+                attributeContainer,
+                statement);
+
+        assertEquals(this.multipleCom, result.getAttributes());
+    }
+}
\ No newline at end of file
diff --git a/bgp/openconfig-rp-statement/src/test/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/VpnNonMemberHandlerTest.java b/bgp/openconfig-rp-statement/src/test/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/VpnNonMemberHandlerTest.java
new file mode 100644 (file)
index 0000000..a2495f3
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ * 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;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.mockito.Mockito.doReturn;
+import static org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.registry.RouteAttributeContainer.routeAttributeContainerFalse;
+
+import java.util.Collections;
+import java.util.List;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.opendaylight.protocol.bgp.openconfig.routing.policy.impl.PolicyRIBBaseParametersImpl;
+import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.registry.RouteAttributeContainer;
+import org.opendaylight.protocol.bgp.rib.spi.policy.BGPRouteEntryExportParameters;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV4UNICAST;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.routing.policy.rev151009.routing.policy.top.routing.policy.policy.definitions.policy.definition.statements.Statement;
+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.rev180329.path.attributes.AttributesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.path.attributes.attributes.ExtendedCommunitiesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.as._4.route.target.extended.community.grouping.As4RouteTargetExtendedCommunity;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.as._4.route.target.extended.community.grouping.As4RouteTargetExtendedCommunityBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.as._4.spec.common.As4SpecificCommon;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.as._4.spec.common.As4SpecificCommonBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.extended.community.extended.community.As4RouteTargetExtendedCommunityCaseBuilder;
+
+public class VpnNonMemberHandlerTest extends AbstractStatementRegistryConsumerTest {
+    private static final As4SpecificCommon AS_COMMON = new As4SpecificCommonBuilder()
+            .setAsNumber(new AsNumber(20L)).setLocalAdministrator(100).build();
+
+    private static final As4RouteTargetExtendedCommunity RT = new As4RouteTargetExtendedCommunityBuilder()
+            .setAs4SpecificCommon(AS_COMMON).build();
+    @Mock
+    private BGPRouteEntryExportParameters exportParameters;
+    private List<Statement> basicStatements;
+    private PolicyRIBBaseParametersImpl baseAttributes;
+
+    @Before
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+        this.basicStatements = loadStatement("vpn-non-member-test");
+        this.baseAttributes = new PolicyRIBBaseParametersImpl(LOCAL_AS, IPV4, CLUSTER);
+    }
+
+    @Test
+    public void testExtComAny() {
+        Statement statement = this.basicStatements.stream()
+                .filter(st -> st.getName().equals("vpn-non-member-test")).findFirst().get();
+        RouteAttributeContainer attributeContainer = routeAttributeContainerFalse(
+                new AttributesBuilder()
+                        .setExtendedCommunities(Collections.singletonList(new ExtendedCommunitiesBuilder()
+                                .setExtendedCommunity(new As4RouteTargetExtendedCommunityCaseBuilder()
+                                        .setAs4RouteTargetExtendedCommunity(RT).build()).build())).build());
+
+        doReturn(Collections.singletonList(RT)).when(this.exportParameters).getMemberships();
+
+        RouteAttributeContainer result = this.statementRegistry.applyExportStatement(
+                this.baseAttributes,
+                IPV4UNICAST.class,
+                this.exportParameters,
+                attributeContainer,
+                statement);
+        assertNotNull(result.getAttributes());
+
+        doReturn(Collections.emptyList()).when(this.exportParameters).getMemberships();
+
+        result = this.statementRegistry.applyExportStatement(
+                this.baseAttributes,
+                IPV4UNICAST.class,
+                this.exportParameters,
+                attributeContainer,
+                statement);
+        assertNull(result.getAttributes());
+    }
+}
\ No newline at end of file
index f7cc95f73e083a4366228a98d461964838a4b9d5..cca95b1394fcf28872849f2097f5191fc76b969b 100644 (file)
                 </statement>
             </statements>
         </policy-definition>
+        <policy-definition>
+            <name>match-afi-safi-not-in-test</name>
+            <statements>
+                <statement>
+                    <name>match-afi-safi-not-in-test</name>
+                    <conditions>
+                        <bgp-conditions xmlns="http://openconfig.net/yang/bgp-policy">
+                            <afi-safi-not-in xmlns="urn:opendaylight:params:xml:ns:yang:odl:bgp:default:policy"
+                                             xmlns:x="http://openconfig.net/yang/bgp-types">x:IPV4-UNICAST</afi-safi-not-in>
+                        </bgp-conditions>
+                    </conditions>
+                    <actions>
+                        <reject-route/>
+                    </actions>
+                </statement>
+            </statements>
+        </policy-definition>
+        <policy-definition>
+            <name>set-originator-id-to-advertizer-router-id</name>
+            <statements>
+                <statement>
+                    <name>set-originator-id-to-advertizer-router-id</name>
+                    <conditions>
+                        <bgp-conditions xmlns="http://openconfig.net/yang/bgp-policy">
+                            <match-role-set xmlns="urn:opendaylight:params:xml:ns:yang:odl:bgp:default:policy">
+                                <from-role>
+                                    <role-set>
+                                        /rpol:routing-policy/rpol:defined-sets/bgppol:bgp-defined-sets/role-sets/role-set[role-set-name="all"]
+                                    </role-set>
+                                </from-role>
+                            </match-role-set>
+                        </bgp-conditions>
+                    </conditions>
+                    <actions>
+                        <bgp-actions xmlns="http://openconfig.net/yang/bgp-policy">
+                            <set-originator-id-to-advertizer-router-id xmlns="urn:opendaylight:params:xml:ns:yang:odl:bgp:default:policy"/>
+                        </bgp-actions>
+                    </actions>
+                </statement>
+            </statements>
+        </policy-definition>
+        <policy-definition>
+            <name>set-local-address-as-next-hop</name>
+            <statements>
+                <statement>
+                    <name>set-local-address-as-next-hop</name>
+                    <conditions>
+                        <bgp-conditions xmlns="http://openconfig.net/yang/bgp-policy">
+                            <match-role-set xmlns="urn:opendaylight:params:xml:ns:yang:odl:bgp:default:policy">
+                                <from-role>
+                                    <role-set>
+                                        /rpol:routing-policy/rpol:defined-sets/bgppol:bgp-defined-sets/role-sets/role-set[role-set-name="all"]
+                                    </role-set>
+                                </from-role>
+                            </match-role-set>
+                        </bgp-conditions>
+                    </conditions>
+                    <actions>
+                        <bgp-actions xmlns="http://openconfig.net/yang/bgp-policy">
+                            <set-local-address-as-next-hop xmlns="urn:opendaylight:params:xml:ns:yang:odl:bgp:default:policy"/>
+                        </bgp-actions>
+                    </actions>
+                </statement>
+            </statements>
+        </policy-definition>
+        <policy-definition>
+            <name>vpn-non-member-test</name>
+            <statements>
+                <statement>
+                    <name>vpn-non-member-test</name>
+                    <conditions>
+                        <bgp-conditions xmlns="http://openconfig.net/yang/bgp-policy">
+                            <vpn-non-member xmlns="urn:opendaylight:params:xml:ns:yang:odl:bgp:default:policy"/>
+                        </bgp-conditions>
+                    </conditions>
+                    <actions>
+                        <reject-route/>
+                    </actions>
+                </statement>
+            </statements>
+        </policy-definition>
     </policy-definitions>
     <defined-sets>
         <bgp-defined-sets xmlns="http://openconfig.net/yang/bgp-policy">
index 8bd10cc85fc78ce57727c4fd30e9c74b0fa06f08..34b0c0d57abc1272980f13e0ef0b9d2918b4465d 100644 (file)
@@ -7,12 +7,14 @@
  */
 package org.opendaylight.protocol.bgp.mode.impl;
 
+import java.util.List;
 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.rev180329.PeerId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.PeerRole;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.ClusterIdentifier;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.RouteTarget;
 
 public final class BGPRouteEntryExportParametersImpl implements BGPRouteEntryExportParameters {
     private final Peer fromPeer;
@@ -57,4 +59,9 @@ public final class BGPRouteEntryExportParametersImpl implements BGPRouteEntryExp
     public PeerId getToPeerId() {
         return this.toPeer.getPeerId();
     }
+
+    @Override
+    public List<RouteTarget> getMemberships() {
+        return this.toPeer.getMemberships();
+    }
 }
index ad81f3c8c67b70854b16b3279da60da7f9cc7c98..6d91e7415e33e5d90a798e508edfb646815f0236 100644 (file)
@@ -20,6 +20,7 @@ import com.google.common.util.concurrent.MoreExecutors;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
 import org.opendaylight.controller.md.sal.common.api.data.AsyncTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
@@ -51,6 +52,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.bgp.rib.rib.peer.AdjRibOut;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.rib.Tables;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.rib.TablesKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.RouteTarget;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
@@ -101,6 +103,11 @@ public class ApplicationPeer extends AbstractPeer implements ClusteredDOMDataTre
     private AbstractRegistration trackerRegistration;
     private YangInstanceIdentifier peerPath;
 
+    @Override
+    public List<RouteTarget> getMemberships() {
+        return Collections.emptyList();
+    }
+
     @FunctionalInterface
     interface RegisterAppPeerListener {
         /**
index 98c06d212c51a2794247b60a9f758321f7a05392..ec1624c4b72c81492894b2ad6144cbf03c203f91 100644 (file)
@@ -82,6 +82,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.AddressFamily;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.ClusterIdentifier;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.Ipv4AddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.RouteTarget;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.SubsequentAddressFamily;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.UnicastSubsequentAddressFamily;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
@@ -101,6 +102,7 @@ public class BGPPeer extends AbstractPeer implements BGPSessionListener {
     private Set<TablesKey> tables = Collections.emptySet();
     private final RIB rib;
     private final Map<TablesKey, AdjRibOutListener> adjRibOutListenerSet = new HashMap<>();
+    private final List<RouteTarget> rtMemberships = new ArrayList<>();
     private final RpcProviderRegistry rpcRegistry;
     private final BGPTableTypeRegistryConsumer tableTypeRegistry;
     private InstanceIdentifier<AdjRibOut> peerRibOutIId;
@@ -500,4 +502,9 @@ public class BGPPeer extends AbstractPeer implements BGPSessionListener {
         }
         return null;
     }
+
+    @Override
+    public List<RouteTarget> getMemberships() {
+        return this.rtMemberships;
+    }
 }
index 5d8269cf87bdaed9a4ca952b5f0fc9e334546685..7e44c9056f17f1b58034f85793b729db6ee0e8d1 100644 (file)
@@ -14,6 +14,7 @@ import org.opendaylight.protocol.bgp.rib.spi.entry.ActualBestPathRoutes;
 import org.opendaylight.protocol.bgp.rib.spi.entry.AdvertizedRoute;
 import org.opendaylight.protocol.bgp.rib.spi.entry.RouteEntryDependenciesContainer;
 import org.opendaylight.protocol.bgp.rib.spi.entry.StaleBestPathRoute;
+import org.opendaylight.protocol.bgp.rib.spi.policy.RouteTargetMembershipConsumer;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.Route;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.rib.Tables;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.rib.tables.Routes;
@@ -26,7 +27,7 @@ import org.opendaylight.yangtools.yang.binding.Identifier;
 /**
  * Marker interface identifying a BGP peer.
  */
-public interface Peer extends PeerTrackerInformation {
+public interface Peer extends PeerTrackerInformation, RouteTargetMembershipConsumer {
     /**
      * Return peer's symbolic name.
      *
@@ -74,5 +75,5 @@ public interface Peer extends PeerTrackerInformation {
             R extends Route & ChildOf<? super S> & Identifiable<I>,
             I extends Identifier<R>> void initializeRibOut(
             @Nonnull RouteEntryDependenciesContainer entryDep,
-            List<ActualBestPathRoutes<C, S, R, I>> routes);
+            @Nonnull List<ActualBestPathRoutes<C, S, R, I>> routes);
 }
index bcc87e99e2f6da85f3eb4f521d1e8307f309e110..a7fb36b246cc9d8e2734301f9a29c2eb2e58b5ba 100644 (file)
@@ -71,4 +71,9 @@ public final class RouterIds {
         final String inet4Address = InetAddresses.fromInteger(intAddress.intValue()).getHostAddress();
         return new PeerId(BGP_PREFIX.concat(inet4Address));
     }
+
+    public static Ipv4Address inetFromPeerId(@Nonnull final PeerId peerId) {
+        final String inet4Address = peerId.getValue().replace(BGP_PREFIX, "");
+        return new Ipv4Address(inet4Address);
+    }
 }
index f60580d9b9fe242e30b919e28c105b65f4f67bdc..8a580b65e4273ff8bf7fabba7f049926efeceaaa 100644 (file)
@@ -21,14 +21,14 @@ public interface BGPRibRoutingPolicy {
      *
      * @param policyParameters containing attributes and sender peer information
      * @param attributes       Route attributes
-     * @param afiSafType       Afi Safi Type
+     * @param afiSafiType       Afi Safi Type
      * @return modified route attributes after apply policies
      */
     @Nonnull
     Optional<Attributes> applyImportPolicies(
             @Nonnull BGPRouteEntryImportParameters policyParameters,
             @Nonnull Attributes attributes,
-            @Nonnull Class<? extends AfiSafiType> afiSafType
+            @Nonnull Class<? extends AfiSafiType> afiSafiType
     );
 
     /**
index 982272ea7966f6d73863e67c8791d24d9db285e2..498511d2bcc1b0e418275125a609df7864e75308 100644 (file)
@@ -16,7 +16,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.
 /**
  * Contains Peer destiny information for export route entry.
  */
-public interface BGPRouteEntryExportParameters extends BGPRouteEntryImportParameters {
+public interface BGPRouteEntryExportParameters extends RouteTargetMembershipConsumer, BGPRouteEntryImportParameters {
 
     /**
      * Peer id of Peer route entry destiny.
diff --git a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/policy/RouteTargetMembershipConsumer.java b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/policy/RouteTargetMembershipConsumer.java
new file mode 100644 (file)
index 0000000..50b9186
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * Copyright (c) 2018 AT&T Intellectual Property. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.protocol.bgp.rib.spi.policy;
+
+import java.util.List;
+import javax.annotation.Nonnull;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.RouteTarget;
+
+/**
+ * Peer VPN Memberships.
+ */
+public interface RouteTargetMembershipConsumer {
+    /**
+     * Returns list of Route target advertized per Peer.
+     */
+    @Nonnull
+    List<RouteTarget> getMemberships();
+}