blob: ebf12c0e9a79a321b51b42ea5a7006774bbe4a19 [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;
Daniel Parkd02d7bd2018-08-23 23:04:31 +090073import org.onosproject.openstacknode.api.DpdkConfig;
Hyunsun Moon090d77d2017-07-05 17:48:37 +090074import org.onosproject.openstacknode.api.NodeState;
Jian Li27841662018-04-14 01:59:47 +090075import org.onosproject.openstacknode.api.OpenstackAuth;
Hyunsun Moon090d77d2017-07-05 17:48:37 +090076import org.onosproject.openstacknode.api.OpenstackNode;
Jian Lie6312162018-03-21 21:41:00 +090077import org.onosproject.openstacknode.api.OpenstackPhyInterface;
Daniel Parkdeefa702018-07-17 17:55:51 +090078import org.onosproject.openstacknode.api.OpenstackSshAuth;
Hyunsun Moon090d77d2017-07-05 17:48:37 +090079import org.onosproject.ovsdb.controller.OvsdbClientService;
80import org.onosproject.ovsdb.controller.OvsdbController;
81
daniel park04c40cc2018-02-19 17:48:30 +090082import java.util.Collection;
83import java.util.List;
84import java.util.Map;
85import java.util.Objects;
86import java.util.Set;
87import java.util.stream.Collectors;
Hyunsun Moon090d77d2017-07-05 17:48:37 +090088
Ray Milkey0d47a552017-08-22 10:16:31 -070089import static org.easymock.EasyMock.anyObject;
90import static org.easymock.EasyMock.createMock;
Hyunsun Moon090d77d2017-07-05 17:48:37 +090091import static org.easymock.EasyMock.expect;
Ray Milkey0d47a552017-08-22 10:16:31 -070092import static org.easymock.EasyMock.replay;
Hyunsun Moon090d77d2017-07-05 17:48:37 +090093import static org.junit.Assert.assertEquals;
94import static org.onosproject.net.AnnotationKeys.PORT_NAME;
95import static org.onosproject.net.Device.Type.CONTROLLER;
96import static org.onosproject.net.Device.Type.SWITCH;
Ray Milkey0d47a552017-08-22 10:16:31 -070097import static org.onosproject.net.device.DeviceEvent.Type.DEVICE_ADDED;
98import static org.onosproject.net.device.DeviceEvent.Type.DEVICE_AVAILABILITY_CHANGED;
99import static org.onosproject.net.device.DeviceEvent.Type.PORT_ADDED;
100import static org.onosproject.net.device.DeviceEvent.Type.PORT_REMOVED;
101import static org.onosproject.openstacknode.api.Constants.DEFAULT_TUNNEL;
102import static org.onosproject.openstacknode.api.Constants.INTEGRATION_BRIDGE;
103import static org.onosproject.openstacknode.api.Constants.PATCH_INTG_BRIDGE;
104import static org.onosproject.openstacknode.api.Constants.PATCH_ROUT_BRIDGE;
105import static org.onosproject.openstacknode.api.Constants.ROUTER_BRIDGE;
106import static org.onosproject.openstacknode.api.NodeState.COMPLETE;
107import static org.onosproject.openstacknode.api.NodeState.DEVICE_CREATED;
108import static org.onosproject.openstacknode.api.NodeState.INCOMPLETE;
109import static org.onosproject.openstacknode.api.NodeState.INIT;
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900110import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.COMPUTE;
111import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.GATEWAY;
112
113/**
114 * Unit test for DefaultOpenstackNodeHandler.
115 */
116public class DefaultOpenstackNodeHandlerTest {
117
118 private static final ApplicationId TEST_APP_ID = new DefaultApplicationId(1, "test");
119 private static final String ERR_STATE_NOT_MATCH = "Node state did not match";
120 private static final NodeId LOCAL_NODE_ID = new NodeId("local");
121 private static final ControllerNode LOCAL_CTRL =
122 new DefaultControllerNode(LOCAL_NODE_ID, IpAddress.valueOf("127.0.0.1"));
123
124 private static final BridgeDescription ROUT_BRIDGE = DefaultBridgeDescription.builder()
125 .name(ROUTER_BRIDGE)
126 .failMode(BridgeDescription.FailMode.SECURE)
127 .disableInBand()
128 .build();
129
Yuta HIGUCHI53e47962018-03-01 23:50:48 -0800130 private static final PortDescription PATCH_ROUT = DefaultPortDescription.builder()
131 .withPortNumber(PortNumber.portNumber(1))
132 .isEnabled(true)
133 .annotations(DefaultAnnotations.builder()
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900134 .set(PORT_NAME, PATCH_ROUT_BRIDGE)
Yuta HIGUCHI53e47962018-03-01 23:50:48 -0800135 .build())
136 .build();
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900137
138 private static final String COMPUTE_1_HOSTNAME = "compute_1";
139 private static final String COMPUTE_2_HOSTNAME = "compute_2";
140 private static final String COMPUTE_3_HOSTNAME = "compute_3";
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900141 private static final String GATEWAY_1_HOSTNAME = "gateway_1";
142 private static final String GATEWAY_2_HOSTNAME = "gateway_2";
143 private static final String GATEWAY_3_HOSTNAME = "gateway_3";
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900144
145 private static final IpAddress COMPUTE_1_IP = IpAddress.valueOf("10.100.0.1");
146 private static final IpAddress COMPUTE_2_IP = IpAddress.valueOf("10.100.0.2");
147 private static final IpAddress COMPUTE_3_IP = IpAddress.valueOf("10.100.0.3");
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900148 private static final IpAddress GATEWAY_1_IP = IpAddress.valueOf("10.100.0.5");
149 private static final IpAddress GATEWAY_2_IP = IpAddress.valueOf("10.100.0.6");
150 private static final IpAddress GATEWAY_3_IP = IpAddress.valueOf("10.100.0.7");
daniel parkb18424c2018-02-05 15:43:43 +0900151
152 private static final String GATEWAY_UPLINK_PORT = "eth0";
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900153
Jian Lie6312162018-03-21 21:41:00 +0900154 private static final Set<OpenstackPhyInterface> COMPUTE_1_PHY_INTFS = createPhyIntfs();
155 private static final Set<OpenstackPhyInterface> COMPUTE_2_PHY_INTFS = createPhyIntfs();
156 private static final Set<OpenstackPhyInterface> COMPUTE_3_PHY_INTFS = createPhyIntfs();
157
Jian Li789fadb2018-07-10 13:59:47 +0900158 private static final Set<ControllerInfo> COMPUTE_1_CONTROLLERS = createControllers();
159 private static final Set<ControllerInfo> COMPUTE_2_CONTROLLERS = createControllers();
160 private static final Set<ControllerInfo> COMPUTE_3_CONTROLLERS = createControllers();
161
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900162 private static final Device COMPUTE_1_INTG_DEVICE = createOpenFlowDevice(1, INTEGRATION_BRIDGE);
163 private static final Device COMPUTE_2_INTG_DEVICE = createOpenFlowDevice(2, INTEGRATION_BRIDGE);
164 private static final Device COMPUTE_3_INTG_DEVICE = createOpenFlowDevice(3, INTEGRATION_BRIDGE);
daniel parkb18424c2018-02-05 15:43:43 +0900165 private static final Device GATEWAY_1_INTG_DEVICE = createOpenFlowDevice(4, INTEGRATION_BRIDGE);
166 private static final Device GATEWAY_2_INTG_DEVICE = createOpenFlowDevice(5, INTEGRATION_BRIDGE);
167 private static final Device GATEWAY_3_INTG_DEVICE = createOpenFlowDevice(6, INTEGRATION_BRIDGE);
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900168
169 private static final Device COMPUTE_1_OVSDB_DEVICE = createOvsdbDevice(COMPUTE_1_IP);
170 private static final Device COMPUTE_2_OVSDB_DEVICE = createOvsdbDevice(COMPUTE_2_IP);
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900171 private static final Device GATEWAY_1_OVSDB_DEVICE = createOvsdbDevice(GATEWAY_1_IP);
172 private static final Device GATEWAY_2_OVSDB_DEVICE = createOvsdbDevice(GATEWAY_2_IP);
173
174 private static final OpenstackNode COMPUTE_1 = createNode(
175 COMPUTE_1_HOSTNAME,
176 COMPUTE,
177 COMPUTE_1_INTG_DEVICE,
178 COMPUTE_1_IP,
Jian Lie6312162018-03-21 21:41:00 +0900179 INIT,
Jian Li789fadb2018-07-10 13:59:47 +0900180 COMPUTE_1_PHY_INTFS,
181 COMPUTE_1_CONTROLLERS
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900182 );
183
184 private static final OpenstackNode COMPUTE_2 = createNode(
185 COMPUTE_2_HOSTNAME,
186 COMPUTE,
187 COMPUTE_2_INTG_DEVICE,
188 COMPUTE_2_IP,
Jian Lie6312162018-03-21 21:41:00 +0900189 DEVICE_CREATED,
Jian Li789fadb2018-07-10 13:59:47 +0900190 COMPUTE_2_PHY_INTFS,
191 COMPUTE_2_CONTROLLERS
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900192 );
193
194 private static final OpenstackNode COMPUTE_3 = createNode(
195 COMPUTE_3_HOSTNAME,
196 COMPUTE,
197 COMPUTE_3_INTG_DEVICE,
198 COMPUTE_3_IP,
Jian Lie6312162018-03-21 21:41:00 +0900199 COMPLETE,
Jian Li789fadb2018-07-10 13:59:47 +0900200 COMPUTE_3_PHY_INTFS,
201 COMPUTE_3_CONTROLLERS
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900202 );
203
Jian Lie6312162018-03-21 21:41:00 +0900204 private static final OpenstackNode GATEWAY_1 = createGatewayNode(
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900205 GATEWAY_1_HOSTNAME,
206 GATEWAY,
207 GATEWAY_1_INTG_DEVICE,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900208 GATEWAY_1_IP,
daniel parkb18424c2018-02-05 15:43:43 +0900209 GATEWAY_UPLINK_PORT,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900210 INIT
211 );
212
Jian Lie6312162018-03-21 21:41:00 +0900213 private static final OpenstackNode GATEWAY_2 = createGatewayNode(
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900214 GATEWAY_2_HOSTNAME,
215 GATEWAY,
216 GATEWAY_2_INTG_DEVICE,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900217 GATEWAY_2_IP,
daniel parkb18424c2018-02-05 15:43:43 +0900218 GATEWAY_UPLINK_PORT,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900219 DEVICE_CREATED
220 );
221
Jian Lie6312162018-03-21 21:41:00 +0900222 private static final OpenstackNode GATEWAY_3 = createGatewayNode(
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900223 GATEWAY_3_HOSTNAME,
224 GATEWAY,
225 GATEWAY_3_INTG_DEVICE,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900226 GATEWAY_3_IP,
daniel parkb18424c2018-02-05 15:43:43 +0900227 GATEWAY_UPLINK_PORT,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900228 COMPLETE
229 );
230
231 private static final TestDeviceService TEST_DEVICE_SERVICE = new TestDeviceService();
232
233 private TestOpenstackNodeManager testNodeManager;
234 private DefaultOpenstackNodeHandler target;
235
236 @Before
237 public void setUp() throws Exception {
238 DeviceAdminService mockDeviceAdminService = createMock(DeviceAdminService.class);
239 mockDeviceAdminService.removeDevice(anyObject());
240 replay(mockDeviceAdminService);
241
242 OvsdbClientService mockOvsdbClient = createMock(OvsdbClientService.class);
243 expect(mockOvsdbClient.isConnected())
244 .andReturn(true)
245 .anyTimes();
246 replay(mockOvsdbClient);
247
248 OvsdbController mockOvsdbController = createMock(OvsdbController.class);
249 expect(mockOvsdbController.getOvsdbClient(anyObject()))
250 .andReturn(mockOvsdbClient)
251 .anyTimes();
252 replay(mockOvsdbController);
253
254 testNodeManager = new TestOpenstackNodeManager();
255 target = new DefaultOpenstackNodeHandler();
256
257 target.coreService = new TestCoreService();
258 target.leadershipService = new TestLeadershipService();
259 target.clusterService = new TestClusterService();
260 target.deviceService = TEST_DEVICE_SERVICE;
261 target.deviceAdminService = mockDeviceAdminService;
262 target.ovsdbController = mockOvsdbController;
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900263 target.osNodeService = testNodeManager;
264 target.osNodeAdminService = testNodeManager;
265 target.componentConfigService = new TestComponentConfigService();
266 TestUtils.setField(target, "eventExecutor", MoreExecutors.newDirectExecutorService());
267 target.activate();
268 }
269
270 @After
271 public void tearDown() {
272 TEST_DEVICE_SERVICE.clear();
273 target.deactivate();
274 target = null;
275 testNodeManager = null;
276 }
277
278 /**
279 * Checks if the compute node state changes from INIT to DEVICE_CREATED
280 * after processing INIT state.
281 */
282 @Test
283 public void testComputeNodeProcessNodeInitState() {
284 testNodeManager.createNode(COMPUTE_1);
285 TEST_DEVICE_SERVICE.devMap.put(COMPUTE_1_OVSDB_DEVICE.id(), COMPUTE_1_OVSDB_DEVICE);
286
287 assertEquals(ERR_STATE_NOT_MATCH, INIT,
288 testNodeManager.node(COMPUTE_1_HOSTNAME).state());
289 target.processInitState(COMPUTE_1);
290 assertEquals(ERR_STATE_NOT_MATCH, DEVICE_CREATED,
291 testNodeManager.node(COMPUTE_1_HOSTNAME).state());
292 }
293
294 /**
295 * Checks if the gateway node state changes from INIT to DEVICE_CREATED
296 * after processing INIT state.
297 */
298 @Test
299 public void testGatewayNodeProcessNodeInitState() {
300 testNodeManager.createNode(GATEWAY_1);
301 TEST_DEVICE_SERVICE.devMap.put(GATEWAY_1_OVSDB_DEVICE.id(), GATEWAY_1_OVSDB_DEVICE);
302
303 assertEquals(ERR_STATE_NOT_MATCH, INIT,
304 testNodeManager.node(GATEWAY_1_HOSTNAME).state());
305 target.processInitState(GATEWAY_1);
306 assertEquals(ERR_STATE_NOT_MATCH, DEVICE_CREATED,
307 testNodeManager.node(GATEWAY_1_HOSTNAME).state());
308 }
309
310 /**
311 * Checks if the compute node state changes from DEVICE_CREATED to
312 * PORT_CREATED after processing DEVICE_CREATED state.
313 */
314 @Test
315 public void testComputeNodeProcessDeviceCreatedState() {
316 testNodeManager.createNode(COMPUTE_2);
317 TEST_DEVICE_SERVICE.devMap.put(COMPUTE_2_OVSDB_DEVICE.id(), COMPUTE_2_OVSDB_DEVICE);
318 TEST_DEVICE_SERVICE.devMap.put(COMPUTE_2_INTG_DEVICE.id(), COMPUTE_2_INTG_DEVICE);
319
320 assertEquals(ERR_STATE_NOT_MATCH, DEVICE_CREATED,
321 testNodeManager.node(COMPUTE_2_HOSTNAME).state());
322 target.processDeviceCreatedState(COMPUTE_2);
daniel parkb18424c2018-02-05 15:43:43 +0900323 assertEquals(ERR_STATE_NOT_MATCH, COMPLETE,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900324 testNodeManager.node(COMPUTE_2_HOSTNAME).state());
325 }
326
327 /**
328 * Checks if the gateway node state changes from DEVICE_CREATED to
329 * PORT_CREATED after processing DEVICE_CREATED state.
330 */
331 @Test
332 public void testGatewayNodeProcessDeviceCreatedState() {
333 testNodeManager.createNode(GATEWAY_2);
334 TEST_DEVICE_SERVICE.devMap.put(GATEWAY_2_OVSDB_DEVICE.id(), GATEWAY_2_OVSDB_DEVICE);
335 TEST_DEVICE_SERVICE.devMap.put(GATEWAY_2_INTG_DEVICE.id(), GATEWAY_2_INTG_DEVICE);
daniel parkb18424c2018-02-05 15:43:43 +0900336 TEST_DEVICE_SERVICE.portList.add(createPort(GATEWAY_2_INTG_DEVICE, GATEWAY_UPLINK_PORT));
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900337
338 assertEquals(ERR_STATE_NOT_MATCH, DEVICE_CREATED,
339 testNodeManager.node(GATEWAY_2_HOSTNAME).state());
340 target.processDeviceCreatedState(GATEWAY_2);
daniel parkb18424c2018-02-05 15:43:43 +0900341 assertEquals(ERR_STATE_NOT_MATCH, COMPLETE,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900342 testNodeManager.node(GATEWAY_2_HOSTNAME).state());
343 }
344
345 /**
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900346 * Checks if the compute node state changes from COMPLETE to INCOMPLETE
347 * when integration bridge is disconnected.
348 */
349 @Test
350 public void testBackToIncompleteWhenBrIntDisconnected() {
daniel parkb18424c2018-02-05 15:43:43 +0900351 testNodeManager.createNode(COMPUTE_3);
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900352
353 assertEquals(ERR_STATE_NOT_MATCH, COMPLETE,
daniel parkb18424c2018-02-05 15:43:43 +0900354 testNodeManager.node(COMPUTE_3_HOSTNAME).state());
355 TEST_DEVICE_SERVICE.removeDevice(COMPUTE_3_INTG_DEVICE);
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900356 assertEquals(ERR_STATE_NOT_MATCH, INCOMPLETE,
daniel parkb18424c2018-02-05 15:43:43 +0900357 testNodeManager.node(COMPUTE_3_HOSTNAME).state());
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900358 }
359
360 /**
361 * Checks if the compute node state changes from COMPLETE to INCOMPLETE
362 * when vxlan port is removed from integration bridge.
363 */
364 @Test
365 public void testBackToIncompleteWhenVxlanRemoved() {
daniel parkb18424c2018-02-05 15:43:43 +0900366 testNodeManager.createNode(COMPUTE_3);
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900367
368 assertEquals(ERR_STATE_NOT_MATCH, COMPLETE,
daniel parkb18424c2018-02-05 15:43:43 +0900369 testNodeManager.node(COMPUTE_3_HOSTNAME).state());
370 TEST_DEVICE_SERVICE.removePort(COMPUTE_3_INTG_DEVICE, createPort(
371 COMPUTE_3_INTG_DEVICE, DEFAULT_TUNNEL));
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900372 assertEquals(ERR_STATE_NOT_MATCH, INCOMPLETE,
daniel parkb18424c2018-02-05 15:43:43 +0900373 testNodeManager.node(COMPUTE_3_HOSTNAME).state());
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900374
375 }
376
377 private static Device createOvsdbDevice(IpAddress ovsdbIp) {
378 return new TestDevice(new ProviderId("of", "foo"),
379 DeviceId.deviceId("ovsdb:" + ovsdbIp.toString()),
380 CONTROLLER,
381 "manufacturer",
382 "hwVersion",
383 "swVersion",
384 "serialNumber",
385 new ChassisId(1));
386 }
387
388 private static Device createOpenFlowDevice(long devIdNum, String type) {
389 return new TestDevice(new ProviderId("of", "foo"),
390 DeviceId.deviceId(String.format("of:%016d", devIdNum)),
391 SWITCH,
392 type,
393 "hwVersion",
394 "swVersion",
395 "serialNumber",
396 new ChassisId(1));
397 }
398
399 private static Port createPort(Device device, String portName) {
400 return new DefaultPort(device,
401 PortNumber.portNumber(1),
402 true,
403 DefaultAnnotations.builder().set(PORT_NAME, portName).build());
404 }
405
Jian Lie6312162018-03-21 21:41:00 +0900406 private static Set<OpenstackPhyInterface> createPhyIntfs() {
407 return Sets.newConcurrentHashSet();
408 }
409
Jian Li789fadb2018-07-10 13:59:47 +0900410 private static Set<ControllerInfo> createControllers() {
411 return Sets.newConcurrentHashSet();
412 }
413
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900414 private static OpenstackNode createNode(String hostname,
415 OpenstackNode.NodeType type,
416 Device intgBridge,
417 IpAddress ipAddr,
Jian Lie6312162018-03-21 21:41:00 +0900418 NodeState state,
Jian Li789fadb2018-07-10 13:59:47 +0900419 Set<OpenstackPhyInterface> phyIntfs,
420 Set<ControllerInfo> controllers) {
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900421 return new TestOpenstackNode(
422 hostname,
423 type,
424 intgBridge.id(),
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900425 ipAddr,
426 ipAddr,
Daniel Park92abf312018-08-08 17:01:35 +0900427 null, null, state, phyIntfs, controllers,
Daniel Parkd02d7bd2018-08-23 23:04:31 +0900428 null, null, null, null);
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900429 }
430
Jian Lie6312162018-03-21 21:41:00 +0900431 private static OpenstackNode createGatewayNode(String hostname,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900432 OpenstackNode.NodeType type,
433 Device intgBridge,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900434 IpAddress ipAddr,
daniel parkb18424c2018-02-05 15:43:43 +0900435 String uplinkPort,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900436 NodeState state) {
437 return new TestOpenstackNode(
438 hostname,
439 type,
440 intgBridge.id(),
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900441 ipAddr,
442 ipAddr,
Daniel Park92abf312018-08-08 17:01:35 +0900443 null, uplinkPort, state, null, null, null, null, null,
Daniel Parkd02d7bd2018-08-23 23:04:31 +0900444 null);
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900445 }
446
447 private static final class TestDevice extends DefaultDevice {
448 private TestDevice(ProviderId providerId,
449 DeviceId id,
450 Type type,
451 String manufacturer,
452 String hwVersion,
453 String swVersion,
454 String serialNumber,
455 ChassisId chassisId,
456 Annotations... annotations) {
457 super(providerId,
458 id,
459 type,
460 manufacturer,
461 hwVersion,
462 swVersion,
463 serialNumber,
464 chassisId,
465 annotations);
466 }
467
468 @Override
469 @SuppressWarnings("unchecked")
470 public <B extends Behaviour> B as(Class<B> projectionClass) {
471 if (projectionClass.equals(BridgeConfig.class)) {
472 return (B) new TestBridgeConfig();
473 } else if (projectionClass.equals(InterfaceConfig.class)) {
474 return (B) new TestInterfaceConfig();
475 } else if (projectionClass.equals(ExtensionTreatmentResolver.class)) {
476 ExtensionTreatmentResolver treatmentResolver = createMock(ExtensionTreatmentResolver.class);
477 expect(treatmentResolver.getExtensionInstruction(anyObject()))
478 .andReturn(new TestExtensionTreatment())
479 .anyTimes();
480 replay(treatmentResolver);
481 return (B) treatmentResolver;
482 } else {
483 return null;
484 }
485 }
486
487 @Override
488 public <B extends Behaviour> boolean is(Class<B> projectionClass) {
489 return true;
490 }
491 }
492
493 private static final class TestOpenstackNode extends DefaultOpenstackNode {
494 private TestOpenstackNode(String hostname,
495 NodeType type,
496 DeviceId intgBridge,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900497 IpAddress managementIp,
498 IpAddress dataIp,
499 String vlanIntf,
daniel parkb18424c2018-02-05 15:43:43 +0900500 String uplinkPort,
Jian Lie6312162018-03-21 21:41:00 +0900501 NodeState state,
Jian Li27841662018-04-14 01:59:47 +0900502 Set<OpenstackPhyInterface> phyIntfs,
Jian Li789fadb2018-07-10 13:59:47 +0900503 Set<ControllerInfo> controllers,
Jian Li92d42fc2018-05-25 16:23:49 +0900504 OpenstackAuth auth,
Jian Li6d410362018-08-17 09:41:08 +0900505 String endpoint,
Daniel Park92abf312018-08-08 17:01:35 +0900506 OpenstackSshAuth sshAuth,
Daniel Parkd02d7bd2018-08-23 23:04:31 +0900507 DpdkConfig dpdkConfig) {
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900508 super(hostname,
509 type,
510 intgBridge,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900511 managementIp,
512 dataIp,
513 vlanIntf,
daniel parkb18424c2018-02-05 15:43:43 +0900514 uplinkPort,
Jian Lie6312162018-03-21 21:41:00 +0900515 state,
Jian Li27841662018-04-14 01:59:47 +0900516 phyIntfs,
Jian Li789fadb2018-07-10 13:59:47 +0900517 controllers,
Jian Li92d42fc2018-05-25 16:23:49 +0900518 auth,
Jian Li6d410362018-08-17 09:41:08 +0900519 endpoint,
Daniel Park92abf312018-08-08 17:01:35 +0900520 sshAuth,
Daniel Parkd02d7bd2018-08-23 23:04:31 +0900521 dpdkConfig);
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900522 }
523
524 @Override
525 public PortNumber tunnelPortNum() {
526 return PortNumber.portNumber(1);
527 }
528
529 @Override
530 public PortNumber vlanPortNum() {
531 return PortNumber.portNumber(1);
532 }
533
534 @Override
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900535 public MacAddress vlanPortMac() {
536 return MacAddress.NONE;
537 }
538 }
539
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900540 private static class TestDeviceService extends DeviceServiceAdapter {
541 Map<DeviceId, Device> devMap = Maps.newHashMap();
542 List<Port> portList = Lists.newArrayList();
543 List<DeviceListener> listeners = Lists.newArrayList();
544
545 @Override
546 public void addListener(DeviceListener listener) {
547 listeners.add(listener);
548 }
549
550 @Override
551 public void removeListener(DeviceListener listener) {
552 listeners.remove(listener);
553 }
554
555 @Override
556 public Device getDevice(DeviceId deviceId) {
557 return devMap.get(deviceId);
558 }
559
560 @Override
561 public List<Port> getPorts(DeviceId deviceId) {
562 return this.portList.stream()
563 .filter(p -> p.element().id().equals(deviceId))
564 .collect(Collectors.toList());
565 }
566
567 @Override
568 public boolean isAvailable(DeviceId deviceId) {
569 return devMap.containsKey(deviceId);
570 }
571
572 void addDevice(Device device) {
573 devMap.put(device.id(), device);
574 DeviceEvent event = new DeviceEvent(DEVICE_ADDED, device);
575 listeners.stream().filter(l -> l.isRelevant(event)).forEach(l -> l.event(event));
576 }
577
578 void removeDevice(Device device) {
579 devMap.remove(device.id());
580 DeviceEvent event = new DeviceEvent(DEVICE_AVAILABILITY_CHANGED, device);
581 listeners.stream().filter(l -> l.isRelevant(event)).forEach(l -> l.event(event));
582 }
583
584 void addPort(Device device, Port port) {
585 portList.add(port);
586 DeviceEvent event = new DeviceEvent(PORT_ADDED, device, port);
587 listeners.stream().filter(l -> l.isRelevant(event)).forEach(l -> l.event(event));
588 }
589
590 void removePort(Device device, Port port) {
591 portList.remove(port);
592 DeviceEvent event = new DeviceEvent(PORT_REMOVED, device, port);
593 listeners.stream().filter(l -> l.isRelevant(event)).forEach(l -> l.event(event));
594 }
595
596 void clear() {
597 this.listeners.clear();
598 this.devMap.clear();
599 this.portList.clear();
600 }
601 }
602
603 private static class TestBridgeConfig implements BridgeConfig {
604
605 @Override
606 public DriverData data() {
607 return null;
608 }
609
610 @Override
611 public void setData(DriverData data) {
612
613 }
614
615 @Override
616 public DriverHandler handler() {
617 return null;
618 }
619
620 @Override
621 public void setHandler(DriverHandler handler) {
622
623 }
624
625 @Override
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900626 public boolean addBridge(BridgeDescription bridge) {
627 TEST_DEVICE_SERVICE.addDevice(new DefaultDevice(new ProviderId("of", "foo"),
628 DeviceId.deviceId("of:" + bridge.datapathId().get()),
629 SWITCH,
630 bridge.name(),
631 "hwVersion",
632 "swVersion",
633 "serialNumber",
634 new ChassisId(1)));
635 return true;
636 }
637
638 @Override
639 public void deleteBridge(BridgeName bridgeName) {
640
641 }
642
643 @Override
644 public Collection<BridgeDescription> getBridges() {
645 return ImmutableSet.of(ROUT_BRIDGE);
646 }
647
648 @Override
649 public void addPort(BridgeName bridgeName, String portName) {
650
651 }
652
653 @Override
654 public void deletePort(BridgeName bridgeName, String portName) {
655
656 }
657
658 @Override
659 public Collection<PortDescription> getPorts() {
660 return ImmutableSet.of(PATCH_ROUT);
661 }
662
663 @Override
664 public Set<PortNumber> getPortNumbers() {
665 return null;
666 }
667
668 @Override
669 public List<PortNumber> getLocalPorts(Iterable<String> ifaceIds) {
670 return null;
671 }
672 }
673
674 private static class TestInterfaceConfig implements InterfaceConfig {
675
676 @Override
677 public DriverData data() {
678 return null;
679 }
680
681 @Override
682 public void setData(DriverData data) {
683
684 }
685
686 @Override
687 public DriverHandler handler() {
688 return null;
689 }
690
691 @Override
692 public void setHandler(DriverHandler handler) {
693
694 }
695
696 @Override
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900697 public boolean addAccessMode(String intf, VlanId vlanId) {
698 return false;
699 }
700
701 @Override
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900702 public boolean removeAccessMode(String intf) {
703 return false;
704 }
705
706 @Override
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900707 public boolean addTrunkMode(String intf, List<VlanId> vlanIds) {
708 return false;
709 }
710
711 @Override
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900712 public boolean removeTrunkMode(String intf) {
713 return false;
714 }
715
716 @Override
717 public boolean addRateLimit(String intf, short limit) {
718 return false;
719 }
720
721 @Override
722 public boolean removeRateLimit(String intf) {
723 return false;
724 }
725
726 @Override
727 public boolean addTunnelMode(String intf, TunnelDescription tunnelDesc) {
728 TEST_DEVICE_SERVICE.devMap.values().stream()
729 .filter(device -> device.type() == SWITCH &&
730 device.manufacturer().equals(INTEGRATION_BRIDGE))
731 .forEach(device -> {
732 TEST_DEVICE_SERVICE.addPort(device, createPort(device, intf));
733 });
734 return true;
735 }
736
737 @Override
738 public boolean removeTunnelMode(String intf) {
739 return false;
740 }
741
742 @Override
743 public boolean addPatchMode(String ifaceName, PatchDescription patchInterface) {
744 if (ifaceName.equals(PATCH_INTG_BRIDGE)) {
745 TEST_DEVICE_SERVICE.devMap.values().stream()
746 .filter(device -> device.type() == SWITCH &&
747 device.manufacturer().equals(INTEGRATION_BRIDGE))
748 .forEach(device -> {
749 TEST_DEVICE_SERVICE.addPort(device, createPort(device, ifaceName));
750 });
751 } else if (ifaceName.equals(PATCH_ROUT_BRIDGE)) {
752 TEST_DEVICE_SERVICE.devMap.values().stream()
753 .filter(device -> device.type() == SWITCH &&
754 device.manufacturer().equals(ROUTER_BRIDGE))
755 .forEach(device -> {
756 TEST_DEVICE_SERVICE.addPort(device, createPort(device, ifaceName));
757 });
758 }
759 return true;
760 }
761
762 @Override
763 public boolean removePatchMode(String ifaceName) {
764 return false;
765 }
766
767 @Override
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900768 public List<DeviceInterfaceDescription> getInterfaces() {
769 return null;
770 }
771 }
772
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900773 private static class TestExtensionTreatment implements ExtensionTreatment {
774 Ip4Address tunnelDst;
775
776 @Override
777 public ExtensionTreatmentType type() {
778 return null;
779 }
780
781 @Override
782 public <T> void setPropertyValue(String key, T value) throws ExtensionPropertyException {
783 tunnelDst = (Ip4Address) value;
784 }
785
786 @Override
787 public <T> T getPropertyValue(String key) throws ExtensionPropertyException {
788 return null;
789 }
790
791 @Override
792 public List<String> getProperties() {
793 return null;
794 }
795
796 @Override
797 public byte[] serialize() {
798 return new byte[0];
799 }
800
801 @Override
802 public void deserialize(byte[] data) {
803
804 }
805
806 @Override
807 public boolean equals(Object obj) {
808 TestExtensionTreatment that = (TestExtensionTreatment) obj;
809 return Objects.equals(tunnelDst, that.tunnelDst);
810 }
811
812 @Override
813 public int hashCode() {
814 return Objects.hash(tunnelDst);
815 }
816 }
817
818 private static class TestCoreService extends CoreServiceAdapter {
819
820 @Override
821 public ApplicationId getAppId(String name) {
822 return TEST_APP_ID;
823 }
824 }
825
826 private static class TestLeadershipService extends LeadershipServiceAdapter {
827
828 @Override
829 public NodeId getLeader(String path) {
830 return LOCAL_NODE_ID;
831 }
832 }
833
834 private static class TestClusterService extends ClusterServiceAdapter {
835
836 @Override
837 public ControllerNode getLocalNode() {
838 return LOCAL_CTRL;
839 }
840 }
841
842 private class TestComponentConfigService extends ComponentConfigAdapter {
843
844 }
845}