summaryrefslogtreecommitdiffstats
path: root/lisp
diff options
context:
space:
mode:
Diffstat (limited to 'lisp')
-rwxr-xr-xlisp/lisp2vpp/src/main/java/io/fd/hc2vpp/lisp/translate/write/RemoteMappingCustomizer.java91
-rwxr-xr-xlisp/lisp2vpp/src/test/java/io/fd/hc2vpp/lisp/translate/write/RemoteMappingCustomizerTest.java103
2 files changed, 116 insertions, 78 deletions
diff --git a/lisp/lisp2vpp/src/main/java/io/fd/hc2vpp/lisp/translate/write/RemoteMappingCustomizer.java b/lisp/lisp2vpp/src/main/java/io/fd/hc2vpp/lisp/translate/write/RemoteMappingCustomizer.java
index 9df5d49de..423625d97 100755
--- a/lisp/lisp2vpp/src/main/java/io/fd/hc2vpp/lisp/translate/write/RemoteMappingCustomizer.java
+++ b/lisp/lisp2vpp/src/main/java/io/fd/hc2vpp/lisp/translate/write/RemoteMappingCustomizer.java
@@ -17,31 +17,20 @@
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 {
/**
diff --git a/lisp/lisp2vpp/src/test/java/io/fd/hc2vpp/lisp/translate/write/RemoteMappingCustomizerTest.java b/lisp/lisp2vpp/src/test/java/io/fd/hc2vpp/lisp/translate/write/RemoteMappingCustomizerTest.java
index fdd95e4f7..5130881ed 100755
--- a/lisp/lisp2vpp/src/test/java/io/fd/hc2vpp/lisp/translate/write/RemoteMappingCustomizerTest.java
+++ b/lisp/lisp2vpp/src/test/java/io/fd/hc2vpp/lisp/translate/write/RemoteMappingCustomizerTest.java
@@ -16,25 +16,18 @@
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());