diff options
Diffstat (limited to 'routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/write')
3 files changed, 151 insertions, 4 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) diff --git a/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/write/RoutingWriterFactory.java b/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/write/RoutingWriterFactory.java index 05d6916cb..cd3c4d275 100644 --- a/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/write/RoutingWriterFactory.java +++ b/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/write/RoutingWriterFactory.java @@ -29,6 +29,7 @@ import io.fd.hc2vpp.routing.Ipv4RoutingNodes; import io.fd.hc2vpp.routing.Ipv6RoutingNodes; import io.fd.hc2vpp.routing.RoutingConfiguration; import io.fd.hc2vpp.routing.RoutingIIds; +import io.fd.hc2vpp.routing.services.FibTableService; import io.fd.hc2vpp.vpp.classifier.context.VppClassifierContextManager; import io.fd.honeycomb.translate.impl.write.GenericWriter; import io.fd.honeycomb.translate.write.WriterFactory; @@ -63,6 +64,9 @@ public final class RoutingWriterFactory implements WriterFactory, Ipv4RoutingNod private RoutingConfiguration configuration; @Inject + private FibTableService fibTableService; + + @Inject @Named("interface-context") private NamingContext interfaceContext; @@ -89,7 +93,7 @@ public final class RoutingWriterFactory implements WriterFactory, Ipv4RoutingNod new GenericWriter<>(RoutingIIds.ROUTING, new RoutingCustomizer())); registry.subtreeAdd(routingProtocolHandledChildren(),new GenericWriter<>(RoutingIIds.RT_CPS_CP, - new ControlPlaneProtocolCustomizer(routingProtocolContext))); + new ControlPlaneProtocolCustomizer(routingProtocolContext, fibTableService))); registry.subtreeAddAfter(ipv4RoutingHandledChildren(RoutingIIds.RT_CPS_CP_SR_SRV4_IPV4_RT_PARENT), new GenericWriter<>(RoutingIIds.RT_CPS_CP_SR_SRV4_IPV4_RT, diff --git a/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/write/factory/FibTableRequest.java b/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/write/factory/FibTableRequest.java new file mode 100644 index 000000000..fefbadefa --- /dev/null +++ b/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/write/factory/FibTableRequest.java @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2018 Bell Canada, Pantheon and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.fd.hc2vpp.routing.write.factory; + +import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.base.Preconditions.checkNotNull; + +import io.fd.hc2vpp.common.translate.util.AddressTranslator; +import io.fd.hc2vpp.common.translate.util.JvppReplyConsumer; +import io.fd.hc2vpp.routing.services.FibTableService; +import io.fd.honeycomb.translate.ModificationCache; +import io.fd.honeycomb.translate.read.ReadFailedException; +import io.fd.honeycomb.translate.write.WriteFailedException; +import io.fd.vpp.jvpp.core.dto.IpTableAddDel; +import io.fd.vpp.jvpp.core.future.FutureJVppCore; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class FibTableRequest implements AddressTranslator, JvppReplyConsumer { + + private final FibTableService fibTableService; + private final ModificationCache modificationCache; + private static final Logger LOG = LoggerFactory.getLogger(FibTableRequest.class); + + private final FutureJVppCore api; + /** + * FIB table Name + */ + private String fibName; + + /** + * FIB table id to be installed + */ + private int fibTable; + + /** + * Whether to write IPv6 fib table or IPv4 + */ + private boolean isIpv6; + + public FibTableRequest(FutureJVppCore api, FibTableService fibTableService, ModificationCache modificationCache) { + this.api = api; + this.fibTableService = fibTableService; + this.modificationCache = modificationCache; + } + + public void checkValid() { + checkNotNull(getFibName(), "Fib table name not set"); + checkArgument(!getFibName().isEmpty(), "Fib table name must not be empty"); + } + + public void delete(InstanceIdentifier<?> identifier) throws WriteFailedException { + try { + fibTableService.checkTableExist(getFibTable(), modificationCache); + IpTableAddDel tableAddDel = new IpTableAddDel(); + tableAddDel.tableId = getFibTable(); + tableAddDel.isIpv6 = (booleanToByte(isIpv6())); + tableAddDel.isAdd = (booleanToByte(false)); + tableAddDel.name = getFibName().getBytes(); + getReplyForWrite(api.ipTableAddDel(tableAddDel).toCompletableFuture(), identifier); + } catch (ReadFailedException e) { + throw new IllegalArgumentException(e); + } catch (FibTableService.FibTableDoesNotExistException e){ + LOG.debug("Request to delete non existing Fib table"); + } + } + + public void write(InstanceIdentifier<?> identifier) throws WriteFailedException { + IpTableAddDel tableAddDel = new IpTableAddDel(); + try { + tableAddDel.tableId = getFibTable(); + tableAddDel.isIpv6 = (booleanToByte(isIpv6())); + tableAddDel.isAdd = (booleanToByte(true)); + tableAddDel.name = getFibName().getBytes(); + getReplyForWrite(api.ipTableAddDel(tableAddDel).toCompletableFuture(), identifier); + } catch (Exception ex){ + LOG.error("Error writing fib table. fibTable: {}, api: {}, cache: {}, id: {}", tableAddDel, api, + modificationCache, identifier); + throw new WriteFailedException(identifier, ex); + } + } + + public int getFibTable() { + return fibTable; + } + + public void setFibTable(int fibTable) { + this.fibTable = fibTable; + } + + public boolean isIpv6() { + return isIpv6; + } + + public void setIpv6(boolean ipv6) { + isIpv6 = ipv6; + } + + public String getFibName() { + return fibName; + } + + public void setFibName(String fibName) { + this.fibName = fibName; + } +} |