Integr test - multi site scenario - common util code.
[lispflowmapping.git] / integrationtest / src / test / java / org / opendaylight / lispflowmapping / integrationtest / MultiSiteScenario.java
1 /**
2  * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.lispflowmapping.integrationtest;
9
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;
20
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;
54
55
56 class MultiSiteScenario {
57
58     private final int DEFAULT_NETWORK_MASK = 24;
59     private final int IP_MASK = 32;
60
61     private final Integer TTL = 1440;
62     private final String MAP_RECORD_A = "MAP_RECORD_1";
63
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;
71
72     private final MappingAuthkey NULL_AUTH_KEY = new MappingAuthkeyBuilder().setKeyType(0).build();
73     private final IMappingService mapService;
74     private final IFlowMapping lms;
75
76     private static final Logger LOG = LoggerFactory.getLogger(MultiSiteScenario.class);
77
78     MultiSiteScenario(final IMappingService mapService, final IFlowMapping lms) {
79         this.mapService = mapService;
80         this.lms = lms;
81     }
82
83     private void verifySingleIpv4RlocMapping(final MapReply mapReply, final MappingRecord.Action action) {
84         final MappingRecord mappingRecord = verifySingleIpv4RlocMappingCommon(mapReply);
85         assertEquals(action, mappingRecord.getAction());
86     }
87
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();
96         assertNotNull(rloc);
97         final Address address = rloc.getAddress();
98         assertTrue(address instanceof Ipv4);
99         if (pingWork) {
100             assertEquals(siteRloc, ((Ipv4) address).getIpv4().getValue());
101         } else {
102             assertNotEquals(siteRloc, ((Ipv4) address).getIpv4().getValue());
103         }
104     }
105
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;
116     }
117
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);
122
123         final MappingRecordBuilder mrb = prepareMappingRecord(MappingOrigin.Southbound, null, dstSite);
124         mappingRecordItemBuilder.setMappingRecord(mrb.build());
125         mapRegisterBuilder.setMappingRecordItem(Collections.singletonList(mappingRecordItemBuilder.build()));
126
127         lms.handleMapRegister(mapRegisterBuilder.build());
128     }
129
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);
133
134         eid = LispAddressUtil.toEid(new Ipv4Prefix("0.0.0.0/0"), SITE_D5.getVNI());
135         mapService.addAuthenticationKey(eid, NULL_AUTH_KEY);
136         sleepForSeconds(1);
137     }
138
139     private Eid toEid(final String destSiteEidPrefix, final InstanceIdType vniValue, final int mask) {
140         return LispAddressUtil.toEid(new Ipv4Prefix(destSiteEidPrefix + "/" + mask), vniValue);
141
142     }
143
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);
149
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());
158     }
159
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());
166         return itrRlocs;
167     }
168
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());
172
173         final MappingRecordBuilder mrbNegative = prepareMappingRecord(MappingOrigin.Northbound, null, dstSite);
174         mrbNegative.setEid(eidAsIpv4Prefix);
175         mrbNegative.setAction(action);
176
177         mapService.addMapping(MappingOrigin.Northbound, eidAsIpv4Prefix, dstSite.getSiteId(), mrbNegative.build());
178     }
179
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());
183
184         mapService.removeMapping(MappingOrigin.Northbound, eidAsIpv4Prefix);
185     }
186
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());
190     }
191
192     private void storeDestinationSiteMappingViaSouthbound(final Site dstSite) {
193         emitMapRegisterMessage(dstSite);
194     }
195
196     private MappingRecordBuilder prepareMappingRecord(final MappingOrigin mappingOrigin, final Site srcSite, final
197                                                       Site dstSite) {
198         final MappingRecordBuilder mrb = provideCommonMapRecordBuilder();
199         Eid eid = null;
200         if (MappingOrigin.Northbound.equals(mappingOrigin)) {
201             if (srcSite != null && dstSite != null && srcSite.getEidPrefix() != null && dstSite.getEidPrefix() !=
202                     null) {
203                 eid = LispAddressUtil.asSrcDstEid(srcSite.getEidPrefix(), dstSite.getEidPrefix(), DEFAULT_NETWORK_MASK,
204                         DEFAULT_NETWORK_MASK, dstSite.getVNI().getValue().intValue());
205             }
206         } else if (MappingOrigin.Southbound.equals(mappingOrigin)) {
207             if (dstSite != null && dstSite.getEidPrefix() != null) {
208                 eid = toEid(dstSite.getEidPrefix(), dstSite.getVNI(), DEFAULT_NETWORK_MASK);
209             }
210         }
211
212         mrb.setEid(eid);
213
214         if (dstSite.getRloc() != null) {
215             mrb.setLocatorRecord(provideLocatorRecord(LispAddressUtil.toRloc(new Ipv4Address(dstSite.getRloc())),
216                     dstSite.getRloc()));
217         }
218
219         mrb.setTimestamp(System.currentTimeMillis());
220         mrb.setAction(MappingRecord.Action.NoAction);
221         mrb.setRecordTtl(TTL);
222         return mrb;
223     }
224
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);
236
237         final List<LocatorRecord> locatorRecords = new ArrayList<>();
238         locatorRecords.add(locatorRecordBuilder.build());
239         return locatorRecords;
240     }
241
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;
248     }
249
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);
254     }
255
256 //    void storeNorthMappingBidirect(final Site srcSite, final Site dstSite) {
257 //        storeNorthMappingSrcDst(srcSite, dstSite);
258 //        storeNorthMappingSrcDst(dstSite, srcSite);
259 //    }
260
261     void storeSouthboundMappings() {
262         storeDestinationSiteMappingViaSouthbound(SITE_A);
263         storeDestinationSiteMappingViaSouthbound(SITE_B);
264         storeDestinationSiteMappingViaSouthbound(SITE_C);
265         storeDestinationSiteMappingViaSouthbound(SITE_D4);
266         storeDestinationSiteMappingViaSouthbound(SITE_D5);
267     }
268
269     void pingSimulation(final Site srcSite, final int srcHostIndex, final Site dstSite, final int dstHostIndex) {
270         pingSimulation(srcSite, srcHostIndex, dstSite, dstHostIndex, true, true);
271     }
272
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);
280         } else {
281             assertNotEquals("Ping work. Vni are equals.", instanceIdTypeDst, instanceIdTypeSrc);
282         }
283     }
284
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();
291     }
292
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);
298     }
299
300     private void sleepForSeconds(int seconds) {
301         try {
302             Thread.sleep(seconds * 1000);
303         } catch (InterruptedException e) {
304             LOG.trace("Interrupted while sleeping", e);
305         }
306     }
307
308 }