blob: e24b4e442272eaa8c79a0e941def7acdc9843e43 [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;
Daniel Parkdeefa702018-07-17 17:55:51 +090077import org.onosproject.openstacknode.api.OpenstackSshAuth;
Hyunsun Moon090d77d2017-07-05 17:48:37 +090078import org.onosproject.ovsdb.controller.OvsdbClientService;
79import org.onosproject.ovsdb.controller.OvsdbController;
80
daniel park04c40cc2018-02-19 17:48:30 +090081import java.util.Collection;
82import java.util.List;
83import java.util.Map;
84import java.util.Objects;
85import java.util.Set;
86import java.util.stream.Collectors;
Hyunsun Moon090d77d2017-07-05 17:48:37 +090087
Ray Milkey0d47a552017-08-22 10:16:31 -070088import static org.easymock.EasyMock.anyObject;
89import static org.easymock.EasyMock.createMock;
Hyunsun Moon090d77d2017-07-05 17:48:37 +090090import static org.easymock.EasyMock.expect;
Ray Milkey0d47a552017-08-22 10:16:31 -070091import static org.easymock.EasyMock.replay;
Hyunsun Moon090d77d2017-07-05 17:48:37 +090092import static org.junit.Assert.assertEquals;
93import static org.onosproject.net.AnnotationKeys.PORT_NAME;
94import static org.onosproject.net.Device.Type.CONTROLLER;
95import static org.onosproject.net.Device.Type.SWITCH;
Ray Milkey0d47a552017-08-22 10:16:31 -070096import static org.onosproject.net.device.DeviceEvent.Type.DEVICE_ADDED;
97import static org.onosproject.net.device.DeviceEvent.Type.DEVICE_AVAILABILITY_CHANGED;
98import static org.onosproject.net.device.DeviceEvent.Type.PORT_ADDED;
99import static org.onosproject.net.device.DeviceEvent.Type.PORT_REMOVED;
100import static org.onosproject.openstacknode.api.Constants.DEFAULT_TUNNEL;
101import static org.onosproject.openstacknode.api.Constants.INTEGRATION_BRIDGE;
102import static org.onosproject.openstacknode.api.Constants.PATCH_INTG_BRIDGE;
103import static org.onosproject.openstacknode.api.Constants.PATCH_ROUT_BRIDGE;
104import static org.onosproject.openstacknode.api.Constants.ROUTER_BRIDGE;
105import static org.onosproject.openstacknode.api.NodeState.COMPLETE;
106import static org.onosproject.openstacknode.api.NodeState.DEVICE_CREATED;
107import static org.onosproject.openstacknode.api.NodeState.INCOMPLETE;
108import static org.onosproject.openstacknode.api.NodeState.INIT;
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900109import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.COMPUTE;
110import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.GATEWAY;
111
112/**
113 * Unit test for DefaultOpenstackNodeHandler.
114 */
115public class DefaultOpenstackNodeHandlerTest {
116
117 private static final ApplicationId TEST_APP_ID = new DefaultApplicationId(1, "test");
118 private static final String ERR_STATE_NOT_MATCH = "Node state did not match";
119 private static final NodeId LOCAL_NODE_ID = new NodeId("local");
120 private static final ControllerNode LOCAL_CTRL =
121 new DefaultControllerNode(LOCAL_NODE_ID, IpAddress.valueOf("127.0.0.1"));
122
123 private static final BridgeDescription ROUT_BRIDGE = DefaultBridgeDescription.builder()
124 .name(ROUTER_BRIDGE)
125 .failMode(BridgeDescription.FailMode.SECURE)
126 .disableInBand()
127 .build();
128
Yuta HIGUCHI53e47962018-03-01 23:50:48 -0800129 private static final PortDescription PATCH_ROUT = DefaultPortDescription.builder()
130 .withPortNumber(PortNumber.portNumber(1))
131 .isEnabled(true)
132 .annotations(DefaultAnnotations.builder()
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900133 .set(PORT_NAME, PATCH_ROUT_BRIDGE)
Yuta HIGUCHI53e47962018-03-01 23:50:48 -0800134 .build())
135 .build();
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900136
137 private static final String COMPUTE_1_HOSTNAME = "compute_1";
138 private static final String COMPUTE_2_HOSTNAME = "compute_2";
139 private static final String COMPUTE_3_HOSTNAME = "compute_3";
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900140 private static final String GATEWAY_1_HOSTNAME = "gateway_1";
141 private static final String GATEWAY_2_HOSTNAME = "gateway_2";
142 private static final String GATEWAY_3_HOSTNAME = "gateway_3";
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900143
144 private static final IpAddress COMPUTE_1_IP = IpAddress.valueOf("10.100.0.1");
145 private static final IpAddress COMPUTE_2_IP = IpAddress.valueOf("10.100.0.2");
146 private static final IpAddress COMPUTE_3_IP = IpAddress.valueOf("10.100.0.3");
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900147 private static final IpAddress GATEWAY_1_IP = IpAddress.valueOf("10.100.0.5");
148 private static final IpAddress GATEWAY_2_IP = IpAddress.valueOf("10.100.0.6");
149 private static final IpAddress GATEWAY_3_IP = IpAddress.valueOf("10.100.0.7");
daniel parkb18424c2018-02-05 15:43:43 +0900150
151 private static final String GATEWAY_UPLINK_PORT = "eth0";
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900152
Jian Lie6312162018-03-21 21:41:00 +0900153 private static final Set<OpenstackPhyInterface> COMPUTE_1_PHY_INTFS = createPhyIntfs();
154 private static final Set<OpenstackPhyInterface> COMPUTE_2_PHY_INTFS = createPhyIntfs();
155 private static final Set<OpenstackPhyInterface> COMPUTE_3_PHY_INTFS = createPhyIntfs();
156
Jian Li789fadb2018-07-10 13:59:47 +0900157 private static final Set<ControllerInfo> COMPUTE_1_CONTROLLERS = createControllers();
158 private static final Set<ControllerInfo> COMPUTE_2_CONTROLLERS = createControllers();
159 private static final Set<ControllerInfo> COMPUTE_3_CONTROLLERS = createControllers();
160
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900161 private static final Device COMPUTE_1_INTG_DEVICE = createOpenFlowDevice(1, INTEGRATION_BRIDGE);
162 private static final Device COMPUTE_2_INTG_DEVICE = createOpenFlowDevice(2, INTEGRATION_BRIDGE);
163 private static final Device COMPUTE_3_INTG_DEVICE = createOpenFlowDevice(3, INTEGRATION_BRIDGE);
daniel parkb18424c2018-02-05 15:43:43 +0900164 private static final Device GATEWAY_1_INTG_DEVICE = createOpenFlowDevice(4, INTEGRATION_BRIDGE);
165 private static final Device GATEWAY_2_INTG_DEVICE = createOpenFlowDevice(5, INTEGRATION_BRIDGE);
166 private static final Device GATEWAY_3_INTG_DEVICE = createOpenFlowDevice(6, INTEGRATION_BRIDGE);
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900167
168 private static final Device COMPUTE_1_OVSDB_DEVICE = createOvsdbDevice(COMPUTE_1_IP);
169 private static final Device COMPUTE_2_OVSDB_DEVICE = createOvsdbDevice(COMPUTE_2_IP);
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900170 private static final Device GATEWAY_1_OVSDB_DEVICE = createOvsdbDevice(GATEWAY_1_IP);
171 private static final Device GATEWAY_2_OVSDB_DEVICE = createOvsdbDevice(GATEWAY_2_IP);
172
173 private static final OpenstackNode COMPUTE_1 = createNode(
174 COMPUTE_1_HOSTNAME,
175 COMPUTE,
176 COMPUTE_1_INTG_DEVICE,
177 COMPUTE_1_IP,
Jian Lie6312162018-03-21 21:41:00 +0900178 INIT,
Jian Li789fadb2018-07-10 13:59:47 +0900179 COMPUTE_1_PHY_INTFS,
180 COMPUTE_1_CONTROLLERS
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900181 );
182
183 private static final OpenstackNode COMPUTE_2 = createNode(
184 COMPUTE_2_HOSTNAME,
185 COMPUTE,
186 COMPUTE_2_INTG_DEVICE,
187 COMPUTE_2_IP,
Jian Lie6312162018-03-21 21:41:00 +0900188 DEVICE_CREATED,
Jian Li789fadb2018-07-10 13:59:47 +0900189 COMPUTE_2_PHY_INTFS,
190 COMPUTE_2_CONTROLLERS
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900191 );
192
193 private static final OpenstackNode COMPUTE_3 = createNode(
194 COMPUTE_3_HOSTNAME,
195 COMPUTE,
196 COMPUTE_3_INTG_DEVICE,
197 COMPUTE_3_IP,
Jian Lie6312162018-03-21 21:41:00 +0900198 COMPLETE,
Jian Li789fadb2018-07-10 13:59:47 +0900199 COMPUTE_3_PHY_INTFS,
200 COMPUTE_3_CONTROLLERS
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900201 );
202
Jian Lie6312162018-03-21 21:41:00 +0900203 private static final OpenstackNode GATEWAY_1 = createGatewayNode(
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900204 GATEWAY_1_HOSTNAME,
205 GATEWAY,
206 GATEWAY_1_INTG_DEVICE,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900207 GATEWAY_1_IP,
daniel parkb18424c2018-02-05 15:43:43 +0900208 GATEWAY_UPLINK_PORT,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900209 INIT
210 );
211
Jian Lie6312162018-03-21 21:41:00 +0900212 private static final OpenstackNode GATEWAY_2 = createGatewayNode(
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900213 GATEWAY_2_HOSTNAME,
214 GATEWAY,
215 GATEWAY_2_INTG_DEVICE,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900216 GATEWAY_2_IP,
daniel parkb18424c2018-02-05 15:43:43 +0900217 GATEWAY_UPLINK_PORT,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900218 DEVICE_CREATED
219 );
220
Jian Lie6312162018-03-21 21:41:00 +0900221 private static final OpenstackNode GATEWAY_3 = createGatewayNode(
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900222 GATEWAY_3_HOSTNAME,
223 GATEWAY,
224 GATEWAY_3_INTG_DEVICE,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900225 GATEWAY_3_IP,
daniel parkb18424c2018-02-05 15:43:43 +0900226 GATEWAY_UPLINK_PORT,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900227 COMPLETE
228 );
229
230 private static final TestDeviceService TEST_DEVICE_SERVICE = new TestDeviceService();
231
232 private TestOpenstackNodeManager testNodeManager;
233 private DefaultOpenstackNodeHandler target;
234
235 @Before
236 public void setUp() throws Exception {
237 DeviceAdminService mockDeviceAdminService = createMock(DeviceAdminService.class);
238 mockDeviceAdminService.removeDevice(anyObject());
239 replay(mockDeviceAdminService);
240
241 OvsdbClientService mockOvsdbClient = createMock(OvsdbClientService.class);
242 expect(mockOvsdbClient.isConnected())
243 .andReturn(true)
244 .anyTimes();
245 replay(mockOvsdbClient);
246
247 OvsdbController mockOvsdbController = createMock(OvsdbController.class);
248 expect(mockOvsdbController.getOvsdbClient(anyObject()))
249 .andReturn(mockOvsdbClient)
250 .anyTimes();
251 replay(mockOvsdbController);
252
253 testNodeManager = new TestOpenstackNodeManager();
254 target = new DefaultOpenstackNodeHandler();
255
256 target.coreService = new TestCoreService();
257 target.leadershipService = new TestLeadershipService();
258 target.clusterService = new TestClusterService();
259 target.deviceService = TEST_DEVICE_SERVICE;
260 target.deviceAdminService = mockDeviceAdminService;
261 target.ovsdbController = mockOvsdbController;
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900262 target.osNodeService = testNodeManager;
263 target.osNodeAdminService = testNodeManager;
264 target.componentConfigService = new TestComponentConfigService();
265 TestUtils.setField(target, "eventExecutor", MoreExecutors.newDirectExecutorService());
266 target.activate();
267 }
268
269 @After
270 public void tearDown() {
271 TEST_DEVICE_SERVICE.clear();
272 target.deactivate();
273 target = null;
274 testNodeManager = null;
275 }
276
277 /**
278 * Checks if the compute node state changes from INIT to DEVICE_CREATED
279 * after processing INIT state.
280 */
281 @Test
282 public void testComputeNodeProcessNodeInitState() {
283 testNodeManager.createNode(COMPUTE_1);
284 TEST_DEVICE_SERVICE.devMap.put(COMPUTE_1_OVSDB_DEVICE.id(), COMPUTE_1_OVSDB_DEVICE);
285
286 assertEquals(ERR_STATE_NOT_MATCH, INIT,
287 testNodeManager.node(COMPUTE_1_HOSTNAME).state());
288 target.processInitState(COMPUTE_1);
289 assertEquals(ERR_STATE_NOT_MATCH, DEVICE_CREATED,
290 testNodeManager.node(COMPUTE_1_HOSTNAME).state());
291 }
292
293 /**
294 * Checks if the gateway node state changes from INIT to DEVICE_CREATED
295 * after processing INIT state.
296 */
297 @Test
298 public void testGatewayNodeProcessNodeInitState() {
299 testNodeManager.createNode(GATEWAY_1);
300 TEST_DEVICE_SERVICE.devMap.put(GATEWAY_1_OVSDB_DEVICE.id(), GATEWAY_1_OVSDB_DEVICE);
301
302 assertEquals(ERR_STATE_NOT_MATCH, INIT,
303 testNodeManager.node(GATEWAY_1_HOSTNAME).state());
304 target.processInitState(GATEWAY_1);
305 assertEquals(ERR_STATE_NOT_MATCH, DEVICE_CREATED,
306 testNodeManager.node(GATEWAY_1_HOSTNAME).state());
307 }
308
309 /**
310 * Checks if the compute node state changes from DEVICE_CREATED to
311 * PORT_CREATED after processing DEVICE_CREATED state.
312 */
313 @Test
314 public void testComputeNodeProcessDeviceCreatedState() {
315 testNodeManager.createNode(COMPUTE_2);
316 TEST_DEVICE_SERVICE.devMap.put(COMPUTE_2_OVSDB_DEVICE.id(), COMPUTE_2_OVSDB_DEVICE);
317 TEST_DEVICE_SERVICE.devMap.put(COMPUTE_2_INTG_DEVICE.id(), COMPUTE_2_INTG_DEVICE);
318
319 assertEquals(ERR_STATE_NOT_MATCH, DEVICE_CREATED,
320 testNodeManager.node(COMPUTE_2_HOSTNAME).state());
321 target.processDeviceCreatedState(COMPUTE_2);
daniel parkb18424c2018-02-05 15:43:43 +0900322 assertEquals(ERR_STATE_NOT_MATCH, COMPLETE,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900323 testNodeManager.node(COMPUTE_2_HOSTNAME).state());
324 }
325
326 /**
327 * Checks if the gateway node state changes from DEVICE_CREATED to
328 * PORT_CREATED after processing DEVICE_CREATED state.
329 */
330 @Test
331 public void testGatewayNodeProcessDeviceCreatedState() {
332 testNodeManager.createNode(GATEWAY_2);
333 TEST_DEVICE_SERVICE.devMap.put(GATEWAY_2_OVSDB_DEVICE.id(), GATEWAY_2_OVSDB_DEVICE);
334 TEST_DEVICE_SERVICE.devMap.put(GATEWAY_2_INTG_DEVICE.id(), GATEWAY_2_INTG_DEVICE);
daniel parkb18424c2018-02-05 15:43:43 +0900335 TEST_DEVICE_SERVICE.portList.add(createPort(GATEWAY_2_INTG_DEVICE, GATEWAY_UPLINK_PORT));
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900336
337 assertEquals(ERR_STATE_NOT_MATCH, DEVICE_CREATED,
338 testNodeManager.node(GATEWAY_2_HOSTNAME).state());
339 target.processDeviceCreatedState(GATEWAY_2);
daniel parkb18424c2018-02-05 15:43:43 +0900340 assertEquals(ERR_STATE_NOT_MATCH, COMPLETE,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900341 testNodeManager.node(GATEWAY_2_HOSTNAME).state());
342 }
343
344 /**
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900345 * Checks if the compute node state changes from COMPLETE to INCOMPLETE
346 * when integration bridge is disconnected.
347 */
348 @Test
349 public void testBackToIncompleteWhenBrIntDisconnected() {
daniel parkb18424c2018-02-05 15:43:43 +0900350 testNodeManager.createNode(COMPUTE_3);
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900351
352 assertEquals(ERR_STATE_NOT_MATCH, COMPLETE,
daniel parkb18424c2018-02-05 15:43:43 +0900353 testNodeManager.node(COMPUTE_3_HOSTNAME).state());
354 TEST_DEVICE_SERVICE.removeDevice(COMPUTE_3_INTG_DEVICE);
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900355 assertEquals(ERR_STATE_NOT_MATCH, INCOMPLETE,
daniel parkb18424c2018-02-05 15:43:43 +0900356 testNodeManager.node(COMPUTE_3_HOSTNAME).state());
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900357 }
358
359 /**
360 * Checks if the compute node state changes from COMPLETE to INCOMPLETE
361 * when vxlan port is removed from integration bridge.
362 */
363 @Test
364 public void testBackToIncompleteWhenVxlanRemoved() {
daniel parkb18424c2018-02-05 15:43:43 +0900365 testNodeManager.createNode(COMPUTE_3);
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900366
367 assertEquals(ERR_STATE_NOT_MATCH, COMPLETE,
daniel parkb18424c2018-02-05 15:43:43 +0900368 testNodeManager.node(COMPUTE_3_HOSTNAME).state());
369 TEST_DEVICE_SERVICE.removePort(COMPUTE_3_INTG_DEVICE, createPort(
370 COMPUTE_3_INTG_DEVICE, DEFAULT_TUNNEL));
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900371 assertEquals(ERR_STATE_NOT_MATCH, INCOMPLETE,
daniel parkb18424c2018-02-05 15:43:43 +0900372 testNodeManager.node(COMPUTE_3_HOSTNAME).state());
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900373
374 }
375
376 private static Device createOvsdbDevice(IpAddress ovsdbIp) {
377 return new TestDevice(new ProviderId("of", "foo"),
378 DeviceId.deviceId("ovsdb:" + ovsdbIp.toString()),
379 CONTROLLER,
380 "manufacturer",
381 "hwVersion",
382 "swVersion",
383 "serialNumber",
384 new ChassisId(1));
385 }
386
387 private static Device createOpenFlowDevice(long devIdNum, String type) {
388 return new TestDevice(new ProviderId("of", "foo"),
389 DeviceId.deviceId(String.format("of:%016d", devIdNum)),
390 SWITCH,
391 type,
392 "hwVersion",
393 "swVersion",
394 "serialNumber",
395 new ChassisId(1));
396 }
397
398 private static Port createPort(Device device, String portName) {
399 return new DefaultPort(device,
400 PortNumber.portNumber(1),
401 true,
402 DefaultAnnotations.builder().set(PORT_NAME, portName).build());
403 }
404
Jian Lie6312162018-03-21 21:41:00 +0900405 private static Set<OpenstackPhyInterface> createPhyIntfs() {
406 return Sets.newConcurrentHashSet();
407 }
408
Jian Li789fadb2018-07-10 13:59:47 +0900409 private static Set<ControllerInfo> createControllers() {
410 return Sets.newConcurrentHashSet();
411 }
412
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900413 private static OpenstackNode createNode(String hostname,
414 OpenstackNode.NodeType type,
415 Device intgBridge,
416 IpAddress ipAddr,
Jian Lie6312162018-03-21 21:41:00 +0900417 NodeState state,
Jian Li789fadb2018-07-10 13:59:47 +0900418 Set<OpenstackPhyInterface> phyIntfs,
419 Set<ControllerInfo> controllers) {
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900420 return new TestOpenstackNode(
421 hostname,
422 type,
423 intgBridge.id(),
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900424 ipAddr,
425 ipAddr,
Daniel Park92abf312018-08-08 17:01:35 +0900426 null, null, state, phyIntfs, controllers,
427 null, null, null, OpenstackNode.DatapathType.NORMAL);
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900428 }
429
Jian Lie6312162018-03-21 21:41:00 +0900430 private static OpenstackNode createGatewayNode(String hostname,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900431 OpenstackNode.NodeType type,
432 Device intgBridge,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900433 IpAddress ipAddr,
daniel parkb18424c2018-02-05 15:43:43 +0900434 String uplinkPort,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900435 NodeState state) {
436 return new TestOpenstackNode(
437 hostname,
438 type,
439 intgBridge.id(),
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900440 ipAddr,
441 ipAddr,
Daniel Park92abf312018-08-08 17:01:35 +0900442 null, uplinkPort, state, null, null, null, null, null,
443 OpenstackNode.DatapathType.NORMAL);
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900444 }
445
446 private static final class TestDevice extends DefaultDevice {
447 private TestDevice(ProviderId providerId,
448 DeviceId id,
449 Type type,
450 String manufacturer,
451 String hwVersion,
452 String swVersion,
453 String serialNumber,
454 ChassisId chassisId,
455 Annotations... annotations) {
456 super(providerId,
457 id,
458 type,
459 manufacturer,
460 hwVersion,
461 swVersion,
462 serialNumber,
463 chassisId,
464 annotations);
465 }
466
467 @Override
468 @SuppressWarnings("unchecked")
469 public <B extends Behaviour> B as(Class<B> projectionClass) {
470 if (projectionClass.equals(BridgeConfig.class)) {
471 return (B) new TestBridgeConfig();
472 } else if (projectionClass.equals(InterfaceConfig.class)) {
473 return (B) new TestInterfaceConfig();
474 } else if (projectionClass.equals(ExtensionTreatmentResolver.class)) {
475 ExtensionTreatmentResolver treatmentResolver = createMock(ExtensionTreatmentResolver.class);
476 expect(treatmentResolver.getExtensionInstruction(anyObject()))
477 .andReturn(new TestExtensionTreatment())
478 .anyTimes();
479 replay(treatmentResolver);
480 return (B) treatmentResolver;
481 } else {
482 return null;
483 }
484 }
485
486 @Override
487 public <B extends Behaviour> boolean is(Class<B> projectionClass) {
488 return true;
489 }
490 }
491
492 private static final class TestOpenstackNode extends DefaultOpenstackNode {
493 private TestOpenstackNode(String hostname,
494 NodeType type,
495 DeviceId intgBridge,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900496 IpAddress managementIp,
497 IpAddress dataIp,
498 String vlanIntf,
daniel parkb18424c2018-02-05 15:43:43 +0900499 String uplinkPort,
Jian Lie6312162018-03-21 21:41:00 +0900500 NodeState state,
Jian Li27841662018-04-14 01:59:47 +0900501 Set<OpenstackPhyInterface> phyIntfs,
Jian Li789fadb2018-07-10 13:59:47 +0900502 Set<ControllerInfo> controllers,
Jian Li92d42fc2018-05-25 16:23:49 +0900503 OpenstackAuth auth,
Daniel Parkdeefa702018-07-17 17:55:51 +0900504 String endPoint,
Daniel Park92abf312018-08-08 17:01:35 +0900505 OpenstackSshAuth sshAuth,
506 DatapathType datapathType) {
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900507 super(hostname,
508 type,
509 intgBridge,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900510 managementIp,
511 dataIp,
512 vlanIntf,
daniel parkb18424c2018-02-05 15:43:43 +0900513 uplinkPort,
Jian Lie6312162018-03-21 21:41:00 +0900514 state,
Jian Li27841662018-04-14 01:59:47 +0900515 phyIntfs,
Jian Li789fadb2018-07-10 13:59:47 +0900516 controllers,
Jian Li92d42fc2018-05-25 16:23:49 +0900517 auth,
Daniel Parkdeefa702018-07-17 17:55:51 +0900518 endPoint,
Daniel Park92abf312018-08-08 17:01:35 +0900519 sshAuth,
520 datapathType);
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900521 }
522
523 @Override
524 public PortNumber tunnelPortNum() {
525 return PortNumber.portNumber(1);
526 }
527
528 @Override
529 public PortNumber vlanPortNum() {
530 return PortNumber.portNumber(1);
531 }
532
533 @Override
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900534 public MacAddress vlanPortMac() {
535 return MacAddress.NONE;
536 }
537 }
538
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900539 private static class TestDeviceService extends DeviceServiceAdapter {
540 Map<DeviceId, Device> devMap = Maps.newHashMap();
541 List<Port> portList = Lists.newArrayList();
542 List<DeviceListener> listeners = Lists.newArrayList();
543
544 @Override
545 public void addListener(DeviceListener listener) {
546 listeners.add(listener);
547 }
548
549 @Override
550 public void removeListener(DeviceListener listener) {
551 listeners.remove(listener);
552 }
553
554 @Override
555 public Device getDevice(DeviceId deviceId) {
556 return devMap.get(deviceId);
557 }
558
559 @Override
560 public List<Port> getPorts(DeviceId deviceId) {
561 return this.portList.stream()
562 .filter(p -> p.element().id().equals(deviceId))
563 .collect(Collectors.toList());
564 }
565
566 @Override
567 public boolean isAvailable(DeviceId deviceId) {
568 return devMap.containsKey(deviceId);
569 }
570
571 void addDevice(Device device) {
572 devMap.put(device.id(), device);
573 DeviceEvent event = new DeviceEvent(DEVICE_ADDED, device);
574 listeners.stream().filter(l -> l.isRelevant(event)).forEach(l -> l.event(event));
575 }
576
577 void removeDevice(Device device) {
578 devMap.remove(device.id());
579 DeviceEvent event = new DeviceEvent(DEVICE_AVAILABILITY_CHANGED, device);
580 listeners.stream().filter(l -> l.isRelevant(event)).forEach(l -> l.event(event));
581 }
582
583 void addPort(Device device, Port port) {
584 portList.add(port);
585 DeviceEvent event = new DeviceEvent(PORT_ADDED, device, port);
586 listeners.stream().filter(l -> l.isRelevant(event)).forEach(l -> l.event(event));
587 }
588
589 void removePort(Device device, Port port) {
590 portList.remove(port);
591 DeviceEvent event = new DeviceEvent(PORT_REMOVED, device, port);
592 listeners.stream().filter(l -> l.isRelevant(event)).forEach(l -> l.event(event));
593 }
594
595 void clear() {
596 this.listeners.clear();
597 this.devMap.clear();
598 this.portList.clear();
599 }
600 }
601
602 private static class TestBridgeConfig implements BridgeConfig {
603
604 @Override
605 public DriverData data() {
606 return null;
607 }
608
609 @Override
610 public void setData(DriverData data) {
611
612 }
613
614 @Override
615 public DriverHandler handler() {
616 return null;
617 }
618
619 @Override
620 public void setHandler(DriverHandler handler) {
621
622 }
623
624 @Override
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900625 public boolean addBridge(BridgeDescription bridge) {
626 TEST_DEVICE_SERVICE.addDevice(new DefaultDevice(new ProviderId("of", "foo"),
627 DeviceId.deviceId("of:" + bridge.datapathId().get()),
628 SWITCH,
629 bridge.name(),
630 "hwVersion",
631 "swVersion",
632 "serialNumber",
633 new ChassisId(1)));
634 return true;
635 }
636
637 @Override
638 public void deleteBridge(BridgeName bridgeName) {
639
640 }
641
642 @Override
643 public Collection<BridgeDescription> getBridges() {
644 return ImmutableSet.of(ROUT_BRIDGE);
645 }
646
647 @Override
648 public void addPort(BridgeName bridgeName, String portName) {
649
650 }
651
652 @Override
653 public void deletePort(BridgeName bridgeName, String portName) {
654
655 }
656
657 @Override
658 public Collection<PortDescription> getPorts() {
659 return ImmutableSet.of(PATCH_ROUT);
660 }
661
662 @Override
663 public Set<PortNumber> getPortNumbers() {
664 return null;
665 }
666
667 @Override
668 public List<PortNumber> getLocalPorts(Iterable<String> ifaceIds) {
669 return null;
670 }
671 }
672
673 private static class TestInterfaceConfig implements InterfaceConfig {
674
675 @Override
676 public DriverData data() {
677 return null;
678 }
679
680 @Override
681 public void setData(DriverData data) {
682
683 }
684
685 @Override
686 public DriverHandler handler() {
687 return null;
688 }
689
690 @Override
691 public void setHandler(DriverHandler handler) {
692
693 }
694
695 @Override
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900696 public boolean addAccessMode(String intf, VlanId vlanId) {
697 return false;
698 }
699
700 @Override
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900701 public boolean removeAccessMode(String intf) {
702 return false;
703 }
704
705 @Override
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900706 public boolean addTrunkMode(String intf, List<VlanId> vlanIds) {
707 return false;
708 }
709
710 @Override
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900711 public boolean removeTrunkMode(String intf) {
712 return false;
713 }
714
715 @Override
716 public boolean addRateLimit(String intf, short limit) {
717 return false;
718 }
719
720 @Override
721 public boolean removeRateLimit(String intf) {
722 return false;
723 }
724
725 @Override
726 public boolean addTunnelMode(String intf, TunnelDescription tunnelDesc) {
727 TEST_DEVICE_SERVICE.devMap.values().stream()
728 .filter(device -> device.type() == SWITCH &&
729 device.manufacturer().equals(INTEGRATION_BRIDGE))
730 .forEach(device -> {
731 TEST_DEVICE_SERVICE.addPort(device, createPort(device, intf));
732 });
733 return true;
734 }
735
736 @Override
737 public boolean removeTunnelMode(String intf) {
738 return false;
739 }
740
741 @Override
742 public boolean addPatchMode(String ifaceName, PatchDescription patchInterface) {
743 if (ifaceName.equals(PATCH_INTG_BRIDGE)) {
744 TEST_DEVICE_SERVICE.devMap.values().stream()
745 .filter(device -> device.type() == SWITCH &&
746 device.manufacturer().equals(INTEGRATION_BRIDGE))
747 .forEach(device -> {
748 TEST_DEVICE_SERVICE.addPort(device, createPort(device, ifaceName));
749 });
750 } else if (ifaceName.equals(PATCH_ROUT_BRIDGE)) {
751 TEST_DEVICE_SERVICE.devMap.values().stream()
752 .filter(device -> device.type() == SWITCH &&
753 device.manufacturer().equals(ROUTER_BRIDGE))
754 .forEach(device -> {
755 TEST_DEVICE_SERVICE.addPort(device, createPort(device, ifaceName));
756 });
757 }
758 return true;
759 }
760
761 @Override
762 public boolean removePatchMode(String ifaceName) {
763 return false;
764 }
765
766 @Override
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900767 public List<DeviceInterfaceDescription> getInterfaces() {
768 return null;
769 }
770 }
771
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900772 private static class TestExtensionTreatment implements ExtensionTreatment {
773 Ip4Address tunnelDst;
774
775 @Override
776 public ExtensionTreatmentType type() {
777 return null;
778 }
779
780 @Override
781 public <T> void setPropertyValue(String key, T value) throws ExtensionPropertyException {
782 tunnelDst = (Ip4Address) value;
783 }
784
785 @Override
786 public <T> T getPropertyValue(String key) throws ExtensionPropertyException {
787 return null;
788 }
789
790 @Override
791 public List<String> getProperties() {
792 return null;
793 }
794
795 @Override
796 public byte[] serialize() {
797 return new byte[0];
798 }
799
800 @Override
801 public void deserialize(byte[] data) {
802
803 }
804
805 @Override
806 public boolean equals(Object obj) {
807 TestExtensionTreatment that = (TestExtensionTreatment) obj;
808 return Objects.equals(tunnelDst, that.tunnelDst);
809 }
810
811 @Override
812 public int hashCode() {
813 return Objects.hash(tunnelDst);
814 }
815 }
816
817 private static class TestCoreService extends CoreServiceAdapter {
818
819 @Override
820 public ApplicationId getAppId(String name) {
821 return TEST_APP_ID;
822 }
823 }
824
825 private static class TestLeadershipService extends LeadershipServiceAdapter {
826
827 @Override
828 public NodeId getLeader(String path) {
829 return LOCAL_NODE_ID;
830 }
831 }
832
833 private static class TestClusterService extends ClusterServiceAdapter {
834
835 @Override
836 public ControllerNode getLocalNode() {
837 return LOCAL_CTRL;
838 }
839 }
840
841 private class TestComponentConfigService extends ComponentConfigAdapter {
842
843 }
844}