RibSupport refactoring I 73/39273/3
authorClaudio D. Gasparini <cgaspari@cisco.com>
Fri, 20 May 2016 14:02:25 +0000 (16:02 +0200)
committerClaudio D. Gasparini <cgaspari@cisco.com>
Tue, 24 May 2016 08:11:13 +0000 (08:11 +0000)
Ipv4/Ipv6 RibSupport refactoring
Fix of key route key creation for Put/Delete routes,
adding path id as part of the key.

Change-Id: I04b6760b61e2043d19fa04f638240293e687c5ac
Signed-off-by: Claudio D. Gasparini <cgaspari@cisco.com>
bgp/flowspec/src/main/java/org/opendaylight/protocol/bgp/flowspec/AbstractFlowspecRIBSupport.java
bgp/labeled-unicast/src/main/java/org/opendaylight/protocol/bgp/labeled/unicast/LabeledUnicastRIBSupport.java
bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/PathIdUtil.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/AbstractIPRIBSupport.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/IPv4RIBSupport.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/IPv6RIBSupport.java
bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/AbstractRIBTestSetup.java
bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/LocRibWriterTest.java
bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/PeerTest.java
bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/AbstractRIBSupport.java

index ba6c83ad32da923e3e2c74db61add60c520d8b2c..be2e21672601d5fce11b7845ef18ca8425f9e23f 100644 (file)
@@ -123,7 +123,7 @@ public abstract class AbstractFlowspecRIBSupport extends AbstractRIBSupport {
     @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
index a1a40416bb2561b05feab000254fa81f39fa400c..7a2bd0adb367ba8c565b86dfcf1cfdf173ec68f9 100644 (file)
@@ -234,7 +234,7 @@ public final class LabeledUnicastRIBSupport extends AbstractRIBSupport {
     @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
index 76e4d61a6a3f067d6baab06283d730abd7a681e1..2d0c9eaaf12dec897dcbc95c0dafdaec95b9a1f1 100644 (file)
@@ -8,21 +8,23 @@
 
 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();
@@ -57,15 +59,12 @@ public final class PathIdUtil {
      *
      * @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;
     }
 
     /**
@@ -76,13 +75,17 @@ public final class PathIdUtil {
      * @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);
     }
 
@@ -95,6 +98,24 @@ public final class PathIdUtil {
      */
     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);
     }
 }
index c6faf6b4e44ab09c6b96259e6f1948944ba69430..c15dcfc9d0cd19ff0ad8912ee4c0c42f5ced25db 100644 (file)
@@ -11,22 +11,39 @@ import com.google.common.base.Optional;
 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;
 
@@ -35,57 +52,139 @@ 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);
@@ -94,26 +193,23 @@ abstract class AbstractIPRIBSupport extends AbstractRIBSupport {
         }
     }
 
-    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);
 }
index 38da40cc91f9705a737b293faaa3f107663fbee6..aecddfaa4eb118dfafe0a7d6e032c331d6ad994c 100644 (file)
@@ -7,9 +7,6 @@
  */
 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;
@@ -24,135 +21,47 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet
 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();
     }
 }
index a6f55642475515760ccfe7a04c4ef5f984c15eeb..434731cabfc93b4192ba3e500cf44db43920cb87 100644 (file)
@@ -7,11 +7,10 @@
  */
 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;
@@ -22,116 +21,45 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet
 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;
     }
index fe741167d713330e19eb17d9a5a07c28da2b870d..db0bd06597ae58df872288ecce3b5ef939be1b50 100755 (executable)
@@ -69,6 +69,7 @@ import org.opendaylight.yangtools.sal.binding.generator.util.JavassistUtils;
 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;
@@ -94,6 +95,7 @@ public class AbstractRIBTestSetup {
     private BindingCodecTreeFactory codecFactory;
     private RIBActivator a1;
     RIBSupport ribSupport;
+    static final QName PREFIX_QNAME = QName.create(Ipv4Route.QNAME, "prefix").intern();
 
     @Mock
     private BGPDispatcher dispatcher;
@@ -208,10 +210,10 @@ public class AbstractRIBTestSetup {
         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();
@@ -225,8 +227,8 @@ public class AbstractRIBTestSetup {
     }
 
     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() {
index f85982c35c912d60bb5693ed54a1e60dce1c9869..90ca7bc0b5c6efbf7995089a5309d6aaf2403d44 100644 (file)
@@ -7,6 +7,14 @@
  */
 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;
@@ -17,7 +25,6 @@ import java.util.List;
 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;
@@ -33,25 +40,20 @@ import org.opendaylight.protocol.bgp.rib.impl.spi.RIBSupportContextRegistry;
 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 {
 
@@ -72,9 +74,6 @@ public class LocRibWriterTest {
     @Mock
     private RIBSupportContext context;
 
-    @Mock
-    private AbstractIPRIBSupport ribSupport;
-
     @Mock
     CheckedFuture<?, ?> future;
 
@@ -86,29 +85,21 @@ public class LocRibWriterTest {
     @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 {
@@ -116,51 +107,50 @@ public class LocRibWriterTest {
                 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());
     }
 }
index 4aff5892fab91b190197678fdb70509d23c956f5..aa2e1a63a5275feb9216d784b7653383577e963a 100644 (file)
@@ -85,7 +85,7 @@ public class PeerTest extends AbstractRIBTestSetup {
             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];
index a0a9b8ce86c3f102520caab347f2874b22e44d91..25a3d42ac029942f4342e05a191431a53119d806 100644 (file)
@@ -7,6 +7,8 @@
  */
 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;
@@ -59,12 +61,11 @@ public abstract class AbstractRIBSupport implements RIBSupport {
     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;