blob: 92c76159037defc16b28e48effbde3ed23fdddc5 [file] [log] [blame]
Hyunsun Moon090d77d2017-07-05 17:48:37 +09001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2017-present Open Networking Foundation
Hyunsun Moon090d77d2017-07-05 17:48:37 +09003 *
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.openstacknode.impl;
17
daniel park04c40cc2018-02-19 17:48:30 +090018import com.google.common.collect.ImmutableSet;
19import com.google.common.collect.Lists;
20import com.google.common.collect.Maps;
Jian Lie6312162018-03-21 21:41:00 +090021import com.google.common.collect.Sets;
daniel park04c40cc2018-02-19 17:48:30 +090022import com.google.common.util.concurrent.MoreExecutors;
Hyunsun Moon090d77d2017-07-05 17:48:37 +090023import org.junit.After;
24import org.junit.Before;
25import org.junit.Test;
26import org.onlab.junit.TestUtils;
27import org.onlab.packet.ChassisId;
28import org.onlab.packet.Ip4Address;
29import org.onlab.packet.IpAddress;
30import org.onlab.packet.MacAddress;
31import org.onlab.packet.VlanId;
32import org.onosproject.cfg.ComponentConfigAdapter;
33import org.onosproject.cluster.ClusterServiceAdapter;
34import org.onosproject.cluster.ControllerNode;
35import org.onosproject.cluster.DefaultControllerNode;
36import org.onosproject.cluster.LeadershipServiceAdapter;
37import org.onosproject.cluster.NodeId;
38import org.onosproject.core.ApplicationId;
39import org.onosproject.core.CoreServiceAdapter;
40import org.onosproject.core.DefaultApplicationId;
Hyunsun Moon090d77d2017-07-05 17:48:37 +090041import org.onosproject.net.Annotations;
42import org.onosproject.net.DefaultAnnotations;
43import org.onosproject.net.DefaultDevice;
44import org.onosproject.net.DefaultPort;
45import org.onosproject.net.Device;
46import org.onosproject.net.DeviceId;
47import org.onosproject.net.Port;
48import org.onosproject.net.PortNumber;
49import org.onosproject.net.behaviour.BridgeConfig;
50import org.onosproject.net.behaviour.BridgeDescription;
51import org.onosproject.net.behaviour.BridgeName;
Jian Li789fadb2018-07-10 13:59:47 +090052import org.onosproject.net.behaviour.ControllerInfo;
Hyunsun Moon090d77d2017-07-05 17:48:37 +090053import org.onosproject.net.behaviour.DefaultBridgeDescription;
54import org.onosproject.net.behaviour.ExtensionTreatmentResolver;
55import org.onosproject.net.behaviour.InterfaceConfig;
56import org.onosproject.net.behaviour.PatchDescription;
57import org.onosproject.net.behaviour.TunnelDescription;
58import org.onosproject.net.device.DefaultPortDescription;
59import org.onosproject.net.device.DeviceAdminService;
60import org.onosproject.net.device.DeviceEvent;
61import org.onosproject.net.device.DeviceInterfaceDescription;
62import org.onosproject.net.device.DeviceListener;
63import org.onosproject.net.device.DeviceServiceAdapter;
64import org.onosproject.net.device.PortDescription;
65import org.onosproject.net.driver.Behaviour;
66import org.onosproject.net.driver.DriverData;
67import org.onosproject.net.driver.DriverHandler;
68import org.onosproject.net.flow.instructions.ExtensionPropertyException;
69import org.onosproject.net.flow.instructions.ExtensionTreatment;
70import org.onosproject.net.flow.instructions.ExtensionTreatmentType;
Hyunsun Moon090d77d2017-07-05 17:48:37 +090071import org.onosproject.net.provider.ProviderId;
Jian Li5a38ab62018-07-02 22:34:11 +090072import org.onosproject.openstacknode.api.DefaultOpenstackNode;
Hyunsun Moon090d77d2017-07-05 17:48:37 +090073import org.onosproject.openstacknode.api.NodeState;
Jian Li27841662018-04-14 01:59:47 +090074import org.onosproject.openstacknode.api.OpenstackAuth;
Hyunsun Moon090d77d2017-07-05 17:48:37 +090075import org.onosproject.openstacknode.api.OpenstackNode;
Jian Lie6312162018-03-21 21:41:00 +090076import org.onosproject.openstacknode.api.OpenstackPhyInterface;
Hyunsun Moon090d77d2017-07-05 17:48:37 +090077import org.onosproject.ovsdb.controller.OvsdbClientService;
78import org.onosproject.ovsdb.controller.OvsdbController;
79
daniel park04c40cc2018-02-19 17:48:30 +090080import java.util.Collection;
81import java.util.List;
82import java.util.Map;
83import java.util.Objects;
84import java.util.Set;
85import java.util.stream.Collectors;
Hyunsun Moon090d77d2017-07-05 17:48:37 +090086
Ray Milkey0d47a552017-08-22 10:16:31 -070087import static org.easymock.EasyMock.anyObject;
88import static org.easymock.EasyMock.createMock;
Hyunsun Moon090d77d2017-07-05 17:48:37 +090089import static org.easymock.EasyMock.expect;
Ray Milkey0d47a552017-08-22 10:16:31 -070090import static org.easymock.EasyMock.replay;
Hyunsun Moon090d77d2017-07-05 17:48:37 +090091import static org.junit.Assert.assertEquals;
92import static org.onosproject.net.AnnotationKeys.PORT_NAME;
93import static org.onosproject.net.Device.Type.CONTROLLER;
94import static org.onosproject.net.Device.Type.SWITCH;
Ray Milkey0d47a552017-08-22 10:16:31 -070095import static org.onosproject.net.device.DeviceEvent.Type.DEVICE_ADDED;
96import static org.onosproject.net.device.DeviceEvent.Type.DEVICE_AVAILABILITY_CHANGED;
97import static org.onosproject.net.device.DeviceEvent.Type.PORT_ADDED;
98import static org.onosproject.net.device.DeviceEvent.Type.PORT_REMOVED;
99import static org.onosproject.openstacknode.api.Constants.DEFAULT_TUNNEL;
100import static org.onosproject.openstacknode.api.Constants.INTEGRATION_BRIDGE;
101import static org.onosproject.openstacknode.api.Constants.PATCH_INTG_BRIDGE;
102import static org.onosproject.openstacknode.api.Constants.PATCH_ROUT_BRIDGE;
103import static org.onosproject.openstacknode.api.Constants.ROUTER_BRIDGE;
104import static org.onosproject.openstacknode.api.NodeState.COMPLETE;
105import static org.onosproject.openstacknode.api.NodeState.DEVICE_CREATED;
106import static org.onosproject.openstacknode.api.NodeState.INCOMPLETE;
107import static org.onosproject.openstacknode.api.NodeState.INIT;
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900108import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.COMPUTE;
109import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.GATEWAY;
110
111/**
112 * Unit test for DefaultOpenstackNodeHandler.
113 */
114public class DefaultOpenstackNodeHandlerTest {
115
116 private static final ApplicationId TEST_APP_ID = new DefaultApplicationId(1, "test");
117 private static final String ERR_STATE_NOT_MATCH = "Node state did not match";
118 private static final NodeId LOCAL_NODE_ID = new NodeId("local");
119 private static final ControllerNode LOCAL_CTRL =
120 new DefaultControllerNode(LOCAL_NODE_ID, IpAddress.valueOf("127.0.0.1"));
121
122 private static final BridgeDescription ROUT_BRIDGE = DefaultBridgeDescription.builder()
123 .name(ROUTER_BRIDGE)
124 .failMode(BridgeDescription.FailMode.SECURE)
125 .disableInBand()
126 .build();
127
Yuta HIGUCHI53e47962018-03-01 23:50:48 -0800128 private static final PortDescription PATCH_ROUT = DefaultPortDescription.builder()
129 .withPortNumber(PortNumber.portNumber(1))
130 .isEnabled(true)
131 .annotations(DefaultAnnotations.builder()
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900132 .set(PORT_NAME, PATCH_ROUT_BRIDGE)
Yuta HIGUCHI53e47962018-03-01 23:50:48 -0800133 .build())
134 .build();
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900135
136 private static final String COMPUTE_1_HOSTNAME = "compute_1";
137 private static final String COMPUTE_2_HOSTNAME = "compute_2";
138 private static final String COMPUTE_3_HOSTNAME = "compute_3";
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900139 private static final String GATEWAY_1_HOSTNAME = "gateway_1";
140 private static final String GATEWAY_2_HOSTNAME = "gateway_2";
141 private static final String GATEWAY_3_HOSTNAME = "gateway_3";
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900142
143 private static final IpAddress COMPUTE_1_IP = IpAddress.valueOf("10.100.0.1");
144 private static final IpAddress COMPUTE_2_IP = IpAddress.valueOf("10.100.0.2");
145 private static final IpAddress COMPUTE_3_IP = IpAddress.valueOf("10.100.0.3");
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900146 private static final IpAddress GATEWAY_1_IP = IpAddress.valueOf("10.100.0.5");
147 private static final IpAddress GATEWAY_2_IP = IpAddress.valueOf("10.100.0.6");
148 private static final IpAddress GATEWAY_3_IP = IpAddress.valueOf("10.100.0.7");
daniel parkb18424c2018-02-05 15:43:43 +0900149
150 private static final String GATEWAY_UPLINK_PORT = "eth0";
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900151
Jian Lie6312162018-03-21 21:41:00 +0900152 private static final Set<OpenstackPhyInterface> COMPUTE_1_PHY_INTFS = createPhyIntfs();
153 private static final Set<OpenstackPhyInterface> COMPUTE_2_PHY_INTFS = createPhyIntfs();
154 private static final Set<OpenstackPhyInterface> COMPUTE_3_PHY_INTFS = createPhyIntfs();
155
Jian Li789fadb2018-07-10 13:59:47 +0900156 private static final Set<ControllerInfo> COMPUTE_1_CONTROLLERS = createControllers();
157 private static final Set<ControllerInfo> COMPUTE_2_CONTROLLERS = createControllers();
158 private static final Set<ControllerInfo> COMPUTE_3_CONTROLLERS = createControllers();
159
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900160 private static final Device COMPUTE_1_INTG_DEVICE = createOpenFlowDevice(1, INTEGRATION_BRIDGE);
161 private static final Device COMPUTE_2_INTG_DEVICE = createOpenFlowDevice(2, INTEGRATION_BRIDGE);
162 private static final Device COMPUTE_3_INTG_DEVICE = createOpenFlowDevice(3, INTEGRATION_BRIDGE);
daniel parkb18424c2018-02-05 15:43:43 +0900163 private static final Device GATEWAY_1_INTG_DEVICE = createOpenFlowDevice(4, INTEGRATION_BRIDGE);
164 private static final Device GATEWAY_2_INTG_DEVICE = createOpenFlowDevice(5, INTEGRATION_BRIDGE);
165 private static final Device GATEWAY_3_INTG_DEVICE = createOpenFlowDevice(6, INTEGRATION_BRIDGE);
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900166
167 private static final Device COMPUTE_1_OVSDB_DEVICE = createOvsdbDevice(COMPUTE_1_IP);
168 private static final Device COMPUTE_2_OVSDB_DEVICE = createOvsdbDevice(COMPUTE_2_IP);
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900169 private static final Device GATEWAY_1_OVSDB_DEVICE = createOvsdbDevice(GATEWAY_1_IP);
170 private static final Device GATEWAY_2_OVSDB_DEVICE = createOvsdbDevice(GATEWAY_2_IP);
171
172 private static final OpenstackNode COMPUTE_1 = createNode(
173 COMPUTE_1_HOSTNAME,
174 COMPUTE,
175 COMPUTE_1_INTG_DEVICE,
176 COMPUTE_1_IP,
Jian Lie6312162018-03-21 21:41:00 +0900177 INIT,
Jian Li789fadb2018-07-10 13:59:47 +0900178 COMPUTE_1_PHY_INTFS,
179 COMPUTE_1_CONTROLLERS
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900180 );
181
182 private static final OpenstackNode COMPUTE_2 = createNode(
183 COMPUTE_2_HOSTNAME,
184 COMPUTE,
185 COMPUTE_2_INTG_DEVICE,
186 COMPUTE_2_IP,
Jian Lie6312162018-03-21 21:41:00 +0900187 DEVICE_CREATED,
Jian Li789fadb2018-07-10 13:59:47 +0900188 COMPUTE_2_PHY_INTFS,
189 COMPUTE_2_CONTROLLERS
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900190 );
191
192 private static final OpenstackNode COMPUTE_3 = createNode(
193 COMPUTE_3_HOSTNAME,
194 COMPUTE,
195 COMPUTE_3_INTG_DEVICE,
196 COMPUTE_3_IP,
Jian Lie6312162018-03-21 21:41:00 +0900197 COMPLETE,
Jian Li789fadb2018-07-10 13:59:47 +0900198 COMPUTE_3_PHY_INTFS,
199 COMPUTE_3_CONTROLLERS
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900200 );
201
Jian Lie6312162018-03-21 21:41:00 +0900202 private static final OpenstackNode GATEWAY_1 = createGatewayNode(
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900203 GATEWAY_1_HOSTNAME,
204 GATEWAY,
205 GATEWAY_1_INTG_DEVICE,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900206 GATEWAY_1_IP,
daniel parkb18424c2018-02-05 15:43:43 +0900207 GATEWAY_UPLINK_PORT,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900208 INIT
209 );
210
Jian Lie6312162018-03-21 21:41:00 +0900211 private static final OpenstackNode GATEWAY_2 = createGatewayNode(
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900212 GATEWAY_2_HOSTNAME,
213 GATEWAY,
214 GATEWAY_2_INTG_DEVICE,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900215 GATEWAY_2_IP,
daniel parkb18424c2018-02-05 15:43:43 +0900216 GATEWAY_UPLINK_PORT,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900217 DEVICE_CREATED
218 );
219
Jian Lie6312162018-03-21 21:41:00 +0900220 private static final OpenstackNode GATEWAY_3 = createGatewayNode(
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900221 GATEWAY_3_HOSTNAME,
222 GATEWAY,
223 GATEWAY_3_INTG_DEVICE,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900224 GATEWAY_3_IP,
daniel parkb18424c2018-02-05 15:43:43 +0900225 GATEWAY_UPLINK_PORT,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900226 COMPLETE
227 );
228
229 private static final TestDeviceService TEST_DEVICE_SERVICE = new TestDeviceService();
230
231 private TestOpenstackNodeManager testNodeManager;
232 private DefaultOpenstackNodeHandler target;
233
234 @Before
235 public void setUp() throws Exception {
236 DeviceAdminService mockDeviceAdminService = createMock(DeviceAdminService.class);
237 mockDeviceAdminService.removeDevice(anyObject());
238 replay(mockDeviceAdminService);
239
240 OvsdbClientService mockOvsdbClient = createMock(OvsdbClientService.class);
241 expect(mockOvsdbClient.isConnected())
242 .andReturn(true)
243 .anyTimes();
244 replay(mockOvsdbClient);
245
246 OvsdbController mockOvsdbController = createMock(OvsdbController.class);
247 expect(mockOvsdbController.getOvsdbClient(anyObject()))
248 .andReturn(mockOvsdbClient)
249 .anyTimes();
250 replay(mockOvsdbController);
251
252 testNodeManager = new TestOpenstackNodeManager();
253 target = new DefaultOpenstackNodeHandler();
254
255 target.coreService = new TestCoreService();
256 target.leadershipService = new TestLeadershipService();
257 target.clusterService = new TestClusterService();
258 target.deviceService = TEST_DEVICE_SERVICE;
259 target.deviceAdminService = mockDeviceAdminService;
260 target.ovsdbController = mockOvsdbController;
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900261 target.osNodeService = testNodeManager;
262 target.osNodeAdminService = testNodeManager;
263 target.componentConfigService = new TestComponentConfigService();
264 TestUtils.setField(target, "eventExecutor", MoreExecutors.newDirectExecutorService());
265 target.activate();
266 }
267
268 @After
269 public void tearDown() {
270 TEST_DEVICE_SERVICE.clear();
271 target.deactivate();
272 target = null;
273 testNodeManager = null;
274 }
275
276 /**
277 * Checks if the compute node state changes from INIT to DEVICE_CREATED
278 * after processing INIT state.
279 */
280 @Test
281 public void testComputeNodeProcessNodeInitState() {
282 testNodeManager.createNode(COMPUTE_1);
283 TEST_DEVICE_SERVICE.devMap.put(COMPUTE_1_OVSDB_DEVICE.id(), COMPUTE_1_OVSDB_DEVICE);
284
285 assertEquals(ERR_STATE_NOT_MATCH, INIT,
286 testNodeManager.node(COMPUTE_1_HOSTNAME).state());
287 target.processInitState(COMPUTE_1);
288 assertEquals(ERR_STATE_NOT_MATCH, DEVICE_CREATED,
289 testNodeManager.node(COMPUTE_1_HOSTNAME).state());
290 }
291
292 /**
293 * Checks if the gateway node state changes from INIT to DEVICE_CREATED
294 * after processing INIT state.
295 */
296 @Test
297 public void testGatewayNodeProcessNodeInitState() {
298 testNodeManager.createNode(GATEWAY_1);
299 TEST_DEVICE_SERVICE.devMap.put(GATEWAY_1_OVSDB_DEVICE.id(), GATEWAY_1_OVSDB_DEVICE);
300
301 assertEquals(ERR_STATE_NOT_MATCH, INIT,
302 testNodeManager.node(GATEWAY_1_HOSTNAME).state());
303 target.processInitState(GATEWAY_1);
304 assertEquals(ERR_STATE_NOT_MATCH, DEVICE_CREATED,
305 testNodeManager.node(GATEWAY_1_HOSTNAME).state());
306 }
307
308 /**
309 * Checks if the compute node state changes from DEVICE_CREATED to
310 * PORT_CREATED after processing DEVICE_CREATED state.
311 */
312 @Test
313 public void testComputeNodeProcessDeviceCreatedState() {
314 testNodeManager.createNode(COMPUTE_2);
315 TEST_DEVICE_SERVICE.devMap.put(COMPUTE_2_OVSDB_DEVICE.id(), COMPUTE_2_OVSDB_DEVICE);
316 TEST_DEVICE_SERVICE.devMap.put(COMPUTE_2_INTG_DEVICE.id(), COMPUTE_2_INTG_DEVICE);
317
318 assertEquals(ERR_STATE_NOT_MATCH, DEVICE_CREATED,
319 testNodeManager.node(COMPUTE_2_HOSTNAME).state());
320 target.processDeviceCreatedState(COMPUTE_2);
daniel parkb18424c2018-02-05 15:43:43 +0900321 assertEquals(ERR_STATE_NOT_MATCH, COMPLETE,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900322 testNodeManager.node(COMPUTE_2_HOSTNAME).state());
323 }
324
325 /**
326 * Checks if the gateway node state changes from DEVICE_CREATED to
327 * PORT_CREATED after processing DEVICE_CREATED state.
328 */
329 @Test
330 public void testGatewayNodeProcessDeviceCreatedState() {
331 testNodeManager.createNode(GATEWAY_2);
332 TEST_DEVICE_SERVICE.devMap.put(GATEWAY_2_OVSDB_DEVICE.id(), GATEWAY_2_OVSDB_DEVICE);
333 TEST_DEVICE_SERVICE.devMap.put(GATEWAY_2_INTG_DEVICE.id(), GATEWAY_2_INTG_DEVICE);
daniel parkb18424c2018-02-05 15:43:43 +0900334 TEST_DEVICE_SERVICE.portList.add(createPort(GATEWAY_2_INTG_DEVICE, GATEWAY_UPLINK_PORT));
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900335
336 assertEquals(ERR_STATE_NOT_MATCH, DEVICE_CREATED,
337 testNodeManager.node(GATEWAY_2_HOSTNAME).state());
338 target.processDeviceCreatedState(GATEWAY_2);
daniel parkb18424c2018-02-05 15:43:43 +0900339 assertEquals(ERR_STATE_NOT_MATCH, COMPLETE,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900340 testNodeManager.node(GATEWAY_2_HOSTNAME).state());
341 }
342
343 /**
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900344 * Checks if the compute node state changes from COMPLETE to INCOMPLETE
345 * when integration bridge is disconnected.
346 */
347 @Test
348 public void testBackToIncompleteWhenBrIntDisconnected() {
daniel parkb18424c2018-02-05 15:43:43 +0900349 testNodeManager.createNode(COMPUTE_3);
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900350
351 assertEquals(ERR_STATE_NOT_MATCH, COMPLETE,
daniel parkb18424c2018-02-05 15:43:43 +0900352 testNodeManager.node(COMPUTE_3_HOSTNAME).state());
353 TEST_DEVICE_SERVICE.removeDevice(COMPUTE_3_INTG_DEVICE);
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900354 assertEquals(ERR_STATE_NOT_MATCH, INCOMPLETE,
daniel parkb18424c2018-02-05 15:43:43 +0900355 testNodeManager.node(COMPUTE_3_HOSTNAME).state());
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900356 }
357
358 /**
359 * Checks if the compute node state changes from COMPLETE to INCOMPLETE
360 * when vxlan port is removed from integration bridge.
361 */
362 @Test
363 public void testBackToIncompleteWhenVxlanRemoved() {
daniel parkb18424c2018-02-05 15:43:43 +0900364 testNodeManager.createNode(COMPUTE_3);
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900365
366 assertEquals(ERR_STATE_NOT_MATCH, COMPLETE,
daniel parkb18424c2018-02-05 15:43:43 +0900367 testNodeManager.node(COMPUTE_3_HOSTNAME).state());
368 TEST_DEVICE_SERVICE.removePort(COMPUTE_3_INTG_DEVICE, createPort(
369 COMPUTE_3_INTG_DEVICE, DEFAULT_TUNNEL));
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900370 assertEquals(ERR_STATE_NOT_MATCH, INCOMPLETE,
daniel parkb18424c2018-02-05 15:43:43 +0900371 testNodeManager.node(COMPUTE_3_HOSTNAME).state());
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900372
373 }
374
375 private static Device createOvsdbDevice(IpAddress ovsdbIp) {
376 return new TestDevice(new ProviderId("of", "foo"),
377 DeviceId.deviceId("ovsdb:" + ovsdbIp.toString()),
378 CONTROLLER,
379 "manufacturer",
380 "hwVersion",
381 "swVersion",
382 "serialNumber",
383 new ChassisId(1));
384 }
385
386 private static Device createOpenFlowDevice(long devIdNum, String type) {
387 return new TestDevice(new ProviderId("of", "foo"),
388 DeviceId.deviceId(String.format("of:%016d", devIdNum)),
389 SWITCH,
390 type,
391 "hwVersion",
392 "swVersion",
393 "serialNumber",
394 new ChassisId(1));
395 }
396
397 private static Port createPort(Device device, String portName) {
398 return new DefaultPort(device,
399 PortNumber.portNumber(1),
400 true,
401 DefaultAnnotations.builder().set(PORT_NAME, portName).build());
402 }
403
Jian Lie6312162018-03-21 21:41:00 +0900404 private static Set<OpenstackPhyInterface> createPhyIntfs() {
405 return Sets.newConcurrentHashSet();
406 }
407
Jian Li789fadb2018-07-10 13:59:47 +0900408 private static Set<ControllerInfo> createControllers() {
409 return Sets.newConcurrentHashSet();
410 }
411
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900412 private static OpenstackNode createNode(String hostname,
413 OpenstackNode.NodeType type,
414 Device intgBridge,
415 IpAddress ipAddr,
Jian Lie6312162018-03-21 21:41:00 +0900416 NodeState state,
Jian Li789fadb2018-07-10 13:59:47 +0900417 Set<OpenstackPhyInterface> phyIntfs,
418 Set<ControllerInfo> controllers) {
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900419 return new TestOpenstackNode(
420 hostname,
421 type,
422 intgBridge.id(),
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900423 ipAddr,
424 ipAddr,
Jian Li789fadb2018-07-10 13:59:47 +0900425 null, null, state, phyIntfs, controllers, null, null);
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900426 }
427
Jian Lie6312162018-03-21 21:41:00 +0900428 private static OpenstackNode createGatewayNode(String hostname,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900429 OpenstackNode.NodeType type,
430 Device intgBridge,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900431 IpAddress ipAddr,
daniel parkb18424c2018-02-05 15:43:43 +0900432 String uplinkPort,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900433 NodeState state) {
434 return new TestOpenstackNode(
435 hostname,
436 type,
437 intgBridge.id(),
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900438 ipAddr,
439 ipAddr,
Jian Li789fadb2018-07-10 13:59:47 +0900440 null, uplinkPort, state, null, null, null, null);
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900441 }
442
443 private static final class TestDevice extends DefaultDevice {
444 private TestDevice(ProviderId providerId,
445 DeviceId id,
446 Type type,
447 String manufacturer,
448 String hwVersion,
449 String swVersion,
450 String serialNumber,
451 ChassisId chassisId,
452 Annotations... annotations) {
453 super(providerId,
454 id,
455 type,
456 manufacturer,
457 hwVersion,
458 swVersion,
459 serialNumber,
460 chassisId,
461 annotations);
462 }
463
464 @Override
465 @SuppressWarnings("unchecked")
466 public <B extends Behaviour> B as(Class<B> projectionClass) {
467 if (projectionClass.equals(BridgeConfig.class)) {
468 return (B) new TestBridgeConfig();
469 } else if (projectionClass.equals(InterfaceConfig.class)) {
470 return (B) new TestInterfaceConfig();
471 } else if (projectionClass.equals(ExtensionTreatmentResolver.class)) {
472 ExtensionTreatmentResolver treatmentResolver = createMock(ExtensionTreatmentResolver.class);
473 expect(treatmentResolver.getExtensionInstruction(anyObject()))
474 .andReturn(new TestExtensionTreatment())
475 .anyTimes();
476 replay(treatmentResolver);
477 return (B) treatmentResolver;
478 } else {
479 return null;
480 }
481 }
482
483 @Override
484 public <B extends Behaviour> boolean is(Class<B> projectionClass) {
485 return true;
486 }
487 }
488
489 private static final class TestOpenstackNode extends DefaultOpenstackNode {
490 private TestOpenstackNode(String hostname,
491 NodeType type,
492 DeviceId intgBridge,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900493 IpAddress managementIp,
494 IpAddress dataIp,
495 String vlanIntf,
daniel parkb18424c2018-02-05 15:43:43 +0900496 String uplinkPort,
Jian Lie6312162018-03-21 21:41:00 +0900497 NodeState state,
Jian Li27841662018-04-14 01:59:47 +0900498 Set<OpenstackPhyInterface> phyIntfs,
Jian Li789fadb2018-07-10 13:59:47 +0900499 Set<ControllerInfo> controllers,
Jian Li92d42fc2018-05-25 16:23:49 +0900500 OpenstackAuth auth,
501 String endPoint) {
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900502 super(hostname,
503 type,
504 intgBridge,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900505 managementIp,
506 dataIp,
507 vlanIntf,
daniel parkb18424c2018-02-05 15:43:43 +0900508 uplinkPort,
Jian Lie6312162018-03-21 21:41:00 +0900509 state,
Jian Li27841662018-04-14 01:59:47 +0900510 phyIntfs,
Jian Li789fadb2018-07-10 13:59:47 +0900511 controllers,
Jian Li92d42fc2018-05-25 16:23:49 +0900512 auth,
513 endPoint);
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900514 }
515
516 @Override
517 public PortNumber tunnelPortNum() {
518 return PortNumber.portNumber(1);
519 }
520
521 @Override
522 public PortNumber vlanPortNum() {
523 return PortNumber.portNumber(1);
524 }
525
526 @Override
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900527 public MacAddress vlanPortMac() {
528 return MacAddress.NONE;
529 }
530 }
531
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900532 private static class TestDeviceService extends DeviceServiceAdapter {
533 Map<DeviceId, Device> devMap = Maps.newHashMap();
534 List<Port> portList = Lists.newArrayList();
535 List<DeviceListener> listeners = Lists.newArrayList();
536
537 @Override
538 public void addListener(DeviceListener listener) {
539 listeners.add(listener);
540 }
541
542 @Override
543 public void removeListener(DeviceListener listener) {
544 listeners.remove(listener);
545 }
546
547 @Override
548 public Device getDevice(DeviceId deviceId) {
549 return devMap.get(deviceId);
550 }
551
552 @Override
553 public List<Port> getPorts(DeviceId deviceId) {
554 return this.portList.stream()
555 .filter(p -> p.element().id().equals(deviceId))
556 .collect(Collectors.toList());
557 }
558
559 @Override
560 public boolean isAvailable(DeviceId deviceId) {
561 return devMap.containsKey(deviceId);
562 }
563
564 void addDevice(Device device) {
565 devMap.put(device.id(), device);
566 DeviceEvent event = new DeviceEvent(DEVICE_ADDED, device);
567 listeners.stream().filter(l -> l.isRelevant(event)).forEach(l -> l.event(event));
568 }
569
570 void removeDevice(Device device) {
571 devMap.remove(device.id());
572 DeviceEvent event = new DeviceEvent(DEVICE_AVAILABILITY_CHANGED, device);
573 listeners.stream().filter(l -> l.isRelevant(event)).forEach(l -> l.event(event));
574 }
575
576 void addPort(Device device, Port port) {
577 portList.add(port);
578 DeviceEvent event = new DeviceEvent(PORT_ADDED, device, port);
579 listeners.stream().filter(l -> l.isRelevant(event)).forEach(l -> l.event(event));
580 }
581
582 void removePort(Device device, Port port) {
583 portList.remove(port);
584 DeviceEvent event = new DeviceEvent(PORT_REMOVED, device, port);
585 listeners.stream().filter(l -> l.isRelevant(event)).forEach(l -> l.event(event));
586 }
587
588 void clear() {
589 this.listeners.clear();
590 this.devMap.clear();
591 this.portList.clear();
592 }
593 }
594
595 private static class TestBridgeConfig implements BridgeConfig {
596
597 @Override
598 public DriverData data() {
599 return null;
600 }
601
602 @Override
603 public void setData(DriverData data) {
604
605 }
606
607 @Override
608 public DriverHandler handler() {
609 return null;
610 }
611
612 @Override
613 public void setHandler(DriverHandler handler) {
614
615 }
616
617 @Override
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900618 public boolean addBridge(BridgeDescription bridge) {
619 TEST_DEVICE_SERVICE.addDevice(new DefaultDevice(new ProviderId("of", "foo"),
620 DeviceId.deviceId("of:" + bridge.datapathId().get()),
621 SWITCH,
622 bridge.name(),
623 "hwVersion",
624 "swVersion",
625 "serialNumber",
626 new ChassisId(1)));
627 return true;
628 }
629
630 @Override
631 public void deleteBridge(BridgeName bridgeName) {
632
633 }
634
635 @Override
636 public Collection<BridgeDescription> getBridges() {
637 return ImmutableSet.of(ROUT_BRIDGE);
638 }
639
640 @Override
641 public void addPort(BridgeName bridgeName, String portName) {
642
643 }
644
645 @Override
646 public void deletePort(BridgeName bridgeName, String portName) {
647
648 }
649
650 @Override
651 public Collection<PortDescription> getPorts() {
652 return ImmutableSet.of(PATCH_ROUT);
653 }
654
655 @Override
656 public Set<PortNumber> getPortNumbers() {
657 return null;
658 }
659
660 @Override
661 public List<PortNumber> getLocalPorts(Iterable<String> ifaceIds) {
662 return null;
663 }
664 }
665
666 private static class TestInterfaceConfig implements InterfaceConfig {
667
668 @Override
669 public DriverData data() {
670 return null;
671 }
672
673 @Override
674 public void setData(DriverData data) {
675
676 }
677
678 @Override
679 public DriverHandler handler() {
680 return null;
681 }
682
683 @Override
684 public void setHandler(DriverHandler handler) {
685
686 }
687
688 @Override
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900689 public boolean addAccessMode(String intf, VlanId vlanId) {
690 return false;
691 }
692
693 @Override
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900694 public boolean removeAccessMode(String intf) {
695 return false;
696 }
697
698 @Override
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900699 public boolean addTrunkMode(String intf, List<VlanId> vlanIds) {
700 return false;
701 }
702
703 @Override
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900704 public boolean removeTrunkMode(String intf) {
705 return false;
706 }
707
708 @Override
709 public boolean addRateLimit(String intf, short limit) {
710 return false;
711 }
712
713 @Override
714 public boolean removeRateLimit(String intf) {
715 return false;
716 }
717
718 @Override
719 public boolean addTunnelMode(String intf, TunnelDescription tunnelDesc) {
720 TEST_DEVICE_SERVICE.devMap.values().stream()
721 .filter(device -> device.type() == SWITCH &&
722 device.manufacturer().equals(INTEGRATION_BRIDGE))
723 .forEach(device -> {
724 TEST_DEVICE_SERVICE.addPort(device, createPort(device, intf));
725 });
726 return true;
727 }
728
729 @Override
730 public boolean removeTunnelMode(String intf) {
731 return false;
732 }
733
734 @Override
735 public boolean addPatchMode(String ifaceName, PatchDescription patchInterface) {
736 if (ifaceName.equals(PATCH_INTG_BRIDGE)) {
737 TEST_DEVICE_SERVICE.devMap.values().stream()
738 .filter(device -> device.type() == SWITCH &&
739 device.manufacturer().equals(INTEGRATION_BRIDGE))
740 .forEach(device -> {
741 TEST_DEVICE_SERVICE.addPort(device, createPort(device, ifaceName));
742 });
743 } else if (ifaceName.equals(PATCH_ROUT_BRIDGE)) {
744 TEST_DEVICE_SERVICE.devMap.values().stream()
745 .filter(device -> device.type() == SWITCH &&
746 device.manufacturer().equals(ROUTER_BRIDGE))
747 .forEach(device -> {
748 TEST_DEVICE_SERVICE.addPort(device, createPort(device, ifaceName));
749 });
750 }
751 return true;
752 }
753
754 @Override
755 public boolean removePatchMode(String ifaceName) {
756 return false;
757 }
758
759 @Override
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900760 public List<DeviceInterfaceDescription> getInterfaces() {
761 return null;
762 }
763 }
764
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900765 private static class TestExtensionTreatment implements ExtensionTreatment {
766 Ip4Address tunnelDst;
767
768 @Override
769 public ExtensionTreatmentType type() {
770 return null;
771 }
772
773 @Override
774 public <T> void setPropertyValue(String key, T value) throws ExtensionPropertyException {
775 tunnelDst = (Ip4Address) value;
776 }
777
778 @Override
779 public <T> T getPropertyValue(String key) throws ExtensionPropertyException {
780 return null;
781 }
782
783 @Override
784 public List<String> getProperties() {
785 return null;
786 }
787
788 @Override
789 public byte[] serialize() {
790 return new byte[0];
791 }
792
793 @Override
794 public void deserialize(byte[] data) {
795
796 }
797
798 @Override
799 public boolean equals(Object obj) {
800 TestExtensionTreatment that = (TestExtensionTreatment) obj;
801 return Objects.equals(tunnelDst, that.tunnelDst);
802 }
803
804 @Override
805 public int hashCode() {
806 return Objects.hash(tunnelDst);
807 }
808 }
809
810 private static class TestCoreService extends CoreServiceAdapter {
811
812 @Override
813 public ApplicationId getAppId(String name) {
814 return TEST_APP_ID;
815 }
816 }
817
818 private static class TestLeadershipService extends LeadershipServiceAdapter {
819
820 @Override
821 public NodeId getLeader(String path) {
822 return LOCAL_NODE_ID;
823 }
824 }
825
826 private static class TestClusterService extends ClusterServiceAdapter {
827
828 @Override
829 public ControllerNode getLocalNode() {
830 return LOCAL_CTRL;
831 }
832 }
833
834 private class TestComponentConfigService extends ComponentConfigAdapter {
835
836 }
837}