@Nullable
@Override
public PathArgument getRouteIdAddPath(final long pathId, final PathArgument routeId) {
- return PathIdUtil.createNiiKey(pathId, routeId, FlowspecRoute.QNAME, PATHID_QNAME, ROUTE_KEY);
+ return PathIdUtil.createNidKey(pathId, routeId, FlowspecRoute.QNAME, PATHID_QNAME, ROUTE_KEY);
}
@Override
@Nonnull
@Override
public PathArgument getRouteIdAddPath(final long pathId, final PathArgument routeId) {
- return PathIdUtil.createNiiKey(pathId, routeId, LabeledUnicastRoute.QNAME, PATHID_QNAME, ROUTE_KEY);
+ return PathIdUtil.createNidKey(pathId, routeId, LabeledUnicastRoute.QNAME, PATHID_QNAME, ROUTE_KEY);
}
@Override
package org.opendaylight.protocol.bgp.parser.spi;
+import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableMap;
import io.netty.buffer.ByteBuf;
-import javax.annotation.Nullable;
import org.opendaylight.protocol.util.ByteBufWriteUtil;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.PathId;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
+import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodes;
public final class PathIdUtil {
+ public static final long NON_PATH_ID = 0;
private PathIdUtil() {
throw new UnsupportedOperationException();
*
* @param data Data containing the path Id
* @param pathNii Path Id NodeIdentifier specific per each Rib support
- * @return The path identifier from data change, in case its not provided or supported return null
+ * @return The path identifier from data change
*/
- @Nullable
public static Long extractPathId(final NormalizedNode<?, ?> data, final NodeIdentifier pathNii) {
- final NormalizedNode<?, ?> pathId = NormalizedNodes.findNode(data, pathNii).orNull();
- if (pathId == null) {
- return null;
- }
- return (Long) pathId.getValue();
+ final Long pathId = (Long) NormalizedNodes.findNode(data, pathNii).get().getValue();
+ Preconditions.checkNotNull(pathId);
+ return pathId;
}
/**
* @param routeQname route QName provided per each RibSupport
* @param pathidQname Path Id QName provided per each RibSupport
* @param prefixQname Prefix QName provided per each RibSupport
- * @return
+ * @return Route Key Nid
*/
- public static PathArgument createNiiKey(final long pathId, final PathArgument routeId, final QName routeQname, final QName pathidQname,
+ public static PathArgument createNidKey(final long pathId, final PathArgument routeId, final QName routeQname, final QName pathidQname,
final QName prefixQname) {
final String prefix = (String) (((NodeIdentifierWithPredicates) routeId).getKeyValues()).get(prefixQname);
- final ImmutableMap<QName, Object> keyValues = ImmutableMap.of(pathidQname, pathId, prefixQname, prefix);
+ return createNodeIdentifierWithPredicates(routeQname, pathidQname, pathId, prefixQname, prefix);
+ }
+ private static NodeIdentifierWithPredicates createNodeIdentifierWithPredicates(final QName routeQname, final QName pathidQname, final Object pathId,
+ final QName prefixQname, final Object prefix) {
+ final ImmutableMap<QName, Object> keyValues = ImmutableMap.of(pathidQname, pathId, prefixQname, prefix);
return new NodeIdentifierWithPredicates(routeQname, keyValues);
}
*/
public static PathId buildPathId(final DataContainerNode<? extends PathArgument> routesCont, final NodeIdentifier pathIdNii) {
final Long pathIdVal = PathIdUtil.extractPathId(routesCont, pathIdNii);
- return pathIdVal == null ? null : new PathId(pathIdVal);
+ return new PathId(pathIdVal);
+ }
+
+ /**
+ * Build Route Key for supporting mp
+ * Key is composed by 2 elements (route-key + path Id)
+ *
+ * @param routeQname route Qname
+ * @param routeKeyQname route key Qname
+ * @param pathIdQname path Id Qname
+ * @param routeKeyValue route key value
+ * @param maybePathIdLeaf path id container, it might me supported or not, in that case default 0 value will be assigned
+ * @return Route Key Nid
+ */
+ public static NodeIdentifierWithPredicates createNidKey(final QName routeQname, final QName routeKeyQname, final QName pathIdQname,
+ final Object routeKeyValue, final Optional<DataContainerChild<? extends PathArgument, ?>> maybePathIdLeaf) {
+ // FIXME: a cache here would mean we instantiate the same identifier for each route making comparison quicker.
+ final Object pathId = maybePathIdLeaf.isPresent() ? (maybePathIdLeaf.get()).getValue() : NON_PATH_ID;
+ return createNodeIdentifierWithPredicates(routeQname, pathIdQname, pathId, routeKeyQname, routeKeyValue);
}
}
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableCollection;
import com.google.common.collect.ImmutableSet;
+import java.util.Collection;
import javax.annotation.Nonnull;
import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction;
+import org.opendaylight.protocol.bgp.parser.spi.PathIdUtil;
import org.opendaylight.protocol.bgp.rib.spi.AbstractRIBSupport;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.destination.DestinationType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpReachNlri;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpReachNlriBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpUnreachNlri;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpUnreachNlriBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.mp.reach.nlri.AdvertizedRoutesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.mp.unreach.nlri.WithdrawnRoutesBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.Route;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.tables.Routes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.AddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.CNextHop;
import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.util.BindingReflections;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
+import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode;
import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
-import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
+import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
+import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode;
import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode;
+import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
+import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
*/
abstract class AbstractIPRIBSupport extends AbstractRIBSupport {
private static final Logger LOG = LoggerFactory.getLogger(AbstractIPRIBSupport.class);
-
- protected AbstractIPRIBSupport(final Class<? extends Routes> cazeClass,
- final Class<? extends DataObject> containerClass, final Class<? extends Route> listClass) {
+ private final QName prefixQname;
+ private final QName pathIdQname;
+ private final NodeIdentifier pathIdNid;
+ private final NodeIdentifier prefixNid;
+ private final QName routeQname;
+ private final ChoiceNode emptyRoutes;
+ private final NodeIdentifier destination;
+ private final NodeIdentifier nlriRoutesList;
+ private final ImmutableCollection<Class<? extends DataObject>> cacheableNlriObjects;
+ private final Class<? extends AddressFamily> addressFamilyClass;
+
+ protected AbstractIPRIBSupport(final Class<? extends DataObject> prefixClass, final Class<? extends AddressFamily> addressFamilyClass,
+ final Class<? extends Routes> cazeClass, final Class<? extends DataObject> containerClass, final Class<? extends Route> listClass,
+ final QName destination, final QName prefixesQname) {
super(cazeClass, containerClass, listClass);
+ this.routeQname = BindingReflections.findQName(listClass).intern();
+ this.addressFamilyClass = addressFamilyClass;
+ this.prefixQname = QName.create(this.routeQname, "prefix").intern();
+ this.pathIdQname = QName.create(this.routeQname, "path-id").intern();
+ this.pathIdNid = new NodeIdentifier(this.pathIdQname);
+ this.prefixNid = new NodeIdentifier(this.prefixQname);
+ this.emptyRoutes = Builders.choiceBuilder().withNodeIdentifier(ROUTES).addChild(Builders.containerBuilder()
+ .withNodeIdentifier(routesContainerIdentifier()).withChild(ImmutableNodes.mapNodeBuilder(this.routeQname).build()).build()).build();
+ this.destination = new NodeIdentifier(destination);
+ this.nlriRoutesList = new NodeIdentifier(prefixesQname);
+ this.cacheableNlriObjects = ImmutableSet.of(prefixClass);
}
- /**
- * Return the NodeIdentifier corresponding to the list containing individual routes.
- *
- * @return The NodeIdentifier for individual route list.
- */
- @Nonnull protected abstract NodeIdentifier routeIdentifier();
+ private QName prefixQName() {
+ return this.prefixQname;
+ }
- /**
- * Return the NodeIdentifier corresponding to the list containing individual routes.
- *
- * @return The NodeIdentifier for individual route list.
- */
- @Nonnull protected abstract NodeIdentifier nlriRoutesListIdentifier();
+ private QName pathIdQName() {
+ return this.pathIdQname;
+ }
+
+ private QName routeQName() {
+ return this.routeQname;
+ }
+
+ protected final NodeIdentifier routePrefixIdentifier() {
+ return this.prefixNid;
+ }
+
+ protected final NodeIdentifier routePathIdIdentifier() {
+ return this.pathIdNid;
+ }
+
+ @Nonnull
+ @Override
+ protected final NodeIdentifier destinationContainerIdentifier() {
+ return this.destination;
+ }
+
+ @Override
+ protected final void deleteDestinationRoutes(final DOMDataWriteTransaction tx, final YangInstanceIdentifier tablePath,
+ final ContainerNode destination, final NodeIdentifier routesNodeId) {
+ processDestination(tx, tablePath.node(routesNodeId), destination, null, DELETE_ROUTE);
+ }
+
+ @Override
+ protected final void putDestinationRoutes(final DOMDataWriteTransaction tx, final YangInstanceIdentifier tablePath, final ContainerNode destination,
+ final ContainerNode attributes, final NodeIdentifier routesNodeId) {
+ processDestination(tx, tablePath.node(routesNodeId), destination, attributes, this.putRoute);
+ }
+ @Override
+ protected final MpReachNlri buildReach(final Collection<MapEntryNode> routes, final CNextHop hop) {
+ final MpReachNlriBuilder mb = new MpReachNlriBuilder();
+ mb.setAfi(this.addressFamilyClass);
+ mb.setSafi(UnicastSubsequentAddressFamily.class);
+ mb.setCNextHop(hop);
+ mb.setAdvertizedRoutes(new AdvertizedRoutesBuilder().setDestinationType(buildDestination(routes)).build());
+ return mb.build();
+ }
- @Nonnull protected abstract NodeIdentifier routeKeyLeafIdentifier();
+ @Nonnull
+ @Override
+ protected final MpUnreachNlri buildUnreach(final Collection<MapEntryNode> routes) {
+ final MpUnreachNlriBuilder mb = new MpUnreachNlriBuilder();
+ mb.setAfi(this.addressFamilyClass);
+ mb.setSafi(UnicastSubsequentAddressFamily.class);
+ mb.setWithdrawnRoutes(new WithdrawnRoutesBuilder().setDestinationType(buildWithdrawnDestination(routes)).build());
+ return mb.build();
+ }
- @Nonnull protected abstract QName keyLeafQName();
+ @Nonnull
+ @Override
+ public final PathArgument getRouteIdAddPath(final long pathId, final PathArgument routeId) {
+ return PathIdUtil.createNidKey(pathId, routeId, routeQName(), pathIdQName(), prefixQName());
+ }
- @Nonnull protected abstract QName routeQName();
+ @Override
+ public final Long extractPathId(final NormalizedNode<?, ?> data) {
+ return PathIdUtil.extractPathId(data, this.routePathIdIdentifier());
+ }
+ @Nonnull
+ @Override
+ public final ChoiceNode emptyRoutes() {
+ return this.emptyRoutes;
+ }
+ @Nonnull
@Override
public final ImmutableCollection<Class<? extends DataObject>> cacheableAttributeObjects() {
return ImmutableSet.of();
}
+ @Nonnull
+ @Override
+ public final ImmutableCollection<Class<? extends DataObject>> cacheableNlriObjects() {
+ return this.cacheableNlriObjects;
+ }
+
@Override
public final boolean isComplexRoute() {
return false;
}
private void processDestination(final DOMDataWriteTransaction tx, final YangInstanceIdentifier routesPath,
- final ContainerNode destination, final ContainerNode attributes, final ApplyRoute function) {
+ final ContainerNode destination, final ContainerNode attributes, final ApplyRoute function) {
if (destination != null) {
- final Optional<DataContainerChild<? extends PathArgument, ?>> maybeRoutes = destination.getChild(nlriRoutesListIdentifier());
+ final Optional<DataContainerChild<? extends PathArgument, ?>> maybeRoutes = destination.getChild(this.nlriRoutesList);
if (maybeRoutes.isPresent()) {
final DataContainerChild<? extends PathArgument, ?> routes = maybeRoutes.get();
if (routes instanceof UnkeyedListNode) {
// Instance identifier to table/(choice routes)/(map of route)
// FIXME: cache on per-table basis (in TableContext, for example)
- final YangInstanceIdentifier base = routesPath.node(routesContainerIdentifier()).node(routeIdentifier());
- for (final UnkeyedListEntryNode e : ((UnkeyedListNode)routes).getValue()) {
+ final YangInstanceIdentifier base = routesPath.node(routesContainerIdentifier()).node(this.routesListIdentifier);
+ for (final UnkeyedListEntryNode e : ((UnkeyedListNode) routes).getValue()) {
final NodeIdentifierWithPredicates routeKey = createRouteKey(e);
- function.apply(tx, base, routeKey, e, attributes);
+ function.apply(tx, base, routeKey, e, attributes);
}
} else {
LOG.warn("Routes {} are not a map", routes);
}
}
- private NodeIdentifierWithPredicates createRouteKey(final UnkeyedListEntryNode e) {
- final Optional<DataContainerChild<? extends PathArgument, ?>> maybeKeyLeaf = e.getChild(routeKeyLeafIdentifier());
- Preconditions.checkState(maybeKeyLeaf.isPresent());
-
- // FIXME: a cache here would mean we instantiate the same identifier for each route
- // making comparison quicker.
- final Object keyValue = ((LeafNode<?>) maybeKeyLeaf.get()).getValue();
- return new NodeIdentifierWithPredicates(routeQName(), keyLeafQName(), keyValue);
+ /**
+ * Prefix and Path Id are the route key
+ *
+ * @param prefixes UnkeyedListEntryNode containing route
+ * @return Nid with Route Key
+ */
+ private NodeIdentifierWithPredicates createRouteKey(final UnkeyedListEntryNode prefixes) {
+ final Optional<DataContainerChild<? extends PathArgument, ?>> maybePrefixLeaf = prefixes.getChild(routePrefixIdentifier());
+ final Optional<DataContainerChild<? extends PathArgument, ?>> maybePathIdLeaf = prefixes.getChild(routePathIdIdentifier());
+ Preconditions.checkState(maybePrefixLeaf.isPresent());
+ final Object prefixValue = (maybePrefixLeaf.get()).getValue();
+ return PathIdUtil.createNidKey(routeQName(), prefixQName(), pathIdQName(), prefixValue, maybePathIdLeaf);
}
+ @Nonnull
+ protected abstract DestinationType buildDestination(@Nonnull final Collection<MapEntryNode> routes);
- @Override
- protected void putDestinationRoutes(final DOMDataWriteTransaction tx, final YangInstanceIdentifier tablePath, final ContainerNode destination,
- final ContainerNode attributes, final NodeIdentifier routesNodeId) {
- processDestination(tx, tablePath.node(routesNodeId), destination, attributes, this.putRoute);
- }
-
- @Override
- protected void deleteDestinationRoutes(final DOMDataWriteTransaction tx, final YangInstanceIdentifier tablePath,
- final ContainerNode destination, final NodeIdentifier routesNodeId) {
- processDestination(tx, tablePath.node(routesNodeId), destination, null, DELETE_ROUTE);
- }
+ @Nonnull
+ protected abstract DestinationType buildWithdrawnDestination(@Nonnull final Collection<MapEntryNode> routes);
}
*/
package org.opendaylight.protocol.bgp.rib.impl;
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.collect.ImmutableCollection;
-import com.google.common.collect.ImmutableSet;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.ipv4.routes.Ipv4Routes;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.ipv4.routes.ipv4.routes.Ipv4Route;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.update.attributes.mp.reach.nlri.advertized.routes.destination.type.DestinationIpv4CaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpReachNlri;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpReachNlriBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpUnreachNlri;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpUnreachNlriBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.mp.reach.nlri.AdvertizedRoutesBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.mp.unreach.nlri.WithdrawnRoutesBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.tables.Routes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.destination.DestinationType;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv4AddressFamily;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.CNextHop;
-import org.opendaylight.yangtools.yang.binding.DataObject;
-import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
-import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode;
import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
-import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
-import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
/**
* Class supporting IPv4 unicast RIBs.
*/
final class IPv4RIBSupport extends AbstractIPRIBSupport {
- @VisibleForTesting
- static final QName PREFIX_QNAME = QName.create(Ipv4Route.QNAME, "prefix").intern();
- private static final QName PATHID_QNAME = QName.create(Ipv4Route.QNAME, "path-id").intern();
+
private static final IPv4RIBSupport SINGLETON = new IPv4RIBSupport();
- private static final ImmutableCollection<Class<? extends DataObject>> CACHEABLE_NLRI_OBJECTS =
- ImmutableSet.of(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.Ipv4Prefix.class);
- private final ChoiceNode emptyRoutes = Builders.choiceBuilder().withNodeIdentifier(new NodeIdentifier(Routes.QNAME))
- .addChild(Builders.containerBuilder().withNodeIdentifier(new NodeIdentifier(Ipv4Routes.QNAME))
- .withChild(ImmutableNodes.mapNodeBuilder(Ipv4Route.QNAME).build()).build()).build();
- private final NodeIdentifier destination = new NodeIdentifier(DestinationIpv4.QNAME);
- private final NodeIdentifier ipv4Route = new NodeIdentifier(Ipv4Route.QNAME);
- private final NodeIdentifier nlriRoutesList = new NodeIdentifier(Ipv4Prefixes.QNAME);
- private final NodeIdentifier routeKeyLeaf = new NodeIdentifier(PREFIX_QNAME);
- private static final NodeIdentifier PATH_ID_LEAF = new NodeIdentifier(PATHID_QNAME);
private IPv4RIBSupport() {
- super(Ipv4RoutesCase.class, Ipv4Routes.class, Ipv4Route.class);
+ super(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.Ipv4Prefix.class, Ipv4AddressFamily.class,
+ Ipv4RoutesCase.class, Ipv4Routes.class, Ipv4Route.class, DestinationIpv4.QNAME, Ipv4Prefixes.QNAME);
}
static IPv4RIBSupport getInstance() {
return SINGLETON;
}
- @Override
- public ChoiceNode emptyRoutes() {
- return this.emptyRoutes;
- }
-
- @Override
- protected NodeIdentifier destinationContainerIdentifier() {
- return this.destination;
- }
-
- @Override
- protected NodeIdentifier routeIdentifier() {
- return this.ipv4Route;
- }
-
- @Override
- protected NodeIdentifier routeKeyLeafIdentifier() {
- return this.routeKeyLeaf;
- }
-
- @Override
- protected NodeIdentifier nlriRoutesListIdentifier() {
- return this.nlriRoutesList;
- }
-
- @Override
- protected QName keyLeafQName() {
- return PREFIX_QNAME;
- }
-
- @Override
- protected QName routeQName() {
- return Ipv4Route.QNAME;
- }
-
- @Override
- public ImmutableCollection<Class<? extends DataObject>> cacheableNlriObjects() {
- return CACHEABLE_NLRI_OBJECTS;
- }
-
- @Nonnull
- @Override
- public PathArgument getRouteIdAddPath(final long pathId, final PathArgument routeId) {
- return PathIdUtil.createNiiKey(pathId, routeId, Ipv4Route.QNAME, PATHID_QNAME, PREFIX_QNAME);
- }
-
- @Override
- public Long extractPathId(final NormalizedNode<?, ?> data) {
- return PathIdUtil.extractPathId(data, PATH_ID_LEAF);
- }
-
private List<Ipv4Prefixes> extractPrefixes(final Collection<MapEntryNode> routes) {
final List<Ipv4Prefixes> prefs = new ArrayList<>(routes.size());
for (final MapEntryNode route : routes) {
- final String prefix = (String) route.getChild(this.routeKeyLeaf).get().getValue();
+ final String prefix = (String) route.getChild(this.routePrefixIdentifier()).get().getValue();
final Ipv4PrefixesBuilder prefixBuilder = new Ipv4PrefixesBuilder().setPrefix(new Ipv4Prefix(prefix));
- prefixBuilder.setPathId(PathIdUtil.buildPathId(route, PATH_ID_LEAF));
+ prefixBuilder.setPathId(PathIdUtil.buildPathId(route, this.routePathIdIdentifier()));
prefs.add(prefixBuilder.build());
}
return prefs;
}
+ @Nonnull
@Override
- protected MpReachNlri buildReach(final Collection<MapEntryNode> routes, final CNextHop hop) {
- final MpReachNlriBuilder mb = new MpReachNlriBuilder();
- mb.setAfi(Ipv4AddressFamily.class);
- mb.setSafi(UnicastSubsequentAddressFamily.class);
- mb.setCNextHop(hop);
- mb.setAdvertizedRoutes(new AdvertizedRoutesBuilder().setDestinationType(
- new DestinationIpv4CaseBuilder().setDestinationIpv4(
- new DestinationIpv4Builder().setIpv4Prefixes(extractPrefixes(routes)).build()).build()).build());
- return mb.build();
+ protected DestinationType buildDestination(@Nonnull final Collection<MapEntryNode> routes) {
+ return new DestinationIpv4CaseBuilder().setDestinationIpv4(new DestinationIpv4Builder().setIpv4Prefixes(extractPrefixes(routes)).build()).build();
}
+ @Nonnull
@Override
- protected MpUnreachNlri buildUnreach(final Collection<MapEntryNode> routes) {
- final MpUnreachNlriBuilder mb = new MpUnreachNlriBuilder();
- mb.setAfi(Ipv4AddressFamily.class);
- mb.setSafi(UnicastSubsequentAddressFamily.class);
- mb.setWithdrawnRoutes(new WithdrawnRoutesBuilder().setDestinationType(
- new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.update.attributes.mp.unreach.nlri.withdrawn.routes.destination.type.DestinationIpv4CaseBuilder().setDestinationIpv4(
- new DestinationIpv4Builder().setIpv4Prefixes(extractPrefixes(routes)).build()).build()).build());
- return mb.build();
+ protected DestinationType buildWithdrawnDestination(@Nonnull final Collection<MapEntryNode> routes) {
+ return new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.update.attributes.mp.unreach.nlri.withdrawn.routes.destination.type.DestinationIpv4CaseBuilder().setDestinationIpv4(
+ new DestinationIpv4Builder().setIpv4Prefixes(extractPrefixes(routes)).build()).build();
}
}
*/
package org.opendaylight.protocol.bgp.rib.impl;
-import com.google.common.collect.ImmutableCollection;
-import com.google.common.collect.ImmutableSet;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
+import javax.annotation.Nonnull;
import org.opendaylight.protocol.bgp.parser.spi.PathIdUtil;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Prefix;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.bgp.rib.rib.loc.rib.tables.routes.Ipv6RoutesCase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.ipv6.routes.Ipv6Routes;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.ipv6.routes.ipv6.routes.Ipv6Route;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.update.attributes.mp.reach.nlri.advertized.routes.destination.type.DestinationIpv6CaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpReachNlri;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpReachNlriBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpUnreachNlri;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpUnreachNlriBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.mp.reach.nlri.AdvertizedRoutesBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.mp.unreach.nlri.WithdrawnRoutesBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.tables.Routes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.destination.DestinationType;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv6AddressFamily;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.CNextHop;
-import org.opendaylight.yangtools.yang.binding.DataObject;
-import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
-import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode;
import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
-import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
-import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
/**
* Class supporting IPv6 unicast RIBs.
*/
final class IPv6RIBSupport extends AbstractIPRIBSupport {
- private static final QName PREFIX_QNAME = QName.create(Ipv6Route.QNAME, "prefix").intern();
+
private static final IPv6RIBSupport SINGLETON = new IPv6RIBSupport();
- private static final ImmutableCollection<Class<? extends DataObject>> CACHEABLE_NLRI_OBJECTS =
- ImmutableSet.of(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.Ipv6Prefix.class);
- private static final ChoiceNode EMPTY_ROUTES = Builders.choiceBuilder().withNodeIdentifier(new NodeIdentifier(Routes.QNAME))
- .addChild(Builders.containerBuilder().withNodeIdentifier(new NodeIdentifier(Ipv6Routes.QNAME)).withChild(ImmutableNodes
- .mapNodeBuilder(Ipv6Route.QNAME).build()).build()).build();
- private static final NodeIdentifier DESTINATION = new NodeIdentifier(DestinationIpv6.QNAME);
- private static final NodeIdentifier ROUTE = new NodeIdentifier(Ipv6Route.QNAME);
- private static final NodeIdentifier NLRI_ROUTES_LIST = new NodeIdentifier(Ipv6Prefixes.QNAME);
- private static final NodeIdentifier PATH_ID_LEAF = new NodeIdentifier(PREFIX_QNAME);
private IPv6RIBSupport() {
- super(Ipv6RoutesCase.class, Ipv6Routes.class, Ipv6Route.class);
+ super(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.Ipv6Prefix.class,
+ Ipv6AddressFamily.class, Ipv6RoutesCase.class, Ipv6Routes.class, Ipv6Route.class, DestinationIpv6.QNAME, Ipv6Prefixes.QNAME);
}
static IPv6RIBSupport getInstance() {
return SINGLETON;
}
+ @Nonnull
@Override
- public ChoiceNode emptyRoutes() {
- return EMPTY_ROUTES;
- }
-
- @Override
- public ImmutableCollection<Class<? extends DataObject>> cacheableNlriObjects() {
- return CACHEABLE_NLRI_OBJECTS;
- }
-
- @Override
- protected NodeIdentifier destinationContainerIdentifier() {
- return DESTINATION;
- }
-
- @Override
- protected MpReachNlri buildReach(final Collection<MapEntryNode> routes, final CNextHop hop) {
- final MpReachNlriBuilder mb = new MpReachNlriBuilder();
- mb.setAfi(Ipv6AddressFamily.class);
- mb.setSafi(UnicastSubsequentAddressFamily.class);
- mb.setCNextHop(hop);
- mb.setAdvertizedRoutes(new AdvertizedRoutesBuilder().setDestinationType(
- new DestinationIpv6CaseBuilder().setDestinationIpv6(
- new DestinationIpv6Builder().setIpv6Prefixes(extractPrefixes(routes)).build()).build()).build());
- return mb.build();
- }
-
- @Override
- protected MpUnreachNlri buildUnreach(final Collection<MapEntryNode> routes) {
- final MpUnreachNlriBuilder mb = new MpUnreachNlriBuilder();
- mb.setAfi(Ipv6AddressFamily.class);
- mb.setSafi(UnicastSubsequentAddressFamily.class);
- mb.setWithdrawnRoutes(new WithdrawnRoutesBuilder().setDestinationType(
- new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.update.attributes.mp.unreach.nlri.withdrawn.routes.destination.type.DestinationIpv6CaseBuilder().setDestinationIpv6(
- new DestinationIpv6Builder().setIpv6Prefixes(extractPrefixes(routes)).build()).build()).build());
- return mb.build();
- }
-
- @Override
- protected NodeIdentifier routeIdentifier() {
- return ROUTE;
- }
-
- @Override
- protected NodeIdentifier nlriRoutesListIdentifier() {
- return NLRI_ROUTES_LIST;
- }
-
- @Override
- protected NodeIdentifier routeKeyLeafIdentifier() {
- return PATH_ID_LEAF;
- }
-
- @Override
- protected QName keyLeafQName() {
- return PREFIX_QNAME;
+ protected DestinationType buildDestination(@Nonnull final Collection<MapEntryNode> routes) {
+ return new DestinationIpv6CaseBuilder().setDestinationIpv6(new DestinationIpv6Builder().setIpv6Prefixes(extractPrefixes(routes)).build()).build();
}
+ @Nonnull
@Override
- protected QName routeQName() {
- return Ipv6Route.QNAME;
+ protected DestinationType buildWithdrawnDestination(@Nonnull final Collection<MapEntryNode> routes) {
+ return new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.update.attributes.mp.unreach.nlri.withdrawn.routes
+ .destination.type.DestinationIpv6CaseBuilder().setDestinationIpv6(
+ new DestinationIpv6Builder().setIpv6Prefixes(extractPrefixes(routes)).build()).build();
}
private List<Ipv6Prefixes> extractPrefixes(final Collection<MapEntryNode> routes) {
final List<Ipv6Prefixes> prefs = new ArrayList<>(routes.size());
for (final MapEntryNode ipv6Route : routes) {
- final String prefix = (String) ipv6Route.getChild(PATH_ID_LEAF).get().getValue();
- prefs.add(new Ipv6PrefixesBuilder().setPathId(PathIdUtil.buildPathId(ipv6Route, PATH_ID_LEAF)).setPrefix(new Ipv6Prefix(prefix)).build());
+ final String prefix = (String) ipv6Route.getChild(this.routePrefixIdentifier()).get().getValue();
+ prefs.add(new Ipv6PrefixesBuilder().setPathId(PathIdUtil.buildPathId(ipv6Route, this.routePathIdIdentifier())).setPrefix(new Ipv6Prefix(prefix)).build());
}
return prefs;
}
import org.opendaylight.yangtools.yang.binding.DataObject;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.opendaylight.yangtools.yang.binding.util.BindingReflections;
+import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
private BindingCodecTreeFactory codecFactory;
private RIBActivator a1;
RIBSupport ribSupport;
+ static final QName PREFIX_QNAME = QName.create(Ipv4Route.QNAME, "prefix").intern();
@Mock
private BGPDispatcher dispatcher;
Mockito.doCallRealMethod().when(candidate).toString();
final Collection<DataTreeCandidateNode> children = new HashSet<>();
for (final Ipv4Prefix p : prefix) {
- final NodeIdentifierWithPredicates routekey = new NodeIdentifierWithPredicates(Ipv4Route.QNAME, IPv4RIBSupport.PREFIX_QNAME, p);
+ final NodeIdentifierWithPredicates routekey = new NodeIdentifierWithPredicates(Ipv4Route.QNAME, PREFIX_QNAME, p);
final DataContainerNodeBuilder<NodeIdentifierWithPredicates, MapEntryNode> b = ImmutableNodes.mapEntryBuilder();
b.withNodeIdentifier(routekey);
- b.addChild(Builders.leafBuilder().withNodeIdentifier(new NodeIdentifier(IPv4RIBSupport.PREFIX_QNAME)).withValue(p).build());
+ b.addChild(Builders.leafBuilder().withNodeIdentifier(new NodeIdentifier(PREFIX_QNAME)).withValue(p).build());
final DataTreeCandidateNode child = Mockito.mock(DataTreeCandidateNode.class);
Mockito.doReturn(createIdentifier(target, p)).when(child).getIdentifier();
}
public PathArgument createIdentifier(final YangInstanceIdentifier base, final Ipv4Prefix prefix) {
- final NodeIdentifierWithPredicates routekey = new NodeIdentifierWithPredicates(Ipv4Route.QNAME, IPv4RIBSupport.PREFIX_QNAME, prefix);
- return YangInstanceIdentifier.of(IPv4RIBSupport.PREFIX_QNAME).node(routekey).getLastPathArgument();
+ final NodeIdentifierWithPredicates routekey = new NodeIdentifierWithPredicates(Ipv4Route.QNAME, PREFIX_QNAME, prefix);
+ return YangInstanceIdentifier.of(PREFIX_QNAME).node(routekey).getLastPathArgument();
}
public RIBImpl getRib() {
*/
package org.opendaylight.protocol.bgp.rib.impl;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.opendaylight.protocol.bgp.rib.impl.AbstractRIBTestSetup.PREFIX_QNAME;
import static org.opendaylight.protocol.bgp.rib.spi.PeerRoleUtil.PEER_ROLE_NID;
import com.google.common.base.Optional;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
-import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.opendaylight.protocol.bgp.rib.spi.RibSupportUtils;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.ipv4.routes.Ipv4Routes;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.ipv4.routes.ipv4.routes.Ipv4Route;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.BgpRib;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.rib.Peer;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.rib.peer.EffectiveRibIn;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.rib.peer.SupportedTables;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.tables.Routes;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.ClusterIdentifier;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv4AddressFamily;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate;
import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidateNode;
import org.opendaylight.yangtools.yang.data.api.schema.tree.ModificationType;
-import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
-import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
public class LocRibWriterTest {
@Mock
private RIBSupportContext context;
- @Mock
- private AbstractIPRIBSupport ribSupport;
-
@Mock
CheckedFuture<?, ?> future;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
- Mockito.doAnswer(new Answer<Object>() {
- @Override
- public Object answer(final InvocationOnMock invocation) throws Throwable {
- final Object[] args = invocation.getArguments();
- final NormalizedNode<?, ?> node = (NormalizedNode<?, ?>) args[2];
- if (node.getNodeType().equals(Ipv4Route.QNAME) || node.getNodeType().equals(IPv4RIBSupport.PREFIX_QNAME)) {
- LocRibWriterTest.this.routes.add((YangInstanceIdentifier) args[1]);
- }
- return args[1];
- }
- }).when(this.domTransWrite).put(Mockito.eq(LogicalDatastoreType.OPERATIONAL), Mockito.any(YangInstanceIdentifier.class), Mockito.any(NormalizedNode.class));
- Mockito.doAnswer(new Answer<Object>() {
+
+ Answer<Object> answer = new Answer<Object>() {
@Override
public Object answer(final InvocationOnMock invocation) throws Throwable {
final Object[] args = invocation.getArguments();
final NormalizedNode<?, ?> node = (NormalizedNode<?, ?>) args[2];
- if (node.getNodeType().equals(Ipv4Route.QNAME) || node.getNodeType().equals(IPv4RIBSupport.PREFIX_QNAME)) {
+ if (node.getNodeType().equals(Ipv4Route.QNAME) || node.getNodeType().equals(PREFIX_QNAME)) {
LocRibWriterTest.this.routes.add((YangInstanceIdentifier) args[1]);
}
return args[1];
}
- }).when(this.domTransWrite).merge(Mockito.eq(LogicalDatastoreType.OPERATIONAL), Mockito.any(YangInstanceIdentifier.class), Mockito.any(NormalizedNode.class));
- Mockito.doAnswer(new Answer<Object>() {
+ };
+ doAnswer(answer).when(this.domTransWrite).put(eq(LogicalDatastoreType.OPERATIONAL), any(YangInstanceIdentifier.class), any(NormalizedNode.class));
+ doAnswer(answer).when(this.domTransWrite).merge(eq(LogicalDatastoreType.OPERATIONAL), any(YangInstanceIdentifier.class), any(NormalizedNode.class));
+ doAnswer(new Answer<Object>() {
@Override
public Object answer(final InvocationOnMock invocation) throws Throwable {
LocRibWriterTest.this.routes.remove(args[1]);
return args[1];
}
- }).when(this.domTransWrite).delete(Mockito.eq(LogicalDatastoreType.OPERATIONAL), Mockito.any(YangInstanceIdentifier.class));
- Mockito.doReturn(this.context).when(this.registry).getRIBSupportContext(this.tablesKey);
- Mockito.doReturn(this.ribSupport).when(this.context).getRibSupport();
- Mockito.doReturn(this.domTransWrite).when(this.chain).newWriteOnlyTransaction();
- Mockito.doReturn(this.future).when(this.domTransWrite).submit();
- Mockito.doReturn(null).when(this.service).registerDataTreeChangeListener(Mockito.any(DOMDataTreeIdentifier.class), Mockito.any(DOMDataTreeChangeListener.class));
- Mockito.doReturn(Builders.choiceBuilder().withNodeIdentifier(new NodeIdentifier(Routes.QNAME)).addChild(Builders.containerBuilder().withNodeIdentifier(new NodeIdentifier(Ipv4Routes.QNAME)).withChild(ImmutableNodes.mapNodeBuilder(Ipv4Route.QNAME).build()).build()).build()).when(this.ribSupport).emptyRoutes();
+ }).when(this.domTransWrite).delete(eq(LogicalDatastoreType.OPERATIONAL), any(YangInstanceIdentifier.class));
+ doReturn(this.context).when(this.registry).getRIBSupportContext(any(TablesKey.class));
+ doReturn(IPv4RIBSupport.getInstance()).when(this.context).getRibSupport();
+ doReturn(this.domTransWrite).when(this.chain).newWriteOnlyTransaction();
+ doReturn(this.future).when(this.domTransWrite).submit();
+ doReturn(null).when(this.service).registerDataTreeChangeListener(any(DOMDataTreeIdentifier.class), any(DOMDataTreeChangeListener.class));
this.locRibWriter = LocRibWriter.create(this.registry, this.tablesKey, this.chain, YangInstanceIdentifier.of(BgpRib.QNAME),
new AsNumber((long) 35), this.service, this.pd, new CacheDisconnectedPeersImpl(), BasePathSelectionModeFactory.createBestPathSelectionStrategy());
}
private DataTreeCandidate prepareUpdate() {
- final DataTreeCandidate candidate = Mockito.mock(DataTreeCandidate.class);
- Mockito.doReturn("candidate").when(candidate).toString();
+ final DataTreeCandidate candidate = mock(DataTreeCandidate.class);
+ doReturn("candidate").when(candidate).toString();
final YangInstanceIdentifier rootPath = YangInstanceIdentifier.builder().node(BgpRib.QNAME).node(Peer.QNAME).nodeWithKey(Peer.QNAME, AdjRibInWriter.PEER_ID_QNAME, "12.12.12.12").build();
- Mockito.doReturn(rootPath).when(candidate).getRootPath();
+ doReturn(rootPath).when(candidate).getRootPath();
return candidate;
}
@Test
public void testUpdateSupportedTables() {
final DataTreeCandidate candidate = prepareUpdate();
- final DataTreeCandidateNode node = Mockito.mock(DataTreeCandidateNode.class);
- Mockito.doReturn("node").when(node).toString();
- final DataTreeCandidateNode tableChange = Mockito.mock(DataTreeCandidateNode.class);
+ final DataTreeCandidateNode node = mock(DataTreeCandidateNode.class);
+ doReturn("node").when(node).toString();
+ final DataTreeCandidateNode tableChange = mock(DataTreeCandidateNode.class);
// add
- final DataTreeCandidateNode table = Mockito.mock(DataTreeCandidateNode.class);
- final NormalizedNode<?, ?> dataAfter = Mockito.mock(NormalizedNode.class);
- Mockito.doReturn(RibSupportUtils.toYangTablesKey(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class)).when(dataAfter).getIdentifier();
- Mockito.doReturn(Optional.of(dataAfter)).when(table).getDataAfter();
- Mockito.doReturn(Lists.newArrayList(table)).when(tableChange).getChildNodes();
- Mockito.doReturn("table change").when(tableChange).toString();
- Mockito.doReturn(tableChange).when(node).getModifiedChild(YangInstanceIdentifier.of(SupportedTables.QNAME).getLastPathArgument());
- Mockito.doReturn(null).when(node).getModifiedChild(PEER_ROLE_NID);
- Mockito.doReturn(null).when(node).getModifiedChild(YangInstanceIdentifier.of(EffectiveRibIn.QNAME).getLastPathArgument());
- Mockito.doReturn(node).when(candidate).getRootNode();
- Mockito.doReturn(ModificationType.SUBTREE_MODIFIED).when(node).getModificationType();
+ final DataTreeCandidateNode table = mock(DataTreeCandidateNode.class);
+ final NormalizedNode<?, ?> dataAfter = mock(NormalizedNode.class);
+ doReturn(RibSupportUtils.toYangTablesKey(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class)).when(dataAfter).getIdentifier();
+ doReturn(Optional.of(dataAfter)).when(table).getDataAfter();
+ doReturn(Lists.newArrayList(table)).when(tableChange).getChildNodes();
+ doReturn("table change").when(tableChange).toString();
+ doReturn(tableChange).when(node).getModifiedChild(YangInstanceIdentifier.of(SupportedTables.QNAME).getLastPathArgument());
+ doReturn(null).when(node).getModifiedChild(PEER_ROLE_NID);
+ doReturn(null).when(node).getModifiedChild(YangInstanceIdentifier.of(EffectiveRibIn.QNAME).getLastPathArgument());
+ doReturn(node).when(candidate).getRootNode();
+ doReturn(ModificationType.SUBTREE_MODIFIED).when(node).getModificationType();
this.locRibWriter.onDataTreeChanged(Lists.newArrayList(candidate));
// delete
- final DataTreeCandidateNode tableDelete = Mockito.mock(DataTreeCandidateNode.class);
- Mockito.doReturn(Optional.absent()).when(tableDelete).getDataAfter();
- Mockito.doReturn(Lists.newArrayList(tableDelete)).when(tableChange).getChildNodes();
- Mockito.doReturn("table change").when(tableChange).toString();
- Mockito.doReturn(node).when(candidate).getRootNode();
+ final DataTreeCandidateNode tableDelete = mock(DataTreeCandidateNode.class);
+ doReturn(Optional.absent()).when(tableDelete).getDataAfter();
+ doReturn(Lists.newArrayList(tableDelete)).when(tableChange).getChildNodes();
+ doReturn("table change").when(tableChange).toString();
+ doReturn(node).when(candidate).getRootNode();
this.locRibWriter.onDataTreeChanged(Lists.newArrayList(candidate));
- Mockito.verify(node, Mockito.times(2)).getModifiedChild(YangInstanceIdentifier.of(SupportedTables.QNAME).getLastPathArgument());
+ verify(node, times(2)).getModifiedChild(YangInstanceIdentifier.of(SupportedTables.QNAME).getLastPathArgument());
}
}
public Object answer(final InvocationOnMock invocation) throws Throwable {
final Object[] args = invocation.getArguments();
final NormalizedNode<?,?>node = (NormalizedNode<?,?>)args[2];
- if (node.getIdentifier().getNodeType().equals(Ipv4Route.QNAME) || node.getNodeType().equals(IPv4RIBSupport.PREFIX_QNAME)) {
+ if (node.getIdentifier().getNodeType().equals(Ipv4Route.QNAME) || node.getNodeType().equals(PREFIX_QNAME)) {
PeerTest.this.routes.put((YangInstanceIdentifier) args[1], node);
}
return args[1];
*/
package org.opendaylight.protocol.bgp.rib.spi;
+import static org.opendaylight.protocol.bgp.parser.spi.PathIdUtil.NON_PATH_ID;
+
import com.google.common.annotations.Beta;
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
private static final NodeIdentifier ADVERTIZED_ROUTES = new NodeIdentifier(AdvertizedRoutes.QNAME);
private static final NodeIdentifier WITHDRAWN_ROUTES = new NodeIdentifier(WithdrawnRoutes.QNAME);
private static final NodeIdentifier DESTINATION_TYPE = new NodeIdentifier(DestinationType.QNAME);
- private static final NodeIdentifier ROUTES = new NodeIdentifier(Routes.QNAME);
+ protected static final NodeIdentifier ROUTES = new NodeIdentifier(Routes.QNAME);
protected static final ApplyRoute DELETE_ROUTE = new DeleteRoute();
- private static final long NON_PATH_ID = 0;
private final NodeIdentifier routesContainerIdentifier;
- private final NodeIdentifier routesListIdentifier;
+ protected final NodeIdentifier routesListIdentifier;
private final NodeIdentifier routeAttributesIdentifier;
private final Class<? extends Routes> cazeClass;
private final Class<? extends DataObject> containerClass;