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.ServiceReference;
50 import org.powermock.api.mockito.PowerMockito;
51 import org.powermock.core.classloader.annotations.PrepareForTest;
52 import org.powermock.modules.junit4.PowerMockRunner;
55 * Unit test fort {@link SouthboundHandler}
57 @RunWith(PowerMockRunner.class)
58 @PrepareForTest(ServiceHelper.class)
59 public class SouthboundHandlerTest {
61 @InjectMocks private SouthboundHandler southboundHandler;
62 private SouthboundHandler southboundHandlerSpy;
64 @Mock private ConfigurationService configurationService;
65 @Mock private BridgeConfigurationManager bridgeConfigurationManager;
66 @Mock private TenantNetworkManager tenantNetworkManager;
67 @Mock private NetworkingProviderManager networkingProviderManager;
68 @Mock private NeutronL3Adapter neutronL3Adapter;
69 @Mock private NodeCacheManager nodeCacheManager;
70 @Mock private OvsdbInventoryService ovsdbInventoryService;
71 @Mock private Southbound southbound;
75 southboundHandler.eventDispatcher = mock(EventDispatcher.class);
76 southboundHandlerSpy = Mockito.spy(southboundHandler);
80 public void testTriggerUpdates() {
81 Node node = mock(Node.class);
82 when(node.getAugmentation(OvsdbNodeAugmentation.class)).thenReturn(mock(OvsdbNodeAugmentation.class));
84 List<Node> nodes = new ArrayList<Node>();
85 nodes.add(mock(Node.class));
86 when(southbound.readOvsdbTopologyNodes()).thenReturn(nodes);
88 southboundHandlerSpy.triggerUpdates();
89 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(neutronL3Adapter, times(1)).handleInterfaceEvent(any(Node.class), any(OvsdbTerminationPointAugmentation.class), any(NeutronNetwork.class), any(Action.class));
178 verify(networkingProvider, times(1)).handleInterfaceUpdate(any(NeutronNetwork.class), any(Node.class), any(OvsdbTerminationPointAugmentation.class));
179 Mockito.reset(neutronL3Adapter);
180 Mockito.reset(networkingProvider);
182 when(ev.getAction()).thenReturn(Action.UPDATE);
183 southboundHandler.processEvent(ev);
184 verify(neutronL3Adapter, times(1)).handleInterfaceEvent(any(Node.class), any(OvsdbTerminationPointAugmentation.class), any(NeutronNetwork.class), any(Action.class));
185 verify(networkingProvider, times(1)).handleInterfaceUpdate(any(NeutronNetwork.class), any(Node.class), any(OvsdbTerminationPointAugmentation.class));
186 Mockito.reset(neutronL3Adapter);
187 Mockito.reset(networkingProvider);
189 // List<String> phyIfName = new ArrayList<String>();
190 // phyIfName.add("network");
191 // when(bridgeConfigurationManager.getAllPhysicalInterfaceNames(any(Node.class))).thenReturn(phyIfName);
193 // when(ev.getAction()).thenReturn(Action.DELETE); //isInterfaceOfIntereset true
194 // southboundHandler.processEvent(ev);
195 // verify(neutronL3Adapter, times(1)).handleInterfaceEvent(any(Node.class), any(OvsdbTerminationPointAugmentation.class), any(NeutronNetwork.class), any(Action.class));
196 // verify(networkingProvider, times(1)).handleInterfaceDelete(anyString(), any(NeutronNetwork.class), any(Node.class), any(OvsdbTerminationPointAugmentation.class), anyBoolean());
198 // Mockito.reset(networkingProvider);
200 // when(southbound.getBridge(any(Node.class))).thenReturn(mock(OvsdbBridgeAugmentation.class));
201 // List<TerminationPoint> terminationPoints = new ArrayList<TerminationPoint>();
202 // TerminationPoint terminationPoint = mock(TerminationPoint.class);
203 // OvsdbTerminationPointAugmentation ovsdbTerminationPointAugmentation2 = mock(OvsdbTerminationPointAugmentation.class);
204 // when(terminationPoint.getAugmentation(any(Class.class))).thenReturn(ovsdbTerminationPointAugmentation);
205 // Uuid uuid = mock(Uuid.class);
206 // when(ovsdbTerminationPointAugmentation.getInterfaceUuid()).thenReturn(uuid);
207 // when(ovsdbTerminationPointAugmentation2.getInterfaceUuid()).thenReturn(uuid);
208 // terminationPoints.add(terminationPoint);
209 // when(node.getTerminationPoint()).thenReturn(terminationPoints);
211 // when(ev.getAction()).thenReturn(Action.DELETE); //isInterfaceOfIntereset false - network != null
212 // southboundHandler.processEvent(ev);
213 // verify(networkingProvider, times(1)).handleInterfaceDelete(anyString(), any(NeutronNetwork.class), any(Node.class), any(OvsdbTerminationPointAugmentation.class), anyBoolean());
216 when(ev.getNode()).thenReturn(node);
217 when(ev.getAugmentationData()).thenReturn(ovsdbTerminationPointAugmentation);
218 when(ev.getType()).thenReturn(Type.OPENVSWITCH);
220 when(ovsdbTerminationPointAugmentation.getName()).thenReturn("network");
221 List<TerminationPoint> terminationPoints = new ArrayList<TerminationPoint>();
222 terminationPoints.add(mock(TerminationPoint.class));
223 when(southbound.extractTerminationPoints(any(Node.class))).thenReturn(terminationPoints);
225 when(ev.getAction()).thenReturn(Action.ADD);
226 southboundHandler.processEvent(ev);
227 verify(neutronL3Adapter, times(1)).handleInterfaceEvent(any(Node.class), any(OvsdbTerminationPointAugmentation.class), any(NeutronNetwork.class), any(Action.class));
228 verify(networkingProvider, times(1)).handleInterfaceUpdate(any(NeutronNetwork.class), any(Node.class), any(OvsdbTerminationPointAugmentation.class));
229 Mockito.reset(neutronL3Adapter);
230 Mockito.reset(networkingProvider);
234 public void testSetDependencies() throws Exception {
235 ConfigurationService configurationService = mock(ConfigurationService.class);
236 NetworkingProviderManager networkingProviderManager = mock(NetworkingProviderManager.class);
237 TenantNetworkManager tenantNetworkManager = mock(TenantNetworkManager.class);
238 BridgeConfigurationManager bridgeConfigurationManager = mock(BridgeConfigurationManager.class);
239 NodeCacheManager nodeCacheManager = mock(NodeCacheManager.class);
240 NeutronL3Adapter neutronL3Adapter = mock(NeutronL3Adapter.class);
241 Southbound southbound = mock(Southbound.class);
242 EventDispatcher eventDispatcher = mock(EventDispatcher.class);
243 OvsdbInventoryService ovsdbInventoryService = mock(OvsdbInventoryService.class);
245 PowerMockito.mockStatic(ServiceHelper.class);
246 PowerMockito.when(ServiceHelper.getGlobalInstance(ConfigurationService.class, southboundHandler)).thenReturn(configurationService);
247 PowerMockito.when(ServiceHelper.getGlobalInstance(NetworkingProviderManager.class, southboundHandler)).thenReturn(networkingProviderManager);
248 PowerMockito.when(ServiceHelper.getGlobalInstance(TenantNetworkManager.class, southboundHandler)).thenReturn(tenantNetworkManager);
249 PowerMockito.when(ServiceHelper.getGlobalInstance(BridgeConfigurationManager.class, southboundHandler)).thenReturn(bridgeConfigurationManager);
250 PowerMockito.when(ServiceHelper.getGlobalInstance(NodeCacheManager.class, southboundHandler)).thenReturn(nodeCacheManager);
251 PowerMockito.when(ServiceHelper.getGlobalInstance(NeutronL3Adapter.class, southboundHandler)).thenReturn(neutronL3Adapter);
252 PowerMockito.when(ServiceHelper.getGlobalInstance(Southbound.class, southboundHandler)).thenReturn(southbound);
253 PowerMockito.when(ServiceHelper.getGlobalInstance(EventDispatcher.class, southboundHandler)).thenReturn(eventDispatcher);
254 PowerMockito.when(ServiceHelper.getGlobalInstance(OvsdbInventoryService.class, southboundHandler)).thenReturn(ovsdbInventoryService);
256 southboundHandler.setDependencies(mock(ServiceReference.class));
257 assertEquals("Error, did not return the correct object", getField("configurationService"), configurationService);
258 assertEquals("Error, did not return the correct object", getField("networkingProviderManager"), networkingProviderManager);
259 assertEquals("Error, did not return the correct object", getField("tenantNetworkManager"), tenantNetworkManager);
260 assertEquals("Error, did not return the correct object", getField("bridgeConfigurationManager"), bridgeConfigurationManager);
261 assertEquals("Error, did not return the correct object", getField("nodeCacheManager"), nodeCacheManager);
262 assertEquals("Error, did not return the correct object", getField("neutronL3Adapter"), neutronL3Adapter);
263 assertEquals("Error, did not return the correct object", getField("southbound"), southbound);
264 assertEquals("Error, did not return the correct object", getField("ovsdbInventoryService"), ovsdbInventoryService);
265 assertEquals("Error, did not return the correct object", southboundHandler.eventDispatcher, eventDispatcher);
268 private Object getField(String fieldName) throws Exception {
269 Field field = SouthboundHandler.class.getDeclaredField(fieldName);
270 field.setAccessible(true);
271 return field.get(southboundHandler);