Lisp api use fix 03/5003/2
authorJan Srnicek <[email protected]>
Thu, 2 Feb 2017 14:17:41 +0000 (15:17 +0100)
committerJan Srnicek <[email protected]>
Thu, 2 Feb 2017 14:17:41 +0000 (15:17 +0100)
fixes use of Lisp api to new style with Object array
instead of binary data

Change-Id: Ib06f3d0b424cbb4288bb9b7ac8dc82c2fc0c69bf
Signed-off-by: Jan Srnicek <[email protected]>
lisp/lisp2vpp/src/main/java/io/fd/hc2vpp/lisp/translate/write/RemoteMappingCustomizer.java
lisp/lisp2vpp/src/test/java/io/fd/hc2vpp/lisp/translate/write/RemoteMappingCustomizerTest.java

index 9df5d49..423625d 100755 (executable)
 package io.fd.hc2vpp.lisp.translate.write;
 
 
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-import static io.fd.hc2vpp.lisp.translate.write.RemoteMappingCustomizer.LocatorListType.NEGATIVE;
-import static io.fd.hc2vpp.lisp.translate.write.RemoteMappingCustomizer.LocatorListType.POSITIVE;
-
 import com.google.common.base.Preconditions;
+import io.fd.hc2vpp.common.translate.util.AddressTranslator;
+import io.fd.hc2vpp.common.translate.util.FutureJVppCustomizer;
+import io.fd.hc2vpp.common.translate.util.JvppReplyConsumer;
 import io.fd.hc2vpp.lisp.context.util.EidMappingContext;
 import io.fd.hc2vpp.lisp.translate.read.trait.MappingProducer;
 import io.fd.hc2vpp.lisp.translate.util.EidTranslator;
 import io.fd.honeycomb.translate.spi.write.ListWriterCustomizer;
-import io.fd.hc2vpp.common.translate.util.AddressTranslator;
-import io.fd.hc2vpp.common.translate.util.FutureJVppCustomizer;
-import io.fd.hc2vpp.common.translate.util.JvppReplyConsumer;
 import io.fd.honeycomb.translate.write.WriteContext;
 import io.fd.honeycomb.translate.write.WriteFailedException;
-import java.io.ByteArrayOutputStream;
-import java.io.DataOutputStream;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.List;
-import java.util.concurrent.TimeoutException;
-import javax.annotation.Nonnull;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4AddressNoZone;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6AddressNoZone;
+import io.fd.vpp.jvpp.VppBaseCallException;
+import io.fd.vpp.jvpp.core.dto.LispAddDelRemoteMapping;
+import io.fd.vpp.jvpp.core.future.FutureJVppCore;
+import io.fd.vpp.jvpp.core.types.RemoteLocator;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.MapReplyAction;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.MappingId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.dp.subtable.grouping.remote.mappings.RemoteMapping;
@@ -50,12 +39,17 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.dp.subtable.grouping.remote.mappings.remote.mapping.locator.list.NegativeMapping;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.dp.subtable.grouping.remote.mappings.remote.mapping.locator.list.PositiveMapping;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.dp.subtable.grouping.remote.mappings.remote.mapping.locator.list.positive.mapping.Rlocs;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.dp.subtable.grouping.remote.mappings.remote.mapping.locator.list.positive.mapping.rlocs.Locator;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.eid.table.grouping.eid.table.VniTable;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import io.fd.vpp.jvpp.VppBaseCallException;
-import io.fd.vpp.jvpp.core.dto.LispAddDelRemoteMapping;
-import io.fd.vpp.jvpp.core.future.FutureJVppCore;
+
+import javax.annotation.Nonnull;
+import java.io.IOException;
+import java.util.Optional;
+import java.util.concurrent.TimeoutException;
+
+import static com.google.common.base.Preconditions.*;
+import static io.fd.hc2vpp.lisp.translate.write.RemoteMappingCustomizer.LocatorListType.NEGATIVE;
+import static io.fd.hc2vpp.lisp.translate.write.RemoteMappingCustomizer.LocatorListType.POSITIVE;
 
 
 /**
@@ -143,7 +137,18 @@ public class RemoteMappingCustomizer extends FutureJVppCustomizer
 
             checkArgument(rlocs != null, "No remote locators set for Positive mapping");
 
-            request.rlocs = locatorsToBinaryData(rlocs.getLocator());
+            request.rlocs = rlocs.getLocator().stream()
+                    .map(locator -> {
+                        RemoteLocator remoteLocator = new RemoteLocator();
+                        remoteLocator.addr = ipAddressToArray(locator.getAddress());
+                        remoteLocator.isIp4 = booleanToByte(!isIpv6(locator.getAddress()));
+                        Optional.ofNullable(locator.getPriority())
+                                .ifPresent(priority -> remoteLocator.priority = priority.byteValue());
+                        Optional.ofNullable(locator.getWeight())
+                                .ifPresent(weight -> remoteLocator.weight = weight.byteValue());
+
+                        return remoteLocator;
+                    }).toArray(RemoteLocator[]::new);
             request.rlocNum = Integer.valueOf(rlocs.getLocator().size()).byteValue();
         }
 
@@ -176,46 +181,6 @@ public class RemoteMappingCustomizer extends FutureJVppCustomizer
         return ((PositiveMapping) locatorList).getRlocs();
     }
 
-    //cant be static because of use of default methods from traits
-    private byte[] locatorsToBinaryData(List<Locator> locators) throws IOException {
-        checkNotNull(locators, "Cannot convert null list");
-
-        ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
-
-        DataOutputStream out = new DataOutputStream(byteArrayOut);
-
-
-        for (Locator locator : locators) {
-            boolean isIpv4;
-            byte[] address;
-
-            //first byte says that its v4/v6
-            isIpv4 = !isIpv6(locator.getAddress());
-            out.writeByte(booleanToByte(isIpv4));
-
-            //then writes priority
-            out.write(locator.getPriority());
-
-            //and weight
-            out.write(locator.getWeight());
-
-            if (isIpv4) {
-                //vpp in this case needs address as 16 byte array,regardless if it is ivp4 or ipv6
-                address = Arrays.copyOf(
-
-                        ipv4AddressNoZoneToArray(new Ipv4AddressNoZone(locator.getAddress().getIpv4Address())),
-                        16);
-
-                out.write(address);
-            } else {
-                out.write(
-                        ipv6AddressNoZoneToArray(new Ipv6AddressNoZone(locator.getAddress().getIpv6Address())));
-            }
-        }
-
-        return byteArrayOut.toByteArray();
-    }
-
     public enum LocatorListType {
 
         /**
index fdd95e4..5130881 100755 (executable)
 
 package io.fd.hc2vpp.lisp.translate.write;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
 import io.fd.hc2vpp.common.test.write.WriterCustomizerTest;
 import io.fd.hc2vpp.common.translate.util.Ipv4Translator;
 import io.fd.hc2vpp.lisp.context.util.EidMappingContext;
 import io.fd.honeycomb.translate.write.WriteFailedException;
 import io.fd.vpp.jvpp.core.dto.LispAddDelRemoteMapping;
 import io.fd.vpp.jvpp.core.dto.LispAddDelRemoteMappingReply;
+import io.fd.vpp.jvpp.core.types.RemoteLocator;
 import org.junit.Test;
 import org.mockito.ArgumentCaptor;
 import org.mockito.Captor;
 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.Ipv4Address;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv4Afi;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4Builder;
@@ -48,7 +41,10 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.dp.subtable.grouping.remote.mappings.remote.mapping.Eid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.dp.subtable.grouping.remote.mappings.remote.mapping.EidBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.dp.subtable.grouping.remote.mappings.remote.mapping.locator.list.NegativeMappingBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.dp.subtable.grouping.remote.mappings.remote.mapping.locator.list.PositiveMappingBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.dp.subtable.grouping.remote.mappings.remote.mapping.locator.list.negative.mapping.MapReplyBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.dp.subtable.grouping.remote.mappings.remote.mapping.locator.list.positive.mapping.RlocsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.dp.subtable.grouping.remote.mappings.remote.mapping.locator.list.positive.mapping.rlocs.LocatorBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.eid.table.grouping.EidTable;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.eid.table.grouping.eid.table.VniTable;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.eid.table.grouping.eid.table.VniTableKey;
@@ -56,6 +52,16 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.lisp.feature.data.grouping.LispFeatureData;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static org.hamcrest.Matchers.hasSize;
+import static org.junit.Assert.*;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.*;
+
 public class RemoteMappingCustomizerTest extends WriterCustomizerTest implements Ipv4Translator {
 
     @Captor
@@ -63,7 +69,9 @@ public class RemoteMappingCustomizerTest extends WriterCustomizerTest implements
 
     private MappingId mappingId;
     private RemoteMappingCustomizer customizer;
-    private RemoteMapping intf;
+    private RemoteMapping negativeMapping;
+    private RemoteMapping positiveMappingNoPrioNoWeight;
+    private RemoteMapping positiveMappingPrioWeight;
     private InstanceIdentifier<RemoteMapping> id;
 
     @Mock
@@ -82,13 +90,36 @@ public class RemoteMappingCustomizerTest extends WriterCustomizerTest implements
         mappingId = new MappingId("REMOTE");
         final RemoteMappingKey key = new RemoteMappingKey(mappingId);
 
-        intf = new RemoteMappingBuilder()
-                .setEid(
-                        eid)
+        negativeMapping = new RemoteMappingBuilder()
+                .setEid(eid)
                 .setLocatorList(new NegativeMappingBuilder()
                         .setMapReply(new MapReplyBuilder().setMapReplyAction(MapReplyAction.Drop).build()).build())
                 .build();
 
+        positiveMappingNoPrioNoWeight = new RemoteMappingBuilder()
+                .setEid(eid)
+                .setLocatorList(new PositiveMappingBuilder()
+                        .setRlocs(new RlocsBuilder()
+                                .setLocator(Arrays.asList(new LocatorBuilder()
+                                        .setAddress(new IpAddress(new Ipv4Address("192.168.2.2")))
+                                        .build()))
+                                .build())
+                        .build())
+                .build();
+
+        positiveMappingPrioWeight = new RemoteMappingBuilder()
+                .setEid(eid)
+                .setLocatorList(new PositiveMappingBuilder()
+                        .setRlocs(new RlocsBuilder()
+                                .setLocator(Arrays.asList(new LocatorBuilder()
+                                        .setAddress(new IpAddress(new Ipv4Address("192.168.2.3")))
+                                        .setPriority((short) 2)
+                                        .setWeight((short) 5)
+                                        .build()))
+                                .build())
+                        .build())
+                .build();
+
         id = InstanceIdentifier.builder(Lisp.class)
                 .child(LispFeatureData.class)
                 .child(EidTable.class)
@@ -102,6 +133,48 @@ public class RemoteMappingCustomizerTest extends WriterCustomizerTest implements
         when(api.lispAddDelRemoteMapping(any())).thenReturn(future(new LispAddDelRemoteMappingReply()));
     }
 
+    @Test
+    public void testWritePositiveMappingNoPrioNoWeight() throws WriteFailedException {
+        customizer.writeCurrentAttributes(id, positiveMappingNoPrioNoWeight, writeContext);
+        verify(api, times(1)).lispAddDelRemoteMapping(mappingCaptor.capture());
+
+        final LispAddDelRemoteMapping request = mappingCaptor.getValue();
+        assertNotNull(request);
+        assertEquals(1, request.isAdd);
+        assertEquals("192.168.2.1", arrayToIpv4AddressNoZone(request.eid).getValue());
+        assertEquals(25, request.vni);
+
+        final List<RemoteLocator> remoteLocators = Arrays.stream(request.rlocs).collect(Collectors.toList());
+        assertThat(remoteLocators, hasSize(1));
+
+        final RemoteLocator locator = remoteLocators.get(0);
+        assertArrayEquals(new byte[]{-64, -88, 2, 2}, locator.addr);
+        assertEquals(1, locator.isIp4);
+        assertEquals(0, locator.priority);
+        assertEquals(0, locator.weight);
+    }
+
+    @Test
+    public void testWritePositiveMappingPrioWeight() throws WriteFailedException {
+        customizer.writeCurrentAttributes(id, positiveMappingPrioWeight, writeContext);
+        verify(api, times(1)).lispAddDelRemoteMapping(mappingCaptor.capture());
+
+        final LispAddDelRemoteMapping request = mappingCaptor.getValue();
+        assertNotNull(request);
+        assertEquals(1, request.isAdd);
+        assertEquals("192.168.2.1", arrayToIpv4AddressNoZone(request.eid).getValue());
+        assertEquals(25, request.vni);
+
+        final List<RemoteLocator> remoteLocators = Arrays.stream(request.rlocs).collect(Collectors.toList());
+        assertThat(remoteLocators, hasSize(1));
+
+        final RemoteLocator locator = remoteLocators.get(0);
+        assertArrayEquals(new byte[]{-64, -88, 2, 3}, locator.addr);
+        assertEquals(1, locator.isIp4);
+        assertEquals(2, locator.priority);
+        assertEquals(5, locator.weight);
+    }
+
     @Test(expected = NullPointerException.class)
     public void testWriteCurrentAttributesNullData() throws WriteFailedException {
         customizer.writeCurrentAttributes(null, null, writeContext);
@@ -114,7 +187,7 @@ public class RemoteMappingCustomizerTest extends WriterCustomizerTest implements
 
     @Test
     public void testWriteCurrentAttributes() throws WriteFailedException {
-        customizer.writeCurrentAttributes(id, intf, writeContext);
+        customizer.writeCurrentAttributes(id, negativeMapping, writeContext);
 
         verify(api, times(1)).lispAddDelRemoteMapping(mappingCaptor.capture());
 
@@ -139,7 +212,7 @@ public class RemoteMappingCustomizerTest extends WriterCustomizerTest implements
     @Test
     public void testDeleteCurrentAttributes() throws WriteFailedException {
         when(remoteMappingContext.containsEid(any(), eq(mappingContext))).thenReturn(true);
-        customizer.deleteCurrentAttributes(id, intf, writeContext);
+        customizer.deleteCurrentAttributes(id, negativeMapping, writeContext);
 
         verify(api, times(1)).lispAddDelRemoteMapping(mappingCaptor.capture());