Add support for ipv6 vrf
authorMarek Gradzki <[email protected]>
Mon, 31 Oct 2016 14:46:41 +0000 (15:46 +0100)
committerMarek Gradzki <[email protected]>
Mon, 31 Oct 2016 14:46:41 +0000 (15:46 +0100)
Change-Id: I3372d4156a19157ca431cb29c23de33161f6cfc0
Signed-off-by: Marek Gradzki <[email protected]>
v3po/api/src/main/yang/v3po.yang
v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/RoutingCustomizer.java
v3po/v3po2vpp/src/test/java/io/fd/honeycomb/translate/v3po/interfaces/RoutingCustomizerTest.java

index d3869ab..f272a48 100644 (file)
@@ -442,10 +442,15 @@ module v3po {
     }
 
     container routing {
-      leaf vrf-id { // todo no routing info for oper, is it possible to get it from the vpp?
+      // TODO (HONEYCOMB-127): add routing info for oper
+      leaf ipv4-vrf-id {
+        type uint32;
+      }
+      leaf ipv6-vrf-id {
         type uint32;
-        default 0;
       }
+      description
+        "Defines VRF tables used for ipv4 and ipv6 traffic";
     }
 
     container vhost-user {
index 4b1e2db..05ecf36 100644 (file)
 
 package io.fd.honeycomb.translate.v3po.interfaces;
 
+import static com.google.common.base.Preconditions.checkArgument;
+
 import io.fd.honeycomb.translate.spi.write.WriterCustomizer;
+import io.fd.honeycomb.translate.vpp.util.ByteDataTranslator;
 import io.fd.honeycomb.translate.vpp.util.FutureJVppCustomizer;
 import io.fd.honeycomb.translate.vpp.util.JvppReplyConsumer;
 import io.fd.honeycomb.translate.vpp.util.NamingContext;
@@ -33,7 +36,8 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class RoutingCustomizer extends FutureJVppCustomizer implements WriterCustomizer<Routing>, JvppReplyConsumer {
+public class RoutingCustomizer extends FutureJVppCustomizer implements WriterCustomizer<Routing>, JvppReplyConsumer,
+    ByteDataTranslator {
 
     private static final Logger LOG = LoggerFactory.getLogger(RoutingCustomizer.class);
     private final NamingContext interfaceContext;
@@ -70,22 +74,27 @@ public class RoutingCustomizer extends FutureJVppCustomizer implements WriterCus
         disableRouting(id, ifName, writeContext);
     }
 
-    private void setRouting(final InstanceIdentifier<Routing> id, final String name, final Routing rt,
-                            final WriteContext writeContext) throws WriteFailedException {
+    private void setRouting(@Nonnull final InstanceIdentifier<Routing> id, @Nonnull final String name,
+                            @Nonnull final Routing rt,
+                            @Nonnull final WriteContext writeContext) throws WriteFailedException {
         final int swIfc = interfaceContext.getIndex(name, writeContext.getMappingContext());
         LOG.debug("Setting routing for interface: {}, {}. Routing: {}", name, swIfc, rt);
+        checkArgument(rt.getIpv4VrfId() != null || rt.getIpv6VrfId() != null, "No vrf-id given");
+
+        setVrfId(id, swIfc, rt.getIpv4VrfId(), false);
+        setVrfId(id, swIfc, rt.getIpv6VrfId(), true);
 
-        int vrfId = (rt != null)
-                ? rt.getVrfId().intValue()
-                : 0;
+        LOG.debug("Routing set successfully for interface: {}, {}, routing: {}", name, swIfc, rt);
+    }
 
-        if (vrfId != 0) {
-            final CompletionStage<SwInterfaceSetTableReply> swInterfaceSetTableReplyCompletionStage =
-                    getFutureJVpp()
-                            .swInterfaceSetTable(getInterfaceSetTableRequest(swIfc, (byte) 0, /* isIpv6 */ vrfId));
-            getReplyForWrite(swInterfaceSetTableReplyCompletionStage.toCompletableFuture(), id);
-            LOG.debug("Routing set successfully for interface: {}, {}, routing: {}", name, swIfc, rt);
+    private void setVrfId(final InstanceIdentifier<Routing> id, final int swIfc, final Long vrfId, boolean isIp6)
+        throws WriteFailedException {
+        if (vrfId == null) {
+            return;
         }
+        final CompletionStage<SwInterfaceSetTableReply> cs = getFutureJVpp()
+            .swInterfaceSetTable(getInterfaceSetTableRequest(swIfc, booleanToByte(isIp6), vrfId.intValue()));
+        getReplyForWrite(cs.toCompletableFuture(), id);
     }
 
     /**
@@ -98,7 +107,7 @@ public class RoutingCustomizer extends FutureJVppCustomizer implements WriterCus
         LOG.debug("Disabling routing for interface: {}, {}.", name, swIfc);
 
         getReplyForDelete(getFutureJVpp()
-                .swInterfaceSetTable(getInterfaceSetTableRequest(swIfc, (byte) 0, 0)).toCompletableFuture(), id);
+            .swInterfaceSetTable(getInterfaceSetTableRequest(swIfc, (byte) 0, 0)).toCompletableFuture(), id);
         LOG.debug("Routing for interface: {}, {} successfully disabled", name, swIfc);
 
     }
index 0fbe7e8..a6a0b48 100644 (file)
@@ -18,7 +18,6 @@ package io.fd.honeycomb.translate.v3po.interfaces;
 
 import static org.mockito.Matchers.any;
 import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyZeroInteractions;
 import static org.mockito.Mockito.when;
 
 import io.fd.honeycomb.translate.vpp.util.NamingContext;
@@ -65,13 +64,6 @@ public class RoutingCustomizerTest extends WriterCustomizerTest {
         customizer.writeCurrentAttributes(IID, routing(213), writeContext);
     }
 
-    @Test
-    public void testUpdate() throws WriteFailedException {
-        when(api.swInterfaceSetTable(any())).thenReturn(future(new SwInterfaceSetTableReply()));
-        customizer.updateCurrentAttributes(IID, routing(123L), null, writeContext);
-        verifyZeroInteractions(api);
-    }
-
     @Test(expected = WriteFailedException.class)
     public void testUpdateFailed() throws WriteFailedException {
         when(api.swInterfaceSetTable(any())).thenReturn(failedFuture());
@@ -92,7 +84,7 @@ public class RoutingCustomizerTest extends WriterCustomizerTest {
     }
 
     private Routing routing(final long vrfId) {
-        return new RoutingBuilder().setVrfId(vrfId).build();
+        return new RoutingBuilder().setIpv4VrfId(vrfId).build();
     }
 
     private SwInterfaceSetTable expectedRequest(final int vrfId) {