2 * Copyright (c) 2015, 2016 Inocybe 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.ovsdb.openstack.netvirt;
11 import static org.junit.Assert.assertEquals;
12 import static org.mockito.Matchers.any;
13 import static org.mockito.Mockito.mock;
14 import static org.mockito.Mockito.times;
15 import static org.mockito.Mockito.verify;
16 import static org.mockito.Mockito.when;
18 import java.lang.reflect.Field;
19 import java.util.ArrayList;
20 import java.util.List;
22 import org.junit.Before;
23 import org.junit.Test;
24 import org.junit.runner.RunWith;
25 import org.mockito.InjectMocks;
26 import org.mockito.Mock;
27 import org.mockito.Mockito;
28 import org.mockito.runners.MockitoJUnitRunner;
29 import org.opendaylight.ovsdb.openstack.netvirt.translator.NeutronNetwork;
30 import org.opendaylight.ovsdb.openstack.netvirt.SouthboundEvent.Type;
31 import org.opendaylight.ovsdb.openstack.netvirt.api.Action;
32 import org.opendaylight.ovsdb.openstack.netvirt.api.BridgeConfigurationManager;
33 import org.opendaylight.ovsdb.openstack.netvirt.api.ConfigurationService;
34 import org.opendaylight.ovsdb.openstack.netvirt.api.EventDispatcher;
35 import org.opendaylight.ovsdb.openstack.netvirt.api.NetworkingProvider;
36 import org.opendaylight.ovsdb.openstack.netvirt.api.NetworkingProviderManager;
37 import org.opendaylight.ovsdb.openstack.netvirt.api.NodeCacheManager;
38 import org.opendaylight.ovsdb.openstack.netvirt.api.OvsdbInventoryListener.OvsdbType;
39 import org.opendaylight.ovsdb.openstack.netvirt.api.OvsdbInventoryService;
40 import org.opendaylight.ovsdb.openstack.netvirt.api.Southbound;
41 import org.opendaylight.ovsdb.openstack.netvirt.api.TenantNetworkManager;
42 import org.opendaylight.ovsdb.openstack.netvirt.impl.DistributedArpService;
43 import org.opendaylight.ovsdb.openstack.netvirt.impl.NeutronL3Adapter;
44 import org.opendaylight.ovsdb.utils.servicehelper.ServiceHelper;
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.OvsdbNodeAugmentation;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation;
48 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
49 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
50 import org.opendaylight.yangtools.yang.binding.DataObject;
51 import org.osgi.framework.ServiceReference;
54 * Unit test fort {@link SouthboundHandler}
56 @RunWith(MockitoJUnitRunner.class)
57 public class SouthboundHandlerTest {
59 @InjectMocks private SouthboundHandler southboundHandler;
60 private SouthboundHandler southboundHandlerSpy;
62 @Mock private ConfigurationService configurationService;
63 @Mock private BridgeConfigurationManager bridgeConfigurationManager;
64 @Mock private TenantNetworkManager tenantNetworkManager;
65 @Mock private NetworkingProviderManager networkingProviderManager;
66 @Mock private DistributedArpService distributedArpService;
67 @Mock private NeutronL3Adapter neutronL3Adapter;
68 @Mock private NodeCacheManager nodeCacheManager;
69 @Mock private OvsdbInventoryService ovsdbInventoryService;
70 @Mock private Southbound southbound;
74 southboundHandler.eventDispatcher = mock(EventDispatcher.class);
75 southboundHandlerSpy = Mockito.spy(southboundHandler);
79 public void testTriggerUpdates() {
80 Node node = mock(Node.class);
81 when(node.getAugmentation(OvsdbNodeAugmentation.class)).thenReturn(mock(OvsdbNodeAugmentation.class));
83 List<Node> nodes = new ArrayList<>();
84 nodes.add(mock(Node.class));
85 when(southbound.readOvsdbTopologyNodes()).thenReturn(nodes);
87 southboundHandlerSpy.triggerUpdates();
88 verify(southboundHandlerSpy, times(1)).ovsdbUpdate(any(Node.class), any(DataObject.class), any(OvsdbType.class), any(Action.class));
93 public void testNotifyNode() {
94 when(southbound.getBridge(any(Node.class))).thenReturn(mock(OvsdbBridgeAugmentation.class));
96 NetworkingProvider networkingProvider = mock(NetworkingProvider.class);
97 when(networkingProviderManager.getProvider(any(Node.class))).thenReturn(networkingProvider);
99 southboundHandlerSpy.notifyNode(mock(Node.class), Action.ADD);
101 verify(networkingProvider, times(1)).initializeOFFlowRules(any(Node.class));
105 public void testProcessEvent() {
106 SouthboundEvent ev = mock(SouthboundEvent.class);
107 Node node = mock(Node.class);
110 when(ev.getNode()).thenReturn(node);
111 when(ev.getAugmentationData()).thenReturn(mock(OvsdbNodeAugmentation.class));
112 when(ev.getType()).thenReturn(Type.NODE);
114 when(ev.getAction()).thenReturn(Action.ADD);
115 southboundHandler.processEvent(ev);
116 verify(nodeCacheManager, times(1)).nodeAdded(any(Node.class));
117 verify(bridgeConfigurationManager, times(1)).prepareNode(any(Node.class));
118 Mockito.reset(nodeCacheManager);
120 when(ev.getAction()).thenReturn(Action.UPDATE);
121 southboundHandler.processEvent(ev);
122 verify(nodeCacheManager, times(1)).nodeAdded(any(Node.class));
123 Mockito.reset(nodeCacheManager);
125 when(ev.getAction()).thenReturn(Action.DELETE);
126 southboundHandler.processEvent(ev);
127 verify(nodeCacheManager, times(1)).nodeRemoved(any(Node.class));
128 Mockito.reset(nodeCacheManager);
133 when(ev.getNode()).thenReturn(node);
134 when(ev.getAugmentationData()).thenReturn(mock(OvsdbBridgeAugmentation.class));
135 when(ev.getType()).thenReturn(Type.BRIDGE);
137 when(southbound.getDatapathId(any(OvsdbBridgeAugmentation.class))).thenReturn("45");
139 when(ev.getAction()).thenReturn(Action.ADD);
140 southboundHandler.processEvent(ev);
141 verify(nodeCacheManager, times(1)).nodeAdded(any(Node.class));
142 Mockito.reset(nodeCacheManager);
144 when(ev.getAction()).thenReturn(Action.UPDATE);
145 southboundHandler.processEvent(ev);
146 verify(nodeCacheManager, times(1)).nodeAdded(any(Node.class));
147 Mockito.reset(nodeCacheManager);
149 Mockito.reset(nodeCacheManager);
150 when(ev.getAction()).thenReturn(Action.DELETE);
151 southboundHandler.processEvent(ev);
152 verify(nodeCacheManager, times(1)).nodeRemoved(any(Node.class));
153 verify(southbound, times(1)).deleteBridge(any(Node.class));
154 Mockito.reset(nodeCacheManager);
155 Mockito.reset(southbound);
160 OvsdbTerminationPointAugmentation ovsdbTerminationPointAugmentation = mock(OvsdbTerminationPointAugmentation.class);
161 when(ovsdbTerminationPointAugmentation.getName()).thenReturn("network");
162 // Mockito.<Class<?>>when(ovsdbTerminationPointAugmentation.getInterfaceType()).thenReturn(InterfaceTypeBase.class);
163 // when(ovsdbTerminationPointAugmentation.getInterfaceType()).thenReturn(n);
164 when(ev.getNode()).thenReturn(node);
165 when(ev.getAugmentationData()).thenReturn(ovsdbTerminationPointAugmentation);
166 when(ev.getType()).thenReturn(Type.PORT);
168 NetworkingProvider networkingProvider = mock(NetworkingProvider.class);
169 NeutronNetwork neutronNetwork = mock(NeutronNetwork.class);
170 when(neutronNetwork.getRouterExternal()).thenReturn(false);
171 when(tenantNetworkManager.getTenantNetwork(any(OvsdbTerminationPointAugmentation.class))).thenReturn(neutronNetwork);
172 when(networkingProviderManager.getProvider(any(Node.class))).thenReturn(networkingProvider);
173 when(bridgeConfigurationManager.createLocalNetwork(any(Node.class), any(NeutronNetwork.class))).thenReturn(true);
175 when(ev.getAction()).thenReturn(Action.ADD);
176 southboundHandler.processEvent(ev);
177 verify(distributedArpService, times(1)).processInterfaceEvent(any(Node.class), any(OvsdbTerminationPointAugmentation.class), any(NeutronNetwork.class), any(Action.class));
178 verify(neutronL3Adapter, times(1)).handleInterfaceEvent(any(Node.class), any(OvsdbTerminationPointAugmentation.class), any(NeutronNetwork.class), any(Action.class));
179 verify(networkingProvider, times(1)).handleInterfaceUpdate(any(NeutronNetwork.class), any(Node.class), any(OvsdbTerminationPointAugmentation.class));
180 Mockito.reset(distributedArpService);
181 Mockito.reset(neutronL3Adapter);
182 Mockito.reset(networkingProvider);
184 when(ev.getAction()).thenReturn(Action.UPDATE);
185 southboundHandler.processEvent(ev);
186 verify(distributedArpService, times(1)).processInterfaceEvent(any(Node.class), any(OvsdbTerminationPointAugmentation.class), any(NeutronNetwork.class), any(Action.class));
187 verify(neutronL3Adapter, times(1)).handleInterfaceEvent(any(Node.class), any(OvsdbTerminationPointAugmentation.class), any(NeutronNetwork.class), any(Action.class));
188 verify(networkingProvider, times(1)).handleInterfaceUpdate(any(NeutronNetwork.class), any(Node.class), any(OvsdbTerminationPointAugmentation.class));
189 Mockito.reset(neutronL3Adapter);
190 Mockito.reset(distributedArpService);
191 Mockito.reset(networkingProvider);
193 // List<String> phyIfName = new ArrayList<String>();
194 // phyIfName.add("network");
195 // when(bridgeConfigurationManager.getAllPhysicalInterfaceNames(any(Node.class))).thenReturn(phyIfName);
197 // when(ev.getAction()).thenReturn(Action.DELETE); //isInterfaceOfIntereset true
198 // southboundHandler.processEvent(ev);
199 // verify(neutronL3Adapter, times(1)).handleInterfaceEvent(any(Node.class), any(OvsdbTerminationPointAugmentation.class), any(NeutronNetwork.class), any(Action.class));
200 // verify(networkingProvider, times(1)).handleInterfaceDelete(anyString(), any(NeutronNetwork.class), any(Node.class), any(OvsdbTerminationPointAugmentation.class), anyBoolean());
202 // Mockito.reset(networkingProvider);
204 // when(southbound.getBridge(any(Node.class))).thenReturn(mock(OvsdbBridgeAugmentation.class));
205 // List<TerminationPoint> terminationPoints = new ArrayList<TerminationPoint>();
206 // TerminationPoint terminationPoint = mock(TerminationPoint.class);
207 // OvsdbTerminationPointAugmentation ovsdbTerminationPointAugmentation2 = mock(OvsdbTerminationPointAugmentation.class);
208 // when(terminationPoint.getAugmentation(any(Class.class))).thenReturn(ovsdbTerminationPointAugmentation);
209 // Uuid uuid = mock(Uuid.class);
210 // when(ovsdbTerminationPointAugmentation.getInterfaceUuid()).thenReturn(uuid);
211 // when(ovsdbTerminationPointAugmentation2.getInterfaceUuid()).thenReturn(uuid);
212 // terminationPoints.add(terminationPoint);
213 // when(node.getTerminationPoint()).thenReturn(terminationPoints);
215 // when(ev.getAction()).thenReturn(Action.DELETE); //isInterfaceOfIntereset false - network != null
216 // southboundHandler.processEvent(ev);
217 // verify(networkingProvider, times(1)).handleInterfaceDelete(anyString(), any(NeutronNetwork.class), any(Node.class), any(OvsdbTerminationPointAugmentation.class), anyBoolean());
220 when(ev.getNode()).thenReturn(node);
221 when(ev.getAugmentationData()).thenReturn(ovsdbTerminationPointAugmentation);
222 when(ev.getType()).thenReturn(Type.OPENVSWITCH);
224 when(ovsdbTerminationPointAugmentation.getName()).thenReturn("network");
225 List<TerminationPoint> terminationPoints = new ArrayList<>();
226 terminationPoints.add(mock(TerminationPoint.class));
227 when(southbound.extractTerminationPoints(any(Node.class))).thenReturn(terminationPoints);
229 when(ev.getAction()).thenReturn(Action.ADD);
230 southboundHandler.processEvent(ev);
231 verify(distributedArpService, times(1)).processInterfaceEvent(any(Node.class), any(OvsdbTerminationPointAugmentation.class), any(NeutronNetwork.class), any(Action.class));
232 verify(neutronL3Adapter, times(1)).handleInterfaceEvent(any(Node.class), any(OvsdbTerminationPointAugmentation.class), any(NeutronNetwork.class), any(Action.class));
233 verify(networkingProvider, times(1)).handleInterfaceUpdate(any(NeutronNetwork.class), any(Node.class), any(OvsdbTerminationPointAugmentation.class));
234 Mockito.reset(distributedArpService);
235 Mockito.reset(neutronL3Adapter);
236 Mockito.reset(networkingProvider);
240 public void testSetDependencies() throws Exception {
241 ConfigurationService configurationService = mock(ConfigurationService.class);
242 NetworkingProviderManager networkingProviderManager = mock(NetworkingProviderManager.class);
243 TenantNetworkManager tenantNetworkManager = mock(TenantNetworkManager.class);
244 BridgeConfigurationManager bridgeConfigurationManager = mock(BridgeConfigurationManager.class);
245 NodeCacheManager nodeCacheManager = mock(NodeCacheManager.class);
246 NeutronL3Adapter neutronL3Adapter = mock(NeutronL3Adapter.class);
247 DistributedArpService distributedArpService = mock(DistributedArpService.class);
248 Southbound southbound = mock(Southbound.class);
249 EventDispatcher eventDispatcher = mock(EventDispatcher.class);
250 OvsdbInventoryService ovsdbInventoryService = mock(OvsdbInventoryService.class);
252 ServiceHelper.overrideGlobalInstance(ConfigurationService.class, configurationService);
253 ServiceHelper.overrideGlobalInstance(NetworkingProviderManager.class, networkingProviderManager);
254 ServiceHelper.overrideGlobalInstance(TenantNetworkManager.class, tenantNetworkManager);
255 ServiceHelper.overrideGlobalInstance(BridgeConfigurationManager.class, bridgeConfigurationManager);
256 ServiceHelper.overrideGlobalInstance(NodeCacheManager.class, nodeCacheManager);
257 ServiceHelper.overrideGlobalInstance(DistributedArpService.class, distributedArpService);
258 ServiceHelper.overrideGlobalInstance(NeutronL3Adapter.class, neutronL3Adapter);
259 ServiceHelper.overrideGlobalInstance(Southbound.class, southbound);
260 ServiceHelper.overrideGlobalInstance(EventDispatcher.class, eventDispatcher);
261 ServiceHelper.overrideGlobalInstance(OvsdbInventoryService.class, ovsdbInventoryService);
263 southboundHandler.setDependencies(mock(ServiceReference.class));
264 assertEquals("Error, did not return the correct object", getField("configurationService"), configurationService);
265 assertEquals("Error, did not return the correct object", getField("networkingProviderManager"), networkingProviderManager);
266 assertEquals("Error, did not return the correct object", getField("tenantNetworkManager"), tenantNetworkManager);
267 assertEquals("Error, did not return the correct object", getField("bridgeConfigurationManager"), bridgeConfigurationManager);
268 assertEquals("Error, did not return the correct object", getField("nodeCacheManager"), nodeCacheManager);
269 assertEquals("Error, did not return the correct object", getField("distributedArpService"), distributedArpService);
270 assertEquals("Error, did not return the correct object", getField("neutronL3Adapter"), neutronL3Adapter);
271 assertEquals("Error, did not return the correct object", getField("southbound"), southbound);
272 assertEquals("Error, did not return the correct object", getField("ovsdbInventoryService"), ovsdbInventoryService);
273 assertEquals("Error, did not return the correct object", southboundHandler.eventDispatcher, eventDispatcher);
276 private Object getField(String fieldName) throws Exception {
277 Field field = SouthboundHandler.class.getDeclaredField(fieldName);
278 field.setAccessible(true);
279 return field.get(southboundHandler);