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.mockito.Matchers.any;
12 import static org.mockito.Mockito.mock;
13 import static org.mockito.Mockito.never;
14 import static org.mockito.Mockito.verify;
15 import static org.mockito.Mockito.when;
17 import java.util.Arrays;
19 import org.junit.Assert;
20 import org.junit.Before;
21 import org.junit.Test;
22 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
23 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
24 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
25 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
26 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
27 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
28 import org.opendaylight.groupbasedpolicy.neutron.ovsdb.AbstractTunnelType;
29 import org.opendaylight.ovsdb.southbound.SouthboundConstants;
30 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayNodeConfig;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.nodes.node.Tunnel;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.nodes.node.TunnelKey;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.overlay.rev150105.TunnelTypeBase;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.overlay.rev150105.TunnelTypeVxlan;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.DatapathId;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation;
41 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
42 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
43 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
44 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
45 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
46 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
48 import com.google.common.base.Optional;
49 import com.google.common.util.concurrent.CheckedFuture;
51 public class InventoryHelperTest {
53 private DataBroker dataBroker;
54 private ReadOnlyTransaction readTransaction;
55 private ReadWriteTransaction writeTransaction;
57 CheckedFuture<Optional<OvsdbTerminationPointAugmentation>, ReadFailedException> terminationPointFuture;
58 CheckedFuture<Optional<OvsdbBridgeAugmentation>, ReadFailedException> bridgeFuture;
59 CheckedFuture<Optional<OfOverlayNodeConfig>, ReadFailedException> nodeConfigFuture;
61 Optional<OvsdbTerminationPointAugmentation> terminationPointOptional;
62 Optional<OvsdbBridgeAugmentation> bridgeOptional;
63 Optional<OfOverlayNodeConfig> nodeConfigOptional;
65 private InstanceIdentifier<OvsdbTerminationPointAugmentation> ovsdbTpIid;
66 private String dpid = "FF:FF:FF:FF:FF:FF:FF:FF";
67 private String nodeIdString = "nodeIdString";
69 @SuppressWarnings("unchecked")
71 public void initialise() throws Exception {
72 dataBroker = mock(DataBroker.class);
74 terminationPointFuture = mock(CheckedFuture.class);
75 terminationPointOptional = mock(Optional.class);
76 when(terminationPointFuture.checkedGet()).thenReturn(terminationPointOptional);
77 bridgeFuture = mock(CheckedFuture.class);
78 bridgeOptional = mock(Optional.class);
79 when(bridgeFuture.checkedGet()).thenReturn(bridgeOptional);
80 nodeConfigFuture = mock(CheckedFuture.class);
81 nodeConfigOptional = mock(Optional.class);
82 when(nodeConfigFuture.checkedGet()).thenReturn(nodeConfigOptional);
84 readTransaction = mock(ReadOnlyTransaction.class);
85 writeTransaction = mock(ReadWriteTransaction.class);
86 when(dataBroker.newReadOnlyTransaction()).thenReturn(readTransaction);
87 when(dataBroker.newReadWriteTransaction()).thenReturn(writeTransaction);
88 ovsdbTpIid = InstanceIdentifier.create(NetworkTopology.class)
89 .child(Topology.class, new TopologyKey(SouthboundConstants.OVSDB_TOPOLOGY_ID))
91 .child(TerminationPoint.class)
92 .augmentation(OvsdbTerminationPointAugmentation.class);
96 public void getLongFromDpidTest() {
97 Long result = InventoryHelper.getLongFromDpid(dpid);
98 Assert.assertEquals(Long.valueOf(281474976710655L), result);
102 public void getInventoryNodeIdStringTest() throws Exception {
103 OvsdbBridgeAugmentation ovsdbBridge = mock(OvsdbBridgeAugmentation.class);
105 DatapathId datapathId = mock(DatapathId.class);
106 when(ovsdbBridge.getDatapathId()).thenReturn(datapathId);
107 when(datapathId.getValue()).thenReturn("FF:FF:FF:FF:FF:FF:FF:FF");
109 String result = InventoryHelper.getInventoryNodeIdString(ovsdbBridge, ovsdbTpIid, dataBroker);
110 Assert.assertEquals("openflow:281474976710655", result);
113 @SuppressWarnings("unchecked")
115 public void getInventoryNodeIdStringTestDpidNull() throws Exception {
116 OvsdbBridgeAugmentation ovsdbBridge = mock(OvsdbBridgeAugmentation.class);
118 when(readTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class))).thenReturn(
120 when(bridgeOptional.isPresent()).thenReturn(true);
121 OvsdbBridgeAugmentation bridge = mock(OvsdbBridgeAugmentation.class);
122 when(bridgeOptional.get()).thenReturn(bridge);
123 when(bridge.getDatapathId()).thenReturn(null);
125 String result = InventoryHelper.getInventoryNodeIdString(ovsdbBridge, ovsdbTpIid, dataBroker);
126 Assert.assertNull(result);
130 public void getInventoryNodeConnectorIdStringTest() {
131 String inventoryNodeId = "openflow:inventoryNodeId";
132 OvsdbTerminationPointAugmentation ovsdbTp = mock(OvsdbTerminationPointAugmentation.class);
133 when(ovsdbTp.getOfport()).thenReturn(65534L);
135 String result = InventoryHelper.getInventoryNodeConnectorIdString(inventoryNodeId, ovsdbTp, ovsdbTpIid,
137 Assert.assertEquals("openflow:inventoryNodeId:65534", result);
141 public void getInventoryNodeConnectorIdStringTestIncorrectFormat() {
142 String inventoryNodeId = "inventoryNodeId";
143 OvsdbTerminationPointAugmentation ovsdbTp = mock(OvsdbTerminationPointAugmentation.class);
144 when(ovsdbTp.getOfport()).thenReturn(65534L);
146 String result = InventoryHelper.getInventoryNodeConnectorIdString(inventoryNodeId, ovsdbTp, ovsdbTpIid,
148 Assert.assertNull(result);
152 public void getInventoryNodeConnectorIdStringTestOfportNull() throws Exception {
153 String inventoryNodeId = "openflow:inventoryNodeId";
154 OvsdbTerminationPointAugmentation ovsdbTp = mock(OvsdbTerminationPointAugmentation.class);
155 when(ovsdbTp.getOfport()).thenReturn(65535L);
157 String result = InventoryHelper.getInventoryNodeConnectorIdString(inventoryNodeId, ovsdbTp, ovsdbTpIid,
159 Assert.assertNull(result);
162 @SuppressWarnings("unchecked")
164 public void getInventoryNodeConnectorIdStringTestOfportOver() throws Exception {
165 String inventoryNodeId = "openflow:inventoryNodeId";
166 OvsdbTerminationPointAugmentation ovsdbTp = mock(OvsdbTerminationPointAugmentation.class);
167 when(ovsdbTp.getOfport()).thenReturn(null);
169 when(readTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class))).thenReturn(
170 terminationPointFuture);
171 when(terminationPointOptional.isPresent()).thenReturn(true);
172 OvsdbTerminationPointAugmentation readOvsdbTp = mock(OvsdbTerminationPointAugmentation.class);
173 when(terminationPointOptional.get()).thenReturn(readOvsdbTp);
175 when(readOvsdbTp.getOfport()).thenReturn(65534L);
177 String result = InventoryHelper.getInventoryNodeConnectorIdString(inventoryNodeId, ovsdbTp, ovsdbTpIid,
179 Assert.assertEquals("openflow:inventoryNodeId:65534", result);
182 @SuppressWarnings("unchecked")
184 public void getInventoryNodeConnectorIdStringTestOfportNullAugmentationOfportNull() throws Exception {
185 String inventoryNodeId = "openflow:inventoryNodeId";
186 OvsdbTerminationPointAugmentation ovsdbTp = mock(OvsdbTerminationPointAugmentation.class);
187 when(ovsdbTp.getOfport()).thenReturn(null);
189 when(readTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class))).thenReturn(
190 terminationPointFuture);
191 when(terminationPointOptional.isPresent()).thenReturn(true);
192 OvsdbTerminationPointAugmentation readOvsdbTp = mock(OvsdbTerminationPointAugmentation.class);
193 when(terminationPointOptional.get()).thenReturn(readOvsdbTp);
194 when(readOvsdbTp.getOfport()).thenReturn(null);
196 String result = InventoryHelper.getInventoryNodeConnectorIdString(inventoryNodeId, ovsdbTp, ovsdbTpIid,
198 Assert.assertNull(result);
201 @SuppressWarnings("unchecked")
203 public void getInventoryNodeConnectorIdStringTestOfportNullAugmentationOfportOver() throws Exception {
204 String inventoryNodeId = "openflow:inventoryNodeId";
205 OvsdbTerminationPointAugmentation ovsdbTp = mock(OvsdbTerminationPointAugmentation.class);
206 when(ovsdbTp.getOfport()).thenReturn(null);
208 when(readTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class))).thenReturn(
209 terminationPointFuture);
210 OvsdbTerminationPointAugmentation readOvsdbTp = mock(OvsdbTerminationPointAugmentation.class);
211 when(terminationPointOptional.get()).thenReturn(readOvsdbTp);
212 when(readOvsdbTp.getOfport()).thenReturn(65535L);
214 String result = InventoryHelper.getInventoryNodeConnectorIdString(inventoryNodeId, ovsdbTp, ovsdbTpIid,
216 Assert.assertNull(result);
219 @SuppressWarnings({"unchecked", "rawtypes"})
221 public void checkOfOverlayConfigTest() throws Exception {
222 AbstractTunnelType abstractTunnelType = mock(AbstractTunnelType.class);
224 when(writeTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class))).thenReturn(
226 when(nodeConfigOptional.isPresent()).thenReturn(true);
227 OfOverlayNodeConfig overlayConfig = mock(OfOverlayNodeConfig.class);
228 when(nodeConfigOptional.get()).thenReturn(overlayConfig);
230 Tunnel tunnel = mock(Tunnel.class);
231 when(overlayConfig.getTunnel()).thenReturn(Arrays.asList(tunnel));
233 when(abstractTunnelType.getTunnelType()).thenReturn((Class) TunnelTypeVxlan.class);
234 when(tunnel.getTunnelType()).thenReturn((Class) TunnelTypeVxlan.class);
236 boolean result = InventoryHelper.checkOfOverlayConfig(nodeIdString, Arrays.asList(abstractTunnelType),
238 Assert.assertTrue(result);
241 @SuppressWarnings({"unchecked", "rawtypes"})
243 public void checkOfOverlayConfigTestTunnelTypeEqualsFalse() throws Exception {
244 AbstractTunnelType abstractTunnelType = mock(AbstractTunnelType.class);
246 when(writeTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class))).thenReturn(
248 when(nodeConfigOptional.isPresent()).thenReturn(true);
249 OfOverlayNodeConfig overlayConfig = mock(OfOverlayNodeConfig.class);
250 when(nodeConfigOptional.get()).thenReturn(overlayConfig);
252 Tunnel tunnel = mock(Tunnel.class);
253 when(overlayConfig.getTunnel()).thenReturn(Arrays.asList(tunnel));
255 when(abstractTunnelType.getTunnelType()).thenReturn((Class) TunnelTypeVxlan.class);
256 when(tunnel.getTunnelType()).thenReturn((Class) TunnelTypeBase.class);
258 boolean result = InventoryHelper.checkOfOverlayConfig(nodeIdString, Arrays.asList(abstractTunnelType),
260 Assert.assertFalse(result);
263 @SuppressWarnings({"unchecked", "unused"})
265 public void checkOfOverlayConfigTestConfigNull() throws Exception {
266 AbstractTunnelType abstractTunnelType = mock(AbstractTunnelType.class);
268 when(writeTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class))).thenReturn(
270 when(nodeConfigOptional.isPresent()).thenReturn(true);
271 OfOverlayNodeConfig overlayConfig = mock(OfOverlayNodeConfig.class);
272 when(nodeConfigOptional.get()).thenReturn(null);
274 boolean result = InventoryHelper.checkOfOverlayConfig(nodeIdString, Arrays.asList(abstractTunnelType),
276 Assert.assertFalse(result);
279 @SuppressWarnings("unchecked")
281 public void checkOfOverlayConfigTestTunnelNull() throws Exception {
282 AbstractTunnelType abstractTunnelType = mock(AbstractTunnelType.class);
284 when(writeTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class))).thenReturn(
286 when(nodeConfigOptional.isPresent()).thenReturn(true);
287 OfOverlayNodeConfig overlayConfig = mock(OfOverlayNodeConfig.class);
288 when(nodeConfigOptional.get()).thenReturn(overlayConfig);
290 when(overlayConfig.getTunnel()).thenReturn(null);
292 boolean result = InventoryHelper.checkOfOverlayConfig(nodeIdString, Arrays.asList(abstractTunnelType),
294 Assert.assertFalse(result);
297 @SuppressWarnings("unchecked")
299 public void addOfOverlayExternalPortTest() throws Exception {
300 NodeId nodeId = mock(NodeId.class);
301 NodeConnectorId ncId = mock(NodeConnectorId.class);
302 ReadWriteTransaction transaction = mock(ReadWriteTransaction.class);
303 when(dataBroker.newWriteOnlyTransaction()).thenReturn(transaction);
304 CheckedFuture<Void, TransactionCommitFailedException> submitFuture = mock(CheckedFuture.class);
305 when(transaction.submit()).thenReturn(submitFuture);
307 InventoryHelper.addOfOverlayExternalPort(nodeId, ncId, dataBroker);
308 verify(submitFuture).checkedGet();
311 @SuppressWarnings("unchecked")
313 public void getOfOverlayConfigTest() throws Exception {
314 when(writeTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class))).thenReturn(
316 when(nodeConfigOptional.isPresent()).thenReturn(true);
317 OfOverlayNodeConfig overlayConfig = mock(OfOverlayNodeConfig.class);
318 when(nodeConfigOptional.get()).thenReturn(overlayConfig);
320 Assert.assertEquals(overlayConfig, InventoryHelper.getOfOverlayConfig(nodeIdString, dataBroker));
323 @SuppressWarnings({"unchecked", "rawtypes"})
325 public void updateOfOverlayConfigTest() throws Exception {
326 IpAddress ip = mock(IpAddress.class);
327 String nodeConnectorIdString = "nodeConnectorIdString";
328 AbstractTunnelType tunnelType = mock(AbstractTunnelType.class);
330 when(writeTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class))).thenReturn(
332 when(nodeConfigOptional.isPresent()).thenReturn(true);
333 OfOverlayNodeConfig overlayConfig = mock(OfOverlayNodeConfig.class);
334 when(nodeConfigOptional.get()).thenReturn(overlayConfig);
336 Tunnel tunnel = mock(Tunnel.class);
337 when(overlayConfig.getTunnel()).thenReturn(Arrays.asList(tunnel));
338 when(tunnelType.getTunnelType()).thenReturn((Class) TunnelTypeVxlan.class);
339 when(tunnel.getTunnelType()).thenReturn((Class) TunnelTypeVxlan.class);
340 when(tunnel.getKey()).thenReturn(mock(TunnelKey.class));
342 CheckedFuture<Void, TransactionCommitFailedException> submitFuture = mock(CheckedFuture.class);
343 when(writeTransaction.submit()).thenReturn(submitFuture);
345 InventoryHelper.updateOfOverlayConfig(ip, nodeIdString, nodeConnectorIdString, tunnelType, dataBroker);
346 verify(writeTransaction).submit();
350 public void updateOfOverlayConfigTestNullParameters() throws Exception {
351 IpAddress ip = mock(IpAddress.class);
352 String nodeConnectorIdString = "nodeConnectorIdString";
353 AbstractTunnelType tunnelType = mock(AbstractTunnelType.class);
355 InventoryHelper.updateOfOverlayConfig(null, nodeIdString, nodeConnectorIdString, tunnelType, dataBroker);
356 InventoryHelper.updateOfOverlayConfig(ip, null, nodeConnectorIdString, tunnelType, dataBroker);
357 InventoryHelper.updateOfOverlayConfig(ip, nodeIdString, null, tunnelType, dataBroker);
358 verify(writeTransaction, never()).submit();
361 @SuppressWarnings("unchecked")
363 public void updateOfOverlayConfigTestOfConfigNull() throws Exception {
364 IpAddress ip = mock(IpAddress.class);
365 String nodeConnectorIdString = "nodeConnectorIdString";
366 AbstractTunnelType tunnelType = mock(AbstractTunnelType.class);
368 when(writeTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class))).thenReturn(
370 when(nodeConfigOptional.isPresent()).thenReturn(false);
372 CheckedFuture<Void, TransactionCommitFailedException> submitFuture = mock(CheckedFuture.class);
373 when(writeTransaction.submit()).thenReturn(submitFuture);
375 InventoryHelper.updateOfOverlayConfig(ip, nodeIdString, nodeConnectorIdString, tunnelType, dataBroker);
376 verify(writeTransaction).submit();
379 @SuppressWarnings({"unchecked", "rawtypes"})
381 public void removeTunnelsOfOverlayConfigTestTunnelTypeEqualsFalse() throws Exception {
382 AbstractTunnelType tunnelType = mock(AbstractTunnelType.class);
384 ReadWriteTransaction transaction = mock(ReadWriteTransaction.class);
385 when(dataBroker.newReadWriteTransaction()).thenReturn(transaction);
386 CheckedFuture<Optional<OfOverlayNodeConfig>, ReadFailedException> checkedFuture = mock(CheckedFuture.class);
387 when(transaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class))).thenReturn(checkedFuture);
388 Optional<OfOverlayNodeConfig> optionalOverlayConfig = mock(Optional.class);
389 when(checkedFuture.checkedGet()).thenReturn(optionalOverlayConfig);
390 when(optionalOverlayConfig.isPresent()).thenReturn(true);
391 OfOverlayNodeConfig overlayConfig = mock(OfOverlayNodeConfig.class);
392 when(optionalOverlayConfig.get()).thenReturn(overlayConfig);
394 Tunnel overlayTunnel = mock(Tunnel.class);
395 when(overlayConfig.getTunnel()).thenReturn(Arrays.<Tunnel>asList(overlayTunnel));
396 when(tunnelType.getTunnelType()).thenReturn((Class) TunnelTypeVxlan.class);
397 when(overlayTunnel.getTunnelType()).thenReturn(null);
399 InventoryHelper.removeTunnelsOfOverlayConfig(nodeIdString, Arrays.asList(tunnelType), dataBroker);
400 verify(writeTransaction,never()).submit();