blob: 45e84850a201ab5a84c94385f09e8f5122e24513 [file] [log] [blame]
Sho SHIMIZUee2aa652015-02-25 18:56:43 -08001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2015-present Open Networking Laboratory
Sho SHIMIZUee2aa652015-02-25 18:56:43 -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
18import com.google.common.collect.ImmutableSet;
Pier Ventre766995d2016-10-05 22:15:56 -070019import org.hamcrest.core.Is;
Sho SHIMIZUee2aa652015-02-25 18:56:43 -080020import org.junit.After;
21import org.junit.Before;
22import org.junit.Test;
Yi Tseng2a81c9d2016-09-14 10:14:24 -070023import org.onlab.packet.MacAddress;
Pier Ventre647138f2016-08-26 17:32:44 -070024import org.onlab.packet.VlanId;
Thomas Vachuskabdbdd242016-03-01 01:55:55 -080025import org.onosproject.cfg.ComponentConfigAdapter;
Sho SHIMIZUee2aa652015-02-25 18:56:43 -080026import org.onosproject.core.CoreService;
Sho SHIMIZUee2aa652015-02-25 18:56:43 -080027import org.onosproject.net.ConnectPoint;
28import org.onosproject.net.DefaultLink;
Yi Tseng2a81c9d2016-09-14 10:14:24 -070029import org.onosproject.net.FilteredConnectPoint;
Sho SHIMIZUee2aa652015-02-25 18:56:43 -080030import org.onosproject.net.Link;
Yi Tseng2a81c9d2016-09-14 10:14:24 -070031import org.onosproject.net.PortNumber;
Sho SHIMIZUee2aa652015-02-25 18:56:43 -080032import org.onosproject.net.flow.DefaultTrafficSelector;
33import org.onosproject.net.flow.DefaultTrafficTreatment;
34import org.onosproject.net.flow.FlowRule;
35import org.onosproject.net.flow.TrafficSelector;
36import org.onosproject.net.flow.TrafficTreatment;
Pier Ventre766995d2016-10-05 22:15:56 -070037import org.onosproject.net.flow.criteria.MplsCriterion;
38import org.onosproject.net.flow.criteria.PortCriterion;
39import org.onosproject.net.flow.criteria.VlanIdCriterion;
Sho SHIMIZUee2aa652015-02-25 18:56:43 -080040import org.onosproject.net.intent.FlowRuleIntent;
41import org.onosproject.net.intent.Intent;
42import org.onosproject.net.intent.IntentExtensionService;
43import org.onosproject.net.intent.LinkCollectionIntent;
Sho SHIMIZUee2aa652015-02-25 18:56:43 -080044
45import java.util.Collection;
46import java.util.Collections;
47import java.util.List;
48import java.util.Set;
Pier Ventre647138f2016-08-26 17:32:44 -070049import java.util.stream.Collectors;
Sho SHIMIZUee2aa652015-02-25 18:56:43 -080050
51import static org.easymock.EasyMock.createMock;
52import static org.easymock.EasyMock.expect;
53import static org.easymock.EasyMock.replay;
Yi Tseng2a81c9d2016-09-14 10:14:24 -070054import static org.hamcrest.CoreMatchers.instanceOf;
55import static org.hamcrest.CoreMatchers.notNullValue;
Sho SHIMIZUee2aa652015-02-25 18:56:43 -080056import static org.hamcrest.MatcherAssert.assertThat;
Yuta HIGUCHI652f27f2016-10-31 16:54:30 -070057import static org.hamcrest.Matchers.everyItem;
Sho SHIMIZUee2aa652015-02-25 18:56:43 -080058import static org.hamcrest.Matchers.hasSize;
59import static org.hamcrest.Matchers.is;
Pier Ventre766995d2016-10-05 22:15:56 -070060import static org.onlab.packet.EthType.EtherType.IPV4;
Sho SHIMIZUee2aa652015-02-25 18:56:43 -080061import static org.onosproject.net.Link.Type.DIRECT;
Yi Tseng2a81c9d2016-09-14 10:14:24 -070062import static org.onosproject.net.NetTestTools.*;
Pier Ventre766995d2016-10-05 22:15:56 -070063import static org.onosproject.net.flow.criteria.Criterion.Type.IN_PORT;
64import static org.onosproject.net.flow.criteria.Criterion.Type.MPLS_LABEL;
65import static org.onosproject.net.flow.criteria.Criterion.Type.VLAN_VID;
66import static org.onosproject.net.flow.instructions.L2ModificationInstruction.*;
Sho SHIMIZUee2aa652015-02-25 18:56:43 -080067
Pier Ventre5c4a0762016-11-21 10:28:13 -080068/**
69 * This set of tests are meant to test the LinkCollectionIntent
70 * compiler.
71 */
Pier Ventre766995d2016-10-05 22:15:56 -070072public class LinkCollectionIntentCompilerTest extends AbstractLinkCollectionTest {
Yi Tseng2a81c9d2016-09-14 10:14:24 -070073
Sho SHIMIZUee2aa652015-02-25 18:56:43 -080074 @Before
Brian O'Connor81134662015-06-25 17:23:33 -040075 public void setUp() {
Sho SHIMIZUee2aa652015-02-25 18:56:43 -080076 sut = new LinkCollectionIntentCompiler();
77 coreService = createMock(CoreService.class);
78 expect(coreService.registerApplication("org.onosproject.net.intent"))
79 .andReturn(appId);
80 sut.coreService = coreService;
81
82 Intent.bindIdGenerator(idGenerator);
83
84 intent = LinkCollectionIntent.builder()
85 .appId(APP_ID)
86 .selector(selector)
87 .treatment(treatment)
88 .links(links)
89 .ingressPoints(ImmutableSet.of(d1p1))
90 .egressPoints(ImmutableSet.of(d3p1))
91 .build();
Pier Ventre647138f2016-08-26 17:32:44 -070092
Sho SHIMIZUee2aa652015-02-25 18:56:43 -080093 intentExtensionService = createMock(IntentExtensionService.class);
94 intentExtensionService.registerCompiler(LinkCollectionIntent.class, sut);
95 intentExtensionService.unregisterCompiler(LinkCollectionIntent.class);
Thomas Vachuskabdbdd242016-03-01 01:55:55 -080096
97 registrator = new IntentConfigurableRegistrator();
98 registrator.extensionService = intentExtensionService;
99 registrator.cfgService = new ComponentConfigAdapter();
100 registrator.activate();
101
102 sut.registrator = registrator;
Sho SHIMIZUee2aa652015-02-25 18:56:43 -0800103
Pier Ventre81c47bf2016-11-04 07:26:22 -0700104 LinkCollectionCompiler.optimize = false;
105 LinkCollectionCompiler.copyTtl = false;
Yi Tseng2a81c9d2016-09-14 10:14:24 -0700106
Pier Ventre81c47bf2016-11-04 07:26:22 -0700107 replay(coreService, intentExtensionService);
Yi Tseng2a81c9d2016-09-14 10:14:24 -0700108
Sho SHIMIZUee2aa652015-02-25 18:56:43 -0800109 }
110
111 @After
112 public void tearDown() {
Yi Tseng2a81c9d2016-09-14 10:14:24 -0700113
Sho SHIMIZUee2aa652015-02-25 18:56:43 -0800114 Intent.unbindIdGenerator(idGenerator);
115 }
116
Pier Ventre5c4a0762016-11-21 10:28:13 -0800117 /**
118 * We test the proper compilation of a simple link collection intent
119 * with connect points, trivial treatment and trivial selector.
120 */
Sho SHIMIZUee2aa652015-02-25 18:56:43 -0800121 @Test
122 public void testCompile() {
123 sut.activate();
124
Sho SHIMIZUec07ffd2016-02-22 20:45:21 -0800125 List<Intent> compiled = sut.compile(intent, Collections.emptyList());
Sho SHIMIZUee2aa652015-02-25 18:56:43 -0800126 assertThat(compiled, hasSize(1));
127
Yuta HIGUCHI652f27f2016-10-31 16:54:30 -0700128 assertThat("key is inherited",
129 compiled.stream().map(Intent::key).collect(Collectors.toList()),
130 everyItem(is(intent.key())));
131
132
Sho SHIMIZUee2aa652015-02-25 18:56:43 -0800133 Collection<FlowRule> rules = ((FlowRuleIntent) compiled.get(0)).flowRules();
134 assertThat(rules, hasSize(links.size()));
135
136 // if not found, get() raises an exception
137 FlowRule rule1 = rules.stream()
Pier Ventre766995d2016-10-05 22:15:56 -0700138 .filter(rule -> rule.deviceId().equals(d1p10.deviceId()))
Sho SHIMIZUee2aa652015-02-25 18:56:43 -0800139 .findFirst()
140 .get();
141 assertThat(rule1.selector(), is(
142 DefaultTrafficSelector.builder(intent.selector()).matchInPort(d1p1.port()).build()
143 ));
144 assertThat(rule1.treatment(), is(
145 DefaultTrafficTreatment.builder(intent.treatment()).setOutput(d1p1.port()).build()
146 ));
Brian O'Connor81134662015-06-25 17:23:33 -0400147 assertThat(rule1.priority(), is(intent.priority()));
Sho SHIMIZUee2aa652015-02-25 18:56:43 -0800148
149 FlowRule rule2 = rules.stream()
150 .filter(rule -> rule.deviceId().equals(d2p0.deviceId()))
151 .findFirst()
152 .get();
153 assertThat(rule2.selector(), is(
154 DefaultTrafficSelector.builder(intent.selector()).matchInPort(d2p0.port()).build()
155 ));
156 assertThat(rule2.treatment(), is(
157 DefaultTrafficTreatment.builder().setOutput(d2p1.port()).build()
158 ));
Brian O'Connor81134662015-06-25 17:23:33 -0400159 assertThat(rule2.priority(), is(intent.priority()));
Sho SHIMIZUee2aa652015-02-25 18:56:43 -0800160
161 FlowRule rule3 = rules.stream()
162 .filter(rule -> rule.deviceId().equals(d3p0.deviceId()))
163 .findFirst()
164 .get();
165 assertThat(rule3.selector(), is(
166 DefaultTrafficSelector.builder(intent.selector()).matchInPort(d3p1.port()).build()
167 ));
168 assertThat(rule3.treatment(), is(
169 DefaultTrafficTreatment.builder().setOutput(d3p1.port()).build()
170 ));
Brian O'Connor81134662015-06-25 17:23:33 -0400171 assertThat(rule3.priority(), is(intent.priority()));
Sho SHIMIZUee2aa652015-02-25 18:56:43 -0800172
173 sut.deactivate();
174 }
Pier Ventre647138f2016-08-26 17:32:44 -0700175
Yi Tseng2a81c9d2016-09-14 10:14:24 -0700176 /**
Pier Ventre5c4a0762016-11-21 10:28:13 -0800177 * Single point to multi point case. Scenario is the follow:
178 *
Yi Tseng2a81c9d2016-09-14 10:14:24 -0700179 * -1 of1 2-1 of2 2--1 of3 2-
180 * 3
181 * `-1 of4 2-
Pier Ventre5c4a0762016-11-21 10:28:13 -0800182 *
183 * We test the proper compilation of sp2mp with trivial selector,
184 * trivial treatment and different filtered points
Yi Tseng2a81c9d2016-09-14 10:14:24 -0700185 */
186 @Test
Pier Ventre766995d2016-10-05 22:15:56 -0700187 public void testFilteredConnectPointForSp() {
Pier Ventre647138f2016-08-26 17:32:44 -0700188 sut.activate();
Yi Tseng2a81c9d2016-09-14 10:14:24 -0700189 Set<Link> testLinks = ImmutableSet.of(
190 DefaultLink.builder().providerId(PID).src(of1p2).dst(of2p1).type(DIRECT).build(),
191 DefaultLink.builder().providerId(PID).src(of2p2).dst(of3p1).type(DIRECT).build(),
192 DefaultLink.builder().providerId(PID).src(of2p3).dst(of4p1).type(DIRECT).build()
193 );
Pier Ventre647138f2016-08-26 17:32:44 -0700194
Yi Tseng2a81c9d2016-09-14 10:14:24 -0700195 TrafficSelector expectOf1Selector = DefaultTrafficSelector.builder(vlan100Selector)
196 .matchInPort(PortNumber.portNumber(1))
197 .build();
198
199 TrafficTreatment expectOf1Treatment = DefaultTrafficTreatment.builder()
200 .setOutput(PortNumber.portNumber(2))
201 .build();
202
203 TrafficSelector expectOf2Selector = DefaultTrafficSelector.builder(vlan100Selector)
204 .matchInPort(PortNumber.portNumber(1))
205 .build();
206
207 TrafficTreatment expectOf2Treatment = DefaultTrafficTreatment.builder()
208 .setOutput(PortNumber.portNumber(2))
209 .setOutput(PortNumber.portNumber(3))
210 .build();
211
212 TrafficSelector expectOf3Selector = DefaultTrafficSelector.builder(vlan100Selector)
213 .matchInPort(PortNumber.portNumber(1))
214 .build();
215
216 TrafficTreatment expectOf3Treatment = DefaultTrafficTreatment.builder()
217 .setOutput(PortNumber.portNumber(2))
218 .build();
219
220 TrafficSelector expectOf4Selector = DefaultTrafficSelector.builder(vlan100Selector)
221 .matchInPort(PortNumber.portNumber(1))
222 .build();
223
224 TrafficTreatment expectOf4Treatment = DefaultTrafficTreatment.builder()
225 .setVlanId(VlanId.vlanId("200"))
226 .setOutput(PortNumber.portNumber(2))
227 .build();
Pier Ventre647138f2016-08-26 17:32:44 -0700228
229
Pier Ventre647138f2016-08-26 17:32:44 -0700230
Yi Tseng2a81c9d2016-09-14 10:14:24 -0700231 Set<FilteredConnectPoint> ingress = ImmutableSet.of(
232 new FilteredConnectPoint(of1p1, vlan100Selector)
233 );
Pier Ventre647138f2016-08-26 17:32:44 -0700234
Yi Tseng2a81c9d2016-09-14 10:14:24 -0700235 Set<FilteredConnectPoint> egress = ImmutableSet.of(
236 new FilteredConnectPoint(of3p2, vlan100Selector),
237 new FilteredConnectPoint(of4p2, vlan200Selector)
238 );
Pier Ventre647138f2016-08-26 17:32:44 -0700239
Yi Tseng2a81c9d2016-09-14 10:14:24 -0700240 intent = LinkCollectionIntent.builder()
241 .appId(APP_ID)
242 .filteredIngressPoints(ingress)
243 .filteredEgressPoints(egress)
244 .treatment(treatment)
245 .applyTreatmentOnEgress(true)
246 .links(testLinks)
247 .build();
Pier Ventre647138f2016-08-26 17:32:44 -0700248
Yi Tseng2a81c9d2016-09-14 10:14:24 -0700249 assertThat(sut, is(notNullValue()));
Pier Ventre647138f2016-08-26 17:32:44 -0700250
Yi Tseng2a81c9d2016-09-14 10:14:24 -0700251 List<Intent> result = sut.compile(intent, Collections.emptyList());
252
253 assertThat(result, is(notNullValue()));
254 assertThat(result, hasSize(1));
255
256 Intent resultIntent = result.get(0);
257 assertThat(resultIntent, instanceOf(FlowRuleIntent.class));
258
259 if (resultIntent instanceof FlowRuleIntent) {
260 FlowRuleIntent frIntent = (FlowRuleIntent) resultIntent;
261
262 assertThat(frIntent.flowRules(), hasSize(4));
263
264 List<FlowRule> deviceFlowRules;
265 FlowRule flowRule;
266
267 // Of1
268 deviceFlowRules = getFlowRulesByDevice(of1Id, frIntent.flowRules());
269 assertThat(deviceFlowRules, hasSize(1));
270 flowRule = deviceFlowRules.get(0);
271 assertThat(flowRule.selector(), is(expectOf1Selector));
272 assertThat(flowRule.treatment(), is(expectOf1Treatment));
273
274 // Of2
275 deviceFlowRules = getFlowRulesByDevice(of2Id, frIntent.flowRules());
276 assertThat(deviceFlowRules, hasSize(1));
277 flowRule = deviceFlowRules.get(0);
278 assertThat(flowRule.selector(), is(expectOf2Selector));
279 assertThat(flowRule.treatment(), is(expectOf2Treatment));
280
281 // Of3
282 deviceFlowRules = getFlowRulesByDevice(of3Id, frIntent.flowRules());
283 assertThat(deviceFlowRules, hasSize(1));
284 flowRule = deviceFlowRules.get(0);
285 assertThat(flowRule.selector(), is(expectOf3Selector));
286 assertThat(flowRule.treatment(), is(expectOf3Treatment));
287
288 // Of4
289 deviceFlowRules = getFlowRulesByDevice(of4Id, frIntent.flowRules());
290 assertThat(deviceFlowRules, hasSize(1));
291 flowRule = deviceFlowRules.get(0);
292 assertThat(flowRule.selector(), is(expectOf4Selector));
293 assertThat(flowRule.treatment(), is(expectOf4Treatment));
294
295 }
296 sut.deactivate();
297 }
298
299 /**
300 * Multi point to single point intent with filtered connect point.
Pier Ventre5c4a0762016-11-21 10:28:13 -0800301 * Scenario is the follow:
Yi Tseng2a81c9d2016-09-14 10:14:24 -0700302 *
303 * -1 of1 2-1 of2 2-1 of4 2-
304 * 3
305 * -1 of3 2---/
Pier Ventre5c4a0762016-11-21 10:28:13 -0800306 *
307 * We test the proper compilation of mp2sp intents with trivial selector,
308 * trivial treatment and different filtered point.
Yi Tseng2a81c9d2016-09-14 10:14:24 -0700309 */
310 @Test
Pier Ventre766995d2016-10-05 22:15:56 -0700311 public void testFilteredConnectPointForMp() {
Yi Tseng2a81c9d2016-09-14 10:14:24 -0700312 sut.activate();
313 Set<Link> testlinks = ImmutableSet.of(
314 DefaultLink.builder().providerId(PID).src(of1p2).dst(of2p1).type(DIRECT).build(),
315 DefaultLink.builder().providerId(PID).src(of3p2).dst(of2p3).type(DIRECT).build(),
316 DefaultLink.builder().providerId(PID).src(of2p2).dst(of4p1).type(DIRECT).build()
317 );
318
319 Set<FilteredConnectPoint> ingress = ImmutableSet.of(
320 new FilteredConnectPoint(of1p1, vlan100Selector),
321 new FilteredConnectPoint(of3p1, vlan100Selector)
322 );
323
324 Set<FilteredConnectPoint> egress = ImmutableSet.of(
325 new FilteredConnectPoint(of4p2, vlan200Selector)
326 );
327
328 TrafficSelector expectOf1Selector = DefaultTrafficSelector.builder(vlan100Selector)
329 .matchInPort(PortNumber.portNumber(1))
330 .build();
331
332 TrafficTreatment expectOf1Treatment = DefaultTrafficTreatment.builder()
333 .setVlanId(VlanId.vlanId("200"))
334 .setOutput(PortNumber.portNumber(2))
335 .build();
336
337 TrafficSelector expectOf2Selector1 = DefaultTrafficSelector.builder(vlan200Selector)
338 .matchInPort(PortNumber.portNumber(1))
339 .build();
340
341 TrafficSelector expectOf2Selector2 = DefaultTrafficSelector.builder(vlan200Selector)
342 .matchInPort(PortNumber.portNumber(3))
343 .build();
344
345 TrafficTreatment expectOf2Treatment = DefaultTrafficTreatment.builder()
346 .setOutput(PortNumber.portNumber(2))
347 .build();
348
349 TrafficSelector expectOf3Selector = DefaultTrafficSelector.builder(vlan100Selector)
350 .matchInPort(PortNumber.portNumber(1))
351 .build();
352
353 TrafficTreatment expectOf3Treatment = DefaultTrafficTreatment.builder()
354 .setVlanId(VlanId.vlanId("200"))
355 .setOutput(PortNumber.portNumber(2))
356 .build();
357
358 TrafficSelector expectOf4Selector = DefaultTrafficSelector.builder(vlan100Selector)
359 .matchInPort(PortNumber.portNumber(1))
360 .matchVlanId(VlanId.vlanId("200"))
361 .build();
362
363 TrafficTreatment expectOf4Treatment = DefaultTrafficTreatment.builder()
364 .setOutput(PortNumber.portNumber(2))
365 .build();
366
367 intent = LinkCollectionIntent.builder()
368 .appId(APP_ID)
369 .filteredIngressPoints(ingress)
370 .filteredEgressPoints(egress)
371 .treatment(treatment)
372 .links(testlinks)
373 .build();
374
375 List<Intent> result = sut.compile(intent, Collections.emptyList());
376
377 assertThat(result, is(notNullValue()));
378 assertThat(result, hasSize(1));
379
380 Intent resultIntent = result.get(0);
381 assertThat(resultIntent, instanceOf(FlowRuleIntent.class));
382
383 if (resultIntent instanceof FlowRuleIntent) {
384 FlowRuleIntent frIntent = (FlowRuleIntent) resultIntent;
385 assertThat(frIntent.flowRules(), hasSize(5));
386
387 List<FlowRule> deviceFlowRules;
388 FlowRule flowRule;
389
390 // Of1
391 deviceFlowRules = getFlowRulesByDevice(of1Id, frIntent.flowRules());
392 assertThat(deviceFlowRules, hasSize(1));
393 flowRule = deviceFlowRules.get(0);
394 assertThat(flowRule.selector(), is(expectOf1Selector));
395 assertThat(flowRule.treatment(), is(expectOf1Treatment));
396
397 // Of2 (has 2 flows)
398 deviceFlowRules = getFlowRulesByDevice(of2Id, frIntent.flowRules());
399 assertThat(deviceFlowRules, hasSize(2));
400 flowRule = deviceFlowRules.get(0);
401 assertThat(flowRule.selector(), is(expectOf2Selector1));
402 assertThat(flowRule.treatment(), is(expectOf2Treatment));
403 flowRule = deviceFlowRules.get(1);
404 assertThat(flowRule.selector(), is(expectOf2Selector2));
405 assertThat(flowRule.treatment(), is(expectOf2Treatment));
406
407 // Of3
408 deviceFlowRules = getFlowRulesByDevice(of3Id, frIntent.flowRules());
409 assertThat(deviceFlowRules, hasSize(1));
410 flowRule = deviceFlowRules.get(0);
411 assertThat(flowRule.selector(), is(expectOf3Selector));
412 assertThat(flowRule.treatment(), is(expectOf3Treatment));
413
414 // Of4
415 deviceFlowRules = getFlowRulesByDevice(of4Id, frIntent.flowRules());
416 assertThat(deviceFlowRules, hasSize(1));
417 flowRule = deviceFlowRules.get(0);
418 assertThat(flowRule.selector(), is(expectOf4Selector));
419 assertThat(flowRule.treatment(), is(expectOf4Treatment));
420 }
Pier Ventre647138f2016-08-26 17:32:44 -0700421
422 sut.deactivate();
423 }
424
Yi Tseng2a81c9d2016-09-14 10:14:24 -0700425 /**
426 * Single point to multi point without filtered connect point case.
Pier Ventre5c4a0762016-11-21 10:28:13 -0800427 * Scenario is the follow:
428 *
Yi Tseng2a81c9d2016-09-14 10:14:24 -0700429 * -1 of1 2-1 of2 2--1 of3 2-
430 * 3
431 * `-1 of4 2-
Pier Ventre5c4a0762016-11-21 10:28:13 -0800432 *
433 * We test the proper compilation of sp2mp with non trivial selector,
434 * non trivial treatment and simple connect points.
Yi Tseng2a81c9d2016-09-14 10:14:24 -0700435 */
Pier Ventre27d42572016-08-29 17:37:08 -0700436 @Test
Pier Ventre766995d2016-10-05 22:15:56 -0700437 public void nonTrivialTranslationForSp() {
Pier Ventre27d42572016-08-29 17:37:08 -0700438 sut.activate();
Yi Tseng2a81c9d2016-09-14 10:14:24 -0700439 Set<Link> testLinks = ImmutableSet.of(
440 DefaultLink.builder().providerId(PID).src(of1p2).dst(of2p1).type(DIRECT).build(),
441 DefaultLink.builder().providerId(PID).src(of2p2).dst(of3p1).type(DIRECT).build(),
442 DefaultLink.builder().providerId(PID).src(of2p3).dst(of4p1).type(DIRECT).build()
443 );
Pier Ventre27d42572016-08-29 17:37:08 -0700444
Yi Tseng2a81c9d2016-09-14 10:14:24 -0700445 TrafficSelector expectOf1Selector = DefaultTrafficSelector.builder(ipPrefixSelector)
446 .matchInPort(PortNumber.portNumber(1))
447 .build();
Pier Ventre27d42572016-08-29 17:37:08 -0700448
Yi Tseng2a81c9d2016-09-14 10:14:24 -0700449 TrafficTreatment expectOf1Treatment = DefaultTrafficTreatment.builder()
450 .setOutput(PortNumber.portNumber(2))
451 .build();
Pier Ventre27d42572016-08-29 17:37:08 -0700452
Yi Tseng2a81c9d2016-09-14 10:14:24 -0700453 TrafficSelector expectOf2Selector = DefaultTrafficSelector.builder(ipPrefixSelector)
454 .matchInPort(PortNumber.portNumber(1))
455 .build();
Pier Ventre27d42572016-08-29 17:37:08 -0700456
Yi Tseng2a81c9d2016-09-14 10:14:24 -0700457 TrafficTreatment expectOf2Treatment = DefaultTrafficTreatment.builder()
458 .setOutput(PortNumber.portNumber(2))
459 .setOutput(PortNumber.portNumber(3))
460 .build();
Pier Ventre27d42572016-08-29 17:37:08 -0700461
Yi Tseng2a81c9d2016-09-14 10:14:24 -0700462 TrafficSelector expectOf3Selector = DefaultTrafficSelector.builder(ipPrefixSelector)
463 .matchInPort(PortNumber.portNumber(1))
464 .build();
Pier Ventre27d42572016-08-29 17:37:08 -0700465
Yi Tseng2a81c9d2016-09-14 10:14:24 -0700466 TrafficTreatment expectOf3Treatment = DefaultTrafficTreatment.builder(ethDstTreatment)
467 .setOutput(PortNumber.portNumber(2))
468 .build();
Pier Ventre27d42572016-08-29 17:37:08 -0700469
Yi Tseng2a81c9d2016-09-14 10:14:24 -0700470 TrafficSelector expectOf4Selector = DefaultTrafficSelector.builder(ipPrefixSelector)
471 .matchInPort(PortNumber.portNumber(1))
472 .build();
473
474 TrafficTreatment expectOf4Treatment = DefaultTrafficTreatment.builder(ethDstTreatment)
475 .setOutput(PortNumber.portNumber(2))
476 .build();
477
478
479
480 Set<ConnectPoint> ingress = ImmutableSet.of(
481 of1p1
482 );
483
484 Set<ConnectPoint> egress = ImmutableSet.of(
485 of3p2,
486 of4p2
487 );
488
489 intent = LinkCollectionIntent.builder()
490 .appId(APP_ID)
491 .selector(ipPrefixSelector)
492 .treatment(ethDstTreatment)
493 .ingressPoints(ingress)
494 .egressPoints(egress)
495 .applyTreatmentOnEgress(true)
496 .links(testLinks)
497 .build();
498
499 assertThat(sut, is(notNullValue()));
500
501 List<Intent> result = sut.compile(intent, Collections.emptyList());
502
503 assertThat(result, is(notNullValue()));
504 assertThat(result, hasSize(1));
505
506 Intent resultIntent = result.get(0);
507 assertThat(resultIntent, instanceOf(FlowRuleIntent.class));
508
509 if (resultIntent instanceof FlowRuleIntent) {
510 FlowRuleIntent frIntent = (FlowRuleIntent) resultIntent;
511
512 assertThat(frIntent.flowRules(), hasSize(4));
513
514 List<FlowRule> deviceFlowRules;
515 FlowRule flowRule;
516
517 // Of1
518 deviceFlowRules = getFlowRulesByDevice(of1Id, frIntent.flowRules());
519 assertThat(deviceFlowRules, hasSize(1));
520 flowRule = deviceFlowRules.get(0);
521 assertThat(flowRule.selector(), is(expectOf1Selector));
522 assertThat(flowRule.treatment(), is(expectOf1Treatment));
523
524 // Of2
525 deviceFlowRules = getFlowRulesByDevice(of2Id, frIntent.flowRules());
526 assertThat(deviceFlowRules, hasSize(1));
527 flowRule = deviceFlowRules.get(0);
528 assertThat(flowRule.selector(), is(expectOf2Selector));
529 assertThat(flowRule.treatment(), is(expectOf2Treatment));
530
531 // Of3
532 deviceFlowRules = getFlowRulesByDevice(of3Id, frIntent.flowRules());
533 assertThat(deviceFlowRules, hasSize(1));
534 flowRule = deviceFlowRules.get(0);
535 assertThat(flowRule.selector(), is(expectOf3Selector));
536 assertThat(flowRule.treatment(), is(expectOf3Treatment));
537
538 // Of4
539 deviceFlowRules = getFlowRulesByDevice(of4Id, frIntent.flowRules());
540 assertThat(deviceFlowRules, hasSize(1));
541 flowRule = deviceFlowRules.get(0);
542 assertThat(flowRule.selector(), is(expectOf4Selector));
543 assertThat(flowRule.treatment(), is(expectOf4Treatment));
544
545 }
546 sut.deactivate();
Pier Ventre27d42572016-08-29 17:37:08 -0700547 }
548
Yi Tseng2a81c9d2016-09-14 10:14:24 -0700549 /**
550 * Multi point to single point intent without filtered connect point.
Pier Ventre5c4a0762016-11-21 10:28:13 -0800551 * Scenario is the follow:
Yi Tseng2a81c9d2016-09-14 10:14:24 -0700552 *
553 * -1 of1 2-1 of2 2-1 of4 2-
554 * 3
555 * -1 of3 2---/
Pier Ventre5c4a0762016-11-21 10:28:13 -0800556 *
557 * We test the proper compilation of mp2sp intent with non trivial selector,
558 * non trivial treatment and simple connect points.
Yi Tseng2a81c9d2016-09-14 10:14:24 -0700559 */
Pier Ventre27d42572016-08-29 17:37:08 -0700560 @Test
Pier Ventre766995d2016-10-05 22:15:56 -0700561 public void nonTrivialTranslationForMp() {
Pier Ventre27d42572016-08-29 17:37:08 -0700562 sut.activate();
Yi Tseng2a81c9d2016-09-14 10:14:24 -0700563 Set<Link> testlinks = ImmutableSet.of(
564 DefaultLink.builder().providerId(PID).src(of1p2).dst(of2p1).type(DIRECT).build(),
565 DefaultLink.builder().providerId(PID).src(of3p2).dst(of2p3).type(DIRECT).build(),
566 DefaultLink.builder().providerId(PID).src(of2p2).dst(of4p1).type(DIRECT).build()
567 );
Pier Ventre27d42572016-08-29 17:37:08 -0700568
Yi Tseng2a81c9d2016-09-14 10:14:24 -0700569 Set<ConnectPoint> ingress = ImmutableSet.of(
570 of1p1,
571 of3p1
572 );
Pier Ventre27d42572016-08-29 17:37:08 -0700573
Yi Tseng2a81c9d2016-09-14 10:14:24 -0700574 Set<ConnectPoint> egress = ImmutableSet.of(
575 of4p2
576 );
Pier Ventre27d42572016-08-29 17:37:08 -0700577
Yi Tseng2a81c9d2016-09-14 10:14:24 -0700578 TrafficSelector expectOf1Selector = DefaultTrafficSelector.builder(ipPrefixSelector)
579 .matchInPort(PortNumber.portNumber(1))
580 .build();
Pier Ventre27d42572016-08-29 17:37:08 -0700581
Yi Tseng2a81c9d2016-09-14 10:14:24 -0700582 TrafficTreatment expectOf1Treatment = DefaultTrafficTreatment.builder(ethDstTreatment)
583 .setOutput(PortNumber.portNumber(2))
584 .build();
Pier Ventre27d42572016-08-29 17:37:08 -0700585
Yi Tseng2a81c9d2016-09-14 10:14:24 -0700586 TrafficSelector expectOf2Selector1 = DefaultTrafficSelector.builder(ipPrefixSelector)
587 .matchInPort(PortNumber.portNumber(1))
588 .matchEthDst(MacAddress.valueOf("C0:FF:EE:C0:FF:EE"))
589 .build();
Pier Ventre27d42572016-08-29 17:37:08 -0700590
Yi Tseng2a81c9d2016-09-14 10:14:24 -0700591 TrafficSelector expectOf2Selector2 = DefaultTrafficSelector.builder(ipPrefixSelector)
592 .matchEthDst(MacAddress.valueOf("C0:FF:EE:C0:FF:EE"))
593 .matchInPort(PortNumber.portNumber(3))
594 .build();
Pier Ventre27d42572016-08-29 17:37:08 -0700595
Yi Tseng2a81c9d2016-09-14 10:14:24 -0700596 TrafficTreatment expectOf2Treatment = DefaultTrafficTreatment.builder()
597 .setOutput(PortNumber.portNumber(2))
598 .build();
Pier Ventre27d42572016-08-29 17:37:08 -0700599
Yi Tseng2a81c9d2016-09-14 10:14:24 -0700600 TrafficSelector expectOf3Selector = DefaultTrafficSelector.builder(ipPrefixSelector)
601 .matchInPort(PortNumber.portNumber(1))
602 .build();
Pier Ventre27d42572016-08-29 17:37:08 -0700603
Yi Tseng2a81c9d2016-09-14 10:14:24 -0700604 TrafficTreatment expectOf3Treatment = DefaultTrafficTreatment.builder(ethDstTreatment)
605 .setOutput(PortNumber.portNumber(2))
606 .build();
Pier Ventre27d42572016-08-29 17:37:08 -0700607
Yi Tseng2a81c9d2016-09-14 10:14:24 -0700608 TrafficSelector expectOf4Selector = DefaultTrafficSelector.builder(ipPrefixSelector)
609 .matchEthDst(MacAddress.valueOf("C0:FF:EE:C0:FF:EE"))
610 .matchInPort(PortNumber.portNumber(1))
611 .build();
Pier Ventre27d42572016-08-29 17:37:08 -0700612
Yi Tseng2a81c9d2016-09-14 10:14:24 -0700613 TrafficTreatment expectOf4Treatment = DefaultTrafficTreatment.builder()
614 .setOutput(PortNumber.portNumber(2))
615 .build();
Pier Ventre27d42572016-08-29 17:37:08 -0700616
Yi Tseng2a81c9d2016-09-14 10:14:24 -0700617 intent = LinkCollectionIntent.builder()
618 .appId(APP_ID)
619 .selector(ipPrefixSelector)
620 .ingressPoints(ingress)
621 .egressPoints(egress)
622 .treatment(ethDstTreatment)
623 .links(testlinks)
624 .build();
Pier Ventre27d42572016-08-29 17:37:08 -0700625
Yi Tseng2a81c9d2016-09-14 10:14:24 -0700626 List<Intent> result = sut.compile(intent, Collections.emptyList());
Pier Ventre27d42572016-08-29 17:37:08 -0700627
Yi Tseng2a81c9d2016-09-14 10:14:24 -0700628 assertThat(result, is(notNullValue()));
629 assertThat(result, hasSize(1));
630
631 Intent resultIntent = result.get(0);
632 assertThat(resultIntent, instanceOf(FlowRuleIntent.class));
633
634 if (resultIntent instanceof FlowRuleIntent) {
635 FlowRuleIntent frIntent = (FlowRuleIntent) resultIntent;
636 assertThat(frIntent.flowRules(), hasSize(5));
637
638 List<FlowRule> deviceFlowRules;
639 FlowRule flowRule;
640
641 // Of1
642 deviceFlowRules = getFlowRulesByDevice(of1Id, frIntent.flowRules());
643 assertThat(deviceFlowRules, hasSize(1));
644 flowRule = deviceFlowRules.get(0);
645 assertThat(flowRule.selector(), is(expectOf1Selector));
646 assertThat(flowRule.treatment(), is(expectOf1Treatment));
647
648 // Of2 (has 2 flows)
649 deviceFlowRules = getFlowRulesByDevice(of2Id, frIntent.flowRules());
650 assertThat(deviceFlowRules, hasSize(2));
651 flowRule = deviceFlowRules.get(0);
652 assertThat(flowRule.selector(), is(expectOf2Selector1));
653 assertThat(flowRule.treatment(), is(expectOf2Treatment));
654 flowRule = deviceFlowRules.get(1);
655 assertThat(flowRule.selector(), is(expectOf2Selector2));
656 assertThat(flowRule.treatment(), is(expectOf2Treatment));
657
658 // Of3
659 deviceFlowRules = getFlowRulesByDevice(of3Id, frIntent.flowRules());
660 assertThat(deviceFlowRules, hasSize(1));
661 flowRule = deviceFlowRules.get(0);
662 assertThat(flowRule.selector(), is(expectOf3Selector));
663 assertThat(flowRule.treatment(), is(expectOf3Treatment));
664
665 // Of4
666 deviceFlowRules = getFlowRulesByDevice(of4Id, frIntent.flowRules());
667 assertThat(deviceFlowRules, hasSize(1));
668 flowRule = deviceFlowRules.get(0);
669 assertThat(flowRule.selector(), is(expectOf4Selector));
670 assertThat(flowRule.treatment(), is(expectOf4Treatment));
671 }
672
673 sut.deactivate();
Pier Ventre27d42572016-08-29 17:37:08 -0700674 }
Pier Ventre766995d2016-10-05 22:15:56 -0700675
676 /**
677 * We test the proper compilation of mp2sp with
678 * trivial selector, trivial treatment and 1 hop.
679 */
680 @Test
681 public void singleHopTestForMp() {
682
683 intent = LinkCollectionIntent.builder()
684 .appId(APP_ID)
685 .selector(selector)
686 .treatment(treatment)
687 .links(ImmutableSet.of())
688 .filteredIngressPoints(ImmutableSet.of(
689 new FilteredConnectPoint(d1p10),
690 new FilteredConnectPoint(d1p11)
691 ))
692 .filteredEgressPoints(ImmutableSet.of(new FilteredConnectPoint(d1p0)))
693 .build();
694
695 sut.activate();
696
697 List<Intent> compiled = sut.compile(intent, Collections.emptyList());
698 assertThat(compiled, hasSize(1));
699
700 Collection<FlowRule> rules = ((FlowRuleIntent) compiled.get(0)).flowRules();
701 assertThat(rules, hasSize(2));
702
703 Collection<FlowRule> rulesS1 = rules.stream()
704 .filter(rule -> rule.deviceId().equals(d1p0.deviceId()))
705 .collect(Collectors.toSet());
706 assertThat(rulesS1, hasSize(2));
707 FlowRule ruleS1 = rulesS1.stream()
708 .filter(rule -> {
709 PortCriterion inPort = (PortCriterion) rule.selector().getCriterion(IN_PORT);
710 return inPort.port().equals(d1p10.port());
711 })
712 .findFirst()
713 .get();
714 assertThat(ruleS1.selector(), Is.is(
715 DefaultTrafficSelector
716 .builder()
717 .matchInPort(d1p10.port())
718 .build()
719 ));
720 assertThat(ruleS1.treatment(), Is.is(
721 DefaultTrafficTreatment
722 .builder()
723 .setOutput(d1p0.port())
724 .build()
725 ));
726
727 ruleS1 = rulesS1.stream()
728 .filter(rule -> {
729 PortCriterion inPort = (PortCriterion) rule.selector().getCriterion(IN_PORT);
730 return inPort.port().equals(d1p11.port());
731 })
732 .findFirst()
733 .get();
734 assertThat(ruleS1.selector(), Is.is(
735 DefaultTrafficSelector
736 .builder()
737 .matchInPort(d1p11.port())
738 .build()
739 ));
740 assertThat(ruleS1.treatment(), Is.is(
741 DefaultTrafficTreatment
742 .builder()
743 .setOutput(d1p0.port())
744 .build()
745 ));
746
747 sut.deactivate();
748
749 }
750
751 /**
752 * We test the proper compilation of sp2mp with
753 * trivial selector, trivial treatment and 1 hop.
754 */
755 @Test
756 public void singleHopTestForSp() {
757
758 intent = LinkCollectionIntent.builder()
759 .appId(APP_ID)
760 .selector(selector)
761 .treatment(treatment)
762 .applyTreatmentOnEgress(true)
763 .links(ImmutableSet.of())
764 .filteredEgressPoints(ImmutableSet.of(
765 new FilteredConnectPoint(d1p10),
766 new FilteredConnectPoint(d1p11)
767 ))
768 .filteredIngressPoints(ImmutableSet.of(new FilteredConnectPoint(d1p0)))
769 .build();
770
771 sut.activate();
772
773 List<Intent> compiled = sut.compile(intent, Collections.emptyList());
774 assertThat(compiled, hasSize(1));
775
776 Collection<FlowRule> rules = ((FlowRuleIntent) compiled.get(0)).flowRules();
777 assertThat(rules, hasSize(1));
778
779 Collection<FlowRule> rulesS1 = rules.stream()
780 .filter(rule -> rule.deviceId().equals(d1p0.deviceId()))
781 .collect(Collectors.toSet());
782 assertThat(rulesS1, hasSize(1));
783 FlowRule ruleS1 = rulesS1.stream()
784 .filter(rule -> {
785 PortCriterion inPort = (PortCriterion) rule.selector().getCriterion(IN_PORT);
786 return inPort.port().equals(d1p0.port());
787 })
788 .findFirst()
789 .get();
790 assertThat(ruleS1.selector(), Is.is(
791 DefaultTrafficSelector
792 .builder()
793 .matchInPort(d1p0.port())
794 .build()
795 ));
796 assertThat(ruleS1.treatment(), Is.is(
797 DefaultTrafficTreatment
798 .builder()
799 .setOutput(d1p10.port())
800 .setOutput(d1p11.port())
801 .build()
802 ));
803
804 sut.deactivate();
805
806 }
807
808 /**
809 * We test the proper compilation of mp2sp with
810 * trivial selector, trivial treatment, filtered
811 * points and 1 hop.
812 */
813 @Test
814 public void singleHopTestFilteredForMp() {
815
816 intent = LinkCollectionIntent.builder()
817 .appId(APP_ID)
818 .selector(selector)
819 .treatment(treatment)
820 .links(ImmutableSet.of())
821 .filteredIngressPoints(ImmutableSet.of(
822 new FilteredConnectPoint(d1p10, vlan100Selector),
823 new FilteredConnectPoint(d1p11, mpls69Selector)
824 ))
825 .filteredEgressPoints(ImmutableSet.of(new FilteredConnectPoint(d1p0, vlan200Selector)))
826 .build();
827
828 sut.activate();
829
830 List<Intent> compiled = sut.compile(intent, Collections.emptyList());
831 assertThat(compiled, hasSize(1));
832
833 Collection<FlowRule> rules = ((FlowRuleIntent) compiled.get(0)).flowRules();
834 assertThat(rules, hasSize(2));
835
836 Collection<FlowRule> rulesS1 = rules.stream()
837 .filter(rule -> rule.deviceId().equals(d1p0.deviceId()))
838 .collect(Collectors.toSet());
839 assertThat(rulesS1, hasSize(2));
840 FlowRule ruleS1 = rulesS1.stream()
841 .filter(rule -> {
842 PortCriterion inPort = (PortCriterion) rule.selector().getCriterion(IN_PORT);
843 return inPort.port().equals(d1p10.port());
844 })
845 .findFirst()
846 .get();
847 assertThat(ruleS1.selector(), Is.is(
848 DefaultTrafficSelector
849 .builder(vlan100Selector)
850 .matchInPort(d1p10.port())
851 .build()
852 ));
853 assertThat(ruleS1.treatment(), Is.is(
854 DefaultTrafficTreatment
855 .builder()
856 .setVlanId(((VlanIdCriterion) vlan200Selector.getCriterion(VLAN_VID)).vlanId())
857 .setOutput(d1p0.port())
858 .build()
859 ));
860
861 ruleS1 = rulesS1.stream()
862 .filter(rule -> {
863 PortCriterion inPort = (PortCriterion) rule.selector().getCriterion(IN_PORT);
864 return inPort.port().equals(d1p11.port());
865 })
866 .findFirst()
867 .get();
868 assertThat(ruleS1.selector(), Is.is(
869 DefaultTrafficSelector
870 .builder(mpls69Selector)
871 .matchInPort(d1p11.port())
872 .build()
873 ));
874 assertThat(ruleS1.treatment(), Is.is(
875 DefaultTrafficTreatment
876 .builder()
877 .popMpls(IPV4.ethType())
878 .pushVlan()
879 .setVlanId(((VlanIdCriterion) vlan200Selector.getCriterion(VLAN_VID)).vlanId())
880 .setOutput(d1p0.port())
881 .build()
882 ));
883
884 sut.deactivate();
885
886 }
887
888 /**
889 * We test the proper compilation of sp2mp with
890 * trivial selector, trivial treatment and 1 hop.
891 */
892 @Test
893 public void singleHopTestFilteredForSp() {
894
895 intent = LinkCollectionIntent.builder()
896 .appId(APP_ID)
897 .selector(selector)
898 .treatment(treatment)
899 .applyTreatmentOnEgress(true)
900 .links(ImmutableSet.of())
901 .filteredEgressPoints(ImmutableSet.of(
902 new FilteredConnectPoint(d1p10, vlan100Selector),
903 new FilteredConnectPoint(d1p11, mpls80Selector)
904 ))
905 .filteredIngressPoints(ImmutableSet.of(new FilteredConnectPoint(d1p0, vlan200Selector)))
906 .build();
907
908 sut.activate();
909
910 List<Intent> compiled = sut.compile(intent, Collections.emptyList());
911 assertThat(compiled, hasSize(1));
912
913 Collection<FlowRule> rules = ((FlowRuleIntent) compiled.get(0)).flowRules();
914 assertThat(rules, hasSize(1));
915
916 Collection<FlowRule> rulesS1 = rules.stream()
917 .filter(rule -> rule.deviceId().equals(d1p0.deviceId()))
918 .collect(Collectors.toSet());
919 assertThat(rulesS1, hasSize(1));
920 FlowRule ruleS1 = rulesS1.stream()
921 .filter(rule -> {
922 PortCriterion inPort = (PortCriterion) rule.selector().getCriterion(IN_PORT);
923 return inPort.port().equals(d1p0.port());
924 })
925 .findFirst()
926 .get();
927 assertThat(ruleS1.selector(), Is.is(
928 DefaultTrafficSelector
929 .builder(vlan200Selector)
930 .matchInPort(d1p0.port())
931 .build()
932 ));
933 assertThat(ruleS1.treatment(), Is.is(
934 DefaultTrafficTreatment
935 .builder()
936 .setVlanId(((VlanIdCriterion) vlan100Selector.getCriterion(VLAN_VID)).vlanId())
937 .setOutput(d1p10.port())
938 .popVlan()
939 .pushMpls()
940 .setMpls(((MplsCriterion) mpls80Selector.getCriterion(MPLS_LABEL)).label())
941 .setOutput(d1p11.port())
942 .build()
943 ));
944
945 sut.deactivate();
946
947 }
948
949 /**
950 * We test the proper compilation of mp2sp with
951 * selector, treatment, filtered
952 * points and 1 hop.
953 */
954 @Test
955 public void singleHopNonTrivialForMp() {
956
957 intent = LinkCollectionIntent.builder()
958 .appId(APP_ID)
959 .selector(ipPrefixSelector)
960 .treatment(ethDstTreatment)
961 .links(ImmutableSet.of())
962 .filteredIngressPoints(ImmutableSet.of(
963 new FilteredConnectPoint(d1p10, vlan100Selector),
964 new FilteredConnectPoint(d1p11, mpls100Selector)
965 ))
966 .filteredEgressPoints(ImmutableSet.of(new FilteredConnectPoint(d1p0, vlan200Selector)))
967 .build();
968
969 sut.activate();
970
971 List<Intent> compiled = sut.compile(intent, Collections.emptyList());
972 assertThat(compiled, hasSize(1));
973
974 Collection<FlowRule> rules = ((FlowRuleIntent) compiled.get(0)).flowRules();
975 assertThat(rules, hasSize(2));
976
977 Collection<FlowRule> rulesS1 = rules.stream()
978 .filter(rule -> rule.deviceId().equals(d1p0.deviceId()))
979 .collect(Collectors.toSet());
980 assertThat(rulesS1, hasSize(2));
981 FlowRule ruleS1 = rulesS1.stream()
982 .filter(rule -> {
983 PortCriterion inPort = (PortCriterion) rule.selector().getCriterion(IN_PORT);
984 return inPort.port().equals(d1p10.port());
985 })
986 .findFirst()
987 .get();
988 assertThat(ruleS1.selector(), Is.is(
989 DefaultTrafficSelector
990 .builder(ipPrefixSelector)
991 .matchVlanId(((VlanIdCriterion) vlan100Selector.getCriterion(VLAN_VID)).vlanId())
992 .matchInPort(d1p10.port())
993 .build()
994 ));
995 assertThat(ruleS1.treatment(), Is.is(
996 DefaultTrafficTreatment
997 .builder()
998 .setEthDst(((ModEtherInstruction) ethDstTreatment
999 .allInstructions()
1000 .stream()
1001 .filter(instruction -> instruction instanceof ModEtherInstruction)
1002 .findFirst().get()).mac())
1003 .setVlanId(((VlanIdCriterion) vlan200Selector.getCriterion(VLAN_VID)).vlanId())
1004 .setOutput(d1p0.port())
1005 .build()
1006 ));
1007
1008 ruleS1 = rulesS1.stream()
1009 .filter(rule -> {
1010 PortCriterion inPort = (PortCriterion) rule.selector().getCriterion(IN_PORT);
1011 return inPort.port().equals(d1p11.port());
1012 })
1013 .findFirst()
1014 .get();
1015 assertThat(ruleS1.selector(), Is.is(
1016 DefaultTrafficSelector
1017 .builder(ipPrefixSelector)
1018 .matchMplsLabel(((MplsCriterion) mpls100Selector.getCriterion(MPLS_LABEL)).label())
1019 .matchInPort(d1p11.port())
1020 .build()
1021 ));
1022 assertThat(ruleS1.treatment(), Is.is(
1023 DefaultTrafficTreatment
1024 .builder()
1025 .setEthDst(((ModEtherInstruction) ethDstTreatment
1026 .allInstructions()
1027 .stream()
1028 .filter(instruction -> instruction instanceof ModEtherInstruction)
1029 .findFirst().get()).mac())
1030 .popMpls(IPV4.ethType())
1031 .pushVlan()
1032 .setVlanId(((VlanIdCriterion) vlan200Selector.getCriterion(VLAN_VID)).vlanId())
1033 .setOutput(d1p0.port())
1034 .build()
1035 ));
1036
1037 sut.deactivate();
1038
1039 }
1040
1041 /**
1042 * We test the proper compilation of sp2mp with
1043 * selector, treatment and 1 hop.
1044 */
1045 @Test
1046 public void singleHopNonTrivialForSp() {
1047
1048 intent = LinkCollectionIntent.builder()
1049 .appId(APP_ID)
1050 .selector(ipPrefixSelector)
1051 .treatment(ethDstTreatment)
1052 .applyTreatmentOnEgress(true)
1053 .links(ImmutableSet.of())
1054 .filteredEgressPoints(ImmutableSet.of(
1055 new FilteredConnectPoint(d1p10, vlan100Selector),
1056 new FilteredConnectPoint(d1p11, mpls200Selector)
1057 ))
1058 .filteredIngressPoints(ImmutableSet.of(new FilteredConnectPoint(d1p0, vlan200Selector)))
1059 .build();
1060
1061 sut.activate();
1062
1063 List<Intent> compiled = sut.compile(intent, Collections.emptyList());
1064 assertThat(compiled, hasSize(1));
1065
1066 Collection<FlowRule> rules = ((FlowRuleIntent) compiled.get(0)).flowRules();
1067 assertThat(rules, hasSize(1));
1068
1069 Collection<FlowRule> rulesS1 = rules.stream()
1070 .filter(rule -> rule.deviceId().equals(d1p0.deviceId()))
1071 .collect(Collectors.toSet());
1072 assertThat(rulesS1, hasSize(1));
1073 FlowRule ruleS1 = rulesS1.stream()
1074 .filter(rule -> {
1075 PortCriterion inPort = (PortCriterion) rule.selector().getCriterion(IN_PORT);
1076 return inPort.port().equals(d1p0.port());
1077 })
1078 .findFirst()
1079 .get();
1080 assertThat(ruleS1.selector(), Is.is(
1081 DefaultTrafficSelector
1082 .builder(ipPrefixSelector)
1083 .matchVlanId(((VlanIdCriterion) vlan200Selector.getCriterion(VLAN_VID)).vlanId())
1084 .matchInPort(d1p0.port())
1085 .build()
1086 ));
1087 assertThat(ruleS1.treatment(), Is.is(
1088 DefaultTrafficTreatment
1089 .builder()
1090 .setEthDst(((ModEtherInstruction) ethDstTreatment
1091 .allInstructions()
1092 .stream()
1093 .filter(instruction -> instruction instanceof ModEtherInstruction)
1094 .findFirst().get()).mac())
1095 .setVlanId(((VlanIdCriterion) vlan100Selector.getCriterion(VLAN_VID)).vlanId())
1096 .setOutput(d1p10.port())
1097 .setEthDst(((ModEtherInstruction) ethDstTreatment
1098 .allInstructions()
1099 .stream()
1100 .filter(instruction -> instruction instanceof ModEtherInstruction)
1101 .findFirst().get()).mac())
1102 .popVlan()
1103 .pushMpls()
1104 .setMpls(((MplsCriterion) mpls200Selector.getCriterion(MPLS_LABEL)).label())
1105 .setOutput(d1p11.port())
1106 .build()
1107 ));
1108
1109 sut.deactivate();
1110
1111 }
1112
Sho SHIMIZUee2aa652015-02-25 18:56:43 -08001113}