blob: 8d305511707b7bd2e11be2f3c1afd868bd6de92f [file] [log] [blame]
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07001/*
Ray Milkey34c95902015-04-15 09:47:53 -07002 * Copyright 2014-2015 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;
19import com.google.common.collect.ImmutableSet;
jcc3d4e14a2015-04-21 11:32:05 +080020
Sho SHIMIZU6d01d3d2015-05-08 14:08:36 -070021import org.onlab.util.Bandwidth;
Brian O'Connorabafb502014-12-02 22:26:20 -080022import org.onosproject.core.DefaultGroupId;
23import org.onosproject.core.GroupId;
24import org.onosproject.net.DeviceId;
Nikhil Cheerla2ec191f2015-07-09 12:34:54 -070025import org.onosproject.net.DisjointPath;
Brian O'Connorabafb502014-12-02 22:26:20 -080026import org.onosproject.net.ElementId;
27import org.onosproject.net.Link;
Ray Milkey5a7787a2015-02-23 11:44:30 -080028import org.onosproject.net.NetTestTools;
Ray Milkey43a28222015-02-23 13:57:58 -080029import org.onosproject.net.NetworkResource;
Brian O'Connorabafb502014-12-02 22:26:20 -080030import org.onosproject.net.Path;
31import 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;
Brian O'Connor6de2e202015-05-21 14:30:41 -070041import org.onosproject.net.resource.link.BandwidthResource;
42import org.onosproject.net.resource.link.BandwidthResourceRequest;
43import org.onosproject.net.resource.link.LambdaResource;
44import org.onosproject.net.resource.link.LambdaResourceAllocation;
45import org.onosproject.net.resource.link.LambdaResourceRequest;
46import org.onosproject.net.resource.link.LinkResourceAllocations;
47import org.onosproject.net.resource.link.LinkResourceListener;
48import org.onosproject.net.resource.link.LinkResourceRequest;
49import org.onosproject.net.resource.link.LinkResourceService;
50import org.onosproject.net.resource.link.MplsLabel;
51import org.onosproject.net.resource.link.MplsLabelResourceAllocation;
Brian O'Connorabafb502014-12-02 22:26:20 -080052import org.onosproject.net.resource.ResourceAllocation;
53import org.onosproject.net.resource.ResourceRequest;
54import org.onosproject.net.resource.ResourceType;
55import org.onosproject.net.topology.DefaultTopologyEdge;
56import org.onosproject.net.topology.DefaultTopologyVertex;
57import org.onosproject.net.topology.LinkWeight;
58import org.onosproject.net.topology.PathService;
59import org.onosproject.net.topology.TopologyVertex;
Ray Milkey5a7787a2015-02-23 11:44:30 -080060import org.onosproject.store.Timestamp;
Ray Milkeye6684082014-10-16 16:59:47 -070061
Jonathan Hart8ef6d3b2015-03-08 21:21:27 -070062import java.util.Arrays;
63import java.util.Collection;
64import java.util.Collections;
65import java.util.HashSet;
66import java.util.LinkedList;
67import java.util.List;
Nikhil Cheerla2ec191f2015-07-09 12:34:54 -070068import java.util.Map;
Jonathan Hart8ef6d3b2015-03-08 21:21:27 -070069import java.util.Objects;
70import java.util.Set;
71import java.util.concurrent.atomic.AtomicLong;
72
73import static org.onosproject.net.NetTestTools.createPath;
74import static org.onosproject.net.NetTestTools.did;
75import static org.onosproject.net.NetTestTools.link;
Ray Milkey43a28222015-02-23 13:57:58 -080076
Ray Milkeye6684082014-10-16 16:59:47 -070077/**
78 * Common mocks used by the intent framework tests.
79 */
80public class IntentTestsMocks {
81 /**
82 * Mock traffic selector class used for satisfying API requirements.
83 */
84 public static class MockSelector implements TrafficSelector {
85 @Override
86 public Set<Criterion> criteria() {
87 return new HashSet<>();
88 }
Jonathan Hart936c49d2014-10-23 16:38:59 -070089
90 @Override
91 public Criterion getCriterion(Type type) {
92 return null;
93 }
Ray Milkeye6684082014-10-16 16:59:47 -070094 }
95
96 /**
97 * Mock traffic treatment class used for satisfying API requirements.
98 */
99 public static class MockTreatment implements TrafficTreatment {
100 @Override
alshabib346b5b32015-03-06 00:42:16 -0800101 public List<Instruction> deferred() {
Jonathan Hart4a0ba562015-03-23 17:23:33 -0700102 return Collections.emptyList();
alshabib346b5b32015-03-06 00:42:16 -0800103 }
104
105 @Override
106 public List<Instruction> immediate() {
Jonathan Hart4a0ba562015-03-23 17:23:33 -0700107 return Collections.emptyList();
alshabib346b5b32015-03-06 00:42:16 -0800108 }
109
110 @Override
Jonathan Hart8ef6d3b2015-03-08 21:21:27 -0700111 public List<Instruction> allInstructions() {
Jonathan Hart4a0ba562015-03-23 17:23:33 -0700112 return Collections.emptyList();
Jonathan Hart8ef6d3b2015-03-08 21:21:27 -0700113 }
114
115 @Override
alshabib346b5b32015-03-06 00:42:16 -0800116 public Instructions.TableTypeTransition tableTransition() {
117 return null;
118 }
119
120 @Override
Jonathan Hart4a0ba562015-03-23 17:23:33 -0700121 public boolean clearedDeferred() {
122 return false;
alshabib346b5b32015-03-06 00:42:16 -0800123 }
Saurav Das86af8f12015-05-25 23:55:33 -0700124
125 @Override
126 public MetadataInstruction writeMetadata() {
127 return null;
128 }
alshabib10c810b2015-08-18 16:59:04 -0700129
130 @Override
131 public Instructions.MeterInstruction metered() {
132 return null;
133 }
Ray Milkeye6684082014-10-16 16:59:47 -0700134 }
135
136 /**
137 * Mock path service for creating paths within the test.
138 */
139 public static class MockPathService implements PathService {
140
141 final String[] pathHops;
142 final String[] reversePathHops;
143
144 /**
145 * Constructor that provides a set of hops to mock.
146 *
147 * @param pathHops path hops to mock
148 */
149 public MockPathService(String[] pathHops) {
150 this.pathHops = pathHops;
151 String[] reversed = pathHops.clone();
152 Collections.reverse(Arrays.asList(reversed));
153 reversePathHops = reversed;
154 }
155
156 @Override
157 public Set<Path> getPaths(ElementId src, ElementId dst) {
158 Set<Path> result = new HashSet<>();
159
160 String[] allHops = new String[pathHops.length];
161
162 if (src.toString().endsWith(pathHops[0])) {
163 System.arraycopy(pathHops, 0, allHops, 0, pathHops.length);
164 } else {
165 System.arraycopy(reversePathHops, 0, allHops, 0, pathHops.length);
166 }
167
168 result.add(createPath(allHops));
169 return result;
170 }
171
172 @Override
173 public Set<Path> getPaths(ElementId src, ElementId dst, LinkWeight weight) {
Ray Milkey8d3ce432014-11-07 16:21:10 -0800174 final Set<Path> paths = getPaths(src, dst);
175
176 for (Path path : paths) {
177 final DeviceId srcDevice = path.src().deviceId();
178 final DeviceId dstDevice = path.dst().deviceId();
179 final TopologyVertex srcVertex = new DefaultTopologyVertex(srcDevice);
180 final TopologyVertex dstVertex = new DefaultTopologyVertex(dstDevice);
181 final Link link = link(src.toString(), 1, dst.toString(), 1);
182
183 final double weightValue = weight.weight(new DefaultTopologyEdge(srcVertex, dstVertex, link));
184 if (weightValue < 0) {
185 return new HashSet<>();
186 }
187 }
188 return paths;
Ray Milkeye6684082014-10-16 16:59:47 -0700189 }
Nikhil Cheerla2ec191f2015-07-09 12:34:54 -0700190
191 @Override
192 public Set<DisjointPath> getDisjointPaths(ElementId src, ElementId dst) {
193 return null;
194 }
195
196 @Override
197 public Set<DisjointPath> getDisjointPaths(ElementId src, ElementId dst, LinkWeight weight) {
198 return null;
199 }
200
201 @Override
202 public Set<DisjointPath> getSRLGDisjointPaths(ElementId src, ElementId dst,
203 Map<Link, Object> riskProfile) {
204 return null;
205 }
206
207 @Override
208 public Set<DisjointPath> getSRLGDisjointPaths(ElementId src, ElementId dst, LinkWeight weight,
209 Map<Link, Object> riskProfile) {
210 return null;
211 }
Ray Milkeye6684082014-10-16 16:59:47 -0700212 }
Ray Milkey8d3ce432014-11-07 16:21:10 -0800213
214 public static class MockLinkResourceAllocations implements LinkResourceAllocations {
215 @Override
216 public Set<ResourceAllocation> getResourceAllocation(Link link) {
Ray Milkeyb1b66d32015-03-02 10:27:11 -0800217 return ImmutableSet.of(
Sho SHIMIZU94b7ff42015-05-06 17:51:49 -0700218 new LambdaResourceAllocation(LambdaResource.valueOf(77)),
Ray Milkeyb1b66d32015-03-02 10:27:11 -0800219 new MplsLabelResourceAllocation(MplsLabel.valueOf(10)));
Ray Milkey8d3ce432014-11-07 16:21:10 -0800220 }
221
Ayaka Koshibee114f042015-05-01 11:43:00 -0700222 public IntentId intentId() {
Ray Milkey8d3ce432014-11-07 16:21:10 -0800223 return null;
224 }
225
Ray Milkey8d3ce432014-11-07 16:21:10 -0800226 public Collection<Link> links() {
227 return null;
228 }
229
Ray Milkey8d3ce432014-11-07 16:21:10 -0800230 public Set<ResourceRequest> resources() {
231 return null;
232 }
233
234 @Override
235 public ResourceType type() {
236 return null;
237 }
238 }
239
240 public static class MockedAllocationFailure extends RuntimeException { }
241
242 public static class MockResourceService implements LinkResourceService {
243
244 double availableBandwidth = -1.0;
245 int availableLambda = -1;
246
247 /**
248 * Allocates a resource service that will allow bandwidth allocations
249 * up to a limit.
250 *
251 * @param bandwidth available bandwidth limit
252 * @return resource manager for bandwidth requests
253 */
254 public static MockResourceService makeBandwidthResourceService(double bandwidth) {
255 final MockResourceService result = new MockResourceService();
256 result.availableBandwidth = bandwidth;
257 return result;
258 }
259
260 /**
261 * Allocates a resource service that will allow lambda allocations.
262 *
263 * @param lambda Lambda to return for allocation requests. Currently unused
264 * @return resource manager for lambda requests
265 */
266 public static MockResourceService makeLambdaResourceService(int lambda) {
267 final MockResourceService result = new MockResourceService();
268 result.availableLambda = lambda;
269 return result;
270 }
271
272 public void setAvailableBandwidth(double availableBandwidth) {
273 this.availableBandwidth = availableBandwidth;
274 }
275
276 public void setAvailableLambda(int availableLambda) {
277 this.availableLambda = availableLambda;
278 }
279
280
281 @Override
282 public LinkResourceAllocations requestResources(LinkResourceRequest req) {
283 int lambda = -1;
284 double bandwidth = -1.0;
285
286 for (ResourceRequest resourceRequest : req.resources()) {
287 if (resourceRequest.type() == ResourceType.BANDWIDTH) {
288 final BandwidthResourceRequest brr = (BandwidthResourceRequest) resourceRequest;
289 bandwidth = brr.bandwidth().toDouble();
290 } else if (resourceRequest.type() == ResourceType.LAMBDA) {
291 lambda = 1;
292 }
293 }
294
295 if (availableBandwidth < bandwidth) {
296 throw new MockedAllocationFailure();
297 }
298 if (lambda > 0 && availableLambda == 0) {
299 throw new MockedAllocationFailure();
300 }
301
302 return new IntentTestsMocks.MockLinkResourceAllocations();
303 }
304
305 @Override
306 public void releaseResources(LinkResourceAllocations allocations) {
307 // Mock
308 }
309
310 @Override
311 public LinkResourceAllocations updateResources(LinkResourceRequest req,
312 LinkResourceAllocations oldAllocations) {
313 return null;
314 }
315
316 @Override
317 public Iterable<LinkResourceAllocations> getAllocations() {
Ray Milkeybb320482015-02-25 15:16:46 -0800318 return ImmutableSet.of(
319 new IntentTestsMocks.MockLinkResourceAllocations());
Ray Milkey8d3ce432014-11-07 16:21:10 -0800320 }
321
322 @Override
323 public Iterable<LinkResourceAllocations> getAllocations(Link link) {
Ray Milkeybb320482015-02-25 15:16:46 -0800324 return ImmutableSet.of(
325 new IntentTestsMocks.MockLinkResourceAllocations());
Ray Milkey8d3ce432014-11-07 16:21:10 -0800326 }
327
328 @Override
329 public LinkResourceAllocations getAllocations(IntentId intentId) {
Ray Milkeybb320482015-02-25 15:16:46 -0800330 return new IntentTestsMocks.MockLinkResourceAllocations();
Ray Milkey8d3ce432014-11-07 16:21:10 -0800331 }
332
333 @Override
334 public Iterable<ResourceRequest> getAvailableResources(Link link) {
335 final List<ResourceRequest> result = new LinkedList<>();
336 if (availableBandwidth > 0.0) {
Ray Milkeycf590df2015-02-23 17:43:24 -0800337 result.add(new BandwidthResourceRequest(
Sho SHIMIZU6d01d3d2015-05-08 14:08:36 -0700338 new BandwidthResource(Bandwidth.bps(availableBandwidth))));
Ray Milkey8d3ce432014-11-07 16:21:10 -0800339 }
340 if (availableLambda > 0) {
341 result.add(new LambdaResourceRequest());
342 }
343 return result;
344 }
345
346 @Override
weibit00c94f52014-11-16 07:09:05 -0800347 public Iterable<ResourceRequest> getAvailableResources(Link link, LinkResourceAllocations allocations) {
Ray Milkey8d3ce432014-11-07 16:21:10 -0800348 return null;
349 }
Ray Milkeye97ede92014-11-20 10:43:12 -0800350
351 @Override
352 public void addListener(LinkResourceListener listener) {
353
354 }
355
356 @Override
357 public void removeListener(LinkResourceListener listener) {
358
359 }
Ray Milkey8d3ce432014-11-07 16:21:10 -0800360 }
361
Ray Milkey930fc662014-11-11 16:07:45 -0800362 private static final IntentTestsMocks.MockSelector SELECTOR =
363 new IntentTestsMocks.MockSelector();
364 private static final IntentTestsMocks.MockTreatment TREATMENT =
365 new IntentTestsMocks.MockTreatment();
366
367 public static class MockFlowRule implements FlowRule {
Ray Milkey77a455f2015-03-27 10:08:17 -0700368 static int nextId = 0;
Ray Milkey930fc662014-11-11 16:07:45 -0800369
370 int priority;
alshabib08d98982015-04-21 16:25:50 -0700371 int tableId;
Ray Milkey77a455f2015-03-27 10:08:17 -0700372 long timestamp;
373 int id;
jcc3d4e14a2015-04-21 11:32:05 +0800374 FlowRuleExtPayLoad payLoad;
sangho11c30ac2015-01-22 14:30:55 -0800375
Ray Milkey930fc662014-11-11 16:07:45 -0800376 public MockFlowRule(int priority) {
377 this.priority = priority;
alshabib08d98982015-04-21 16:25:50 -0700378 this.tableId = 0;
Ray Milkey77a455f2015-03-27 10:08:17 -0700379 this.timestamp = System.currentTimeMillis();
380 this.id = nextId++;
jcc3d4e14a2015-04-21 11:32:05 +0800381 this.payLoad = null;
382 }
383
384 public MockFlowRule(int priority, FlowRuleExtPayLoad payLoad) {
385 this.priority = priority;
386 this.timestamp = System.currentTimeMillis();
387 this.id = nextId++;
388 this.payLoad = payLoad;
Ray Milkey930fc662014-11-11 16:07:45 -0800389 }
390
391 @Override
392 public FlowId id() {
Ray Milkey77a455f2015-03-27 10:08:17 -0700393 return FlowId.valueOf(id);
Ray Milkey930fc662014-11-11 16:07:45 -0800394 }
395
396 @Override
397 public short appId() {
398 return 0;
399 }
400
401 @Override
Sho SHIMIZU75a5bd92014-11-25 11:22:56 -0800402 public GroupId groupId() {
403 return new DefaultGroupId(0);
alshabib28204e52014-11-12 18:29:45 -0800404 }
405
406 @Override
Ray Milkey930fc662014-11-11 16:07:45 -0800407 public int priority() {
408 return priority;
409 }
410
411 @Override
412 public DeviceId deviceId() {
413 return did("1");
414 }
415
416 @Override
417 public TrafficSelector selector() {
418 return SELECTOR;
419 }
420
421 @Override
422 public TrafficTreatment treatment() {
423 return TREATMENT;
424 }
425
426 @Override
427 public int timeout() {
428 return 0;
429 }
430
431 @Override
432 public boolean isPermanent() {
433 return false;
434 }
435
Brian O'Connor427a1762014-11-19 18:40:32 -0800436 @Override
437 public int hashCode() {
438 return Objects.hash(priority);
439 }
Ray Milkey930fc662014-11-11 16:07:45 -0800440
Brian O'Connor427a1762014-11-19 18:40:32 -0800441 @Override
442 public boolean equals(Object obj) {
443 if (this == obj) {
444 return true;
445 }
446 if (obj == null || getClass() != obj.getClass()) {
447 return false;
448 }
449 final MockFlowRule other = (MockFlowRule) obj;
Ray Milkey77a455f2015-03-27 10:08:17 -0700450 return Objects.equals(this.timestamp, other.timestamp) &&
Nikhil Cheerla2ec191f2015-07-09 12:34:54 -0700451 this.id == other.id;
Brian O'Connor427a1762014-11-19 18:40:32 -0800452 }
sangho11c30ac2015-01-22 14:30:55 -0800453
454 @Override
Jonathan Hartf44e42c2015-08-04 09:58:46 -0700455 public boolean exactMatch(FlowRule rule) {
456 return this.equals(rule);
457 }
458
459 @Override
alshabibdb774072015-04-20 13:13:51 -0700460 public int tableId() {
alshabib08d98982015-04-21 16:25:50 -0700461 return tableId;
alshabibdb774072015-04-20 13:13:51 -0700462 }
jcc3d4e14a2015-04-21 11:32:05 +0800463
464 @Override
465 public FlowRuleExtPayLoad payLoad() {
466 return payLoad;
467 }
Ray Milkey930fc662014-11-11 16:07:45 -0800468 }
469
Ray Milkey5a7787a2015-02-23 11:44:30 -0800470 public static class MockIntent extends Intent {
471 private static AtomicLong counter = new AtomicLong(0);
472
473 private final Long number;
474
475 public MockIntent(Long number) {
Ray Milkeyebc5d222015-03-18 15:45:36 -0700476 super(NetTestTools.APP_ID, null, Collections.emptyList(),
Nikhil Cheerla2ec191f2015-07-09 12:34:54 -0700477 Intent.DEFAULT_INTENT_PRIORITY);
Ray Milkey5a7787a2015-02-23 11:44:30 -0800478 this.number = number;
479 }
480
Ray Milkey43a28222015-02-23 13:57:58 -0800481 public MockIntent(Long number, Collection<NetworkResource> resources) {
Ray Milkeyebc5d222015-03-18 15:45:36 -0700482 super(NetTestTools.APP_ID, null, resources, Intent.DEFAULT_INTENT_PRIORITY);
Ray Milkey43a28222015-02-23 13:57:58 -0800483 this.number = number;
484 }
485
Ray Milkey5a7787a2015-02-23 11:44:30 -0800486 public Long number() {
487 return number;
488 }
489
490 public static Long nextId() {
491 return counter.getAndIncrement();
492 }
Ray Milkey43a28222015-02-23 13:57:58 -0800493
494 @Override
495 public String toString() {
496 return MoreObjects.toStringHelper(getClass())
497 .add("id", id())
498 .add("appId", appId())
499 .toString();
500 }
Ray Milkey5a7787a2015-02-23 11:44:30 -0800501 }
502
503 public static class MockTimestamp implements Timestamp {
504 final int value;
505
506 public MockTimestamp(int value) {
507 this.value = value;
508 }
509
510 @Override
511 public int compareTo(Timestamp o) {
512 if (!(o instanceof MockTimestamp)) {
513 return -1;
514 }
515 MockTimestamp that = (MockTimestamp) o;
Jonathan Hart72175c22015-03-24 18:55:58 -0700516 return this.value - that.value;
Ray Milkey5a7787a2015-02-23 11:44:30 -0800517 }
518 }
519
Ray Milkeye6684082014-10-16 16:59:47 -0700520}