diff options
Diffstat (limited to 'routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/write/ControlPlaneProtocolCustomizer.java')
-rw-r--r-- | routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/write/ControlPlaneProtocolCustomizer.java | 97 |
1 files changed, 46 insertions, 51 deletions
diff --git a/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/write/ControlPlaneProtocolCustomizer.java b/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/write/ControlPlaneProtocolCustomizer.java index b68a503be..67a907326 100644 --- a/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/write/ControlPlaneProtocolCustomizer.java +++ b/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/write/ControlPlaneProtocolCustomizer.java @@ -20,9 +20,8 @@ import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkState; import io.fd.hc2vpp.common.translate.util.NamingContext; -import io.fd.hc2vpp.fib.management.services.FibTableService; +import io.fd.hc2vpp.fib.management.FibManagementIIds; import io.fd.honeycomb.translate.MappingContext; -import io.fd.honeycomb.translate.read.ReadFailedException; import io.fd.honeycomb.translate.spi.write.ListWriterCustomizer; import io.fd.honeycomb.translate.write.WriteContext; import io.fd.honeycomb.translate.write.WriteFailedException; @@ -31,66 +30,36 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev180313.routing.control.plane.protocols.ControlPlaneProtocol; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev180313.routing.control.plane.protocols.ControlPlaneProtocolKey; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.vpp.routing.rev180319.RoutingProtocolVppAttr; +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.InstanceIdentifier; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Customizer for handling of write operations for {@link ControlPlaneProtocol} */ final class ControlPlaneProtocolCustomizer implements ListWriterCustomizer<ControlPlaneProtocol, ControlPlaneProtocolKey> { - private static final Logger LOG = LoggerFactory.getLogger(ControlPlaneProtocolCustomizer.class); private final NamingContext routingProtocolContext; - private final FibTableService fibTableService; - ControlPlaneProtocolCustomizer(@Nonnull final NamingContext routingProtocolContext, - FibTableService fibTableService) { + ControlPlaneProtocolCustomizer(@Nonnull final NamingContext routingProtocolContext) { this.routingProtocolContext = routingProtocolContext; - this.fibTableService = fibTableService; } - @Override - public void writeCurrentAttributes(@Nonnull final InstanceIdentifier<ControlPlaneProtocol> instanceIdentifier, - @Nonnull final ControlPlaneProtocol routingProtocol, - @Nonnull final WriteContext writeContext) - throws WriteFailedException { - checkIsStatic(routingProtocol); + static Long extractTableId(final ControlPlaneProtocol protocol) { + final RoutingProtocolVppAttr vppAttr = protocol.getAugmentation(RoutingProtocolVppAttr.class); - final int tableId = extractTableId(routingProtocol); - final MappingContext mappingContext = writeContext.getMappingContext(); - final String newProtocolName = routingProtocol.getName(); + checkState(vppAttr != null && vppAttr.getVppProtocolAttributes() != null, + "Vpp routing protocol attributes not defined"); - // enclosed in synchronized block to prevent change of state after containsName/before addName - synchronized (routingProtocolContext) { - if (!routingProtocolContext.containsName(tableId, mappingContext)) { - // Todo HC2VPP-317: A proper solution for Fib table management should be implemented. This is a - // temporary workaround. + return vppAttr.getVppProtocolAttributes().getPrimaryVrf().getValue(); + } - // if not present in mapping,create assignment to table id, then create ip v4/v6 fib table on device - try { - fibTableService.checkTableExist(tableId, writeContext.getModificationCache()); - } catch (ReadFailedException e) { - LOG.error("VRF Fib table read failed for table {} with iid: {}. Aborting write operation", tableId, - instanceIdentifier); - throw new WriteFailedException(instanceIdentifier, e); - } catch (FibTableService.FibTableDoesNotExistException e) { - LOG.trace("VRF Fib table does not exist. creating new entry for Fib table.", e); - // Write IPv4 and IPv6 Fib table for this VRF - fibTableService.write(instanceIdentifier, tableId, "Vrf-IPv4-" + tableId, false); - fibTableService.write(instanceIdentifier, tableId, "Vrf-IPv6-" + tableId, true); - } - routingProtocolContext.addName(tableId, newProtocolName, mappingContext); - } else { - // prevent to fail while restoring data(trying to remap already mapped name) - if (!newProtocolName.equals(routingProtocolContext.getName(tableId, mappingContext))) { - throw new IllegalStateException(String.format( - "An attempt to assign protocol %s to table id %s. Table id already assigned to protocol %s", - newProtocolName, tableId, routingProtocolContext.getName(tableId, mappingContext))); - } - } - } + static boolean isTablePresent(@Nonnull final TableKey tableKey, @Nonnull final WriteContext writeContext) { + return writeContext.readAfter(FibManagementIIds.FM_FIB_TABLES.child(Table.class, tableKey)).isPresent(); } @Override @@ -108,12 +77,38 @@ final class ControlPlaneProtocolCustomizer checkArgument(routingProtocol.getType() == Static.class, "Only static routes are allowed"); } - private int extractTableId(final ControlPlaneProtocol protocol) { - final RoutingProtocolVppAttr vppAttr = protocol.getAugmentation(RoutingProtocolVppAttr.class); + @Override + public void writeCurrentAttributes(@Nonnull final InstanceIdentifier<ControlPlaneProtocol> instanceIdentifier, + @Nonnull final ControlPlaneProtocol routingProtocol, + @Nonnull final WriteContext writeContext) + throws WriteFailedException { + checkIsStatic(routingProtocol); - checkState(vppAttr != null && vppAttr.getVppProtocolAttributes() != null, - "Vpp routing protocol attributes not defined"); + final Long tableId = extractTableId(routingProtocol); + final MappingContext mappingContext = writeContext.getMappingContext(); + final String newProtocolName = routingProtocol.getName(); - return vppAttr.getVppProtocolAttributes().getPrimaryVrf().getValue().intValue(); + // enclosed in synchronized block to prevent change of state after containsName/before addName + synchronized (routingProtocolContext) { + if (!routingProtocolContext.containsName(tableId.intValue(), mappingContext)) { + // Protocol supports both IPv4/IPv6, therefore checking if at least one exists. Proper table is checked + // afterwards in Ipv6 or IPv4 customizers + if (!isTablePresent(new TableKey(Ipv4.class, new VniReference(tableId)), writeContext) && + !isTablePresent(new TableKey(Ipv6.class, new VniReference(tableId)), writeContext)) { + throw new WriteFailedException(instanceIdentifier, + String.format("VRF lookup table: %s not found for protocol: %s", tableId, + instanceIdentifier)); + } + routingProtocolContext.addName(tableId.intValue(), newProtocolName, mappingContext); + } else { + // prevent to fail while restoring data(trying to remap already mapped name) + if (!newProtocolName.equals(routingProtocolContext.getName(tableId.intValue(), mappingContext))) { + throw new IllegalStateException(String.format( + "An attempt to assign protocol %s to table id %s. Table id already assigned to protocol %s", + newProtocolName, tableId, + routingProtocolContext.getName(tableId.intValue(), mappingContext))); + } + } + } } } |