2 * Copyright (c) 2015 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.opendaylight.neutron.spi.NeutronNetwork;
29 import org.opendaylight.ovsdb.openstack.netvirt.SouthboundEvent.Type;
30 import org.opendaylight.ovsdb.openstack.netvirt.api.Action;
31 import org.opendaylight.ovsdb.openstack.netvirt.api.BridgeConfigurationManager;
32 import org.opendaylight.ovsdb.openstack.netvirt.api.ConfigurationService;
33 import org.opendaylight.ovsdb.openstack.netvirt.api.EventDispatcher;
34 import org.opendaylight.ovsdb.openstack.netvirt.api.NetworkingProvider;
35 import org.opendaylight.ovsdb.openstack.netvirt.api.NetworkingProviderManager;
36 import org.opendaylight.ovsdb.openstack.netvirt.api.NodeCacheManager;
37 import org.opendaylight.ovsdb.openstack.netvirt.api.OvsdbInventoryListener.OvsdbType;
38 import org.opendaylight.ovsdb.openstack.netvirt.api.OvsdbInventoryService;
39 import org.opendaylight.ovsdb.openstack.netvirt.api.Southbound;
40 import org.opendaylight.ovsdb.openstack.netvirt.api.TenantNetworkManager;
41 import org.opendaylight.ovsdb.openstack.netvirt.impl.NeutronL3Adapter;
42 import org.opendaylight.ovsdb.utils.servicehelper.ServiceHelper;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeAugmentation;
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.network.topology.topology.Node;
47 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
48 import org.opendaylight.yangtools.yang.binding.DataObject;
49 import org.osgi.framework.BundleContext;
50 import org.osgi.framework.ServiceReference;
51 import org.powermock.api.mockito.PowerMockito;
52 import org.powermock.core.classloader.annotations.PrepareForTest;
53 import org.powermock.modules.junit4.PowerMockRunner;
56 * Unit test fort {@link SouthboundHandler}
58 @RunWith(PowerMockRunner.class)
59 @PrepareForTest(ServiceHelper.class)
60 public class SouthboundHandlerTest {
62 @InjectMocks private SouthboundHandler southboundHandler;
63 private SouthboundHandler southboundHandlerSpy;
65 @Mock private ConfigurationService configurationService;
66 @Mock private BridgeConfigurationManager bridgeConfigurationManager;
67 @Mock private TenantNetworkManager tenantNetworkManager;
68 @Mock private NetworkingProviderManager networkingProviderManager;
69 @Mock private NeutronL3Adapter neutronL3Adapter;
70 @Mock private NodeCacheManager nodeCacheManager;
71 @Mock private OvsdbInventoryService ovsdbInventoryService;
72 @Mock private Southbound southbound;
76 southboundHandler.eventDispatcher = mock(EventDispatcher.class);
77 southboundHandlerSpy = Mockito.spy(southboundHandler);
81 public void testTriggerUpdates() {
82 Node node = mock(Node.class);
83 when(node.getAugmentation(OvsdbNodeAugmentation.class)).thenReturn(mock(OvsdbNodeAugmentation.class));
85 List<Node> nodes = new ArrayList<Node>();
86 nodes.add(mock(Node.class));
87 when(southbound.readOvsdbTopologyNodes()).thenReturn(nodes);
89 southboundHandlerSpy.triggerUpdates();
90 verify(southboundHandlerSpy, times(1)).ovsdbUpdate(any(Node.class), any(DataObject.class), any(OvsdbType.class), any(Action.class));;
94 public void testNotifyNode() {
95 when(southbound.getBridge(any(Node.class))).thenReturn(mock(OvsdbBridgeAugmentation.class));
97 NetworkingProvider networkingProvider = mock(NetworkingProvider.class);
98 when(networkingProviderManager.getProvider(any(Node.class))).thenReturn(networkingProvider);
100 southboundHandlerSpy.notifyNode(mock(Node.class), Action.ADD);
102 verify(networkingProvider, times(1)).initializeOFFlowRules(any(Node.class));
106 public void testProcessEvent() {
107 SouthboundEvent ev = mock(SouthboundEvent.class);
108 Node node = mock(Node.class);
111 when(ev.getNode()).thenReturn(node);
112 when(ev.getAugmentationData()).thenReturn(mock(OvsdbNodeAugmentation.class));
113 when(ev.getType()).thenReturn(Type.NODE);
115 when(ev.getAction()).thenReturn(Action.ADD);
116 southboundHandler.processEvent(ev);
117 verify(nodeCacheManager, times(1)).nodeAdded(any(Node.class));
118 verify(bridgeConfigurationManager, times(1)).prepareNode(any(Node.class));
119 Mockito.reset(nodeCacheManager);
121 when(ev.getAction()).thenReturn(Action.UPDATE);
122 southboundHandler.processEvent(ev);
123 verify(nodeCacheManager, times(1)).nodeAdded(any(Node.class));
124 Mockito.reset(nodeCacheManager);
126 when(ev.getAction()).thenReturn(Action.DELETE);
127 southboundHandler.processEvent(ev);
128 verify(nodeCacheManager, times(1)).nodeRemoved(any(Node.class));
129 Mockito.reset(nodeCacheManager);
134 when(ev.getNode()).thenReturn(node);
135 when(ev.getAugmentationData()).thenReturn(mock(OvsdbBridgeAugmentation.class));
136 when(ev.getType()).thenReturn(Type.BRIDGE);
138 when(southbound.getDatapathId(any(OvsdbBridgeAugmentation.class))).thenReturn("45");
140 when(ev.getAction()).thenReturn(Action.ADD);
141 southboundHandler.processEvent(ev);
142 verify(nodeCacheManager, times(1)).nodeAdded(any(Node.class));
143 Mockito.reset(nodeCacheManager);
145 when(ev.getAction()).thenReturn(Action.UPDATE);
146 southboundHandler.processEvent(ev);
147 verify(nodeCacheManager, times(1)).nodeAdded(any(Node.class));
148 Mockito.reset(nodeCacheManager);
150 Mockito.reset(nodeCacheManager);
151 when(ev.getAction()).thenReturn(Action.DELETE);
152 southboundHandler.processEvent(ev);
153 verify(nodeCacheManager, times(1)).nodeRemoved(any(Node.class));
154 verify(southbound, times(1)).deleteBridge(any(Node.class));
155 Mockito.reset(nodeCacheManager);
156 Mockito.reset(southbound);
161 OvsdbTerminationPointAugmentation ovsdbTerminationPointAugmentation = mock(OvsdbTerminationPointAugmentation.class);
162 when(ovsdbTerminationPointAugmentation.getName()).thenReturn("network");
163 // Mockito.<Class<?>>when(ovsdbTerminationPointAugmentation.getInterfaceType()).thenReturn(InterfaceTypeBase.class);
164 // when(ovsdbTerminationPointAugmentation.getInterfaceType()).thenReturn(n);
165 when(ev.getNode()).thenReturn(node);
166 when(ev.getAugmentationData()).thenReturn(ovsdbTerminationPointAugmentation);
167 when(ev.getType()).thenReturn(Type.PORT);
169 NetworkingProvider networkingProvider = mock(NetworkingProvider.class);
170 NeutronNetwork neutronNetwork = mock(NeutronNetwork.class);
171 when(neutronNetwork.getRouterExternal()).thenReturn(false);
172 when(tenantNetworkManager.getTenantNetwork(any(OvsdbTerminationPointAugmentation.class))).thenReturn(neutronNetwork);
173 when(networkingProviderManager.getProvider(any(Node.class))).thenReturn(networkingProvider);
174 when(bridgeConfigurationManager.createLocalNetwork(any(Node.class), any(NeutronNetwork.class))).thenReturn(true);
176 when(ev.getAction()).thenReturn(Action.ADD);
177 southboundHandler.processEvent(ev);
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(neutronL3Adapter);
181 Mockito.reset(networkingProvider);
183 when(ev.getAction()).thenReturn(Action.UPDATE);
184 southboundHandler.processEvent(ev);
185 verify(neutronL3Adapter, times(1)).handleInterfaceEvent(any(Node.class), any(OvsdbTerminationPointAugmentation.class), any(NeutronNetwork.class), any(Action.class));
186 verify(networkingProvider, times(1)).handleInterfaceUpdate(any(NeutronNetwork.class), any(Node.class), any(OvsdbTerminationPointAugmentation.class));
187 Mockito.reset(neutronL3Adapter);
188 Mockito.reset(networkingProvider);
190 // List<String> phyIfName = new ArrayList<String>();
191 // phyIfName.add("network");
192 // when(bridgeConfigurationManager.getAllPhysicalInterfaceNames(any(Node.class))).thenReturn(phyIfName);
194 // when(ev.getAction()).thenReturn(Action.DELETE); //isInterfaceOfIntereset true
195 // southboundHandler.processEvent(ev);
196 // verify(neutronL3Adapter, times(1)).handleInterfaceEvent(any(Node.class), any(OvsdbTerminationPointAugmentation.class), any(NeutronNetwork.class), any(Action.class));
197 // verify(networkingProvider, times(1)).handleInterfaceDelete(anyString(), any(NeutronNetwork.class), any(Node.class), any(OvsdbTerminationPointAugmentation.class), anyBoolean());
199 // Mockito.reset(networkingProvider);
201 // when(southbound.getBridge(any(Node.class))).thenReturn(mock(OvsdbBridgeAugmentation.class));
202 // List<TerminationPoint> terminationPoints = new ArrayList<TerminationPoint>();
203 // TerminationPoint terminationPoint = mock(TerminationPoint.class);
204 // OvsdbTerminationPointAugmentation ovsdbTerminationPointAugmentation2 = mock(OvsdbTerminationPointAugmentation.class);
205 // when(terminationPoint.getAugmentation(any(Class.class))).thenReturn(ovsdbTerminationPointAugmentation);
206 // Uuid uuid = mock(Uuid.class);
207 // when(ovsdbTerminationPointAugmentation.getInterfaceUuid()).thenReturn(uuid);
208 // when(ovsdbTerminationPointAugmentation2.getInterfaceUuid()).thenReturn(uuid);
209 // terminationPoints.add(terminationPoint);
210 // when(node.getTerminationPoint()).thenReturn(terminationPoints);
212 // when(ev.getAction()).thenReturn(Action.DELETE); //isInterfaceOfIntereset false - network != null
213 // southboundHandler.processEvent(ev);
214 // verify(networkingProvider, times(1)).handleInterfaceDelete(anyString(), any(NeutronNetwork.class), any(Node.class), any(OvsdbTerminationPointAugmentation.class), anyBoolean());
217 when(ev.getNode()).thenReturn(node);
218 when(ev.getAugmentationData()).thenReturn(ovsdbTerminationPointAugmentation);
219 when(ev.getType()).thenReturn(Type.OPENVSWITCH);
221 when(ovsdbTerminationPointAugmentation.getName()).thenReturn("network");
222 List<TerminationPoint> terminationPoints = new ArrayList<TerminationPoint>();
223 terminationPoints.add(mock(TerminationPoint.class));
224 when(southbound.extractTerminationPoints(any(Node.class))).thenReturn(terminationPoints);
226 when(ev.getAction()).thenReturn(Action.ADD);
227 southboundHandler.processEvent(ev);
228 verify(neutronL3Adapter, times(1)).handleInterfaceEvent(any(Node.class), any(OvsdbTerminationPointAugmentation.class), any(NeutronNetwork.class), any(Action.class));
229 verify(networkingProvider, times(1)).handleInterfaceUpdate(any(NeutronNetwork.class), any(Node.class), any(OvsdbTerminationPointAugmentation.class));
230 Mockito.reset(neutronL3Adapter);
231 Mockito.reset(networkingProvider);
235 public void testSetDependencies() throws Exception {
236 ConfigurationService configurationService = mock(ConfigurationService.class);
237 NetworkingProviderManager networkingProviderManager = mock(NetworkingProviderManager.class);
238 TenantNetworkManager tenantNetworkManager = mock(TenantNetworkManager.class);
239 BridgeConfigurationManager bridgeConfigurationManager = mock(BridgeConfigurationManager.class);
240 NodeCacheManager nodeCacheManager = mock(NodeCacheManager.class);
241 NeutronL3Adapter neutronL3Adapter = mock(NeutronL3Adapter.class);
242 Southbound southbound = mock(Southbound.class);
243 EventDispatcher eventDispatcher = mock(EventDispatcher.class);
244 OvsdbInventoryService ovsdbInventoryService = mock(OvsdbInventoryService.class);
246 PowerMockito.mockStatic(ServiceHelper.class);
247 PowerMockito.when(ServiceHelper.getGlobalInstance(ConfigurationService.class, southboundHandler)).thenReturn(configurationService);
248 PowerMockito.when(ServiceHelper.getGlobalInstance(NetworkingProviderManager.class, southboundHandler)).thenReturn(networkingProviderManager);
249 PowerMockito.when(ServiceHelper.getGlobalInstance(TenantNetworkManager.class, southboundHandler)).thenReturn(tenantNetworkManager);
250 PowerMockito.when(ServiceHelper.getGlobalInstance(BridgeConfigurationManager.class, southboundHandler)).thenReturn(bridgeConfigurationManager);
251 PowerMockito.when(ServiceHelper.getGlobalInstance(NodeCacheManager.class, southboundHandler)).thenReturn(nodeCacheManager);
252 PowerMockito.when(ServiceHelper.getGlobalInstance(NeutronL3Adapter.class, southboundHandler)).thenReturn(neutronL3Adapter);
253 PowerMockito.when(ServiceHelper.getGlobalInstance(Southbound.class, southboundHandler)).thenReturn(southbound);
254 PowerMockito.when(ServiceHelper.getGlobalInstance(EventDispatcher.class, southboundHandler)).thenReturn(eventDispatcher);
255 PowerMockito.when(ServiceHelper.getGlobalInstance(OvsdbInventoryService.class, southboundHandler)).thenReturn(ovsdbInventoryService);
257 southboundHandler.setDependencies(mock(BundleContext.class), mock(ServiceReference.class));
258 assertEquals("Error, did not return the correct object", getField("configurationService"), configurationService);
259 assertEquals("Error, did not return the correct object", getField("networkingProviderManager"), networkingProviderManager);
260 assertEquals("Error, did not return the correct object", getField("tenantNetworkManager"), tenantNetworkManager);
261 assertEquals("Error, did not return the correct object", getField("bridgeConfigurationManager"), bridgeConfigurationManager);
262 assertEquals("Error, did not return the correct object", getField("nodeCacheManager"), nodeCacheManager);
263 assertEquals("Error, did not return the correct object", getField("neutronL3Adapter"), neutronL3Adapter);
264 assertEquals("Error, did not return the correct object", getField("southbound"), southbound);
265 assertEquals("Error, did not return the correct object", getField("ovsdbInventoryService"), ovsdbInventoryService);
266 assertEquals("Error, did not return the correct object", southboundHandler.eventDispatcher, eventDispatcher);
269 private Object getField(String fieldName) throws Exception {
270 Field field = SouthboundHandler.class.getDeclaredField(fieldName);
271 field.setAccessible(true);
272 return field.get(southboundHandler);