blob: fd3d0aee4e8b1f89090d1d87cd5145c6fb032451 [file] [log] [blame]
Rimon Ashkenazy27438ff2016-03-22 15:57:45 +02001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2016-present Open Networking Laboratory
Rimon Ashkenazy27438ff2016-03-22 15:57:45 +02003 *
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 */
Yuta HIGUCHId95d5902016-06-27 00:18:45 -070016package org.onosproject.net.optical.intent.impl.compiler;
Rimon Ashkenazy27438ff2016-03-22 15:57:45 +020017
18import org.junit.After;
19import org.junit.Before;
20import org.junit.Test;
21import org.onlab.packet.ChassisId;
22import org.onosproject.TestApplicationId;
23import org.onosproject.core.ApplicationId;
24import org.onosproject.core.CoreService;
25import org.onosproject.core.IdGenerator;
HIGUCHI Yuta4c0ef6b2016-05-02 19:45:41 -070026import org.onosproject.net.AbstractProjectableModel;
Rimon Ashkenazy27438ff2016-03-22 15:57:45 +020027import org.onosproject.net.Annotations;
28import org.onosproject.net.DefaultAnnotations;
29import org.onosproject.net.CltSignalType;
30import org.onosproject.net.ConnectPoint;
31import org.onosproject.net.DefaultDevice;
32import org.onosproject.net.DefaultLink;
33import org.onosproject.net.DefaultPath;
HIGUCHI Yuta4c0ef6b2016-05-02 19:45:41 -070034import org.onosproject.net.DefaultPort;
Rimon Ashkenazy27438ff2016-03-22 15:57:45 +020035import org.onosproject.net.Device;
36import org.onosproject.net.DeviceId;
37import org.onosproject.net.Link;
Rimon Ashkenazy27438ff2016-03-22 15:57:45 +020038import org.onosproject.net.OduSignalId;
39import org.onosproject.net.OduSignalType;
40import org.onosproject.net.OduSignalUtils;
Rimon Ashkenazy27438ff2016-03-22 15:57:45 +020041import org.onosproject.net.OtuSignalType;
42import org.onosproject.net.Path;
43import org.onosproject.net.Port;
44import org.onosproject.net.PortNumber;
45import org.onosproject.net.TributarySlot;
46import org.onosproject.net.flow.DefaultTrafficSelector;
47import org.onosproject.net.flow.DefaultTrafficTreatment;
48import org.onosproject.net.flow.FlowRule;
49import org.onosproject.net.flow.TrafficSelector;
50import org.onosproject.net.flow.TrafficTreatment;
51import org.onosproject.net.flow.criteria.Criteria;
52import org.onosproject.net.flow.instructions.Instructions;
53import org.onosproject.net.intent.FlowRuleIntent;
54import org.onosproject.net.intent.Intent;
55import org.onosproject.net.intent.IntentExtensionService;
56import org.onosproject.net.intent.Key;
57import org.onosproject.net.intent.MockIdGenerator;
58import org.onosproject.net.intent.OpticalOduIntent;
HIGUCHI Yuta4c0ef6b2016-05-02 19:45:41 -070059import org.onosproject.net.optical.OduCltPort;
HIGUCHI Yuta5be3e822016-05-03 13:51:42 -070060import org.onosproject.net.optical.OtuPort;
HIGUCHI Yuta4c0ef6b2016-05-02 19:45:41 -070061import org.onosproject.net.optical.impl.DefaultOduCltPort;
HIGUCHI Yuta5be3e822016-05-03 13:51:42 -070062import org.onosproject.net.optical.impl.DefaultOtuPort;
Rimon Ashkenazy27438ff2016-03-22 15:57:45 +020063import org.onosproject.net.provider.ProviderId;
Yuta HIGUCHId95d5902016-06-27 00:18:45 -070064import org.onosproject.net.resource.MockResourceService;
Rimon Ashkenazy27438ff2016-03-22 15:57:45 +020065import org.onosproject.net.topology.LinkWeight;
66import org.onosproject.net.topology.Topology;
67import org.onosproject.net.topology.TopologyServiceAdapter;
68import org.onosproject.net.device.DeviceServiceAdapter;
HIGUCHI Yuta4c0ef6b2016-05-02 19:45:41 -070069import org.onosproject.net.driver.DriverService;
70import org.onosproject.net.driver.DriverServiceAdapter;
Rimon Ashkenazy27438ff2016-03-22 15:57:45 +020071
72import com.google.common.collect.ImmutableList;
73import com.google.common.collect.Sets;
74
75import java.util.Arrays;
76import java.util.Collection;
77import java.util.Collections;
78import java.util.HashSet;
79import java.util.List;
80import java.util.Set;
Yuta HIGUCHI652f27f2016-10-31 16:54:30 -070081import java.util.stream.Collectors;
Rimon Ashkenazy27438ff2016-03-22 15:57:45 +020082
83import static org.easymock.EasyMock.createMock;
84import static org.easymock.EasyMock.expect;
85import static org.easymock.EasyMock.replay;
86import static org.hamcrest.MatcherAssert.assertThat;
Yuta HIGUCHI652f27f2016-10-31 16:54:30 -070087import static org.hamcrest.Matchers.everyItem;
Rimon Ashkenazy27438ff2016-03-22 15:57:45 +020088import static org.hamcrest.Matchers.hasSize;
89import static org.hamcrest.Matchers.is;
90import static org.junit.Assert.assertEquals;
91import static org.onosproject.net.AnnotationKeys.STATIC_PORT;
92import static org.onosproject.net.AnnotationKeys.PORT_NAME;
93import static org.onosproject.net.Device.Type.OTN;
94import static org.onosproject.net.DeviceId.deviceId;
95import static org.onosproject.net.Link.Type.OPTICAL;
96import static org.onosproject.net.NetTestTools.APP_ID;
97import static org.onosproject.net.NetTestTools.PID;
98
99public class OpticalOduIntentCompilerTest {
100
101 private static final String DEV1 = "of:1";
102 private static final String DEV2 = "of:2";
103 private static final String DEV3 = "of:3";
104
105 static final Key KEY1 = Key.of(5L, APP_ID);
106
107 private static final String STATIC_TRUE = "true";
108 private static final String PNAME = "p2";
109
110 private CoreService coreService;
111 private IntentExtensionService intentExtensionService;
112 private final IdGenerator idGenerator = new MockIdGenerator();
113 private OpticalOduIntentCompiler sut;
114
115 private final ApplicationId appId = new TestApplicationId("test");
116 private static Device device1 = new DefaultDevice(ProviderId.NONE, deviceId(DEV1), OTN,
117 "m", "h", "s", "n", new ChassisId(0L));
118 private static Device device2 = new DefaultDevice(ProviderId.NONE, deviceId(DEV2), OTN,
119 "m", "h", "s", "n", new ChassisId(1L));
120 private static Device device3 = new DefaultDevice(ProviderId.NONE, deviceId(DEV3), OTN,
121 "m", "h", "s", "n", new ChassisId(2L));
122
123 private static Annotations annotations1 = DefaultAnnotations.builder().set(STATIC_PORT, STATIC_TRUE).build();
124 private static Annotations annotations2 = DefaultAnnotations.builder().set(PORT_NAME, PNAME).build();
125
126 // OduClt ports with signalType=1GBE
127 private static final OduCltPort D1P1 =
HIGUCHI Yuta4c0ef6b2016-05-02 19:45:41 -0700128 new DefaultOduCltPort(new DefaultPort(device1, PortNumber.portNumber(1), true, annotations1),
129 CltSignalType.CLT_1GBE);
Rimon Ashkenazy27438ff2016-03-22 15:57:45 +0200130 private static final OduCltPort D3P2 =
HIGUCHI Yuta4c0ef6b2016-05-02 19:45:41 -0700131 new DefaultOduCltPort(new DefaultPort(device3, PortNumber.portNumber(2), true, annotations1),
132 CltSignalType.CLT_1GBE);
Rimon Ashkenazy27438ff2016-03-22 15:57:45 +0200133
134 // Otu ports with signalType=ODU2
135 private static final OtuPort D1P2 =
HIGUCHI Yuta5be3e822016-05-03 13:51:42 -0700136 new DefaultOtuPort(new DefaultPort(device1, PortNumber.portNumber(2), true, annotations2),
137 OtuSignalType.OTU2);
Rimon Ashkenazy27438ff2016-03-22 15:57:45 +0200138 private static final OtuPort D2P1 =
HIGUCHI Yuta5be3e822016-05-03 13:51:42 -0700139 new DefaultOtuPort(new DefaultPort(device2, PortNumber.portNumber(1), true, annotations2),
140 OtuSignalType.OTU2);
Rimon Ashkenazy27438ff2016-03-22 15:57:45 +0200141 private static final OtuPort D2P2 =
HIGUCHI Yuta5be3e822016-05-03 13:51:42 -0700142 new DefaultOtuPort(new DefaultPort(device2, PortNumber.portNumber(2), true, annotations2),
143 OtuSignalType.OTU2);
Rimon Ashkenazy27438ff2016-03-22 15:57:45 +0200144 private static final OtuPort D3P1 =
HIGUCHI Yuta5be3e822016-05-03 13:51:42 -0700145 new DefaultOtuPort(new DefaultPort(device3, PortNumber.portNumber(1), true, annotations2),
146 OtuSignalType.OTU2);
Rimon Ashkenazy27438ff2016-03-22 15:57:45 +0200147
148 // OduClt ports with signalType=10GBE
149 private static final OduCltPort D1P3 =
HIGUCHI Yuta4c0ef6b2016-05-02 19:45:41 -0700150 new DefaultOduCltPort(new DefaultPort(device1, PortNumber.portNumber(3), true, annotations1),
151 CltSignalType.CLT_10GBE);
Rimon Ashkenazy27438ff2016-03-22 15:57:45 +0200152 private static final OduCltPort D3P3 =
HIGUCHI Yuta4c0ef6b2016-05-02 19:45:41 -0700153 new DefaultOduCltPort(new DefaultPort(device3, PortNumber.portNumber(3), true, annotations1),
154 CltSignalType.CLT_10GBE);
Rimon Ashkenazy27438ff2016-03-22 15:57:45 +0200155
156 // OduCltPort ConnectPoints
157 private final ConnectPoint d1p1 = new ConnectPoint(device1.id(), D1P1.number());
158 private final ConnectPoint d1p3 = new ConnectPoint(device1.id(), D1P3.number());
159 private final ConnectPoint d3p2 = new ConnectPoint(device3.id(), D3P2.number());
160 private final ConnectPoint d3p3 = new ConnectPoint(device3.id(), D3P3.number());
161
162 // OtuPort ConnectPoints
163 private final ConnectPoint d1p2 = new ConnectPoint(device1.id(), D1P2.number());
164 private final ConnectPoint d2p1 = new ConnectPoint(device2.id(), D2P1.number());
165 private final ConnectPoint d2p2 = new ConnectPoint(device2.id(), D2P2.number());
166 private final ConnectPoint d3p1 = new ConnectPoint(device3.id(), D3P1.number());
167
168 private final List<Link> links = Arrays.asList(
169 DefaultLink.builder().providerId(PID).src(d1p2).dst(d2p1).type(OPTICAL).build(),
170 DefaultLink.builder().providerId(PID).src(d2p2).dst(d3p1).type(OPTICAL).build()
171 );
172 private final Path path = new DefaultPath(PID, links, 3);
173
174 private OpticalOduIntent intent;
175
176 /**
177 * Mocks the topology service to give paths in the test.
178 */
179 private class MockTopologyService extends TopologyServiceAdapter {
180 Set<Path> paths = Sets.newHashSet(path);
181
182 @Override
183 public Topology currentTopology() {
184 return null;
185 }
186
187 @Override
188 public Set<Path> getPaths(Topology topology, DeviceId src, DeviceId dst, LinkWeight weight) {
189 return paths;
190 }
191 }
192
193 /**
194 * Mocks the device service so that devices and ports appear available in the test.
195 */
196 private static class MockDeviceService extends DeviceServiceAdapter {
197 @Override
198 public boolean isAvailable(DeviceId deviceId) {
199 return true;
200 }
201
202 @Override
203 public List<Port> getPorts(DeviceId deviceId) {
204 if (deviceId.equals(deviceId(DEV1))) {
205 return ImmutableList.of((Port) D1P1, (Port) D1P2, (Port) D1P3);
206 }
207
208 if (deviceId.equals(deviceId(DEV2))) {
209 return ImmutableList.of((Port) D2P1, (Port) D2P2);
210 }
211
212 if (deviceId.equals(deviceId(DEV3))) {
213 return ImmutableList.of((Port) D3P1, (Port) D3P2, (Port) D3P3);
214 }
215
216 return Collections.emptyList();
217 }
218
219 @Override
220 public Port getPort(DeviceId deviceId, PortNumber portNumber) {
221 if (deviceId.equals(deviceId(DEV1))) {
222 switch (portNumber.toString()) {
223 case "1":
HIGUCHI Yuta4c0ef6b2016-05-02 19:45:41 -0700224 return D1P1;
Rimon Ashkenazy27438ff2016-03-22 15:57:45 +0200225 case "2":
HIGUCHI Yuta4c0ef6b2016-05-02 19:45:41 -0700226 return D1P2;
Rimon Ashkenazy27438ff2016-03-22 15:57:45 +0200227 case "3":
HIGUCHI Yuta4c0ef6b2016-05-02 19:45:41 -0700228 return D1P3;
Rimon Ashkenazy27438ff2016-03-22 15:57:45 +0200229 default:
230 return null;
231 }
232 }
233 if (deviceId.equals(deviceId(DEV2))) {
234 switch (portNumber.toString()) {
235 case "1":
HIGUCHI Yuta4c0ef6b2016-05-02 19:45:41 -0700236 return D2P1;
Rimon Ashkenazy27438ff2016-03-22 15:57:45 +0200237 case "2":
HIGUCHI Yuta4c0ef6b2016-05-02 19:45:41 -0700238 return D2P2;
Rimon Ashkenazy27438ff2016-03-22 15:57:45 +0200239 default:
240 return null;
241 }
242 }
243 if (deviceId.equals(deviceId(DEV3))) {
244 switch (portNumber.toString()) {
245 case "1":
HIGUCHI Yuta4c0ef6b2016-05-02 19:45:41 -0700246 return D3P1;
Rimon Ashkenazy27438ff2016-03-22 15:57:45 +0200247 case "2":
HIGUCHI Yuta4c0ef6b2016-05-02 19:45:41 -0700248 return D3P2;
Rimon Ashkenazy27438ff2016-03-22 15:57:45 +0200249 case "3":
HIGUCHI Yuta4c0ef6b2016-05-02 19:45:41 -0700250 return D3P3;
Rimon Ashkenazy27438ff2016-03-22 15:57:45 +0200251 default:
252 return null;
253 }
254 }
255 return null;
256 }
257 }
258
HIGUCHI Yuta4c0ef6b2016-05-02 19:45:41 -0700259 private static class MockDriverService extends DriverServiceAdapter
260 implements DriverService {
261 // TODO override to return appropriate driver,
262 // with DefaultOpticalDevice support, etc.
263 }
264
Rimon Ashkenazy27438ff2016-03-22 15:57:45 +0200265 @Before
266 public void setUp() {
HIGUCHI Yuta4c0ef6b2016-05-02 19:45:41 -0700267 AbstractProjectableModel.setDriverService(null, new MockDriverService());
Rimon Ashkenazy27438ff2016-03-22 15:57:45 +0200268 sut = new OpticalOduIntentCompiler();
269 coreService = createMock(CoreService.class);
270 expect(coreService.registerApplication("org.onosproject.net.intent"))
271 .andReturn(appId);
272 sut.coreService = coreService;
273 sut.deviceService = new MockDeviceService();
274 sut.resourceService = new MockResourceService();
275 sut.topologyService = new MockTopologyService();
276
Thomas Vachuska23235962017-02-03 11:44:15 -0800277 Intent.unbindIdGenerator(idGenerator);
Rimon Ashkenazy27438ff2016-03-22 15:57:45 +0200278 Intent.bindIdGenerator(idGenerator);
279
280 intentExtensionService = createMock(IntentExtensionService.class);
281 intentExtensionService.registerCompiler(OpticalOduIntent.class, sut);
282 intentExtensionService.unregisterCompiler(OpticalOduIntent.class);
283 sut.intentManager = intentExtensionService;
284
285 replay(coreService, intentExtensionService);
286 }
287
288 @After
289 public void tearDown() {
290 Intent.unbindIdGenerator(idGenerator);
291 }
292
293 /**
294 * Tests compile of OpticalOduIntent with allocation of TributarySlots.
295 * Compile two ODUCLT ports (with CLT_1GBE), over OTU ports (with OTU2):
296 * - only one TributarySlot is used
297 */
298 @Test
299 public void test1GbeMultiplexOverOdu2() {
300
301 intent = OpticalOduIntent.builder()
302 .appId(APP_ID)
303 .key(KEY1)
304 .src(d1p1)
305 .dst(d3p2)
306 .signalType(D1P1.signalType())
307 .bidirectional(false)
308 .build();
309
310 sut.activate();
311
312 List<Intent> compiled = sut.compile(intent, Collections.emptyList());
313 assertThat(compiled, hasSize(1));
314
Yuta HIGUCHI652f27f2016-10-31 16:54:30 -0700315 assertThat("key is inherited",
316 compiled.stream().map(Intent::key).collect(Collectors.toList()),
317 everyItem(is(intent.key())));
318
Rimon Ashkenazy27438ff2016-03-22 15:57:45 +0200319 Collection<FlowRule> rules = ((FlowRuleIntent) compiled.get(0)).flowRules();
320
321 // 1st Device
322 FlowRule rule1 = rules.stream()
323 .filter(x -> x.deviceId().equals(device1.id()))
324 .findFirst()
325 .get();
326 // validate SRC selector
327 TrafficSelector.Builder selectorBuilder1 = DefaultTrafficSelector.builder();
328 selectorBuilder1.matchInPort(d1p1.port());
329 selectorBuilder1.add(Criteria.matchOduSignalType(OduSignalType.ODU0));
330 assertThat(rule1.selector(), is(selectorBuilder1.build()));
331
332 // validate SRC treatment (with OduSignalId, where 1 TributarySlot is used)
333 TrafficTreatment.Builder treatmentBuilder1 = DefaultTrafficTreatment.builder();
334 Set<TributarySlot> slots = new HashSet<>();
335 slots.add(TributarySlot.of(1));
336 OduSignalId oduSignalId = OduSignalUtils.buildOduSignalId(OduSignalType.ODU2, slots);
337 treatmentBuilder1.add(Instructions.modL1OduSignalId(oduSignalId));
338 treatmentBuilder1.setOutput(d1p2.port());
339 assertThat(rule1.treatment(), is(treatmentBuilder1.build()));
340
341 // 2nd Device
342 FlowRule rule2 = rules.stream()
343 .filter(x -> x.deviceId().equals(device2.id()))
344 .findFirst()
345 .get();
346 // validate SRC selector
347 TrafficSelector.Builder selectorBuilder2 = DefaultTrafficSelector.builder();
348 selectorBuilder2.matchInPort(d2p1.port());
349 selectorBuilder2.add(Criteria.matchOduSignalType(OduSignalType.ODU0));
350 selectorBuilder2.add(Criteria.matchOduSignalId(oduSignalId));
351 assertThat(rule2.selector(), is(selectorBuilder2.build()));
352
353 // validate SRC treatment (with OduSignalId, where 1 TributarySlot is used)
354 TrafficTreatment.Builder treatmentBuilder2 = DefaultTrafficTreatment.builder();
355 treatmentBuilder2.add(Instructions.modL1OduSignalId(oduSignalId));
356 treatmentBuilder2.setOutput(d2p2.port());
357 assertThat(rule2.treatment(), is(treatmentBuilder2.build()));
358
359
360 // 3rd Device
361 FlowRule rule3 = rules.stream()
362 .filter(x -> x.deviceId().equals(device3.id()))
363 .findFirst()
364 .get();
365 // validate DST selector (with OduSignalId, where the same TributarySlot is used)
366 TrafficSelector.Builder selectorBuilder3 = DefaultTrafficSelector.builder();
367 selectorBuilder3.matchInPort(d3p1.port());
368 selectorBuilder3.add(Criteria.matchOduSignalType(OduSignalType.ODU0));
369 selectorBuilder3.add(Criteria.matchOduSignalId(oduSignalId));
370 assertThat(rule3.selector(), is(selectorBuilder3.build()));
371
372 // validate DST treatment
373 assertThat(rule3.treatment(), is(
374 DefaultTrafficTreatment.builder().setOutput(d3p2.port()).build()
375 ));
376
377 rules.forEach(rule -> assertEquals("FlowRule priority is incorrect",
378 intent.priority(), rule.priority()));
379
380 sut.deactivate();
381 }
382
383 /**
384 * Tests compile of OpticalOduIntent with allocation of TributarySlots.
385 * Compile two ODUCLT ports (with CLT_10GBE), over OTU ports (with OTU2):
386 * - All TributarySlots are used
387 */
388 @Test
389 public void test10GbeMultiplexOverOdu2() {
390
391 intent = OpticalOduIntent.builder()
392 .appId(APP_ID)
393 .key(KEY1)
394 .src(d1p3)
395 .dst(d3p3)
396 .signalType(D1P3.signalType())
397 .bidirectional(false)
398 .build();
399
400 sut.activate();
401
402 List<Intent> compiled = sut.compile(intent, Collections.emptyList());
403 assertThat(compiled, hasSize(1));
404
Yuta HIGUCHI652f27f2016-10-31 16:54:30 -0700405 assertThat("key is inherited",
406 compiled.stream().map(Intent::key).collect(Collectors.toList()),
407 everyItem(is(intent.key())));
408
Rimon Ashkenazy27438ff2016-03-22 15:57:45 +0200409 Collection<FlowRule> rules = ((FlowRuleIntent) compiled.get(0)).flowRules();
410
411 // 1st Device
412 FlowRule rule1 = rules.stream()
413 .filter(x -> x.deviceId().equals(device1.id()))
414 .findFirst()
415 .get();
416 // validate SRC selector
417 TrafficSelector.Builder selectorBuilder1 = DefaultTrafficSelector.builder();
418 selectorBuilder1.matchInPort(d1p3.port());
419 selectorBuilder1.add(Criteria.matchOduSignalType(OduSignalType.ODU2));
420 assertThat(rule1.selector(), is(selectorBuilder1.build()));
421
422 // validate SRC treatment (without OduSignalId - all TributarySlots are used)
423 TrafficTreatment.Builder treatmentBuilder1 = DefaultTrafficTreatment.builder();
424 treatmentBuilder1.setOutput(d1p2.port());
425 assertThat(rule1.treatment(), is(treatmentBuilder1.build()));
426
427 // 2nd Device
428 FlowRule rule2 = rules.stream()
429 .filter(x -> x.deviceId().equals(device2.id()))
430 .findFirst()
431 .get();
432 // validate SRC selector
433 TrafficSelector.Builder selectorBuilder2 = DefaultTrafficSelector.builder();
434 selectorBuilder2.matchInPort(d2p1.port());
435 selectorBuilder2.add(Criteria.matchOduSignalType(OduSignalType.ODU2));
436 assertThat(rule2.selector(), is(selectorBuilder2.build()));
437
438 // validate SRC treatment (without OduSignalId - all TributarySlots are used)
439 TrafficTreatment.Builder treatmentBuilder2 = DefaultTrafficTreatment.builder();
440 treatmentBuilder2.setOutput(d2p2.port());
441 assertThat(rule2.treatment(), is(treatmentBuilder2.build()));
442
443
444 // 3rd Device
445 FlowRule rule3 = rules.stream()
446 .filter(x -> x.deviceId().equals(device3.id()))
447 .findFirst()
448 .get();
449 // validate DST selector (without OduSignalId - all TributarySlots are used)
450 TrafficSelector.Builder selectorBuilder3 = DefaultTrafficSelector.builder();
451 selectorBuilder3.matchInPort(d3p1.port());
452 selectorBuilder3.add(Criteria.matchOduSignalType(OduSignalType.ODU2));
453 assertThat(rule3.selector(), is(selectorBuilder3.build()));
454
455 // validate DST treatment
456 assertThat(rule3.treatment(), is(
457 DefaultTrafficTreatment.builder().setOutput(d3p3.port()).build()
458 ));
459
460 rules.forEach(rule -> assertEquals("FlowRule priority is incorrect",
461 intent.priority(), rule.priority()));
462
463 sut.deactivate();
464 }
465
466}