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 | 28 |
1 files changed, 25 insertions, 3 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 0a0fa3e47..c0d5d083b 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,7 +20,9 @@ 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.routing.services.FibTableService; 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; @@ -30,17 +32,23 @@ 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.ControlPlaneProtocolKey; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.vpp.routing.rev180319.RoutingProtocolVppAttr; 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) { + ControlPlaneProtocolCustomizer(@Nonnull final NamingContext routingProtocolContext, + FibTableService fibTableService) { this.routingProtocolContext = routingProtocolContext; + this.fibTableService = fibTableService; } @Override @@ -57,8 +65,22 @@ final class ControlPlaneProtocolCustomizer // enclosed in synchronized block to prevent change of state after containsName/before addName synchronized (routingProtocolContext) { if (!routingProtocolContext.containsName(tableId, mappingContext)) { - // if not present in mapping,create assignment to table id. This works only with auto-create flag enabled - // while using ip_add_del_table + // Todo HC2VPP-317: A proper solution for Fib table management should be implemented. This is a + // temporary workaround. + + // 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."); + //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) |