2 * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.lispflowmapping.integrationtest;
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertNotEquals;
12 import static org.junit.Assert.assertNotNull;
13 import static org.junit.Assert.assertTrue;
14 import static org.opendaylight.lispflowmapping.integrationtest.MappingServiceIntegrationTest.ourAddress;
15 import static org.opendaylight.lispflowmapping.integrationtest.MultiSiteScenarioUtil.SITE_A;
16 import static org.opendaylight.lispflowmapping.integrationtest.MultiSiteScenarioUtil.SITE_B;
17 import static org.opendaylight.lispflowmapping.integrationtest.MultiSiteScenarioUtil.SITE_C;
18 import static org.opendaylight.lispflowmapping.integrationtest.MultiSiteScenarioUtil.SITE_D4;
19 import static org.opendaylight.lispflowmapping.integrationtest.MultiSiteScenarioUtil.SITE_D5;
21 import java.util.ArrayList;
22 import java.util.Collections;
23 import java.util.List;
24 import org.opendaylight.lispflowmapping.integrationtest.MultiSiteScenarioUtil.Site;
25 import org.opendaylight.lispflowmapping.interfaces.lisp.IFlowMapping;
26 import org.opendaylight.lispflowmapping.interfaces.mappingservice.IMappingService;
27 import org.opendaylight.lispflowmapping.lisp.util.LispAddressUtil;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;
30 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.InstanceIdType;
31 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.Address;
32 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.MapReply;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.Eid;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.list.EidItem;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.list.EidItemBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecord;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecordBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container.MappingRecord;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container.MappingRecordBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.list.MappingRecordItem;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.list.MappingRecordItemBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapregisternotification.MapRegisterBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.maprequest.ItrRloc;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.maprequest.ItrRlocBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.maprequest.SourceEidBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.maprequestnotification.MapRequestBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.rloc.container.Rloc;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.MappingOrigin;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.mapping.authkey.container.MappingAuthkey;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.mapping.authkey.container.MappingAuthkeyBuilder;
52 import org.slf4j.Logger;
53 import org.slf4j.LoggerFactory;
56 class MultiSiteScenario {
58 private final int DEFAULT_NETWORK_MASK = 24;
59 private final int IP_MASK = 32;
61 private final Integer TTL = 1440;
62 private final String MAP_RECORD_A = "MAP_RECORD_1";
64 private final Short DEFAULT_PRIORITY = 1;
65 private final Short DEFAULT_WEIGHT = 1;
66 private final Short DEFAULT_MULTICAST_PRIORITY = 255;
67 private final Short DEFAULT_MULTICAST_WEIGHT = 0;
68 private final Boolean DEFAULT_LOCAL_LOCATOR = true;
69 private final Boolean DEFAULT_RLOC_PROBED = false;
70 private final Boolean DEFAULT_ROUTED = true;
72 private final MappingAuthkey NULL_AUTH_KEY = new MappingAuthkeyBuilder().setKeyType(0).build();
73 private final IMappingService mapService;
74 private final IFlowMapping lms;
76 private static final Logger LOG = LoggerFactory.getLogger(MultiSiteScenario.class);
78 MultiSiteScenario(final IMappingService mapService, final IFlowMapping lms) {
79 this.mapService = mapService;
83 private void verifySingleIpv4RlocMapping(final MapReply mapReply, final MappingRecord.Action action) {
84 final MappingRecord mappingRecord = verifySingleIpv4RlocMappingCommon(mapReply);
85 assertEquals(action, mappingRecord.getAction());
88 private void verifySingleIpv4RlocMapping(final MapReply mapReply, final String siteRloc, boolean pingWork) {
89 final MappingRecord mappingRecord = verifySingleIpv4RlocMappingCommon(mapReply);
90 final List<LocatorRecord> locatorRecords = mappingRecord.getLocatorRecord();
91 assertNotNull(locatorRecords);
92 assertEquals(1, locatorRecords.size());
93 final LocatorRecord locatorRecord = locatorRecords.get(0);
94 assertNotNull(locatorRecord);
95 final Rloc rloc = locatorRecord.getRloc();
97 final Address address = rloc.getAddress();
98 assertTrue(address instanceof Ipv4);
100 assertEquals(siteRloc, ((Ipv4) address).getIpv4().getValue());
102 assertNotEquals(siteRloc, ((Ipv4) address).getIpv4().getValue());
106 private MappingRecord verifySingleIpv4RlocMappingCommon(MapReply mapReply) {
107 assertNotNull(mapReply);
108 final List<MappingRecordItem> mappingRecordItems = mapReply.getMappingRecordItem();
109 assertNotNull(mappingRecordItems);
110 assertEquals(1, mappingRecordItems.size());
111 final MappingRecordItem mappingRecordItem = mappingRecordItems.get(0);
112 assertNotNull(mappingRecordItem);
113 final MappingRecord mappingRecord = mappingRecordItem.getMappingRecord();
114 assertNotNull(mappingRecord);
115 return mappingRecord;
118 private void emitMapRegisterMessage(final Site dstSite) {
119 final MapRegisterBuilder mapRegisterBuilder = new MapRegisterBuilder();
120 final MappingRecordItemBuilder mappingRecordItemBuilder = new MappingRecordItemBuilder();
121 mappingRecordItemBuilder.setMappingRecordItemId(MAP_RECORD_A);
123 final MappingRecordBuilder mrb = prepareMappingRecord(MappingOrigin.Southbound, null, dstSite);
124 mappingRecordItemBuilder.setMappingRecord(mrb.build());
125 mapRegisterBuilder.setMappingRecordItem(Collections.singletonList(mappingRecordItemBuilder.build()));
127 lms.handleMapRegister(mapRegisterBuilder.build());
130 void setCommonAuthentication() {
131 Eid eid = LispAddressUtil.toEid(new Ipv4Prefix("0.0.0.0/0"), SITE_A.getVNI());
132 mapService.addAuthenticationKey(eid, NULL_AUTH_KEY);
134 eid = LispAddressUtil.toEid(new Ipv4Prefix("0.0.0.0/0"), SITE_D5.getVNI());
135 mapService.addAuthenticationKey(eid, NULL_AUTH_KEY);
139 private Eid toEid(final String destSiteEidPrefix, final InstanceIdType vniValue, final int mask) {
140 return LispAddressUtil.toEid(new Ipv4Prefix(destSiteEidPrefix + "/" + mask), vniValue);
144 private MapReply emitMapRequestMessage(final String siteFromEidPrefix, final String siteToEidPrefix, final
145 InstanceIdType vniValue) {
146 final MapRequestBuilder mapRequestBuilder = new MapRequestBuilder();
147 final EidItemBuilder eidItemBuilder = new EidItemBuilder();
148 Eid dstEid = toEid(siteToEidPrefix, vniValue, IP_MASK);
150 eidItemBuilder.setEid(dstEid);
151 eidItemBuilder.setEidItemId(siteFromEidPrefix + siteToEidPrefix);
152 final List<EidItem> eidItem = Collections.singletonList(eidItemBuilder.build());
153 final Eid srcEid = toEid(siteFromEidPrefix, vniValue, IP_MASK);
154 mapRequestBuilder.setSourceEid(new SourceEidBuilder().setEid(srcEid).build());
155 mapRequestBuilder.setEidItem(eidItem);
156 mapRequestBuilder.setItrRloc(prepareDummyItrRloc());
157 return lms.handleMapRequest(mapRequestBuilder.build());
160 private List<ItrRloc> prepareDummyItrRloc() {
161 List<ItrRloc> itrRlocs = new ArrayList<>();
162 final ItrRlocBuilder itrRlocBuilder = new ItrRlocBuilder();
163 itrRlocBuilder.setItrRlocId(ourAddress);
164 itrRlocBuilder.setRloc(LispAddressUtil.asIpv4Rloc(ourAddress));
165 itrRlocs.add(itrRlocBuilder.build());
169 void storeNorthMappingNegative(final Site dstSite, final MappingRecord.Action action) {
170 final Ipv4Prefix ipv4Prefix = new Ipv4Prefix(dstSite.getEidPrefix() + "/" + DEFAULT_NETWORK_MASK);
171 final Eid eidAsIpv4Prefix = LispAddressUtil.toEid(ipv4Prefix, dstSite.getVNI());
173 final MappingRecordBuilder mrbNegative = prepareMappingRecord(MappingOrigin.Northbound, null, dstSite);
174 mrbNegative.setEid(eidAsIpv4Prefix);
175 mrbNegative.setAction(action);
177 mapService.addMapping(MappingOrigin.Northbound, eidAsIpv4Prefix, dstSite.getSiteId(), mrbNegative.build());
180 void deleteNorthMappingNegative(final Site dstSite) {
181 final Ipv4Prefix ipv4Prefix = new Ipv4Prefix(dstSite.getEidPrefix() + "/" + DEFAULT_NETWORK_MASK);
182 final Eid eidAsIpv4Prefix = LispAddressUtil.toEid(ipv4Prefix, dstSite.getVNI());
184 mapService.removeMapping(MappingOrigin.Northbound, eidAsIpv4Prefix);
187 void storeNorthMappingSrcDst(final Site srcSite, final Site dstSite) {
188 final MappingRecordBuilder mrb = prepareMappingRecord(MappingOrigin.Northbound, srcSite, dstSite);
189 mapService.addMapping(MappingOrigin.Northbound, mrb.getEid(), srcSite.getSiteId(), mrb.build());
192 private void storeDestinationSiteMappingViaSouthbound(final Site dstSite) {
193 emitMapRegisterMessage(dstSite);
196 private MappingRecordBuilder prepareMappingRecord(final MappingOrigin mappingOrigin, final Site srcSite, final
198 final MappingRecordBuilder mrb = provideCommonMapRecordBuilder();
200 if (MappingOrigin.Northbound.equals(mappingOrigin)) {
201 if (srcSite != null && dstSite != null && srcSite.getEidPrefix() != null && dstSite.getEidPrefix() !=
203 eid = LispAddressUtil.asSrcDstEid(srcSite.getEidPrefix(), dstSite.getEidPrefix(), DEFAULT_NETWORK_MASK,
204 DEFAULT_NETWORK_MASK, dstSite.getVNI().getValue().intValue());
206 } else if (MappingOrigin.Southbound.equals(mappingOrigin)) {
207 if (dstSite != null && dstSite.getEidPrefix() != null) {
208 eid = toEid(dstSite.getEidPrefix(), dstSite.getVNI(), DEFAULT_NETWORK_MASK);
214 if (dstSite.getRloc() != null) {
215 mrb.setLocatorRecord(provideLocatorRecord(LispAddressUtil.toRloc(new Ipv4Address(dstSite.getRloc())),
219 mrb.setTimestamp(System.currentTimeMillis());
220 mrb.setAction(MappingRecord.Action.NoAction);
221 mrb.setRecordTtl(TTL);
225 private List<LocatorRecord> provideLocatorRecord(final Rloc rloc, final String rlocStr) {
226 final LocatorRecordBuilder locatorRecordBuilder = new LocatorRecordBuilder();
227 locatorRecordBuilder.setRloc(rloc);
228 locatorRecordBuilder.setLocatorId(rlocStr);
229 locatorRecordBuilder.setPriority(DEFAULT_PRIORITY);
230 locatorRecordBuilder.setWeight(DEFAULT_WEIGHT);
231 locatorRecordBuilder.setMulticastPriority(DEFAULT_MULTICAST_PRIORITY);
232 locatorRecordBuilder.setMulticastWeight(DEFAULT_MULTICAST_WEIGHT);
233 locatorRecordBuilder.setLocalLocator(DEFAULT_LOCAL_LOCATOR);
234 locatorRecordBuilder.setRlocProbed(DEFAULT_RLOC_PROBED);
235 locatorRecordBuilder.setRouted(DEFAULT_ROUTED);
237 final List<LocatorRecord> locatorRecords = new ArrayList<>();
238 locatorRecords.add(locatorRecordBuilder.build());
239 return locatorRecords;
242 private MappingRecordBuilder provideCommonMapRecordBuilder() {
243 final MappingRecordBuilder mappingRecordBuilder = new MappingRecordBuilder();
244 mappingRecordBuilder.setRecordTtl(TTL);
245 mappingRecordBuilder.setAction(MappingRecord.Action.NoAction);
246 mappingRecordBuilder.setAuthoritative(true);
247 return mappingRecordBuilder;
250 void deleteNorthMapingSrcDst(final Site srcSite, final Site dstSite) {
251 final Eid eid = LispAddressUtil.asSrcDstEid(srcSite.getEidPrefix(), dstSite.getEidPrefix(),
252 DEFAULT_NETWORK_MASK, DEFAULT_NETWORK_MASK, dstSite.getVNI().getValue().intValue());
253 mapService.removeMapping(MappingOrigin.Northbound, eid);
256 // void storeNorthMappingBidirect(final Site srcSite, final Site dstSite) {
257 // storeNorthMappingSrcDst(srcSite, dstSite);
258 // storeNorthMappingSrcDst(dstSite, srcSite);
261 void storeSouthboundMappings() {
262 storeDestinationSiteMappingViaSouthbound(SITE_A);
263 storeDestinationSiteMappingViaSouthbound(SITE_B);
264 storeDestinationSiteMappingViaSouthbound(SITE_C);
265 storeDestinationSiteMappingViaSouthbound(SITE_D4);
266 storeDestinationSiteMappingViaSouthbound(SITE_D5);
269 void pingSimulation(final Site srcSite, final int srcHostIndex, final Site dstSite, final int dstHostIndex) {
270 pingSimulation(srcSite, srcHostIndex, dstSite, dstHostIndex, true, true);
273 void pingSimulation(final Site srcSite, final int srcHostIndex, final Site dstSite, final int dstHostIndex, final
274 boolean pingWorkVniValue, final boolean pingWorkReturnedRloc) {
275 final InstanceIdType instanceIdTypeDst = oneWayReachability(srcSite, srcHostIndex, dstSite, dstHostIndex, true);
276 final InstanceIdType instanceIdTypeSrc = oneWayReachability(dstSite, dstHostIndex, srcSite, srcHostIndex,
277 pingWorkReturnedRloc);
278 if (pingWorkVniValue) {
279 assertEquals("Ping doesn't work. Vni is different.", instanceIdTypeDst, instanceIdTypeSrc);
281 assertNotEquals("Ping work. Vni are equals.", instanceIdTypeDst, instanceIdTypeSrc);
285 InstanceIdType oneWayReachability(final Site srcSite, final int srcHostIndex, final Site dstSite, final int
286 dstHostIndex, final boolean pingWork) {
287 final MapReply mapReplyFromSrcToDst = emitMapRequestMessage(srcSite.getHost(srcHostIndex), dstSite.getHost
288 (dstHostIndex), dstSite.getVNI());
289 verifySingleIpv4RlocMapping(mapReplyFromSrcToDst, dstSite.getRloc(), pingWork);
290 return mapReplyFromSrcToDst.getMappingRecordItem().get(0).getMappingRecord().getEid().getVirtualNetworkId();
293 void oneWayReachability(final Site srcSite, final int srcHostIndex, final Site dstSite, final int dstHostIndex,
294 final MappingRecord.Action action) {
295 final MapReply mapReplyFromSrcToDst = emitMapRequestMessage(srcSite.getHost(srcHostIndex), dstSite.getHost
296 (dstHostIndex), dstSite.getVNI());
297 verifySingleIpv4RlocMapping(mapReplyFromSrcToDst, action);
300 private void sleepForSeconds(int seconds) {
302 Thread.sleep(seconds * 1000);
303 } catch (InterruptedException e) {
304 LOG.trace("Interrupted while sleeping", e);