summaryrefslogtreecommitdiffstats
path: root/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/write/ControlPlaneProtocolCustomizer.java
diff options
context:
space:
mode:
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.java97
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)));
+ }
+ }
+ }
}
}