blob: 3224a4b1f00cf409b844d083afb1cf2ece96593f [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;
Jian Lic704b672018-09-04 18:52:53 +090074import org.onosproject.openstacknode.api.KeystoneConfig;
75import org.onosproject.openstacknode.api.NeutronConfig;
Hyunsun Moon090d77d2017-07-05 17:48:37 +090076import org.onosproject.openstacknode.api.NodeState;
77import org.onosproject.openstacknode.api.OpenstackNode;
Jian Lie6312162018-03-21 21:41:00 +090078import org.onosproject.openstacknode.api.OpenstackPhyInterface;
Daniel Parkdeefa702018-07-17 17:55:51 +090079import org.onosproject.openstacknode.api.OpenstackSshAuth;
Hyunsun Moon090d77d2017-07-05 17:48:37 +090080import org.onosproject.ovsdb.controller.OvsdbClientService;
81import org.onosproject.ovsdb.controller.OvsdbController;
82
daniel park04c40cc2018-02-19 17:48:30 +090083import java.util.Collection;
84import java.util.List;
85import java.util.Map;
86import java.util.Objects;
87import java.util.Set;
88import java.util.stream.Collectors;
Hyunsun Moon090d77d2017-07-05 17:48:37 +090089
Ray Milkey0d47a552017-08-22 10:16:31 -070090import static org.easymock.EasyMock.anyObject;
91import static org.easymock.EasyMock.createMock;
Hyunsun Moon090d77d2017-07-05 17:48:37 +090092import static org.easymock.EasyMock.expect;
Ray Milkey0d47a552017-08-22 10:16:31 -070093import static org.easymock.EasyMock.replay;
Hyunsun Moon090d77d2017-07-05 17:48:37 +090094import static org.junit.Assert.assertEquals;
95import static org.onosproject.net.AnnotationKeys.PORT_NAME;
96import static org.onosproject.net.Device.Type.CONTROLLER;
97import static org.onosproject.net.Device.Type.SWITCH;
Ray Milkey0d47a552017-08-22 10:16:31 -070098import static org.onosproject.net.device.DeviceEvent.Type.DEVICE_ADDED;
99import static org.onosproject.net.device.DeviceEvent.Type.DEVICE_AVAILABILITY_CHANGED;
100import static org.onosproject.net.device.DeviceEvent.Type.PORT_ADDED;
101import static org.onosproject.net.device.DeviceEvent.Type.PORT_REMOVED;
Jian Li2d68c192018-12-13 15:52:59 +0900102import static org.onosproject.openstacknode.api.Constants.VXLAN_TUNNEL;
Ray Milkey0d47a552017-08-22 10:16:31 -0700103import static org.onosproject.openstacknode.api.Constants.INTEGRATION_BRIDGE;
104import static org.onosproject.openstacknode.api.Constants.PATCH_INTG_BRIDGE;
105import static org.onosproject.openstacknode.api.Constants.PATCH_ROUT_BRIDGE;
106import static org.onosproject.openstacknode.api.Constants.ROUTER_BRIDGE;
107import static org.onosproject.openstacknode.api.NodeState.COMPLETE;
108import static org.onosproject.openstacknode.api.NodeState.DEVICE_CREATED;
109import static org.onosproject.openstacknode.api.NodeState.INCOMPLETE;
110import static org.onosproject.openstacknode.api.NodeState.INIT;
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900111import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.COMPUTE;
112import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.GATEWAY;
113
114/**
115 * Unit test for DefaultOpenstackNodeHandler.
116 */
117public class DefaultOpenstackNodeHandlerTest {
118
119 private static final ApplicationId TEST_APP_ID = new DefaultApplicationId(1, "test");
120 private static final String ERR_STATE_NOT_MATCH = "Node state did not match";
121 private static final NodeId LOCAL_NODE_ID = new NodeId("local");
122 private static final ControllerNode LOCAL_CTRL =
123 new DefaultControllerNode(LOCAL_NODE_ID, IpAddress.valueOf("127.0.0.1"));
124
125 private static final BridgeDescription ROUT_BRIDGE = DefaultBridgeDescription.builder()
126 .name(ROUTER_BRIDGE)
127 .failMode(BridgeDescription.FailMode.SECURE)
128 .disableInBand()
129 .build();
130
Yuta HIGUCHI53e47962018-03-01 23:50:48 -0800131 private static final PortDescription PATCH_ROUT = DefaultPortDescription.builder()
132 .withPortNumber(PortNumber.portNumber(1))
133 .isEnabled(true)
134 .annotations(DefaultAnnotations.builder()
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900135 .set(PORT_NAME, PATCH_ROUT_BRIDGE)
Yuta HIGUCHI53e47962018-03-01 23:50:48 -0800136 .build())
137 .build();
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900138
139 private static final String COMPUTE_1_HOSTNAME = "compute_1";
140 private static final String COMPUTE_2_HOSTNAME = "compute_2";
141 private static final String COMPUTE_3_HOSTNAME = "compute_3";
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900142 private static final String GATEWAY_1_HOSTNAME = "gateway_1";
143 private static final String GATEWAY_2_HOSTNAME = "gateway_2";
144 private static final String GATEWAY_3_HOSTNAME = "gateway_3";
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900145
146 private static final IpAddress COMPUTE_1_IP = IpAddress.valueOf("10.100.0.1");
147 private static final IpAddress COMPUTE_2_IP = IpAddress.valueOf("10.100.0.2");
148 private static final IpAddress COMPUTE_3_IP = IpAddress.valueOf("10.100.0.3");
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900149 private static final IpAddress GATEWAY_1_IP = IpAddress.valueOf("10.100.0.5");
150 private static final IpAddress GATEWAY_2_IP = IpAddress.valueOf("10.100.0.6");
151 private static final IpAddress GATEWAY_3_IP = IpAddress.valueOf("10.100.0.7");
daniel parkb18424c2018-02-05 15:43:43 +0900152
153 private static final String GATEWAY_UPLINK_PORT = "eth0";
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900154
Jian Lie6312162018-03-21 21:41:00 +0900155 private static final Set<OpenstackPhyInterface> COMPUTE_1_PHY_INTFS = createPhyIntfs();
156 private static final Set<OpenstackPhyInterface> COMPUTE_2_PHY_INTFS = createPhyIntfs();
157 private static final Set<OpenstackPhyInterface> COMPUTE_3_PHY_INTFS = createPhyIntfs();
158
Jian Li789fadb2018-07-10 13:59:47 +0900159 private static final Set<ControllerInfo> COMPUTE_1_CONTROLLERS = createControllers();
160 private static final Set<ControllerInfo> COMPUTE_2_CONTROLLERS = createControllers();
161 private static final Set<ControllerInfo> COMPUTE_3_CONTROLLERS = createControllers();
162
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900163 private static final Device COMPUTE_1_INTG_DEVICE = createOpenFlowDevice(1, INTEGRATION_BRIDGE);
164 private static final Device COMPUTE_2_INTG_DEVICE = createOpenFlowDevice(2, INTEGRATION_BRIDGE);
165 private static final Device COMPUTE_3_INTG_DEVICE = createOpenFlowDevice(3, INTEGRATION_BRIDGE);
daniel parkb18424c2018-02-05 15:43:43 +0900166 private static final Device GATEWAY_1_INTG_DEVICE = createOpenFlowDevice(4, INTEGRATION_BRIDGE);
167 private static final Device GATEWAY_2_INTG_DEVICE = createOpenFlowDevice(5, INTEGRATION_BRIDGE);
168 private static final Device GATEWAY_3_INTG_DEVICE = createOpenFlowDevice(6, INTEGRATION_BRIDGE);
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900169
170 private static final Device COMPUTE_1_OVSDB_DEVICE = createOvsdbDevice(COMPUTE_1_IP);
171 private static final Device COMPUTE_2_OVSDB_DEVICE = createOvsdbDevice(COMPUTE_2_IP);
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900172 private static final Device GATEWAY_1_OVSDB_DEVICE = createOvsdbDevice(GATEWAY_1_IP);
173 private static final Device GATEWAY_2_OVSDB_DEVICE = createOvsdbDevice(GATEWAY_2_IP);
174
175 private static final OpenstackNode COMPUTE_1 = createNode(
176 COMPUTE_1_HOSTNAME,
177 COMPUTE,
178 COMPUTE_1_INTG_DEVICE,
179 COMPUTE_1_IP,
Jian Lie6312162018-03-21 21:41:00 +0900180 INIT,
Jian Li789fadb2018-07-10 13:59:47 +0900181 COMPUTE_1_PHY_INTFS,
182 COMPUTE_1_CONTROLLERS
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900183 );
184
185 private static final OpenstackNode COMPUTE_2 = createNode(
186 COMPUTE_2_HOSTNAME,
187 COMPUTE,
188 COMPUTE_2_INTG_DEVICE,
189 COMPUTE_2_IP,
Jian Lie6312162018-03-21 21:41:00 +0900190 DEVICE_CREATED,
Jian Li789fadb2018-07-10 13:59:47 +0900191 COMPUTE_2_PHY_INTFS,
192 COMPUTE_2_CONTROLLERS
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900193 );
194
195 private static final OpenstackNode COMPUTE_3 = createNode(
196 COMPUTE_3_HOSTNAME,
197 COMPUTE,
198 COMPUTE_3_INTG_DEVICE,
199 COMPUTE_3_IP,
Jian Lie6312162018-03-21 21:41:00 +0900200 COMPLETE,
Jian Li789fadb2018-07-10 13:59:47 +0900201 COMPUTE_3_PHY_INTFS,
202 COMPUTE_3_CONTROLLERS
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900203 );
204
Jian Lie6312162018-03-21 21:41:00 +0900205 private static final OpenstackNode GATEWAY_1 = createGatewayNode(
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900206 GATEWAY_1_HOSTNAME,
207 GATEWAY,
208 GATEWAY_1_INTG_DEVICE,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900209 GATEWAY_1_IP,
daniel parkb18424c2018-02-05 15:43:43 +0900210 GATEWAY_UPLINK_PORT,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900211 INIT
212 );
213
Jian Lie6312162018-03-21 21:41:00 +0900214 private static final OpenstackNode GATEWAY_2 = createGatewayNode(
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900215 GATEWAY_2_HOSTNAME,
216 GATEWAY,
217 GATEWAY_2_INTG_DEVICE,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900218 GATEWAY_2_IP,
daniel parkb18424c2018-02-05 15:43:43 +0900219 GATEWAY_UPLINK_PORT,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900220 DEVICE_CREATED
221 );
222
Jian Lie6312162018-03-21 21:41:00 +0900223 private static final OpenstackNode GATEWAY_3 = createGatewayNode(
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900224 GATEWAY_3_HOSTNAME,
225 GATEWAY,
226 GATEWAY_3_INTG_DEVICE,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900227 GATEWAY_3_IP,
daniel parkb18424c2018-02-05 15:43:43 +0900228 GATEWAY_UPLINK_PORT,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900229 COMPLETE
230 );
231
232 private static final TestDeviceService TEST_DEVICE_SERVICE = new TestDeviceService();
233
234 private TestOpenstackNodeManager testNodeManager;
235 private DefaultOpenstackNodeHandler target;
236
237 @Before
238 public void setUp() throws Exception {
239 DeviceAdminService mockDeviceAdminService = createMock(DeviceAdminService.class);
240 mockDeviceAdminService.removeDevice(anyObject());
241 replay(mockDeviceAdminService);
242
243 OvsdbClientService mockOvsdbClient = createMock(OvsdbClientService.class);
244 expect(mockOvsdbClient.isConnected())
245 .andReturn(true)
246 .anyTimes();
247 replay(mockOvsdbClient);
248
249 OvsdbController mockOvsdbController = createMock(OvsdbController.class);
250 expect(mockOvsdbController.getOvsdbClient(anyObject()))
251 .andReturn(mockOvsdbClient)
252 .anyTimes();
253 replay(mockOvsdbController);
254
255 testNodeManager = new TestOpenstackNodeManager();
256 target = new DefaultOpenstackNodeHandler();
257
258 target.coreService = new TestCoreService();
259 target.leadershipService = new TestLeadershipService();
260 target.clusterService = new TestClusterService();
261 target.deviceService = TEST_DEVICE_SERVICE;
262 target.deviceAdminService = mockDeviceAdminService;
263 target.ovsdbController = mockOvsdbController;
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900264 target.osNodeService = testNodeManager;
265 target.osNodeAdminService = testNodeManager;
266 target.componentConfigService = new TestComponentConfigService();
267 TestUtils.setField(target, "eventExecutor", MoreExecutors.newDirectExecutorService());
268 target.activate();
269 }
270
271 @After
272 public void tearDown() {
273 TEST_DEVICE_SERVICE.clear();
274 target.deactivate();
275 target = null;
276 testNodeManager = null;
277 }
278
279 /**
280 * Checks if the compute node state changes from INIT to DEVICE_CREATED
281 * after processing INIT state.
282 */
283 @Test
284 public void testComputeNodeProcessNodeInitState() {
285 testNodeManager.createNode(COMPUTE_1);
286 TEST_DEVICE_SERVICE.devMap.put(COMPUTE_1_OVSDB_DEVICE.id(), COMPUTE_1_OVSDB_DEVICE);
287
288 assertEquals(ERR_STATE_NOT_MATCH, INIT,
289 testNodeManager.node(COMPUTE_1_HOSTNAME).state());
290 target.processInitState(COMPUTE_1);
291 assertEquals(ERR_STATE_NOT_MATCH, DEVICE_CREATED,
292 testNodeManager.node(COMPUTE_1_HOSTNAME).state());
293 }
294
295 /**
296 * Checks if the gateway node state changes from INIT to DEVICE_CREATED
297 * after processing INIT state.
298 */
299 @Test
300 public void testGatewayNodeProcessNodeInitState() {
301 testNodeManager.createNode(GATEWAY_1);
302 TEST_DEVICE_SERVICE.devMap.put(GATEWAY_1_OVSDB_DEVICE.id(), GATEWAY_1_OVSDB_DEVICE);
303
304 assertEquals(ERR_STATE_NOT_MATCH, INIT,
305 testNodeManager.node(GATEWAY_1_HOSTNAME).state());
306 target.processInitState(GATEWAY_1);
307 assertEquals(ERR_STATE_NOT_MATCH, DEVICE_CREATED,
308 testNodeManager.node(GATEWAY_1_HOSTNAME).state());
309 }
310
311 /**
312 * Checks if the compute node state changes from DEVICE_CREATED to
313 * PORT_CREATED after processing DEVICE_CREATED state.
314 */
315 @Test
316 public void testComputeNodeProcessDeviceCreatedState() {
317 testNodeManager.createNode(COMPUTE_2);
318 TEST_DEVICE_SERVICE.devMap.put(COMPUTE_2_OVSDB_DEVICE.id(), COMPUTE_2_OVSDB_DEVICE);
319 TEST_DEVICE_SERVICE.devMap.put(COMPUTE_2_INTG_DEVICE.id(), COMPUTE_2_INTG_DEVICE);
320
321 assertEquals(ERR_STATE_NOT_MATCH, DEVICE_CREATED,
322 testNodeManager.node(COMPUTE_2_HOSTNAME).state());
323 target.processDeviceCreatedState(COMPUTE_2);
daniel parkb18424c2018-02-05 15:43:43 +0900324 assertEquals(ERR_STATE_NOT_MATCH, COMPLETE,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900325 testNodeManager.node(COMPUTE_2_HOSTNAME).state());
326 }
327
328 /**
329 * Checks if the gateway node state changes from DEVICE_CREATED to
330 * PORT_CREATED after processing DEVICE_CREATED state.
331 */
332 @Test
333 public void testGatewayNodeProcessDeviceCreatedState() {
334 testNodeManager.createNode(GATEWAY_2);
335 TEST_DEVICE_SERVICE.devMap.put(GATEWAY_2_OVSDB_DEVICE.id(), GATEWAY_2_OVSDB_DEVICE);
336 TEST_DEVICE_SERVICE.devMap.put(GATEWAY_2_INTG_DEVICE.id(), GATEWAY_2_INTG_DEVICE);
daniel parkb18424c2018-02-05 15:43:43 +0900337 TEST_DEVICE_SERVICE.portList.add(createPort(GATEWAY_2_INTG_DEVICE, GATEWAY_UPLINK_PORT));
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900338
339 assertEquals(ERR_STATE_NOT_MATCH, DEVICE_CREATED,
340 testNodeManager.node(GATEWAY_2_HOSTNAME).state());
341 target.processDeviceCreatedState(GATEWAY_2);
daniel parkb18424c2018-02-05 15:43:43 +0900342 assertEquals(ERR_STATE_NOT_MATCH, COMPLETE,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900343 testNodeManager.node(GATEWAY_2_HOSTNAME).state());
344 }
345
346 /**
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900347 * Checks if the compute node state changes from COMPLETE to INCOMPLETE
348 * when integration bridge is disconnected.
349 */
350 @Test
351 public void testBackToIncompleteWhenBrIntDisconnected() {
daniel parkb18424c2018-02-05 15:43:43 +0900352 testNodeManager.createNode(COMPUTE_3);
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900353
354 assertEquals(ERR_STATE_NOT_MATCH, COMPLETE,
daniel parkb18424c2018-02-05 15:43:43 +0900355 testNodeManager.node(COMPUTE_3_HOSTNAME).state());
356 TEST_DEVICE_SERVICE.removeDevice(COMPUTE_3_INTG_DEVICE);
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900357 assertEquals(ERR_STATE_NOT_MATCH, INCOMPLETE,
daniel parkb18424c2018-02-05 15:43:43 +0900358 testNodeManager.node(COMPUTE_3_HOSTNAME).state());
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900359 }
360
361 /**
362 * Checks if the compute node state changes from COMPLETE to INCOMPLETE
363 * when vxlan port is removed from integration bridge.
364 */
365 @Test
366 public void testBackToIncompleteWhenVxlanRemoved() {
daniel parkb18424c2018-02-05 15:43:43 +0900367 testNodeManager.createNode(COMPUTE_3);
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900368
369 assertEquals(ERR_STATE_NOT_MATCH, COMPLETE,
daniel parkb18424c2018-02-05 15:43:43 +0900370 testNodeManager.node(COMPUTE_3_HOSTNAME).state());
371 TEST_DEVICE_SERVICE.removePort(COMPUTE_3_INTG_DEVICE, createPort(
Jian Li2d68c192018-12-13 15:52:59 +0900372 COMPUTE_3_INTG_DEVICE, VXLAN_TUNNEL));
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900373 assertEquals(ERR_STATE_NOT_MATCH, INCOMPLETE,
daniel parkb18424c2018-02-05 15:43:43 +0900374 testNodeManager.node(COMPUTE_3_HOSTNAME).state());
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900375
376 }
377
378 private static Device createOvsdbDevice(IpAddress ovsdbIp) {
379 return new TestDevice(new ProviderId("of", "foo"),
380 DeviceId.deviceId("ovsdb:" + ovsdbIp.toString()),
381 CONTROLLER,
382 "manufacturer",
383 "hwVersion",
384 "swVersion",
385 "serialNumber",
386 new ChassisId(1));
387 }
388
389 private static Device createOpenFlowDevice(long devIdNum, String type) {
390 return new TestDevice(new ProviderId("of", "foo"),
391 DeviceId.deviceId(String.format("of:%016d", devIdNum)),
392 SWITCH,
393 type,
394 "hwVersion",
395 "swVersion",
396 "serialNumber",
397 new ChassisId(1));
398 }
399
400 private static Port createPort(Device device, String portName) {
401 return new DefaultPort(device,
402 PortNumber.portNumber(1),
403 true,
404 DefaultAnnotations.builder().set(PORT_NAME, portName).build());
405 }
406
Jian Lie6312162018-03-21 21:41:00 +0900407 private static Set<OpenstackPhyInterface> createPhyIntfs() {
408 return Sets.newConcurrentHashSet();
409 }
410
Jian Li789fadb2018-07-10 13:59:47 +0900411 private static Set<ControllerInfo> createControllers() {
412 return Sets.newConcurrentHashSet();
413 }
414
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900415 private static OpenstackNode createNode(String hostname,
416 OpenstackNode.NodeType type,
417 Device intgBridge,
418 IpAddress ipAddr,
Jian Lie6312162018-03-21 21:41:00 +0900419 NodeState state,
Jian Li789fadb2018-07-10 13:59:47 +0900420 Set<OpenstackPhyInterface> phyIntfs,
421 Set<ControllerInfo> controllers) {
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900422 return new TestOpenstackNode(
423 hostname,
424 type,
425 intgBridge.id(),
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900426 ipAddr,
427 ipAddr,
Daniel Park92abf312018-08-08 17:01:35 +0900428 null, null, state, phyIntfs, controllers,
Daniel Parkd02d7bd2018-08-23 23:04:31 +0900429 null, null, null, null);
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900430 }
431
Jian Lie6312162018-03-21 21:41:00 +0900432 private static OpenstackNode createGatewayNode(String hostname,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900433 OpenstackNode.NodeType type,
434 Device intgBridge,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900435 IpAddress ipAddr,
daniel parkb18424c2018-02-05 15:43:43 +0900436 String uplinkPort,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900437 NodeState state) {
438 return new TestOpenstackNode(
439 hostname,
440 type,
441 intgBridge.id(),
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900442 ipAddr,
443 ipAddr,
Daniel Park92abf312018-08-08 17:01:35 +0900444 null, uplinkPort, state, null, null, null, null, null,
Daniel Parkd02d7bd2018-08-23 23:04:31 +0900445 null);
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900446 }
447
448 private static final class TestDevice extends DefaultDevice {
449 private TestDevice(ProviderId providerId,
450 DeviceId id,
451 Type type,
452 String manufacturer,
453 String hwVersion,
454 String swVersion,
455 String serialNumber,
456 ChassisId chassisId,
457 Annotations... annotations) {
458 super(providerId,
459 id,
460 type,
461 manufacturer,
462 hwVersion,
463 swVersion,
464 serialNumber,
465 chassisId,
466 annotations);
467 }
468
469 @Override
470 @SuppressWarnings("unchecked")
471 public <B extends Behaviour> B as(Class<B> projectionClass) {
472 if (projectionClass.equals(BridgeConfig.class)) {
473 return (B) new TestBridgeConfig();
474 } else if (projectionClass.equals(InterfaceConfig.class)) {
475 return (B) new TestInterfaceConfig();
476 } else if (projectionClass.equals(ExtensionTreatmentResolver.class)) {
477 ExtensionTreatmentResolver treatmentResolver = createMock(ExtensionTreatmentResolver.class);
478 expect(treatmentResolver.getExtensionInstruction(anyObject()))
479 .andReturn(new TestExtensionTreatment())
480 .anyTimes();
481 replay(treatmentResolver);
482 return (B) treatmentResolver;
483 } else {
484 return null;
485 }
486 }
487
488 @Override
489 public <B extends Behaviour> boolean is(Class<B> projectionClass) {
490 return true;
491 }
492 }
493
494 private static final class TestOpenstackNode extends DefaultOpenstackNode {
495 private TestOpenstackNode(String hostname,
496 NodeType type,
497 DeviceId intgBridge,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900498 IpAddress managementIp,
499 IpAddress dataIp,
500 String vlanIntf,
daniel parkb18424c2018-02-05 15:43:43 +0900501 String uplinkPort,
Jian Lie6312162018-03-21 21:41:00 +0900502 NodeState state,
Jian Li27841662018-04-14 01:59:47 +0900503 Set<OpenstackPhyInterface> phyIntfs,
Jian Li789fadb2018-07-10 13:59:47 +0900504 Set<ControllerInfo> controllers,
Daniel Park92abf312018-08-08 17:01:35 +0900505 OpenstackSshAuth sshAuth,
Jian Lic704b672018-09-04 18:52:53 +0900506 DpdkConfig dpdkConfig,
507 KeystoneConfig keystoneConfig,
508 NeutronConfig neutronConfig) {
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900509 super(hostname,
510 type,
511 intgBridge,
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900512 managementIp,
513 dataIp,
514 vlanIntf,
daniel parkb18424c2018-02-05 15:43:43 +0900515 uplinkPort,
Jian Lie6312162018-03-21 21:41:00 +0900516 state,
Jian Li27841662018-04-14 01:59:47 +0900517 phyIntfs,
Jian Li789fadb2018-07-10 13:59:47 +0900518 controllers,
Daniel Park92abf312018-08-08 17:01:35 +0900519 sshAuth,
Jian Lic704b672018-09-04 18:52:53 +0900520 dpdkConfig,
521 keystoneConfig,
522 neutronConfig);
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900523 }
524
525 @Override
Jian Li2d68c192018-12-13 15:52:59 +0900526 public PortNumber vxlanTunnelPortNum() {
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900527 return PortNumber.portNumber(1);
528 }
529
530 @Override
531 public PortNumber vlanPortNum() {
532 return PortNumber.portNumber(1);
533 }
534
535 @Override
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900536 public MacAddress vlanPortMac() {
537 return MacAddress.NONE;
538 }
539 }
540
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900541 private static class TestDeviceService extends DeviceServiceAdapter {
542 Map<DeviceId, Device> devMap = Maps.newHashMap();
543 List<Port> portList = Lists.newArrayList();
544 List<DeviceListener> listeners = Lists.newArrayList();
545
546 @Override
547 public void addListener(DeviceListener listener) {
548 listeners.add(listener);
549 }
550
551 @Override
552 public void removeListener(DeviceListener listener) {
553 listeners.remove(listener);
554 }
555
556 @Override
557 public Device getDevice(DeviceId deviceId) {
558 return devMap.get(deviceId);
559 }
560
561 @Override
562 public List<Port> getPorts(DeviceId deviceId) {
563 return this.portList.stream()
564 .filter(p -> p.element().id().equals(deviceId))
565 .collect(Collectors.toList());
566 }
567
568 @Override
569 public boolean isAvailable(DeviceId deviceId) {
570 return devMap.containsKey(deviceId);
571 }
572
573 void addDevice(Device device) {
574 devMap.put(device.id(), device);
575 DeviceEvent event = new DeviceEvent(DEVICE_ADDED, device);
576 listeners.stream().filter(l -> l.isRelevant(event)).forEach(l -> l.event(event));
577 }
578
579 void removeDevice(Device device) {
580 devMap.remove(device.id());
581 DeviceEvent event = new DeviceEvent(DEVICE_AVAILABILITY_CHANGED, device);
582 listeners.stream().filter(l -> l.isRelevant(event)).forEach(l -> l.event(event));
583 }
584
585 void addPort(Device device, Port port) {
586 portList.add(port);
587 DeviceEvent event = new DeviceEvent(PORT_ADDED, device, port);
588 listeners.stream().filter(l -> l.isRelevant(event)).forEach(l -> l.event(event));
589 }
590
591 void removePort(Device device, Port port) {
592 portList.remove(port);
593 DeviceEvent event = new DeviceEvent(PORT_REMOVED, device, port);
594 listeners.stream().filter(l -> l.isRelevant(event)).forEach(l -> l.event(event));
595 }
596
597 void clear() {
598 this.listeners.clear();
599 this.devMap.clear();
600 this.portList.clear();
601 }
602 }
603
604 private static class TestBridgeConfig implements BridgeConfig {
605
606 @Override
607 public DriverData data() {
608 return null;
609 }
610
611 @Override
612 public void setData(DriverData data) {
613
614 }
615
616 @Override
617 public DriverHandler handler() {
618 return null;
619 }
620
621 @Override
622 public void setHandler(DriverHandler handler) {
623
624 }
625
626 @Override
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900627 public boolean addBridge(BridgeDescription bridge) {
628 TEST_DEVICE_SERVICE.addDevice(new DefaultDevice(new ProviderId("of", "foo"),
629 DeviceId.deviceId("of:" + bridge.datapathId().get()),
630 SWITCH,
631 bridge.name(),
632 "hwVersion",
633 "swVersion",
634 "serialNumber",
635 new ChassisId(1)));
636 return true;
637 }
638
639 @Override
640 public void deleteBridge(BridgeName bridgeName) {
641
642 }
643
644 @Override
645 public Collection<BridgeDescription> getBridges() {
646 return ImmutableSet.of(ROUT_BRIDGE);
647 }
648
649 @Override
650 public void addPort(BridgeName bridgeName, String portName) {
651
652 }
653
654 @Override
655 public void deletePort(BridgeName bridgeName, String portName) {
656
657 }
658
659 @Override
660 public Collection<PortDescription> getPorts() {
661 return ImmutableSet.of(PATCH_ROUT);
662 }
663
664 @Override
665 public Set<PortNumber> getPortNumbers() {
666 return null;
667 }
668
669 @Override
670 public List<PortNumber> getLocalPorts(Iterable<String> ifaceIds) {
671 return null;
672 }
673 }
674
675 private static class TestInterfaceConfig implements InterfaceConfig {
676
677 @Override
678 public DriverData data() {
679 return null;
680 }
681
682 @Override
683 public void setData(DriverData data) {
684
685 }
686
687 @Override
688 public DriverHandler handler() {
689 return null;
690 }
691
692 @Override
693 public void setHandler(DriverHandler handler) {
694
695 }
696
697 @Override
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900698 public boolean addAccessMode(String intf, VlanId vlanId) {
699 return false;
700 }
701
702 @Override
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900703 public boolean removeAccessMode(String intf) {
704 return false;
705 }
706
707 @Override
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900708 public boolean addTrunkMode(String intf, List<VlanId> vlanIds) {
709 return false;
710 }
711
712 @Override
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900713 public boolean removeTrunkMode(String intf) {
714 return false;
715 }
716
717 @Override
718 public boolean addRateLimit(String intf, short limit) {
719 return false;
720 }
721
722 @Override
723 public boolean removeRateLimit(String intf) {
724 return false;
725 }
726
727 @Override
728 public boolean addTunnelMode(String intf, TunnelDescription tunnelDesc) {
729 TEST_DEVICE_SERVICE.devMap.values().stream()
730 .filter(device -> device.type() == SWITCH &&
731 device.manufacturer().equals(INTEGRATION_BRIDGE))
732 .forEach(device -> {
733 TEST_DEVICE_SERVICE.addPort(device, createPort(device, intf));
734 });
735 return true;
736 }
737
738 @Override
739 public boolean removeTunnelMode(String intf) {
740 return false;
741 }
742
743 @Override
744 public boolean addPatchMode(String ifaceName, PatchDescription patchInterface) {
745 if (ifaceName.equals(PATCH_INTG_BRIDGE)) {
746 TEST_DEVICE_SERVICE.devMap.values().stream()
747 .filter(device -> device.type() == SWITCH &&
748 device.manufacturer().equals(INTEGRATION_BRIDGE))
749 .forEach(device -> {
750 TEST_DEVICE_SERVICE.addPort(device, createPort(device, ifaceName));
751 });
752 } else if (ifaceName.equals(PATCH_ROUT_BRIDGE)) {
753 TEST_DEVICE_SERVICE.devMap.values().stream()
754 .filter(device -> device.type() == SWITCH &&
755 device.manufacturer().equals(ROUTER_BRIDGE))
756 .forEach(device -> {
757 TEST_DEVICE_SERVICE.addPort(device, createPort(device, ifaceName));
758 });
759 }
760 return true;
761 }
762
763 @Override
764 public boolean removePatchMode(String ifaceName) {
765 return false;
766 }
767
768 @Override
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900769 public List<DeviceInterfaceDescription> getInterfaces() {
770 return null;
771 }
772 }
773
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900774 private static class TestExtensionTreatment implements ExtensionTreatment {
775 Ip4Address tunnelDst;
776
777 @Override
778 public ExtensionTreatmentType type() {
779 return null;
780 }
781
782 @Override
783 public <T> void setPropertyValue(String key, T value) throws ExtensionPropertyException {
784 tunnelDst = (Ip4Address) value;
785 }
786
787 @Override
788 public <T> T getPropertyValue(String key) throws ExtensionPropertyException {
789 return null;
790 }
791
792 @Override
793 public List<String> getProperties() {
794 return null;
795 }
796
797 @Override
798 public byte[] serialize() {
799 return new byte[0];
800 }
801
802 @Override
803 public void deserialize(byte[] data) {
804
805 }
806
807 @Override
808 public boolean equals(Object obj) {
809 TestExtensionTreatment that = (TestExtensionTreatment) obj;
810 return Objects.equals(tunnelDst, that.tunnelDst);
811 }
812
813 @Override
814 public int hashCode() {
815 return Objects.hash(tunnelDst);
816 }
817 }
818
819 private static class TestCoreService extends CoreServiceAdapter {
820
821 @Override
822 public ApplicationId getAppId(String name) {
823 return TEST_APP_ID;
824 }
825 }
826
827 private static class TestLeadershipService extends LeadershipServiceAdapter {
828
829 @Override
830 public NodeId getLeader(String path) {
831 return LOCAL_NODE_ID;
832 }
833 }
834
835 private static class TestClusterService extends ClusterServiceAdapter {
836
837 @Override
838 public ControllerNode getLocalNode() {
839 return LOCAL_CTRL;
840 }
841 }
842
843 private class TestComponentConfigService extends ComponentConfigAdapter {
844
845 }
846}