blob: df673e118c7aa633841f754c89a018385ed66507 [file] [log] [blame]
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07001/*
2 * Copyright 2014 Open Networking Laboratory
3 *
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
Brian O'Connorabafb502014-12-02 22:26:20 -080018import static org.onosproject.net.NetTestTools.createPath;
19import static org.onosproject.net.NetTestTools.did;
20import static org.onosproject.net.NetTestTools.link;
Jonathan Hart936c49d2014-10-23 16:38:59 -070021
Ray Milkeye6684082014-10-16 16:59:47 -070022import java.util.ArrayList;
23import java.util.Arrays;
Ray Milkey8d3ce432014-11-07 16:21:10 -080024import java.util.Collection;
Ray Milkeye6684082014-10-16 16:59:47 -070025import java.util.Collections;
26import java.util.HashSet;
Ray Milkey8d3ce432014-11-07 16:21:10 -080027import java.util.LinkedList;
Ray Milkeye6684082014-10-16 16:59:47 -070028import java.util.List;
Brian O'Connor427a1762014-11-19 18:40:32 -080029import java.util.Objects;
Ray Milkeye6684082014-10-16 16:59:47 -070030import java.util.Set;
Ray Milkey5a7787a2015-02-23 11:44:30 -080031import java.util.concurrent.atomic.AtomicLong;
Ray Milkeye6684082014-10-16 16:59:47 -070032
Brian O'Connorabafb502014-12-02 22:26:20 -080033import org.onosproject.core.DefaultGroupId;
34import org.onosproject.core.GroupId;
35import org.onosproject.net.DeviceId;
36import org.onosproject.net.ElementId;
37import org.onosproject.net.Link;
Ray Milkey5a7787a2015-02-23 11:44:30 -080038import org.onosproject.net.NetTestTools;
Ray Milkey43a28222015-02-23 13:57:58 -080039import org.onosproject.net.NetworkResource;
Brian O'Connorabafb502014-12-02 22:26:20 -080040import org.onosproject.net.Path;
41import org.onosproject.net.flow.FlowId;
42import org.onosproject.net.flow.FlowRule;
43import org.onosproject.net.flow.TrafficSelector;
44import org.onosproject.net.flow.TrafficTreatment;
45import org.onosproject.net.flow.criteria.Criterion;
46import org.onosproject.net.flow.criteria.Criterion.Type;
47import org.onosproject.net.flow.instructions.Instruction;
alshabib346b5b32015-03-06 00:42:16 -080048import org.onosproject.net.flow.instructions.Instructions;
Ray Milkeycf590df2015-02-23 17:43:24 -080049import org.onosproject.net.resource.Bandwidth;
Brian O'Connorabafb502014-12-02 22:26:20 -080050import org.onosproject.net.resource.BandwidthResourceRequest;
Ray Milkeyb1b66d32015-03-02 10:27:11 -080051import org.onosproject.net.resource.Lambda;
52import org.onosproject.net.resource.LambdaResourceAllocation;
Brian O'Connorabafb502014-12-02 22:26:20 -080053import org.onosproject.net.resource.LambdaResourceRequest;
54import org.onosproject.net.resource.LinkResourceAllocations;
55import org.onosproject.net.resource.LinkResourceListener;
56import org.onosproject.net.resource.LinkResourceRequest;
57import org.onosproject.net.resource.LinkResourceService;
Ray Milkeybb320482015-02-25 15:16:46 -080058import org.onosproject.net.resource.MplsLabel;
59import org.onosproject.net.resource.MplsLabelResourceAllocation;
Brian O'Connorabafb502014-12-02 22:26:20 -080060import org.onosproject.net.resource.ResourceAllocation;
61import org.onosproject.net.resource.ResourceRequest;
62import org.onosproject.net.resource.ResourceType;
63import org.onosproject.net.topology.DefaultTopologyEdge;
64import org.onosproject.net.topology.DefaultTopologyVertex;
65import org.onosproject.net.topology.LinkWeight;
66import org.onosproject.net.topology.PathService;
67import org.onosproject.net.topology.TopologyVertex;
Ray Milkey5a7787a2015-02-23 11:44:30 -080068import org.onosproject.store.Timestamp;
Ray Milkeye6684082014-10-16 16:59:47 -070069
Ray Milkey43a28222015-02-23 13:57:58 -080070import com.google.common.base.MoreObjects;
Ray Milkeybb320482015-02-25 15:16:46 -080071import com.google.common.collect.ImmutableSet;
Ray Milkey43a28222015-02-23 13:57:58 -080072
Ray Milkeye6684082014-10-16 16:59:47 -070073/**
74 * Common mocks used by the intent framework tests.
75 */
76public class IntentTestsMocks {
77 /**
78 * Mock traffic selector class used for satisfying API requirements.
79 */
80 public static class MockSelector implements TrafficSelector {
81 @Override
82 public Set<Criterion> criteria() {
83 return new HashSet<>();
84 }
Jonathan Hart936c49d2014-10-23 16:38:59 -070085
86 @Override
87 public Criterion getCriterion(Type type) {
88 return null;
89 }
Ray Milkeye6684082014-10-16 16:59:47 -070090 }
91
92 /**
93 * Mock traffic treatment class used for satisfying API requirements.
94 */
95 public static class MockTreatment implements TrafficTreatment {
96 @Override
97 public List<Instruction> instructions() {
Ayaka Koshibeb1224ab2015-01-31 00:48:58 +000098 return new ArrayList<>();
Ray Milkeye6684082014-10-16 16:59:47 -070099 }
alshabib346b5b32015-03-06 00:42:16 -0800100
101 @Override
102 public List<Instruction> deferred() {
103 return null;
104 }
105
106 @Override
107 public List<Instruction> immediate() {
108 return null;
109 }
110
111 @Override
112 public Instructions.TableTypeTransition tableTransition() {
113 return null;
114 }
115
116 @Override
117 public Boolean clearedDeferred() {
118 return null;
119 }
Ray Milkeye6684082014-10-16 16:59:47 -0700120 }
121
122 /**
123 * Mock path service for creating paths within the test.
124 */
125 public static class MockPathService implements PathService {
126
127 final String[] pathHops;
128 final String[] reversePathHops;
129
130 /**
131 * Constructor that provides a set of hops to mock.
132 *
133 * @param pathHops path hops to mock
134 */
135 public MockPathService(String[] pathHops) {
136 this.pathHops = pathHops;
137 String[] reversed = pathHops.clone();
138 Collections.reverse(Arrays.asList(reversed));
139 reversePathHops = reversed;
140 }
141
142 @Override
143 public Set<Path> getPaths(ElementId src, ElementId dst) {
144 Set<Path> result = new HashSet<>();
145
146 String[] allHops = new String[pathHops.length];
147
148 if (src.toString().endsWith(pathHops[0])) {
149 System.arraycopy(pathHops, 0, allHops, 0, pathHops.length);
150 } else {
151 System.arraycopy(reversePathHops, 0, allHops, 0, pathHops.length);
152 }
153
154 result.add(createPath(allHops));
155 return result;
156 }
157
158 @Override
159 public Set<Path> getPaths(ElementId src, ElementId dst, LinkWeight weight) {
Ray Milkey8d3ce432014-11-07 16:21:10 -0800160 final Set<Path> paths = getPaths(src, dst);
161
162 for (Path path : paths) {
163 final DeviceId srcDevice = path.src().deviceId();
164 final DeviceId dstDevice = path.dst().deviceId();
165 final TopologyVertex srcVertex = new DefaultTopologyVertex(srcDevice);
166 final TopologyVertex dstVertex = new DefaultTopologyVertex(dstDevice);
167 final Link link = link(src.toString(), 1, dst.toString(), 1);
168
169 final double weightValue = weight.weight(new DefaultTopologyEdge(srcVertex, dstVertex, link));
170 if (weightValue < 0) {
171 return new HashSet<>();
172 }
173 }
174 return paths;
Ray Milkeye6684082014-10-16 16:59:47 -0700175 }
176 }
Ray Milkey8d3ce432014-11-07 16:21:10 -0800177
178 public static class MockLinkResourceAllocations implements LinkResourceAllocations {
179 @Override
180 public Set<ResourceAllocation> getResourceAllocation(Link link) {
Ray Milkeyb1b66d32015-03-02 10:27:11 -0800181 return ImmutableSet.of(
182 new LambdaResourceAllocation(Lambda.valueOf(77)),
183 new MplsLabelResourceAllocation(MplsLabel.valueOf(10)));
Ray Milkey8d3ce432014-11-07 16:21:10 -0800184 }
185
186 @Override
187 public IntentId intendId() {
188 return null;
189 }
190
191 @Override
192 public Collection<Link> links() {
193 return null;
194 }
195
196 @Override
197 public Set<ResourceRequest> resources() {
198 return null;
199 }
200
201 @Override
202 public ResourceType type() {
203 return null;
204 }
205 }
206
207 public static class MockedAllocationFailure extends RuntimeException { }
208
209 public static class MockResourceService implements LinkResourceService {
210
211 double availableBandwidth = -1.0;
212 int availableLambda = -1;
213
214 /**
215 * Allocates a resource service that will allow bandwidth allocations
216 * up to a limit.
217 *
218 * @param bandwidth available bandwidth limit
219 * @return resource manager for bandwidth requests
220 */
221 public static MockResourceService makeBandwidthResourceService(double bandwidth) {
222 final MockResourceService result = new MockResourceService();
223 result.availableBandwidth = bandwidth;
224 return result;
225 }
226
227 /**
228 * Allocates a resource service that will allow lambda allocations.
229 *
230 * @param lambda Lambda to return for allocation requests. Currently unused
231 * @return resource manager for lambda requests
232 */
233 public static MockResourceService makeLambdaResourceService(int lambda) {
234 final MockResourceService result = new MockResourceService();
235 result.availableLambda = lambda;
236 return result;
237 }
238
239 public void setAvailableBandwidth(double availableBandwidth) {
240 this.availableBandwidth = availableBandwidth;
241 }
242
243 public void setAvailableLambda(int availableLambda) {
244 this.availableLambda = availableLambda;
245 }
246
247
248 @Override
249 public LinkResourceAllocations requestResources(LinkResourceRequest req) {
250 int lambda = -1;
251 double bandwidth = -1.0;
252
253 for (ResourceRequest resourceRequest : req.resources()) {
254 if (resourceRequest.type() == ResourceType.BANDWIDTH) {
255 final BandwidthResourceRequest brr = (BandwidthResourceRequest) resourceRequest;
256 bandwidth = brr.bandwidth().toDouble();
257 } else if (resourceRequest.type() == ResourceType.LAMBDA) {
258 lambda = 1;
259 }
260 }
261
262 if (availableBandwidth < bandwidth) {
263 throw new MockedAllocationFailure();
264 }
265 if (lambda > 0 && availableLambda == 0) {
266 throw new MockedAllocationFailure();
267 }
268
269 return new IntentTestsMocks.MockLinkResourceAllocations();
270 }
271
272 @Override
273 public void releaseResources(LinkResourceAllocations allocations) {
274 // Mock
275 }
276
277 @Override
278 public LinkResourceAllocations updateResources(LinkResourceRequest req,
279 LinkResourceAllocations oldAllocations) {
280 return null;
281 }
282
283 @Override
284 public Iterable<LinkResourceAllocations> getAllocations() {
Ray Milkeybb320482015-02-25 15:16:46 -0800285 return ImmutableSet.of(
286 new IntentTestsMocks.MockLinkResourceAllocations());
Ray Milkey8d3ce432014-11-07 16:21:10 -0800287 }
288
289 @Override
290 public Iterable<LinkResourceAllocations> getAllocations(Link link) {
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 LinkResourceAllocations getAllocations(IntentId intentId) {
Ray Milkeybb320482015-02-25 15:16:46 -0800297 return new IntentTestsMocks.MockLinkResourceAllocations();
Ray Milkey8d3ce432014-11-07 16:21:10 -0800298 }
299
300 @Override
301 public Iterable<ResourceRequest> getAvailableResources(Link link) {
302 final List<ResourceRequest> result = new LinkedList<>();
303 if (availableBandwidth > 0.0) {
Ray Milkeycf590df2015-02-23 17:43:24 -0800304 result.add(new BandwidthResourceRequest(
305 Bandwidth.bps(availableBandwidth)));
Ray Milkey8d3ce432014-11-07 16:21:10 -0800306 }
307 if (availableLambda > 0) {
308 result.add(new LambdaResourceRequest());
309 }
310 return result;
311 }
312
313 @Override
weibit00c94f52014-11-16 07:09:05 -0800314 public Iterable<ResourceRequest> getAvailableResources(Link link, LinkResourceAllocations allocations) {
Ray Milkey8d3ce432014-11-07 16:21:10 -0800315 return null;
316 }
Ray Milkeye97ede92014-11-20 10:43:12 -0800317
318 @Override
319 public void addListener(LinkResourceListener listener) {
320
321 }
322
323 @Override
324 public void removeListener(LinkResourceListener listener) {
325
326 }
Ray Milkey8d3ce432014-11-07 16:21:10 -0800327 }
328
Ray Milkey930fc662014-11-11 16:07:45 -0800329 private static final IntentTestsMocks.MockSelector SELECTOR =
330 new IntentTestsMocks.MockSelector();
331 private static final IntentTestsMocks.MockTreatment TREATMENT =
332 new IntentTestsMocks.MockTreatment();
333
334 public static class MockFlowRule implements FlowRule {
335
336 int priority;
sangho11c30ac2015-01-22 14:30:55 -0800337 Type type;
338
Ray Milkey930fc662014-11-11 16:07:45 -0800339 public MockFlowRule(int priority) {
340 this.priority = priority;
sangho11c30ac2015-01-22 14:30:55 -0800341 this.type = Type.DEFAULT;
Ray Milkey930fc662014-11-11 16:07:45 -0800342 }
343
344 @Override
345 public FlowId id() {
346 return FlowId.valueOf(1);
347 }
348
349 @Override
350 public short appId() {
351 return 0;
352 }
353
354 @Override
Sho SHIMIZU75a5bd92014-11-25 11:22:56 -0800355 public GroupId groupId() {
356 return new DefaultGroupId(0);
alshabib28204e52014-11-12 18:29:45 -0800357 }
358
359 @Override
Ray Milkey930fc662014-11-11 16:07:45 -0800360 public int priority() {
361 return priority;
362 }
363
364 @Override
365 public DeviceId deviceId() {
366 return did("1");
367 }
368
369 @Override
370 public TrafficSelector selector() {
371 return SELECTOR;
372 }
373
374 @Override
375 public TrafficTreatment treatment() {
376 return TREATMENT;
377 }
378
379 @Override
380 public int timeout() {
381 return 0;
382 }
383
384 @Override
385 public boolean isPermanent() {
386 return false;
387 }
388
Brian O'Connor427a1762014-11-19 18:40:32 -0800389 @Override
390 public int hashCode() {
391 return Objects.hash(priority);
392 }
Ray Milkey930fc662014-11-11 16:07:45 -0800393
Brian O'Connor427a1762014-11-19 18:40:32 -0800394 @Override
395 public boolean equals(Object obj) {
396 if (this == obj) {
397 return true;
398 }
399 if (obj == null || getClass() != obj.getClass()) {
400 return false;
401 }
402 final MockFlowRule other = (MockFlowRule) obj;
403 return Objects.equals(this.priority, other.priority);
404 }
sangho11c30ac2015-01-22 14:30:55 -0800405
406 @Override
407 public Type type() {
408 return type;
409 }
Ray Milkey930fc662014-11-11 16:07:45 -0800410 }
411
Ray Milkey5a7787a2015-02-23 11:44:30 -0800412 public static class MockIntent extends Intent {
413 private static AtomicLong counter = new AtomicLong(0);
414
415 private final Long number;
416
417 public MockIntent(Long number) {
418 super(NetTestTools.APP_ID, Collections.emptyList());
419 this.number = number;
420 }
421
Ray Milkey43a28222015-02-23 13:57:58 -0800422 public MockIntent(Long number, Collection<NetworkResource> resources) {
423 super(NetTestTools.APP_ID, resources);
424 this.number = number;
425 }
426
Ray Milkey5a7787a2015-02-23 11:44:30 -0800427 public Long number() {
428 return number;
429 }
430
431 public static Long nextId() {
432 return counter.getAndIncrement();
433 }
Ray Milkey43a28222015-02-23 13:57:58 -0800434
435 @Override
436 public String toString() {
437 return MoreObjects.toStringHelper(getClass())
438 .add("id", id())
439 .add("appId", appId())
440 .toString();
441 }
Ray Milkey5a7787a2015-02-23 11:44:30 -0800442 }
443
444 public static class MockTimestamp implements Timestamp {
445 final int value;
446
447 public MockTimestamp(int value) {
448 this.value = value;
449 }
450
451 @Override
452 public int compareTo(Timestamp o) {
453 if (!(o instanceof MockTimestamp)) {
454 return -1;
455 }
456 MockTimestamp that = (MockTimestamp) o;
457 return (this.value > that.value ? -1 : (this.value == that.value ? 0 : 1));
458 }
459 }
460
Ray Milkey930fc662014-11-11 16:07:45 -0800461
Ray Milkeye6684082014-10-16 16:59:47 -0700462}