blob: d42e22fadda4ae4a879a5cfa2ec84f80c4ef26d1 [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;
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;
25import org.onosproject.net.Link;
Ray Milkey5a7787a2015-02-23 11:44:30 -080026import org.onosproject.net.NetTestTools;
Ray Milkey43a28222015-02-23 13:57:58 -080027import org.onosproject.net.NetworkResource;
Brian O'Connorabafb502014-12-02 22:26:20 -080028import org.onosproject.net.Path;
29import org.onosproject.net.flow.FlowId;
30import org.onosproject.net.flow.FlowRule;
jcc3d4e14a2015-04-21 11:32:05 +080031import org.onosproject.net.flow.FlowRuleExtPayLoad;
Brian O'Connorabafb502014-12-02 22:26:20 -080032import org.onosproject.net.flow.TrafficSelector;
33import org.onosproject.net.flow.TrafficTreatment;
34import org.onosproject.net.flow.criteria.Criterion;
35import org.onosproject.net.flow.criteria.Criterion.Type;
36import org.onosproject.net.flow.instructions.Instruction;
alshabib346b5b32015-03-06 00:42:16 -080037import org.onosproject.net.flow.instructions.Instructions;
Saurav Das86af8f12015-05-25 23:55:33 -070038import org.onosproject.net.flow.instructions.Instructions.MetadataInstruction;
Thomas Vachuska48e64e42015-09-22 15:32:55 -070039import org.onosproject.net.resource.ResourceAllocation;
40import org.onosproject.net.resource.ResourceRequest;
41import org.onosproject.net.resource.ResourceType;
Brian O'Connor6de2e202015-05-21 14:30:41 -070042import org.onosproject.net.resource.link.BandwidthResource;
43import org.onosproject.net.resource.link.BandwidthResourceRequest;
44import org.onosproject.net.resource.link.LambdaResource;
45import org.onosproject.net.resource.link.LambdaResourceAllocation;
46import org.onosproject.net.resource.link.LambdaResourceRequest;
47import org.onosproject.net.resource.link.LinkResourceAllocations;
48import org.onosproject.net.resource.link.LinkResourceListener;
49import org.onosproject.net.resource.link.LinkResourceRequest;
50import org.onosproject.net.resource.link.LinkResourceService;
51import org.onosproject.net.resource.link.MplsLabel;
52import org.onosproject.net.resource.link.MplsLabelResourceAllocation;
Brian O'Connorabafb502014-12-02 22:26:20 -080053import org.onosproject.net.topology.DefaultTopologyEdge;
54import org.onosproject.net.topology.DefaultTopologyVertex;
55import org.onosproject.net.topology.LinkWeight;
Thomas Vachuska48e64e42015-09-22 15:32:55 -070056import org.onosproject.net.topology.PathServiceAdapter;
Brian O'Connorabafb502014-12-02 22:26:20 -080057import org.onosproject.net.topology.TopologyVertex;
Ray Milkey5a7787a2015-02-23 11:44:30 -080058import org.onosproject.store.Timestamp;
Ray Milkeye6684082014-10-16 16:59:47 -070059
Jonathan Hart8ef6d3b2015-03-08 21:21:27 -070060import java.util.Arrays;
61import java.util.Collection;
62import java.util.Collections;
63import java.util.HashSet;
64import java.util.LinkedList;
65import java.util.List;
66import java.util.Objects;
67import java.util.Set;
68import java.util.concurrent.atomic.AtomicLong;
69
Thomas Vachuska48e64e42015-09-22 15:32:55 -070070import static org.onosproject.net.NetTestTools.*;
Ray Milkey43a28222015-02-23 13:57:58 -080071
Ray Milkeye6684082014-10-16 16:59:47 -070072/**
73 * Common mocks used by the intent framework tests.
74 */
75public class IntentTestsMocks {
76 /**
77 * Mock traffic selector class used for satisfying API requirements.
78 */
79 public static class MockSelector implements TrafficSelector {
80 @Override
81 public Set<Criterion> criteria() {
82 return new HashSet<>();
83 }
Jonathan Hart936c49d2014-10-23 16:38:59 -070084
85 @Override
86 public Criterion getCriterion(Type type) {
87 return null;
88 }
Ray Milkeye6684082014-10-16 16:59:47 -070089 }
90
91 /**
92 * Mock traffic treatment class used for satisfying API requirements.
93 */
94 public static class MockTreatment implements TrafficTreatment {
95 @Override
alshabib346b5b32015-03-06 00:42:16 -080096 public List<Instruction> deferred() {
Jonathan Hart4a0ba562015-03-23 17:23:33 -070097 return Collections.emptyList();
alshabib346b5b32015-03-06 00:42:16 -080098 }
99
100 @Override
101 public List<Instruction> immediate() {
Jonathan Hart4a0ba562015-03-23 17:23:33 -0700102 return Collections.emptyList();
alshabib346b5b32015-03-06 00:42:16 -0800103 }
104
105 @Override
Jonathan Hart8ef6d3b2015-03-08 21:21:27 -0700106 public List<Instruction> allInstructions() {
Jonathan Hart4a0ba562015-03-23 17:23:33 -0700107 return Collections.emptyList();
Jonathan Hart8ef6d3b2015-03-08 21:21:27 -0700108 }
109
110 @Override
alshabib346b5b32015-03-06 00:42:16 -0800111 public Instructions.TableTypeTransition tableTransition() {
112 return null;
113 }
114
115 @Override
Jonathan Hart4a0ba562015-03-23 17:23:33 -0700116 public boolean clearedDeferred() {
117 return false;
alshabib346b5b32015-03-06 00:42:16 -0800118 }
Saurav Das86af8f12015-05-25 23:55:33 -0700119
120 @Override
121 public MetadataInstruction writeMetadata() {
122 return null;
123 }
alshabib10c810b2015-08-18 16:59:04 -0700124
125 @Override
126 public Instructions.MeterInstruction metered() {
127 return null;
128 }
Ray Milkeye6684082014-10-16 16:59:47 -0700129 }
130
131 /**
132 * Mock path service for creating paths within the test.
133 */
Thomas Vachuska48e64e42015-09-22 15:32:55 -0700134 public static class MockPathService extends PathServiceAdapter {
Ray Milkeye6684082014-10-16 16:59:47 -0700135
136 final String[] pathHops;
137 final String[] reversePathHops;
138
139 /**
140 * Constructor that provides a set of hops to mock.
141 *
142 * @param pathHops path hops to mock
143 */
144 public MockPathService(String[] pathHops) {
145 this.pathHops = pathHops;
146 String[] reversed = pathHops.clone();
147 Collections.reverse(Arrays.asList(reversed));
148 reversePathHops = reversed;
149 }
150
151 @Override
152 public Set<Path> getPaths(ElementId src, ElementId dst) {
153 Set<Path> result = new HashSet<>();
154
155 String[] allHops = new String[pathHops.length];
156
157 if (src.toString().endsWith(pathHops[0])) {
158 System.arraycopy(pathHops, 0, allHops, 0, pathHops.length);
159 } else {
160 System.arraycopy(reversePathHops, 0, allHops, 0, pathHops.length);
161 }
162
163 result.add(createPath(allHops));
164 return result;
165 }
166
167 @Override
168 public Set<Path> getPaths(ElementId src, ElementId dst, LinkWeight weight) {
Ray Milkey8d3ce432014-11-07 16:21:10 -0800169 final Set<Path> paths = getPaths(src, dst);
170
171 for (Path path : paths) {
172 final DeviceId srcDevice = path.src().deviceId();
173 final DeviceId dstDevice = path.dst().deviceId();
174 final TopologyVertex srcVertex = new DefaultTopologyVertex(srcDevice);
175 final TopologyVertex dstVertex = new DefaultTopologyVertex(dstDevice);
176 final Link link = link(src.toString(), 1, dst.toString(), 1);
177
178 final double weightValue = weight.weight(new DefaultTopologyEdge(srcVertex, dstVertex, link));
179 if (weightValue < 0) {
180 return new HashSet<>();
181 }
182 }
183 return paths;
Ray Milkeye6684082014-10-16 16:59:47 -0700184 }
185 }
Ray Milkey8d3ce432014-11-07 16:21:10 -0800186
187 public static class MockLinkResourceAllocations implements LinkResourceAllocations {
188 @Override
189 public Set<ResourceAllocation> getResourceAllocation(Link link) {
Ray Milkeyb1b66d32015-03-02 10:27:11 -0800190 return ImmutableSet.of(
Sho SHIMIZU94b7ff42015-05-06 17:51:49 -0700191 new LambdaResourceAllocation(LambdaResource.valueOf(77)),
Ray Milkeyb1b66d32015-03-02 10:27:11 -0800192 new MplsLabelResourceAllocation(MplsLabel.valueOf(10)));
Ray Milkey8d3ce432014-11-07 16:21:10 -0800193 }
194
Ayaka Koshibee114f042015-05-01 11:43:00 -0700195 public IntentId intentId() {
Ray Milkey8d3ce432014-11-07 16:21:10 -0800196 return null;
197 }
198
Ray Milkey8d3ce432014-11-07 16:21:10 -0800199 public Collection<Link> links() {
200 return null;
201 }
202
Ray Milkey8d3ce432014-11-07 16:21:10 -0800203 public Set<ResourceRequest> resources() {
204 return null;
205 }
206
207 @Override
208 public ResourceType type() {
209 return null;
210 }
211 }
212
213 public static class MockedAllocationFailure extends RuntimeException { }
214
215 public static class MockResourceService implements LinkResourceService {
216
217 double availableBandwidth = -1.0;
218 int availableLambda = -1;
219
220 /**
221 * Allocates a resource service that will allow bandwidth allocations
222 * up to a limit.
223 *
224 * @param bandwidth available bandwidth limit
225 * @return resource manager for bandwidth requests
226 */
227 public static MockResourceService makeBandwidthResourceService(double bandwidth) {
228 final MockResourceService result = new MockResourceService();
229 result.availableBandwidth = bandwidth;
230 return result;
231 }
232
233 /**
234 * Allocates a resource service that will allow lambda allocations.
235 *
236 * @param lambda Lambda to return for allocation requests. Currently unused
237 * @return resource manager for lambda requests
238 */
239 public static MockResourceService makeLambdaResourceService(int lambda) {
240 final MockResourceService result = new MockResourceService();
241 result.availableLambda = lambda;
242 return result;
243 }
244
245 public void setAvailableBandwidth(double availableBandwidth) {
246 this.availableBandwidth = availableBandwidth;
247 }
248
249 public void setAvailableLambda(int availableLambda) {
250 this.availableLambda = availableLambda;
251 }
252
253
254 @Override
255 public LinkResourceAllocations requestResources(LinkResourceRequest req) {
256 int lambda = -1;
257 double bandwidth = -1.0;
258
259 for (ResourceRequest resourceRequest : req.resources()) {
260 if (resourceRequest.type() == ResourceType.BANDWIDTH) {
261 final BandwidthResourceRequest brr = (BandwidthResourceRequest) resourceRequest;
262 bandwidth = brr.bandwidth().toDouble();
263 } else if (resourceRequest.type() == ResourceType.LAMBDA) {
264 lambda = 1;
265 }
266 }
267
268 if (availableBandwidth < bandwidth) {
269 throw new MockedAllocationFailure();
270 }
271 if (lambda > 0 && availableLambda == 0) {
272 throw new MockedAllocationFailure();
273 }
274
275 return new IntentTestsMocks.MockLinkResourceAllocations();
276 }
277
278 @Override
279 public void releaseResources(LinkResourceAllocations allocations) {
280 // Mock
281 }
282
283 @Override
284 public LinkResourceAllocations updateResources(LinkResourceRequest req,
285 LinkResourceAllocations oldAllocations) {
286 return null;
287 }
288
289 @Override
290 public Iterable<LinkResourceAllocations> getAllocations() {
Ray Milkeybb320482015-02-25 15:16:46 -0800291 return ImmutableSet.of(
292 new IntentTestsMocks.MockLinkResourceAllocations());
Ray Milkey8d3ce432014-11-07 16:21:10 -0800293 }
294
295 @Override
296 public Iterable<LinkResourceAllocations> getAllocations(Link link) {
Ray Milkeybb320482015-02-25 15:16:46 -0800297 return ImmutableSet.of(
298 new IntentTestsMocks.MockLinkResourceAllocations());
Ray Milkey8d3ce432014-11-07 16:21:10 -0800299 }
300
301 @Override
302 public LinkResourceAllocations getAllocations(IntentId intentId) {
Ray Milkeybb320482015-02-25 15:16:46 -0800303 return new IntentTestsMocks.MockLinkResourceAllocations();
Ray Milkey8d3ce432014-11-07 16:21:10 -0800304 }
305
306 @Override
307 public Iterable<ResourceRequest> getAvailableResources(Link link) {
308 final List<ResourceRequest> result = new LinkedList<>();
309 if (availableBandwidth > 0.0) {
Ray Milkeycf590df2015-02-23 17:43:24 -0800310 result.add(new BandwidthResourceRequest(
Sho SHIMIZU6d01d3d2015-05-08 14:08:36 -0700311 new BandwidthResource(Bandwidth.bps(availableBandwidth))));
Ray Milkey8d3ce432014-11-07 16:21:10 -0800312 }
313 if (availableLambda > 0) {
314 result.add(new LambdaResourceRequest());
315 }
316 return result;
317 }
318
319 @Override
weibit00c94f52014-11-16 07:09:05 -0800320 public Iterable<ResourceRequest> getAvailableResources(Link link, LinkResourceAllocations allocations) {
Ray Milkey8d3ce432014-11-07 16:21:10 -0800321 return null;
322 }
Ray Milkeye97ede92014-11-20 10:43:12 -0800323
324 @Override
325 public void addListener(LinkResourceListener listener) {
326
327 }
328
329 @Override
330 public void removeListener(LinkResourceListener listener) {
331
332 }
Ray Milkey8d3ce432014-11-07 16:21:10 -0800333 }
334
Ray Milkey930fc662014-11-11 16:07:45 -0800335 private static final IntentTestsMocks.MockSelector SELECTOR =
336 new IntentTestsMocks.MockSelector();
337 private static final IntentTestsMocks.MockTreatment TREATMENT =
338 new IntentTestsMocks.MockTreatment();
339
340 public static class MockFlowRule implements FlowRule {
Ray Milkey77a455f2015-03-27 10:08:17 -0700341 static int nextId = 0;
Ray Milkey930fc662014-11-11 16:07:45 -0800342
343 int priority;
alshabib08d98982015-04-21 16:25:50 -0700344 int tableId;
Ray Milkey77a455f2015-03-27 10:08:17 -0700345 long timestamp;
346 int id;
jcc3d4e14a2015-04-21 11:32:05 +0800347 FlowRuleExtPayLoad payLoad;
sangho11c30ac2015-01-22 14:30:55 -0800348
Ray Milkey930fc662014-11-11 16:07:45 -0800349 public MockFlowRule(int priority) {
350 this.priority = priority;
alshabib08d98982015-04-21 16:25:50 -0700351 this.tableId = 0;
Ray Milkey77a455f2015-03-27 10:08:17 -0700352 this.timestamp = System.currentTimeMillis();
353 this.id = nextId++;
jcc3d4e14a2015-04-21 11:32:05 +0800354 this.payLoad = null;
355 }
356
357 public MockFlowRule(int priority, FlowRuleExtPayLoad payLoad) {
358 this.priority = priority;
359 this.timestamp = System.currentTimeMillis();
360 this.id = nextId++;
361 this.payLoad = payLoad;
Ray Milkey930fc662014-11-11 16:07:45 -0800362 }
363
364 @Override
365 public FlowId id() {
Ray Milkey77a455f2015-03-27 10:08:17 -0700366 return FlowId.valueOf(id);
Ray Milkey930fc662014-11-11 16:07:45 -0800367 }
368
369 @Override
370 public short appId() {
371 return 0;
372 }
373
374 @Override
Sho SHIMIZU75a5bd92014-11-25 11:22:56 -0800375 public GroupId groupId() {
376 return new DefaultGroupId(0);
alshabib28204e52014-11-12 18:29:45 -0800377 }
378
379 @Override
Ray Milkey930fc662014-11-11 16:07:45 -0800380 public int priority() {
381 return priority;
382 }
383
384 @Override
385 public DeviceId deviceId() {
386 return did("1");
387 }
388
389 @Override
390 public TrafficSelector selector() {
391 return SELECTOR;
392 }
393
394 @Override
395 public TrafficTreatment treatment() {
396 return TREATMENT;
397 }
398
399 @Override
400 public int timeout() {
401 return 0;
402 }
403
404 @Override
405 public boolean isPermanent() {
406 return false;
407 }
408
Brian O'Connor427a1762014-11-19 18:40:32 -0800409 @Override
410 public int hashCode() {
411 return Objects.hash(priority);
412 }
Ray Milkey930fc662014-11-11 16:07:45 -0800413
Brian O'Connor427a1762014-11-19 18:40:32 -0800414 @Override
415 public boolean equals(Object obj) {
416 if (this == obj) {
417 return true;
418 }
419 if (obj == null || getClass() != obj.getClass()) {
420 return false;
421 }
422 final MockFlowRule other = (MockFlowRule) obj;
Ray Milkey77a455f2015-03-27 10:08:17 -0700423 return Objects.equals(this.timestamp, other.timestamp) &&
Nikhil Cheerla2ec191f2015-07-09 12:34:54 -0700424 this.id == other.id;
Brian O'Connor427a1762014-11-19 18:40:32 -0800425 }
sangho11c30ac2015-01-22 14:30:55 -0800426
427 @Override
Jonathan Hartf44e42c2015-08-04 09:58:46 -0700428 public boolean exactMatch(FlowRule rule) {
429 return this.equals(rule);
430 }
431
432 @Override
alshabibdb774072015-04-20 13:13:51 -0700433 public int tableId() {
alshabib08d98982015-04-21 16:25:50 -0700434 return tableId;
alshabibdb774072015-04-20 13:13:51 -0700435 }
jcc3d4e14a2015-04-21 11:32:05 +0800436
437 @Override
438 public FlowRuleExtPayLoad payLoad() {
439 return payLoad;
440 }
Ray Milkey930fc662014-11-11 16:07:45 -0800441 }
442
Ray Milkey5a7787a2015-02-23 11:44:30 -0800443 public static class MockIntent extends Intent {
444 private static AtomicLong counter = new AtomicLong(0);
445
446 private final Long number;
447
448 public MockIntent(Long number) {
Ray Milkeyebc5d222015-03-18 15:45:36 -0700449 super(NetTestTools.APP_ID, null, Collections.emptyList(),
Nikhil Cheerla2ec191f2015-07-09 12:34:54 -0700450 Intent.DEFAULT_INTENT_PRIORITY);
Ray Milkey5a7787a2015-02-23 11:44:30 -0800451 this.number = number;
452 }
453
Ray Milkey43a28222015-02-23 13:57:58 -0800454 public MockIntent(Long number, Collection<NetworkResource> resources) {
Ray Milkeyebc5d222015-03-18 15:45:36 -0700455 super(NetTestTools.APP_ID, null, resources, Intent.DEFAULT_INTENT_PRIORITY);
Ray Milkey43a28222015-02-23 13:57:58 -0800456 this.number = number;
457 }
458
Ray Milkey5a7787a2015-02-23 11:44:30 -0800459 public Long number() {
460 return number;
461 }
462
463 public static Long nextId() {
464 return counter.getAndIncrement();
465 }
Ray Milkey43a28222015-02-23 13:57:58 -0800466
467 @Override
468 public String toString() {
469 return MoreObjects.toStringHelper(getClass())
470 .add("id", id())
471 .add("appId", appId())
472 .toString();
473 }
Ray Milkey5a7787a2015-02-23 11:44:30 -0800474 }
475
476 public static class MockTimestamp implements Timestamp {
477 final int value;
478
479 public MockTimestamp(int value) {
480 this.value = value;
481 }
482
483 @Override
484 public int compareTo(Timestamp o) {
485 if (!(o instanceof MockTimestamp)) {
486 return -1;
487 }
488 MockTimestamp that = (MockTimestamp) o;
Jonathan Hart72175c22015-03-24 18:55:58 -0700489 return this.value - that.value;
Ray Milkey5a7787a2015-02-23 11:44:30 -0800490 }
491 }
492
Ray Milkeye6684082014-10-16 16:59:47 -0700493}