blob: 9bedb367b563294b9c5c58b6afe01052a0e88279 [file] [log] [blame]
Jian Lidea0fdb2018-04-02 19:02:48 +09001/*
2 * Copyright 2018-present Open Networking Foundation
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package org.onosproject.openstacknetworking.util;
17
Daniel Park2ff66b42018-08-01 11:52:45 +090018import com.fasterxml.jackson.databind.ObjectMapper;
Jian Lidea0fdb2018-04-02 19:02:48 +090019import com.fasterxml.jackson.databind.node.ObjectNode;
Jian Li1064e4f2018-05-29 16:16:53 +090020import com.google.common.collect.ImmutableSet;
Daniel Park95f73312018-07-31 15:48:34 +090021import com.google.common.collect.Lists;
Jian Li1064e4f2018-05-29 16:16:53 +090022import com.google.common.collect.Maps;
23import com.google.common.collect.Sets;
Jian Lidea0fdb2018-04-02 19:02:48 +090024import com.google.common.testing.EqualsTester;
25import org.apache.commons.io.IOUtils;
26import org.junit.After;
27import org.junit.Before;
Jian Lic704b672018-09-04 18:52:53 +090028import org.junit.Ignore;
Jian Lidea0fdb2018-04-02 19:02:48 +090029import org.junit.Test;
Jian Li1064e4f2018-05-29 16:16:53 +090030import org.onlab.packet.Ip4Address;
31import org.onlab.packet.IpAddress;
Daniel Park95985382018-07-23 11:38:07 +090032import org.onlab.packet.MacAddress;
Daniel Park95f73312018-07-31 15:48:34 +090033import org.onosproject.net.DefaultAnnotations;
34import org.onosproject.net.DefaultPort;
Jian Li1064e4f2018-05-29 16:16:53 +090035import org.onosproject.net.Device;
36import org.onosproject.net.DeviceId;
Daniel Park95985382018-07-23 11:38:07 +090037import org.onosproject.net.PortNumber;
Daniel Park95f73312018-07-31 15:48:34 +090038import org.onosproject.net.device.DeviceService;
39import org.onosproject.net.device.DeviceServiceAdapter;
Daniel Park7e8c4d82018-08-13 23:47:49 +090040import org.onosproject.openstacknetworking.api.Constants;
Daniel Park95985382018-07-23 11:38:07 +090041import org.onosproject.openstacknetworking.api.InstancePort;
Daniel Park2ff66b42018-08-01 11:52:45 +090042import org.onosproject.openstacknetworking.api.OpenstackNetworkService;
43import org.onosproject.openstacknetworking.api.OpenstackRouterAdminService;
Daniel Park95985382018-07-23 11:38:07 +090044import org.onosproject.openstacknetworking.impl.DefaultInstancePort;
Daniel Park2ff66b42018-08-01 11:52:45 +090045import org.onosproject.openstacknetworking.impl.OpenstackNetworkServiceAdapter;
46import org.onosproject.openstacknetworking.impl.OpenstackRouterServiceAdapter;
47import org.onosproject.openstacknetworking.impl.TestRouterInterface;
Daniel Park95985382018-07-23 11:38:07 +090048import org.onosproject.openstacknetworking.web.OpenstackFloatingIpWebResourceTest;
49import org.onosproject.openstacknetworking.web.OpenstackNetworkWebResourceTest;
Jian Li7b8c3682019-05-12 13:57:15 +090050import org.onosproject.openstacknode.api.DefaultKeystoneConfig;
Daniel Park2ff66b42018-08-01 11:52:45 +090051import org.onosproject.openstacknode.api.DefaultOpenstackAuth;
52import org.onosproject.openstacknode.api.DefaultOpenstackNode;
Jian Lic704b672018-09-04 18:52:53 +090053import org.onosproject.openstacknode.api.KeystoneConfig;
Jian Li1064e4f2018-05-29 16:16:53 +090054import org.onosproject.openstacknode.api.NodeState;
Daniel Park2ff66b42018-08-01 11:52:45 +090055import org.onosproject.openstacknode.api.OpenstackAuth;
Jian Li1064e4f2018-05-29 16:16:53 +090056import org.onosproject.openstacknode.api.OpenstackNode;
Jian Li5a38ab62018-07-02 22:34:11 +090057import org.onosproject.openstacknode.api.OpenstackNodeTest;
Jian Lidea0fdb2018-04-02 19:02:48 +090058import org.openstack4j.model.network.NetFloatingIP;
Daniel Park2ff66b42018-08-01 11:52:45 +090059import org.openstack4j.model.network.Network;
Daniel Park95985382018-07-23 11:38:07 +090060import org.openstack4j.model.network.Port;
Daniel Park2ff66b42018-08-01 11:52:45 +090061import org.openstack4j.model.network.RouterInterface;
Jian Lidea0fdb2018-04-02 19:02:48 +090062import org.openstack4j.openstack.networking.domain.NeutronFloatingIP;
Daniel Park2ff66b42018-08-01 11:52:45 +090063import org.openstack4j.openstack.networking.domain.NeutronNetwork;
Daniel Park95985382018-07-23 11:38:07 +090064import org.openstack4j.openstack.networking.domain.NeutronPort;
Jian Lidea0fdb2018-04-02 19:02:48 +090065
66import java.io.IOException;
67import java.io.InputStream;
68import java.nio.charset.StandardCharsets;
Daniel Park95f73312018-07-31 15:48:34 +090069import java.util.List;
Jian Li1064e4f2018-05-29 16:16:53 +090070import java.util.Map;
71import java.util.Set;
72
73import static org.junit.Assert.assertEquals;
Daniel Park95f73312018-07-31 15:48:34 +090074import static org.junit.Assert.assertFalse;
Daniel Park95985382018-07-23 11:38:07 +090075import static org.junit.Assert.assertNull;
Daniel Park95f73312018-07-31 15:48:34 +090076import static org.junit.Assert.assertTrue;
77import static org.onosproject.net.AnnotationKeys.PORT_NAME;
Jian Li7b8c3682019-05-12 13:57:15 +090078import static org.onosproject.openstacknetworking.api.Constants.REST_UTF8;
Daniel Parkec9d1132018-08-19 11:18:03 +090079import static org.onosproject.openstacknetworking.api.Constants.UNSUPPORTED_VENDOR;
Daniel Park2ff66b42018-08-01 11:52:45 +090080import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.addRouterIface;
81import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.associatedFloatingIp;
Jian Licad36c72018-09-13 17:44:54 +090082import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.checkActivationFlag;
Daniel Park2ff66b42018-08-01 11:52:45 +090083import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.checkArpMode;
Jian Lif654dd12020-01-30 17:41:26 +090084import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.getBroadcastAddr;
Daniel Park2ff66b42018-08-01 11:52:45 +090085import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.getConnectedClient;
Jian Li1064e4f2018-05-29 16:16:53 +090086import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.getGwByComputeDevId;
Daniel Park2ff66b42018-08-01 11:52:45 +090087import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.getGwByInstancePort;
88import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.getIntfNameFromPciAddress;
89import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.isAssociatedWithVM;
90import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.jsonToModelEntity;
91import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.modelEntityToJson;
92import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.prettyJson;
93import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.routerInterfacesEquals;
94import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.swapStaleLocation;
Daniel Park7e8c4d82018-08-13 23:47:49 +090095import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.vnicType;
Jian Lidea0fdb2018-04-02 19:02:48 +090096
97public final class OpenstackNetworkingUtilTest {
98
Daniel Park95985382018-07-23 11:38:07 +090099 private NetFloatingIP floatingIp1;
100 private NetFloatingIP floatingIp2;
101 private NetFloatingIP floatingIp3;
102 private Port openstackPort;
103 private Port openstackSriovPort1;
104 private Port openstackSriovPort2;
105 private Port openstackSriovPort3;
106 private InstancePort instancePort1;
107 private InstancePort instancePort2;
108 private InstancePort instancePort3;
Daniel Park2ff66b42018-08-01 11:52:45 +0900109 private Map<String, RouterInterface> routerInterfaceMap = Maps.newHashMap();
110 private OpenstackNode openstackControlNodeV2;
111 private OpenstackNode openstackControlNodeV3;
Jian Lidea0fdb2018-04-02 19:02:48 +0900112
113 @Before
Jian Li7b8c3682019-05-12 13:57:15 +0900114 public void setUp() throws IOException {
Daniel Park95985382018-07-23 11:38:07 +0900115
116 instancePort1 = DefaultInstancePort.builder()
117 .networkId("net-id-1")
118 .portId("ce705c24-c1ef-408a-bda3-7bbd946164ab")
119 .deviceId(DeviceId.deviceId("of:000000000000000a"))
120 .portNumber(PortNumber.portNumber(1, "tap-1"))
121 .ipAddress(IpAddress.valueOf("10.0.0.3"))
122 .macAddress(MacAddress.valueOf("11:22:33:44:55:66"))
123 .state(InstancePort.State.valueOf("ACTIVE"))
Jian Lidea0fdb2018-04-02 19:02:48 +0900124 .build();
Daniel Park95985382018-07-23 11:38:07 +0900125
126 instancePort2 = DefaultInstancePort.builder()
127 .networkId("net-id-2")
128 .portId("port-id-2")
129 .deviceId(DeviceId.deviceId("of:000000000000000b"))
130 .portNumber(PortNumber.portNumber(2, "tap-2"))
131 .ipAddress(IpAddress.valueOf("10.10.10.2"))
132 .macAddress(MacAddress.valueOf("22:33:44:55:66:11"))
133 .state(InstancePort.State.valueOf("ACTIVE"))
134 .build();
135
136 instancePort3 = DefaultInstancePort.builder()
137 .networkId("net-id-3")
138 .portId("port-id-3")
139 .deviceId(DeviceId.deviceId("of:000000000000000c"))
140 .oldDeviceId(DeviceId.deviceId("of:000000000000000d"))
141 .oldPortNumber(PortNumber.portNumber(4, "tap-4"))
142 .portNumber(PortNumber.portNumber(3, "tap-3"))
143 .ipAddress(IpAddress.valueOf("10.10.10.3"))
144 .macAddress(MacAddress.valueOf("33:44:55:66:11:22"))
145 .state(InstancePort.State.valueOf("ACTIVE"))
146 .build();
147
148 InputStream floatingIpjsonStream1 = OpenstackFloatingIpWebResourceTest.class
149 .getResourceAsStream("openstack-floatingip1.json");
150 InputStream floatingIpjsonStream2 = OpenstackFloatingIpWebResourceTest.class
151 .getResourceAsStream("openstack-floatingip2.json");
152 InputStream floatingIpjsonStream3 = OpenstackFloatingIpWebResourceTest.class
153 .getResourceAsStream("openstack-floatingip3.json");
154
155 floatingIp1 = (NetFloatingIP)
Jian Li7b8c3682019-05-12 13:57:15 +0900156 jsonToModelEntity(IOUtils.toString(floatingIpjsonStream1, REST_UTF8),
157 NeutronFloatingIP.class);
Daniel Park95985382018-07-23 11:38:07 +0900158 floatingIp2 = (NetFloatingIP)
Jian Li7b8c3682019-05-12 13:57:15 +0900159 jsonToModelEntity(IOUtils.toString(floatingIpjsonStream2, REST_UTF8),
160 NeutronFloatingIP.class);
Daniel Park95985382018-07-23 11:38:07 +0900161 floatingIp3 = (NetFloatingIP)
Jian Li7b8c3682019-05-12 13:57:15 +0900162 jsonToModelEntity(IOUtils.toString(floatingIpjsonStream3, REST_UTF8),
163 NeutronFloatingIP.class);
Daniel Park95985382018-07-23 11:38:07 +0900164
Daniel Park2ff66b42018-08-01 11:52:45 +0900165 InputStream portJsonStream = OpenstackNetworkWebResourceTest.class
166 .getResourceAsStream("openstack-port.json");
167
168 InputStream sriovPortJsonStream1 = OpenstackNetworkWebResourceTest.class
169 .getResourceAsStream("openstack-port-sriov1.json");
170 InputStream sriovPortJsonStream2 = OpenstackNetworkWebResourceTest.class
171 .getResourceAsStream("openstack-port-sriov2.json");
172 InputStream sriovPortJsonStream3 = OpenstackNetworkWebResourceTest.class
173 .getResourceAsStream("openstack-port-sriov3.json");
174
175 openstackPort = (Port)
Jian Li7b8c3682019-05-12 13:57:15 +0900176 jsonToModelEntity(
177 IOUtils.toString(portJsonStream, REST_UTF8), NeutronPort.class);
Daniel Park2ff66b42018-08-01 11:52:45 +0900178
179 openstackSriovPort1 = (Port)
Jian Li7b8c3682019-05-12 13:57:15 +0900180 jsonToModelEntity(IOUtils.toString(sriovPortJsonStream1, REST_UTF8),
181 NeutronPort.class);
Daniel Park2ff66b42018-08-01 11:52:45 +0900182 openstackSriovPort2 = (Port)
Jian Li7b8c3682019-05-12 13:57:15 +0900183 jsonToModelEntity(IOUtils.toString(sriovPortJsonStream2, REST_UTF8),
184 NeutronPort.class);
Daniel Park2ff66b42018-08-01 11:52:45 +0900185 openstackSriovPort3 = (Port)
Jian Li7b8c3682019-05-12 13:57:15 +0900186 jsonToModelEntity(IOUtils.toString(sriovPortJsonStream3, REST_UTF8),
187 NeutronPort.class);
Jian Lidea0fdb2018-04-02 19:02:48 +0900188 }
189
190 @After
191 public void tearDown() {
192 }
193
194 /**
195 * Tests the floatingIp translation.
196 */
197 @Test
198 public void testFloatingIp() throws IOException {
199 ObjectNode floatingIpNode =
Daniel Park2ff66b42018-08-01 11:52:45 +0900200 modelEntityToJson(floatingIp1, NeutronFloatingIP.class);
Jian Lidea0fdb2018-04-02 19:02:48 +0900201 InputStream is = IOUtils.toInputStream(floatingIpNode.toString(), StandardCharsets.UTF_8.name());
202 NetFloatingIP floatingIp2 = (NetFloatingIP)
Jian Li7b8c3682019-05-12 13:57:15 +0900203 jsonToModelEntity(IOUtils.toString(is, REST_UTF8), NeutronFloatingIP.class);
Daniel Park95985382018-07-23 11:38:07 +0900204 new EqualsTester().addEqualityGroup(floatingIp1, floatingIp2).testEquals();
205 }
206
207 /**
208 * Tests the associatedFloatingIp method.
Daniel Park95985382018-07-23 11:38:07 +0900209 */
210 @Test
211 public void testAsscoatedFloatingIp() throws NullPointerException {
212 Set<NetFloatingIP> testSet = Sets.newHashSet();
213 testSet.add(floatingIp1);
214 testSet.add(floatingIp2);
215 testSet.add(floatingIp3);
216
Daniel Park2ff66b42018-08-01 11:52:45 +0900217 NetFloatingIP floatingIp1 = associatedFloatingIp(instancePort1, testSet);
218 NetFloatingIP floatingIp2 = associatedFloatingIp(instancePort2, testSet);
Daniel Park95985382018-07-23 11:38:07 +0900219
220 assertEquals(floatingIp1, this.floatingIp1);
221 assertEquals(floatingIp2, null);
222 }
223
224 /**
Daniel Park2ff66b42018-08-01 11:52:45 +0900225 * Tests the isAssociatedWithVM method.
226 */
227 @Test
228 public void testIsAssociatedWithVM() {
229 OpenstackNetworkService service = new TestOpenstackNetworkService();
230 NetFloatingIP floatingIp4 = new NeutronFloatingIP().toBuilder().portId("portId4").build();
231
232 assertFalse(isAssociatedWithVM(service, floatingIp4));
233 assertFalse(isAssociatedWithVM(service, floatingIp3));
234 assertTrue(isAssociatedWithVM(service, floatingIp1));
235 }
236
237 /**
238 * Tests the isAssociatedWithVM method in case IllegalStateException is occurred.
239 */
240 @Test(expected = IllegalStateException.class)
241 public void testIsAssociatedWithVMexceptionCase() {
242 OpenstackNetworkService service = new TestOpenstackNetworkService();
243 isAssociatedWithVM(service, floatingIp2);
244 }
245
246
247 /**
Daniel Park95985382018-07-23 11:38:07 +0900248 * Tests the getGwByInstancePort method.
249 */
250 @Test
251 public void testGetGwByInstancePort() {
252
253 Set<OpenstackNode> gws = Sets.newConcurrentHashSet();
254 gws.add(genGateway(1));
255 gws.add(genGateway(2));
256 gws.add(genGateway(3));
257
258 int expectedGwIndex = 2;
259
Daniel Park2ff66b42018-08-01 11:52:45 +0900260 OpenstackNode gw = getGwByInstancePort(gws, instancePort1);
Daniel Park95985382018-07-23 11:38:07 +0900261
262 assertEquals(genGateway(expectedGwIndex), gw);
Daniel Park2ff66b42018-08-01 11:52:45 +0900263
264 assertNull(getGwByInstancePort(gws, null));
Jian Lidea0fdb2018-04-02 19:02:48 +0900265 }
Jian Li1064e4f2018-05-29 16:16:53 +0900266
267 /**
268 * Tests the getGwByComputeDevId method.
269 */
270 @Test
271 public void testGetGwByComputeDevId() {
272 Set<OpenstackNode> gws = Sets.newConcurrentHashSet();
Daniel Park95985382018-07-23 11:38:07 +0900273
274 OpenstackNode nullGw = getGwByComputeDevId(gws, genDeviceId(1));
275 assertNull(nullGw);
276
Jian Li1064e4f2018-05-29 16:16:53 +0900277 gws.add(genGateway(1));
278 gws.add(genGateway(2));
279 gws.add(genGateway(3));
280
281 Set<OpenstackNode> cloneOfGws = ImmutableSet.copyOf(gws);
282
283 Map<String, Integer> gwCountMap = Maps.newConcurrentMap();
284 int numOfDev = 99;
285
286 for (int i = 1; i < 1 + numOfDev; i++) {
287 OpenstackNode gw = getGwByComputeDevId(gws, genDeviceId(i));
288
289 if (gwCountMap.get(gw.hostname()) == null) {
290 gwCountMap.put(gw.hostname(), 1);
291 } else {
292 gwCountMap.compute(gw.hostname(), (k, v) -> v + 1);
293 }
294
295 new EqualsTester().addEqualityGroup(
296 getGwByComputeDevId(gws, genDeviceId(i)),
297 getGwByComputeDevId(cloneOfGws, genDeviceId(i)))
298 .testEquals();
299 }
300
301 int sum = gwCountMap.values().stream().mapToInt(Integer::intValue).sum();
302 assertEquals(numOfDev, sum);
303 }
304
Daniel Park95985382018-07-23 11:38:07 +0900305 /**
306 * Tests getIntfNameFromPciAddress method.
307 */
308 @Test
309 public void testGetIntfNameFromPciAddress() {
310
Daniel Park95985382018-07-23 11:38:07 +0900311 String expectedIntfName1 = "enp5s8";
312 String expectedIntfName2 = "enp5s8f3";
313
Daniel Park2ff66b42018-08-01 11:52:45 +0900314 assertNull(getIntfNameFromPciAddress(openstackPort));
315 assertEquals(expectedIntfName1, getIntfNameFromPciAddress(openstackSriovPort1));
316 assertEquals(expectedIntfName2, getIntfNameFromPciAddress(openstackSriovPort2));
Daniel Parkec9d1132018-08-19 11:18:03 +0900317 assertEquals(UNSUPPORTED_VENDOR, getIntfNameFromPciAddress(openstackSriovPort3));
Daniel Park95985382018-07-23 11:38:07 +0900318 }
319
320 /**
Daniel Park95f73312018-07-31 15:48:34 +0900321 * Tests swapStaleLocation method.
Daniel Park95985382018-07-23 11:38:07 +0900322 */
323 @Test
324 public void testSwapStaleLocation() {
Daniel Park2ff66b42018-08-01 11:52:45 +0900325 InstancePort swappedInstancePort = swapStaleLocation(instancePort3);
Daniel Park95985382018-07-23 11:38:07 +0900326
327 assertEquals(instancePort3.oldDeviceId(), swappedInstancePort.deviceId());
328 assertEquals(instancePort3.oldPortNumber(), swappedInstancePort.portNumber());
329
330 }
331
Daniel Park95f73312018-07-31 15:48:34 +0900332 /**
333 * Tests hasIntfAleadyInDevice method.
334 */
335 @Test
336 public void testHasIntfAleadyInDevice() {
337 DeviceService deviceService = new TestDeviceService();
338 assertTrue(OpenstackNetworkingUtil.hasIntfAleadyInDevice(DeviceId.deviceId("deviceId"),
339 "port1", deviceService));
340 assertTrue(OpenstackNetworkingUtil.hasIntfAleadyInDevice(DeviceId.deviceId("deviceId"),
341 "port2", deviceService));
342 assertTrue(OpenstackNetworkingUtil.hasIntfAleadyInDevice(DeviceId.deviceId("deviceId"),
343 "port3", deviceService));
344 assertFalse(OpenstackNetworkingUtil.hasIntfAleadyInDevice(DeviceId.deviceId("deviceId"),
345 "port4", deviceService));
346 }
347
Daniel Park2ff66b42018-08-01 11:52:45 +0900348 /**
349 * Tests addRouterIface method.
350 */
351 @Test
352 public void testAddRouterIface() {
353 OpenstackRouterAdminService service = new TestOpenstackRouterAdminService();
Jian Li1064e4f2018-05-29 16:16:53 +0900354
Daniel Park2ff66b42018-08-01 11:52:45 +0900355 addRouterIface(openstackPort, service);
356 RouterInterface initialRouterInterface = new TestRouterInterface(openstackPort.getDeviceId(),
357 openstackPort.getFixedIps().stream().findAny().get().getSubnetId(),
358 openstackPort.getId(),
359 openstackPort.getTenantId());
360
361 assertTrue(routerInterfacesEquals(initialRouterInterface, service.routerInterface(openstackPort.getId())));
362
363 addRouterIface(openstackSriovPort1, service);
364 RouterInterface updatedInitialRouterInterface = new TestRouterInterface(openstackSriovPort1.getDeviceId(),
365 openstackSriovPort1.getFixedIps().stream().findAny().get().getSubnetId(),
366 openstackSriovPort1.getId(),
367 openstackSriovPort1.getTenantId());
368
369 assertTrue(routerInterfacesEquals(
370 updatedInitialRouterInterface, service.routerInterface(openstackSriovPort1.getId())));
371 }
372
373 /**
374 * Util for generating dummy gateway node.
375 *
376 * @param index dummy gateway number
377 * @return dummy gateway node
378 */
379 public OpenstackNode genGateway(int index) {
Jian Li1064e4f2018-05-29 16:16:53 +0900380 Device intgBrg = InternalOpenstackNodeTest.createDevice(index);
381
382 String hostname = "gateway-" + index;
383 IpAddress ip = Ip4Address.valueOf("10.10.10." + index);
384 NodeState state = NodeState.COMPLETE;
385 String uplinkPort = "eth0";
386 return InternalOpenstackNodeTest.createNode(hostname,
387 OpenstackNode.NodeType.GATEWAY, intgBrg, ip, uplinkPort, state);
Daniel Park2ff66b42018-08-01 11:52:45 +0900388 }
389
390 /**
391 * Tests the testPrettyJson method.
392 */
393 @Test
394 public void testPrettyJson() {
395 String string = prettyJson(new ObjectMapper(), "{\"json\":\"json\"}");
396 String prettyJsonString = "{\n \"json\" : \"json\"\n}";
397 assertEquals(string, prettyJsonString);
398
399 assertNull(prettyJson(new ObjectMapper(), "{\"json\":\"json\""));
400 assertNull(prettyJson(new ObjectMapper(), "{\"json\"\"json\"}"));
401 }
402
403 /**
404 * Tests the checkArpMode method.
405 */
406 @Test
407 public void testCheckArpMode() {
408 assertFalse(checkArpMode(null));
409 assertTrue(checkArpMode("proxy"));
410 assertTrue(checkArpMode("broadcast"));
411 }
412
413 /**
414 * Tests the getConnectedClient method.
415 */
Jian Lic704b672018-09-04 18:52:53 +0900416 @Ignore
Jian Li6d410362018-08-17 09:41:08 +0900417 @Test
Daniel Park2ff66b42018-08-01 11:52:45 +0900418 public void testGetConnectedClient() {
419 OpenstackNode.Builder osNodeBuilderV2 = DefaultOpenstackNode.builder();
420 OpenstackAuth.Builder osNodeAuthBuilderV2 = DefaultOpenstackAuth.builder()
421 .version("v2.0")
Daniel Park2ff66b42018-08-01 11:52:45 +0900422 .protocol(OpenstackAuth.Protocol.HTTP)
423 .project("admin")
424 .username("admin")
425 .password("password")
426 .perspective(OpenstackAuth.Perspective.PUBLIC);
427
Jian Lic704b672018-09-04 18:52:53 +0900428 String endpointV2 = "1.1.1.1:35357/v2.0";
429
430 KeystoneConfig keystoneConfigV2 = DefaultKeystoneConfig.builder()
431 .authentication(osNodeAuthBuilderV2.build())
432 .endpoint(endpointV2)
433 .build();
434
Daniel Park2ff66b42018-08-01 11:52:45 +0900435 openstackControlNodeV2 = osNodeBuilderV2.hostname("controllerv2")
436 .type(OpenstackNode.NodeType.CONTROLLER)
437 .managementIp(IpAddress.valueOf("1.1.1.1"))
Jian Lic704b672018-09-04 18:52:53 +0900438 .keystoneConfig(keystoneConfigV2)
Daniel Park2ff66b42018-08-01 11:52:45 +0900439 .state(NodeState.COMPLETE)
440 .build();
441
Daniel Park2ff66b42018-08-01 11:52:45 +0900442 OpenstackNode.Builder osNodeBuilderV3 = DefaultOpenstackNode.builder();
443 OpenstackAuth.Builder osNodeAuthBuilderV3 = DefaultOpenstackAuth.builder()
444 .version("v2")
Daniel Park2ff66b42018-08-01 11:52:45 +0900445 .protocol(OpenstackAuth.Protocol.HTTP)
446 .project("admin")
447 .username("admin")
448 .password("password")
449 .perspective(OpenstackAuth.Perspective.PUBLIC);
450
Jian Lic704b672018-09-04 18:52:53 +0900451 String endpointV3 = "2.2.2.2:80/v3";
452
453 KeystoneConfig keystoneConfigV3 = DefaultKeystoneConfig.builder()
454 .authentication(osNodeAuthBuilderV3.build())
455 .endpoint(endpointV3)
456 .build();
457
Daniel Park2ff66b42018-08-01 11:52:45 +0900458 openstackControlNodeV3 = osNodeBuilderV3.hostname("controllerv3")
459 .type(OpenstackNode.NodeType.CONTROLLER)
460 .managementIp(IpAddress.valueOf("2.2.2.2"))
Jian Lic704b672018-09-04 18:52:53 +0900461 .keystoneConfig(keystoneConfigV3)
Daniel Park2ff66b42018-08-01 11:52:45 +0900462 .state(NodeState.COMPLETE)
463 .build();
464
465 getConnectedClient(openstackControlNodeV2);
466 getConnectedClient(openstackControlNodeV3);
Jian Li1064e4f2018-05-29 16:16:53 +0900467 }
468
Daniel Park7e8c4d82018-08-13 23:47:49 +0900469 /**
470 * Tests the vnicType method.
471 */
472 @Test
473 public void testVnicType() {
474 String portNameNormalTap = "tap123456789ab";
475 String portNameNormalVhu = "tap123456789ab";
476 String portNameNormalCavium = "enp1f2s3";
477 String portNameUnsupported = "123456789ab";
478
479 assertEquals(vnicType(portNameNormalTap), Constants.VnicType.NORMAL);
480 assertEquals(vnicType(portNameNormalVhu), Constants.VnicType.NORMAL);
481 assertEquals(vnicType(portNameNormalCavium), Constants.VnicType.DIRECT);
482 assertEquals(vnicType(portNameUnsupported), Constants.VnicType.UNSUPPORTED);
483 }
484
Jian Licad36c72018-09-13 17:44:54 +0900485 /**
486 * Tests the checkActivationFlag method.
487 */
488 @Test
489 public void testCheckActivationFlag() {
490 assertFalse(checkActivationFlag("disable"));
491 assertTrue(checkActivationFlag("enable"));
492 }
493
494 /**
495 * Tests the checkActivationFlag method with incorrect input parameters.
496 */
497 @Test (expected = IllegalArgumentException.class)
498 public void testCheckActivationFlagWithException() {
499 checkActivationFlag("test");
500 checkActivationFlag(null);
501 }
502
Jian Lif654dd12020-01-30 17:41:26 +0900503 /**
504 * Tests the getBroadcastAddr method.
505 */
506 @Test
507 public void testGetBroadcastAddr() {
508 String ipAddr = "192.168.10.35";
509 int prefix1 = 24;
510 String broadcast1 = getBroadcastAddr(ipAddr, prefix1);
511 assertEquals(broadcast1, "192.168.10.255");
512
513 int prefix2 = 28;
514 String broadcast2 = getBroadcastAddr(ipAddr, prefix2);
515 assertEquals(broadcast2, "192.168.10.47");
516
517 int prefix3 = 32;
518 String broadcast3 = getBroadcastAddr(ipAddr, prefix3);
519 assertEquals(broadcast3, "192.168.10.35");
520
521 int prefix4 = 16;
522 String broadcast4 = getBroadcastAddr(ipAddr, prefix4);
523 assertEquals(broadcast4, "192.168.255.255");
524 }
525
Jian Li1064e4f2018-05-29 16:16:53 +0900526 private DeviceId genDeviceId(int index) {
527 return DeviceId.deviceId("of:compute-" + index);
528 }
529
530 protected class InternalOpenstackNodeTest extends OpenstackNodeTest {
531 }
Daniel Park95f73312018-07-31 15:48:34 +0900532
533 /**
534 * Mocks the DeviceService.
535 */
536 private class TestDeviceService extends DeviceServiceAdapter {
537 @Override
538 public List<org.onosproject.net.Port> getPorts(DeviceId deviceId) {
539 List<org.onosproject.net.Port> ports = Lists.newArrayList();
540 DefaultAnnotations.Builder annotations1 = DefaultAnnotations.builder()
541 .set(PORT_NAME, "port1");
542 DefaultAnnotations.Builder annotations2 = DefaultAnnotations.builder()
543 .set(PORT_NAME, "port2");
544 DefaultAnnotations.Builder annotations3 = DefaultAnnotations.builder()
545 .set(PORT_NAME, "port3");
546
547 org.onosproject.net.Port port1 = new DefaultPort(null, PortNumber.portNumber(1),
548 true, annotations1.build());
549 org.onosproject.net.Port port2 = new DefaultPort(null, PortNumber.portNumber(2),
550 true, annotations2.build());
551 org.onosproject.net.Port port3 = new DefaultPort(null, PortNumber.portNumber(3),
552 true, annotations3.build());
553
554 ports.add(port1);
555 ports.add(port2);
556 ports.add(port3);
557
558 return ports;
559 }
560 }
Daniel Park2ff66b42018-08-01 11:52:45 +0900561
562 private class TestOpenstackNetworkService extends OpenstackNetworkServiceAdapter {
563 @Override
564 public Network network(String networkId) {
565 if (networkId.equals(openstackSriovPort1.getNetworkId())) {
566 return new NeutronNetwork().toBuilder().name("network").build();
567 } else {
568 return null;
569 }
570 }
571
572 @Override
573 public Port port(String portId) {
574 if (portId.equals(floatingIp1.getPortId())) {
575 return openstackSriovPort1;
576 } else if (portId.equals(floatingIp2.getPortId())) {
577 return openstackSriovPort2;
578 } else if (portId.equals("portId4")) {
579 return new NeutronPort().toBuilder().name("osPort4").build();
580 } else {
581 return null;
582 }
583 }
584 }
585
586 private class TestOpenstackRouterAdminService extends OpenstackRouterServiceAdapter {
587 @Override
588 public void addRouterInterface(RouterInterface osRouterIface) {
589 routerInterfaceMap.put(osRouterIface.getPortId(), osRouterIface);
590 }
591
592 @Override
593 public void updateRouterInterface(RouterInterface osRouterIface) {
594 routerInterfaceMap.put(osRouterIface.getPortId(), osRouterIface);
595 }
596
597 @Override
598 public RouterInterface routerInterface(String osRouterIfaceId) {
599 return routerInterfaceMap.get(osRouterIfaceId);
600 }
601 }
Jian Lidea0fdb2018-04-02 19:02:48 +0900602}