Changed instance idetifier for writing/deleting routes operations in RIBSupport.
Now identifier has to point to table's routes choice data node.
The change allows to properly use write/delete routes DOM operations out of "rib-api" module namespace.
Change-Id: I4b877683fdb5232179da05eab78120187a2fcf4f
Signed-off-by: Milos Fabian <milfabia@cisco.com>
return this.destination;
}
- private void processDestination(final DOMDataWriteTransaction tx, final YangInstanceIdentifier tablePath,
+ private void processDestination(final DOMDataWriteTransaction tx, final YangInstanceIdentifier routesPath,
final ContainerNode destination, final ContainerNode attributes, final ApplyRoute function) {
if (destination != null) {
final Optional<DataContainerChild<? extends PathArgument, ?>> maybeRoutes = destination.getChild(this.nlriRoutesList);
if (maybeRoutes.isPresent()) {
final DataContainerChild<? extends PathArgument, ?> routes = maybeRoutes.get();
if (routes instanceof UnkeyedListNode) {
- final YangInstanceIdentifier base = tablePath.node(ROUTES).node(routesContainerIdentifier()).node(this.route);
+ final YangInstanceIdentifier base = routesPath.node(routesContainerIdentifier()).node(this.route);
for (final UnkeyedListEntryNode e : ((UnkeyedListNode)routes).getValue()) {
final NodeIdentifierWithPredicates routeKey = new NodeIdentifierWithPredicates(FlowspecRoute.QNAME, ROUTE_KEY, FSNlriParser.stringNlri(e));
function.apply(tx, base, routeKey, e, attributes);
@Override
protected void deleteDestinationRoutes(final DOMDataWriteTransaction tx, final YangInstanceIdentifier tablePath,
- final ContainerNode destination) {
- processDestination(tx, tablePath, destination, null, DELETE_ROUTE);
+ final ContainerNode destination, final NodeIdentifier routesNodeId) {
+ processDestination(tx, tablePath.node(routesNodeId), destination, null, DELETE_ROUTE);
}
@Override
protected void putDestinationRoutes(final DOMDataWriteTransaction tx, final YangInstanceIdentifier tablePath,
- final ContainerNode destination, final ContainerNode attributes) {
- processDestination(tx, tablePath, destination, attributes, this.putRoute);
+ final ContainerNode destination, final ContainerNode attributes, final NodeIdentifier routesNodeId) {
+ processDestination(tx, tablePath.node(routesNodeId), destination, attributes, this.putRoute);
}
@Override
@Override
protected void deleteDestinationRoutes(final DOMDataWriteTransaction tx, final YangInstanceIdentifier tablePath,
- final ContainerNode destination) {
- processDestination(tx, tablePath, destination, null, DELETE_ROUTE);
+ final ContainerNode destination, final NodeIdentifier routesNodeId) {
+ processDestination(tx, tablePath.node(routesNodeId), destination, null, DELETE_ROUTE);
}
- private void processDestination(final DOMDataWriteTransaction tx, final YangInstanceIdentifier tablePath,
+ private void processDestination(final DOMDataWriteTransaction tx, final YangInstanceIdentifier routesPath,
final ContainerNode destination, final ContainerNode attributes, final ApplyRoute function) {
if (destination != null) {
final Optional<DataContainerChild<? extends PathArgument, ?>> maybeRoutes = destination.getChild(this.nlriRoutesList);
if (maybeRoutes.isPresent()) {
final DataContainerChild<? extends PathArgument, ?> routes = maybeRoutes.get();
if (routes instanceof UnkeyedListNode) {
- final YangInstanceIdentifier base = tablePath.node(ROUTES).node(routesContainerIdentifier()).node(this.route);
+ final YangInstanceIdentifier base = routesPath.node(routesContainerIdentifier()).node(this.route);
for (final UnkeyedListEntryNode e : ((UnkeyedListNode)routes).getValue()) {
final NodeIdentifierWithPredicates routeKey = createRouteKey(e);
function.apply(tx, base, routeKey, e, attributes);
@Override
protected void putDestinationRoutes(final DOMDataWriteTransaction tx, final YangInstanceIdentifier tablePath,
- final ContainerNode destination, final ContainerNode attributes) {
- processDestination(tx, tablePath, destination, attributes, this.putRoute);
+ final ContainerNode destination, final ContainerNode attributes, final NodeIdentifier routesNodeId) {
+ processDestination(tx, tablePath.node(routesNodeId), destination, attributes, this.putRoute);
}
private NodeIdentifierWithPredicates createRouteKey(final UnkeyedListEntryNode linkstate) {
package org.opendaylight.protocol.bgp.linkstate;
import static org.junit.Assert.assertEquals;
+
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
public class LinkstateRIBSupportTest {
private static final Ipv4Address ipv4 = new Ipv4Address("42.42.42.42");
+ private static final NodeIdentifier ROUTES_NODE_ID = new NodeIdentifier(Routes.QNAME);
final LinkstateRIBSupport link = LinkstateRIBSupport.getInstance();
final List<MapEntryNode> linkList = new ArrayList<>();
private List<YangInstanceIdentifier> routes;
@Override
public Object answer(final InvocationOnMock invocation) throws Throwable {
final Object[] args = invocation.getArguments();
- LinkstateRIBSupportTest.this.routes.remove((YangInstanceIdentifier) args[1]);
+ LinkstateRIBSupportTest.this.routes.remove(args[1]);
return args[1];
}
}).when(this.tx).delete(Mockito.any(LogicalDatastoreType.class), Mockito.any(YangInstanceIdentifier.class));
@Test
public void testbuildReach() throws BGPParsingException {
final CNextHop hop = new Ipv4NextHopCaseBuilder().setIpv4NextHop(new Ipv4NextHopBuilder().setGlobal(ipv4).build()).build();
- MpReachNlri result = link.buildReach(linkList, hop);
+ final MpReachNlri result = link.buildReach(linkList, hop);
assertEquals(LinkstateAddressFamily.class, result.getAfi());
assertEquals(LinkstateSubsequentAddressFamily.class, result.getSafi());
assertEquals(new Ipv4NextHopCaseBuilder().setIpv4NextHop(new Ipv4NextHopBuilder().setGlobal(new Ipv4Address("42.42.42.42")).build()).build(), result.getCNextHop());
.withNodeIdentifier(new NodeIdentifier(Attributes.QNAME))
.build();
- link.putDestinationRoutes(tx, yangIdentifier, destination, attributes);
+ link.putDestinationRoutes(tx, yangIdentifier, destination, attributes, ROUTES_NODE_ID);
Assert.assertEquals(1, this.routes.size());
- link.deleteDestinationRoutes(tx, yangIdentifier, destination);
+ link.deleteDestinationRoutes(tx, yangIdentifier, destination, ROUTES_NODE_ID);
Assert.assertEquals(0, this.routes.size());
}
}
private static final Logger LOG = LoggerFactory.getLogger(AbstractIPRIBSupport.class);
- private static final NodeIdentifier ROUTES = new NodeIdentifier(Routes.QNAME);
private static final ApplyRoute DELETE_ROUTE = new DeleteRoute();
private final ApplyRoute putRoute = new PutRoute();
return false;
}
- private void processDestination(final DOMDataWriteTransaction tx, final YangInstanceIdentifier tablePath,
+ private void processDestination(final DOMDataWriteTransaction tx, final YangInstanceIdentifier routesPath,
final ContainerNode destination, final ContainerNode attributes, final ApplyRoute function) {
if (destination != null) {
final Optional<DataContainerChild<? extends PathArgument, ?>> maybeRoutes = destination.getChild(nlriRoutesListIdentifier());
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 = tablePath.node(ROUTES).node(routesContainerIdentifier()).node(routeIdentifier());
+ final YangInstanceIdentifier base = routesPath.node(routesContainerIdentifier()).node(routeIdentifier());
for (final UnkeyedListEntryNode e : ((UnkeyedListNode)routes).getValue()) {
final NodeIdentifierWithPredicates routeKey = createRouteKey(e);
function.apply(tx, base, routeKey, e, attributes);
@Override
- protected void putDestinationRoutes(final DOMDataWriteTransaction tx, final YangInstanceIdentifier tablePath, final ContainerNode destination, final ContainerNode attributes) {
- processDestination(tx, tablePath, destination, attributes, this.putRoute);
+ 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) {
- processDestination(tx, tablePath, destination, null, DELETE_ROUTE);
+ protected void deleteDestinationRoutes(final DOMDataWriteTransaction tx, final YangInstanceIdentifier tablePath,
+ final ContainerNode destination, final NodeIdentifier routesNodeId) {
+ processDestination(tx, tablePath.node(routesNodeId), destination, null, DELETE_ROUTE);
}
}
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);
- protected static final NodeIdentifier ROUTES = new NodeIdentifier(Routes.QNAME);
+ private static final NodeIdentifier ROUTES = new NodeIdentifier(Routes.QNAME);
private final NodeIdentifier routesContainerIdentifier;
private final NodeIdentifier routesListIdentifier;
* @param tx DOMDataWriteTransaction to be passed into implementation
* @param tablePath YangInstanceIdentifier to be passed into implementation
* @param destination ContainerNode DOM representation of NLRI in Update message
+ * @param routesNodeId NodeIdentifier
*/
- protected abstract void deleteDestinationRoutes(DOMDataWriteTransaction tx, YangInstanceIdentifier tablePath, ContainerNode destination);
+ protected abstract void deleteDestinationRoutes(DOMDataWriteTransaction tx, YangInstanceIdentifier tablePath, ContainerNode destination, NodeIdentifier routesNodeId);
/**
* Given the destination as ContainerNode, implementation needs to parse the DOM model
* @param tablePath YangInstanceIdentifier to be passed into implementation
* @param destination ContainerNode DOM representation of NLRI in Update message
* @param attributes ContainerNode to be passed into implementation
+ * @param routesNodeId NodeIdentifier
*/
- protected abstract void putDestinationRoutes(DOMDataWriteTransaction tx, YangInstanceIdentifier tablePath, ContainerNode destination, ContainerNode attributes);
+ protected abstract void putDestinationRoutes(DOMDataWriteTransaction tx, YangInstanceIdentifier tablePath, ContainerNode destination, ContainerNode attributes,
+ NodeIdentifier routesNodeId);
private static ContainerNode getDestination(final DataContainerChild<? extends PathArgument, ?> routes, final NodeIdentifier destinationId) {
if (routes instanceof ContainerNode) {
@Override
public final void deleteRoutes(final DOMDataWriteTransaction tx, final YangInstanceIdentifier tablePath, final ContainerNode nlri) {
- final Optional<DataContainerChild<? extends PathArgument, ?>> maybeRoutes = nlri.getChild(WITHDRAWN_ROUTES);
- if (maybeRoutes.isPresent()) {
- final ContainerNode destination = getDestination(maybeRoutes.get(), destinationContainerIdentifier());
- if (destination != null) {
- deleteDestinationRoutes(tx, tablePath, destination);
- }
- } else {
- LOG.debug("Withdrawn routes are not present in NLRI {}", nlri);
- }
+ deleteRoutes(tx, tablePath, nlri, ROUTES);
}
@Override
public final void putRoutes(final DOMDataWriteTransaction tx, final YangInstanceIdentifier tablePath, final ContainerNode nlri, final ContainerNode attributes) {
- final Optional<DataContainerChild<? extends PathArgument, ?>> maybeRoutes = nlri.getChild(ADVERTIZED_ROUTES);
- if (maybeRoutes.isPresent()) {
- final ContainerNode destination = getDestination(maybeRoutes.get(), destinationContainerIdentifier());
- if (destination != null) {
- putDestinationRoutes(tx, tablePath, destination, attributes);
- }
- } else {
- LOG.debug("Advertized routes are not present in NLRI {}", nlri);
- }
+ putRoutes(tx, tablePath, nlri, attributes, ROUTES);
}
/**
ub.setAttributes(ab.build());
return ub.build();
}
+
+ @Override
+ public final void deleteRoutes(final DOMDataWriteTransaction tx, final YangInstanceIdentifier tablePath, final ContainerNode nlri,
+ final NodeIdentifier routesNodeId) {
+ final Optional<DataContainerChild<? extends PathArgument, ?>> maybeRoutes = nlri.getChild(WITHDRAWN_ROUTES);
+ if (maybeRoutes.isPresent()) {
+ final ContainerNode destination = getDestination(maybeRoutes.get(), destinationContainerIdentifier());
+ if (destination != null) {
+ deleteDestinationRoutes(tx, tablePath, destination, routesNodeId);
+ }
+ } else {
+ LOG.debug("Withdrawn routes are not present in NLRI {}", nlri);
+ }
+ }
+
+ @Override
+ public final void putRoutes(final DOMDataWriteTransaction tx, final YangInstanceIdentifier tablePath, final ContainerNode nlri,
+ final ContainerNode attributes, final NodeIdentifier routesNodeId) {
+ final Optional<DataContainerChild<? extends PathArgument, ?>> maybeRoutes = nlri.getChild(ADVERTIZED_ROUTES);
+ if (maybeRoutes.isPresent()) {
+ final ContainerNode destination = getDestination(maybeRoutes.get(), destinationContainerIdentifier());
+ if (destination != null) {
+ putDestinationRoutes(tx, tablePath, destination, attributes, routesNodeId);
+ }
+ } else {
+ LOG.debug("Advertized routes are not present in NLRI {}", nlri);
+ }
+ }
+
}
*/
void deleteRoutes(@Nonnull DOMDataWriteTransaction tx, @Nonnull YangInstanceIdentifier tablePath, @Nonnull ContainerNode nlri);
+
+ /**
+ * Given the NLRI as ContainerNode, this method should extract withdrawn routes
+ * from the DOM model and delete them from RIBs.
+ * <p>
+ * Use this method when removing routes stored in RIBs out of the "bgp-rib" module.
+ * Provide {@link NodeIdentifier} with customized "routes" QName.
+ * For default "bgp-rib" RIBs use {@link #deleteRoutes}
+ * </p>
+ *
+ * @param tx DOMDataWriteTransaction
+ * @param tablePath YangInstanceIdentifier
+ * @param nlri ContainerNode DOM representation of NLRI in Update message
+ * @param routesNodeId NodeIdentifier of "routes" data node
+ */
+ void deleteRoutes(@Nonnull DOMDataWriteTransaction tx, @Nonnull YangInstanceIdentifier tablePath, @Nonnull ContainerNode nlri, @Nonnull NodeIdentifier routesNodeId);
+
/**
* Given the NLRI as ContainerNode, this method should extract advertised routes
* from the DOM model and put them into RIBs.
*/
void putRoutes(@Nonnull DOMDataWriteTransaction tx, @Nonnull YangInstanceIdentifier tablePath, @Nonnull ContainerNode nlri, @Nonnull ContainerNode attributes);
+ /**
+ * Given the NLRI as ContainerNode, this method should extract advertised routes
+ * from the DOM model and put them into RIBs.
+ * <p>
+ * Use this method when putting routes stored in RIBs out of the "bgp-rib" module.
+ * Provide {@link NodeIdentifier} with customized "routes" QName.
+ * For default "bgp-rib" RIBs use {@link #putRoutes}
+ * </p>
+ *
+ * @param tx DOMDataWriteTransaction
+ * @param tablePath YangInstanceIdentifier
+ * @param nlri ContainerNode DOM representation of NLRI in Update message
+ * @param attributes ContainerNode
+ * @param routesNodeId NodeIdentifier of "routes" data node
+ */
+ void putRoutes(@Nonnull DOMDataWriteTransaction tx, @Nonnull YangInstanceIdentifier tablePath, @Nonnull ContainerNode nlri,
+ @Nonnull ContainerNode attributes, @Nonnull NodeIdentifier routesNodeId);
+
/**
* Returns routes that were modified within this RIB support instance.
*
@Override
protected void deleteDestinationRoutes(final DOMDataWriteTransaction tx, final YangInstanceIdentifier tablePath,
- final ContainerNode destination) {
+ final ContainerNode destination, final NodeIdentifier routesNodeId) {
AbstractRIBSupportTest.dest = destination;
}
@Override
protected void putDestinationRoutes(final DOMDataWriteTransaction tx, final YangInstanceIdentifier tablePath,
- final ContainerNode destination, final ContainerNode attributes) {
+ final ContainerNode destination, final ContainerNode attributes, final NodeIdentifier routesNodeId) {
AbstractRIBSupportTest.dest = destination;
}