From 4e8127d8f74726b2ffdf8af89ae879cfa79466f6 Mon Sep 17 00:00:00 2001 From: Michal Cmarada Date: Fri, 22 Jun 2018 11:02:27 +0200 Subject: HC2VPP-344: Add FIB table management for routing - update models with FIB table management - fixes implementation for FIB table management Change-Id: I5cf397d6e827cb14df970e14ee268ef870931bd4 Signed-off-by: Michal Cmarada --- .../write/factory/TableLookupRequestFactory.java | 61 +++++++++++++++------- 1 file changed, 42 insertions(+), 19 deletions(-) (limited to 'routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/write/factory/TableLookupRequestFactory.java') diff --git a/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/write/factory/TableLookupRequestFactory.java b/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/write/factory/TableLookupRequestFactory.java index 8a11adc8f..99b2b1f10 100644 --- a/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/write/factory/TableLookupRequestFactory.java +++ b/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/write/factory/TableLookupRequestFactory.java @@ -17,24 +17,29 @@ package io.fd.hc2vpp.routing.write.factory; import io.fd.hc2vpp.common.translate.util.NamingContext; +import io.fd.hc2vpp.fib.management.FibManagementIIds; import io.fd.hc2vpp.routing.write.factory.base.BasicHopRequestFactory; import io.fd.hc2vpp.routing.write.trait.RouteRequestProducer; import io.fd.hc2vpp.vpp.classifier.context.VppClassifierContextManager; -import io.fd.honeycomb.translate.MappingContext; +import io.fd.honeycomb.translate.write.WriteContext; import io.fd.vpp.jvpp.core.dto.IpAddDelRoute; import java.util.Optional; import javax.annotation.Nonnull; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Prefix; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv4.unicast.routing.rev180313.routing.control.plane.protocols.control.plane.protocol._static.routes.ipv4.Route; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev180313.next.hop.content.NextHopOptions; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev180313.next.hop.content.next.hop.options.TableLookupCase; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.vpp.ipv4.unicast.routing.rev180319.VppIpv4RouteAttributesAugmentation; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.vpp.ipv4.unicast.routing.rev180319.routing.control.plane.protocols.control.plane.protocol._static.routes.ipv4.route.VppIpv4Route; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.vpp.ipv6.unicast.routing.rev180319.VppIpv6RouteAttributesAugmentation; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.vpp.ipv6.unicast.routing.rev180319.routing.control.plane.protocols.control.plane.protocol._static.routes.ipv6.route.VppIpv6Route; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.vpp.routing.rev180319.VppRouteAttributes; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.vpp.routing.types.rev180406.VniReference; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.fib.table.management.rev180521.Ipv4; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.fib.table.management.rev180521.Ipv6; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.fib.table.management.rev180521.VniReference; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.fib.table.management.rev180521.vpp.fib.table.management.fib.tables.Table; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.fib.table.management.rev180521.vpp.fib.table.management.fib.tables.TableKey; +import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier; public class TableLookupRequestFactory extends BasicHopRequestFactory implements RouteRequestProducer { @@ -50,20 +55,27 @@ public class TableLookupRequestFactory extends BasicHopRequestFactory implements public IpAddDelRoute createV4TableLookupRouteRequest(final boolean add, @Nonnull final String parentProtocolName, @Nonnull final Route route, - @Nonnull final MappingContext mappingContext) { + @Nonnull final WriteContext writeContext) { final Ipv4Prefix prefix = route.getDestinationPrefix(); final byte[] destinationAddress = ipv4AddressPrefixToArray(prefix); final byte destinationPrefix = extractPrefix(prefix); - final int primaryTableId = getRoutingProtocolContext().getIndex(parentProtocolName, mappingContext); - final byte secondaryTableId = Optional.ofNullable(route.getNextHop().getNextHopOptions()) + final int primaryTableId = getRoutingProtocolContext().getIndex(parentProtocolName, + writeContext.getMappingContext()); + final Long secondaryTableId = Optional.ofNullable(route.getNextHop().getNextHopOptions()) .filter(nextHopOptions -> nextHopOptions instanceof TableLookupCase) .map(TableLookupCase.class::cast) .map(TableLookupCase::getSecondaryVrf) .map(VniReference::getValue) - .map(Long::byteValue) .orElseThrow(() -> new IllegalArgumentException("Table lookup option not specified correctly")); + TableKey key = new TableKey(Ipv4.class, new VniReference(secondaryTableId)); + KeyedInstanceIdentifier fibIid = FibManagementIIds.FM_FIB_TABLES.child(Table.class, key); + if (!writeContext.readAfter(fibIid).isPresent()) { + throw new IllegalArgumentException( + String.format("Lookup table: %s not found for route: %s", secondaryTableId, route)); + } + VppIpv4Route vppIpv4Route = route.getAugmentation(VppIpv4RouteAttributesAugmentation.class) != null ? route.getAugmentation( VppIpv4RouteAttributesAugmentation.class).getVppIpv4Route() : null; @@ -71,42 +83,53 @@ public class TableLookupRequestFactory extends BasicHopRequestFactory implements final Optional optClassifyTable = Optional.ofNullable(vppIpv4Route) .map(VppRouteAttributes::getClassifyTable); final byte classifyTableSet = booleanToByte(optClassifyTable.isPresent()); - final byte classifyTableIndex = optClassifyTable.map(tableName -> classifyTableIndex(tableName, getVppClassifierContextManager(), mappingContext)) + final byte classifyTableIndex = optClassifyTable + .map(tableName -> classifyTableIndex(tableName, getVppClassifierContextManager(), + writeContext.getMappingContext())) .map(Integer::byteValue) .orElse(DEFAULT_CLASSIFY_TABLE_INDEX); - return flaglessAddDelRouteRequest(booleanToByte(add), ~0, DEAGRAGATION_ADDRESS, (byte) 0, (byte) 0, destinationAddress, - destinationPrefix, (byte) 0, primaryTableId, secondaryTableId, classifyTableIndex, classifyTableSet); + return flaglessAddDelRouteRequest(booleanToByte(add), ~0, DEAGRAGATION_ADDRESS, (byte) 0, (byte) 0, + destinationAddress, destinationPrefix, (byte) 0, primaryTableId, secondaryTableId.intValue(), + classifyTableIndex, classifyTableSet); } public IpAddDelRoute createV6TableLookupRouteRequest(final boolean add, @Nonnull final String parentProtocolName, @Nonnull final org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv6.unicast.routing.rev180313.routing.control.plane.protocols.control.plane.protocol._static.routes.ipv6.Route route, - @Nonnull final MappingContext mappingContext) { + @Nonnull final WriteContext writeContext) { final Ipv6Prefix prefix = route.getDestinationPrefix(); final byte[] destinationAddress = ipv6AddressPrefixToArray(prefix); final byte destinationPrefix = extractPrefix(prefix); - final int primaryTableId = getRoutingProtocolContext().getIndex(parentProtocolName, mappingContext); - final byte secondaryTableId = Optional.ofNullable(route.getNextHop().getNextHopOptions()) + final int primaryTableId = + getRoutingProtocolContext().getIndex(parentProtocolName, writeContext.getMappingContext()); + final Long secondaryTableId = Optional.ofNullable(route.getNextHop().getNextHopOptions()) .filter(nextHopOptions -> nextHopOptions instanceof TableLookupCase) .map(TableLookupCase.class::cast) .map(TableLookupCase::getSecondaryVrf) .map(VniReference::getValue) - .map(Long::byteValue) .orElseThrow(() -> new IllegalArgumentException("Table lookup option not specified correctly")); + TableKey key = new TableKey(Ipv6.class, new VniReference(secondaryTableId)); + KeyedInstanceIdentifier fibIid = FibManagementIIds.FM_FIB_TABLES.child(Table.class, key); + if (!writeContext.readAfter(fibIid).isPresent()) { + throw new IllegalArgumentException( + String.format("Lookup table: %s not found for route: %s", secondaryTableId, route)); + } + VppIpv6Route vppIpv6Route = route.getAugmentation(VppIpv6RouteAttributesAugmentation.class) != null ? route.getAugmentation(VppIpv6RouteAttributesAugmentation.class).getVppIpv6Route() : null; final Optional optClassifyTable = Optional.ofNullable(vppIpv6Route) .map(VppRouteAttributes::getClassifyTable); final byte classifyTableSet = booleanToByte(optClassifyTable.isPresent()); - final byte classifyTableIndex = optClassifyTable.map(tableName -> classifyTableIndex(tableName, getVppClassifierContextManager(), mappingContext)) - .map(Integer::byteValue) - .orElse(DEFAULT_CLASSIFY_TABLE_INDEX); + final byte classifyTableIndex = optClassifyTable + .map(tableName -> classifyTableIndex(tableName, getVppClassifierContextManager(), + writeContext.getMappingContext())).map(Integer::byteValue).orElse(DEFAULT_CLASSIFY_TABLE_INDEX); - return flaglessAddDelRouteRequest(booleanToByte(add), ~0, DEAGRAGATION_ADDRESS, (byte) 0, (byte) 1, destinationAddress, - destinationPrefix, (byte) 0, primaryTableId, secondaryTableId, classifyTableIndex, classifyTableSet); + return flaglessAddDelRouteRequest(booleanToByte(add), ~0, DEAGRAGATION_ADDRESS, (byte) 0, (byte) 1, + destinationAddress, destinationPrefix, (byte) 0, primaryTableId, secondaryTableId.intValue(), + classifyTableIndex, classifyTableSet); } } -- cgit 1.2.3-korg