HC2VPP-280: make next-hop optional for impose-and-forward 60/10360/2
authorMarek Gradzki <[email protected]>
Wed, 31 Jan 2018 13:39:29 +0000 (14:39 +0100)
committerMarek Gradzki <[email protected]>
Wed, 31 Jan 2018 16:05:17 +0000 (16:05 +0000)
Next hop address is not mandatory in VPP CLI, e.g.

ip route add 192.0.2.11/32 via loop0 out-labels 3

Also [email protected] defines it as optional.

Change-Id: I6bd63a3ac75d40b14ae553e128b7ebe43dee5118
Signed-off-by: Marek Gradzki <[email protected]>
(cherry picked from commit 710a7932be189a6bfc342b471efa1044f8a9798a)

mpls/impl/src/main/java/io/fd/hc2vpp/mpls/ImposeAndForwardWriter.java
mpls/impl/src/test/java/io/fd/hc2vpp/mpls/ImposeAndForwardTest.java

index 14053b6..861ab9d 100644 (file)
@@ -103,12 +103,15 @@ final class ImposeAndForwardWriter implements LspWriter, Ipv4Translator {
 
     private String translate(@Nonnull final SimplePath path, @Nonnull final IpAddDelRoute request) {
         final IpAddress nextHop = path.getNextHop();
-        checkArgument(nextHop != null, "Configuring impose-and-forward, but next-hop is missing.");
 
         // TODO(HC2VPP-264): add support for mpls + v6
-        final Ipv4Address address = nextHop.getIpv4Address();
-        checkArgument(address != null, "Only IPv4 next-hop address is supported.");
-        request.nextHopAddress = ipv4AddressNoZoneToArray(address.getValue());
+        if (nextHop != null) {
+            final Ipv4Address address = nextHop.getIpv4Address();
+            checkArgument(address != null, "Only IPv4 next-hop address is supported.");
+            request.nextHopAddress = ipv4AddressNoZoneToArray(address.getValue());
+        } else {
+            request.nextHopAddress = new byte[0];
+        }
 
         final MplsLabel outgoingLabel = path.getOutgoingLabel();
         checkArgument(outgoingLabel != null, "Configuring impose-and-forward, but outgoing-label is missing.");
@@ -122,12 +125,15 @@ final class ImposeAndForwardWriter implements LspWriter, Ipv4Translator {
         checkArgument(pathList.getPaths() != null && pathList.getPaths().size() == 1, "Only single path is supported");
         final Paths paths = pathList.getPaths().get(0);
         final IpAddress nextHop = paths.getNextHop();
-        checkArgument(nextHop != null, "Configuring impose-and-forward, but next-hop is missing.");
 
         // TODO(HC2VPP-264): add support for mpls + v6
-        final Ipv4Address address = nextHop.getIpv4Address();
-        checkArgument(address != null, "Only IPv4 next-hop address is supported.");
-        request.nextHopAddress = ipv4AddressNoZoneToArray(address.getValue());
+        if (nextHop != null) {
+            final Ipv4Address address = nextHop.getIpv4Address();
+            checkArgument(address != null, "Only IPv4 next-hop address is supported.");
+            request.nextHopAddress = ipv4AddressNoZoneToArray(address.getValue());
+        } else {
+            request.nextHopAddress = new byte[0];
+        }
 
         final List<MplsLabel> labels = paths.getOutgoingLabels();
         final int numberOfLabels = labels.size();
index a4689a7..c1ced8e 100644 (file)
@@ -32,6 +32,7 @@ import java.util.Arrays;
 import java.util.Collections;
 import org.junit.Test;
 import org.mockito.Mock;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddressBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.mpls._static.rev170310.Mpls1;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.mpls._static.rev170310.StaticLspConfig;
@@ -68,6 +69,10 @@ public class ImposeAndForwardTest extends WriterCustomizerTest implements ByteDa
     private StaticLspCustomizer customizer;
 
     private static StaticLsp getSimpleLsp(final long label) {
+        return getSimpleLsp(label, IpAddressBuilder.getDefaultInstance("5.6.7.8"));
+    }
+    private static StaticLsp getSimpleLsp(final long label,
+                                          final IpAddress nextHop) {
         return new StaticLspBuilder()
             .setName(LSP_NAME)
             .setConfig(new ConfigBuilder()
@@ -78,7 +83,7 @@ public class ImposeAndForwardTest extends WriterCustomizerTest implements ByteDa
                 )
                 .setOperation(StaticLspConfig.Operation.ImposeAndForward)
                 .setOutSegment(new SimplePathBuilder()
-                    .setNextHop(IpAddressBuilder.getDefaultInstance("5.6.7.8"))
+                    .setNextHop(nextHop)
                     .setOutgoingInterface(IF_NAME)
                     .setOutgoingLabel(new MplsLabel(label))
                     .build())
@@ -121,6 +126,12 @@ public class ImposeAndForwardTest extends WriterCustomizerTest implements ByteDa
         verify(jvpp).ipAddDelRoute(getRequestForSimpleLsp(true));
     }
 
+    @Test
+    public void testWriteSimpleWithoutNextHop() throws WriteFailedException {
+        customizer.writeCurrentAttributes(IID, getSimpleLsp((long) LABEL, null), writeContext);
+        verify(jvpp).ipAddDelRoute(getRequestForSimpleLsp(true, new byte[0]));
+    }
+
     @Test
     public void testWriteComplex() throws WriteFailedException {
         customizer.writeCurrentAttributes(IID, COMPLEX_LSP, writeContext);
@@ -151,14 +162,22 @@ public class ImposeAndForwardTest extends WriterCustomizerTest implements ByteDa
         return getRequestForSimpleLsp(add, LABEL);
     }
 
+    private IpAddDelRoute getRequestForSimpleLsp(final boolean add, final byte[] nextHop) {
+        return getRequestForSimpleLsp(add, LABEL, nextHop);
+    }
+
     private IpAddDelRoute getRequestForSimpleLsp(final boolean add, final int label) {
+        return getRequestForSimpleLsp(add, label, new byte[] {5, 6, 7, 8});
+    }
+
+    private IpAddDelRoute getRequestForSimpleLsp(final boolean add, final int label, final byte[] nextHop) {
         final IpAddDelRoute request = new IpAddDelRoute();
         request.nextHopSwIfIndex = IF_INDEX;
         request.isAdd = booleanToByte(add);
         request.nextHopWeight = 1;
         request.dstAddressLength = (byte) 24;
         request.dstAddress = new byte[] {1, 2, 3, 4};
-        request.nextHopAddress = new byte[] {5, 6, 7, 8};
+        request.nextHopAddress = nextHop;
         request.nextHopNOutLabels = 1;
         request.nextHopViaLabel = LspWriter.MPLS_LABEL_INVALID;
         request.nextHopOutLabelStack = new int[] {label};