blob: 8e9be87a43d40e42545052bba26d6ddad643d470 [file] [log] [blame]
Jian Lia0778172018-07-16 22:50:19 +09001/*
2 * Copyright 2018-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 */
16package org.onosproject.openstacknetworking.impl;
17
18import com.google.common.collect.Lists;
19import com.google.common.collect.Maps;
20import com.google.common.collect.Sets;
21import com.google.common.util.concurrent.MoreExecutors;
22import org.junit.After;
23import org.junit.Before;
24import org.junit.Test;
25import org.onlab.junit.TestUtils;
Daniel Park1099d142019-02-18 17:39:56 +090026import org.onlab.packet.IpAddress;
Jian Lia0778172018-07-16 22:50:19 +090027import org.onosproject.cluster.ClusterServiceAdapter;
28import org.onosproject.cluster.LeadershipServiceAdapter;
29import org.onosproject.core.ApplicationId;
30import org.onosproject.core.CoreServiceAdapter;
31import org.onosproject.core.DefaultApplicationId;
32import org.onosproject.net.DeviceId;
33import org.onosproject.net.flow.DefaultFlowRule;
34import org.onosproject.net.flow.DefaultTrafficSelector;
35import org.onosproject.net.flow.DefaultTrafficTreatment;
36import org.onosproject.net.flow.FlowRule;
37import org.onosproject.net.flow.FlowRuleOperation;
38import org.onosproject.net.flow.FlowRuleOperations;
39import org.onosproject.net.flow.FlowRuleServiceAdapter;
40import org.onosproject.net.flow.TrafficSelector;
41import org.onosproject.net.flow.TrafficTreatment;
Daniel Park1099d142019-02-18 17:39:56 +090042import org.onosproject.openstacknode.api.DefaultOpenstackNode;
43import org.onosproject.openstacknode.api.NodeState;
44import org.onosproject.openstacknode.api.OpenstackNode;
Jian Lia0778172018-07-16 22:50:19 +090045
46import java.util.List;
47import java.util.Map;
48import java.util.Set;
49
50import static org.junit.Assert.assertEquals;
Jian Li1e9cb732018-11-25 23:17:21 +090051import static org.onosproject.openstacknetworking.api.Constants.ACL_EGRESS_TABLE;
52import static org.onosproject.openstacknetworking.api.Constants.ACL_INGRESS_TABLE;
Jian Li5c09e212018-10-24 18:23:58 +090053import static org.onosproject.openstacknetworking.api.Constants.ARP_TABLE;
54import static org.onosproject.openstacknetworking.api.Constants.DHCP_TABLE;
Jian Lia0778172018-07-16 22:50:19 +090055import static org.onosproject.openstacknetworking.api.Constants.FLAT_TABLE;
56import static org.onosproject.openstacknetworking.api.Constants.FORWARDING_TABLE;
57import static org.onosproject.openstacknetworking.api.Constants.JUMP_TABLE;
Jian Li1cfad062020-12-11 21:34:41 +090058import static org.onosproject.openstacknetworking.api.Constants.PRE_FLAT_TABLE;
Jian Lia0778172018-07-16 22:50:19 +090059import static org.onosproject.openstacknetworking.api.Constants.STAT_INBOUND_TABLE;
60import static org.onosproject.openstacknetworking.api.Constants.STAT_OUTBOUND_TABLE;
61import static org.onosproject.openstacknetworking.api.Constants.VTAG_TABLE;
Jian Lia0778172018-07-16 22:50:19 +090062import static org.onosproject.openstacknetworking.api.Constants.VTAP_INBOUND_TABLE;
63import static org.onosproject.openstacknetworking.api.Constants.VTAP_OUTBOUND_TABLE;
64
65/**
66 * Unit tests for flow rule manager.
67 */
68public class OpenstackFlowRuleManagerTest {
69
70 private static final ApplicationId TEST_APP_ID =
71 new DefaultApplicationId(1, "test");
72
73 private static final int DROP_PRIORITY = 0;
74
75 private static final DeviceId DEVICE_ID = DeviceId.deviceId("of:000000000000000a");
76
77 private OpenstackFlowRuleManager target;
78
79 private Set<FlowRuleOperation> fros;
80
81 /**
82 * Initial setup for this unit test.
83 */
84 @Before
85 public void setUp() {
86 target = new OpenstackFlowRuleManager();
87 TestUtils.setField(target, "coreService", new TestCoreService());
88 TestUtils.setField(target, "flowRuleService", new TestFlowRuleService());
89 TestUtils.setField(target, "clusterService", new TestClusterService());
90 TestUtils.setField(target, "leadershipService", new TestLeadershipService());
91 TestUtils.setField(target, "osNodeService", new TestOpenstackNodeService());
92 TestUtils.setField(target, "deviceEventExecutor", MoreExecutors.newDirectExecutorService());
93
94 target.activate();
95 }
96
97 /**
98 * Tears down of this unit test.
99 */
100 @After
101 public void tearDown() {
102 target.deactivate();
103 target = null;
104 }
105
106 /**
107 * Tests whether the set rule method installs the flow rules properly.
108 */
109 @Test
110 public void testSetRule() {
111 int testPriority = 10;
112 int testTableType = 10;
113
114 fros = Sets.newConcurrentHashSet();
115
116 TrafficSelector.Builder selectorBuilder = DefaultTrafficSelector.builder();
117 TrafficTreatment.Builder treatmentBuilder = DefaultTrafficTreatment.builder();
118
119 FlowRule.Builder flowRuleBuilder = DefaultFlowRule.builder()
120 .forDevice(DEVICE_ID)
121 .withSelector(selectorBuilder.build())
122 .withTreatment(treatmentBuilder.build())
123 .withPriority(testPriority)
124 .fromApp(TEST_APP_ID)
125 .forTable(testTableType)
126 .makePermanent();
127
128 target.setRule(TEST_APP_ID, DEVICE_ID, selectorBuilder.build(),
129 treatmentBuilder.build(), testPriority, testTableType, true);
130 validateFlowRule(flowRuleBuilder.build());
131 }
132
133 /**
134 * Tests whether the connect tables method installs the flow rules properly.
135 */
136 @Test
137 public void testConnectTables() {
138 int testFromTable = 1;
139 int testToTable = 2;
140
141 fros = Sets.newConcurrentHashSet();
142
143 TrafficSelector.Builder selectorBuilder = DefaultTrafficSelector.builder();
144 TrafficTreatment.Builder treatmentBuilder = DefaultTrafficTreatment.builder();
145
146 target.connectTables(DEVICE_ID, testFromTable, testToTable);
147
148 FlowRule.Builder flowRuleBuilder = DefaultFlowRule.builder()
149 .forDevice(DEVICE_ID)
150 .withSelector(selectorBuilder.build())
151 .withTreatment(treatmentBuilder.transition(testToTable).build())
152 .withPriority(DROP_PRIORITY)
153 .fromApp(TEST_APP_ID)
154 .forTable(testFromTable)
155 .makePermanent();
156
157 validateFlowRule(flowRuleBuilder.build());
158 }
159
160 /**
161 * Tests whether the setup table miss entry method installs the flow rules properly.
162 */
163 @Test
164 public void testSetUpTableMissEntry() {
165 int testTable = 10;
166
167 fros = Sets.newConcurrentHashSet();
168
169 TrafficSelector.Builder selectorBuilder = DefaultTrafficSelector.builder();
170 TrafficTreatment.Builder treatmentBuilder = DefaultTrafficTreatment.builder();
171
172 target.setUpTableMissEntry(DEVICE_ID, testTable);
173
174 FlowRule.Builder flowRuleBuilder = DefaultFlowRule.builder()
175 .forDevice(DEVICE_ID)
176 .withSelector(selectorBuilder.build())
177 .withTreatment(treatmentBuilder.drop().build())
178 .withPriority(DROP_PRIORITY)
179 .fromApp(TEST_APP_ID)
180 .forTable(testTable)
181 .makePermanent();
182
183 validateFlowRule(flowRuleBuilder.build());
184 }
185
186 /**
187 * Tests whether initialize pipeline method installs the flow rules properly.
188 */
189 @Test
190 public void testInitializePipeline() {
191
192 fros = Sets.newConcurrentHashSet();
193
194 target.initializePipeline(DEVICE_ID);
Jian Li1cfad062020-12-11 21:34:41 +0900195 assertEquals("Flow Rule size was not match", 12, fros.size());
Jian Lia0778172018-07-16 22:50:19 +0900196
197 Map<Integer, Integer> fromToTableMap = Maps.newConcurrentMap();
198 fromToTableMap.put(STAT_INBOUND_TABLE, VTAP_INBOUND_TABLE);
Jian Li5c09e212018-10-24 18:23:58 +0900199 fromToTableMap.put(VTAP_INBOUND_TABLE, DHCP_TABLE);
200 fromToTableMap.put(DHCP_TABLE, VTAG_TABLE);
201 fromToTableMap.put(VTAG_TABLE, ARP_TABLE);
Jian Li1e9cb732018-11-25 23:17:21 +0900202 fromToTableMap.put(ARP_TABLE, ACL_INGRESS_TABLE);
203 fromToTableMap.put(ACL_EGRESS_TABLE, JUMP_TABLE);
Jian Lia0778172018-07-16 22:50:19 +0900204 fromToTableMap.put(STAT_OUTBOUND_TABLE, VTAP_OUTBOUND_TABLE);
205 fromToTableMap.put(VTAP_OUTBOUND_TABLE, FORWARDING_TABLE);
Jian Li1cfad062020-12-11 21:34:41 +0900206 fromToTableMap.put(PRE_FLAT_TABLE, FLAT_TABLE);
Jian Lia0778172018-07-16 22:50:19 +0900207
208 fros.stream().map(FlowRuleOperation::rule).forEach(fr -> {
Daniel Park1099d142019-02-18 17:39:56 +0900209 if (fr.tableId() != JUMP_TABLE && fr.tableId() != FLAT_TABLE) {
Jian Lia0778172018-07-16 22:50:19 +0900210 assertEquals("To Table did not match,",
211 fromToTableMap.get(fr.tableId()),
212 fr.treatment().tableTransition().tableId());
213 }
214 });
215 }
216
217 private void validateFlowRule(FlowRule ref) {
218 assertEquals("Flow Rule size was not match", 1, fros.size());
219 List<FlowRuleOperation> froList = Lists.newArrayList();
220 froList.addAll(fros);
221 FlowRuleOperation fro = froList.get(0);
222 FlowRule fr = fro.rule();
223
224 assertEquals("Application ID did not match", ref.appId(), fr.appId());
225 assertEquals("Device ID did not match", ref.deviceId(), fr.deviceId());
226 assertEquals("Selector did not match", ref.selector(), fr.selector());
227 assertEquals("Treatment did not match", ref.treatment(), fr.treatment());
228 assertEquals("Priority did not match", ref.priority(), fr.priority());
229 assertEquals("Table ID did not match", ref.table(), fr.table());
230 assertEquals("Permanent did not match", ref.isPermanent(), fr.isPermanent());
231 }
232
233 private class TestOpenstackNodeService extends OpenstackNodeServiceAdapter {
Daniel Park1099d142019-02-18 17:39:56 +0900234 @Override
235 public OpenstackNode node(DeviceId deviceId) {
236 return DefaultOpenstackNode.builder()
237 .hostname("host")
238 .type(OpenstackNode.NodeType.COMPUTE)
239 .state(NodeState.COMPLETE)
240 .managementIp(IpAddress.valueOf("1.1.1.1"))
241 .dataIp(IpAddress.valueOf("1.1.1.1"))
242 .build();
243 }
Jian Lia0778172018-07-16 22:50:19 +0900244 }
245
246 private class TestFlowRuleService extends FlowRuleServiceAdapter {
247 @Override
248 public void apply(FlowRuleOperations ops) {
249 fros.addAll(ops.stages().get(0));
250 }
251 }
252
253 private class TestCoreService extends CoreServiceAdapter {
254
255 @Override
256 public ApplicationId registerApplication(String name) {
257 return TEST_APP_ID;
258 }
259 }
260
261 private class TestClusterService extends ClusterServiceAdapter {
262 }
263
264 private class TestLeadershipService extends LeadershipServiceAdapter {
265 }
266}