blob: be4f6d1db451a4df269ad552c729d4909ea8c6ef [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
18import com.fasterxml.jackson.databind.node.ObjectNode;
Jian Li1064e4f2018-05-29 16:16:53 +090019import com.google.common.collect.ImmutableSet;
Daniel Park95f73312018-07-31 15:48:34 +090020import com.google.common.collect.Lists;
Jian Li1064e4f2018-05-29 16:16:53 +090021import com.google.common.collect.Maps;
22import com.google.common.collect.Sets;
Jian Lidea0fdb2018-04-02 19:02:48 +090023import com.google.common.testing.EqualsTester;
24import org.apache.commons.io.IOUtils;
25import org.junit.After;
26import org.junit.Before;
27import org.junit.Test;
Jian Li1064e4f2018-05-29 16:16:53 +090028import org.onlab.packet.Ip4Address;
29import org.onlab.packet.IpAddress;
Daniel Park95985382018-07-23 11:38:07 +090030import org.onlab.packet.MacAddress;
Daniel Park95f73312018-07-31 15:48:34 +090031import org.onosproject.net.DefaultAnnotations;
32import org.onosproject.net.DefaultPort;
Jian Li1064e4f2018-05-29 16:16:53 +090033import org.onosproject.net.Device;
34import org.onosproject.net.DeviceId;
Daniel Park95985382018-07-23 11:38:07 +090035import org.onosproject.net.PortNumber;
Daniel Park95f73312018-07-31 15:48:34 +090036import org.onosproject.net.device.DeviceService;
37import org.onosproject.net.device.DeviceServiceAdapter;
Daniel Park95985382018-07-23 11:38:07 +090038import org.onosproject.openstacknetworking.api.InstancePort;
39import org.onosproject.openstacknetworking.impl.DefaultInstancePort;
40import org.onosproject.openstacknetworking.web.OpenstackFloatingIpWebResourceTest;
41import org.onosproject.openstacknetworking.web.OpenstackNetworkWebResourceTest;
Jian Li1064e4f2018-05-29 16:16:53 +090042import org.onosproject.openstacknode.api.NodeState;
43import org.onosproject.openstacknode.api.OpenstackNode;
Jian Li5a38ab62018-07-02 22:34:11 +090044import org.onosproject.openstacknode.api.OpenstackNodeTest;
Jian Lidea0fdb2018-04-02 19:02:48 +090045import org.openstack4j.model.network.NetFloatingIP;
Daniel Park95985382018-07-23 11:38:07 +090046import org.openstack4j.model.network.Port;
Jian Lidea0fdb2018-04-02 19:02:48 +090047import org.openstack4j.openstack.networking.domain.NeutronFloatingIP;
Daniel Park95985382018-07-23 11:38:07 +090048import org.openstack4j.openstack.networking.domain.NeutronPort;
Jian Lidea0fdb2018-04-02 19:02:48 +090049
50import java.io.IOException;
51import java.io.InputStream;
52import java.nio.charset.StandardCharsets;
Daniel Park95f73312018-07-31 15:48:34 +090053import java.util.List;
Jian Li1064e4f2018-05-29 16:16:53 +090054import java.util.Map;
55import java.util.Set;
56
57import static org.junit.Assert.assertEquals;
Daniel Park95f73312018-07-31 15:48:34 +090058import static org.junit.Assert.assertFalse;
Daniel Park95985382018-07-23 11:38:07 +090059import static org.junit.Assert.assertNull;
Daniel Park95f73312018-07-31 15:48:34 +090060import static org.junit.Assert.assertTrue;
61import static org.onosproject.net.AnnotationKeys.PORT_NAME;
Jian Li1064e4f2018-05-29 16:16:53 +090062import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.getGwByComputeDevId;
Jian Lidea0fdb2018-04-02 19:02:48 +090063
64public final class OpenstackNetworkingUtilTest {
65
Daniel Park95985382018-07-23 11:38:07 +090066 private NetFloatingIP floatingIp1;
67 private NetFloatingIP floatingIp2;
68 private NetFloatingIP floatingIp3;
69 private Port openstackPort;
70 private Port openstackSriovPort1;
71 private Port openstackSriovPort2;
72 private Port openstackSriovPort3;
73 private InstancePort instancePort1;
74 private InstancePort instancePort2;
75 private InstancePort instancePort3;
Jian Lidea0fdb2018-04-02 19:02:48 +090076
77 @Before
78 public void setUp() {
Daniel Park95985382018-07-23 11:38:07 +090079
80 instancePort1 = DefaultInstancePort.builder()
81 .networkId("net-id-1")
82 .portId("ce705c24-c1ef-408a-bda3-7bbd946164ab")
83 .deviceId(DeviceId.deviceId("of:000000000000000a"))
84 .portNumber(PortNumber.portNumber(1, "tap-1"))
85 .ipAddress(IpAddress.valueOf("10.0.0.3"))
86 .macAddress(MacAddress.valueOf("11:22:33:44:55:66"))
87 .state(InstancePort.State.valueOf("ACTIVE"))
Jian Lidea0fdb2018-04-02 19:02:48 +090088 .build();
Daniel Park95985382018-07-23 11:38:07 +090089
90 instancePort2 = DefaultInstancePort.builder()
91 .networkId("net-id-2")
92 .portId("port-id-2")
93 .deviceId(DeviceId.deviceId("of:000000000000000b"))
94 .portNumber(PortNumber.portNumber(2, "tap-2"))
95 .ipAddress(IpAddress.valueOf("10.10.10.2"))
96 .macAddress(MacAddress.valueOf("22:33:44:55:66:11"))
97 .state(InstancePort.State.valueOf("ACTIVE"))
98 .build();
99
100 instancePort3 = DefaultInstancePort.builder()
101 .networkId("net-id-3")
102 .portId("port-id-3")
103 .deviceId(DeviceId.deviceId("of:000000000000000c"))
104 .oldDeviceId(DeviceId.deviceId("of:000000000000000d"))
105 .oldPortNumber(PortNumber.portNumber(4, "tap-4"))
106 .portNumber(PortNumber.portNumber(3, "tap-3"))
107 .ipAddress(IpAddress.valueOf("10.10.10.3"))
108 .macAddress(MacAddress.valueOf("33:44:55:66:11:22"))
109 .state(InstancePort.State.valueOf("ACTIVE"))
110 .build();
111
112 InputStream floatingIpjsonStream1 = OpenstackFloatingIpWebResourceTest.class
113 .getResourceAsStream("openstack-floatingip1.json");
114 InputStream floatingIpjsonStream2 = OpenstackFloatingIpWebResourceTest.class
115 .getResourceAsStream("openstack-floatingip2.json");
116 InputStream floatingIpjsonStream3 = OpenstackFloatingIpWebResourceTest.class
117 .getResourceAsStream("openstack-floatingip3.json");
118
119 floatingIp1 = (NetFloatingIP)
120 OpenstackNetworkingUtil.jsonToModelEntity(floatingIpjsonStream1, NeutronFloatingIP.class);
121 floatingIp2 = (NetFloatingIP)
122 OpenstackNetworkingUtil.jsonToModelEntity(floatingIpjsonStream2, NeutronFloatingIP.class);
123 floatingIp3 = (NetFloatingIP)
124 OpenstackNetworkingUtil.jsonToModelEntity(floatingIpjsonStream3, NeutronFloatingIP.class);
125
Jian Lidea0fdb2018-04-02 19:02:48 +0900126 }
127
128 @After
129 public void tearDown() {
130 }
131
132 /**
133 * Tests the floatingIp translation.
134 */
135 @Test
136 public void testFloatingIp() throws IOException {
137 ObjectNode floatingIpNode =
Daniel Park95985382018-07-23 11:38:07 +0900138 OpenstackNetworkingUtil.modelEntityToJson(floatingIp1, NeutronFloatingIP.class);
Jian Lidea0fdb2018-04-02 19:02:48 +0900139 InputStream is = IOUtils.toInputStream(floatingIpNode.toString(), StandardCharsets.UTF_8.name());
140 NetFloatingIP floatingIp2 = (NetFloatingIP)
141 OpenstackNetworkingUtil.jsonToModelEntity(is, NeutronFloatingIP.class);
Daniel Park95985382018-07-23 11:38:07 +0900142 new EqualsTester().addEqualityGroup(floatingIp1, floatingIp2).testEquals();
143 }
144
145 /**
146 * Tests the associatedFloatingIp method.
147 * @throws NullPointerException
148 */
149 @Test
150 public void testAsscoatedFloatingIp() throws NullPointerException {
151 Set<NetFloatingIP> testSet = Sets.newHashSet();
152 testSet.add(floatingIp1);
153 testSet.add(floatingIp2);
154 testSet.add(floatingIp3);
155
156 NetFloatingIP floatingIp1 = OpenstackNetworkingUtil.associatedFloatingIp(instancePort1, testSet);
157 NetFloatingIP floatingIp2 = OpenstackNetworkingUtil.associatedFloatingIp(instancePort2, testSet);
158
159 assertEquals(floatingIp1, this.floatingIp1);
160 assertEquals(floatingIp2, null);
161 }
162
163 /**
164 * Tests the getGwByInstancePort method.
165 */
166 @Test
167 public void testGetGwByInstancePort() {
168
169 Set<OpenstackNode> gws = Sets.newConcurrentHashSet();
170 gws.add(genGateway(1));
171 gws.add(genGateway(2));
172 gws.add(genGateway(3));
173
174 int expectedGwIndex = 2;
175
176 OpenstackNode gw = OpenstackNetworkingUtil.getGwByInstancePort(gws, instancePort1);
177
178 assertEquals(genGateway(expectedGwIndex), gw);
Jian Lidea0fdb2018-04-02 19:02:48 +0900179 }
Jian Li1064e4f2018-05-29 16:16:53 +0900180
181 /**
182 * Tests the getGwByComputeDevId method.
183 */
184 @Test
185 public void testGetGwByComputeDevId() {
186 Set<OpenstackNode> gws = Sets.newConcurrentHashSet();
Daniel Park95985382018-07-23 11:38:07 +0900187
188 OpenstackNode nullGw = getGwByComputeDevId(gws, genDeviceId(1));
189 assertNull(nullGw);
190
Jian Li1064e4f2018-05-29 16:16:53 +0900191 gws.add(genGateway(1));
192 gws.add(genGateway(2));
193 gws.add(genGateway(3));
194
195 Set<OpenstackNode> cloneOfGws = ImmutableSet.copyOf(gws);
196
197 Map<String, Integer> gwCountMap = Maps.newConcurrentMap();
198 int numOfDev = 99;
199
200 for (int i = 1; i < 1 + numOfDev; i++) {
201 OpenstackNode gw = getGwByComputeDevId(gws, genDeviceId(i));
202
203 if (gwCountMap.get(gw.hostname()) == null) {
204 gwCountMap.put(gw.hostname(), 1);
205 } else {
206 gwCountMap.compute(gw.hostname(), (k, v) -> v + 1);
207 }
208
209 new EqualsTester().addEqualityGroup(
210 getGwByComputeDevId(gws, genDeviceId(i)),
211 getGwByComputeDevId(cloneOfGws, genDeviceId(i)))
212 .testEquals();
213 }
214
215 int sum = gwCountMap.values().stream().mapToInt(Integer::intValue).sum();
216 assertEquals(numOfDev, sum);
217 }
218
Daniel Park95985382018-07-23 11:38:07 +0900219 /**
220 * Tests getIntfNameFromPciAddress method.
221 */
222 @Test
223 public void testGetIntfNameFromPciAddress() {
224
225 InputStream portJsonStream = OpenstackNetworkWebResourceTest.class
226 .getResourceAsStream("openstack-port.json");
227
228 InputStream sriovPortJsonStream1 = OpenstackNetworkWebResourceTest.class
229 .getResourceAsStream("openstack-port-sriov1.json");
230 InputStream sriovPortJsonStream2 = OpenstackNetworkWebResourceTest.class
231 .getResourceAsStream("openstack-port-sriov2.json");
232 InputStream sriovPortJsonStream3 = OpenstackNetworkWebResourceTest.class
233 .getResourceAsStream("openstack-port-sriov3.json");
234
235 openstackPort = (Port)
236 OpenstackNetworkingUtil.jsonToModelEntity(portJsonStream, NeutronPort.class);
237
238 openstackSriovPort1 = (Port)
239 OpenstackNetworkingUtil.jsonToModelEntity(sriovPortJsonStream1, NeutronPort.class);
240 openstackSriovPort2 = (Port)
241 OpenstackNetworkingUtil.jsonToModelEntity(sriovPortJsonStream2, NeutronPort.class);
242 openstackSriovPort3 = (Port)
243 OpenstackNetworkingUtil.jsonToModelEntity(sriovPortJsonStream3, NeutronPort.class);
244
245 String expectedIntfName1 = "enp5s8";
246 String expectedIntfName2 = "enp5s8f3";
247
248 assertNull(OpenstackNetworkingUtil.getIntfNameFromPciAddress(openstackPort));
249 assertEquals(expectedIntfName1, OpenstackNetworkingUtil.getIntfNameFromPciAddress(openstackSriovPort1));
250 assertEquals(expectedIntfName2, OpenstackNetworkingUtil.getIntfNameFromPciAddress(openstackSriovPort2));
251 assertNull(OpenstackNetworkingUtil.getIntfNameFromPciAddress(openstackSriovPort3));
252 }
253
254 /**
Daniel Park95f73312018-07-31 15:48:34 +0900255 * Tests swapStaleLocation method.
Daniel Park95985382018-07-23 11:38:07 +0900256 */
257 @Test
258 public void testSwapStaleLocation() {
259 InstancePort swappedInstancePort = OpenstackNetworkingUtil.swapStaleLocation(instancePort3);
260
261 assertEquals(instancePort3.oldDeviceId(), swappedInstancePort.deviceId());
262 assertEquals(instancePort3.oldPortNumber(), swappedInstancePort.portNumber());
263
264 }
265
Daniel Park95f73312018-07-31 15:48:34 +0900266 /**
267 * Tests hasIntfAleadyInDevice method.
268 */
269 @Test
270 public void testHasIntfAleadyInDevice() {
271 DeviceService deviceService = new TestDeviceService();
272 assertTrue(OpenstackNetworkingUtil.hasIntfAleadyInDevice(DeviceId.deviceId("deviceId"),
273 "port1", deviceService));
274 assertTrue(OpenstackNetworkingUtil.hasIntfAleadyInDevice(DeviceId.deviceId("deviceId"),
275 "port2", deviceService));
276 assertTrue(OpenstackNetworkingUtil.hasIntfAleadyInDevice(DeviceId.deviceId("deviceId"),
277 "port3", deviceService));
278 assertFalse(OpenstackNetworkingUtil.hasIntfAleadyInDevice(DeviceId.deviceId("deviceId"),
279 "port4", deviceService));
280 }
281
Jian Li1064e4f2018-05-29 16:16:53 +0900282 private OpenstackNode genGateway(int index) {
283
284 Device intgBrg = InternalOpenstackNodeTest.createDevice(index);
285
286 String hostname = "gateway-" + index;
287 IpAddress ip = Ip4Address.valueOf("10.10.10." + index);
288 NodeState state = NodeState.COMPLETE;
289 String uplinkPort = "eth0";
290 return InternalOpenstackNodeTest.createNode(hostname,
291 OpenstackNode.NodeType.GATEWAY, intgBrg, ip, uplinkPort, state);
292
293 }
294
295 private DeviceId genDeviceId(int index) {
296 return DeviceId.deviceId("of:compute-" + index);
297 }
298
299 protected class InternalOpenstackNodeTest extends OpenstackNodeTest {
300 }
Daniel Park95f73312018-07-31 15:48:34 +0900301
302 /**
303 * Mocks the DeviceService.
304 */
305 private class TestDeviceService extends DeviceServiceAdapter {
306 @Override
307 public List<org.onosproject.net.Port> getPorts(DeviceId deviceId) {
308 List<org.onosproject.net.Port> ports = Lists.newArrayList();
309 DefaultAnnotations.Builder annotations1 = DefaultAnnotations.builder()
310 .set(PORT_NAME, "port1");
311 DefaultAnnotations.Builder annotations2 = DefaultAnnotations.builder()
312 .set(PORT_NAME, "port2");
313 DefaultAnnotations.Builder annotations3 = DefaultAnnotations.builder()
314 .set(PORT_NAME, "port3");
315
316 org.onosproject.net.Port port1 = new DefaultPort(null, PortNumber.portNumber(1),
317 true, annotations1.build());
318 org.onosproject.net.Port port2 = new DefaultPort(null, PortNumber.portNumber(2),
319 true, annotations2.build());
320 org.onosproject.net.Port port3 = new DefaultPort(null, PortNumber.portNumber(3),
321 true, annotations3.build());
322
323 ports.add(port1);
324 ports.add(port2);
325 ports.add(port3);
326
327 return ports;
328 }
329 }
Jian Lidea0fdb2018-04-02 19:02:48 +0900330}