From: Claudio D. Gasparini Date: Fri, 22 Jun 2018 06:03:58 +0000 (+0200) Subject: Route Constrain policies X-Git-Tag: release/fluorine~36 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=4c8501e742a17f31a8302254f9f1d5e5a659e273;p=bgpcep.git Route Constrain policies 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 --- diff --git a/bgp/concepts/src/main/yang/bgp-types.yang b/bgp/concepts/src/main/yang/bgp-types.yang index b19b1ded0e..03e1abce0b 100644 --- a/bgp/concepts/src/main/yang/bgp-types.yang +++ b/bgp/concepts/src/main/yang/bgp-types.yang @@ -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; } } diff --git a/bgp/extensions/route-target/src/main/java/org/opendaylight/protocol/bgp/route/targetcontrain/impl/nlri/RouteTargetDefaultHandler.java b/bgp/extensions/route-target/src/main/java/org/opendaylight/protocol/bgp/route/targetcontrain/impl/nlri/RouteTargetDefaultHandler.java index e760ad7728..b1faf96efe 100644 --- a/bgp/extensions/route-target/src/main/java/org/opendaylight/protocol/bgp/route/targetcontrain/impl/nlri/RouteTargetDefaultHandler.java +++ b/bgp/extensions/route-target/src/main/java/org/opendaylight/protocol/bgp/route/targetcontrain/impl/nlri/RouteTargetDefaultHandler.java @@ -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. diff --git a/bgp/extensions/route-target/src/main/yang/bgp-route-target-constrain.yang b/bgp/extensions/route-target/src/main/yang/bgp-route-target-constrain.yang index e65989d2b6..ea06319201 100644 --- a/bgp/extensions/route-target/src/main/yang/bgp-route-target-constrain.yang +++ b/bgp/extensions/route-target/src/main/yang/bgp-route-target-constrain.yang @@ -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; diff --git a/bgp/extensions/route-target/src/test/java/org/opendaylight/protocol/bgp/route/targetcontrain/impl/nlri/SimpleRouteTargetConstrainNlriRegistryTest.java b/bgp/extensions/route-target/src/test/java/org/opendaylight/protocol/bgp/route/targetcontrain/impl/nlri/SimpleRouteTargetConstrainNlriRegistryTest.java index a892bee4fa..8356955eee 100644 --- a/bgp/extensions/route-target/src/test/java/org/opendaylight/protocol/bgp/route/targetcontrain/impl/nlri/SimpleRouteTargetConstrainNlriRegistryTest.java +++ b/bgp/extensions/route-target/src/test/java/org/opendaylight/protocol/bgp/route/targetcontrain/impl/nlri/SimpleRouteTargetConstrainNlriRegistryTest.java @@ -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; diff --git a/bgp/openconfig-api/src/main/yang/odl-bgp-default-policy.yang b/bgp/openconfig-api/src/main/yang/odl-bgp-default-policy.yang index 24d8739c2f..e2c57e38bd 100644 --- a/bgp/openconfig-api/src/main/yang/odl-bgp-default-policy.yang +++ b/bgp/openconfig-api/src/main/yang/odl-bgp-default-policy.yang @@ -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 { diff --git a/bgp/openconfig-rp-impl/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/impl/BGPRibPolicyImpl.java b/bgp/openconfig-rp-impl/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/impl/BGPRibPolicyImpl.java index 20c8eaf366..3fd2ed0491 100644 --- a/bgp/openconfig-rp-impl/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/impl/BGPRibPolicyImpl.java +++ b/bgp/openconfig-rp-impl/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/impl/BGPRibPolicyImpl.java @@ -98,12 +98,12 @@ final class BGPRibPolicyImpl implements BGPRibRoutingPolicy { @Override public Optional applyImportPolicies(final BGPRouteEntryImportParameters policyParameters, - final Attributes attributes, final Class afiSafi) { + final Attributes attributes, final Class 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); } } diff --git a/bgp/openconfig-rp-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/spi/policy/condition/ConditionsPolicy.java b/bgp/openconfig-rp-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/spi/policy/condition/ConditionsPolicy.java index 0e4fd675d1..68de765bd7 100644 --- a/bgp/openconfig-rp-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/spi/policy/condition/ConditionsPolicy.java +++ b/bgp/openconfig-rp-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/spi/policy/condition/ConditionsPolicy.java @@ -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 { /** * 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 { * @return true if all defined condition matches */ boolean matchImportCondition( + @Nonnull Class afiSafiType, @Nonnull RouteEntryBaseAttributes routeEntryInfo, @Nonnull BGPRouteEntryImportParameters routeEntryImportParameters, @Nullable N attributes, @@ -37,6 +40,7 @@ public interface ConditionsPolicy { /** * 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 { * @return true if all defined condition matches */ boolean matchExportCondition( + @Nonnull Class afiSafiType, @Nonnull RouteEntryBaseAttributes routeEntryInfo, @Nonnull BGPRouteEntryExportParameters routeEntryExportParameters, @Nullable N attributes, diff --git a/bgp/openconfig-rp-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/spi/registry/BgpConditionsRegistry.java b/bgp/openconfig-rp-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/spi/registry/BgpConditionsRegistry.java index 7626a1db00..786798c16c 100644 --- a/bgp/openconfig-rp-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/spi/registry/BgpConditionsRegistry.java +++ b/bgp/openconfig-rp-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/spi/registry/BgpConditionsRegistry.java @@ -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; } diff --git a/bgp/openconfig-rp-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/spi/registry/ConditionsRegistryImpl.java b/bgp/openconfig-rp-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/spi/registry/ConditionsRegistryImpl.java index 7e96d1d2e3..74dfc8ce80 100644 --- a/bgp/openconfig-rp-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/spi/registry/ConditionsRegistryImpl.java +++ b/bgp/openconfig-rp-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/spi/registry/ConditionsRegistryImpl.java @@ -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 conditionConfig = (Augmentation) 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 index 0000000000..a5768b532d --- /dev/null +++ b/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/SetLocalAddressAsNextHopHandler.java @@ -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 { + 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()); + } +} diff --git a/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/StatementActivator.java b/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/StatementActivator.java index 89ab5263d6..c1e3f29a6a 100644 --- a/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/StatementActivator.java +++ b/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/StatementActivator.java @@ -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 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 index 0000000000..e757a2b7bb --- /dev/null +++ b/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/actions/SetOriginatorIdToAdvertizerRouterIdHandler.java @@ -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 { + 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 index 0000000000..5155d0e0a0 --- /dev/null +++ b/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/conditions/MatchAfiSafiNotInHandler.java @@ -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 { + + private static final MatchAfiSafiNotInHandler INSTANCE = new MatchAfiSafiNotInHandler(); + + private MatchAfiSafiNotInHandler() { + + } + + public static MatchAfiSafiNotInHandler getInstance() { + return INSTANCE; + } + + private static boolean matchAfiSafi( + final Class afiSafi, + final List> afiSafiNotIn) { + return !afiSafiNotIn.contains(afiSafi); + } + + @Override + public boolean matchImportCondition( + final Class afiSafi, + final RouteEntryBaseAttributes routeEntryInfo, + final BGPRouteEntryImportParameters routeEntryImportParameters, + final Void attributes, + final MatchAfiSafiNotInCondition conditions) { + return matchAfiSafi(afiSafi, conditions.getAfiSafiNotIn()); + } + + @Override + public boolean matchExportCondition( + final Class 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; + } +} diff --git a/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/conditions/MatchAsPathSetHandler.java b/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/conditions/MatchAsPathSetHandler.java index 2f86b47511..d0746257d2 100644 --- a/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/conditions/MatchAsPathSetHandler.java +++ b/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/conditions/MatchAsPathSetHandler.java @@ -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 afiSafi, final RouteEntryBaseAttributes routeEntryInfo, final BGPRouteEntryImportParameters routeEntryImportParameters, final AsPath asPath, @@ -86,6 +88,7 @@ public final class MatchAsPathSetHandler implements BgpConditionsPolicy afiSafi, final RouteEntryBaseAttributes routeEntryInfo, final BGPRouteEntryExportParameters routeEntryExportParameters, final AsPath asPath, diff --git a/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/conditions/MatchBgpNeighborSetHandler.java b/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/conditions/MatchBgpNeighborSetHandler.java index 4425ebe7d0..c3c96e6f6d 100644 --- a/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/conditions/MatchBgpNeighborSetHandler.java +++ b/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/conditions/MatchBgpNeighborSetHandler.java @@ -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 afiSafi, final RouteEntryBaseAttributes routeEntryInfo, final BGPRouteEntryImportParameters importParameters, final Void nonAttributres, @@ -88,6 +90,7 @@ public final class MatchBgpNeighborSetHandler @Override public boolean matchExportCondition( + final Class afiSafi, final RouteEntryBaseAttributes routeEntryInfo, final BGPRouteEntryExportParameters exportParameters, final Void nonAttributres, diff --git a/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/conditions/MatchClusterIdSetHandler.java b/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/conditions/MatchClusterIdSetHandler.java index e5675a9ae5..64f00f7ae4 100644 --- a/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/conditions/MatchClusterIdSetHandler.java +++ b/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/conditions/MatchClusterIdSetHandler.java @@ -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 afiSafi, final RouteEntryBaseAttributes routeEntryInfo, final BGPRouteEntryImportParameters importParameters, final ClusterId clusterIdAtt, @@ -84,6 +86,7 @@ public final class MatchClusterIdSetHandler @Override public boolean matchExportCondition( + final Class afiSafi, final RouteEntryBaseAttributes routeEntryInfo, final BGPRouteEntryExportParameters exportParameters, final ClusterId clusterIdAtt, diff --git a/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/conditions/MatchCommunitySetHandler.java b/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/conditions/MatchCommunitySetHandler.java index 61f2eb2000..cc8c0db6f0 100644 --- a/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/conditions/MatchCommunitySetHandler.java +++ b/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/conditions/MatchCommunitySetHandler.java @@ -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 afiSafi, final RouteEntryBaseAttributes routeEntryInfo, final BGPRouteEntryImportParameters routeEntryImportParameters, final List communities, @@ -43,6 +45,7 @@ public final class MatchCommunitySetHandler @Override public boolean matchExportCondition( + final Class afiSafi, final RouteEntryBaseAttributes routeEntryInfo, final BGPRouteEntryExportParameters routeEntryExportParameters, final List communities, diff --git a/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/conditions/MatchExtCommunitySetHandler.java b/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/conditions/MatchExtCommunitySetHandler.java index 0b2af9e87b..330b3db6bf 100644 --- a/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/conditions/MatchExtCommunitySetHandler.java +++ b/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/conditions/MatchExtCommunitySetHandler.java @@ -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 afiSafi, final RouteEntryBaseAttributes routeEntryInfo, final BGPRouteEntryImportParameters routeEntryImportParameters, final List extendedCommunities, @@ -74,6 +76,7 @@ public final class MatchExtCommunitySetHandler extends AbstractExtCommunityHandl @Override public boolean matchExportCondition( + final Class afiSafi, final RouteEntryBaseAttributes routeEntryInfo, final BGPRouteEntryExportParameters routeEntryExportParameters, final List extendedCommunities, diff --git a/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/conditions/MatchOriginatorIdSetHandler.java b/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/conditions/MatchOriginatorIdSetHandler.java index 3c16faed7a..04236c6bd1 100644 --- a/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/conditions/MatchOriginatorIdSetHandler.java +++ b/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/conditions/MatchOriginatorIdSetHandler.java @@ -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 afiSafi, final RouteEntryBaseAttributes routeEntryInfo, final BGPRouteEntryImportParameters routeEntryImportParameters, final OriginatorId originatorId, @@ -80,6 +82,7 @@ public final class MatchOriginatorIdSetHandler @Override public boolean matchExportCondition( + final Class afiSafi, final RouteEntryBaseAttributes routeEntryInfo, final BGPRouteEntryExportParameters routeEntryExportParameters, final OriginatorId originatorId, diff --git a/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/conditions/MatchRoleSetHandler.java b/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/conditions/MatchRoleSetHandler.java index 874899a1a9..ed870e351d 100644 --- a/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/conditions/MatchRoleSetHandler.java +++ b/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/conditions/MatchRoleSetHandler.java @@ -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 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 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 index 0000000000..096af45f6d --- /dev/null +++ b/bgp/openconfig-rp-statement/src/main/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/conditions/VpnNonMemberHandler.java @@ -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> { + 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 afiSafiType, + final RouteEntryBaseAttributes routeEntryInfo, + final BGPRouteEntryImportParameters routeEntryImportParameters, + final List attributes, + final VpnNonMemberCondition conditions) { + return false; + } + + @Override + public boolean matchExportCondition( + final Class afiSafiType, + final RouteEntryBaseAttributes routeEntryInfo, + final BGPRouteEntryExportParameters routeEntryExportParameters, + final List attributes, + final VpnNonMemberCondition conditions) { + final List allowedRouteTarget = routeEntryExportParameters.getMemberships(); + if (allowedRouteTarget.contains(DEFAULT)) { + return false; + } + final List 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 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 index 0000000000..05c43f48d4 --- /dev/null +++ b/bgp/openconfig-rp-statement/src/test/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/MatchAfiSafiNotInTest.java @@ -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 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 index 0000000000..fe71d7d902 --- /dev/null +++ b/bgp/openconfig-rp-statement/src/test/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/SetLocalAddressAsNextHopHandlerTest.java @@ -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 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 index 0000000000..919e3d0ba7 --- /dev/null +++ b/bgp/openconfig-rp-statement/src/test/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/SetOriginatorIdToAdvertizerRouterIdHandlerTest.java @@ -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 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 index 0000000000..a2495f311d --- /dev/null +++ b/bgp/openconfig-rp-statement/src/test/java/org/opendaylight/protocol/bgp/openconfig/routing/policy/statement/VpnNonMemberHandlerTest.java @@ -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 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 diff --git a/bgp/openconfig-rp-statement/src/test/resources/initial/routing-policy-config.xml b/bgp/openconfig-rp-statement/src/test/resources/initial/routing-policy-config.xml index f7cc95f73e..cca95b1394 100644 --- a/bgp/openconfig-rp-statement/src/test/resources/initial/routing-policy-config.xml +++ b/bgp/openconfig-rp-statement/src/test/resources/initial/routing-policy-config.xml @@ -816,6 +816,87 @@ + + match-afi-safi-not-in-test + + + match-afi-safi-not-in-test + + + x:IPV4-UNICAST + + + + + + + + + + set-originator-id-to-advertizer-router-id + + + set-originator-id-to-advertizer-router-id + + + + + + /rpol:routing-policy/rpol:defined-sets/bgppol:bgp-defined-sets/role-sets/role-set[role-set-name="all"] + + + + + + + + + + + + + + + set-local-address-as-next-hop + + + set-local-address-as-next-hop + + + + + + /rpol:routing-policy/rpol:defined-sets/bgppol:bgp-defined-sets/role-sets/role-set[role-set-name="all"] + + + + + + + + + + + + + + + vpn-non-member-test + + + vpn-non-member-test + + + + + + + + + + + diff --git a/bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/BGPRouteEntryExportParametersImpl.java b/bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/BGPRouteEntryExportParametersImpl.java index 8bd10cc85f..34b0c0d57a 100644 --- a/bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/BGPRouteEntryExportParametersImpl.java +++ b/bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/BGPRouteEntryExportParametersImpl.java @@ -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 getMemberships() { + return this.toPeer.getMemberships(); + } } diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/ApplicationPeer.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/ApplicationPeer.java index ad81f3c8c6..6d91e7415e 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/ApplicationPeer.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/ApplicationPeer.java @@ -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 getMemberships() { + return Collections.emptyList(); + } + @FunctionalInterface interface RegisterAppPeerListener { /** diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPPeer.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPPeer.java index 98c06d212c..ec1624c4b7 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPPeer.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPPeer.java @@ -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 tables = Collections.emptySet(); private final RIB rib; private final Map adjRibOutListenerSet = new HashMap<>(); + private final List rtMemberships = new ArrayList<>(); private final RpcProviderRegistry rpcRegistry; private final BGPTableTypeRegistryConsumer tableTypeRegistry; private InstanceIdentifier peerRibOutIId; @@ -500,4 +502,9 @@ public class BGPPeer extends AbstractPeer implements BGPSessionListener { } return null; } + + @Override + public List getMemberships() { + return this.rtMemberships; + } } diff --git a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/Peer.java b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/Peer.java index 5d8269cf87..7e44c9056f 100644 --- a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/Peer.java +++ b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/Peer.java @@ -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 & Identifiable, I extends Identifier> void initializeRibOut( @Nonnull RouteEntryDependenciesContainer entryDep, - List> routes); + @Nonnull List> routes); } diff --git a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/RouterIds.java b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/RouterIds.java index bcc87e99e2..a7fb36b246 100644 --- a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/RouterIds.java +++ b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/RouterIds.java @@ -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); + } } diff --git a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/policy/BGPRibRoutingPolicy.java b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/policy/BGPRibRoutingPolicy.java index f60580d9b9..8a580b65e4 100644 --- a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/policy/BGPRibRoutingPolicy.java +++ b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/policy/BGPRibRoutingPolicy.java @@ -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 applyImportPolicies( @Nonnull BGPRouteEntryImportParameters policyParameters, @Nonnull Attributes attributes, - @Nonnull Class afiSafType + @Nonnull Class afiSafiType ); /** diff --git a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/policy/BGPRouteEntryExportParameters.java b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/policy/BGPRouteEntryExportParameters.java index 982272ea79..498511d2bc 100644 --- a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/policy/BGPRouteEntryExportParameters.java +++ b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/policy/BGPRouteEntryExportParameters.java @@ -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 index 0000000000..50b91862a3 --- /dev/null +++ b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/policy/RouteTargetMembershipConsumer.java @@ -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 getMemberships(); +}