Add UT for SouthboundMapper and SouthboundProvider
[netvirt.git] / openstack / net-virt / src / test / java / org / opendaylight / ovsdb / openstack / netvirt / SouthboundHandlerTest.java
1 /*
2  * Copyright (c) 2015 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.ovsdb.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.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;
54
55 /**
56  * Unit test fort {@link SouthboundHandler}
57  */
58 @RunWith(PowerMockRunner.class)
59 @PrepareForTest(ServiceHelper.class)
60 public class SouthboundHandlerTest {
61
62     @InjectMocks private SouthboundHandler southboundHandler;
63     private SouthboundHandler southboundHandlerSpy;
64
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;
73
74     @Before
75     public void setUp() {
76         southboundHandler.eventDispatcher = mock(EventDispatcher.class);
77         southboundHandlerSpy = Mockito.spy(southboundHandler);
78     }
79
80     @Test
81     public void testTriggerUpdates() {
82         Node node = mock(Node.class);
83         when(node.getAugmentation(OvsdbNodeAugmentation.class)).thenReturn(mock(OvsdbNodeAugmentation.class));
84
85         List<Node> nodes = new ArrayList<Node>();
86         nodes.add(mock(Node.class));
87         when(southbound.readOvsdbTopologyNodes()).thenReturn(nodes);
88
89         southboundHandlerSpy.triggerUpdates();
90         verify(southboundHandlerSpy, times(1)).ovsdbUpdate(any(Node.class), any(DataObject.class), any(OvsdbType.class), any(Action.class));;
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(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         when(ev.getNode()).thenReturn(node);
135         when(ev.getAugmentationData()).thenReturn(mock(OvsdbBridgeAugmentation.class));
136         when(ev.getType()).thenReturn(Type.BRIDGE);
137
138         when(southbound.getDatapathId(any(OvsdbBridgeAugmentation.class))).thenReturn("45");
139
140         when(ev.getAction()).thenReturn(Action.ADD);
141         southboundHandler.processEvent(ev);
142         verify(nodeCacheManager, times(1)).nodeAdded(any(Node.class));
143         Mockito.reset(nodeCacheManager);
144
145         when(ev.getAction()).thenReturn(Action.UPDATE);
146         southboundHandler.processEvent(ev);
147         verify(nodeCacheManager, times(1)).nodeAdded(any(Node.class));
148         Mockito.reset(nodeCacheManager);
149
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);
157
158         Mockito.reset(ev);
159
160         // PORT
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);
168
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);
175
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);
182
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);
189
190 //        List<String> phyIfName = new ArrayList<String>();
191 //        phyIfName.add("network");
192 //        when(bridgeConfigurationManager.getAllPhysicalInterfaceNames(any(Node.class))).thenReturn(phyIfName);
193 //
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());
198 //
199 //        Mockito.reset(networkingProvider);
200 //
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);
211 //
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());
215
216         // OPENVSWITCH
217         when(ev.getNode()).thenReturn(node);
218         when(ev.getAugmentationData()).thenReturn(ovsdbTerminationPointAugmentation);
219         when(ev.getType()).thenReturn(Type.OPENVSWITCH);
220
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);
225
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);
232     }
233
234     @Test
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);
245
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);
256
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);
267     }
268
269     private Object getField(String fieldName) throws Exception {
270         Field field = SouthboundHandler.class.getDeclaredField(fieldName);
271         field.setAccessible(true);
272         return field.get(southboundHandler);
273     }
274 }