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 com.google.common.base.Optional;
22 import com.google.common.util.concurrent.CheckedFuture;
24 import java.util.Collections;
26 import org.junit.Before;
27 import org.junit.Test;
28 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
29 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
30 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
31 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
32 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
33 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
34 import org.opendaylight.groupbasedpolicy.neutron.ovsdb.AbstractTunnelType;
35 import org.opendaylight.ovsdb.southbound.SouthboundConstants;
36 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayNodeConfig;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.nodes.node.Tunnel;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.nodes.node.TunnelKey;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.overlay.rev150105.TunnelTypeBase;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.overlay.rev150105.TunnelTypeVxlan;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.DatapathId;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation;
47 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
48 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
49 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
50 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
51 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
52 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
54 public class InventoryHelperTest {
56 private DataBroker dataBroker;
57 private ReadOnlyTransaction readTransaction;
58 private ReadWriteTransaction writeTransaction;
60 private CheckedFuture<Optional<OvsdbTerminationPointAugmentation>, ReadFailedException> terminationPointFuture;
61 private CheckedFuture<Optional<OvsdbBridgeAugmentation>, ReadFailedException> bridgeFuture;
62 private CheckedFuture<Optional<OfOverlayNodeConfig>, ReadFailedException> nodeConfigFuture;
64 private Optional<OvsdbTerminationPointAugmentation> terminationPointOptional;
65 private Optional<OvsdbBridgeAugmentation> bridgeOptional;
66 private Optional<OfOverlayNodeConfig> nodeConfigOptional;
68 private InstanceIdentifier<OvsdbTerminationPointAugmentation> ovsdbTpIid;
69 private String nodeIdString = "nodeIdString";
71 @SuppressWarnings("unchecked")
73 public void init() throws Exception {
74 dataBroker = mock(DataBroker.class);
76 terminationPointFuture = mock(CheckedFuture.class);
77 terminationPointOptional = mock(Optional.class);
78 when(terminationPointFuture.checkedGet()).thenReturn(terminationPointOptional);
79 bridgeFuture = mock(CheckedFuture.class);
80 bridgeOptional = mock(Optional.class);
81 when(bridgeFuture.checkedGet()).thenReturn(bridgeOptional);
82 nodeConfigFuture = mock(CheckedFuture.class);
83 nodeConfigOptional = mock(Optional.class);
84 when(nodeConfigFuture.checkedGet()).thenReturn(nodeConfigOptional);
86 readTransaction = mock(ReadOnlyTransaction.class);
87 writeTransaction = mock(ReadWriteTransaction.class);
88 when(dataBroker.newReadOnlyTransaction()).thenReturn(readTransaction);
89 when(dataBroker.newReadWriteTransaction()).thenReturn(writeTransaction);
90 ovsdbTpIid = InstanceIdentifier.create(NetworkTopology.class)
91 .child(Topology.class, new TopologyKey(SouthboundConstants.OVSDB_TOPOLOGY_ID))
93 .child(TerminationPoint.class)
94 .augmentation(OvsdbTerminationPointAugmentation.class);
98 public void testGetLongFromDpid() {
99 String dpid = "FF:FF:FF:FF:FF:FF:FF:FF";
100 Long result = InventoryHelper.getLongFromDpid(dpid);
101 assertEquals(Long.valueOf(281474976710655L), result);
105 public void testGetInventoryNodeIdString() throws Exception {
106 OvsdbBridgeAugmentation ovsdbBridge = mock(OvsdbBridgeAugmentation.class);
108 DatapathId datapathId = mock(DatapathId.class);
109 when(ovsdbBridge.getDatapathId()).thenReturn(datapathId);
110 when(datapathId.getValue()).thenReturn("FF:FF:FF:FF:FF:FF:FF:FF");
112 String result = InventoryHelper.getInventoryNodeIdString(ovsdbBridge, ovsdbTpIid, dataBroker);
113 assertEquals("openflow:281474976710655", result);
116 @SuppressWarnings("unchecked")
118 public void testGetInventoryNodeIdString_DpidNull() throws Exception {
119 OvsdbBridgeAugmentation ovsdbBridge = mock(OvsdbBridgeAugmentation.class);
121 when(readTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class)))
122 .thenReturn(bridgeFuture);
123 when(bridgeOptional.isPresent()).thenReturn(true);
124 OvsdbBridgeAugmentation bridge = mock(OvsdbBridgeAugmentation.class);
125 when(bridgeOptional.get()).thenReturn(bridge);
126 when(bridge.getDatapathId()).thenReturn(null);
128 String result = InventoryHelper.getInventoryNodeIdString(ovsdbBridge, ovsdbTpIid, dataBroker);
133 public void testGetInventoryNodeConnectorIdString() {
134 String inventoryNodeId = "openflow:inventoryNodeId";
135 OvsdbTerminationPointAugmentation ovsdbTp = mock(OvsdbTerminationPointAugmentation.class);
136 when(ovsdbTp.getOfport()).thenReturn(65534L);
139 InventoryHelper.getInventoryNodeConnectorIdString(inventoryNodeId, ovsdbTp, ovsdbTpIid, dataBroker);
140 assertEquals("openflow:inventoryNodeId:65534", result);
144 public void testGetInventoryNodeConnectorIdString_IncorrectFormat() {
145 String inventoryNodeId = "inventoryNodeId";
146 OvsdbTerminationPointAugmentation ovsdbTp = mock(OvsdbTerminationPointAugmentation.class);
147 when(ovsdbTp.getOfport()).thenReturn(65534L);
150 InventoryHelper.getInventoryNodeConnectorIdString(inventoryNodeId, ovsdbTp, ovsdbTpIid, dataBroker);
155 public void testGetInventoryNodeConnectorIdString_OfportNull() throws Exception {
156 String inventoryNodeId = "openflow:inventoryNodeId";
157 OvsdbTerminationPointAugmentation ovsdbTp = mock(OvsdbTerminationPointAugmentation.class);
158 when(ovsdbTp.getOfport()).thenReturn(65535L);
161 InventoryHelper.getInventoryNodeConnectorIdString(inventoryNodeId, ovsdbTp, ovsdbTpIid, dataBroker);
165 @SuppressWarnings("unchecked")
167 public void testGetInventoryNodeConnectorIdString_OfportOver() throws Exception {
168 String inventoryNodeId = "openflow:inventoryNodeId";
169 OvsdbTerminationPointAugmentation ovsdbTp = mock(OvsdbTerminationPointAugmentation.class);
170 when(ovsdbTp.getOfport()).thenReturn(null);
172 when(readTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class)))
173 .thenReturn(terminationPointFuture);
174 when(terminationPointOptional.isPresent()).thenReturn(true);
175 OvsdbTerminationPointAugmentation readOvsdbTp = mock(OvsdbTerminationPointAugmentation.class);
176 when(terminationPointOptional.get()).thenReturn(readOvsdbTp);
178 when(readOvsdbTp.getOfport()).thenReturn(65534L);
181 InventoryHelper.getInventoryNodeConnectorIdString(inventoryNodeId, ovsdbTp, ovsdbTpIid, dataBroker);
182 assertEquals("openflow:inventoryNodeId:65534", result);
185 @SuppressWarnings("unchecked")
187 public void testGetInventoryNodeConnectorIdString_OfportNull_AugmentationOfportNull() throws Exception {
188 String inventoryNodeId = "openflow:inventoryNodeId";
189 OvsdbTerminationPointAugmentation ovsdbTp = mock(OvsdbTerminationPointAugmentation.class);
190 when(ovsdbTp.getOfport()).thenReturn(null);
192 when(readTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class)))
193 .thenReturn(terminationPointFuture);
194 when(terminationPointOptional.isPresent()).thenReturn(true);
195 OvsdbTerminationPointAugmentation readOvsdbTp = mock(OvsdbTerminationPointAugmentation.class);
196 when(terminationPointOptional.get()).thenReturn(readOvsdbTp);
197 when(readOvsdbTp.getOfport()).thenReturn(null);
200 InventoryHelper.getInventoryNodeConnectorIdString(inventoryNodeId, ovsdbTp, ovsdbTpIid, dataBroker);
204 @SuppressWarnings("unchecked")
206 public void testGetInventoryNodeConnectorIdString_OfportNull_AugmentationOfportOver() throws Exception {
207 String inventoryNodeId = "openflow:inventoryNodeId";
208 OvsdbTerminationPointAugmentation ovsdbTp = mock(OvsdbTerminationPointAugmentation.class);
209 when(ovsdbTp.getOfport()).thenReturn(null);
211 when(readTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class)))
212 .thenReturn(terminationPointFuture);
213 OvsdbTerminationPointAugmentation readOvsdbTp = mock(OvsdbTerminationPointAugmentation.class);
214 when(terminationPointOptional.get()).thenReturn(readOvsdbTp);
215 when(readOvsdbTp.getOfport()).thenReturn(65535L);
218 InventoryHelper.getInventoryNodeConnectorIdString(inventoryNodeId, ovsdbTp, ovsdbTpIid, dataBroker);
222 @SuppressWarnings({"unchecked", "rawtypes"})
224 public void testCheckOfOverlayConfig() throws Exception {
225 AbstractTunnelType abstractTunnelType = mock(AbstractTunnelType.class);
227 when(writeTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class)))
228 .thenReturn(nodeConfigFuture);
229 when(nodeConfigOptional.isPresent()).thenReturn(true);
230 OfOverlayNodeConfig overlayConfig = mock(OfOverlayNodeConfig.class);
231 when(nodeConfigOptional.get()).thenReturn(overlayConfig);
233 Tunnel tunnel = mock(Tunnel.class);
234 when(overlayConfig.getTunnel()).thenReturn(Collections.singletonList(tunnel));
236 when(abstractTunnelType.getTunnelType()).thenReturn((Class) TunnelTypeVxlan.class);
237 when(tunnel.getTunnelType()).thenReturn((Class) TunnelTypeVxlan.class);
239 boolean result = InventoryHelper.checkOfOverlayConfig(nodeIdString,
240 Collections.singletonList(abstractTunnelType), dataBroker);
244 @SuppressWarnings({"unchecked", "rawtypes"})
246 public void testCheckOfOverlayConfig_TunnelTypeEqualsFalse() throws Exception {
247 AbstractTunnelType abstractTunnelType = mock(AbstractTunnelType.class);
249 when(writeTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class)))
250 .thenReturn(nodeConfigFuture);
251 when(nodeConfigOptional.isPresent()).thenReturn(true);
252 OfOverlayNodeConfig overlayConfig = mock(OfOverlayNodeConfig.class);
253 when(nodeConfigOptional.get()).thenReturn(overlayConfig);
255 Tunnel tunnel = mock(Tunnel.class);
256 when(overlayConfig.getTunnel()).thenReturn(Collections.singletonList(tunnel));
258 when(abstractTunnelType.getTunnelType()).thenReturn((Class) TunnelTypeVxlan.class);
259 when(tunnel.getTunnelType()).thenReturn((Class) TunnelTypeBase.class);
261 boolean result = InventoryHelper.checkOfOverlayConfig(nodeIdString,
262 Collections.singletonList(abstractTunnelType), dataBroker);
266 @SuppressWarnings({"unchecked", "unused"})
268 public void testCheckOfOverlayConfig_ConfigNull() throws Exception {
269 AbstractTunnelType abstractTunnelType = mock(AbstractTunnelType.class);
271 when(writeTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class)))
272 .thenReturn(nodeConfigFuture);
273 when(nodeConfigOptional.isPresent()).thenReturn(true);
274 OfOverlayNodeConfig overlayConfig = mock(OfOverlayNodeConfig.class);
275 when(nodeConfigOptional.get()).thenReturn(null);
277 boolean result = InventoryHelper.checkOfOverlayConfig(nodeIdString,
278 Collections.singletonList(abstractTunnelType), dataBroker);
282 @SuppressWarnings("unchecked")
284 public void testCheckOfOverlayConfig_TunnelNull() throws Exception {
285 AbstractTunnelType abstractTunnelType = mock(AbstractTunnelType.class);
287 when(writeTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class)))
288 .thenReturn(nodeConfigFuture);
289 when(nodeConfigOptional.isPresent()).thenReturn(true);
290 OfOverlayNodeConfig overlayConfig = mock(OfOverlayNodeConfig.class);
291 when(nodeConfigOptional.get()).thenReturn(overlayConfig);
293 when(overlayConfig.getTunnel()).thenReturn(null);
295 boolean result = InventoryHelper.checkOfOverlayConfig(nodeIdString,
296 Collections.singletonList(abstractTunnelType), dataBroker);
300 @SuppressWarnings("unchecked")
302 public void testAddOfOverlayExternalPort() throws Exception {
303 NodeId nodeId = mock(NodeId.class);
304 NodeConnectorId ncId = mock(NodeConnectorId.class);
305 ReadWriteTransaction transaction = mock(ReadWriteTransaction.class);
306 when(dataBroker.newWriteOnlyTransaction()).thenReturn(transaction);
307 CheckedFuture<Void, TransactionCommitFailedException> submitFuture = mock(CheckedFuture.class);
308 when(transaction.submit()).thenReturn(submitFuture);
310 InventoryHelper.addOfOverlayExternalPort(nodeId, ncId, dataBroker);
311 verify(submitFuture).checkedGet();
314 @SuppressWarnings("unchecked")
316 public void testGetOfOverlayConfig() throws Exception {
317 when(writeTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class)))
318 .thenReturn(nodeConfigFuture);
319 when(nodeConfigOptional.isPresent()).thenReturn(true);
320 OfOverlayNodeConfig overlayConfig = mock(OfOverlayNodeConfig.class);
321 when(nodeConfigOptional.get()).thenReturn(overlayConfig);
323 assertEquals(overlayConfig, InventoryHelper.getOfOverlayConfig(nodeIdString, dataBroker));
326 @SuppressWarnings({"unchecked", "rawtypes"})
328 public void testUpdateOfOverlayConfig() throws Exception {
329 AbstractTunnelType tunnelType = mock(AbstractTunnelType.class);
331 when(writeTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class)))
332 .thenReturn(nodeConfigFuture);
333 when(nodeConfigOptional.isPresent()).thenReturn(true);
334 OfOverlayNodeConfig overlayConfig = mock(OfOverlayNodeConfig.class);
335 when(nodeConfigOptional.get()).thenReturn(overlayConfig);
337 Tunnel tunnel = mock(Tunnel.class);
338 when(overlayConfig.getTunnel()).thenReturn(Collections.singletonList(tunnel));
339 when(tunnelType.getTunnelType()).thenReturn((Class) TunnelTypeVxlan.class);
340 when(tunnel.getTunnelType()).thenReturn((Class) TunnelTypeVxlan.class);
341 when(tunnel.getKey()).thenReturn(mock(TunnelKey.class));
343 CheckedFuture<Void, TransactionCommitFailedException> submitFuture = mock(CheckedFuture.class);
344 when(writeTransaction.submit()).thenReturn(submitFuture);
346 IpAddress ip = mock(IpAddress.class);
347 String nodeConnectorIdString = "nodeConnectorIdString";
348 InventoryHelper.updateOfOverlayConfig(ip, nodeIdString, nodeConnectorIdString, tunnelType, dataBroker);
349 verify(writeTransaction).submit();
353 public void testUpdateOfOverlayConfig_NullParameters() throws Exception {
354 IpAddress ip = mock(IpAddress.class);
355 String nodeConnectorIdString = "nodeConnectorIdString";
356 AbstractTunnelType tunnelType = mock(AbstractTunnelType.class);
358 InventoryHelper.updateOfOverlayConfig(null, nodeIdString, nodeConnectorIdString, tunnelType, dataBroker);
359 InventoryHelper.updateOfOverlayConfig(ip, null, nodeConnectorIdString, tunnelType, dataBroker);
360 InventoryHelper.updateOfOverlayConfig(ip, nodeIdString, null, tunnelType, dataBroker);
361 verify(writeTransaction, never()).submit();
364 @SuppressWarnings("unchecked")
366 public void testUpdateOfOverlayConfig_OfConfigNull() throws Exception {
367 when(writeTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class)))
368 .thenReturn(nodeConfigFuture);
369 when(nodeConfigOptional.isPresent()).thenReturn(false);
371 CheckedFuture<Void, TransactionCommitFailedException> submitFuture = mock(CheckedFuture.class);
372 when(writeTransaction.submit()).thenReturn(submitFuture);
374 IpAddress ip = mock(IpAddress.class);
375 String nodeConnectorIdString = "nodeConnectorIdString";
376 AbstractTunnelType tunnelType = mock(AbstractTunnelType.class);
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();