}
}
+ 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;
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;
}
}
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;
}
}
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.
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;
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;
}
}
+ 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;
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 {
}
}
+ 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 {
@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);
}
}
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;
/**
/**
* 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
* @return true if all defined condition matches
*/
boolean matchImportCondition(
+ @Nonnull Class<? extends AfiSafiType> afiSafiType,
@Nonnull RouteEntryBaseAttributes routeEntryInfo,
@Nonnull BGPRouteEntryImportParameters routeEntryImportParameters,
@Nullable N attributes,
/**
* 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
* @return true if all defined condition matches
*/
boolean matchExportCondition(
+ @Nonnull Class<? extends AfiSafiType> afiSafiType,
@Nonnull RouteEntryBaseAttributes routeEntryInfo,
@Nonnull BGPRouteEntryExportParameters routeEntryExportParameters,
@Nullable N attributes,
if (handler == null) {
continue;
}
- if (!handler.matchExportCondition(entryInfo, routeEntryExportParameters,
+ if (!handler.matchExportCondition(afiSafi, entryInfo, routeEntryExportParameters,
handler.getConditionParameter(attributes), entry.getValue())) {
return false;
}
if (handler == null) {
continue;
}
- if (!handler.matchImportCondition(entryInfo, routeEntryImportParameters,
+ if (!handler.matchImportCondition(afiSafi, entryInfo, routeEntryImportParameters,
handler.getConditionParameter(attributes), entry.getValue())) {
return false;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
if (handler == null) {
continue;
}
- if (!handler.matchExportCondition(entryInfo, routeEntryExportParameters,
+ if (!handler.matchExportCondition(afiSafi, entryInfo, routeEntryExportParameters,
handler.getConditionParameter(attributes), entry.getValue())) {
return false;
}
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;
}
--- /dev/null
+/*
+ * 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());
+ }
+}
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;
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;
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;
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) {
registration.add(provider.registerBgpActionAugmentationPolicy(SetClusterIdPrepend.class,
new SetClusterIdPrependHandler()));
+
+ registration.add(provider.registerBgpActionAugmentationPolicy(SetOriginatorIdToAdvertizerRouterId.class,
+ SetOriginatorIdToAdvertizerRouterIdHandler.getInstance()));
+
+ registration.add(provider.registerBgpActionAugmentationPolicy(SetLocalAddressAsNextHop.class,
+ SetLocalAddressAsNextHopHandler.getInstance()));
}
}
--- /dev/null
+/*
+ * 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());
+ }
+}
--- /dev/null
+/*
+ * 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;
+ }
+}
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;
@Override
public boolean matchImportCondition(
+ final Class<? extends AfiSafiType> afiSafi,
final RouteEntryBaseAttributes routeEntryInfo,
final BGPRouteEntryImportParameters routeEntryImportParameters,
final AsPath asPath,
@Override
public boolean matchExportCondition(
+ final Class<? extends AfiSafiType> afiSafi,
final RouteEntryBaseAttributes routeEntryInfo,
final BGPRouteEntryExportParameters routeEntryExportParameters,
final AsPath asPath,
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;
@Override
public boolean matchImportCondition(
+ final Class<? extends AfiSafiType> afiSafi,
final RouteEntryBaseAttributes routeEntryInfo,
final BGPRouteEntryImportParameters importParameters,
final Void nonAttributres,
@Override
public boolean matchExportCondition(
+ final Class<? extends AfiSafiType> afiSafi,
final RouteEntryBaseAttributes routeEntryInfo,
final BGPRouteEntryExportParameters exportParameters,
final Void nonAttributres,
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;
@Override
public boolean matchImportCondition(
+ final Class<? extends AfiSafiType> afiSafi,
final RouteEntryBaseAttributes routeEntryInfo,
final BGPRouteEntryImportParameters importParameters,
final ClusterId clusterIdAtt,
@Override
public boolean matchExportCondition(
+ final Class<? extends AfiSafiType> afiSafi,
final RouteEntryBaseAttributes routeEntryInfo,
final BGPRouteEntryExportParameters exportParameters,
final ClusterId clusterIdAtt,
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;
@Override
public boolean matchImportCondition(
+ final Class<? extends AfiSafiType> afiSafi,
final RouteEntryBaseAttributes routeEntryInfo,
final BGPRouteEntryImportParameters routeEntryImportParameters,
final List<Communities> communities,
@Override
public boolean matchExportCondition(
+ final Class<? extends AfiSafiType> afiSafi,
final RouteEntryBaseAttributes routeEntryInfo,
final BGPRouteEntryExportParameters routeEntryExportParameters,
final List<Communities> communities,
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;
@Override
public boolean matchImportCondition(
+ final Class<? extends AfiSafiType> afiSafi,
final RouteEntryBaseAttributes routeEntryInfo,
final BGPRouteEntryImportParameters routeEntryImportParameters,
final List<ExtendedCommunities> extendedCommunities,
@Override
public boolean matchExportCondition(
+ final Class<? extends AfiSafiType> afiSafi,
final RouteEntryBaseAttributes routeEntryInfo,
final BGPRouteEntryExportParameters routeEntryExportParameters,
final List<ExtendedCommunities> extendedCommunities,
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;
@Override
public boolean matchImportCondition(
+ final Class<? extends AfiSafiType> afiSafi,
final RouteEntryBaseAttributes routeEntryInfo,
final BGPRouteEntryImportParameters routeEntryImportParameters,
final OriginatorId originatorId,
@Override
public boolean matchExportCondition(
+ final Class<? extends AfiSafiType> afiSafi,
final RouteEntryBaseAttributes routeEntryInfo,
final BGPRouteEntryExportParameters routeEntryExportParameters,
final OriginatorId originatorId,
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;
@Override
public boolean matchImportCondition(
+ final Class<? extends AfiSafiType> afiSafi,
final RouteEntryBaseAttributes routeEntryInfo,
final BGPRouteEntryImportParameters importParameters,
final Void attributes,
@Override
public boolean matchExportCondition(
+ final Class<? extends AfiSafiType> afiSafi,
final RouteEntryBaseAttributes routeEntryInfo,
final BGPRouteEntryExportParameters exportParameters,
final Void attributes,
--- /dev/null
+/*
+ * 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();
+ }
+}
--- /dev/null
+/*
+ * 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
--- /dev/null
+/*
+ * 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
--- /dev/null
+/*
+ * 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
--- /dev/null
+/*
+ * 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
</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">
*/
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;
public PeerId getToPeerId() {
return this.toPeer.getPeerId();
}
+
+ @Override
+ public List<RouteTarget> getMemberships() {
+ return this.toPeer.getMemberships();
+ }
}
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;
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;
private AbstractRegistration trackerRegistration;
private YangInstanceIdentifier peerPath;
+ @Override
+ public List<RouteTarget> getMemberships() {
+ return Collections.emptyList();
+ }
+
@FunctionalInterface
interface RegisterAppPeerListener {
/**
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;
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;
}
return null;
}
+
+ @Override
+ public List<RouteTarget> getMemberships() {
+ return this.rtMemberships;
+ }
}
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;
/**
* Marker interface identifying a BGP peer.
*/
-public interface Peer extends PeerTrackerInformation {
+public interface Peer extends PeerTrackerInformation, RouteTargetMembershipConsumer {
/**
* Return peer's symbolic name.
*
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);
}
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);
+ }
}
*
* @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
);
/**
/**
* 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.
--- /dev/null
+/*
+ * 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();
+}