blob: 550406fedb85706a4ea619e8a75ea7ce3d63b491 [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;
25import org.onosproject.net.ElementId;
26import 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;
30import org.onosproject.net.flow.FlowId;
31import org.onosproject.net.flow.FlowRule;
jcc3d4e14a2015-04-21 11:32:05 +080032import org.onosproject.net.flow.FlowRuleExtPayLoad;
Brian O'Connorabafb502014-12-02 22:26:20 -080033import org.onosproject.net.flow.TrafficSelector;
34import org.onosproject.net.flow.TrafficTreatment;
35import org.onosproject.net.flow.criteria.Criterion;
36import org.onosproject.net.flow.criteria.Criterion.Type;
37import org.onosproject.net.flow.instructions.Instruction;
alshabib346b5b32015-03-06 00:42:16 -080038import org.onosproject.net.flow.instructions.Instructions;
Saurav Das86af8f12015-05-25 23:55:33 -070039import org.onosproject.net.flow.instructions.Instructions.MetadataInstruction;
Brian O'Connor6de2e202015-05-21 14:30:41 -070040import org.onosproject.net.resource.link.BandwidthResource;
41import org.onosproject.net.resource.link.BandwidthResourceRequest;
42import org.onosproject.net.resource.link.LambdaResource;
43import org.onosproject.net.resource.link.LambdaResourceAllocation;
44import org.onosproject.net.resource.link.LambdaResourceRequest;
45import org.onosproject.net.resource.link.LinkResourceAllocations;
46import org.onosproject.net.resource.link.LinkResourceListener;
47import org.onosproject.net.resource.link.LinkResourceRequest;
48import org.onosproject.net.resource.link.LinkResourceService;
49import org.onosproject.net.resource.link.MplsLabel;
50import org.onosproject.net.resource.link.MplsLabelResourceAllocation;
Brian O'Connorabafb502014-12-02 22:26:20 -080051import org.onosproject.net.resource.ResourceAllocation;
52import org.onosproject.net.resource.ResourceRequest;
53import org.onosproject.net.resource.ResourceType;
54import org.onosproject.net.topology.DefaultTopologyEdge;
55import org.onosproject.net.topology.DefaultTopologyVertex;
56import org.onosproject.net.topology.LinkWeight;
57import org.onosproject.net.topology.PathService;
58import org.onosproject.net.topology.TopologyVertex;
Ray Milkey5a7787a2015-02-23 11:44:30 -080059import org.onosproject.store.Timestamp;
Ray Milkeye6684082014-10-16 16:59:47 -070060
Jonathan Hart8ef6d3b2015-03-08 21:21:27 -070061import java.util.Arrays;
62import java.util.Collection;
63import java.util.Collections;
64import java.util.HashSet;
65import java.util.LinkedList;
66import java.util.List;
67import java.util.Objects;
68import java.util.Set;
69import java.util.concurrent.atomic.AtomicLong;
70
71import static org.onosproject.net.NetTestTools.createPath;
72import static org.onosproject.net.NetTestTools.did;
73import static org.onosproject.net.NetTestTools.link;
Ray Milkey43a28222015-02-23 13:57:58 -080074
Ray Milkeye6684082014-10-16 16:59:47 -070075/**
76 * Common mocks used by the intent framework tests.
77 */
78public class IntentTestsMocks {
79 /**
80 * Mock traffic selector class used for satisfying API requirements.
81 */
82 public static class MockSelector implements TrafficSelector {
83 @Override
84 public Set<Criterion> criteria() {
85 return new HashSet<>();
86 }
Jonathan Hart936c49d2014-10-23 16:38:59 -070087
88 @Override
89 public Criterion getCriterion(Type type) {
90 return null;
91 }
Ray Milkeye6684082014-10-16 16:59:47 -070092 }
93
94 /**
95 * Mock traffic treatment class used for satisfying API requirements.
96 */
97 public static class MockTreatment implements TrafficTreatment {
98 @Override
alshabib346b5b32015-03-06 00:42:16 -080099 public List<Instruction> deferred() {
Jonathan Hart4a0ba562015-03-23 17:23:33 -0700100 return Collections.emptyList();
alshabib346b5b32015-03-06 00:42:16 -0800101 }
102
103 @Override
104 public List<Instruction> immediate() {
Jonathan Hart4a0ba562015-03-23 17:23:33 -0700105 return Collections.emptyList();
alshabib346b5b32015-03-06 00:42:16 -0800106 }
107
108 @Override
Jonathan Hart8ef6d3b2015-03-08 21:21:27 -0700109 public List<Instruction> allInstructions() {
Jonathan Hart4a0ba562015-03-23 17:23:33 -0700110 return Collections.emptyList();
Jonathan Hart8ef6d3b2015-03-08 21:21:27 -0700111 }
112
113 @Override
alshabib346b5b32015-03-06 00:42:16 -0800114 public Instructions.TableTypeTransition tableTransition() {
115 return null;
116 }
117
118 @Override
Jonathan Hart4a0ba562015-03-23 17:23:33 -0700119 public boolean clearedDeferred() {
120 return false;
alshabib346b5b32015-03-06 00:42:16 -0800121 }
Saurav Das86af8f12015-05-25 23:55:33 -0700122
123 @Override
124 public MetadataInstruction writeMetadata() {
125 return null;
126 }
Ray Milkeye6684082014-10-16 16:59:47 -0700127 }
128
129 /**
130 * Mock path service for creating paths within the test.
131 */
132 public static class MockPathService implements PathService {
133
134 final String[] pathHops;
135 final String[] reversePathHops;
136
137 /**
138 * Constructor that provides a set of hops to mock.
139 *
140 * @param pathHops path hops to mock
141 */
142 public MockPathService(String[] pathHops) {
143 this.pathHops = pathHops;
144 String[] reversed = pathHops.clone();
145 Collections.reverse(Arrays.asList(reversed));
146 reversePathHops = reversed;
147 }
148
149 @Override
150 public Set<Path> getPaths(ElementId src, ElementId dst) {
151 Set<Path> result = new HashSet<>();
152
153 String[] allHops = new String[pathHops.length];
154
155 if (src.toString().endsWith(pathHops[0])) {
156 System.arraycopy(pathHops, 0, allHops, 0, pathHops.length);
157 } else {
158 System.arraycopy(reversePathHops, 0, allHops, 0, pathHops.length);
159 }
160
161 result.add(createPath(allHops));
162 return result;
163 }
164
165 @Override
166 public Set<Path> getPaths(ElementId src, ElementId dst, LinkWeight weight) {
Ray Milkey8d3ce432014-11-07 16:21:10 -0800167 final Set<Path> paths = getPaths(src, dst);
168
169 for (Path path : paths) {
170 final DeviceId srcDevice = path.src().deviceId();
171 final DeviceId dstDevice = path.dst().deviceId();
172 final TopologyVertex srcVertex = new DefaultTopologyVertex(srcDevice);
173 final TopologyVertex dstVertex = new DefaultTopologyVertex(dstDevice);
174 final Link link = link(src.toString(), 1, dst.toString(), 1);
175
176 final double weightValue = weight.weight(new DefaultTopologyEdge(srcVertex, dstVertex, link));
177 if (weightValue < 0) {
178 return new HashSet<>();
179 }
180 }
181 return paths;
Ray Milkeye6684082014-10-16 16:59:47 -0700182 }
183 }
Ray Milkey8d3ce432014-11-07 16:21:10 -0800184
185 public static class MockLinkResourceAllocations implements LinkResourceAllocations {
186 @Override
187 public Set<ResourceAllocation> getResourceAllocation(Link link) {
Ray Milkeyb1b66d32015-03-02 10:27:11 -0800188 return ImmutableSet.of(
Sho SHIMIZU94b7ff42015-05-06 17:51:49 -0700189 new LambdaResourceAllocation(LambdaResource.valueOf(77)),
Ray Milkeyb1b66d32015-03-02 10:27:11 -0800190 new MplsLabelResourceAllocation(MplsLabel.valueOf(10)));
Ray Milkey8d3ce432014-11-07 16:21:10 -0800191 }
192
Ayaka Koshibee114f042015-05-01 11:43:00 -0700193 public IntentId intentId() {
Ray Milkey8d3ce432014-11-07 16:21:10 -0800194 return null;
195 }
196
Ray Milkey8d3ce432014-11-07 16:21:10 -0800197 public Collection<Link> links() {
198 return null;
199 }
200
Ray Milkey8d3ce432014-11-07 16:21:10 -0800201 public Set<ResourceRequest> resources() {
202 return null;
203 }
204
205 @Override
206 public ResourceType type() {
207 return null;
208 }
209 }
210
211 public static class MockedAllocationFailure extends RuntimeException { }
212
213 public static class MockResourceService implements LinkResourceService {
214
215 double availableBandwidth = -1.0;
216 int availableLambda = -1;
217
218 /**
219 * Allocates a resource service that will allow bandwidth allocations
220 * up to a limit.
221 *
222 * @param bandwidth available bandwidth limit
223 * @return resource manager for bandwidth requests
224 */
225 public static MockResourceService makeBandwidthResourceService(double bandwidth) {
226 final MockResourceService result = new MockResourceService();
227 result.availableBandwidth = bandwidth;
228 return result;
229 }
230
231 /**
232 * Allocates a resource service that will allow lambda allocations.
233 *
234 * @param lambda Lambda to return for allocation requests. Currently unused
235 * @return resource manager for lambda requests
236 */
237 public static MockResourceService makeLambdaResourceService(int lambda) {
238 final MockResourceService result = new MockResourceService();
239 result.availableLambda = lambda;
240 return result;
241 }
242
243 public void setAvailableBandwidth(double availableBandwidth) {
244 this.availableBandwidth = availableBandwidth;
245 }
246
247 public void setAvailableLambda(int availableLambda) {
248 this.availableLambda = availableLambda;
249 }
250
251
252 @Override
253 public LinkResourceAllocations requestResources(LinkResourceRequest req) {
254 int lambda = -1;
255 double bandwidth = -1.0;
256
257 for (ResourceRequest resourceRequest : req.resources()) {
258 if (resourceRequest.type() == ResourceType.BANDWIDTH) {
259 final BandwidthResourceRequest brr = (BandwidthResourceRequest) resourceRequest;
260 bandwidth = brr.bandwidth().toDouble();
261 } else if (resourceRequest.type() == ResourceType.LAMBDA) {
262 lambda = 1;
263 }
264 }
265
266 if (availableBandwidth < bandwidth) {
267 throw new MockedAllocationFailure();
268 }
269 if (lambda > 0 && availableLambda == 0) {
270 throw new MockedAllocationFailure();
271 }
272
273 return new IntentTestsMocks.MockLinkResourceAllocations();
274 }
275
276 @Override
277 public void releaseResources(LinkResourceAllocations allocations) {
278 // Mock
279 }
280
281 @Override
282 public LinkResourceAllocations updateResources(LinkResourceRequest req,
283 LinkResourceAllocations oldAllocations) {
284 return null;
285 }
286
287 @Override
288 public Iterable<LinkResourceAllocations> getAllocations() {
Ray Milkeybb320482015-02-25 15:16:46 -0800289 return ImmutableSet.of(
290 new IntentTestsMocks.MockLinkResourceAllocations());
Ray Milkey8d3ce432014-11-07 16:21:10 -0800291 }
292
293 @Override
294 public Iterable<LinkResourceAllocations> getAllocations(Link link) {
Ray Milkeybb320482015-02-25 15:16:46 -0800295 return ImmutableSet.of(
296 new IntentTestsMocks.MockLinkResourceAllocations());
Ray Milkey8d3ce432014-11-07 16:21:10 -0800297 }
298
299 @Override
300 public LinkResourceAllocations getAllocations(IntentId intentId) {
Ray Milkeybb320482015-02-25 15:16:46 -0800301 return new IntentTestsMocks.MockLinkResourceAllocations();
Ray Milkey8d3ce432014-11-07 16:21:10 -0800302 }
303
304 @Override
305 public Iterable<ResourceRequest> getAvailableResources(Link link) {
306 final List<ResourceRequest> result = new LinkedList<>();
307 if (availableBandwidth > 0.0) {
Ray Milkeycf590df2015-02-23 17:43:24 -0800308 result.add(new BandwidthResourceRequest(
Sho SHIMIZU6d01d3d2015-05-08 14:08:36 -0700309 new BandwidthResource(Bandwidth.bps(availableBandwidth))));
Ray Milkey8d3ce432014-11-07 16:21:10 -0800310 }
311 if (availableLambda > 0) {
312 result.add(new LambdaResourceRequest());
313 }
314 return result;
315 }
316
317 @Override
weibit00c94f52014-11-16 07:09:05 -0800318 public Iterable<ResourceRequest> getAvailableResources(Link link, LinkResourceAllocations allocations) {
Ray Milkey8d3ce432014-11-07 16:21:10 -0800319 return null;
320 }
Ray Milkeye97ede92014-11-20 10:43:12 -0800321
322 @Override
323 public void addListener(LinkResourceListener listener) {
324
325 }
326
327 @Override
328 public void removeListener(LinkResourceListener listener) {
329
330 }
Ray Milkey8d3ce432014-11-07 16:21:10 -0800331 }
332
Ray Milkey930fc662014-11-11 16:07:45 -0800333 private static final IntentTestsMocks.MockSelector SELECTOR =
334 new IntentTestsMocks.MockSelector();
335 private static final IntentTestsMocks.MockTreatment TREATMENT =
336 new IntentTestsMocks.MockTreatment();
337
338 public static class MockFlowRule implements FlowRule {
Ray Milkey77a455f2015-03-27 10:08:17 -0700339 static int nextId = 0;
Ray Milkey930fc662014-11-11 16:07:45 -0800340
341 int priority;
alshabib08d98982015-04-21 16:25:50 -0700342 int tableId;
Ray Milkey77a455f2015-03-27 10:08:17 -0700343 long timestamp;
344 int id;
jcc3d4e14a2015-04-21 11:32:05 +0800345 FlowRuleExtPayLoad payLoad;
sangho11c30ac2015-01-22 14:30:55 -0800346
Ray Milkey930fc662014-11-11 16:07:45 -0800347 public MockFlowRule(int priority) {
348 this.priority = priority;
alshabib08d98982015-04-21 16:25:50 -0700349 this.tableId = 0;
Ray Milkey77a455f2015-03-27 10:08:17 -0700350 this.timestamp = System.currentTimeMillis();
351 this.id = nextId++;
jcc3d4e14a2015-04-21 11:32:05 +0800352 this.payLoad = null;
353 }
354
355 public MockFlowRule(int priority, FlowRuleExtPayLoad payLoad) {
356 this.priority = priority;
357 this.timestamp = System.currentTimeMillis();
358 this.id = nextId++;
359 this.payLoad = payLoad;
Ray Milkey930fc662014-11-11 16:07:45 -0800360 }
361
362 @Override
363 public FlowId id() {
Ray Milkey77a455f2015-03-27 10:08:17 -0700364 return FlowId.valueOf(id);
Ray Milkey930fc662014-11-11 16:07:45 -0800365 }
366
367 @Override
368 public short appId() {
369 return 0;
370 }
371
372 @Override
Sho SHIMIZU75a5bd92014-11-25 11:22:56 -0800373 public GroupId groupId() {
374 return new DefaultGroupId(0);
alshabib28204e52014-11-12 18:29:45 -0800375 }
376
377 @Override
Ray Milkey930fc662014-11-11 16:07:45 -0800378 public int priority() {
379 return priority;
380 }
381
382 @Override
383 public DeviceId deviceId() {
384 return did("1");
385 }
386
387 @Override
388 public TrafficSelector selector() {
389 return SELECTOR;
390 }
391
392 @Override
393 public TrafficTreatment treatment() {
394 return TREATMENT;
395 }
396
397 @Override
398 public int timeout() {
399 return 0;
400 }
401
402 @Override
403 public boolean isPermanent() {
404 return false;
405 }
406
Brian O'Connor427a1762014-11-19 18:40:32 -0800407 @Override
408 public int hashCode() {
409 return Objects.hash(priority);
410 }
Ray Milkey930fc662014-11-11 16:07:45 -0800411
Brian O'Connor427a1762014-11-19 18:40:32 -0800412 @Override
413 public boolean equals(Object obj) {
414 if (this == obj) {
415 return true;
416 }
417 if (obj == null || getClass() != obj.getClass()) {
418 return false;
419 }
420 final MockFlowRule other = (MockFlowRule) obj;
Ray Milkey77a455f2015-03-27 10:08:17 -0700421 return Objects.equals(this.timestamp, other.timestamp) &&
422 this.id == other.id;
Brian O'Connor427a1762014-11-19 18:40:32 -0800423 }
sangho11c30ac2015-01-22 14:30:55 -0800424
425 @Override
Jonathan Hartf44e42c2015-08-04 09:58:46 -0700426 public boolean exactMatch(FlowRule rule) {
427 return this.equals(rule);
428 }
429
430 @Override
alshabibdb774072015-04-20 13:13:51 -0700431 public int tableId() {
alshabib08d98982015-04-21 16:25:50 -0700432 return tableId;
alshabibdb774072015-04-20 13:13:51 -0700433 }
jcc3d4e14a2015-04-21 11:32:05 +0800434
435 @Override
436 public FlowRuleExtPayLoad payLoad() {
437 return payLoad;
438 }
Ray Milkey930fc662014-11-11 16:07:45 -0800439 }
440
Ray Milkey5a7787a2015-02-23 11:44:30 -0800441 public static class MockIntent extends Intent {
442 private static AtomicLong counter = new AtomicLong(0);
443
444 private final Long number;
445
446 public MockIntent(Long number) {
Ray Milkeyebc5d222015-03-18 15:45:36 -0700447 super(NetTestTools.APP_ID, null, Collections.emptyList(),
448 Intent.DEFAULT_INTENT_PRIORITY);
Ray Milkey5a7787a2015-02-23 11:44:30 -0800449 this.number = number;
450 }
451
Ray Milkey43a28222015-02-23 13:57:58 -0800452 public MockIntent(Long number, Collection<NetworkResource> resources) {
Ray Milkeyebc5d222015-03-18 15:45:36 -0700453 super(NetTestTools.APP_ID, null, resources, Intent.DEFAULT_INTENT_PRIORITY);
Ray Milkey43a28222015-02-23 13:57:58 -0800454 this.number = number;
455 }
456
Ray Milkey5a7787a2015-02-23 11:44:30 -0800457 public Long number() {
458 return number;
459 }
460
461 public static Long nextId() {
462 return counter.getAndIncrement();
463 }
Ray Milkey43a28222015-02-23 13:57:58 -0800464
465 @Override
466 public String toString() {
467 return MoreObjects.toStringHelper(getClass())
468 .add("id", id())
469 .add("appId", appId())
470 .toString();
471 }
Ray Milkey5a7787a2015-02-23 11:44:30 -0800472 }
473
474 public static class MockTimestamp implements Timestamp {
475 final int value;
476
477 public MockTimestamp(int value) {
478 this.value = value;
479 }
480
481 @Override
482 public int compareTo(Timestamp o) {
483 if (!(o instanceof MockTimestamp)) {
484 return -1;
485 }
486 MockTimestamp that = (MockTimestamp) o;
Jonathan Hart72175c22015-03-24 18:55:58 -0700487 return this.value - that.value;
Ray Milkey5a7787a2015-02-23 11:44:30 -0800488 }
489 }
490
Ray Milkeye6684082014-10-16 16:59:47 -0700491}