blob: a944ca6dc7a7798822f8c336aba4723a9cc68978 [file] [log] [blame]
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2014-present Open Networking Laboratory
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Brian O'Connorabafb502014-12-02 22:26:20 -080016package org.onosproject.net.intent;
Ray Milkeye6684082014-10-16 16:59:47 -070017
Jonathan Hart8ef6d3b2015-03-08 21:21:27 -070018import com.google.common.base.MoreObjects;
Andrey Komarov2398d962016-09-26 15:11:23 +030019import org.onlab.graph.Weight;
Sho SHIMIZU6d01d3d2015-05-08 14:08:36 -070020import org.onlab.util.Bandwidth;
Brian O'Connorabafb502014-12-02 22:26:20 -080021import org.onosproject.core.DefaultGroupId;
22import org.onosproject.core.GroupId;
23import org.onosproject.net.DeviceId;
24import org.onosproject.net.ElementId;
Thomas Vachuskadc91b552016-03-29 14:02:47 -070025import org.onosproject.net.HostId;
Brian O'Connorabafb502014-12-02 22:26:20 -080026import org.onosproject.net.Link;
Ray Milkey5a7787a2015-02-23 11:44:30 -080027import org.onosproject.net.NetTestTools;
Ray Milkey43a28222015-02-23 13:57:58 -080028import org.onosproject.net.NetworkResource;
Brian O'Connorabafb502014-12-02 22:26:20 -080029import org.onosproject.net.Path;
Yi Tseng2a81c9d2016-09-14 10:14:24 -070030import org.onosproject.net.device.DeviceServiceAdapter;
Brian O'Connorabafb502014-12-02 22:26:20 -080031import org.onosproject.net.flow.FlowId;
32import org.onosproject.net.flow.FlowRule;
jcc3d4e14a2015-04-21 11:32:05 +080033import org.onosproject.net.flow.FlowRuleExtPayLoad;
Brian O'Connorabafb502014-12-02 22:26:20 -080034import org.onosproject.net.flow.TrafficSelector;
35import org.onosproject.net.flow.TrafficTreatment;
36import org.onosproject.net.flow.criteria.Criterion;
37import org.onosproject.net.flow.criteria.Criterion.Type;
38import org.onosproject.net.flow.instructions.Instruction;
alshabib346b5b32015-03-06 00:42:16 -080039import org.onosproject.net.flow.instructions.Instructions;
Saurav Das86af8f12015-05-25 23:55:33 -070040import org.onosproject.net.flow.instructions.Instructions.MetadataInstruction;
Sho SHIMIZUe18cb122016-02-22 21:04:56 -080041import org.onosproject.net.resource.DiscreteResourceId;
42import org.onosproject.net.resource.Resource;
43import org.onosproject.net.resource.ResourceAllocation;
44import org.onosproject.net.resource.ResourceConsumer;
45import org.onosproject.net.resource.ResourceId;
46import org.onosproject.net.resource.ResourceListener;
47import org.onosproject.net.resource.ResourceService;
Brian O'Connorabafb502014-12-02 22:26:20 -080048import org.onosproject.net.topology.DefaultTopologyEdge;
49import org.onosproject.net.topology.DefaultTopologyVertex;
Andrey Komarov2398d962016-09-26 15:11:23 +030050import org.onosproject.net.topology.LinkWeigher;
Thomas Vachuska48e64e42015-09-22 15:32:55 -070051import org.onosproject.net.topology.PathServiceAdapter;
Brian O'Connorabafb502014-12-02 22:26:20 -080052import org.onosproject.net.topology.TopologyVertex;
Ray Milkey5a7787a2015-02-23 11:44:30 -080053import org.onosproject.store.Timestamp;
Ray Milkeye6684082014-10-16 16:59:47 -070054
Jonathan Hart8ef6d3b2015-03-08 21:21:27 -070055import java.util.Arrays;
56import java.util.Collection;
57import java.util.Collections;
58import java.util.HashSet;
Jonathan Hart8ef6d3b2015-03-08 21:21:27 -070059import java.util.List;
60import java.util.Objects;
Sho SHIMIZUb1681bd2016-02-22 12:47:50 -080061import java.util.Optional;
Jonathan Hart8ef6d3b2015-03-08 21:21:27 -070062import java.util.Set;
63import java.util.concurrent.atomic.AtomicLong;
64
Thomas Vachuska48e64e42015-09-22 15:32:55 -070065import static org.onosproject.net.NetTestTools.*;
Ray Milkey43a28222015-02-23 13:57:58 -080066
Ray Milkeye6684082014-10-16 16:59:47 -070067/**
68 * Common mocks used by the intent framework tests.
69 */
70public class IntentTestsMocks {
71 /**
72 * Mock traffic selector class used for satisfying API requirements.
73 */
74 public static class MockSelector implements TrafficSelector {
75 @Override
76 public Set<Criterion> criteria() {
77 return new HashSet<>();
78 }
Jonathan Hart936c49d2014-10-23 16:38:59 -070079
80 @Override
81 public Criterion getCriterion(Type type) {
82 return null;
83 }
Ray Milkeye6684082014-10-16 16:59:47 -070084 }
85
86 /**
87 * Mock traffic treatment class used for satisfying API requirements.
88 */
89 public static class MockTreatment implements TrafficTreatment {
90 @Override
alshabib346b5b32015-03-06 00:42:16 -080091 public List<Instruction> deferred() {
Jonathan Hart4a0ba562015-03-23 17:23:33 -070092 return Collections.emptyList();
alshabib346b5b32015-03-06 00:42:16 -080093 }
94
95 @Override
96 public List<Instruction> immediate() {
Jonathan Hart4a0ba562015-03-23 17:23:33 -070097 return Collections.emptyList();
alshabib346b5b32015-03-06 00:42:16 -080098 }
99
100 @Override
Jonathan Hart8ef6d3b2015-03-08 21:21:27 -0700101 public List<Instruction> allInstructions() {
Jonathan Hart4a0ba562015-03-23 17:23:33 -0700102 return Collections.emptyList();
Jonathan Hart8ef6d3b2015-03-08 21:21:27 -0700103 }
104
105 @Override
alshabib346b5b32015-03-06 00:42:16 -0800106 public Instructions.TableTypeTransition tableTransition() {
107 return null;
108 }
109
110 @Override
Jonathan Hart4a0ba562015-03-23 17:23:33 -0700111 public boolean clearedDeferred() {
112 return false;
alshabib346b5b32015-03-06 00:42:16 -0800113 }
Saurav Das86af8f12015-05-25 23:55:33 -0700114
115 @Override
116 public MetadataInstruction writeMetadata() {
117 return null;
118 }
alshabib10c810b2015-08-18 16:59:04 -0700119
120 @Override
121 public Instructions.MeterInstruction metered() {
122 return null;
123 }
Ray Milkeye6684082014-10-16 16:59:47 -0700124 }
125
126 /**
127 * Mock path service for creating paths within the test.
128 */
Thomas Vachuska48e64e42015-09-22 15:32:55 -0700129 public static class MockPathService extends PathServiceAdapter {
Ray Milkeye6684082014-10-16 16:59:47 -0700130
131 final String[] pathHops;
132 final String[] reversePathHops;
133
134 /**
135 * Constructor that provides a set of hops to mock.
136 *
137 * @param pathHops path hops to mock
138 */
139 public MockPathService(String[] pathHops) {
140 this.pathHops = pathHops;
141 String[] reversed = pathHops.clone();
142 Collections.reverse(Arrays.asList(reversed));
143 reversePathHops = reversed;
144 }
145
146 @Override
147 public Set<Path> getPaths(ElementId src, ElementId dst) {
148 Set<Path> result = new HashSet<>();
149
150 String[] allHops = new String[pathHops.length];
151
152 if (src.toString().endsWith(pathHops[0])) {
153 System.arraycopy(pathHops, 0, allHops, 0, pathHops.length);
154 } else {
155 System.arraycopy(reversePathHops, 0, allHops, 0, pathHops.length);
156 }
157
Thomas Vachuskadc91b552016-03-29 14:02:47 -0700158 result.add(createPath(src instanceof HostId, dst instanceof HostId, allHops));
Ray Milkeye6684082014-10-16 16:59:47 -0700159 return result;
160 }
161
162 @Override
Andrey Komarov2398d962016-09-26 15:11:23 +0300163 public Set<Path> getPaths(ElementId src, ElementId dst, LinkWeigher weigher) {
164 Set<Path> paths = getPaths(src, dst);
Ray Milkey8d3ce432014-11-07 16:21:10 -0800165
166 for (Path path : paths) {
Andrey Komarov2398d962016-09-26 15:11:23 +0300167 DeviceId srcDevice = path.src().elementId() instanceof DeviceId ? path.src().deviceId() : null;
168 DeviceId dstDevice = path.dst().elementId() instanceof DeviceId ? path.dst().deviceId() : null;
Thomas Vachuskadc91b552016-03-29 14:02:47 -0700169 if (srcDevice != null && dstDevice != null) {
Andrey Komarov2398d962016-09-26 15:11:23 +0300170 TopologyVertex srcVertex = new DefaultTopologyVertex(srcDevice);
171 TopologyVertex dstVertex = new DefaultTopologyVertex(dstDevice);
172 Link link = link(src.toString(), 1, dst.toString(), 1);
Ray Milkey8d3ce432014-11-07 16:21:10 -0800173
Andrey Komarov2398d962016-09-26 15:11:23 +0300174 Weight weightValue = weigher.weight(new DefaultTopologyEdge(srcVertex, dstVertex, link));
175 if (weightValue.isNegative()) {
Thomas Vachuskadc91b552016-03-29 14:02:47 -0700176 return new HashSet<>();
177 }
Ray Milkey8d3ce432014-11-07 16:21:10 -0800178 }
179 }
180 return paths;
Ray Milkeye6684082014-10-16 16:59:47 -0700181 }
182 }
Ray Milkey8d3ce432014-11-07 16:21:10 -0800183
Yi Tseng2a81c9d2016-09-14 10:14:24 -0700184 /**
185 * Mock path service for creating paths within the test.
186 *
187 */
188 public static class Mp2MpMockPathService
189 extends PathServiceAdapter {
190
191 final String[] pathHops;
192 final String[] reversePathHops;
193
194 /**
195 * Constructor that provides a set of hops to mock.
196 *
197 * @param pathHops path hops to mock
198 */
199 public Mp2MpMockPathService(String[] pathHops) {
200 this.pathHops = pathHops;
201 String[] reversed = pathHops.clone();
202 Collections.reverse(Arrays.asList(reversed));
203 reversePathHops = reversed;
204 }
205
206 @Override
207 public Set<Path> getPaths(ElementId src, ElementId dst) {
208 Set<Path> result = new HashSet<>();
209
210 String[] allHops = new String[pathHops.length + 2];
211 allHops[0] = src.toString();
212 allHops[allHops.length - 1] = dst.toString();
213
214 if (pathHops.length != 0) {
215 System.arraycopy(pathHops, 0, allHops, 1, pathHops.length);
216 }
217
218 result.add(createPath(allHops));
219
220 return result;
221 }
222
223 @Override
Andrey Komarov2398d962016-09-26 15:11:23 +0300224 public Set<Path> getPaths(ElementId src, ElementId dst, LinkWeigher weigher) {
Yi Tseng2a81c9d2016-09-14 10:14:24 -0700225 final Set<Path> paths = getPaths(src, dst);
226
227 for (Path path : paths) {
228 final DeviceId srcDevice = path.src().elementId() instanceof DeviceId ? path.src().deviceId() : null;
229 final DeviceId dstDevice = path.dst().elementId() instanceof DeviceId ? path.dst().deviceId() : null;
230 if (srcDevice != null && dstDevice != null) {
231 final TopologyVertex srcVertex = new DefaultTopologyVertex(srcDevice);
232 final TopologyVertex dstVertex = new DefaultTopologyVertex(dstDevice);
233 final Link link = link(src.toString(), 1, dst.toString(), 1);
234
Andrey Komarov2398d962016-09-26 15:11:23 +0300235 final Weight weightValue = weigher.weight(new DefaultTopologyEdge(srcVertex, dstVertex, link));
236 if (weightValue.isNegative()) {
Yi Tseng2a81c9d2016-09-14 10:14:24 -0700237 return new HashSet<>();
238 }
239 }
240 }
241 return paths;
242 }
243 }
244
Sho SHIMIZUb1681bd2016-02-22 12:47:50 -0800245 public static final class MockResourceService implements ResourceService {
246
247 private final double bandwidth;
248
249 public static ResourceService makeBandwidthResourceService(double bandwidth) {
250 return new MockResourceService(bandwidth);
251 }
252
253 private MockResourceService(double bandwidth) {
254 this.bandwidth = bandwidth;
Ray Milkey8d3ce432014-11-07 16:21:10 -0800255 }
256
HIGUCHI Yutaca9cc8e2015-10-29 23:26:51 -0700257 @Override
Sho SHIMIZUef835c92016-08-08 13:51:17 -0700258 public List<ResourceAllocation> allocate(ResourceConsumer consumer, List<? extends Resource> resources) {
Ray Milkey8d3ce432014-11-07 16:21:10 -0800259 return null;
260 }
261
HIGUCHI Yutaca9cc8e2015-10-29 23:26:51 -0700262 @Override
Sho SHIMIZUb1681bd2016-02-22 12:47:50 -0800263 public boolean release(List<ResourceAllocation> allocations) {
264 return false;
265 }
266
267 @Override
268 public boolean release(ResourceConsumer consumer) {
269 return false;
270 }
271
272 @Override
273 public List<ResourceAllocation> getResourceAllocations(ResourceId id) {
Ray Milkey8d3ce432014-11-07 16:21:10 -0800274 return null;
275 }
276
HIGUCHI Yutaca9cc8e2015-10-29 23:26:51 -0700277 @Override
Sho SHIMIZUb1681bd2016-02-22 12:47:50 -0800278 public <T> Collection<ResourceAllocation> getResourceAllocations(DiscreteResourceId parent, Class<T> cls) {
Ray Milkey8d3ce432014-11-07 16:21:10 -0800279 return null;
280 }
281
282 @Override
Sho SHIMIZUb1681bd2016-02-22 12:47:50 -0800283 public Collection<ResourceAllocation> getResourceAllocations(ResourceConsumer consumer) {
Ray Milkey8d3ce432014-11-07 16:21:10 -0800284 return null;
285 }
Ray Milkey8d3ce432014-11-07 16:21:10 -0800286
Ray Milkey8d3ce432014-11-07 16:21:10 -0800287 @Override
Sho SHIMIZUb1681bd2016-02-22 12:47:50 -0800288 public Set<Resource> getAvailableResources(DiscreteResourceId parent) {
289 return null;
290 }
Ray Milkey8d3ce432014-11-07 16:21:10 -0800291
Sho SHIMIZUb1681bd2016-02-22 12:47:50 -0800292 @Override
293 public <T> Set<Resource> getAvailableResources(DiscreteResourceId parent, Class<T> cls) {
294 return null;
295 }
296
297 @Override
298 public <T> Set<T> getAvailableResourceValues(DiscreteResourceId parent, Class<T> cls) {
299 return null;
300 }
301
302 @Override
303 public Set<Resource> getRegisteredResources(DiscreteResourceId parent) {
304 return null;
305 }
306
307 @Override
308 public boolean isAvailable(Resource resource) {
309 if (!resource.isTypeOf(Bandwidth.class)) {
310 return false;
Ray Milkey8d3ce432014-11-07 16:21:10 -0800311 }
312
Sho SHIMIZUb1681bd2016-02-22 12:47:50 -0800313 Optional<Double> value = resource.valueAs(Double.class);
314 return value.filter(requested -> requested <= bandwidth).isPresent();
Ray Milkey8d3ce432014-11-07 16:21:10 -0800315 }
316
317 @Override
Sho SHIMIZUb1681bd2016-02-22 12:47:50 -0800318 public void addListener(ResourceListener listener) {
Ray Milkey8d3ce432014-11-07 16:21:10 -0800319 }
320
321 @Override
Sho SHIMIZUb1681bd2016-02-22 12:47:50 -0800322 public void removeListener(ResourceListener listener) {
Ray Milkeye97ede92014-11-20 10:43:12 -0800323 }
Ray Milkey8d3ce432014-11-07 16:21:10 -0800324 }
325
Ray Milkey930fc662014-11-11 16:07:45 -0800326 private static final IntentTestsMocks.MockSelector SELECTOR =
327 new IntentTestsMocks.MockSelector();
328 private static final IntentTestsMocks.MockTreatment TREATMENT =
329 new IntentTestsMocks.MockTreatment();
330
331 public static class MockFlowRule implements FlowRule {
Ray Milkey77a455f2015-03-27 10:08:17 -0700332 static int nextId = 0;
Ray Milkey930fc662014-11-11 16:07:45 -0800333
334 int priority;
alshabib08d98982015-04-21 16:25:50 -0700335 int tableId;
Ray Milkey77a455f2015-03-27 10:08:17 -0700336 long timestamp;
337 int id;
jcc3d4e14a2015-04-21 11:32:05 +0800338 FlowRuleExtPayLoad payLoad;
sangho11c30ac2015-01-22 14:30:55 -0800339
Ray Milkey930fc662014-11-11 16:07:45 -0800340 public MockFlowRule(int priority) {
341 this.priority = priority;
alshabib08d98982015-04-21 16:25:50 -0700342 this.tableId = 0;
Ray Milkey77a455f2015-03-27 10:08:17 -0700343 this.timestamp = System.currentTimeMillis();
344 this.id = nextId++;
jcc3d4e14a2015-04-21 11:32:05 +0800345 this.payLoad = null;
346 }
347
348 public MockFlowRule(int priority, FlowRuleExtPayLoad payLoad) {
349 this.priority = priority;
350 this.timestamp = System.currentTimeMillis();
351 this.id = nextId++;
352 this.payLoad = payLoad;
Ray Milkey930fc662014-11-11 16:07:45 -0800353 }
354
355 @Override
356 public FlowId id() {
Ray Milkey77a455f2015-03-27 10:08:17 -0700357 return FlowId.valueOf(id);
Ray Milkey930fc662014-11-11 16:07:45 -0800358 }
359
360 @Override
361 public short appId() {
362 return 0;
363 }
364
365 @Override
Sho SHIMIZU75a5bd92014-11-25 11:22:56 -0800366 public GroupId groupId() {
367 return new DefaultGroupId(0);
alshabib28204e52014-11-12 18:29:45 -0800368 }
369
370 @Override
Ray Milkey930fc662014-11-11 16:07:45 -0800371 public int priority() {
372 return priority;
373 }
374
375 @Override
376 public DeviceId deviceId() {
377 return did("1");
378 }
379
380 @Override
381 public TrafficSelector selector() {
382 return SELECTOR;
383 }
384
385 @Override
386 public TrafficTreatment treatment() {
387 return TREATMENT;
388 }
389
390 @Override
391 public int timeout() {
392 return 0;
393 }
394
395 @Override
Murat Parlakisikc6759e82016-06-29 03:22:22 -0700396 public int hardTimeout() {
397 return 0;
398 }
399
400 @Override
401 public FlowRemoveReason reason() {
402 return FlowRemoveReason.NO_REASON;
403 }
404
405 @Override
Ray Milkey930fc662014-11-11 16:07:45 -0800406 public boolean isPermanent() {
407 return false;
408 }
409
Brian O'Connor427a1762014-11-19 18:40:32 -0800410 @Override
411 public int hashCode() {
HIGUCHI Yutaca9cc8e2015-10-29 23:26:51 -0700412 return priority;
Brian O'Connor427a1762014-11-19 18:40:32 -0800413 }
Ray Milkey930fc662014-11-11 16:07:45 -0800414
Brian O'Connor427a1762014-11-19 18:40:32 -0800415 @Override
416 public boolean equals(Object obj) {
417 if (this == obj) {
418 return true;
419 }
420 if (obj == null || getClass() != obj.getClass()) {
421 return false;
422 }
423 final MockFlowRule other = (MockFlowRule) obj;
Ray Milkey77a455f2015-03-27 10:08:17 -0700424 return Objects.equals(this.timestamp, other.timestamp) &&
Nikhil Cheerla2ec191f2015-07-09 12:34:54 -0700425 this.id == other.id;
Brian O'Connor427a1762014-11-19 18:40:32 -0800426 }
sangho11c30ac2015-01-22 14:30:55 -0800427
428 @Override
Jonathan Hartf44e42c2015-08-04 09:58:46 -0700429 public boolean exactMatch(FlowRule rule) {
430 return this.equals(rule);
431 }
432
433 @Override
alshabibdb774072015-04-20 13:13:51 -0700434 public int tableId() {
alshabib08d98982015-04-21 16:25:50 -0700435 return tableId;
alshabibdb774072015-04-20 13:13:51 -0700436 }
jcc3d4e14a2015-04-21 11:32:05 +0800437
438 @Override
439 public FlowRuleExtPayLoad payLoad() {
440 return payLoad;
441 }
Ray Milkey930fc662014-11-11 16:07:45 -0800442 }
443
Ray Milkey5a7787a2015-02-23 11:44:30 -0800444 public static class MockIntent extends Intent {
445 private static AtomicLong counter = new AtomicLong(0);
446
447 private final Long number;
448
449 public MockIntent(Long number) {
Ray Milkeyebc5d222015-03-18 15:45:36 -0700450 super(NetTestTools.APP_ID, null, Collections.emptyList(),
Nikhil Cheerla2ec191f2015-07-09 12:34:54 -0700451 Intent.DEFAULT_INTENT_PRIORITY);
Ray Milkey5a7787a2015-02-23 11:44:30 -0800452 this.number = number;
453 }
454
Ray Milkey43a28222015-02-23 13:57:58 -0800455 public MockIntent(Long number, Collection<NetworkResource> resources) {
Ray Milkeyebc5d222015-03-18 15:45:36 -0700456 super(NetTestTools.APP_ID, null, resources, Intent.DEFAULT_INTENT_PRIORITY);
Ray Milkey43a28222015-02-23 13:57:58 -0800457 this.number = number;
458 }
459
Ray Milkey5a7787a2015-02-23 11:44:30 -0800460 public Long number() {
461 return number;
462 }
463
464 public static Long nextId() {
465 return counter.getAndIncrement();
466 }
Ray Milkey43a28222015-02-23 13:57:58 -0800467
468 @Override
469 public String toString() {
470 return MoreObjects.toStringHelper(getClass())
471 .add("id", id())
472 .add("appId", appId())
473 .toString();
474 }
Ray Milkey5a7787a2015-02-23 11:44:30 -0800475 }
476
477 public static class MockTimestamp implements Timestamp {
478 final int value;
479
480 public MockTimestamp(int value) {
481 this.value = value;
482 }
483
484 @Override
485 public int compareTo(Timestamp o) {
486 if (!(o instanceof MockTimestamp)) {
487 return -1;
488 }
489 MockTimestamp that = (MockTimestamp) o;
Jonathan Hart72175c22015-03-24 18:55:58 -0700490 return this.value - that.value;
Ray Milkey5a7787a2015-02-23 11:44:30 -0800491 }
492 }
493
Yi Tseng2a81c9d2016-09-14 10:14:24 -0700494 /**
495 * Mocks the device service so that a device appears available in the test.
496 */
497 public static class MockDeviceService extends DeviceServiceAdapter {
498 @Override
499 public boolean isAvailable(DeviceId deviceId) {
500 return true;
501 }
502 }
503
Ray Milkeye6684082014-10-16 16:59:47 -0700504}