blob: c8d3915439e8103455f4a547a8e97bfd80bd46ac [file] [log] [blame]
Yi Tsenga64f0c82017-02-03 11:17:15 -08001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2017-present Open Networking Foundation
Yi Tsenga64f0c82017-02-03 11:17:15 -08003 *
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 */
16package org.onosproject.net.intent.impl.compiler;
17
Yi Tsengb32f7742017-05-09 15:34:19 -070018import com.google.common.collect.ImmutableList;
Yi Tsenga64f0c82017-02-03 11:17:15 -080019import com.google.common.collect.ImmutableSet;
Yi Tsengb32f7742017-05-09 15:34:19 -070020import org.junit.After;
Yi Tsenga64f0c82017-02-03 11:17:15 -080021import org.junit.Before;
22import org.junit.Test;
23import org.onlab.packet.MacAddress;
24import org.onlab.packet.VlanId;
25import org.onosproject.cfg.ComponentConfigAdapter;
Yi Tsengb32f7742017-05-09 15:34:19 -070026import org.onosproject.core.ApplicationId;
Yi Tsenga64f0c82017-02-03 11:17:15 -080027import org.onosproject.core.CoreService;
28import org.onosproject.net.DefaultLink;
Thomas Szyrkowiec770093f2017-05-05 13:06:53 +020029import org.onosproject.net.DeviceId;
Yi Tsengb32f7742017-05-09 15:34:19 -070030import org.onosproject.net.EncapsulationType;
Yi Tsenga64f0c82017-02-03 11:17:15 -080031import org.onosproject.net.FilteredConnectPoint;
32import org.onosproject.net.Link;
33import org.onosproject.net.PortNumber;
Thomas Szyrkowiec770093f2017-05-05 13:06:53 +020034import org.onosproject.net.domain.DomainService;
Yi Tsenga64f0c82017-02-03 11:17:15 -080035import org.onosproject.net.flow.DefaultTrafficSelector;
36import org.onosproject.net.flow.DefaultTrafficTreatment;
37import org.onosproject.net.flow.TrafficSelector;
38import org.onosproject.net.flow.TrafficTreatment;
39import org.onosproject.net.flow.criteria.Criterion;
40import org.onosproject.net.flow.criteria.PortCriterion;
41import org.onosproject.net.flowobjective.FilteringObjective;
42import org.onosproject.net.flowobjective.FlowObjectiveServiceAdapter;
43import org.onosproject.net.flowobjective.ForwardingObjective;
44import org.onosproject.net.flowobjective.NextObjective;
45import org.onosproject.net.flowobjective.Objective;
46import org.onosproject.net.intent.FlowObjectiveIntent;
47import org.onosproject.net.intent.Intent;
48import org.onosproject.net.intent.IntentExtensionService;
49import org.onosproject.net.intent.LinkCollectionIntent;
Yi Tsengb32f7742017-05-09 15:34:19 -070050import org.onosproject.net.intent.constraint.EncapsulationConstraint;
Yi Tsenga64f0c82017-02-03 11:17:15 -080051import org.onosproject.net.resource.MockResourceService;
52import org.onosproject.net.resource.ResourceService;
53
Yi Tsengb32f7742017-05-09 15:34:19 -070054import java.util.Collection;
Yi Tsenga64f0c82017-02-03 11:17:15 -080055import java.util.Collections;
56import java.util.List;
57import java.util.Set;
58
Thomas Vachuska2048c1f2017-05-10 19:32:22 -070059import static org.easymock.EasyMock.*;
Yi Tsenga64f0c82017-02-03 11:17:15 -080060import static org.hamcrest.CoreMatchers.instanceOf;
61import static org.hamcrest.MatcherAssert.assertThat;
Thomas Vachuska2048c1f2017-05-10 19:32:22 -070062import static org.hamcrest.Matchers.*;
Yi Tsenga64f0c82017-02-03 11:17:15 -080063import static org.onosproject.net.Link.Type.DIRECT;
64import static org.onosproject.net.NetTestTools.PID;
Thomas Szyrkowiec770093f2017-05-05 13:06:53 +020065import static org.onosproject.net.domain.DomainId.LOCAL;
Yi Tsengb32f7742017-05-09 15:34:19 -070066import static org.onosproject.net.flowobjective.ForwardingObjective.Flag.SPECIFIC;
67import static org.onosproject.net.flowobjective.NextObjective.Type.BROADCAST;
68import static org.onosproject.net.flowobjective.NextObjective.Type.SIMPLE;
69import static org.onosproject.net.flowobjective.Objective.Operation.ADD;
Yi Tsenga64f0c82017-02-03 11:17:15 -080070
71public class LinkCollectionIntentObjectiveCompilerTest extends AbstractLinkCollectionTest {
Yi Tsengb32f7742017-05-09 15:34:19 -070072 private static final VlanId VLAN_1 = VlanId.vlanId("1");
73 private static final VlanId VLAN_100 = VlanId.vlanId("100");
Yi Tsenga64f0c82017-02-03 11:17:15 -080074
75 private LinkCollectionIntentObjectiveCompiler compiler;
76 private FlowObjectiveServiceAdapter flowObjectiveService;
77
78 private NextObjective nextObjective;
79 private ForwardingObjective forwardingObjective;
80 private FilteringObjective filteringObjective;
81
82 private ResourceService resourceService;
83
84 @Before
85 public void setUp() {
86 compiler = new LinkCollectionIntentObjectiveCompiler();
87 coreService = createMock(CoreService.class);
88 expect(coreService.registerApplication("org.onosproject.net.intent"))
89 .andReturn(appId);
90 flowObjectiveService = new FlowObjectiveServiceAdapter();
91 resourceService = new MockResourceService();
92 compiler.coreService = coreService;
93 compiler.flowObjectiveService = flowObjectiveService;
94
Thomas Szyrkowiec770093f2017-05-05 13:06:53 +020095
96 domainService = createMock(DomainService.class);
97 expect(domainService.getDomain(anyObject(DeviceId.class))).andReturn(LOCAL).anyTimes();
98 compiler.domainService = domainService;
99
Thomas Vachuska2048c1f2017-05-10 19:32:22 -0700100 super.setUp();
Yi Tsenga64f0c82017-02-03 11:17:15 -0800101
102 intentExtensionService = createMock(IntentExtensionService.class);
103 intentExtensionService.registerCompiler(LinkCollectionIntent.class, compiler);
104 intentExtensionService.unregisterCompiler(LinkCollectionIntent.class);
105
106 registrator = new IntentConfigurableRegistrator();
107 registrator.extensionService = intentExtensionService;
108 registrator.cfgService = new ComponentConfigAdapter();
109 registrator.activate();
110
111 compiler.registrator = registrator;
112 compiler.resourceService = resourceService;
113
Yi Tseng84c5a3d2017-04-14 16:42:59 -0700114 LinkCollectionCompiler.optimizeInstructions = false;
Yi Tsenga64f0c82017-02-03 11:17:15 -0800115 LinkCollectionCompiler.copyTtl = false;
116
Thomas Szyrkowiec770093f2017-05-05 13:06:53 +0200117 replay(coreService, domainService, intentExtensionService);
Yi Tsengb32f7742017-05-09 15:34:19 -0700118 compiler.activate();
119 }
Yi Tsenga64f0c82017-02-03 11:17:15 -0800120
Yi Tsengb32f7742017-05-09 15:34:19 -0700121 @After
122 public void tearDown() {
123 super.tearDown();
124 compiler.deactivate();
Yi Tsenga64f0c82017-02-03 11:17:15 -0800125 }
126
Yi Tsenga64f0c82017-02-03 11:17:15 -0800127 /**
128 * We test the proper compilation of a simple link collection intent
129 * with connect points, empty trivial treatment and empty trivial selector.
130 */
131 @Test
132 public void testCompile() {
Yi Tsenga64f0c82017-02-03 11:17:15 -0800133 LinkCollectionIntent intent = LinkCollectionIntent.builder()
134 .appId(appId)
135 .selector(selector)
136 .treatment(treatment)
137 .links(links)
138 .filteredIngressPoints(ImmutableSet.of(new FilteredConnectPoint(d1p1)))
139 .filteredEgressPoints(ImmutableSet.of(new FilteredConnectPoint(d3p1)))
140 .build();
141
142 List<Intent> result = compiler.compile(intent, Collections.emptyList());
143 assertThat(result, hasSize(1));
144 assertThat(result.get(0), instanceOf(FlowObjectiveIntent.class));
145
146 FlowObjectiveIntent foIntent = (FlowObjectiveIntent) result.get(0);
147 List<Objective> objectives = foIntent.objectives();
Yi Tsengb32f7742017-05-09 15:34:19 -0700148 assertThat(objectives, hasSize(6));
Yi Tsenga64f0c82017-02-03 11:17:15 -0800149
150 /*
151 * First set of objective
152 */
Yi Tsengb32f7742017-05-09 15:34:19 -0700153 forwardingObjective = (ForwardingObjective) objectives.get(0);
154 nextObjective = (NextObjective) objectives.get(1);
Yi Tsenga64f0c82017-02-03 11:17:15 -0800155
156 // expect selector and treatment
157 TrafficSelector expectSelector = DefaultTrafficSelector.builder()
158 .matchInPort(PortNumber.portNumber(1))
159 .build();
160 TrafficTreatment expectTreatment = DefaultTrafficTreatment.builder()
161 .setOutput(PortNumber.portNumber(1))
162 .build();
Yi Tsenga64f0c82017-02-03 11:17:15 -0800163
164 // test case for first next objective
Yi Tsengb32f7742017-05-09 15:34:19 -0700165 checkNext(nextObjective, SIMPLE, expectTreatment, expectSelector, ADD);
Yi Tsenga64f0c82017-02-03 11:17:15 -0800166
167 // test case for first forwarding objective
Yi Tsengb32f7742017-05-09 15:34:19 -0700168 checkForward(forwardingObjective, ADD, expectSelector, nextObjective.id(), SPECIFIC);
Yi Tsenga64f0c82017-02-03 11:17:15 -0800169
170 /*
171 * Second set of objective
172 */
Yi Tsengb32f7742017-05-09 15:34:19 -0700173 forwardingObjective = (ForwardingObjective) objectives.get(2);
174 nextObjective = (NextObjective) objectives.get(3);
Yi Tsenga64f0c82017-02-03 11:17:15 -0800175
176
177 expectSelector = DefaultTrafficSelector.builder()
178 .matchInPort(PortNumber.portNumber(0))
179 .build();
180
Yi Tsenga64f0c82017-02-03 11:17:15 -0800181 // test case for second next objective
Yi Tsengb32f7742017-05-09 15:34:19 -0700182 checkNext(nextObjective, SIMPLE, expectTreatment, expectSelector, ADD);
Yi Tsenga64f0c82017-02-03 11:17:15 -0800183
184 // test case for second forwarding objective
Yi Tsengb32f7742017-05-09 15:34:19 -0700185 checkForward(forwardingObjective, ADD, expectSelector, nextObjective.id(), SPECIFIC);
Yi Tsenga64f0c82017-02-03 11:17:15 -0800186
187 /*
188 * 3rd set of objective
189 */
Yi Tsengb32f7742017-05-09 15:34:19 -0700190 forwardingObjective = (ForwardingObjective) objectives.get(4);
191 nextObjective = (NextObjective) objectives.get(5);
Yi Tsenga64f0c82017-02-03 11:17:15 -0800192 expectSelector = DefaultTrafficSelector.builder()
193 .matchInPort(PortNumber.portNumber(1))
194 .build();
195
Yi Tsenga64f0c82017-02-03 11:17:15 -0800196 // test case for 3rd next objective
Yi Tsengb32f7742017-05-09 15:34:19 -0700197 checkNext(nextObjective, SIMPLE, expectTreatment, expectSelector, ADD);
Yi Tsenga64f0c82017-02-03 11:17:15 -0800198
199 // test case for 3rd forwarding objective
Yi Tsengb32f7742017-05-09 15:34:19 -0700200 checkForward(forwardingObjective, ADD, expectSelector, nextObjective.id(), SPECIFIC);
Yi Tsenga64f0c82017-02-03 11:17:15 -0800201 }
202
203 /**
204 * Single point to multi point case. Scenario is the follow:
205 *
206 * -1 of1 2-1 of2 2--1 of3 2-
207 * 3
208 * `-1 of4 2-
209 *
210 * We test the proper compilation of sp2mp with trivial selector,
211 * empty treatment and points.
212 *
213 */
214 @Test
215 public void testFilteredConnectPointForSp() {
Yi Tsenga64f0c82017-02-03 11:17:15 -0800216 Set<Link> testLinks = ImmutableSet.of(
217 DefaultLink.builder().providerId(PID).src(of1p2).dst(of2p1).type(DIRECT).build(),
218 DefaultLink.builder().providerId(PID).src(of2p2).dst(of3p1).type(DIRECT).build(),
219 DefaultLink.builder().providerId(PID).src(of2p3).dst(of4p1).type(DIRECT).build()
220 );
221
222 Set<FilteredConnectPoint> ingress = ImmutableSet.of(
223 new FilteredConnectPoint(of1p1, vlan100Selector)
224 );
225
226 Set<FilteredConnectPoint> egress = ImmutableSet.of(
227 new FilteredConnectPoint(of3p2, vlan100Selector),
228 new FilteredConnectPoint(of4p2, vlan100Selector)
229 );
230
231 TrafficSelector broadcastSelector = DefaultTrafficSelector.builder()
232 .matchEthDst(MacAddress.BROADCAST)
233 .build();
234
235 LinkCollectionIntent intent = LinkCollectionIntent.builder()
236 .appId(appId)
237 .selector(broadcastSelector)
238 .treatment(treatment)
239 .links(testLinks)
240 .filteredIngressPoints(ingress)
241 .filteredEgressPoints(egress)
242 .applyTreatmentOnEgress(true)
243 .resourceGroup(resourceGroup1)
244 .build();
245
246 List<Intent> result = compiler.compile(intent, Collections.emptyList());
247 assertThat(result, hasSize(1));
248 assertThat(result.get(0), instanceOf(FlowObjectiveIntent.class));
249
250 FlowObjectiveIntent foIntent = (FlowObjectiveIntent) result.get(0);
251 List<Objective> objectives = foIntent.objectives();
252 assertThat(objectives, hasSize(12));
253
254 /*
255 * First set of objective
256 */
257 filteringObjective = (FilteringObjective) objectives.get(0);
258 forwardingObjective = (ForwardingObjective) objectives.get(1);
259 nextObjective = (NextObjective) objectives.get(2);
260
261 // expect selector and treatment
262 TrafficSelector expectSelector = DefaultTrafficSelector.builder()
263 .matchInPort(PortNumber.portNumber(1))
Yi Tsengb32f7742017-05-09 15:34:19 -0700264 .matchVlanId(VLAN_100)
Yi Tsenga64f0c82017-02-03 11:17:15 -0800265 .matchEthDst(MacAddress.BROADCAST)
266 .build();
Yi Tsengb32f7742017-05-09 15:34:19 -0700267 List<TrafficTreatment> expectTreatments = ImmutableList.of(
268 DefaultTrafficTreatment.builder()
269 .setOutput(PortNumber.portNumber(2))
270 .build()
271 );
Yi Tsenga64f0c82017-02-03 11:17:15 -0800272
273 PortCriterion inPortCriterion =
274 (PortCriterion) expectSelector.getCriterion(Criterion.Type.IN_PORT);
275
276 // test case for first filtering objective
Yi Tsengb32f7742017-05-09 15:34:19 -0700277 checkFiltering(filteringObjective, inPortCriterion, intent.priority(),
278 null, appId, true, vlan100Selector.criteria());
Yi Tsenga64f0c82017-02-03 11:17:15 -0800279
280 // test case for first next objective
Yi Tsengb32f7742017-05-09 15:34:19 -0700281 checkNext(nextObjective, BROADCAST, expectTreatments, expectSelector, ADD);
Yi Tsenga64f0c82017-02-03 11:17:15 -0800282
283 // test case for first forwarding objective
Yi Tsengb32f7742017-05-09 15:34:19 -0700284 checkForward(forwardingObjective, ADD, expectSelector, nextObjective.id(), SPECIFIC);
Yi Tsenga64f0c82017-02-03 11:17:15 -0800285
286 /*
287 * Second set of objective
288 */
289 filteringObjective = (FilteringObjective) objectives.get(3);
290 forwardingObjective = (ForwardingObjective) objectives.get(4);
291 nextObjective = (NextObjective) objectives.get(5);
292
293 inPortCriterion =
294 (PortCriterion) expectSelector.getCriterion(Criterion.Type.IN_PORT);
295
296 // test case for first filtering objective
Yi Tsengb32f7742017-05-09 15:34:19 -0700297 checkFiltering(filteringObjective, inPortCriterion, intent.priority(),
298 null, appId, true, vlan100Selector.criteria());
Yi Tsenga64f0c82017-02-03 11:17:15 -0800299
300 // test case for second next objective
Yi Tsengb32f7742017-05-09 15:34:19 -0700301 checkNext(nextObjective, BROADCAST, expectTreatments, expectSelector, ADD);
Yi Tsenga64f0c82017-02-03 11:17:15 -0800302
303 // test case for second forwarding objective
Yi Tsengb32f7742017-05-09 15:34:19 -0700304 checkForward(forwardingObjective, ADD, expectSelector, nextObjective.id(), SPECIFIC);
Yi Tsenga64f0c82017-02-03 11:17:15 -0800305
306 /*
307 * 3rd set of objective
308 */
309 filteringObjective = (FilteringObjective) objectives.get(6);
310 forwardingObjective = (ForwardingObjective) objectives.get(7);
311 nextObjective = (NextObjective) objectives.get(8);
312
313 inPortCriterion =
314 (PortCriterion) expectSelector.getCriterion(Criterion.Type.IN_PORT);
315
316 // test case for first filtering objective
Yi Tsengb32f7742017-05-09 15:34:19 -0700317 checkFiltering(filteringObjective, inPortCriterion, intent.priority(),
318 null, appId, true, vlan100Selector.criteria());
Yi Tsenga64f0c82017-02-03 11:17:15 -0800319
320 // test case for 3rd next objective
Yi Tsengb32f7742017-05-09 15:34:19 -0700321 checkNext(nextObjective, BROADCAST, expectTreatments, expectSelector, ADD);
Yi Tsenga64f0c82017-02-03 11:17:15 -0800322
323 // test case for 3rd forwarding objective
Yi Tsengb32f7742017-05-09 15:34:19 -0700324 checkForward(forwardingObjective, ADD, expectSelector, nextObjective.id(), SPECIFIC);
Yi Tsenga64f0c82017-02-03 11:17:15 -0800325
326 /*
327 * 4th set of objective
328 */
329 filteringObjective = (FilteringObjective) objectives.get(9);
330 forwardingObjective = (ForwardingObjective) objectives.get(10);
331 nextObjective = (NextObjective) objectives.get(11);
332
333 inPortCriterion =
334 (PortCriterion) expectSelector.getCriterion(Criterion.Type.IN_PORT);
335
336 // test case for first filtering objective
Yi Tsengb32f7742017-05-09 15:34:19 -0700337 checkFiltering(filteringObjective, inPortCriterion, intent.priority(),
338 null, appId, true, vlan100Selector.criteria());
Yi Tsenga64f0c82017-02-03 11:17:15 -0800339
340 // test case for 3rd next objective
Yi Tsengb32f7742017-05-09 15:34:19 -0700341 expectTreatments = ImmutableList.of(
342 DefaultTrafficTreatment.builder()
Yi Tsenga64f0c82017-02-03 11:17:15 -0800343 .setOutput(PortNumber.portNumber(2))
Yi Tsengb32f7742017-05-09 15:34:19 -0700344 .build(),
345 DefaultTrafficTreatment.builder()
Yi Tsenga64f0c82017-02-03 11:17:15 -0800346 .setOutput(PortNumber.portNumber(3))
Yi Tsengb32f7742017-05-09 15:34:19 -0700347 .build()
348 );
349 checkNext(nextObjective, BROADCAST, expectTreatments, expectSelector, ADD);
Yi Tsenga64f0c82017-02-03 11:17:15 -0800350
351 // test case for 3rd forwarding objective
Yi Tsengb32f7742017-05-09 15:34:19 -0700352 checkForward(forwardingObjective, ADD, expectSelector, nextObjective.id(), SPECIFIC);
Yi Tsenga64f0c82017-02-03 11:17:15 -0800353 }
354
355 /**
356 * Multi point to single point intent with filtered connect point.
357 * Scenario is the follow:
358 *
359 * -1 of1 2-1 of2 2-1 of4 2-
360 * 3
361 * -1 of3 2---/
362 *
363 */
364 @Test
365 public void testFilteredConnectPointForMp() {
Yi Tsenga64f0c82017-02-03 11:17:15 -0800366 Set<Link> testLinks = ImmutableSet.of(
367 DefaultLink.builder().providerId(PID).src(of1p2).dst(of2p1).type(DIRECT).build(),
368 DefaultLink.builder().providerId(PID).src(of3p2).dst(of2p3).type(DIRECT).build(),
369 DefaultLink.builder().providerId(PID).src(of2p2).dst(of4p1).type(DIRECT).build()
370 );
371
372 Set<FilteredConnectPoint> ingress = ImmutableSet.of(
373 new FilteredConnectPoint(of3p1, vlan100Selector),
374 new FilteredConnectPoint(of1p1, vlan100Selector)
375 );
376
377 Set<FilteredConnectPoint> egress = ImmutableSet.of(
378 new FilteredConnectPoint(of4p2, vlan100Selector)
379 );
380
Yi Tsenga64f0c82017-02-03 11:17:15 -0800381 LinkCollectionIntent intent = LinkCollectionIntent.builder()
382 .appId(appId)
383 .selector(ethDstSelector)
384 .treatment(treatment)
385 .links(testLinks)
386 .filteredIngressPoints(ingress)
387 .filteredEgressPoints(egress)
388 .build();
389
390 List<Intent> result = compiler.compile(intent, Collections.emptyList());
391 assertThat(result, hasSize(1));
392 assertThat(result.get(0), instanceOf(FlowObjectiveIntent.class));
393
394 FlowObjectiveIntent foIntent = (FlowObjectiveIntent) result.get(0);
395 List<Objective> objectives = foIntent.objectives();
396 assertThat(objectives, hasSize(15));
397
398 TrafficSelector expectSelector = DefaultTrafficSelector
399 .builder(ethDstSelector)
400 .matchInPort(PortNumber.portNumber(1))
Yi Tsengb32f7742017-05-09 15:34:19 -0700401 .matchVlanId(VLAN_100)
Yi Tsenga64f0c82017-02-03 11:17:15 -0800402 .build();
403
404 TrafficTreatment expectTreatment = DefaultTrafficTreatment.builder()
405 .setOutput(PortNumber.portNumber(2))
406 .build();
407
408 /*
409 * First set of objective
410 */
411 filteringObjective = (FilteringObjective) objectives.get(0);
412 forwardingObjective = (ForwardingObjective) objectives.get(1);
413 nextObjective = (NextObjective) objectives.get(2);
414
415 PortCriterion inPortCriterion =
416 (PortCriterion) expectSelector.getCriterion(Criterion.Type.IN_PORT);
417
418 // test case for first filtering objective
Yi Tsengb32f7742017-05-09 15:34:19 -0700419 checkFiltering(filteringObjective, inPortCriterion, intent.priority(),
420 null, appId, true, vlan100Selector.criteria());
Yi Tsenga64f0c82017-02-03 11:17:15 -0800421
422 // test case for first next objective
Yi Tsengb32f7742017-05-09 15:34:19 -0700423 checkNext(nextObjective, SIMPLE, expectTreatment, expectSelector, ADD);
Yi Tsenga64f0c82017-02-03 11:17:15 -0800424
425 // test case for first forwarding objective
Yi Tsengb32f7742017-05-09 15:34:19 -0700426 checkForward(forwardingObjective, ADD, expectSelector, nextObjective.id(), SPECIFIC);
Yi Tsenga64f0c82017-02-03 11:17:15 -0800427
428 /*
429 * Second set of objective
430 */
431 filteringObjective = (FilteringObjective) objectives.get(3);
432 forwardingObjective = (ForwardingObjective) objectives.get(4);
433 nextObjective = (NextObjective) objectives.get(5);
434
435 // test case for first filtering objective
Yi Tsengb32f7742017-05-09 15:34:19 -0700436 checkFiltering(filteringObjective, inPortCriterion, intent.priority(),
437 null, appId, true, vlan100Selector.criteria());
Yi Tsenga64f0c82017-02-03 11:17:15 -0800438
439 // test case for first next objective
Yi Tsengb32f7742017-05-09 15:34:19 -0700440 checkNext(nextObjective, SIMPLE, expectTreatment, expectSelector, ADD);
Yi Tsenga64f0c82017-02-03 11:17:15 -0800441
442 // test case for first forwarding objective
Yi Tsengb32f7742017-05-09 15:34:19 -0700443 checkForward(forwardingObjective, ADD, expectSelector, nextObjective.id(), SPECIFIC);
Yi Tsenga64f0c82017-02-03 11:17:15 -0800444
445 /*
446 * 3rd set of objective
447 */
448 filteringObjective = (FilteringObjective) objectives.get(6);
449 forwardingObjective = (ForwardingObjective) objectives.get(7);
450 nextObjective = (NextObjective) objectives.get(8);
451
452 // test case for first filtering objective
Yi Tsengb32f7742017-05-09 15:34:19 -0700453 checkFiltering(filteringObjective, inPortCriterion, intent.priority(),
454 null, appId, true, vlan100Selector.criteria());
Yi Tsenga64f0c82017-02-03 11:17:15 -0800455
456 // test case for first next objective
Yi Tsengb32f7742017-05-09 15:34:19 -0700457 checkNext(nextObjective, SIMPLE, expectTreatment, expectSelector, ADD);
Yi Tsenga64f0c82017-02-03 11:17:15 -0800458
459 // test case for first forwarding objective
Yi Tsengb32f7742017-05-09 15:34:19 -0700460 checkForward(forwardingObjective, ADD, expectSelector, nextObjective.id(), SPECIFIC);
Yi Tsenga64f0c82017-02-03 11:17:15 -0800461
462 /*
463 * 4th set of objective
464 */
465 filteringObjective = (FilteringObjective) objectives.get(9);
466 forwardingObjective = (ForwardingObjective) objectives.get(10);
467 nextObjective = (NextObjective) objectives.get(11);
468
469 // test case for first filtering objective
Yi Tsengb32f7742017-05-09 15:34:19 -0700470 checkFiltering(filteringObjective, inPortCriterion, intent.priority(),
471 null, appId, true, vlan100Selector.criteria());
Yi Tsenga64f0c82017-02-03 11:17:15 -0800472
473 // test case for first next objective
Yi Tsengb32f7742017-05-09 15:34:19 -0700474 checkNext(nextObjective, SIMPLE, expectTreatment, expectSelector, ADD);
Yi Tsenga64f0c82017-02-03 11:17:15 -0800475
476 // test case for first forwarding objective
Yi Tsengb32f7742017-05-09 15:34:19 -0700477 checkForward(forwardingObjective, ADD, expectSelector, nextObjective.id(), SPECIFIC);
Yi Tsenga64f0c82017-02-03 11:17:15 -0800478
479 /*
480 * 5th set of objective
481 */
482 filteringObjective = (FilteringObjective) objectives.get(12);
483 forwardingObjective = (ForwardingObjective) objectives.get(13);
484 nextObjective = (NextObjective) objectives.get(14);
485
486 expectSelector = DefaultTrafficSelector.builder(ethDstSelector)
Yi Tsengb32f7742017-05-09 15:34:19 -0700487 .matchVlanId(VLAN_100)
Yi Tsenga64f0c82017-02-03 11:17:15 -0800488 .matchInPort(PortNumber.portNumber(3))
489 .build();
490
491 inPortCriterion =
492 (PortCriterion) expectSelector.getCriterion(Criterion.Type.IN_PORT);
493
494 // test case for first filtering objective
Yi Tsengb32f7742017-05-09 15:34:19 -0700495 checkFiltering(filteringObjective, inPortCriterion, intent.priority(),
496 null, appId, true, vlan100Selector.criteria());
Yi Tsenga64f0c82017-02-03 11:17:15 -0800497
498 // test case for first next objective
Yi Tsengb32f7742017-05-09 15:34:19 -0700499 checkNext(nextObjective, SIMPLE, expectTreatment, expectSelector, ADD);
Yi Tsenga64f0c82017-02-03 11:17:15 -0800500
501 // test case for first forwarding objective
Yi Tsengb32f7742017-05-09 15:34:19 -0700502 checkForward(forwardingObjective, ADD, expectSelector, nextObjective.id(), SPECIFIC);
Yi Tsenga64f0c82017-02-03 11:17:15 -0800503 }
504
505 /**
506 * Multiple point to single point intent with only one switch.
507 * We test the proper compilation of mp2sp with
508 * trivial selector, trivial treatment and 1 hop.
509 */
510 @Test
511 public void singleHopTestForMp() {
Yi Tsenga64f0c82017-02-03 11:17:15 -0800512 Set<Link> testLinks = ImmutableSet.of();
513
514 Set<FilteredConnectPoint> ingress = ImmutableSet.of(
515 new FilteredConnectPoint(of1p1, vlan100Selector),
516 new FilteredConnectPoint(of1p2, vlan100Selector)
517 );
518
519 Set<FilteredConnectPoint> egress = ImmutableSet.of(
520 new FilteredConnectPoint(of1p3, vlan100Selector)
521 );
522
523
524 LinkCollectionIntent intent = LinkCollectionIntent.builder()
525 .appId(appId)
526 .selector(ethDstSelector)
527 .treatment(treatment)
528 .links(testLinks)
529 .filteredIngressPoints(ingress)
530 .filteredEgressPoints(egress)
531 .build();
532
533 List<Intent> result = compiler.compile(intent, Collections.emptyList());
534 assertThat(result, hasSize(1));
535 assertThat(result.get(0), instanceOf(FlowObjectiveIntent.class));
536
537 FlowObjectiveIntent foIntent = (FlowObjectiveIntent) result.get(0);
538 List<Objective> objectives = foIntent.objectives();
539 assertThat(objectives, hasSize(6));
540
541 TrafficSelector expectSelector = DefaultTrafficSelector
542 .builder(ethDstSelector)
543 .matchInPort(PortNumber.portNumber(1))
Yi Tsengb32f7742017-05-09 15:34:19 -0700544 .matchVlanId(VLAN_100)
Yi Tsenga64f0c82017-02-03 11:17:15 -0800545 .build();
546
547 TrafficTreatment expectTreatment = DefaultTrafficTreatment.builder()
548 .setOutput(PortNumber.portNumber(3))
549 .build();
550
551 /*
552 * First set of objective
553 */
554 filteringObjective = (FilteringObjective) objectives.get(0);
555 forwardingObjective = (ForwardingObjective) objectives.get(1);
556 nextObjective = (NextObjective) objectives.get(2);
557
558 PortCriterion inPortCriterion =
559 (PortCriterion) expectSelector.getCriterion(Criterion.Type.IN_PORT);
560
561 // test case for first filtering objective
Yi Tsengb32f7742017-05-09 15:34:19 -0700562 checkFiltering(filteringObjective, inPortCriterion, intent.priority(),
563 null, appId, true, vlan100Selector.criteria());
Yi Tsenga64f0c82017-02-03 11:17:15 -0800564
565 // test case for first next objective
Yi Tsengb32f7742017-05-09 15:34:19 -0700566 checkNext(nextObjective, SIMPLE, expectTreatment, expectSelector, ADD);
Yi Tsenga64f0c82017-02-03 11:17:15 -0800567
568 // test case for first forwarding objective
Yi Tsengb32f7742017-05-09 15:34:19 -0700569 checkForward(forwardingObjective, ADD, expectSelector, nextObjective.id(), SPECIFIC);
Yi Tsenga64f0c82017-02-03 11:17:15 -0800570
571 /*
572 * Second set of objective
573 */
574 filteringObjective = (FilteringObjective) objectives.get(3);
575 forwardingObjective = (ForwardingObjective) objectives.get(4);
576 nextObjective = (NextObjective) objectives.get(5);
577
578 expectSelector = DefaultTrafficSelector.builder(ethDstSelector)
579 .matchInPort(PortNumber.portNumber(2))
Yi Tsengb32f7742017-05-09 15:34:19 -0700580 .matchVlanId(VLAN_100)
Yi Tsenga64f0c82017-02-03 11:17:15 -0800581 .build();
582
583 inPortCriterion =
584 (PortCriterion) expectSelector.getCriterion(Criterion.Type.IN_PORT);
585
586 // test case for first filtering objective
Yi Tsengb32f7742017-05-09 15:34:19 -0700587 checkFiltering(filteringObjective, inPortCriterion, intent.priority(),
588 null, appId, true, vlan100Selector.criteria());
Yi Tsenga64f0c82017-02-03 11:17:15 -0800589
590 // test case for first next objective
Yi Tsengb32f7742017-05-09 15:34:19 -0700591 checkNext(nextObjective, SIMPLE, expectTreatment, expectSelector, ADD);
Yi Tsenga64f0c82017-02-03 11:17:15 -0800592
593 // test case for first forwarding objective
Yi Tsengb32f7742017-05-09 15:34:19 -0700594 checkForward(forwardingObjective, ADD, expectSelector, nextObjective.id(), SPECIFIC);
Yi Tsenga64f0c82017-02-03 11:17:15 -0800595 }
596
597 /**
598 * Single point to multiple point intent with only one switch.
599 * We test the proper compilation of sp2mp with
600 * trivial selector, trivial treatment and 1 hop.
601 */
602 @Test
603 public void singleHopTestForSp() {
Yi Tsenga64f0c82017-02-03 11:17:15 -0800604 Set<Link> testLinks = ImmutableSet.of();
605
606 Set<FilteredConnectPoint> ingress = ImmutableSet.of(
607 new FilteredConnectPoint(of1p1, vlan100Selector)
608 );
609
610 Set<FilteredConnectPoint> egress = ImmutableSet.of(
611 new FilteredConnectPoint(of1p2, vlan100Selector),
612 new FilteredConnectPoint(of1p3, vlan100Selector)
613 );
614
615
616 LinkCollectionIntent intent = LinkCollectionIntent.builder()
617 .appId(appId)
618 .selector(ethDstSelector)
619 .treatment(treatment)
620 .links(testLinks)
621 .filteredIngressPoints(ingress)
622 .filteredEgressPoints(egress)
623 .applyTreatmentOnEgress(true)
624 .resourceGroup(resourceGroup2)
625 .build();
626
627 List<Intent> result = compiler.compile(intent, Collections.emptyList());
628 assertThat(result, hasSize(1));
629 assertThat(result.get(0), instanceOf(FlowObjectiveIntent.class));
630
631 FlowObjectiveIntent foIntent = (FlowObjectiveIntent) result.get(0);
632 List<Objective> objectives = foIntent.objectives();
633 assertThat(objectives, hasSize(3));
634
635 TrafficSelector expectSelector = DefaultTrafficSelector
636 .builder(ethDstSelector)
637 .matchInPort(PortNumber.portNumber(1))
Yi Tsengb32f7742017-05-09 15:34:19 -0700638 .matchVlanId(VLAN_100)
Yi Tsenga64f0c82017-02-03 11:17:15 -0800639 .build();
640
Yi Tsengb32f7742017-05-09 15:34:19 -0700641 List<TrafficTreatment> expectTreatments = ImmutableList.of(
642 DefaultTrafficTreatment.builder()
643 .setOutput(PortNumber.portNumber(2))
644 .build(),
645 DefaultTrafficTreatment.builder()
646 .setOutput(PortNumber.portNumber(3))
647 .build()
648 );
Yi Tsenga64f0c82017-02-03 11:17:15 -0800649
650 /*
651 * First set of objective
652 */
653 filteringObjective = (FilteringObjective) objectives.get(0);
654 forwardingObjective = (ForwardingObjective) objectives.get(1);
655 nextObjective = (NextObjective) objectives.get(2);
656
657 PortCriterion inPortCriterion =
658 (PortCriterion) expectSelector.getCriterion(Criterion.Type.IN_PORT);
659
660 // test case for first filtering objective
Yi Tsengb32f7742017-05-09 15:34:19 -0700661 checkFiltering(filteringObjective, inPortCriterion, intent.priority(),
662 null, appId, true, vlan100Selector.criteria());
Yi Tsenga64f0c82017-02-03 11:17:15 -0800663
664 // test case for first next objective
Yi Tsengb32f7742017-05-09 15:34:19 -0700665 checkNext(nextObjective, BROADCAST, expectTreatments, expectSelector, ADD);
Yi Tsenga64f0c82017-02-03 11:17:15 -0800666
667 // test case for first forwarding objective
Yi Tsengb32f7742017-05-09 15:34:19 -0700668 checkForward(forwardingObjective, ADD, expectSelector, nextObjective.id(), SPECIFIC);
Yi Tsenga64f0c82017-02-03 11:17:15 -0800669 }
670
Yi Tsengb32f7742017-05-09 15:34:19 -0700671 /**
672 * Single point to multi point case. Scenario is the follow:
673 *
674 * -1 of1 2-1 of2 2--1 of3 2-
675 * 3
676 * `-1 of4 2-
677 *
678 * We test the proper compilation constraint of sp2mp
679 * with encapsulation, trivial selector, empty treatment and points.
680 */
681 @Test
682 public void testFilteredConnectPointForSpWithEncap() throws Exception {
683 LinkCollectionCompiler.labelAllocator.setLabelSelection(LABEL_SELECTION);
684 Set<Link> testLinks = ImmutableSet.of(
685 DefaultLink.builder().providerId(PID).src(of1p2).dst(of2p1).type(DIRECT).build(),
686 DefaultLink.builder().providerId(PID).src(of2p2).dst(of3p1).type(DIRECT).build(),
687 DefaultLink.builder().providerId(PID).src(of2p3).dst(of4p1).type(DIRECT).build()
688 );
Yi Tsenga64f0c82017-02-03 11:17:15 -0800689
Yi Tsengb32f7742017-05-09 15:34:19 -0700690 Set<FilteredConnectPoint> ingress = ImmutableSet.of(
691 new FilteredConnectPoint(of1p1, vlan100Selector)
692 );
693
694 Set<FilteredConnectPoint> egress = ImmutableSet.of(
695 new FilteredConnectPoint(of3p2, vlan100Selector),
696 new FilteredConnectPoint(of4p2, vlan100Selector)
697 );
698
699 TrafficSelector broadcastSelector = DefaultTrafficSelector.builder()
700 .matchEthDst(MacAddress.BROADCAST)
701 .build();
702
703 EncapsulationConstraint constraint = new EncapsulationConstraint(EncapsulationType.VLAN);
704 LinkCollectionIntent intent = LinkCollectionIntent.builder()
705 .appId(appId)
706 .selector(broadcastSelector)
707 .treatment(treatment)
708 .links(testLinks)
709 .filteredIngressPoints(ingress)
710 .filteredEgressPoints(egress)
711 .applyTreatmentOnEgress(true)
712 .resourceGroup(resourceGroup1)
713 .constraints(ImmutableList.of(constraint))
714 .build();
715
716 List<Intent> result = compiler.compile(intent, Collections.emptyList());
717 assertThat(result, hasSize(1));
718 assertThat(result.get(0), instanceOf(FlowObjectiveIntent.class));
719
720 FlowObjectiveIntent foIntent = (FlowObjectiveIntent) result.get(0);
721 List<Objective> objectives = foIntent.objectives();
722 assertThat(objectives, hasSize(12));
723
724 /*
725 * First set of objective
726 */
727 filteringObjective = (FilteringObjective) objectives.get(0);
728 forwardingObjective = (ForwardingObjective) objectives.get(1);
729 nextObjective = (NextObjective) objectives.get(2);
730
731 // expect selector and treatment
732 TrafficSelector expectSelector = DefaultTrafficSelector.builder()
733 .matchInPort(PortNumber.portNumber(1))
734 .matchVlanId(VLAN_100)
735 .matchEthDst(MacAddress.BROADCAST)
736 .build();
737 List<TrafficTreatment> expectTreatments = ImmutableList.of(
738 DefaultTrafficTreatment.builder()
739 .setVlanId(VLAN_1)
740 .setOutput(PortNumber.portNumber(2))
741 .build()
742 );
743 TrafficSelector filteringSelector = vlan100Selector;
744 PortCriterion inPortCriterion =
745 (PortCriterion) expectSelector.getCriterion(Criterion.Type.IN_PORT);
746
747 // test case for first filtering objective
748 checkFiltering(filteringObjective, inPortCriterion, intent.priority(),
749 null, appId, true, filteringSelector.criteria());
750
751 // test case for first next objective
752 checkNext(nextObjective, BROADCAST, expectTreatments, expectSelector, ADD);
753
754 // test case for first forwarding objective
755 checkForward(forwardingObjective, ADD, expectSelector, nextObjective.id(), SPECIFIC);
756
757 /*
758 * Second set of objective
759 */
760 filteringObjective = (FilteringObjective) objectives.get(3);
761 forwardingObjective = (ForwardingObjective) objectives.get(4);
762 nextObjective = (NextObjective) objectives.get(5);
763 expectSelector = DefaultTrafficSelector.builder()
764 .matchInPort(PortNumber.portNumber(1))
765 .matchVlanId(VLAN_1)
766 .build();
767 expectTreatments = ImmutableList.of(
768 DefaultTrafficTreatment.builder()
769 .setVlanId(VLAN_100)
770 .setOutput(PortNumber.portNumber(2))
771 .build()
772 );
773 filteringSelector = vlan1Selector;
774 inPortCriterion =
775 (PortCriterion) expectSelector.getCriterion(Criterion.Type.IN_PORT);
776
777 // test case for first filtering objective
778 checkFiltering(filteringObjective, inPortCriterion, intent.priority(),
779 null, appId, true, filteringSelector.criteria());
780
781 // test case for second next objective
782 checkNext(nextObjective, BROADCAST, expectTreatments, expectSelector, ADD);
783
784 // test case for second forwarding objective
785 checkForward(forwardingObjective, ADD, expectSelector, nextObjective.id(), SPECIFIC);
786
787 /*
788 * 3rd set of objective
789 */
790 filteringObjective = (FilteringObjective) objectives.get(6);
791 forwardingObjective = (ForwardingObjective) objectives.get(7);
792 nextObjective = (NextObjective) objectives.get(8);
793 inPortCriterion =
794 (PortCriterion) expectSelector.getCriterion(Criterion.Type.IN_PORT);
795
796 // test case for first filtering objective
797 checkFiltering(filteringObjective, inPortCriterion, intent.priority(),
798 null, appId, true, filteringSelector.criteria());
799
800 // test case for 3rd next objective
801 checkNext(nextObjective, BROADCAST, expectTreatments, expectSelector, ADD);
802
803 // test case for 3rd forwarding objective
804 checkForward(forwardingObjective, ADD, expectSelector, nextObjective.id(), SPECIFIC);
805
806 /*
807 * 4th set of objective
808 */
809 filteringObjective = (FilteringObjective) objectives.get(9);
810 forwardingObjective = (ForwardingObjective) objectives.get(10);
811 nextObjective = (NextObjective) objectives.get(11);
812
813 inPortCriterion =
814 (PortCriterion) expectSelector.getCriterion(Criterion.Type.IN_PORT);
815
816 // test case for first filtering objective
817 checkFiltering(filteringObjective, inPortCriterion, intent.priority(),
818 null, appId, true, filteringSelector.criteria());
819
820 // test case for 3rd next objective
821 expectTreatments = ImmutableList.of(
822 DefaultTrafficTreatment.builder()
823 .setVlanId(VLAN_1)
824 .setOutput(PortNumber.portNumber(2))
825 .build(),
826 DefaultTrafficTreatment.builder()
827 .setVlanId(VLAN_1)
828 .setOutput(PortNumber.portNumber(3))
829 .build()
830 );
831 checkNext(nextObjective, BROADCAST, expectTreatments, expectSelector, ADD);
832
833 // test case for 3rd forwarding objective
834 checkForward(forwardingObjective, ADD, expectSelector, nextObjective.id(), SPECIFIC);
835 }
836
837 /**
838 * Multi point to single point intent with filtered connect point.
839 * Scenario is the follow:
840 *
841 * -1 of1 2-1 of2 2-1 of4 2-
842 * 3
843 * -1 of3 2---/
844 * We test the proper compilation constraint of mp2sp
845 * with encapsulation, trivial selector, empty treatment and points.
846 */
847 @Test
848 public void testFilteredConnectPointForMpWithEncap() throws Exception {
849 LinkCollectionCompiler.labelAllocator.setLabelSelection(LABEL_SELECTION);
850 Set<Link> testLinks = ImmutableSet.of(
851 DefaultLink.builder().providerId(PID).src(of1p2).dst(of2p1).type(DIRECT).build(),
852 DefaultLink.builder().providerId(PID).src(of3p2).dst(of2p3).type(DIRECT).build(),
853 DefaultLink.builder().providerId(PID).src(of2p2).dst(of4p1).type(DIRECT).build()
854 );
855 Set<FilteredConnectPoint> ingress = ImmutableSet.of(
856 new FilteredConnectPoint(of3p1, vlan100Selector),
857 new FilteredConnectPoint(of1p1, vlan100Selector)
858 );
859 Set<FilteredConnectPoint> egress = ImmutableSet.of(
860 new FilteredConnectPoint(of4p2, vlan100Selector)
861 );
862 EncapsulationConstraint constraint = new EncapsulationConstraint(EncapsulationType.VLAN);
863 LinkCollectionIntent intent = LinkCollectionIntent.builder()
864 .appId(appId)
865 .selector(ethDstSelector)
866 .treatment(treatment)
867 .links(testLinks)
868 .filteredIngressPoints(ingress)
869 .filteredEgressPoints(egress)
870 .constraints(ImmutableList.of(constraint))
871 .build();
872 List<Intent> result = compiler.compile(intent, Collections.emptyList());
873 assertThat(result, hasSize(1));
874 assertThat(result.get(0), instanceOf(FlowObjectiveIntent.class));
875 FlowObjectiveIntent foIntent = (FlowObjectiveIntent) result.get(0);
876 List<Objective> objectives = foIntent.objectives();
877 assertThat(objectives, hasSize(15));
878 TrafficSelector expectSelector = DefaultTrafficSelector
879 .builder(ethDstSelector)
880 .matchInPort(PortNumber.portNumber(1))
881 .matchVlanId(VLAN_100)
882 .build();
883 TrafficSelector filteringSelector = vlan100Selector;
884 TrafficTreatment expectTreatment = DefaultTrafficTreatment.builder()
885 .setVlanId(VLAN_1)
886 .setOutput(PortNumber.portNumber(2))
887 .build();
888 /*
889 * First set of objective
890 */
891 filteringObjective = (FilteringObjective) objectives.get(0);
892 forwardingObjective = (ForwardingObjective) objectives.get(1);
893 nextObjective = (NextObjective) objectives.get(2);
894 PortCriterion inPortCriterion =
895 (PortCriterion) expectSelector.getCriterion(Criterion.Type.IN_PORT);
896 // test case for first filtering objective
897 checkFiltering(filteringObjective, inPortCriterion, intent.priority(),
898 null, appId, true, filteringSelector.criteria());
899 // test case for first next objective
900 checkNext(nextObjective, SIMPLE, expectTreatment, expectSelector, ADD);
901 // test case for first forwarding objective
902 checkForward(forwardingObjective, ADD, expectSelector, nextObjective.id(), SPECIFIC);
903 /*
904 * Second set of objective
905 */
906 filteringObjective = (FilteringObjective) objectives.get(3);
907 forwardingObjective = (ForwardingObjective) objectives.get(4);
908 nextObjective = (NextObjective) objectives.get(5);
909 expectSelector = DefaultTrafficSelector
910 .builder()
911 .matchInPort(PortNumber.portNumber(1))
912 .matchVlanId(VLAN_1)
913 .build();
914 filteringSelector = vlan1Selector;
915 expectTreatment = DefaultTrafficTreatment
916 .builder()
917 .setVlanId(VLAN_100)
918 .setOutput(PortNumber.portNumber(2))
919 .build();
920 // test case for second filtering objective
921 checkFiltering(filteringObjective, inPortCriterion, intent.priority(),
922 null, appId, true, filteringSelector.criteria());
923 // test case for second next objective
924 checkNext(nextObjective, SIMPLE, expectTreatment, expectSelector, ADD);
925 // test case for second forwarding objective
926 checkForward(forwardingObjective, ADD, expectSelector, nextObjective.id(), SPECIFIC);
927 /*
928 * 3rd set of objective
929 */
930 filteringObjective = (FilteringObjective) objectives.get(6);
931 forwardingObjective = (ForwardingObjective) objectives.get(7);
932 nextObjective = (NextObjective) objectives.get(8);
933 filteringSelector = vlan100Selector;
934 expectTreatment = DefaultTrafficTreatment
935 .builder()
936 .setVlanId(VLAN_1)
937 .setOutput(PortNumber.portNumber(2))
938 .build();
939 expectSelector = DefaultTrafficSelector
940 .builder(ethDstSelector)
941 .matchInPort(PortNumber.portNumber(1))
942 .matchVlanId(VLAN_100)
943 .build();
944 // test case for 3rd filtering objective
945 checkFiltering(filteringObjective, inPortCriterion, intent.priority(),
946 null, appId, true, filteringSelector.criteria());
947 // test case for 3rd next objective
948 checkNext(nextObjective, SIMPLE, expectTreatment, expectSelector, ADD);
949 // test case for 3rd forwarding objective
950 checkForward(forwardingObjective, ADD, expectSelector, nextObjective.id(), SPECIFIC);
951 /*
952 * 4th set of objective
953 */
954 filteringObjective = (FilteringObjective) objectives.get(9);
955 forwardingObjective = (ForwardingObjective) objectives.get(10);
956 nextObjective = (NextObjective) objectives.get(11);
957 filteringSelector = vlan1Selector;
958 expectSelector = DefaultTrafficSelector
959 .builder()
960 .matchInPort(PortNumber.portNumber(1))
961 .matchVlanId(VLAN_1)
962 .build();
963 // test case for 4th filtering objective
964 checkFiltering(filteringObjective, inPortCriterion, intent.priority(),
965 null, appId, true, filteringSelector.criteria());
966 // test case for 4th next objective
967 checkNext(nextObjective, SIMPLE, expectTreatment, expectSelector, ADD);
968 // test case for 4th forwarding objective
969 checkForward(forwardingObjective, ADD, expectSelector, nextObjective.id(), SPECIFIC);
970
971 /*
972 * 5th set of objective
973 */
974 filteringObjective = (FilteringObjective) objectives.get(12);
975 forwardingObjective = (ForwardingObjective) objectives.get(13);
976 nextObjective = (NextObjective) objectives.get(14);
977 expectSelector = DefaultTrafficSelector.builder()
978 .matchVlanId(VlanId.vlanId("1"))
979 .matchInPort(PortNumber.portNumber(3))
980 .build();
981 inPortCriterion =
982 (PortCriterion) expectSelector.getCriterion(Criterion.Type.IN_PORT);
983 // test case for 5th filtering objective
984 checkFiltering(filteringObjective, inPortCriterion, intent.priority(),
985 null, appId, true, filteringSelector.criteria());
986 // test case for 5th next objective
987 checkNext(nextObjective, SIMPLE, expectTreatment, expectSelector, ADD);
988 // test case for 5th forwarding objective
989 checkForward(forwardingObjective, ADD, expectSelector,
990 nextObjective.id(), SPECIFIC);
991 }
992
993 private void checkFiltering(FilteringObjective filteringObjective,
994 Criterion key,
995 int priority,
996 TrafficSelector meta,
997 ApplicationId appId,
998 boolean permanent,
999 Collection<Criterion> conditions) {
1000 conditions = ImmutableList.copyOf(conditions);
1001 assertThat(filteringObjective.key(), is(key));
1002 assertThat(filteringObjective.priority(), is(priority));
1003 assertThat(filteringObjective.meta(), is(meta));
1004 assertThat(filteringObjective.appId(), is(appId));
1005 assertThat(filteringObjective.permanent(), is(permanent));
1006 assertThat(filteringObjective.conditions(), is(conditions));
1007 }
1008
1009 private void checkNext(NextObjective nextObjective,
1010 NextObjective.Type type,
1011 TrafficTreatment next,
1012 TrafficSelector meta,
1013 Objective.Operation op) {
1014 checkNext(nextObjective, type, ImmutableList.of(next), meta, op);
1015 }
1016
1017 private void checkNext(NextObjective nextObjective,
1018 NextObjective.Type type,
1019 Collection<TrafficTreatment> next,
1020 TrafficSelector meta,
1021 Objective.Operation op) {
1022 assertThat(nextObjective.type(), is(type));
1023 assertThat(nextObjective.next().size(), is(next.size()));
1024 assertThat(nextObjective.next().containsAll(next), is(true));
1025 assertThat(nextObjective.meta(), is(meta));
1026 assertThat(nextObjective.op(), is(op));
1027 }
1028
1029 private void checkForward(ForwardingObjective forwardingObjective,
1030 Objective.Operation op,
1031 TrafficSelector selector,
1032 int nextId,
1033 ForwardingObjective.Flag flag) {
1034 assertThat(forwardingObjective.op(), is(op));
1035 assertThat(forwardingObjective.selector(), is(selector));
1036 assertThat(forwardingObjective.nextId(), is(nextId));
1037 assertThat(forwardingObjective.flag(), is(flag));
1038 }
Yi Tsenga64f0c82017-02-03 11:17:15 -08001039}