diff options
author | Michal Cmarada <michal.cmarada@pantheon.tech> | 2018-06-22 11:02:27 +0200 |
---|---|---|
committer | Marek Gradzki <mgradzki@cisco.com> | 2018-06-22 10:53:36 +0000 |
commit | 4e8127d8f74726b2ffdf8af89ae879cfa79466f6 (patch) | |
tree | 7e0b7932decf0c67781a4f556db6089cb0bec818 /routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/write/factory/TableLookupRequestFactory.java | |
parent | b9e58bf303a099805ecb24ca3a97027b3c34a211 (diff) |
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 <michal.cmarada@pantheon.tech>
Diffstat (limited to 'routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/write/factory/TableLookupRequestFactory.java')
-rw-r--r-- | routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/write/factory/TableLookupRequestFactory.java | 61 |
1 files changed, 42 insertions, 19 deletions
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<Table, TableKey> 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<String> 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<Table, TableKey> 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<String> 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); } } |