Merge "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.ServiceReference;
50 import org.powermock.api.mockito.PowerMockito;
51 import org.powermock.core.classloader.annotations.PrepareForTest;
52 import org.powermock.modules.junit4.PowerMockRunner;
53
54 /**
55  * Unit test fort {@link SouthboundHandler}
56  */
57 @RunWith(PowerMockRunner.class)
58 @PrepareForTest(ServiceHelper.class)
59 public class SouthboundHandlerTest {
60
61     @InjectMocks private SouthboundHandler southboundHandler;
62     private SouthboundHandler southboundHandlerSpy;
63
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;
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<Node>();
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(OvsdbType.class), any(Action.class));;
90     }
91
92     @Test
93     public void testNotifyNode() {
94         when(southbound.getBridge(any(Node.class))).thenReturn(mock(OvsdbBridgeAugmentation.class));
95
96         NetworkingProvider networkingProvider = mock(NetworkingProvider.class);
97         when(networkingProviderManager.getProvider(any(Node.class))).thenReturn(networkingProvider);
98
99         southboundHandlerSpy.notifyNode(mock(Node.class), Action.ADD);
100
101         verify(networkingProvider, times(1)).initializeOFFlowRules(any(Node.class));
102     }
103
104     @Test
105     public void testProcessEvent() {
106         SouthboundEvent ev = mock(SouthboundEvent.class);
107         Node node = mock(Node.class);
108
109         // NODE
110         when(ev.getNode()).thenReturn(node);
111         when(ev.getAugmentationData()).thenReturn(mock(OvsdbNodeAugmentation.class));
112         when(ev.getType()).thenReturn(Type.NODE);
113
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);
119
120         when(ev.getAction()).thenReturn(Action.UPDATE);
121         southboundHandler.processEvent(ev);
122         verify(nodeCacheManager, times(1)).nodeAdded(any(Node.class));
123         Mockito.reset(nodeCacheManager);
124
125         when(ev.getAction()).thenReturn(Action.DELETE);
126         southboundHandler.processEvent(ev);
127         verify(nodeCacheManager, times(1)).nodeRemoved(any(Node.class));
128         Mockito.reset(nodeCacheManager);
129
130         Mockito.reset(ev);
131
132         // BRIDGE
133         when(ev.getNode()).thenReturn(node);
134         when(ev.getAugmentationData()).thenReturn(mock(OvsdbBridgeAugmentation.class));
135         when(ev.getType()).thenReturn(Type.BRIDGE);
136
137         when(southbound.getDatapathId(any(OvsdbBridgeAugmentation.class))).thenReturn("45");
138
139         when(ev.getAction()).thenReturn(Action.ADD);
140         southboundHandler.processEvent(ev);
141         verify(nodeCacheManager, times(1)).nodeAdded(any(Node.class));
142         Mockito.reset(nodeCacheManager);
143
144         when(ev.getAction()).thenReturn(Action.UPDATE);
145         southboundHandler.processEvent(ev);
146         verify(nodeCacheManager, times(1)).nodeAdded(any(Node.class));
147         Mockito.reset(nodeCacheManager);
148
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);
156
157         Mockito.reset(ev);
158
159         // PORT
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);
167
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);
174
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);
181
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);
188
189 //        List<String> phyIfName = new ArrayList<String>();
190 //        phyIfName.add("network");
191 //        when(bridgeConfigurationManager.getAllPhysicalInterfaceNames(any(Node.class))).thenReturn(phyIfName);
192 //
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());
197 //
198 //        Mockito.reset(networkingProvider);
199 //
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);
210 //
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());
214
215         // OPENVSWITCH
216         when(ev.getNode()).thenReturn(node);
217         when(ev.getAugmentationData()).thenReturn(ovsdbTerminationPointAugmentation);
218         when(ev.getType()).thenReturn(Type.OPENVSWITCH);
219
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);
224
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);
231     }
232
233     @Test
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);
244
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);
255
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);
266     }
267
268     private Object getField(String fieldName) throws Exception {
269         Field field = SouthboundHandler.class.getDeclaredField(fieldName);
270         field.setAccessible(true);
271         return field.get(southboundHandler);
272     }
273 }