2 * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.groupbasedpolicy.neutron.ovsdb.util;
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertFalse;
13 import static org.junit.Assert.assertNull;
14 import static org.junit.Assert.assertTrue;
15 import static org.mockito.Matchers.any;
16 import static org.mockito.Mockito.mock;
17 import static org.mockito.Mockito.never;
18 import static org.mockito.Mockito.verify;
19 import static org.mockito.Mockito.when;
21 import java.util.Collections;
23 import com.google.common.base.Optional;
24 import com.google.common.util.concurrent.CheckedFuture;
25 import org.junit.Before;
26 import org.junit.Test;
27 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
28 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
29 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
30 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
31 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
32 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
33 import org.opendaylight.groupbasedpolicy.neutron.ovsdb.AbstractTunnelType;
34 import org.opendaylight.ovsdb.southbound.SouthboundConstants;
35 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayNodeConfig;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.nodes.node.Tunnel;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.nodes.node.TunnelKey;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.overlay.rev150105.TunnelTypeBase;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.overlay.rev150105.TunnelTypeVxlan;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.DatapathId;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation;
46 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
47 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
48 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
49 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
50 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
51 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
53 public class InventoryHelperTest {
55 private DataBroker dataBroker;
56 private ReadOnlyTransaction readTransaction;
57 private ReadWriteTransaction writeTransaction;
59 private CheckedFuture<Optional<OvsdbTerminationPointAugmentation>, ReadFailedException> terminationPointFuture;
60 private CheckedFuture<Optional<OvsdbBridgeAugmentation>, ReadFailedException> bridgeFuture;
61 private CheckedFuture<Optional<OfOverlayNodeConfig>, ReadFailedException> nodeConfigFuture;
63 private Optional<OvsdbTerminationPointAugmentation> terminationPointOptional;
64 private Optional<OvsdbBridgeAugmentation> bridgeOptional;
65 private Optional<OfOverlayNodeConfig> nodeConfigOptional;
67 private InstanceIdentifier<OvsdbTerminationPointAugmentation> ovsdbTpIid;
68 private String nodeIdString = "nodeIdString";
70 @SuppressWarnings("unchecked")
72 public void init() throws Exception {
73 dataBroker = mock(DataBroker.class);
75 terminationPointFuture = mock(CheckedFuture.class);
76 terminationPointOptional = mock(Optional.class);
77 when(terminationPointFuture.checkedGet()).thenReturn(terminationPointOptional);
78 bridgeFuture = mock(CheckedFuture.class);
79 bridgeOptional = mock(Optional.class);
80 when(bridgeFuture.checkedGet()).thenReturn(bridgeOptional);
81 nodeConfigFuture = mock(CheckedFuture.class);
82 nodeConfigOptional = mock(Optional.class);
83 when(nodeConfigFuture.checkedGet()).thenReturn(nodeConfigOptional);
85 readTransaction = mock(ReadOnlyTransaction.class);
86 writeTransaction = mock(ReadWriteTransaction.class);
87 when(dataBroker.newReadOnlyTransaction()).thenReturn(readTransaction);
88 when(dataBroker.newReadWriteTransaction()).thenReturn(writeTransaction);
89 ovsdbTpIid = InstanceIdentifier.create(NetworkTopology.class)
90 .child(Topology.class, new TopologyKey(SouthboundConstants.OVSDB_TOPOLOGY_ID))
92 .child(TerminationPoint.class)
93 .augmentation(OvsdbTerminationPointAugmentation.class);
97 public void testGetLongFromDpid() {
98 String dpid = "FF:FF:FF:FF:FF:FF:FF:FF";
99 Long result = InventoryHelper.getLongFromDpid(dpid);
100 assertEquals(Long.valueOf(281474976710655L), result);
104 public void testGetInventoryNodeIdString() throws Exception {
105 OvsdbBridgeAugmentation ovsdbBridge = mock(OvsdbBridgeAugmentation.class);
107 DatapathId datapathId = mock(DatapathId.class);
108 when(ovsdbBridge.getDatapathId()).thenReturn(datapathId);
109 when(datapathId.getValue()).thenReturn("FF:FF:FF:FF:FF:FF:FF:FF");
111 String result = InventoryHelper.getInventoryNodeIdString(ovsdbBridge, ovsdbTpIid, dataBroker);
112 assertEquals("openflow:281474976710655", result);
115 @SuppressWarnings("unchecked")
117 public void testGetInventoryNodeIdString_DpidNull() throws Exception {
118 OvsdbBridgeAugmentation ovsdbBridge = mock(OvsdbBridgeAugmentation.class);
120 when(readTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class)))
121 .thenReturn(bridgeFuture);
122 when(bridgeOptional.isPresent()).thenReturn(true);
123 OvsdbBridgeAugmentation bridge = mock(OvsdbBridgeAugmentation.class);
124 when(bridgeOptional.get()).thenReturn(bridge);
125 when(bridge.getDatapathId()).thenReturn(null);
127 String result = InventoryHelper.getInventoryNodeIdString(ovsdbBridge, ovsdbTpIid, dataBroker);
132 public void testGetInventoryNodeConnectorIdString() {
133 String inventoryNodeId = "openflow:inventoryNodeId";
134 OvsdbTerminationPointAugmentation ovsdbTp = mock(OvsdbTerminationPointAugmentation.class);
135 when(ovsdbTp.getOfport()).thenReturn(65534L);
138 InventoryHelper.getInventoryNodeConnectorIdString(inventoryNodeId, ovsdbTp, ovsdbTpIid, dataBroker);
139 assertEquals("openflow:inventoryNodeId:65534", result);
143 public void testGetInventoryNodeConnectorIdString_IncorrectFormat() {
144 String inventoryNodeId = "inventoryNodeId";
145 OvsdbTerminationPointAugmentation ovsdbTp = mock(OvsdbTerminationPointAugmentation.class);
146 when(ovsdbTp.getOfport()).thenReturn(65534L);
149 InventoryHelper.getInventoryNodeConnectorIdString(inventoryNodeId, ovsdbTp, ovsdbTpIid, dataBroker);
154 public void testGetInventoryNodeConnectorIdString_OfportNull() throws Exception {
155 String inventoryNodeId = "openflow:inventoryNodeId";
156 OvsdbTerminationPointAugmentation ovsdbTp = mock(OvsdbTerminationPointAugmentation.class);
157 when(ovsdbTp.getOfport()).thenReturn(65535L);
160 InventoryHelper.getInventoryNodeConnectorIdString(inventoryNodeId, ovsdbTp, ovsdbTpIid, dataBroker);
164 @SuppressWarnings("unchecked")
166 public void testGetInventoryNodeConnectorIdString_OfportOver() throws Exception {
167 String inventoryNodeId = "openflow:inventoryNodeId";
168 OvsdbTerminationPointAugmentation ovsdbTp = mock(OvsdbTerminationPointAugmentation.class);
169 when(ovsdbTp.getOfport()).thenReturn(null);
171 when(readTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class)))
172 .thenReturn(terminationPointFuture);
173 when(terminationPointOptional.isPresent()).thenReturn(true);
174 OvsdbTerminationPointAugmentation readOvsdbTp = mock(OvsdbTerminationPointAugmentation.class);
175 when(terminationPointOptional.get()).thenReturn(readOvsdbTp);
177 when(readOvsdbTp.getOfport()).thenReturn(65534L);
180 InventoryHelper.getInventoryNodeConnectorIdString(inventoryNodeId, ovsdbTp, ovsdbTpIid, dataBroker);
181 assertEquals("openflow:inventoryNodeId:65534", result);
184 @SuppressWarnings("unchecked")
186 public void testGetInventoryNodeConnectorIdString_OfportNull_AugmentationOfportNull() throws Exception {
187 String inventoryNodeId = "openflow:inventoryNodeId";
188 OvsdbTerminationPointAugmentation ovsdbTp = mock(OvsdbTerminationPointAugmentation.class);
189 when(ovsdbTp.getOfport()).thenReturn(null);
191 when(readTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class)))
192 .thenReturn(terminationPointFuture);
193 when(terminationPointOptional.isPresent()).thenReturn(true);
194 OvsdbTerminationPointAugmentation readOvsdbTp = mock(OvsdbTerminationPointAugmentation.class);
195 when(terminationPointOptional.get()).thenReturn(readOvsdbTp);
196 when(readOvsdbTp.getOfport()).thenReturn(null);
199 InventoryHelper.getInventoryNodeConnectorIdString(inventoryNodeId, ovsdbTp, ovsdbTpIid, dataBroker);
203 @SuppressWarnings("unchecked")
205 public void testGetInventoryNodeConnectorIdString_OfportNull_AugmentationOfportOver() throws Exception {
206 String inventoryNodeId = "openflow:inventoryNodeId";
207 OvsdbTerminationPointAugmentation ovsdbTp = mock(OvsdbTerminationPointAugmentation.class);
208 when(ovsdbTp.getOfport()).thenReturn(null);
210 when(readTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class)))
211 .thenReturn(terminationPointFuture);
212 OvsdbTerminationPointAugmentation readOvsdbTp = mock(OvsdbTerminationPointAugmentation.class);
213 when(terminationPointOptional.get()).thenReturn(readOvsdbTp);
214 when(readOvsdbTp.getOfport()).thenReturn(65535L);
217 InventoryHelper.getInventoryNodeConnectorIdString(inventoryNodeId, ovsdbTp, ovsdbTpIid, dataBroker);
221 @SuppressWarnings({"unchecked", "rawtypes"})
223 public void testCheckOfOverlayConfig() throws Exception {
224 AbstractTunnelType abstractTunnelType = mock(AbstractTunnelType.class);
226 when(writeTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class)))
227 .thenReturn(nodeConfigFuture);
228 when(nodeConfigOptional.isPresent()).thenReturn(true);
229 OfOverlayNodeConfig overlayConfig = mock(OfOverlayNodeConfig.class);
230 when(nodeConfigOptional.get()).thenReturn(overlayConfig);
232 Tunnel tunnel = mock(Tunnel.class);
233 when(overlayConfig.getTunnel()).thenReturn(Collections.singletonList(tunnel));
235 when(abstractTunnelType.getTunnelType()).thenReturn((Class) TunnelTypeVxlan.class);
236 when(tunnel.getTunnelType()).thenReturn((Class) TunnelTypeVxlan.class);
238 boolean result = InventoryHelper.checkOfOverlayConfig(nodeIdString,
239 Collections.singletonList(abstractTunnelType), dataBroker);
243 @SuppressWarnings({"unchecked", "rawtypes"})
245 public void testCheckOfOverlayConfig_TunnelTypeEqualsFalse() throws Exception {
246 AbstractTunnelType abstractTunnelType = mock(AbstractTunnelType.class);
248 when(writeTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class)))
249 .thenReturn(nodeConfigFuture);
250 when(nodeConfigOptional.isPresent()).thenReturn(true);
251 OfOverlayNodeConfig overlayConfig = mock(OfOverlayNodeConfig.class);
252 when(nodeConfigOptional.get()).thenReturn(overlayConfig);
254 Tunnel tunnel = mock(Tunnel.class);
255 when(overlayConfig.getTunnel()).thenReturn(Collections.singletonList(tunnel));
257 when(abstractTunnelType.getTunnelType()).thenReturn((Class) TunnelTypeVxlan.class);
258 when(tunnel.getTunnelType()).thenReturn((Class) TunnelTypeBase.class);
260 boolean result = InventoryHelper.checkOfOverlayConfig(nodeIdString,
261 Collections.singletonList(abstractTunnelType), dataBroker);
265 @SuppressWarnings({"unchecked", "unused"})
267 public void testCheckOfOverlayConfig_ConfigNull() throws Exception {
268 AbstractTunnelType abstractTunnelType = mock(AbstractTunnelType.class);
270 when(writeTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class)))
271 .thenReturn(nodeConfigFuture);
272 when(nodeConfigOptional.isPresent()).thenReturn(true);
273 OfOverlayNodeConfig overlayConfig = mock(OfOverlayNodeConfig.class);
274 when(nodeConfigOptional.get()).thenReturn(null);
276 boolean result = InventoryHelper.checkOfOverlayConfig(nodeIdString,
277 Collections.singletonList(abstractTunnelType), dataBroker);
281 @SuppressWarnings("unchecked")
283 public void testCheckOfOverlayConfig_TunnelNull() throws Exception {
284 AbstractTunnelType abstractTunnelType = mock(AbstractTunnelType.class);
286 when(writeTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class)))
287 .thenReturn(nodeConfigFuture);
288 when(nodeConfigOptional.isPresent()).thenReturn(true);
289 OfOverlayNodeConfig overlayConfig = mock(OfOverlayNodeConfig.class);
290 when(nodeConfigOptional.get()).thenReturn(overlayConfig);
292 when(overlayConfig.getTunnel()).thenReturn(null);
294 boolean result = InventoryHelper.checkOfOverlayConfig(nodeIdString,
295 Collections.singletonList(abstractTunnelType), dataBroker);
299 @SuppressWarnings("unchecked")
301 public void testAddOfOverlayExternalPort() throws Exception {
302 NodeId nodeId = mock(NodeId.class);
303 NodeConnectorId ncId = mock(NodeConnectorId.class);
304 ReadWriteTransaction transaction = mock(ReadWriteTransaction.class);
305 when(dataBroker.newWriteOnlyTransaction()).thenReturn(transaction);
306 CheckedFuture<Void, TransactionCommitFailedException> submitFuture = mock(CheckedFuture.class);
307 when(transaction.submit()).thenReturn(submitFuture);
309 InventoryHelper.addOfOverlayExternalPort(nodeId, ncId, dataBroker);
310 verify(submitFuture).checkedGet();
313 @SuppressWarnings("unchecked")
315 public void testGetOfOverlayConfig() throws Exception {
316 when(writeTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class)))
317 .thenReturn(nodeConfigFuture);
318 when(nodeConfigOptional.isPresent()).thenReturn(true);
319 OfOverlayNodeConfig overlayConfig = mock(OfOverlayNodeConfig.class);
320 when(nodeConfigOptional.get()).thenReturn(overlayConfig);
322 assertEquals(overlayConfig, InventoryHelper.getOfOverlayConfig(nodeIdString, dataBroker));
325 @SuppressWarnings({"unchecked", "rawtypes"})
327 public void testUpdateOfOverlayConfig() throws Exception {
328 IpAddress ip = mock(IpAddress.class);
329 String nodeConnectorIdString = "nodeConnectorIdString";
330 AbstractTunnelType tunnelType = mock(AbstractTunnelType.class);
332 when(writeTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class)))
333 .thenReturn(nodeConfigFuture);
334 when(nodeConfigOptional.isPresent()).thenReturn(true);
335 OfOverlayNodeConfig overlayConfig = mock(OfOverlayNodeConfig.class);
336 when(nodeConfigOptional.get()).thenReturn(overlayConfig);
338 Tunnel tunnel = mock(Tunnel.class);
339 when(overlayConfig.getTunnel()).thenReturn(Collections.singletonList(tunnel));
340 when(tunnelType.getTunnelType()).thenReturn((Class) TunnelTypeVxlan.class);
341 when(tunnel.getTunnelType()).thenReturn((Class) TunnelTypeVxlan.class);
342 when(tunnel.getKey()).thenReturn(mock(TunnelKey.class));
344 CheckedFuture<Void, TransactionCommitFailedException> submitFuture = mock(CheckedFuture.class);
345 when(writeTransaction.submit()).thenReturn(submitFuture);
347 InventoryHelper.updateOfOverlayConfig(ip, nodeIdString, nodeConnectorIdString, tunnelType, dataBroker);
348 verify(writeTransaction).submit();
352 public void testUpdateOfOverlayConfig_NullParameters() throws Exception {
353 IpAddress ip = mock(IpAddress.class);
354 String nodeConnectorIdString = "nodeConnectorIdString";
355 AbstractTunnelType tunnelType = mock(AbstractTunnelType.class);
357 InventoryHelper.updateOfOverlayConfig(null, nodeIdString, nodeConnectorIdString, tunnelType, dataBroker);
358 InventoryHelper.updateOfOverlayConfig(ip, null, nodeConnectorIdString, tunnelType, dataBroker);
359 InventoryHelper.updateOfOverlayConfig(ip, nodeIdString, null, tunnelType, dataBroker);
360 verify(writeTransaction, never()).submit();
363 @SuppressWarnings("unchecked")
365 public void testUpdateOfOverlayConfig_OfConfigNull() throws Exception {
366 IpAddress ip = mock(IpAddress.class);
367 String nodeConnectorIdString = "nodeConnectorIdString";
368 AbstractTunnelType tunnelType = mock(AbstractTunnelType.class);
370 when(writeTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class)))
371 .thenReturn(nodeConfigFuture);
372 when(nodeConfigOptional.isPresent()).thenReturn(false);
374 CheckedFuture<Void, TransactionCommitFailedException> submitFuture = mock(CheckedFuture.class);
375 when(writeTransaction.submit()).thenReturn(submitFuture);
377 InventoryHelper.updateOfOverlayConfig(ip, nodeIdString, nodeConnectorIdString, tunnelType, dataBroker);
378 verify(writeTransaction).submit();
381 @SuppressWarnings({"unchecked", "rawtypes"})
383 public void testRemoveTunnelsOfOverlayConfig_TunnelTypeEqualsFalse() throws Exception {
384 AbstractTunnelType tunnelType = mock(AbstractTunnelType.class);
386 ReadWriteTransaction transaction = mock(ReadWriteTransaction.class);
387 when(dataBroker.newReadWriteTransaction()).thenReturn(transaction);
388 CheckedFuture<Optional<OfOverlayNodeConfig>, ReadFailedException> checkedFuture = mock(CheckedFuture.class);
389 when(transaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class)))
390 .thenReturn(checkedFuture);
391 Optional<OfOverlayNodeConfig> optionalOverlayConfig = mock(Optional.class);
392 when(checkedFuture.checkedGet()).thenReturn(optionalOverlayConfig);
393 when(optionalOverlayConfig.isPresent()).thenReturn(true);
394 OfOverlayNodeConfig overlayConfig = mock(OfOverlayNodeConfig.class);
395 when(optionalOverlayConfig.get()).thenReturn(overlayConfig);
397 Tunnel overlayTunnel = mock(Tunnel.class);
398 when(overlayConfig.getTunnel()).thenReturn(Collections.singletonList(overlayTunnel));
399 when(tunnelType.getTunnelType()).thenReturn((Class) TunnelTypeVxlan.class);
400 when(overlayTunnel.getTunnelType()).thenReturn(null);
402 InventoryHelper.removeTunnelsOfOverlayConfig(nodeIdString, Collections.singletonList(tunnelType), dataBroker);
403 verify(writeTransaction, never()).submit();