X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=integrationtest%2Fsrc%2Ftest%2Fjava%2Forg%2Fopendaylight%2Flispflowmapping%2Fintegrationtest%2FMappingServiceIntegrationTest.java;h=53adba593d997d4116e3b52293597f87fda0c9d6;hb=5b6148dc4d46adfe2311b8c254598745e930c5a5;hp=8db34afbb248cb8042cad79deaf46ff152ecb0c9;hpb=449c4464d6d69deb975d4803fed60556631c9da7;p=lispflowmapping.git diff --git a/integrationtest/src/test/java/org/opendaylight/lispflowmapping/integrationtest/MappingServiceIntegrationTest.java b/integrationtest/src/test/java/org/opendaylight/lispflowmapping/integrationtest/MappingServiceIntegrationTest.java index 8db34afbb..53adba593 100644 --- a/integrationtest/src/test/java/org/opendaylight/lispflowmapping/integrationtest/MappingServiceIntegrationTest.java +++ b/integrationtest/src/test/java/org/opendaylight/lispflowmapping/integrationtest/MappingServiceIntegrationTest.java @@ -9,6 +9,7 @@ package org.opendaylight.lispflowmapping.integrationtest; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.opendaylight.lispflowmapping.integrationtest.MultiSiteScenarioUtil.SITE_A; @@ -30,6 +31,9 @@ import static org.ops4j.pax.exam.CoreOptions.composite; import static org.ops4j.pax.exam.CoreOptions.maven; import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.editConfigurationFilePut; +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; +import com.google.common.net.InetAddresses; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; @@ -42,29 +46,63 @@ import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.Arrays; import java.util.List; - +import java.util.Set; import javax.inject.Inject; - -//import org.codehaus.jettison.json.JSONException; -//import org.codehaus.jettison.json.JSONObject; -//import org.codehaus.jettison.json.JSONTokener; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.opendaylight.controller.mdsal.it.base.AbstractMdsalTestBase; +import org.opendaylight.lispflowmapping.config.ConfigIni; import org.opendaylight.lispflowmapping.implementation.LispMappingService; +import org.opendaylight.lispflowmapping.interfaces.dao.SubKeys; +import org.opendaylight.lispflowmapping.interfaces.dao.SubscriberRLOC; import org.opendaylight.lispflowmapping.interfaces.lisp.IFlowMapping; import org.opendaylight.lispflowmapping.interfaces.mappingservice.IMappingService; -import org.opendaylight.lispflowmapping.lisp.util.LispAddressStringifier; -import org.opendaylight.lispflowmapping.lisp.util.LispAddressUtil; -import org.opendaylight.lispflowmapping.lisp.type.LispMessage; import org.opendaylight.lispflowmapping.lisp.serializer.MapNotifySerializer; import org.opendaylight.lispflowmapping.lisp.serializer.MapRegisterSerializer; import org.opendaylight.lispflowmapping.lisp.serializer.MapReplySerializer; import org.opendaylight.lispflowmapping.lisp.serializer.MapRequestSerializer; +import org.opendaylight.lispflowmapping.lisp.type.LispMessage; +import org.opendaylight.lispflowmapping.lisp.type.MappingData; +import org.opendaylight.lispflowmapping.lisp.util.LispAddressStringifier; +import org.opendaylight.lispflowmapping.lisp.util.LispAddressUtil; import org.opendaylight.lispflowmapping.type.sbplugin.IConfigLispSouthboundPlugin; +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.IpPrefix; +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.inet.types.rev130715.PortNumber; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.AfiListLcaf; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.ApplicationDataLcaf; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.ExplicitLocatorPathLcaf; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.InstanceIdType; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv4PrefixAfi; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.KeyValueAddressLcaf; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.MacAfi; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.SimpleAddress; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.SourceDestKeyLcaf; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.Address; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.AfiList; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.ApplicationData; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.ExplicitLocatorPath; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4Prefix; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4PrefixBuilder; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.KeyValueAddress; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Mac; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.SourceDestKey; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.afi.list.AfiListBuilder; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.application.data.ApplicationDataBuilder; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.explicit.locator.path.ExplicitLocatorPathBuilder; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.explicit.locator.path.explicit.locator.path.Hop; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.explicit.locator.path.explicit.locator.path.Hop.LrsBits; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.explicit.locator.path.explicit.locator.path.HopBuilder; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.source.dest.key.SourceDestKeyBuilder; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress; +import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.inet.binary.types.rev160303.Ipv4AddressBinary; +import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.Ipv4PrefixBinaryAfi; +import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv4BinaryBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv4PrefixBinaryBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.AddMapping; import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.GotMapNotify; import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.GotMapReply; @@ -72,8 +110,11 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.Ma import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.MapRegister; import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.MapReply; import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.MapRequest; +import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.MappingKeepAlive; import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.OdlLispProtoListener; import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.RequestMapping; +import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.SiteId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.XtrId; import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.XtrReplyMapping; import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.XtrRequestMapping; import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.Eid; @@ -82,6 +123,9 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.ei import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.list.EidItemBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecord; import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecordBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.authkey.container.MappingAuthkey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.authkey.container.MappingAuthkeyBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container.MappingRecord; import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container.MappingRecord.Action; import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container.MappingRecordBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.list.MappingRecordItem; @@ -93,44 +137,14 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.ma import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.maprequestnotification.MapRequestBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.rloc.container.Rloc; import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.rloc.container.RlocBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.mapping.authkey.container.MappingAuthkey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.mapping.authkey.container.MappingAuthkeyBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpPrefix; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.AfiListLcaf; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.ApplicationDataLcaf; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.ExplicitLocatorPathLcaf; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.InstanceIdType; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv4PrefixAfi; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.KeyValueAddressLcaf; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.MacAfi; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.SimpleAddress; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.SourceDestKeyLcaf; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.AfiList; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.ApplicationData; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.ExplicitLocatorPath; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4Prefix; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4PrefixBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.KeyValueAddress; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Mac; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.SourceDestKey; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.afi.list.AfiListBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.application.data.ApplicationDataBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.explicit.locator.path.ExplicitLocatorPathBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.explicit.locator.path.explicit.locator.path.Hop; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.explicit.locator.path.explicit.locator.path.Hop.LrsBits; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.explicit.locator.path.explicit.locator.path.HopBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.source.dest.key.SourceDestKeyBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress; +import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.MappingOrigin; import org.ops4j.pax.exam.Option; import org.ops4j.pax.exam.junit.PaxExam; -import org.ops4j.pax.exam.util.Filter; import org.ops4j.pax.exam.karaf.options.LogLevelOption.LogLevel; import org.ops4j.pax.exam.options.MavenUrlReference; import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy; import org.ops4j.pax.exam.spi.reactors.PerClass; +import org.ops4j.pax.exam.util.Filter; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; import org.osgi.framework.InvalidSyntaxException; @@ -142,6 +156,11 @@ import org.slf4j.LoggerFactory; public class MappingServiceIntegrationTest extends AbstractMdsalTestBase { private static final Logger LOG = LoggerFactory.getLogger(MappingServiceIntegrationTest.class); + /** + * Defines how many attempt to create instance of DatagramSocket will be done before giving up. + */ + private static final int NUM_OF_ATTEMPTS_TO_CREATE_SOCKET = 2; + private byte[] mapRequestPacket; private byte[] mapRegisterPacketWithNotify; private byte[] mapRegisterPacketWithoutNotify; @@ -153,20 +172,9 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase { public static final String ODL = "org.opendaylight.controller"; public static final String YANG = "org.opendaylight.yangtools"; + private static final int MULTI_SITE_SLEEP_TIME = 1; private static final int MAX_NOTIFICATION_RETRYS = 20; private static final MappingAuthkey NULL_AUTH_KEY = new MappingAuthkeyBuilder().setKeyType(0).build(); - private static final MappingAuthkey AUTH_KEY = - new MappingAuthkeyBuilder().setKeyType(1).setKeyString("password").build(); - - @Override - public String getModuleName() { - return "mappingservice-impl"; - } - - @Override - public String getInstanceName() { - return "mappingservice-default"; - } // This is temporary, since the properties in the pom file are not picked up @Override @@ -213,16 +221,15 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase { if (socket != null) { socket.close(); } -// if (connection != null) { -// connection.disconnect(); -// } + // reset mapping record validity to default value + ConfigIni.getInstance().setRegistrationValiditySb(200000L); } @Before public void before() throws Exception { areWeReady(); mapService.setLookupPolicy(IMappingService.LookupPolicy.NB_FIRST); - mapService.setMappingOverwrite(true); + mapService.setMappingMerge(false); locatorEid = LispAddressUtil.asIpv4Rloc("4.3.2.1"); socket = initSocket(socket, LispMessage.PORT_NUM); @@ -345,9 +352,9 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase { @Test public void testLCAFs() throws Exception { - //registerAndQuery__SrcDestLCAF(); - //registerAndQuery__SrcDestLCAFOverlap(); - //registerAndQuery__KeyValueLCAF(); + registerAndQuery__SrcDestLCAF(); + registerAndQuery__SrcDestLCAFOverlap(); + registerAndQuery__KeyValueLCAF(); //registerAndQuery__ListLCAF(); //registerAndQuery__ApplicationData(); //registerAndQuery__TrafficEngineering(); @@ -385,6 +392,7 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase { @Test public void testTimeOuts() throws Exception { + timedOutMappingRecord(); mapRequestMapRegisterAndMapRequestTestTimeout(); //mapRequestMapRegisterAndMapRequestTestNativelyForwardTimeoutResponse(); TODO commented because it needs NB } @@ -399,15 +407,249 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase { @Test public void testSmr() throws Exception { registerQueryRegisterWithSmr(); + testRepeatedSmr(); + } + + @Test + public void testMultiSite() throws Exception { + testMultiSiteScenarioA(); + testMultiSiteScenarioB(); + } + + @Test + public void testNegativePrefix() throws UnknownHostException { + insertMappings(); + testGapIntersection(); + testMultipleMappings(); } + private void testRepeatedSmr() throws SocketTimeoutException, UnknownHostException { + cleanUP(); + long timeout = ConfigIni.getInstance().getSmrTimeout(); + + final InstanceIdType iid = new InstanceIdType(1L); + final Eid eid1 = LispAddressUtil.asIpv4Eid("1.1.1.1", 1L); + final int expectedSmrs1 = 2; + final int expectedSmrs2 = 3; + + /* set auth */ + final Eid eid = LispAddressUtil.asIpv4PrefixBinaryEid("0.0.0.0/0", iid); + mapService.addAuthenticationKey(eid, NULL_AUTH_KEY); + + /* add subscribers */ + final String subscriberSrcRloc1 = "127.0.0.3"; + final String subscriberSrcRloc2 = "127.0.0.4"; + final Set subscriberSet1 = Sets.newHashSet(newSubscriber(eid1, subscriberSrcRloc1), + newSubscriber(eid1, subscriberSrcRloc2)); + mapService.addData(MappingOrigin.Southbound, eid1, SubKeys.SUBSCRIBERS, subscriberSet1); + + final SocketReader reader1 = startSocketReader(subscriberSrcRloc1, 15000); + final SocketReader reader2 = startSocketReader(subscriberSrcRloc2, 15000); + sleepForSeconds(1); + + /* add mapping */ + final MappingRecord mapping1 = new MappingRecordBuilder() + .setEid(eid1).setTimestamp(System.currentTimeMillis()).setRecordTtl(1440).build(); + mapService.addMapping(MappingOrigin.Northbound, eid1, null, new MappingData(mapping1)); + + sleepForMilliseconds((timeout * expectedSmrs1) - 1500); + final List requests1 = processSmrPackets(reader1, subscriberSrcRloc1, expectedSmrs1); + final MapReply mapReply1 = lms.handleMapRequest( + new MapRequestBuilder(requests1.get(0)) + .setItrRloc(Lists.newArrayList(new ItrRlocBuilder() + .setRloc(LispAddressUtil.asIpv4Rloc(subscriberSrcRloc1)).build())) + .setEidItem(Lists.newArrayList(new EidItemBuilder().setEid(eid1).build())) + .setSmrInvoked(true) + .setSmr(false).build()); + + // sleep to get 1 extra smr request + sleepForMilliseconds(timeout * 1); + final List requests2 = processSmrPackets(reader2, subscriberSrcRloc2, expectedSmrs2); + final MapReply mapReply2 = lms.handleMapRequest( + new MapRequestBuilder(requests2.get(0)) + .setItrRloc(Lists.newArrayList(new ItrRlocBuilder() + .setRloc(LispAddressUtil.asIpv4Rloc(subscriberSrcRloc2)).build())) + .setEidItem(Lists.newArrayList(new EidItemBuilder().setEid(eid1).build())) + .setSmrInvoked(true) + .setSmr(false).build()); + + sleepForSeconds(3); + assertEquals(expectedSmrs1, requests1.size()); + assertEquals(expectedSmrs2, requests2.size()); + assertEquals((long) mapReply1.getNonce(), (long) requests1.get(0).getNonce()); + assertEquals((long) mapReply2.getNonce(), (long) requests2.get(0).getNonce()); + assertNextBufferEmpty(reader1); + assertNextBufferEmpty(reader2); + + reader1.stopReading(); + reader2.stopReading(); + } + + private SocketReader startSocketReader(String address, int timeout) { + DatagramSocket receivingSocket = null; + + try { + receivingSocket = new DatagramSocket(new InetSocketAddress(address, LispMessage.PORT_NUM)); + } catch (SocketException e) { + LOG.error("Can't initialize socket for {}", address, e); + } + return SocketReader.startReadingInStandaloneThread(receivingSocket, timeout); + } + + private List processSmrPackets(SocketReader reader, String address, int expectedSmrs) { + InetAddress inetAddress = null; + try { + inetAddress = InetAddress.getByName(address); + } catch (UnknownHostException e) { + LOG.error("Unknown address {}.", address, e); + } + + final List requests = Lists.newArrayList(); + byte[][] buffers = reader.getBuffers(expectedSmrs); + for (byte[] buf : buffers) { + MapRequest request = MapRequestSerializer.getInstance().deserialize(ByteBuffer.wrap(buf), inetAddress); + requests.add(request); + } + return requests; + } + + private void assertNextBufferEmpty(SocketReader socketReader) { + assertTrue(isArrayEmpty(socketReader.getBuffers(1)[0])); + } + + private boolean isArrayEmpty(byte[] byteArray) { + for (byte b : byteArray) { + if (b != 0) { + return false; + } + } + return true; + } + + private static SubscriberRLOC newSubscriber(Eid srcEid, String srcRlocIp) { + final byte[] addressBinary = InetAddresses.forString(srcRlocIp).getAddress(); + final int timeout = 5; + final Rloc srcRloc = new RlocBuilder().setAddress(new Ipv4BinaryBuilder() + .setIpv4Binary(new Ipv4AddressBinary(addressBinary)).build()).build(); + + return new SubscriberRLOC(srcRloc, srcEid, timeout); + } + + private void testMultipleMappings() throws UnknownHostException { + final InstanceIdType iid = new InstanceIdType(1L); + final String prefix1 = "1.1.127.10/32"; // prefix from the intersection of NB and SB gaps + final String prefix2 = "1.1.200.255/32"; // prefix with existing mapping in NB + final String prefix3 = "1.3.255.255/32"; + + final MapRequest mapRequest = new MapRequestBuilder().setSmrInvoked(false).setEidItem(Lists.newArrayList( + new EidItemBuilder().setEid(LispAddressUtil.asIpv4PrefixBinaryEid(prefix1, iid)) + .build(), + new EidItemBuilder().setEid(LispAddressUtil.asIpv4PrefixBinaryEid(prefix2, iid)) + .build(), + new EidItemBuilder().setEid(LispAddressUtil.asIpv4PrefixBinaryEid(prefix3, iid)) + .build())) + .build(); + final MapReply mapReply = lms.handleMapRequest(mapRequest); + + // expected result + final String resultPrefix1 = "1.1.64.0"; + final Address resultNegMapping1 = new Ipv4PrefixBinaryBuilder() + .setIpv4AddressBinary(new Ipv4AddressBinary(InetAddress.getByName(resultPrefix1).getAddress())) + .setIpv4MaskLength((short) 18).build(); + + final String resultPrefix2 = "1.1.192.0"; + final Address resultMapping2 = new Ipv4PrefixBinaryBuilder() + .setIpv4AddressBinary(new Ipv4AddressBinary(InetAddress.getByName(resultPrefix2).getAddress())) + .setIpv4MaskLength((short) 18).build(); + + final String resultPrefix3 = "1.3.0.0"; + final Address resultNegMapping3 = new Ipv4PrefixBinaryBuilder() + .setIpv4AddressBinary(new Ipv4AddressBinary(InetAddress.getByName(resultPrefix3).getAddress())) + .setIpv4MaskLength((short) 16).build(); + + assertEquals(resultNegMapping1, mapReply.getMappingRecordItem().get(0).getMappingRecord().getEid() + .getAddress()); + assertEquals(resultMapping2, mapReply.getMappingRecordItem().get(1).getMappingRecord().getEid() + .getAddress()); + assertEquals(resultNegMapping3, mapReply.getMappingRecordItem().get(2).getMappingRecord().getEid() + .getAddress()); + } + + /** + * Tests a negative mapping from an intersection of gaps in northbound and southbound. + */ + private void testGapIntersection() throws UnknownHostException { + final InstanceIdType iid = new InstanceIdType(1L); + + // request an Eid from a gap between mappings + final MapRequest mapRequest = new MapRequestBuilder().setSmrInvoked(false).setEidItem(Lists.newArrayList( + new EidItemBuilder().setEid(LispAddressUtil.asIpv4PrefixBinaryEid("1.1.127.10/32", iid)) + .build())) + .build(); + final MapReply mapReply = lms.handleMapRequest(mapRequest); + + // expected negative mapping + final Address resultNegMapping = new Ipv4PrefixBinaryBuilder() + .setIpv4AddressBinary(new Ipv4AddressBinary(InetAddress.getByName("1.1.64.0").getAddress())) + .setIpv4MaskLength((short) 18).build(); + assertEquals(resultNegMapping, mapReply.getMappingRecordItem().get(0).getMappingRecord().getEid() + .getAddress()); + } + + private void insertMappings() { + cleanUP(); + mapService.setLookupPolicy(IMappingService.LookupPolicy.NB_AND_SB); + + final InstanceIdType iid = new InstanceIdType(1L); + final String prefixNbLeft = "1.2.0.0/16"; + final String prefixNbRight = "1.1.128.0/17"; + final String prefixSbLeft = "1.1.32.0/19"; + final String prefixSbRight = "1.0.0.0/8"; + + final MappingRecord mapRecordNbLeft = newMappingRecord(prefixNbLeft, iid); + final MappingRecord mapRecordNbRight = newMappingRecord(prefixNbRight, iid); + final MappingRecord mapRecordSbLeft = newMappingRecord(prefixSbLeft, iid); + final MappingRecord mapRecordSbRight = newMappingRecord(prefixSbRight, iid); + + /* set auth */ + final Eid eid = LispAddressUtil.asIpv4PrefixBinaryEid("0.0.0.0/0", iid); + mapService.addAuthenticationKey(eid, NULL_AUTH_KEY); + + mapService.addMapping(MappingOrigin.Northbound, mapRecordNbLeft.getEid(), null, + new MappingData(mapRecordNbLeft)); + mapService.addMapping(MappingOrigin.Northbound, mapRecordNbRight.getEid(), null, + new MappingData(mapRecordNbRight)); + mapService.addMapping(MappingOrigin.Southbound, mapRecordSbLeft.getEid(), null, + new MappingData(mapRecordSbLeft, System.currentTimeMillis())); + mapService.addMapping(MappingOrigin.Southbound, mapRecordSbRight.getEid(), null, + new MappingData(mapRecordSbRight, System.currentTimeMillis())); + + restartSocket(); + sleepForSeconds(2); + } + + /** + * Creates a new MappingRecord object. + * + * @param prefix The Eid prefix + * @param iid VNI + * @return new MappingRecord object + */ + private MappingRecord newMappingRecord(String prefix, InstanceIdType iid) { + final Eid prefixBinary = LispAddressUtil.asIpv4PrefixBinaryEid(prefix, iid); + return new MappingRecordBuilder() + .setEid(prefixBinary) + .setLocatorRecord(Lists.newArrayList(new LocatorRecordBuilder() + .setRloc(LispAddressUtil.asIpv4Rloc("2.2.2.2")).setLocatorId("loc_id").build())) + .setTimestamp(System.currentTimeMillis()).setRecordTtl(1440).build(); + } /** * TEST SCENARIO A */ - @Test public void testMultiSiteScenarioA() throws IOException { cleanUP(); + ConfigIni.getInstance().setSmrRetryCount(1); final MultiSiteScenario multiSiteScenario = new MultiSiteScenario(mapService, lms); multiSiteScenario.setCommonAuthentication(); @@ -419,7 +661,7 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase { multiSiteScenario.storeSouthboundMappings(false, SITE_A, SITE_B, SITE_C, SITE_D4, SITE_D5); multiSiteScenario.storeNorthMappingSrcDst(SITE_B, SITE_C); multiSiteScenario.storeNorthMappingNegative(SITE_C, Action.Drop); - sleepForSeconds(2); + sleepForSeconds(MULTI_SITE_SLEEP_TIME); multiSiteScenario.assertPingWorks(SITE_A, 5, SITE_B, 4); multiSiteScenario.assertPingWorks(SITE_B, 5, SITE_C, 4); multiSiteScenario.assertPingFails(SITE_A, 1, SITE_C, 4); @@ -429,7 +671,7 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase { // 1) 192.0.2.5/32 // 2) 192.0.1.1/32 multiSiteScenario.storeNorthMappingSrcDst(SITE_A, SITE_C); - sleepForSeconds(2); + sleepForSeconds(MULTI_SITE_SLEEP_TIME); multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_B.getHost(5), SITE_A.getHost(1)); multiSiteScenario.assertPingWorks(SITE_A, 5, SITE_C, 4); multiSiteScenario.assertPingWorks(SITE_B, 5, SITE_C, 4); @@ -442,7 +684,7 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase { // 3) 192.0.1.5/32 // 4) 192.0.4.5/32 multiSiteScenario.deleteNorthMappingNegative(SITE_C); - sleepForSeconds(2); + sleepForSeconds(MULTI_SITE_SLEEP_TIME); multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_B.getHost(5), SITE_A.getHost(1), SITE_A .getHost(5), SITE_D4.getHost(5)); @@ -452,7 +694,7 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase { // following action should trigger generatting of SMR messages: // 1) 192.0.4.5/32 multiSiteScenario.storeNorthMappingSrcDst(SITE_B, SITE_C_RLOC_10); - sleepForSeconds(2); + sleepForSeconds(MULTI_SITE_SLEEP_TIME); multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_D4.getHost(5)); //way of testing ping - get RLOC for mapping src-dst and compare it with awaited value doesn't test //that ping won't be successfull @@ -463,7 +705,7 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase { // 1) 192.0.4.5/32 // 2) 192.0.2.5/32 multiSiteScenario.storeNorthMappingNegative(SITE_C, Action.Drop); - sleepForSeconds(2); + sleepForSeconds(MULTI_SITE_SLEEP_TIME); multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_D4.getHost(5), SITE_B.getHost(5)); multiSiteScenario.assertPingFails(SITE_D4, 5, SITE_C, 4); @@ -472,7 +714,7 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase { //TEST CASE 7 multiSiteScenario.deleteNorthMapingSrcDst(SITE_A, SITE_C); - sleepForSeconds(2); + sleepForSeconds(MULTI_SITE_SLEEP_TIME); // following action should trigger generatting of SMR messages: // 1) 192.0.4.5/32 // 2) 192.0.2.5/32 @@ -485,7 +727,7 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase { // 2) 192.0.2.5/32 // 3) 192.0.5.5/32 multiSiteScenario.storeNorthMappingSrcDst(SITE_B, SITE_C); - sleepForSeconds(2); + sleepForSeconds(MULTI_SITE_SLEEP_TIME); multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_D5.getHost(5), SITE_D4.getHost(5), SITE_B.getHost(5)); @@ -500,7 +742,7 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase { // 3) 192.0.5.5/32 // 4) 192.0.1.1/32 multiSiteScenario.deleteNorthMapingSrcDst(SITE_B, SITE_C); - sleepForSeconds(2); + sleepForSeconds(MULTI_SITE_SLEEP_TIME); multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_D5.getHost(5), SITE_D4.getHost(5), SITE_B.getHost(5), SITE_A.getHost(1)); @@ -515,7 +757,7 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase { // 3) 192.0.5.5/32 // 4) 192.0.1.1/32 multiSiteScenario.deleteNorthMappingNegative(SITE_C); - sleepForSeconds(2); + sleepForSeconds(MULTI_SITE_SLEEP_TIME); multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_D5.getHost(5), SITE_D4.getHost(5), SITE_B.getHost(5), SITE_A.getHost(1)); @@ -530,7 +772,6 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase { /** * TEST SCENARIO B */ - @Test public void testMultiSiteScenarioB() throws IOException { cleanUP(); @@ -541,7 +782,7 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase { final SocketReader socketReader = SocketReader.startReadingInStandaloneThread(socket); mapService.setLookupPolicy(IMappingService.LookupPolicy.NB_AND_SB); - mapService.setMappingOverwrite(false); + mapService.setMappingMerge(true); //TEST CASE 1 multiSiteScenario.storeSouthboundMappings(true, SITE_A_SB, SITE_B_SB, SITE_C_WP_100_1_SB, SITE_D_WP_100_1_SB, @@ -549,7 +790,7 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase { multiSiteScenario.storeNorthMappingIpPrefix(SITE_A_SB); multiSiteScenario.storeNorthMappingIpPrefix(SITE_B_SB); multiSiteScenario.storeNorthMappingIpPrefix(SITE_C_WP_50_2_SB, SITE_D_WP_50_2_SB); - sleepForSeconds(2); + sleepForSeconds(MULTI_SITE_SLEEP_TIME); multiSiteScenario.assertPingWorks(SITE_A_SB, 5, SITE_C_WP_50_2_SB, 4, SITE_D_WP_50_2_SB); multiSiteScenario.assertPingWorks(SITE_B_SB, 5, SITE_C_WP_50_2_SB, 4, SITE_D_WP_50_2_SB); @@ -558,14 +799,14 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase { // 1) 192.0.2.5/32 // 2) 192.0.1.5/32 multiSiteScenario.storeNorthMappingSrcDst(SITE_A_SB, SITE_C_WP_50_2_SB, SITE_D_WP_50_2_SB); - sleepForSeconds(2); + sleepForSeconds(MULTI_SITE_SLEEP_TIME); multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_B_SB.getHost(5), SITE_A_SB.getHost(5)); // following action should trigger generatting of SMR messages: // 1) 192.0.2.5/32 // 2) 192.0.1.5/32 multiSiteScenario.storeNorthMappingNegative(SITE_C_SB, Action.Drop); - sleepForSeconds(2); + sleepForSeconds(MULTI_SITE_SLEEP_TIME); multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_B_SB.getHost(5), SITE_A_SB.getHost(5)); multiSiteScenario.assertPingWorks(SITE_A_SB, 5, SITE_C_WP_50_2_SB, 4, SITE_D_WP_50_2_SB); @@ -577,13 +818,13 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase { // 1) 192.0.2.5/32 // 2) 192.0.1.5/32 multiSiteScenario.storeNorthMappingSrcDst(SITE_A_SB, SITE_C_WP_50_2_SB); - sleepForSeconds(2); + sleepForSeconds(MULTI_SITE_SLEEP_TIME); multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_B_SB.getHost(5), SITE_A_SB.getHost(5)); multiSiteScenario.assertPingWorks(SITE_A_SB, 5, SITE_C_WP_50_2_SB, 4); //TEST CASE 4 multiSiteScenario.storeNorthMappingSrcDst(SITE_B_SB, SITE_C_WP_50_2_SB, SITE_D_WP_50_2_SB); - sleepForSeconds(2); + sleepForSeconds(MULTI_SITE_SLEEP_TIME); // following action should trigger generatting of SMR messages: // 1) 192.0.2.5/32 // 2) 192.0.1.5/32 @@ -592,7 +833,7 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase { //TEST CASE 5 multiSiteScenario.deleteSouthboundMappings(SITE_D_DELETE_SB); - sleepForSeconds(2); + sleepForSeconds(MULTI_SITE_SLEEP_TIME); // following action should trigger generatting of SMR messages: // 1) 192.0.2.5/32 // 2) 192.0.1.5/32 @@ -602,14 +843,14 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase { //TEST CASE 6 multiSiteScenario.deleteNorthMapingSrcDst(SITE_A_SB, SITE_C_WP_50_2_SB); - sleepForSeconds(2); + sleepForSeconds(MULTI_SITE_SLEEP_TIME); // following action should trigger generatting of SMR messages: // 1) 192.0.2.5/32 // 2) 192.0.1.5/32 multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_B_SB.getHost(5), SITE_A_SB.getHost(5)); multiSiteScenario.deleteNorthMapingSrcDst(SITE_B_SB, SITE_C_WP_50_2_SB); - sleepForSeconds(2); + sleepForSeconds(MULTI_SITE_SLEEP_TIME); multiSiteScenario.assertPingFails(SITE_B_SB, 5, SITE_C_WP_50_2_SB, 4); socketReader.stopReading(); @@ -637,8 +878,9 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase { public void mapRegisterWithMapNotify() throws SocketTimeoutException { cleanUP(); - mapService.addAuthenticationKey(LispAddressUtil.asIpv4PrefixEid("153.16.254.1/32"), NULL_AUTH_KEY); - sleepForSeconds(1); + mapService.addAuthenticationKey(LispAddressUtil.asIpv4PrefixBinaryEid("153.16.254.1/32"), NULL_AUTH_KEY); + + sleepForSeconds(2); sendPacket(mapRegisterPacketWithNotify); MapNotify reply = receiveMapNotify(); assertEquals(7, reply.getNonce().longValue()); @@ -646,7 +888,7 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase { public void mapRegisterWithMapNotifyAndMapRequest() throws SocketTimeoutException { cleanUP(); - Eid eid = LispAddressUtil.asIpv4PrefixEid("1.2.3.4/32"); + Eid eid = LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.4/32"); MapReply mapReply = registerAddressAndQuery(eid); @@ -672,7 +914,7 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase { public void mapRequestMapRegisterAndMapRequest() throws SocketTimeoutException { cleanUP(); - Eid eid = LispAddressUtil.asIpv4PrefixEid("1.2.3.4/32"); + Eid eid = LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.4/32"); mapService.addAuthenticationKey(eid, NULL_AUTH_KEY); sleepForSeconds(1); @@ -715,7 +957,7 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase { public void testMapRegisterDosntOverwritesOtherSubKeys() throws SocketTimeoutException { cleanUP(); - Eid eid = LispAddressUtil.asIpv4PrefixEid("1.2.3.4/32"); + Eid eid = LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.4/32"); SimpleAddress rloc1Value = new SimpleAddress(new IpAddress(new Ipv4Address("4.3.2.1"))); Rloc rloc1 = LispAddressUtil.asKeyValueAddress("subkey1", rloc1Value); SimpleAddress rloc2Value = new SimpleAddress(new IpAddress(new Ipv4Address("4.3.2.2"))); @@ -730,7 +972,7 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase { public void testMapRegisterOverwritesSameSubkey() throws SocketTimeoutException { cleanUP(); - Eid eid = LispAddressUtil.asIpv4PrefixEid("1.2.3.4/32"); + Eid eid = LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.4/32"); SimpleAddress rloc1Value = new SimpleAddress(new IpAddress(new Ipv4Address("4.3.2.1"))); Rloc rloc1 = LispAddressUtil.asKeyValueAddress("subkey1", rloc1Value); SimpleAddress rloc2Value = new SimpleAddress(new IpAddress(new Ipv4Address("4.3.2.2"))); @@ -743,8 +985,8 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase { public void testMapRegisterOverwritesNoSubkey() throws SocketTimeoutException { cleanUP(); - mapService.setMappingOverwrite(true); - Eid eid = LispAddressUtil.asIpv4PrefixEid("1.2.3.4/32"); + mapService.setMappingMerge(false); + Eid eid = LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.4/32"); Rloc rloc1Value = LispAddressUtil.asIpv4Rloc("4.3.2.1"); Rloc rloc2Value = LispAddressUtil.asIpv4Rloc("4.3.2.2"); MapReply mapReply = sendMapRegisterTwiceWithDiffrentValues(eid, rloc1Value, rloc2Value); @@ -755,8 +997,8 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase { public void testMapRegisterDoesntOverwritesNoSubkey() throws SocketTimeoutException { cleanUP(); - mapService.setMappingOverwrite(false); - Eid eid = LispAddressUtil.asIpv4PrefixEid("1.2.3.4/32"); + mapService.setMappingMerge(true); + Eid eid = LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.4/32"); Rloc rloc1Value = LispAddressUtil.asIpv4Rloc("4.3.2.1"); Rloc rloc2Value = LispAddressUtil.asIpv4Rloc("4.3.2.2"); MapReply mapReply = sendMapRegisterTwiceWithDiffrentValues(eid, rloc1Value, rloc2Value); @@ -813,7 +1055,7 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase { public void registerQueryRegisterWithSmr() throws SocketTimeoutException { cleanUP(); lms.setShouldUseSmr(true); - mapService.addAuthenticationKey(LispAddressUtil.asIpv4PrefixEid("153.16.254.1/32"), NULL_AUTH_KEY); + mapService.addAuthenticationKey(LispAddressUtil.asIpv4PrefixBinaryEid("153.16.254.1/32"), NULL_AUTH_KEY); sleepForSeconds(1); sendPacket(mapRegisterPacketWithNotify); @@ -827,12 +1069,12 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase { sendPacket(mapRegisterPacketWithoutNotify); ByteBuffer readBuf = ByteBuffer.wrap(receivePacket().getData()); - MapRequest smr = MapRequestSerializer.getInstance().deserialize(readBuf); + MapRequest smr = MapRequestSerializer.getInstance().deserialize(readBuf, null); assertTrue(smr.isSmr()); Eid sourceEid = smr.getSourceEid().getEid(); assertTrue(LispAddressUtil.asIpv4Eid("153.16.254.1").equals(sourceEid)); Eid smrEid = smr.getEidItem().get(0).getEid(); - assertTrue(LispAddressUtil.asIpv4PrefixEid("1.2.3.4/32").equals(smrEid)); + assertTrue(LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.4/32").equals(smrEid)); } // --------------------- Northbound Tests --------------------------- @@ -1225,15 +1467,16 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase { public void eidPrefixLookupIPv4() throws SocketTimeoutException { cleanUP(); - runPrefixTest(LispAddressUtil.asIpv4PrefixEid("1.2.3.4/16"), LispAddressUtil.asIpv4PrefixEid("1.2.3.2/32"), - LispAddressUtil.asIpv4PrefixEid("1.1.1.1/32")); + runPrefixTest(LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.4/16"), + LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.2/32"), + LispAddressUtil.asIpv4PrefixBinaryEid("1.1.1.1/32")); } public void eidPrefixLookupIPv6() throws SocketTimeoutException { cleanUP(); - runPrefixTest(LispAddressUtil.asIpv6PrefixEid("1:2:3:4:5:6:7:8/64"), - LispAddressUtil.asIpv6PrefixEid("1:2:3:4:5:1:2:3/128"), - LispAddressUtil.asIpv6PrefixEid("1:2:3:1:2:3:1:2/128")); + runPrefixTest(LispAddressUtil.asIpv6PrefixBinaryEid("1:2:3:4:5:6:7:8/64"), + LispAddressUtil.asIpv6PrefixBinaryEid("1:2:3:4:5:1:2:3/128"), + LispAddressUtil.asIpv6PrefixBinaryEid("1:2:3:1:2:3:1:2/128")); } private void runPrefixTest(Eid registerEID, Eid matchedAddress, Eid unMatchedAddress) @@ -1516,7 +1759,6 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase { // ------------------------------- LCAF Tests --------------------------- - @Test public void registerAndQuery__SrcDestLCAF() throws SocketTimeoutException { cleanUP(); String ipPrefix = "10.20.30.200/32"; @@ -1524,7 +1766,7 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase { SourceDestKeyBuilder builder = new SourceDestKeyBuilder(); builder.setSource(new SimpleAddress(new IpPrefix(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang - .ietf.inet.types.rev100924.Ipv4Prefix(ipPrefix)))); + .ietf.inet.types.rev130715.Ipv4Prefix(ipPrefix)))); builder.setDest(new SimpleAddress(new MacAddress(macString))); EidBuilder eb = new EidBuilder(); @@ -1552,7 +1794,6 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase { assertEquals(macString, receivedMAC.getValue()); } - @Test public void registerAndQuery__SrcDestLCAFOverlap() throws SocketTimeoutException { cleanUP(); String ipString1 = "10.10.10.0"; @@ -1561,7 +1802,7 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase { String ipPrefix2 = ipString2 + "/24"; Eid srcDst = LispAddressUtil.asSrcDstEid(ipString1, ipString2, 24, 24, 0); - registerAddress(LispAddressUtil.asIpv4PrefixEid(ipPrefix2)); + registerAddress(LispAddressUtil.asIpv4PrefixBinaryEid(ipPrefix2)); registerAddress(srcDst); // exact match @@ -1581,23 +1822,20 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase { assertEquals(ipPrefix2, receivedAddr2.getIpv4Prefix().getValue()); // srcEid/dstEid match - reply = queryForAddress(LispAddressUtil.asIpv4PrefixEid("20.20.20.1/32"), "10.10.10.1"); + reply = queryForAddress(LispAddressUtil.asIpv4PrefixBinaryEid("20.20.20.1/32"), "10.10.10.1"); fromNetwork = reply.getMappingRecordItem().get(0).getMappingRecord().getEid(); - assertEquals(Ipv4PrefixAfi.class, fromNetwork.getAddressType()); + assertEquals(Ipv4PrefixBinaryAfi.class, fromNetwork.getAddressType()); - Ipv4Prefix ipAddr2 = (Ipv4Prefix) fromNetwork.getAddress(); - assertEquals(ipPrefix2, ipAddr2.getIpv4Prefix().getValue()); + assertEquals(LispAddressUtil.asIpv4PrefixBinaryEid(ipPrefix2), fromNetwork); // dstEid match only - reply = queryForAddress(LispAddressUtil.asIpv4PrefixEid("20.20.20.1/32"), "1.2.3.4"); + reply = queryForAddress(LispAddressUtil.asIpv4PrefixBinaryEid("20.20.20.1/32"), "1.2.3.4"); fromNetwork = reply.getMappingRecordItem().get(0).getMappingRecord().getEid(); - assertEquals(Ipv4PrefixAfi.class, fromNetwork.getAddressType()); + assertEquals(Ipv4PrefixBinaryAfi.class, fromNetwork.getAddressType()); - ipAddr2 = (Ipv4Prefix) fromNetwork.getAddress(); - assertEquals(ipPrefix2, ipAddr2.getIpv4Prefix().getValue()); + assertEquals(LispAddressUtil.asIpv4PrefixBinaryEid(ipPrefix2), fromNetwork); } - @Test public void registerAndQuery__KeyValueLCAF() throws SocketTimeoutException { cleanUP(); String ipString = "10.20.30.200"; @@ -1667,7 +1905,7 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase { eb.setAddressType(Ipv4PrefixAfi.class); eb.setVirtualNetworkId(new InstanceIdType((long) instanceId)); eb.setAddress(new Ipv4PrefixBuilder().setIpv4Prefix(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns - .yang.ietf.inet.types.rev100924.Ipv4Prefix(ipString)).build()); + .yang.ietf.inet.types.rev130715.Ipv4Prefix(ipString)).build()); MapReply reply = registerAddressAndQuery(eb.build()); @@ -1779,7 +2017,7 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase { public void mapRequestMapRegisterAndMapRequestTestTimeout() throws SocketTimeoutException { cleanUP(); - Eid eid = LispAddressUtil.asIpv4PrefixEid("1.2.3.4/32"); + Eid eid = LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.4/32"); mapService.addAuthenticationKey(eid, NULL_AUTH_KEY); sleepForSeconds(1); MapRequestBuilder mapRequestBuilder = new MapRequestBuilder(); @@ -1831,7 +2069,7 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase { public void mapRequestMapRegisterAndMapRequestTestNativelyForwardTimeoutResponse() throws Exception { cleanUP(); - Eid eid = LispAddressUtil.asIpv6PrefixEid("1.2.3.4/32"); + Eid eid = LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.4/32"); MapRequest mapRequest = createMapRequest(eid); testTTLBeforeRegister(mapRequest); @@ -1848,6 +2086,37 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase { } + private void timedOutMappingRecord() { + cleanUP(); + mapService.setMappingMerge(true); + // mapping expires after 1 second + ConfigIni.getInstance().setRegistrationValiditySb(1000L); + + final Eid eid = LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.4/32", new InstanceIdType(10L)); + final XtrId xtrId = new XtrId(new byte[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}); + final SiteId siteId = new SiteId(new byte[]{1, 2, 3, 4, 5, 6, 7, 8}); + + final LocatorRecord locatorRecord = new LocatorRecordBuilder() + .setRloc(LispAddressUtil.asIpv4Rloc("1.1.1.1")).setLocatorId("locator-id").build(); + final MappingRecord mappingRecord = new MappingRecordBuilder() + .setEid(eid) + .setSiteId(siteId) + .setRecordTtl(1000) + .setXtrId(xtrId) + .setAction(Action.NoAction) + .setAuthoritative(true) + .setLocatorRecord(Lists.newArrayList()).build(); + mappingRecord.getLocatorRecord().add(locatorRecord); + + mapService.addAuthenticationKey(eid, NULL_AUTH_KEY); + mapService.addMapping(MappingOrigin.Southbound, eid, siteId, + new MappingData(mappingRecord, System.currentTimeMillis())); + sleepForSeconds(2); + + MappingRecord resultRecord = (MappingRecord) mapService.getMapping(MappingOrigin.Southbound, eid); + assertNull(resultRecord); + } + private void testTTLAfterClean(MapRequest mapRequest) throws SocketTimeoutException { MapReply mapReply; sendMapRequest(mapRequest); @@ -1989,6 +2258,10 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase { public void onXtrRequestMapping(XtrRequestMapping notification) { } + @Override + public void onMappingKeepAlive(MappingKeepAlive notification) { + } + } public void testRecievingNonProxyOnXtrPort() throws SocketTimeoutException, SocketException, Throwable { @@ -2049,13 +2322,13 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase { } private MapRequest createNonProxyMapRequest(String eid, Rloc adLcaf) throws SocketTimeoutException { - MapRegister mr = createMapRegister(LispAddressUtil.asIpv4PrefixEid(eid)); + MapRegister mr = createMapRegister(LispAddressUtil.asIpv4PrefixBinaryEid(eid)); LocatorRecord record = new LocatorRecordBuilder(mr.getMappingRecordItem().get(0).getMappingRecord() .getLocatorRecord().get(0)).setRloc(adLcaf).build(); mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().set(0, record); sendMapRegister(mr); assertMapNotifyReceived(); - MapRequest mapRequest = createMapRequest(LispAddressUtil.asIpv4PrefixEid(eid)); + MapRequest mapRequest = createMapRequest(LispAddressUtil.asIpv4PrefixBinaryEid(eid)); MapRequestBuilder builder = new MapRequestBuilder(mapRequest); builder.setPitr(true); mapRequest = builder.build(); @@ -2072,7 +2345,7 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase { private MapRequest receiveMapRequest(DatagramSocket datagramSocket) throws SocketTimeoutException { return MapRequestSerializer.getInstance().deserialize(ByteBuffer.wrap(receivePacket( - datagramSocket, 30000).getData())); + datagramSocket, 30000).getData()), null); } private MapNotify receiveMapNotify() throws SocketTimeoutException { @@ -2139,19 +2412,29 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase { } } + private void sleepForMilliseconds(long milliseconds) { + try { + Thread.sleep(milliseconds); + } catch (InterruptedException e) { + LOG.warn("Interrupted while sleeping", e); + } + } + private void initPacketAddress(DatagramPacket packet, int port) throws UnknownHostException { packet.setAddress(InetAddress.getByName(lispBindAddress)); packet.setPort(port); } private DatagramSocket initSocket(DatagramSocket socket, int port) { - try { - socket = new DatagramSocket(new InetSocketAddress(ourAddress, port)); - } catch (SocketException e) { - e.printStackTrace(); - fail(); + for (int i=0; i < NUM_OF_ATTEMPTS_TO_CREATE_SOCKET; i++) { + try { + return new DatagramSocket(new InetSocketAddress(ourAddress, port)); + } catch (SocketException e) { + LOG.error("Can't initialize socket for {}", ourAddress, e); + } } - return socket; + fail(); + return null; } private byte[] extractWSUdpByteArray(String wiresharkHex) {