blob: a7d03c28eb232e4978d0b8ab99153b065d3cfe6e [file] [log] [blame]
Yi Tseng0b809722017-11-03 10:23:26 -07001/*
2 * Copyright 2017-present Open Networking Foundation
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Carmelo Cascone356ab8b2019-09-25 01:02:53 -070017package org.onosproject.pipelines.fabric.impl.behaviour.pipeliner;
Yi Tseng0b809722017-11-03 10:23:26 -070018
Yi Tseng1b154bd2017-11-20 17:48:19 -080019import com.google.common.collect.ImmutableList;
Carmelo Casconeb5324e72018-11-25 02:26:32 -080020import org.junit.Before;
Yi Tseng0b809722017-11-03 10:23:26 -070021import org.junit.Test;
Yi Tseng0b809722017-11-03 10:23:26 -070022import org.onosproject.net.flow.DefaultFlowRule;
23import org.onosproject.net.flow.DefaultTrafficSelector;
24import org.onosproject.net.flow.DefaultTrafficTreatment;
25import org.onosproject.net.flow.FlowRule;
26import org.onosproject.net.flow.TrafficSelector;
27import org.onosproject.net.flow.TrafficTreatment;
28import org.onosproject.net.flow.criteria.PiCriterion;
29import org.onosproject.net.flowobjective.DefaultNextObjective;
30import org.onosproject.net.flowobjective.NextObjective;
Yi Tseng1b154bd2017-11-20 17:48:19 -080031import org.onosproject.net.group.DefaultGroupBucket;
32import org.onosproject.net.group.DefaultGroupDescription;
Esin Karaman24fda8a2018-01-26 11:52:28 +000033import org.onosproject.net.group.DefaultGroupKey;
Yi Tseng1b154bd2017-11-20 17:48:19 -080034import org.onosproject.net.group.GroupBucket;
35import org.onosproject.net.group.GroupBuckets;
Yi Tseng0b809722017-11-03 10:23:26 -070036import org.onosproject.net.group.GroupDescription;
Esin Karaman24fda8a2018-01-26 11:52:28 +000037import org.onosproject.net.group.GroupKey;
38import org.onosproject.net.pi.runtime.PiAction;
Esin Karaman24fda8a2018-01-26 11:52:28 +000039import org.onosproject.net.pi.runtime.PiActionParam;
Carmelo Casconecb4327a2018-09-11 15:17:23 -070040import org.onosproject.net.pi.runtime.PiActionProfileGroupId;
Yi Tseng1b154bd2017-11-20 17:48:19 -080041import org.onosproject.net.pi.runtime.PiGroupKey;
Carmelo Cascone356ab8b2019-09-25 01:02:53 -070042import org.onosproject.pipelines.fabric.impl.behaviour.FabricConstants;
Yi Tseng0b809722017-11-03 10:23:26 -070043
44import java.util.List;
Yi Tseng1b154bd2017-11-20 17:48:19 -080045import java.util.stream.Collectors;
Yi Tseng0b809722017-11-03 10:23:26 -070046
47import static org.junit.Assert.assertEquals;
Yi Tseng0b809722017-11-03 10:23:26 -070048
49/**
50 * Test cases for fabric.p4 pipeline next control block.
51 */
52public class FabricNextPipelinerTest extends FabricPipelinerTest {
Carmelo Casconeb5324e72018-11-25 02:26:32 -080053
54 private NextObjectiveTranslator translatorHashed;
55 private NextObjectiveTranslator translatorSimple;
56
Yi Tseng20f9e7b2018-05-24 23:27:39 +080057 private FlowRule vlanMetaFlowRule;
58
Carmelo Casconeb5324e72018-11-25 02:26:32 -080059 @Before
60 public void setup() {
61 super.doSetup();
62
63 translatorHashed = new NextObjectiveTranslator(DEVICE_ID, capabilitiesHashed);
64 translatorSimple = new NextObjectiveTranslator(DEVICE_ID, capabilitiesSimple);
65
Yi Tseng20f9e7b2018-05-24 23:27:39 +080066 PiCriterion nextIdCriterion = PiCriterion.builder()
Carmelo Casconeb5324e72018-11-25 02:26:32 -080067 .matchExact(FabricConstants.HDR_NEXT_ID, NEXT_ID_1)
Yi Tseng20f9e7b2018-05-24 23:27:39 +080068 .build();
69 TrafficSelector selector = DefaultTrafficSelector.builder()
70 .matchPi(nextIdCriterion)
71 .build();
Carmelo Casconeb5324e72018-11-25 02:26:32 -080072 PiAction piAction = PiAction.builder()
73 .withId(FabricConstants.FABRIC_INGRESS_NEXT_SET_VLAN)
74 .withParameter(new PiActionParam(FabricConstants.VLAN_ID, VLAN_100.toShort()))
Yi Tseng20f9e7b2018-05-24 23:27:39 +080075 .build();
Carmelo Casconeb5324e72018-11-25 02:26:32 -080076 TrafficTreatment treatment = DefaultTrafficTreatment.builder()
77 .piTableAction(piAction)
78 .build();
Yi Tseng20f9e7b2018-05-24 23:27:39 +080079 vlanMetaFlowRule = DefaultFlowRule.builder()
80 .withSelector(selector)
81 .withTreatment(treatment)
Carmelo Casconeb5324e72018-11-25 02:26:32 -080082 .forTable(FabricConstants.FABRIC_INGRESS_NEXT_NEXT_VLAN)
Yi Tseng20f9e7b2018-05-24 23:27:39 +080083 .makePermanent()
84 // FIXME: currently next objective doesn't support priority, ignore this
85 .withPriority(0)
86 .forDevice(DEVICE_ID)
87 .fromApp(APP_ID)
88 .build();
89 }
Yi Tseng0b809722017-11-03 10:23:26 -070090
91 /**
92 * Test program output rule for Simple table.
93 */
94 @Test
Carmelo Casconeb5324e72018-11-25 02:26:32 -080095 public void testSimpleOutput() throws FabricPipelinerException {
Yi Tseng0b809722017-11-03 10:23:26 -070096 TrafficTreatment treatment = DefaultTrafficTreatment.builder()
97 .setOutput(PORT_1)
98 .build();
Carmelo Casconeb5324e72018-11-25 02:26:32 -080099 PiAction piAction = PiAction.builder()
100 .withId(FabricConstants.FABRIC_INGRESS_NEXT_OUTPUT_SIMPLE)
101 .withParameter(new PiActionParam(
102 FabricConstants.PORT_NUM, PORT_1.toLong()))
103 .build();
104 testSimple(treatment, piAction);
Yi Tseng0b809722017-11-03 10:23:26 -0700105 }
106
107 /**
108 * Test program set vlan and output rule for Simple table.
109 */
110 @Test
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800111 public void testSimpleOutputWithVlanTranslation() throws FabricPipelinerException {
Yi Tseng0b809722017-11-03 10:23:26 -0700112 TrafficTreatment treatment = DefaultTrafficTreatment.builder()
113 .setVlanId(VLAN_100)
114 .setOutput(PORT_1)
115 .build();
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800116 PiAction piAction = PiAction.builder()
117 .withId(FabricConstants.FABRIC_INGRESS_NEXT_OUTPUT_SIMPLE)
118 .withParameter(new PiActionParam(
119 FabricConstants.PORT_NUM, PORT_1.toLong()))
120 .build();
121 testSimple(treatment, piAction);
Yi Tseng0b809722017-11-03 10:23:26 -0700122 }
123
Yi Tsengdbe05602017-11-17 18:02:43 -0800124 /**
125 * Test program set mac and output rule for Simple table.
126 */
127 @Test
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800128 public void testSimpleOutputWithMacTranslation() throws FabricPipelinerException {
Yi Tsengdbe05602017-11-17 18:02:43 -0800129 TrafficTreatment treatment = DefaultTrafficTreatment.builder()
130 .setEthSrc(ROUTER_MAC)
131 .setEthDst(HOST_MAC)
132 .setOutput(PORT_1)
133 .build();
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800134 PiAction piAction = PiAction.builder()
135 .withId(FabricConstants.FABRIC_INGRESS_NEXT_ROUTING_SIMPLE)
136 .withParameter(new PiActionParam(
137 FabricConstants.SMAC, ROUTER_MAC.toBytes()))
138 .withParameter(new PiActionParam(
139 FabricConstants.DMAC, HOST_MAC.toBytes()))
140 .withParameter(new PiActionParam(
141 FabricConstants.PORT_NUM, PORT_1.toLong()))
142 .build();
143 testSimple(treatment, piAction);
Yi Tsengdbe05602017-11-17 18:02:43 -0800144 }
145
Yi Tseng20f9e7b2018-05-24 23:27:39 +0800146 /**
147 * Test program set mac, set vlan, and output rule for Simple table.
148 */
149 @Test
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800150 public void testSimpleOutputWithVlanAndMacTranslation() throws FabricPipelinerException {
Yi Tseng20f9e7b2018-05-24 23:27:39 +0800151 TrafficTreatment treatment = DefaultTrafficTreatment.builder()
152 .setEthSrc(ROUTER_MAC)
153 .setEthDst(HOST_MAC)
154 .setVlanId(VLAN_100)
155 .setOutput(PORT_1)
156 .build();
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800157 PiAction piAction = PiAction.builder()
158 .withId(FabricConstants.FABRIC_INGRESS_NEXT_ROUTING_SIMPLE)
159 .withParameter(new PiActionParam(
160 FabricConstants.SMAC, ROUTER_MAC.toBytes()))
161 .withParameter(new PiActionParam(
162 FabricConstants.DMAC, HOST_MAC.toBytes()))
163 .withParameter(new PiActionParam(
164 FabricConstants.PORT_NUM, PORT_1.toLong()))
165 .build();
166 testSimple(treatment, piAction);
Yi Tseng20f9e7b2018-05-24 23:27:39 +0800167 }
168
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800169 private void testSimple(TrafficTreatment treatment, PiAction piAction) throws FabricPipelinerException {
Yi Tseng0b809722017-11-03 10:23:26 -0700170 NextObjective nextObjective = DefaultNextObjective.builder()
171 .withId(NEXT_ID_1)
172 .withPriority(PRIORITY)
Yi Tseng20f9e7b2018-05-24 23:27:39 +0800173 .withMeta(VLAN_META)
Yi Tseng0b809722017-11-03 10:23:26 -0700174 .addTreatment(treatment)
175 .withType(NextObjective.Type.SIMPLE)
176 .makePermanent()
177 .fromApp(APP_ID)
178 .add();
179
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800180 ObjectiveTranslation actualTranslation = translatorSimple.translate(nextObjective);
Yi Tseng0b809722017-11-03 10:23:26 -0700181
Yi Tseng1b154bd2017-11-20 17:48:19 -0800182 // Simple table
Yi Tseng0b809722017-11-03 10:23:26 -0700183 PiCriterion nextIdCriterion = PiCriterion.builder()
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800184 .matchExact(FabricConstants.HDR_NEXT_ID, NEXT_ID_1)
Yi Tseng1b154bd2017-11-20 17:48:19 -0800185 .build();
186 TrafficSelector nextIdSelector = DefaultTrafficSelector.builder()
187 .matchPi(nextIdCriterion)
188 .build();
Yi Tseng1b154bd2017-11-20 17:48:19 -0800189 FlowRule expectedFlowRule = DefaultFlowRule.builder()
190 .forDevice(DEVICE_ID)
191 .fromApp(APP_ID)
192 .makePermanent()
193 // FIXME: currently next objective doesn't support priority, ignore this
194 .withPriority(0)
Yi Tseng43ee7e82018-04-12 16:37:34 +0800195 .forTable(FabricConstants.FABRIC_INGRESS_NEXT_SIMPLE)
Yi Tseng1b154bd2017-11-20 17:48:19 -0800196 .withSelector(nextIdSelector)
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800197 .withTreatment(DefaultTrafficTreatment.builder()
198 .piTableAction(piAction).build())
Yi Tseng1b154bd2017-11-20 17:48:19 -0800199 .build();
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800200
201 ObjectiveTranslation expectedTranslation = ObjectiveTranslation.builder()
202 .addFlowRule(vlanMetaFlowRule)
203 .addFlowRule(expectedFlowRule)
204 .build();
205
206 assertEquals(expectedTranslation, actualTranslation);
Yi Tseng1b154bd2017-11-20 17:48:19 -0800207 }
208
Yi Tseng0b809722017-11-03 10:23:26 -0700209 /**
Daniele Morof51d0c12019-07-30 10:43:10 -0700210 * Test Route and Push Next Objective (set mac, set double vlan and output port).
211 */
212 @Test
213 public void testRouteAndPushNextObjective() throws FabricPipelinerException {
214 TrafficTreatment routeAndPushTreatment = DefaultTrafficTreatment.builder()
215 .setEthSrc(ROUTER_MAC)
216 .setEthDst(HOST_MAC)
217 .setOutput(PORT_1)
218 .setVlanId(VLAN_100)
219 .pushVlan()
220 .setVlanId(VLAN_200)
221 .build();
222
223 NextObjective nextObjective = DefaultNextObjective.builder()
224 .withId(NEXT_ID_1)
225 .withPriority(PRIORITY)
226 .addTreatment(routeAndPushTreatment)
227 .withType(NextObjective.Type.SIMPLE)
228 .makePermanent()
229 .fromApp(APP_ID)
230 .add();
231
232 ObjectiveTranslation actualTranslation = translatorSimple.translate(nextObjective);
233
234 PiAction piActionRouting = PiAction.builder()
235 .withId(FabricConstants.FABRIC_INGRESS_NEXT_ROUTING_SIMPLE)
236 .withParameter(new PiActionParam(
237 FabricConstants.SMAC, ROUTER_MAC.toBytes()))
238 .withParameter(new PiActionParam(
239 FabricConstants.DMAC, HOST_MAC.toBytes()))
240 .withParameter(new PiActionParam(
241 FabricConstants.PORT_NUM, PORT_1.toLong()))
242 .build();
243
244 PiAction piActionPush = PiAction.builder()
245 .withId(FabricConstants.FABRIC_INGRESS_NEXT_SET_DOUBLE_VLAN)
246 .withParameter(new PiActionParam(
247 FabricConstants.INNER_VLAN_ID, VLAN_100.toShort()))
248 .withParameter(new PiActionParam(
249 FabricConstants.OUTER_VLAN_ID, VLAN_200.toShort()))
250 .build();
251
252
253 TrafficSelector nextIdSelector = DefaultTrafficSelector.builder()
254 .matchPi(PiCriterion.builder()
255 .matchExact(FabricConstants.HDR_NEXT_ID, NEXT_ID_1)
256 .build())
257 .build();
258 FlowRule expectedFlowRuleRouting = DefaultFlowRule.builder()
259 .forDevice(DEVICE_ID)
260 .fromApp(APP_ID)
261 .makePermanent()
262 // FIXME: currently next objective doesn't support priority, ignore this
263 .withPriority(0)
264 .forTable(FabricConstants.FABRIC_INGRESS_NEXT_SIMPLE)
265 .withSelector(nextIdSelector)
266 .withTreatment(DefaultTrafficTreatment.builder()
267 .piTableAction(piActionRouting).build())
268 .build();
269 FlowRule expectedFlowRuleDoublePush = DefaultFlowRule.builder()
270 .withSelector(nextIdSelector)
271 .withTreatment(DefaultTrafficTreatment.builder()
272 .piTableAction(piActionPush)
273 .build())
274 .forTable(FabricConstants.FABRIC_INGRESS_NEXT_NEXT_VLAN)
275 .makePermanent()
276 // FIXME: currently next objective doesn't support priority, ignore this
277 .withPriority(0)
278 .forDevice(DEVICE_ID)
279 .fromApp(APP_ID)
280 .build();
281
282 ObjectiveTranslation expectedTranslation = ObjectiveTranslation.builder()
283 .addFlowRule(expectedFlowRuleDoublePush)
284 .addFlowRule(expectedFlowRuleRouting)
285 .build();
286
287
288 assertEquals(expectedTranslation, actualTranslation);
289 }
290
291 /**
Yi Tseng0b809722017-11-03 10:23:26 -0700292 * Test program ecmp output group for Hashed table.
293 */
294 @Test
Yi Tseng1b154bd2017-11-20 17:48:19 -0800295 public void testHashedOutput() throws Exception {
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800296 PiAction piAction1 = PiAction.builder()
297 .withId(FabricConstants.FABRIC_INGRESS_NEXT_ROUTING_HASHED)
298 .withParameter(new PiActionParam(
299 FabricConstants.SMAC, ROUTER_MAC.toBytes()))
300 .withParameter(new PiActionParam(
301 FabricConstants.DMAC, HOST_MAC.toBytes()))
302 .withParameter(new PiActionParam(
303 FabricConstants.PORT_NUM, PORT_1.toLong()))
304 .build();
305 PiAction piAction2 = PiAction.builder()
306 .withId(FabricConstants.FABRIC_INGRESS_NEXT_ROUTING_HASHED)
307 .withParameter(new PiActionParam(
308 FabricConstants.SMAC, ROUTER_MAC.toBytes()))
309 .withParameter(new PiActionParam(
310 FabricConstants.DMAC, HOST_MAC.toBytes()))
311 .withParameter(new PiActionParam(
312 FabricConstants.PORT_NUM, PORT_1.toLong()))
313 .build();
Yi Tseng1b154bd2017-11-20 17:48:19 -0800314 TrafficTreatment treatment1 = DefaultTrafficTreatment.builder()
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800315 .piTableAction(piAction1)
Yi Tseng1b154bd2017-11-20 17:48:19 -0800316 .build();
317 TrafficTreatment treatment2 = DefaultTrafficTreatment.builder()
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800318 .piTableAction(piAction2)
Yi Tseng1b154bd2017-11-20 17:48:19 -0800319 .build();
320
321 NextObjective nextObjective = DefaultNextObjective.builder()
322 .withId(NEXT_ID_1)
323 .withPriority(PRIORITY)
Yi Tseng20f9e7b2018-05-24 23:27:39 +0800324 .withMeta(VLAN_META)
Yi Tseng1b154bd2017-11-20 17:48:19 -0800325 .addTreatment(treatment1)
326 .addTreatment(treatment2)
327 .withType(NextObjective.Type.HASHED)
328 .makePermanent()
329 .fromApp(APP_ID)
330 .add();
331
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800332 ObjectiveTranslation actualTranslation = translatorHashed.doTranslate(nextObjective);
Yi Tseng1b154bd2017-11-20 17:48:19 -0800333
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800334 // Expected hashed table flow rule.
Yi Tseng1b154bd2017-11-20 17:48:19 -0800335 PiCriterion nextIdCriterion = PiCriterion.builder()
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800336 .matchExact(FabricConstants.HDR_NEXT_ID, NEXT_ID_1)
Yi Tseng1b154bd2017-11-20 17:48:19 -0800337 .build();
338 TrafficSelector nextIdSelector = DefaultTrafficSelector.builder()
339 .matchPi(nextIdCriterion)
340 .build();
Carmelo Casconecb4327a2018-09-11 15:17:23 -0700341 PiActionProfileGroupId actionGroupId = PiActionProfileGroupId.of(NEXT_ID_1);
Yi Tseng1b154bd2017-11-20 17:48:19 -0800342 TrafficTreatment treatment = DefaultTrafficTreatment.builder()
343 .piTableAction(actionGroupId)
344 .build();
Yi Tseng1b154bd2017-11-20 17:48:19 -0800345 FlowRule expectedFlowRule = DefaultFlowRule.builder()
346 .forDevice(DEVICE_ID)
347 .fromApp(APP_ID)
348 .makePermanent()
349 // FIXME: currently next objective doesn't support priority, ignore this
350 .withPriority(0)
Yi Tseng43ee7e82018-04-12 16:37:34 +0800351 .forTable(FabricConstants.FABRIC_INGRESS_NEXT_HASHED)
Yi Tseng1b154bd2017-11-20 17:48:19 -0800352 .withSelector(nextIdSelector)
353 .withTreatment(treatment)
354 .build();
Yi Tseng1b154bd2017-11-20 17:48:19 -0800355
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800356 // Expected group
Yi Tseng1b154bd2017-11-20 17:48:19 -0800357 List<TrafficTreatment> treatments = ImmutableList.of(treatment1, treatment2);
Yi Tseng1b154bd2017-11-20 17:48:19 -0800358 List<GroupBucket> buckets = treatments.stream()
359 .map(DefaultGroupBucket::createSelectGroupBucket)
360 .collect(Collectors.toList());
361 GroupBuckets groupBuckets = new GroupBuckets(buckets);
Yi Tseng43ee7e82018-04-12 16:37:34 +0800362 PiGroupKey groupKey = new PiGroupKey(FabricConstants.FABRIC_INGRESS_NEXT_HASHED,
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800363 FabricConstants.FABRIC_INGRESS_NEXT_HASHED_SELECTOR,
Yi Tseng43ee7e82018-04-12 16:37:34 +0800364 NEXT_ID_1);
Yi Tseng1b154bd2017-11-20 17:48:19 -0800365 GroupDescription expectedGroup = new DefaultGroupDescription(
366 DEVICE_ID,
367 GroupDescription.Type.SELECT,
368 groupBuckets,
369 groupKey,
370 NEXT_ID_1,
371 APP_ID
372 );
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800373
374 ObjectiveTranslation expectedTranslation = ObjectiveTranslation.builder()
375 .addFlowRule(expectedFlowRule)
376 .addFlowRule(vlanMetaFlowRule)
377 .addGroup(expectedGroup)
378 .build();
379
380 assertEquals(expectedTranslation, actualTranslation);
Yi Tseng0b809722017-11-03 10:23:26 -0700381
382 }
383
384 /**
385 * Test program output group for Broadcast table.
386 */
387 @Test
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800388 public void testBroadcastOutput() throws FabricPipelinerException {
Esin Karaman24fda8a2018-01-26 11:52:28 +0000389 TrafficTreatment treatment1 = DefaultTrafficTreatment.builder()
390 .setOutput(PORT_1)
391 .build();
392 TrafficTreatment treatment2 = DefaultTrafficTreatment.builder()
393 .popVlan()
394 .setOutput(PORT_2)
395 .build();
396 NextObjective nextObjective = DefaultNextObjective.builder()
397 .withId(NEXT_ID_1)
398 .withPriority(PRIORITY)
399 .addTreatment(treatment1)
400 .addTreatment(treatment2)
401 .withMeta(VLAN_META)
402 .withType(NextObjective.Type.BROADCAST)
403 .makePermanent()
404 .fromApp(APP_ID)
405 .add();
Yi Tseng0b809722017-11-03 10:23:26 -0700406
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800407 ObjectiveTranslation actualTranslation = translatorHashed.doTranslate(nextObjective);
Esin Karaman24fda8a2018-01-26 11:52:28 +0000408
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800409 // Should generate 3 flows:
410 // - Multicast table flow that matches on next-id and set multicast group (1)
411 // - Egress VLAN pop handling for treatment2 (0)
412 // - Next VLAN flow (2)
413 // And 2 groups:
414 // - Multicast group
Esin Karaman24fda8a2018-01-26 11:52:28 +0000415
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800416 // Expected multicast table flow rule.
Esin Karaman24fda8a2018-01-26 11:52:28 +0000417 PiCriterion nextIdCriterion = PiCriterion.builder()
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800418 .matchExact(FabricConstants.HDR_NEXT_ID, NEXT_ID_1)
Esin Karaman24fda8a2018-01-26 11:52:28 +0000419 .build();
420 TrafficSelector nextIdSelector = DefaultTrafficSelector.builder()
421 .matchPi(nextIdCriterion)
422 .build();
Esin Karaman24fda8a2018-01-26 11:52:28 +0000423 PiAction setMcGroupAction = PiAction.builder()
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800424 .withId(FabricConstants.FABRIC_INGRESS_NEXT_SET_MCAST_GROUP_ID)
425 .withParameter(new PiActionParam(
426 FabricConstants.GROUP_ID, NEXT_ID_1))
Esin Karaman24fda8a2018-01-26 11:52:28 +0000427 .build();
428 TrafficTreatment treatment = DefaultTrafficTreatment.builder()
429 .piTableAction(setMcGroupAction)
430 .build();
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800431 FlowRule expectedHashedFlowRule = DefaultFlowRule.builder()
Esin Karaman24fda8a2018-01-26 11:52:28 +0000432 .forDevice(DEVICE_ID)
433 .fromApp(APP_ID)
434 .makePermanent()
435 .withPriority(nextObjective.priority())
436 .forTable(FabricConstants.FABRIC_INGRESS_NEXT_MULTICAST)
437 .withSelector(nextIdSelector)
438 .withTreatment(treatment)
439 .build();
440
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800441 // Expected egress VLAN POP flow rule.
Esin Karaman24fda8a2018-01-26 11:52:28 +0000442 PiCriterion egressVlanTableMatch = PiCriterion.builder()
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800443 .matchExact(FabricConstants.HDR_EG_PORT, PORT_2.toLong())
Esin Karaman24fda8a2018-01-26 11:52:28 +0000444 .build();
445 TrafficSelector selectorForEgressVlan = DefaultTrafficSelector.builder()
446 .matchPi(egressVlanTableMatch)
447 .matchVlanId(VLAN_100)
448 .build();
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800449 PiAction piActionForEgressVlan = PiAction.builder()
450 .withId(FabricConstants.FABRIC_EGRESS_EGRESS_NEXT_POP_VLAN)
451 .build();
Esin Karaman24fda8a2018-01-26 11:52:28 +0000452 TrafficTreatment treatmentForEgressVlan = DefaultTrafficTreatment.builder()
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800453 .piTableAction(piActionForEgressVlan)
Esin Karaman24fda8a2018-01-26 11:52:28 +0000454 .build();
455 FlowRule expectedEgressVlanRule = DefaultFlowRule.builder()
456 .withSelector(selectorForEgressVlan)
457 .withTreatment(treatmentForEgressVlan)
458 .forTable(FabricConstants.FABRIC_EGRESS_EGRESS_NEXT_EGRESS_VLAN)
459 .makePermanent()
460 .withPriority(nextObjective.priority())
461 .forDevice(DEVICE_ID)
462 .fromApp(APP_ID)
463 .build();
Esin Karaman24fda8a2018-01-26 11:52:28 +0000464
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800465 // Expected ALL group.
466 TrafficTreatment allGroupTreatment1 = DefaultTrafficTreatment.builder()
Carmelo Cascone58136812018-07-19 03:40:16 +0200467 .setOutput(PORT_1)
468 .build();
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800469 TrafficTreatment allGroupTreatment2 = DefaultTrafficTreatment.builder()
Carmelo Cascone58136812018-07-19 03:40:16 +0200470 .setOutput(PORT_2)
471 .build();
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800472 List<TrafficTreatment> allTreatments = ImmutableList.of(
473 allGroupTreatment1, allGroupTreatment2);
474 List<GroupBucket> allBuckets = allTreatments.stream()
Esin Karaman24fda8a2018-01-26 11:52:28 +0000475 .map(DefaultGroupBucket::createAllGroupBucket)
476 .collect(Collectors.toList());
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800477 GroupBuckets allGroupBuckets = new GroupBuckets(allBuckets);
478 GroupKey allGroupKey = new DefaultGroupKey(FabricPipeliner.KRYO.serialize(NEXT_ID_1));
479 GroupDescription expectedAllGroup = new DefaultGroupDescription(
Esin Karaman24fda8a2018-01-26 11:52:28 +0000480 DEVICE_ID,
481 GroupDescription.Type.ALL,
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800482 allGroupBuckets,
483 allGroupKey,
Esin Karaman24fda8a2018-01-26 11:52:28 +0000484 NEXT_ID_1,
485 APP_ID
486 );
Yi Tseng15ab4b02018-09-14 11:14:43 -0700487
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800488 ObjectiveTranslation expectedTranslation = ObjectiveTranslation.builder()
489 .addFlowRule(expectedHashedFlowRule)
490 .addFlowRule(vlanMetaFlowRule)
491 .addFlowRule(expectedEgressVlanRule)
492 .addGroup(expectedAllGroup)
493 .build();
Yi Tseng15ab4b02018-09-14 11:14:43 -0700494
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800495 assertEquals(expectedTranslation, actualTranslation);
Yi Tseng15ab4b02018-09-14 11:14:43 -0700496 }
Carmelo Cascone45cc0862018-11-26 11:50:41 -0800497
498 /**
499 * Test XConnect NextObjective.
500 *
501 * @throws FabricPipelinerException
502 */
503 @Test
504 public void testXconnectOutput() throws FabricPipelinerException {
505 TrafficTreatment treatment1 = DefaultTrafficTreatment.builder()
506 .setOutput(PORT_1)
507 .build();
508 TrafficTreatment treatment2 = DefaultTrafficTreatment.builder()
509 .setOutput(PORT_2)
510 .build();
511 NextObjective nextObjective = DefaultNextObjective.builder()
512 .withId(NEXT_ID_1)
513 .withPriority(PRIORITY)
514 .addTreatment(treatment1)
515 .addTreatment(treatment2)
516 .withType(NextObjective.Type.BROADCAST)
517 .makePermanent()
518 .fromApp(XCONNECT_APP_ID)
519 .add();
520
521 ObjectiveTranslation actualTranslation = translatorHashed.doTranslate(nextObjective);
522
523 // Should generate 2 flows for the xconnect table.
524
525 // Expected multicast table flow rule.
526 PiCriterion nextIdCriterion = PiCriterion.builder()
527 .matchExact(FabricConstants.HDR_NEXT_ID, NEXT_ID_1)
528 .build();
529 TrafficSelector xcSelector1 = DefaultTrafficSelector.builder()
530 .matchPi(nextIdCriterion)
531 .matchInPort(PORT_1)
532 .build();
533 TrafficTreatment xcTreatment1 = DefaultTrafficTreatment.builder()
534 .piTableAction(PiAction.builder()
535 .withId(FabricConstants.FABRIC_INGRESS_NEXT_OUTPUT_XCONNECT)
536 .withParameter(new PiActionParam(FabricConstants.PORT_NUM, PORT_2.toLong()))
537 .build())
538 .build();
539 TrafficSelector xcSelector2 = DefaultTrafficSelector.builder()
540 .matchPi(nextIdCriterion)
541 .matchInPort(PORT_2)
542 .build();
543 TrafficTreatment xcTreatment2 = DefaultTrafficTreatment.builder()
544 .piTableAction(PiAction.builder()
545 .withId(FabricConstants.FABRIC_INGRESS_NEXT_OUTPUT_XCONNECT)
546 .withParameter(new PiActionParam(FabricConstants.PORT_NUM, PORT_1.toLong()))
547 .build())
548 .build();
549
550 FlowRule expectedXcFlowRule1 = DefaultFlowRule.builder()
551 .forDevice(DEVICE_ID)
552 .fromApp(XCONNECT_APP_ID)
553 .makePermanent()
554 .withPriority(nextObjective.priority())
555 .forTable(FabricConstants.FABRIC_INGRESS_NEXT_XCONNECT)
556 .withSelector(xcSelector1)
557 .withTreatment(xcTreatment1)
558 .build();
559 FlowRule expectedXcFlowRule2 = DefaultFlowRule.builder()
560 .forDevice(DEVICE_ID)
561 .fromApp(XCONNECT_APP_ID)
562 .makePermanent()
563 .withPriority(nextObjective.priority())
564 .forTable(FabricConstants.FABRIC_INGRESS_NEXT_XCONNECT)
565 .withSelector(xcSelector2)
566 .withTreatment(xcTreatment2)
567 .build();
568
569 ObjectiveTranslation expectedTranslation = ObjectiveTranslation.builder()
570 .addFlowRule(expectedXcFlowRule1)
571 .addFlowRule(expectedXcFlowRule2)
572 .build();
573
574 assertEquals(expectedTranslation, actualTranslation);
575 }
Yi Tseng0b809722017-11-03 10:23:26 -0700576}