BUG-4892:fixed Not getting Arp flows if there is no Router
[ovsdb.git] / openstack / net-virt / src / test / java / org / opendaylight / ovsdb / 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.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.mockito.runners.MockitoJUnitRunner;
29 import org.opendaylight.ovsdb.openstack.netvirt.translator.NeutronNetwork;
30 import org.opendaylight.ovsdb.openstack.netvirt.SouthboundEvent.Type;
31 import org.opendaylight.ovsdb.openstack.netvirt.api.Action;
32 import org.opendaylight.ovsdb.openstack.netvirt.api.BridgeConfigurationManager;
33 import org.opendaylight.ovsdb.openstack.netvirt.api.ConfigurationService;
34 import org.opendaylight.ovsdb.openstack.netvirt.api.EventDispatcher;
35 import org.opendaylight.ovsdb.openstack.netvirt.api.NetworkingProvider;
36 import org.opendaylight.ovsdb.openstack.netvirt.api.NetworkingProviderManager;
37 import org.opendaylight.ovsdb.openstack.netvirt.api.NodeCacheManager;
38 import org.opendaylight.ovsdb.openstack.netvirt.api.OvsdbInventoryListener.OvsdbType;
39 import org.opendaylight.ovsdb.openstack.netvirt.api.OvsdbInventoryService;
40 import org.opendaylight.ovsdb.openstack.netvirt.api.Southbound;
41 import org.opendaylight.ovsdb.openstack.netvirt.api.TenantNetworkManager;
42 import org.opendaylight.ovsdb.openstack.netvirt.impl.DistributedArpService;
43 import org.opendaylight.ovsdb.openstack.netvirt.impl.NeutronL3Adapter;
44 import org.opendaylight.ovsdb.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.OvsdbNodeAugmentation;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation;
48 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
49 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
50 import org.opendaylight.yangtools.yang.binding.DataObject;
51 import org.osgi.framework.ServiceReference;
52
53 /**
54  * Unit test fort {@link SouthboundHandler}
55  */
56 @RunWith(MockitoJUnitRunner.class)
57 public class SouthboundHandlerTest {
58
59     @InjectMocks private SouthboundHandler southboundHandler;
60     private SouthboundHandler southboundHandlerSpy;
61
62     @Mock private ConfigurationService configurationService;
63     @Mock private BridgeConfigurationManager bridgeConfigurationManager;
64     @Mock private TenantNetworkManager tenantNetworkManager;
65     @Mock private NetworkingProviderManager networkingProviderManager;
66     @Mock private DistributedArpService distributedArpService;
67     @Mock private NeutronL3Adapter neutronL3Adapter;
68     @Mock private NodeCacheManager nodeCacheManager;
69     @Mock private OvsdbInventoryService ovsdbInventoryService;
70     @Mock private Southbound southbound;
71
72     @Before
73     public void setUp() {
74         southboundHandler.eventDispatcher = mock(EventDispatcher.class);
75         southboundHandlerSpy = Mockito.spy(southboundHandler);
76     }
77
78     @Test
79     public void testTriggerUpdates() {
80         Node node = mock(Node.class);
81         when(node.getAugmentation(OvsdbNodeAugmentation.class)).thenReturn(mock(OvsdbNodeAugmentation.class));
82
83         List<Node> nodes = new ArrayList<>();
84         nodes.add(mock(Node.class));
85         when(southbound.readOvsdbTopologyNodes()).thenReturn(nodes);
86
87         southboundHandlerSpy.triggerUpdates();
88         verify(southboundHandlerSpy, times(1)).ovsdbUpdate(any(Node.class), any(DataObject.class), any(OvsdbType.class), any(Action.class));
89
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(distributedArpService, times(1)).processInterfaceEvent(any(Node.class), any(OvsdbTerminationPointAugmentation.class), any(NeutronNetwork.class), any(Action.class));
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(distributedArpService);
181         Mockito.reset(neutronL3Adapter);
182         Mockito.reset(networkingProvider);
183
184         when(ev.getAction()).thenReturn(Action.UPDATE);
185         southboundHandler.processEvent(ev);
186         verify(distributedArpService, times(1)).processInterfaceEvent(any(Node.class), any(OvsdbTerminationPointAugmentation.class), any(NeutronNetwork.class), any(Action.class));
187         verify(neutronL3Adapter, times(1)).handleInterfaceEvent(any(Node.class), any(OvsdbTerminationPointAugmentation.class), any(NeutronNetwork.class), any(Action.class));
188         verify(networkingProvider, times(1)).handleInterfaceUpdate(any(NeutronNetwork.class), any(Node.class), any(OvsdbTerminationPointAugmentation.class));
189         Mockito.reset(neutronL3Adapter);
190         Mockito.reset(distributedArpService);
191         Mockito.reset(networkingProvider);
192
193 //        List<String> phyIfName = new ArrayList<String>();
194 //        phyIfName.add("network");
195 //        when(bridgeConfigurationManager.getAllPhysicalInterfaceNames(any(Node.class))).thenReturn(phyIfName);
196 //
197 //        when(ev.getAction()).thenReturn(Action.DELETE); //isInterfaceOfIntereset true
198 //        southboundHandler.processEvent(ev);
199 //        verify(neutronL3Adapter, times(1)).handleInterfaceEvent(any(Node.class), any(OvsdbTerminationPointAugmentation.class), any(NeutronNetwork.class), any(Action.class));
200 //        verify(networkingProvider, times(1)).handleInterfaceDelete(anyString(), any(NeutronNetwork.class), any(Node.class), any(OvsdbTerminationPointAugmentation.class), anyBoolean());
201 //
202 //        Mockito.reset(networkingProvider);
203 //
204 //        when(southbound.getBridge(any(Node.class))).thenReturn(mock(OvsdbBridgeAugmentation.class));
205 //        List<TerminationPoint> terminationPoints = new ArrayList<TerminationPoint>();
206 //        TerminationPoint terminationPoint =  mock(TerminationPoint.class);
207 //        OvsdbTerminationPointAugmentation ovsdbTerminationPointAugmentation2 = mock(OvsdbTerminationPointAugmentation.class);
208 //        when(terminationPoint.getAugmentation(any(Class.class))).thenReturn(ovsdbTerminationPointAugmentation);
209 //        Uuid uuid = mock(Uuid.class);
210 //        when(ovsdbTerminationPointAugmentation.getInterfaceUuid()).thenReturn(uuid);
211 //        when(ovsdbTerminationPointAugmentation2.getInterfaceUuid()).thenReturn(uuid);
212 //        terminationPoints.add(terminationPoint);
213 //        when(node.getTerminationPoint()).thenReturn(terminationPoints);
214 //
215 //        when(ev.getAction()).thenReturn(Action.DELETE); //isInterfaceOfIntereset false - network != null
216 //        southboundHandler.processEvent(ev);
217 //        verify(networkingProvider, times(1)).handleInterfaceDelete(anyString(), any(NeutronNetwork.class), any(Node.class), any(OvsdbTerminationPointAugmentation.class), anyBoolean());
218
219         // OPENVSWITCH
220         when(ev.getNode()).thenReturn(node);
221         when(ev.getAugmentationData()).thenReturn(ovsdbTerminationPointAugmentation);
222         when(ev.getType()).thenReturn(Type.OPENVSWITCH);
223
224         when(ovsdbTerminationPointAugmentation.getName()).thenReturn("network");
225         List<TerminationPoint> terminationPoints = new ArrayList<>();
226         terminationPoints.add(mock(TerminationPoint.class));
227         when(southbound.extractTerminationPoints(any(Node.class))).thenReturn(terminationPoints);
228
229         when(ev.getAction()).thenReturn(Action.ADD);
230         southboundHandler.processEvent(ev);
231         verify(distributedArpService, times(1)).processInterfaceEvent(any(Node.class), any(OvsdbTerminationPointAugmentation.class), any(NeutronNetwork.class), any(Action.class));
232         verify(neutronL3Adapter, times(1)).handleInterfaceEvent(any(Node.class), any(OvsdbTerminationPointAugmentation.class), any(NeutronNetwork.class), any(Action.class));
233         verify(networkingProvider, times(1)).handleInterfaceUpdate(any(NeutronNetwork.class), any(Node.class), any(OvsdbTerminationPointAugmentation.class));
234         Mockito.reset(distributedArpService);
235         Mockito.reset(neutronL3Adapter);
236         Mockito.reset(networkingProvider);
237     }
238
239     @Test
240     public void testSetDependencies() throws Exception {
241         ConfigurationService configurationService = mock(ConfigurationService.class);
242         NetworkingProviderManager networkingProviderManager = mock(NetworkingProviderManager.class);
243         TenantNetworkManager tenantNetworkManager = mock(TenantNetworkManager.class);
244         BridgeConfigurationManager bridgeConfigurationManager = mock(BridgeConfigurationManager.class);
245         NodeCacheManager nodeCacheManager = mock(NodeCacheManager.class);
246         NeutronL3Adapter neutronL3Adapter = mock(NeutronL3Adapter.class);
247         DistributedArpService distributedArpService = mock(DistributedArpService.class);
248         Southbound southbound = mock(Southbound.class);
249         EventDispatcher eventDispatcher = mock(EventDispatcher.class);
250         OvsdbInventoryService ovsdbInventoryService = mock(OvsdbInventoryService.class);
251
252         ServiceHelper.overrideGlobalInstance(ConfigurationService.class, configurationService);
253         ServiceHelper.overrideGlobalInstance(NetworkingProviderManager.class, networkingProviderManager);
254         ServiceHelper.overrideGlobalInstance(TenantNetworkManager.class, tenantNetworkManager);
255         ServiceHelper.overrideGlobalInstance(BridgeConfigurationManager.class, bridgeConfigurationManager);
256         ServiceHelper.overrideGlobalInstance(NodeCacheManager.class, nodeCacheManager);
257         ServiceHelper.overrideGlobalInstance(DistributedArpService.class, distributedArpService);
258         ServiceHelper.overrideGlobalInstance(NeutronL3Adapter.class, neutronL3Adapter);
259         ServiceHelper.overrideGlobalInstance(Southbound.class, southbound);
260         ServiceHelper.overrideGlobalInstance(EventDispatcher.class, eventDispatcher);
261         ServiceHelper.overrideGlobalInstance(OvsdbInventoryService.class, ovsdbInventoryService);
262
263         southboundHandler.setDependencies(mock(ServiceReference.class));
264         assertEquals("Error, did not return the correct object", getField("configurationService"), configurationService);
265         assertEquals("Error, did not return the correct object", getField("networkingProviderManager"), networkingProviderManager);
266         assertEquals("Error, did not return the correct object", getField("tenantNetworkManager"), tenantNetworkManager);
267         assertEquals("Error, did not return the correct object", getField("bridgeConfigurationManager"), bridgeConfigurationManager);
268         assertEquals("Error, did not return the correct object", getField("nodeCacheManager"), nodeCacheManager);
269         assertEquals("Error, did not return the correct object", getField("distributedArpService"), distributedArpService);
270         assertEquals("Error, did not return the correct object", getField("neutronL3Adapter"), neutronL3Adapter);
271         assertEquals("Error, did not return the correct object", getField("southbound"), southbound);
272         assertEquals("Error, did not return the correct object", getField("ovsdbInventoryService"), ovsdbInventoryService);
273         assertEquals("Error, did not return the correct object", southboundHandler.eventDispatcher, eventDispatcher);
274     }
275
276     private Object getField(String fieldName) throws Exception {
277         Field field = SouthboundHandler.class.getDeclaredField(fieldName);
278         field.setAccessible(true);
279         return field.get(southboundHandler);
280     }
281 }