98695d6df169fe659e2109000dc01d82ce6824a5
[groupbasedpolicy.git] / neutron-ovsdb / src / test / java / org / opendaylight / groupbasedpolicy / neutron / ovsdb / util / InventoryHelperTest.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
3  *
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
7  */
8
9 package org.opendaylight.groupbasedpolicy.neutron.ovsdb.util;
10
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;
20
21 import java.util.Collections;
22
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.rev130715.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;
52
53 public class InventoryHelperTest {
54
55     private DataBroker dataBroker;
56     private ReadOnlyTransaction readTransaction;
57     private ReadWriteTransaction writeTransaction;
58
59     private CheckedFuture<Optional<OvsdbTerminationPointAugmentation>, ReadFailedException> terminationPointFuture;
60     private CheckedFuture<Optional<OvsdbBridgeAugmentation>, ReadFailedException> bridgeFuture;
61     private CheckedFuture<Optional<OfOverlayNodeConfig>, ReadFailedException> nodeConfigFuture;
62
63     private Optional<OvsdbTerminationPointAugmentation> terminationPointOptional;
64     private Optional<OvsdbBridgeAugmentation> bridgeOptional;
65     private Optional<OfOverlayNodeConfig> nodeConfigOptional;
66
67     private InstanceIdentifier<OvsdbTerminationPointAugmentation> ovsdbTpIid;
68     private String nodeIdString = "nodeIdString";
69
70     @SuppressWarnings("unchecked")
71     @Before
72     public void init() throws Exception {
73         dataBroker = mock(DataBroker.class);
74
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);
84
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))
91             .child(Node.class)
92             .child(TerminationPoint.class)
93             .augmentation(OvsdbTerminationPointAugmentation.class);
94     }
95
96     @Test
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);
101     }
102
103     @Test
104     public void testGetInventoryNodeIdString() throws Exception {
105         OvsdbBridgeAugmentation ovsdbBridge = mock(OvsdbBridgeAugmentation.class);
106
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");
110
111         String result = InventoryHelper.getInventoryNodeIdString(ovsdbBridge, ovsdbTpIid, dataBroker);
112         assertEquals("openflow:281474976710655", result);
113     }
114
115     @SuppressWarnings("unchecked")
116     @Test
117     public void testGetInventoryNodeIdString_DpidNull() throws Exception {
118         OvsdbBridgeAugmentation ovsdbBridge = mock(OvsdbBridgeAugmentation.class);
119
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);
126
127         String result = InventoryHelper.getInventoryNodeIdString(ovsdbBridge, ovsdbTpIid, dataBroker);
128         assertNull(result);
129     }
130
131     @Test
132     public void testGetInventoryNodeConnectorIdString() {
133         String inventoryNodeId = "openflow:inventoryNodeId";
134         OvsdbTerminationPointAugmentation ovsdbTp = mock(OvsdbTerminationPointAugmentation.class);
135         when(ovsdbTp.getOfport()).thenReturn(65534L);
136
137         String result =
138                 InventoryHelper.getInventoryNodeConnectorIdString(inventoryNodeId, ovsdbTp, ovsdbTpIid, dataBroker);
139         assertEquals("openflow:inventoryNodeId:65534", result);
140     }
141
142     @Test
143     public void testGetInventoryNodeConnectorIdString_IncorrectFormat() {
144         String inventoryNodeId = "inventoryNodeId";
145         OvsdbTerminationPointAugmentation ovsdbTp = mock(OvsdbTerminationPointAugmentation.class);
146         when(ovsdbTp.getOfport()).thenReturn(65534L);
147
148         String result =
149                 InventoryHelper.getInventoryNodeConnectorIdString(inventoryNodeId, ovsdbTp, ovsdbTpIid, dataBroker);
150         assertNull(result);
151     }
152
153     @Test
154     public void testGetInventoryNodeConnectorIdString_OfportNull() throws Exception {
155         String inventoryNodeId = "openflow:inventoryNodeId";
156         OvsdbTerminationPointAugmentation ovsdbTp = mock(OvsdbTerminationPointAugmentation.class);
157         when(ovsdbTp.getOfport()).thenReturn(65535L);
158
159         String result =
160                 InventoryHelper.getInventoryNodeConnectorIdString(inventoryNodeId, ovsdbTp, ovsdbTpIid, dataBroker);
161         assertNull(result);
162     }
163
164     @SuppressWarnings("unchecked")
165     @Test
166     public void testGetInventoryNodeConnectorIdString_OfportOver() throws Exception {
167         String inventoryNodeId = "openflow:inventoryNodeId";
168         OvsdbTerminationPointAugmentation ovsdbTp = mock(OvsdbTerminationPointAugmentation.class);
169         when(ovsdbTp.getOfport()).thenReturn(null);
170
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);
176
177         when(readOvsdbTp.getOfport()).thenReturn(65534L);
178
179         String result =
180                 InventoryHelper.getInventoryNodeConnectorIdString(inventoryNodeId, ovsdbTp, ovsdbTpIid, dataBroker);
181         assertEquals("openflow:inventoryNodeId:65534", result);
182     }
183
184     @SuppressWarnings("unchecked")
185     @Test
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);
190
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);
197
198         String result =
199                 InventoryHelper.getInventoryNodeConnectorIdString(inventoryNodeId, ovsdbTp, ovsdbTpIid, dataBroker);
200         assertNull(result);
201     }
202
203     @SuppressWarnings("unchecked")
204     @Test
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);
209
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);
215
216         String result =
217                 InventoryHelper.getInventoryNodeConnectorIdString(inventoryNodeId, ovsdbTp, ovsdbTpIid, dataBroker);
218         assertNull(result);
219     }
220
221     @SuppressWarnings({"unchecked", "rawtypes"})
222     @Test
223     public void testCheckOfOverlayConfig() throws Exception {
224         AbstractTunnelType abstractTunnelType = mock(AbstractTunnelType.class);
225
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);
231
232         Tunnel tunnel = mock(Tunnel.class);
233         when(overlayConfig.getTunnel()).thenReturn(Collections.singletonList(tunnel));
234
235         when(abstractTunnelType.getTunnelType()).thenReturn((Class) TunnelTypeVxlan.class);
236         when(tunnel.getTunnelType()).thenReturn((Class) TunnelTypeVxlan.class);
237
238         boolean result = InventoryHelper.checkOfOverlayConfig(nodeIdString,
239                 Collections.singletonList(abstractTunnelType), dataBroker);
240         assertTrue(result);
241     }
242
243     @SuppressWarnings({"unchecked", "rawtypes"})
244     @Test
245     public void testCheckOfOverlayConfig_TunnelTypeEqualsFalse() throws Exception {
246         AbstractTunnelType abstractTunnelType = mock(AbstractTunnelType.class);
247
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);
253
254         Tunnel tunnel = mock(Tunnel.class);
255         when(overlayConfig.getTunnel()).thenReturn(Collections.singletonList(tunnel));
256
257         when(abstractTunnelType.getTunnelType()).thenReturn((Class) TunnelTypeVxlan.class);
258         when(tunnel.getTunnelType()).thenReturn((Class) TunnelTypeBase.class);
259
260         boolean result = InventoryHelper.checkOfOverlayConfig(nodeIdString,
261                 Collections.singletonList(abstractTunnelType), dataBroker);
262         assertFalse(result);
263     }
264
265     @SuppressWarnings({"unchecked", "unused"})
266     @Test
267     public void testCheckOfOverlayConfig_ConfigNull() throws Exception {
268         AbstractTunnelType abstractTunnelType = mock(AbstractTunnelType.class);
269
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);
275
276         boolean result = InventoryHelper.checkOfOverlayConfig(nodeIdString,
277                 Collections.singletonList(abstractTunnelType), dataBroker);
278         assertFalse(result);
279     }
280
281     @SuppressWarnings("unchecked")
282     @Test
283     public void testCheckOfOverlayConfig_TunnelNull() throws Exception {
284         AbstractTunnelType abstractTunnelType = mock(AbstractTunnelType.class);
285
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);
291
292         when(overlayConfig.getTunnel()).thenReturn(null);
293
294         boolean result = InventoryHelper.checkOfOverlayConfig(nodeIdString,
295                 Collections.singletonList(abstractTunnelType), dataBroker);
296         assertFalse(result);
297     }
298
299     @SuppressWarnings("unchecked")
300     @Test
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);
308
309         InventoryHelper.addOfOverlayExternalPort(nodeId, ncId, dataBroker);
310         verify(submitFuture).checkedGet();
311     }
312
313     @SuppressWarnings("unchecked")
314     @Test
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);
321
322         assertEquals(overlayConfig, InventoryHelper.getOfOverlayConfig(nodeIdString, dataBroker));
323     }
324
325     @SuppressWarnings({"unchecked", "rawtypes"})
326     @Test
327     public void testUpdateOfOverlayConfig() throws Exception {
328         IpAddress ip = mock(IpAddress.class);
329         String nodeConnectorIdString = "nodeConnectorIdString";
330         AbstractTunnelType tunnelType = mock(AbstractTunnelType.class);
331
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);
337
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));
343
344         CheckedFuture<Void, TransactionCommitFailedException> submitFuture = mock(CheckedFuture.class);
345         when(writeTransaction.submit()).thenReturn(submitFuture);
346
347         InventoryHelper.updateOfOverlayConfig(ip, nodeIdString, nodeConnectorIdString, tunnelType, dataBroker);
348         verify(writeTransaction).submit();
349     }
350
351     @Test
352     public void testUpdateOfOverlayConfig_NullParameters() throws Exception {
353         IpAddress ip = mock(IpAddress.class);
354         String nodeConnectorIdString = "nodeConnectorIdString";
355         AbstractTunnelType tunnelType = mock(AbstractTunnelType.class);
356
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();
361     }
362
363     @SuppressWarnings("unchecked")
364     @Test
365     public void testUpdateOfOverlayConfig_OfConfigNull() throws Exception {
366         IpAddress ip = mock(IpAddress.class);
367         String nodeConnectorIdString = "nodeConnectorIdString";
368         AbstractTunnelType tunnelType = mock(AbstractTunnelType.class);
369
370         when(writeTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class)))
371             .thenReturn(nodeConfigFuture);
372         when(nodeConfigOptional.isPresent()).thenReturn(false);
373
374         CheckedFuture<Void, TransactionCommitFailedException> submitFuture = mock(CheckedFuture.class);
375         when(writeTransaction.submit()).thenReturn(submitFuture);
376
377         InventoryHelper.updateOfOverlayConfig(ip, nodeIdString, nodeConnectorIdString, tunnelType, dataBroker);
378         verify(writeTransaction).submit();
379     }
380
381     @SuppressWarnings({"unchecked", "rawtypes"})
382     @Test
383     public void testRemoveTunnelsOfOverlayConfig_TunnelTypeEqualsFalse() throws Exception {
384         AbstractTunnelType tunnelType = mock(AbstractTunnelType.class);
385
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);
396
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);
401
402         InventoryHelper.removeTunnelsOfOverlayConfig(nodeIdString, Collections.singletonList(tunnelType), dataBroker);
403         verify(writeTransaction, never()).submit();
404     }
405 }