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.netvirt.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.netvirt.openstack.netvirt.api.Action;
30 import org.opendaylight.netvirt.openstack.netvirt.api.BridgeConfigurationManager;
31 import org.opendaylight.netvirt.openstack.netvirt.api.ConfigurationService;
32 import org.opendaylight.netvirt.openstack.netvirt.api.Constants;
33 import org.opendaylight.netvirt.openstack.netvirt.api.NetworkingProviderManager;
34 import org.opendaylight.netvirt.openstack.netvirt.api.NodeCacheManager;
35 import org.opendaylight.netvirt.openstack.netvirt.api.OvsdbInventoryListener;
36 import org.opendaylight.netvirt.openstack.netvirt.api.TenantNetworkManager;
37 import org.opendaylight.netvirt.openstack.netvirt.translator.NeutronNetwork;
38 import org.opendaylight.netvirt.openstack.netvirt.api.EventDispatcher;
39 import org.opendaylight.netvirt.openstack.netvirt.api.NetworkingProvider;
40 import org.opendaylight.netvirt.openstack.netvirt.api.OvsdbInventoryService;
41 import org.opendaylight.netvirt.openstack.netvirt.api.Southbound;
42 import org.opendaylight.netvirt.openstack.netvirt.impl.DistributedArpService;
43 import org.opendaylight.netvirt.openstack.netvirt.impl.NeutronL3Adapter;
44 import org.opendaylight.netvirt.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.OvsdbBridgeName;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeAugmentation;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation;
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.DataObject;
52 import org.osgi.framework.ServiceReference;
55 * Unit test fort {@link SouthboundHandler}
57 @RunWith(MockitoJUnitRunner.class)
58 public class SouthboundHandlerTest {
60 @InjectMocks private SouthboundHandler southboundHandler;
61 private SouthboundHandler southboundHandlerSpy;
63 @Mock private ConfigurationService configurationService;
64 @Mock private BridgeConfigurationManager bridgeConfigurationManager;
65 @Mock private TenantNetworkManager tenantNetworkManager;
66 @Mock private NetworkingProviderManager networkingProviderManager;
67 @Mock private DistributedArpService distributedArpService;
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<>();
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(OvsdbInventoryListener.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(SouthboundEvent.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 OvsdbBridgeAugmentation br = mock(OvsdbBridgeAugmentation.class);
135 OvsdbBridgeName brName = mock(OvsdbBridgeName.class);
136 when(br.getBridgeName()).thenReturn(brName);
137 when(configurationService.getIntegrationBridgeName()).thenReturn(Constants.INTEGRATION_BRIDGE);
139 when(ev.getNode()).thenReturn(node);
140 when(ev.getAugmentationData()).thenReturn(br);
141 when(ev.getType()).thenReturn(SouthboundEvent.Type.BRIDGE);
143 when(southbound.getDatapathId(any(OvsdbBridgeAugmentation.class))).thenReturn("45");
145 when(ev.getAction()).thenReturn(Action.ADD);
146 southboundHandler.processEvent(ev);
147 verify(nodeCacheManager, times(1)).nodeAdded(any(Node.class));
148 Mockito.reset(nodeCacheManager);
150 when(ev.getAction()).thenReturn(Action.UPDATE);
151 southboundHandler.processEvent(ev);
152 verify(nodeCacheManager, times(1)).nodeAdded(any(Node.class));
153 Mockito.reset(nodeCacheManager);
155 when(ev.getAction()).thenReturn(Action.DELETE);
156 // Verify that non-integration bridges are deleted
157 when(brName.getValue()).thenReturn("br-test");
158 southboundHandler.processEvent(ev);
159 verify(nodeCacheManager, times(1)).nodeRemoved(any(Node.class));
160 verify(southbound, times(1)).deleteBridge(any(Node.class));
161 Mockito.reset(nodeCacheManager);
162 Mockito.reset(southbound);
163 // Verify that integration bridge is not deleted
164 when(brName.getValue()).thenReturn(Constants.INTEGRATION_BRIDGE);
165 southboundHandler.processEvent(ev);
166 verify(nodeCacheManager, times(1)).nodeRemoved(any(Node.class));
167 verify(southbound, times(0)).deleteBridge(any(Node.class));
168 Mockito.reset(nodeCacheManager);
169 Mockito.reset(southbound);
174 OvsdbTerminationPointAugmentation ovsdbTerminationPointAugmentation = mock(OvsdbTerminationPointAugmentation.class);
175 when(ovsdbTerminationPointAugmentation.getName()).thenReturn("network");
176 // Mockito.<Class<?>>when(ovsdbTerminationPointAugmentation.getInterfaceType()).thenReturn(InterfaceTypeBase.class);
177 // when(ovsdbTerminationPointAugmentation.getInterfaceType()).thenReturn(n);
178 when(ev.getNode()).thenReturn(node);
179 when(ev.getAugmentationData()).thenReturn(ovsdbTerminationPointAugmentation);
180 when(ev.getType()).thenReturn(SouthboundEvent.Type.PORT);
182 NetworkingProvider networkingProvider = mock(NetworkingProvider.class);
183 NeutronNetwork neutronNetwork = mock(NeutronNetwork.class);
184 when(neutronNetwork.getRouterExternal()).thenReturn(false);
185 when(tenantNetworkManager.getTenantNetwork(any(OvsdbTerminationPointAugmentation.class))).thenReturn(neutronNetwork);
186 when(networkingProviderManager.getProvider(any(Node.class))).thenReturn(networkingProvider);
187 when(bridgeConfigurationManager.createLocalNetwork(any(Node.class), any(NeutronNetwork.class))).thenReturn(true);
189 when(ev.getAction()).thenReturn(Action.ADD);
190 southboundHandler.processEvent(ev);
191 verify(neutronL3Adapter, times(1)).handleInterfaceEvent(any(Node.class), any(OvsdbTerminationPointAugmentation.class), any(NeutronNetwork.class), any(Action.class));
192 verify(networkingProvider, times(1)).handleInterfaceUpdate(any(NeutronNetwork.class), any(Node.class), any(OvsdbTerminationPointAugmentation.class));
193 Mockito.reset(neutronL3Adapter);
194 Mockito.reset(networkingProvider);
196 when(ev.getAction()).thenReturn(Action.UPDATE);
197 southboundHandler.processEvent(ev);
198 verify(distributedArpService, times(1)).processInterfaceEvent(any(Node.class), any(OvsdbTerminationPointAugmentation.class), any(NeutronNetwork.class), any(Boolean.class), any(Action.class));
199 verify(neutronL3Adapter, times(1)).handleInterfaceEvent(any(Node.class), any(OvsdbTerminationPointAugmentation.class), any(NeutronNetwork.class), any(Action.class));
200 verify(networkingProvider, times(1)).handleInterfaceUpdate(any(NeutronNetwork.class), any(Node.class), any(OvsdbTerminationPointAugmentation.class));
201 Mockito.reset(neutronL3Adapter);
202 Mockito.reset(distributedArpService);
203 Mockito.reset(networkingProvider);
205 // List<String> phyIfName = new ArrayList<String>();
206 // phyIfName.add("network");
207 // when(bridgeConfigurationManager.getAllPhysicalInterfaceNames(any(Node.class))).thenReturn(phyIfName);
209 // when(ev.getAction()).thenReturn(Action.DELETE); //isInterfaceOfIntereset true
210 // southboundHandler.processEvent(ev);
211 // verify(neutronL3Adapter, times(1)).handleInterfaceEvent(any(Node.class), any(OvsdbTerminationPointAugmentation.class), any(NeutronNetwork.class), any(Action.class));
212 // verify(networkingProvider, times(1)).handleInterfaceDelete(anyString(), any(NeutronNetwork.class), any(Node.class), any(OvsdbTerminationPointAugmentation.class), anyBoolean());
214 // Mockito.reset(networkingProvider);
216 // when(southbound.getBridge(any(Node.class))).thenReturn(mock(OvsdbBridgeAugmentation.class));
217 // List<TerminationPoint> terminationPoints = new ArrayList<TerminationPoint>();
218 // TerminationPoint terminationPoint = mock(TerminationPoint.class);
219 // OvsdbTerminationPointAugmentation ovsdbTerminationPointAugmentation2 = mock(OvsdbTerminationPointAugmentation.class);
220 // when(terminationPoint.getAugmentation(any(Class.class))).thenReturn(ovsdbTerminationPointAugmentation);
221 // Uuid uuid = mock(Uuid.class);
222 // when(ovsdbTerminationPointAugmentation.getInterfaceUuid()).thenReturn(uuid);
223 // when(ovsdbTerminationPointAugmentation2.getInterfaceUuid()).thenReturn(uuid);
224 // terminationPoints.add(terminationPoint);
225 // when(node.getTerminationPoint()).thenReturn(terminationPoints);
227 // when(ev.getAction()).thenReturn(Action.DELETE); //isInterfaceOfIntereset false - network != null
228 // southboundHandler.processEvent(ev);
229 // verify(networkingProvider, times(1)).handleInterfaceDelete(anyString(), any(NeutronNetwork.class), any(Node.class), any(OvsdbTerminationPointAugmentation.class), anyBoolean());
232 when(ev.getNode()).thenReturn(node);
233 when(ev.getAugmentationData()).thenReturn(ovsdbTerminationPointAugmentation);
234 when(ev.getType()).thenReturn(SouthboundEvent.Type.OPENVSWITCH);
236 when(ovsdbTerminationPointAugmentation.getName()).thenReturn("network");
237 List<TerminationPoint> terminationPoints = new ArrayList<>();
238 terminationPoints.add(mock(TerminationPoint.class));
239 when(southbound.extractTerminationPoints(any(Node.class))).thenReturn(terminationPoints);
243 public void testSetDependencies() throws Exception {
244 ConfigurationService configurationService = mock(ConfigurationService.class);
245 NetworkingProviderManager networkingProviderManager = mock(NetworkingProviderManager.class);
246 TenantNetworkManager tenantNetworkManager = mock(TenantNetworkManager.class);
247 BridgeConfigurationManager bridgeConfigurationManager = mock(BridgeConfigurationManager.class);
248 NodeCacheManager nodeCacheManager = mock(NodeCacheManager.class);
249 NeutronL3Adapter neutronL3Adapter = mock(NeutronL3Adapter.class);
250 DistributedArpService distributedArpService = mock(DistributedArpService.class);
251 Southbound southbound = mock(Southbound.class);
252 EventDispatcher eventDispatcher = mock(EventDispatcher.class);
253 OvsdbInventoryService ovsdbInventoryService = mock(OvsdbInventoryService.class);
255 ServiceHelper.overrideGlobalInstance(ConfigurationService.class, configurationService);
256 ServiceHelper.overrideGlobalInstance(NetworkingProviderManager.class, networkingProviderManager);
257 ServiceHelper.overrideGlobalInstance(TenantNetworkManager.class, tenantNetworkManager);
258 ServiceHelper.overrideGlobalInstance(BridgeConfigurationManager.class, bridgeConfigurationManager);
259 ServiceHelper.overrideGlobalInstance(NodeCacheManager.class, nodeCacheManager);
260 ServiceHelper.overrideGlobalInstance(DistributedArpService.class, distributedArpService);
261 ServiceHelper.overrideGlobalInstance(NeutronL3Adapter.class, neutronL3Adapter);
262 ServiceHelper.overrideGlobalInstance(Southbound.class, southbound);
263 ServiceHelper.overrideGlobalInstance(EventDispatcher.class, eventDispatcher);
264 ServiceHelper.overrideGlobalInstance(OvsdbInventoryService.class, ovsdbInventoryService);
266 southboundHandler.setDependencies(mock(ServiceReference.class));
267 assertEquals("Error, did not return the correct object", getField("configurationService"), configurationService);
268 assertEquals("Error, did not return the correct object", getField("networkingProviderManager"), networkingProviderManager);
269 assertEquals("Error, did not return the correct object", getField("tenantNetworkManager"), tenantNetworkManager);
270 assertEquals("Error, did not return the correct object", getField("bridgeConfigurationManager"), bridgeConfigurationManager);
271 assertEquals("Error, did not return the correct object", getField("nodeCacheManager"), nodeCacheManager);
272 assertEquals("Error, did not return the correct object", getField("distributedArpService"), distributedArpService);
273 assertEquals("Error, did not return the correct object", getField("neutronL3Adapter"), neutronL3Adapter);
274 assertEquals("Error, did not return the correct object", getField("southbound"), southbound);
275 assertEquals("Error, did not return the correct object", getField("ovsdbInventoryService"), ovsdbInventoryService);
276 assertEquals("Error, did not return the correct object", southboundHandler.eventDispatcher, eventDispatcher);
279 private Object getField(String fieldName) throws Exception {
280 Field field = SouthboundHandler.class.getDeclaredField(fieldName);
281 field.setAccessible(true);
282 return field.get(southboundHandler);