86929520f8d3b3a21c5e8fdda34baea9cb24c3b7
[netvirt.git] / openstack / net-virt / src / test / java / org / opendaylight / netvirt / openstack / netvirt / SouthboundHandlerTest.java
1 /*
2  * Copyright (c) 2015, 2016 Inocybe 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.netvirt.openstack.netvirt;
10
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;
17
18 import java.lang.reflect.Field;
19 import java.util.ArrayList;
20 import java.util.List;
21
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;
53
54 /**
55  * Unit test fort {@link SouthboundHandler}
56  */
57 @RunWith(MockitoJUnitRunner.class)
58 public class SouthboundHandlerTest {
59
60     @InjectMocks private SouthboundHandler southboundHandler;
61     private SouthboundHandler southboundHandlerSpy;
62
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;
72
73     @Before
74     public void setUp() {
75         southboundHandler.eventDispatcher = mock(EventDispatcher.class);
76         southboundHandlerSpy = Mockito.spy(southboundHandler);
77     }
78
79     @Test
80     public void testTriggerUpdates() {
81         Node node = mock(Node.class);
82         when(node.getAugmentation(OvsdbNodeAugmentation.class)).thenReturn(mock(OvsdbNodeAugmentation.class));
83
84         List<Node> nodes = new ArrayList<>();
85         nodes.add(mock(Node.class));
86         when(southbound.readOvsdbTopologyNodes()).thenReturn(nodes);
87
88         southboundHandlerSpy.triggerUpdates();
89         verify(southboundHandlerSpy, times(1)).ovsdbUpdate(any(Node.class), any(DataObject.class), any(OvsdbInventoryListener.OvsdbType.class), any(Action.class));
90
91     }
92
93     @Test
94     public void testNotifyNode() {
95         when(southbound.getBridge(any(Node.class))).thenReturn(mock(OvsdbBridgeAugmentation.class));
96
97         NetworkingProvider networkingProvider = mock(NetworkingProvider.class);
98         when(networkingProviderManager.getProvider(any(Node.class))).thenReturn(networkingProvider);
99
100         southboundHandlerSpy.notifyNode(mock(Node.class), Action.ADD);
101
102         verify(networkingProvider, times(1)).initializeOFFlowRules(any(Node.class));
103     }
104
105     @Test
106     public void testProcessEvent() {
107         SouthboundEvent ev = mock(SouthboundEvent.class);
108         Node node = mock(Node.class);
109
110         // NODE
111         when(ev.getNode()).thenReturn(node);
112         when(ev.getAugmentationData()).thenReturn(mock(OvsdbNodeAugmentation.class));
113         when(ev.getType()).thenReturn(SouthboundEvent.Type.NODE);
114
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);
120
121         when(ev.getAction()).thenReturn(Action.UPDATE);
122         southboundHandler.processEvent(ev);
123         verify(nodeCacheManager, times(1)).nodeAdded(any(Node.class));
124         Mockito.reset(nodeCacheManager);
125
126         when(ev.getAction()).thenReturn(Action.DELETE);
127         southboundHandler.processEvent(ev);
128         verify(nodeCacheManager, times(1)).nodeRemoved(any(Node.class));
129         Mockito.reset(nodeCacheManager);
130
131         Mockito.reset(ev);
132
133         // BRIDGE
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);
138
139         when(ev.getNode()).thenReturn(node);
140         when(ev.getAugmentationData()).thenReturn(br);
141         when(ev.getType()).thenReturn(SouthboundEvent.Type.BRIDGE);
142
143         when(southbound.getDatapathId(any(OvsdbBridgeAugmentation.class))).thenReturn("45");
144
145         when(ev.getAction()).thenReturn(Action.ADD);
146         southboundHandler.processEvent(ev);
147         verify(nodeCacheManager, times(1)).nodeAdded(any(Node.class));
148         Mockito.reset(nodeCacheManager);
149
150         when(ev.getAction()).thenReturn(Action.UPDATE);
151         southboundHandler.processEvent(ev);
152         verify(nodeCacheManager, times(1)).nodeAdded(any(Node.class));
153         Mockito.reset(nodeCacheManager);
154
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);
170
171         Mockito.reset(ev);
172
173         // PORT
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);
181
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);
188
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);
195
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);
204
205 //        List<String> phyIfName = new ArrayList<String>();
206 //        phyIfName.add("network");
207 //        when(bridgeConfigurationManager.getAllPhysicalInterfaceNames(any(Node.class))).thenReturn(phyIfName);
208 //
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());
213 //
214 //        Mockito.reset(networkingProvider);
215 //
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);
226 //
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());
230
231         // OPENVSWITCH
232         when(ev.getNode()).thenReturn(node);
233         when(ev.getAugmentationData()).thenReturn(ovsdbTerminationPointAugmentation);
234         when(ev.getType()).thenReturn(SouthboundEvent.Type.OPENVSWITCH);
235
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);
240     }
241
242     @Test
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);
254
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);
265
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);
277     }
278
279     private Object getField(String fieldName) throws Exception {
280         Field field = SouthboundHandler.class.getDeclaredField(fieldName);
281         field.setAccessible(true);
282         return field.get(southboundHandler);
283     }
284 }