HC2VPP-145: fix snat mapping update 59/6659/2
authorMarek Gradzki <[email protected]>
Fri, 12 May 2017 08:55:39 +0000 (10:55 +0200)
committerMarek Gradzki <[email protected]>
Mon, 15 May 2017 13:10:50 +0000 (13:10 +0000)
Change-Id: I51e8a3e6d62b9c0dacf03d2148b813309fe0dfc4
Signed-off-by: Marek Gradzki <[email protected]>
nat/nat2vpp/src/main/java/io/fd/hc2vpp/nat/write/MappingEntryCustomizer.java
nat/nat2vpp/src/test/java/io/fd/hc2vpp/nat/write/MappingEntryCustomizerTest.java
nat/nat2vpp/src/test/resources/nat/static-mapping-address-update.json [new file with mode: 0644]

index ecffe9c..999b811 100644 (file)
@@ -107,8 +107,8 @@ final class MappingEntryCustomizer implements ListWriterCustomizer<MappingEntry,
                                         @Nonnull final MappingEntry dataBefore,
                                         @Nonnull final MappingEntry dataAfter,
                                         @Nonnull final WriteContext writeContext) throws WriteFailedException {
-        throw new WriteFailedException.UpdateFailedException(id, dataBefore, dataAfter,
-                new UnsupportedOperationException("Mapping entry update not supported"));
+        deleteCurrentAttributes(id, dataBefore, writeContext);
+        writeCurrentAttributes(id, dataAfter, writeContext);
     }
 
     @Override
index 649284a..1d5eff7 100644 (file)
@@ -17,7 +17,6 @@
 package io.fd.hc2vpp.nat.write;
 
 import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
@@ -83,10 +82,17 @@ public class MappingEntryCustomizerTest extends WriterCustomizerTest implements
         customizer.writeCurrentAttributes(IID, extractMappingEntry(data), writeContext);
     }
 
-    @Test(expected = WriteFailedException.UpdateFailedException.class)
-    public void testUpdate() throws WriteFailedException {
-        final MappingEntry data = mock(MappingEntry.class);
-        customizer.updateCurrentAttributes(IID, data, data, writeContext);
+    @Test
+    public void testUpdate(
+        @InjectTestData(resourcePath = "/nat/static-mapping.json", id = MAPPING_TABLE_PATH) MappingTable before,
+        @InjectTestData(resourcePath = "/nat/static-mapping-address-update.json", id = MAPPING_TABLE_PATH) MappingTable after)
+        throws WriteFailedException {
+        customizer.updateCurrentAttributes(IID, extractMappingEntry(before), extractMappingEntry(after), writeContext);
+        final SnatAddStaticMapping expectedDeleteRequest = getExpectedRequest();
+        verify(jvppSnat).snatAddStaticMapping(expectedDeleteRequest);
+        final SnatAddStaticMapping expectedUpdateRequest = getExpectedUpdateRequest();
+        expectedUpdateRequest.isAdd = 1;
+        verify(jvppSnat).snatAddStaticMapping(expectedUpdateRequest);
     }
 
     @Test
@@ -113,4 +119,16 @@ public class MappingEntryCustomizerTest extends WriterCustomizerTest implements
         expectedRequest.externalIpAddress = new byte[] {45, 1, 5, 7};
         return expectedRequest;
     }
+
+    private static SnatAddStaticMapping getExpectedUpdateRequest() {
+        final SnatAddStaticMapping expectedRequest = new SnatAddStaticMapping();
+        expectedRequest.isIp4 = 1;
+        expectedRequest.addrOnly = 1;
+        expectedRequest.protocol = 17; // udp
+        expectedRequest.vrfId = (int) NAT_INSTANCE_ID;
+        expectedRequest.externalSwIfIndex = -1;
+        expectedRequest.localIpAddress = new byte[] {(byte) 192, (byte) 168, 1, 86};
+        expectedRequest.externalIpAddress = new byte[] {45, 1, 5, 6};
+        return expectedRequest;
+    }
 }
\ No newline at end of file
diff --git a/nat/nat2vpp/src/test/resources/nat/static-mapping-address-update.json b/nat/nat2vpp/src/test/resources/nat/static-mapping-address-update.json
new file mode 100644 (file)
index 0000000..224a62a
--- /dev/null
@@ -0,0 +1,12 @@
+{
+  "mapping-table" : {
+    "mapping-entry": {
+      "index": 22,
+      "type": "static",
+      "transport-protocol": 17,
+      "internal-src-address": "192.168.1.86",
+      "external-src-address": "45.1.5.6"
+    }
+  }
+}
+