import static org.opendaylight.lispflowmapping.integrationtest.MultiSiteScenarioUtil.SITE_A;
import static org.opendaylight.lispflowmapping.integrationtest.MultiSiteScenarioUtil.SITE_D5;
+import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
import org.apache.commons.lang3.ArrayUtils;
import org.opendaylight.lispflowmapping.integrationtest.MultiSiteScenarioUtil.Site;
import org.opendaylight.lispflowmapping.interfaces.lisp.IFlowMapping;
import org.opendaylight.lispflowmapping.interfaces.mappingservice.IMappingService;
+import org.opendaylight.lispflowmapping.lisp.serializer.MapRequestSerializer;
import org.opendaylight.lispflowmapping.lisp.util.LispAddressStringifier;
import org.opendaylight.lispflowmapping.lisp.util.LispAddressUtil;
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.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.Ipv4;
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.XtrId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.Eid;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.list.EidItem;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapregisternotification.MapRegisterBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.maprequest.ItrRloc;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.maprequest.ItrRlocBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.maprequest.SourceEid;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.maprequest.SourceEidBuilder;
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;
return mappingRecord;
}
- private void emitMapRegisterMessage(final Site dstSite) {
+ private void emitMapRegisterMessage(final Site dstSite, final boolean merge) {
final MapRegisterBuilder mapRegisterBuilder = new MapRegisterBuilder();
+ mapRegisterBuilder.setMergeEnabled(merge);
final MappingRecordItemBuilder mappingRecordItemBuilder = new MappingRecordItemBuilder();
mappingRecordItemBuilder.setMappingRecordItemId(MAP_RECORD_A);
mrbNegative.setEid(eidAsIpv4Prefix);
mrbNegative.setAction(action);
- mapService.addMapping(MappingOrigin.Northbound, eidAsIpv4Prefix, dstSite.getSiteId(), mrbNegative.build());
+ mapService.addMapping(MappingOrigin.Northbound, eidAsIpv4Prefix, dstSite.getSiteId(), mrbNegative.build(),
+ false);
}
void deleteNorthMappingNegative(final Site dstSite) {
void storeNorthMappingSrcDst(final Site srcSite, final Site ... dstSite) {
final MappingRecordBuilder mrb = prepareMappingRecord(EidType.EID_SRC_DST, srcSite,
dstSite);
- mapService.addMapping(MappingOrigin.Northbound, mrb.getEid(), dstSite[0].getSiteId(), mrb.build());
+ mapService.addMapping(MappingOrigin.Northbound, mrb.getEid(), dstSite[0].getSiteId(), mrb.build(), false);
}
void storeNorthMappingIpPrefix(final Site... dstSite) {
final MappingRecordBuilder mrb = prepareMappingRecord(EidType.EID_WITH_PREFIX, null, dstSite);
- mapService.addMapping(MappingOrigin.Northbound, mrb.getEid(), dstSite[0].getSiteId(), mrb.build());
+ mapService.addMapping(MappingOrigin.Northbound, mrb.getEid(), dstSite[0].getSiteId(), mrb.build(), false);
}
- private void storeDestinationSiteMappingViaSouthbound(final Site dstSite) {
- emitMapRegisterMessage(dstSite);
+ private void storeDestinationSiteMappingViaSouthbound(final Site dstSite, final boolean merge) {
+ emitMapRegisterMessage(dstSite, merge);
}
private MappingRecordBuilder prepareMappingRecordGeneral(final EidType eidType,
}
void deleteSouthboundMappings(final Site dstSite) {
- emitMapRegisterMessage(dstSite);
+ emitMapRegisterMessage(dstSite, false);
}
- void storeSouthboundMappings(final Site ... sites) {
+ void storeSouthboundMappings(final boolean merge, final Site ... sites) {
for (Site site : sites) {
- storeDestinationSiteMappingViaSouthbound(site);
+ storeDestinationSiteMappingViaSouthbound(site, merge);
}
}
}
}
+
+ private List<MapRequest> translateBuffersToMapRequest(byte[][] buffers) {
+ final List<MapRequest> mapRequests = new ArrayList<>();
+ for (byte[] buffer : buffers) {
+ final MapRequest mapRequest = MapRequestSerializer.getInstance().deserialize(ByteBuffer.wrap(buffer));
+ assertNotNull(mapRequest);
+ mapRequests.add(mapRequest);
+ }
+ return mapRequests;
+ }
+
+ private Set<Eid> prepareExpectedEid(final String ... hosts) {
+ final Set<Eid> eids = new HashSet<>();
+ for (String host : hosts) {
+ eids.add(LispAddressUtil.asIpv4PrefixBinaryEid(host + "/" + IP_MASK,
+ new InstanceIdType(MultiSiteScenarioUtil.VNI2)));
+ }
+ return eids;
+ }
+
+ private SourceEid prepareSourceEid(final String eidPrefix) {
+ final SourceEidBuilder sourceEidBuilder = new SourceEidBuilder();
+ final Eid eid = LispAddressUtil.asIpv4Eid(eidPrefix, MultiSiteScenarioUtil.VNI2);
+ return sourceEidBuilder.setEid(eid).build();
+ }
+
+ void checkSMR(final SocketReader socketReader, final String site, final String ... hosts) {
+ List<MapRequest> mapRequests = translateBuffersToMapRequest(socketReader.getBuffers(hosts.length));
+ final Set<Eid> eids = prepareExpectedEid(hosts);
+ final SourceEid expectedSourceEid = prepareSourceEid(site);
+ for(MapRequest mapRequest : mapRequests) {
+ assertTrue(mapRequest.isSmr());
+ final SourceEid receivedSourceEid = mapRequest.getSourceEid();
+ assertEquals(expectedSourceEid, receivedSourceEid);
+ final List<EidItem> currentEidItems = mapRequest.getEidItem();
+ assertNotNull(currentEidItems);
+ assertTrue(SMRContainsExpectedEid(eids, currentEidItems));
+ }
+ //all expected eids should be after looping via mapRequests matched.
+ assertTrue("Expected eids wasn't/weren't found " + eids, eids.isEmpty());
+ }
+
+ private boolean SMRContainsExpectedEid(Set<Eid> eids, List<EidItem> currentEidItems) {
+ for (EidItem eidItem : currentEidItems) {
+ //if eid from map request is matched then it is removed from set of expected eids
+ if (!eids.remove(eidItem.getEid())) {
+ fail("SMR contained " + eidItem.getEid() + " which wasn't expected.");
+ }
+ }
+ return true;
+ }
+
}