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.ovsdb.openstack.netvirt.impl;
11 import static org.junit.Assert.assertEquals;
12 import static org.mockito.Matchers.any;
13 import static org.mockito.Matchers.anyBoolean;
14 import static org.mockito.Matchers.anyInt;
15 import static org.mockito.Matchers.anyLong;
16 import static org.mockito.Matchers.anyString;
17 import static org.mockito.Matchers.eq;
18 import static org.mockito.Mockito.mock;
19 import static org.mockito.Mockito.times;
20 import static org.mockito.Mockito.when;
22 import java.lang.reflect.Constructor;
23 import java.lang.reflect.Field;
24 import java.net.InetAddress;
25 import java.util.ArrayList;
26 import java.util.HashMap;
27 import java.util.HashSet;
28 import java.util.List;
32 import org.apache.commons.lang3.tuple.Pair;
33 import org.junit.Before;
34 import org.junit.Test;
35 import org.junit.runner.RunWith;
36 import org.mockito.Mock;
37 import org.mockito.Mockito;
38 import org.opendaylight.ovsdb.openstack.netvirt.translator.NeutronFloatingIP;
39 import org.opendaylight.ovsdb.openstack.netvirt.translator.NeutronNetwork;
40 import org.opendaylight.ovsdb.openstack.netvirt.translator.NeutronPort;
41 import org.opendaylight.ovsdb.openstack.netvirt.translator.NeutronRouter;
42 import org.opendaylight.ovsdb.openstack.netvirt.translator.NeutronRouter_Interface;
43 import org.opendaylight.ovsdb.openstack.netvirt.translator.NeutronSubnet;
44 import org.opendaylight.ovsdb.openstack.netvirt.translator.Neutron_IPs;
45 import org.opendaylight.ovsdb.openstack.netvirt.translator.crud.INeutronNetworkCRUD;
46 import org.opendaylight.ovsdb.openstack.netvirt.translator.crud.INeutronPortCRUD;
47 import org.opendaylight.ovsdb.openstack.netvirt.translator.crud.INeutronSubnetCRUD;
48 import org.opendaylight.ovsdb.openstack.netvirt.AbstractHandler;
49 import org.opendaylight.ovsdb.openstack.netvirt.api.Action;
50 import org.opendaylight.ovsdb.openstack.netvirt.api.ArpProvider;
51 import org.opendaylight.ovsdb.openstack.netvirt.api.ConfigurationService;
52 import org.opendaylight.ovsdb.openstack.netvirt.api.EventDispatcher;
53 import org.opendaylight.ovsdb.openstack.netvirt.api.InboundNatProvider;
54 import org.opendaylight.ovsdb.openstack.netvirt.api.L3ForwardingProvider;
55 import org.opendaylight.ovsdb.openstack.netvirt.api.NodeCacheManager;
56 import org.opendaylight.ovsdb.openstack.netvirt.api.OutboundNatProvider;
57 import org.opendaylight.ovsdb.openstack.netvirt.api.RoutingProvider;
58 import org.opendaylight.ovsdb.openstack.netvirt.api.Southbound;
59 import org.opendaylight.ovsdb.openstack.netvirt.api.Status;
60 import org.opendaylight.ovsdb.openstack.netvirt.api.StatusCode;
61 import org.opendaylight.ovsdb.openstack.netvirt.api.TenantNetworkManager;
62 import org.opendaylight.ovsdb.utils.servicehelper.ServiceHelper;
63 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation;
66 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
67 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
69 import org.osgi.framework.ServiceReference;
70 import org.powermock.api.mockito.PowerMockito;
71 import org.powermock.api.support.membermodification.MemberMatcher;
72 import org.powermock.api.support.membermodification.MemberModifier;
73 import org.powermock.core.classloader.annotations.PrepareForTest;
74 import org.powermock.modules.junit4.PowerMockRunner;
75 import org.powermock.reflect.Whitebox;
78 * Unit test for {@link NeutronL3Adapter}
80 @PrepareForTest({ServiceHelper.class, InetAddress.class, NeutronL3Adapter.class, DistributedArpService.class})
81 @RunWith(PowerMockRunner.class)
82 public class NeutronL3AdapterTest {
84 @Mock private NeutronL3Adapter neutronL3Adapter;
85 @Mock private DistributedArpService distributedArpService;
87 private static final String ID = "45";
88 private static final String IP = "127.0.0.1";
89 private static final String MALFORM_IP = "127.0.0.1.5";
90 private static final String INTF_NAME = "br-int";
91 private static final String EXTERNAL_ROUTER_MAC_UPDATE = "";
92 private static final String UUID = "7da709ff-397f-4778-a0e8-994811272fdb";
93 private static final String FIXED_IP_ADDRESS = "192.168.1.0";
94 private static final String FLOATING_IP_ADDRESS = "192.168.1.1";
95 private static final String OWNER_ROUTER_INTERFACE = "network:router_interface";
96 private static final String OWNER_FLOATING_IP = "network:floatingip";
97 private static final String MAC_ADDRESS = "00:00:5E:00:02:01";
98 private static final String MAC_ADDRESS_2 = "00:00:5E:00:02:02";
99 private static final String PORT_INT = "port_int";
100 private static final String SEG_ID = "2";
101 private static final String CIDR = "192.168.100.0/24";
102 private static final String OFPort = "OFPort|45";
103 private static final String IP_MASK = "127.0.0.1/32";
105 @SuppressWarnings("rawtypes")
106 private Class floatingIpClass;
107 private Object floatingIpObject;
110 public void setUp() throws Exception{
111 neutronL3Adapter = PowerMockito.mock(NeutronL3Adapter.class, Mockito.CALLS_REAL_METHODS);
112 Whitebox.setInternalState(neutronL3Adapter, "distributedArpService", distributedArpService);
113 // init instance variables
114 MemberModifier.field(NeutronL3Adapter.class, "enabled").set(neutronL3Adapter, true);
116 // floating ip (nested private class from NeutronL3Adapter)
117 floatingIpClass = Whitebox.getInnerClassType(NeutronL3Adapter.class, "FloatIpData");
118 floatingIpObject = createFloatingIpObject();
122 public void testUpdateExternalRouterMac() throws Exception {
123 // Suppress the called to these functions
124 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "flushExistingIpRewrite"));
125 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "rebuildExistingIpRewrite"));
127 neutronL3Adapter.updateExternalRouterMac(EXTERNAL_ROUTER_MAC_UPDATE);
129 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("flushExistingIpRewrite");
130 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("rebuildExistingIpRewrite");
134 public void testhandleNeutronSubnetEvent() throws Exception {
135 Map<String,NeutronNetwork> networkCleanupCache = new HashMap<>();
136 INeutronNetworkCRUD neutronNetworkCache = mock(INeutronNetworkCRUD.class);
137 NeutronNetwork neutronNetwork = mock(NeutronNetwork.class);
138 when(neutronNetworkCache.getNetwork(anyString())).thenReturn(neutronNetwork);
140 MemberModifier.field(NeutronL3Adapter.class, "networkCleanupCache").set(neutronL3Adapter , networkCleanupCache);
141 MemberModifier.field(NeutronL3Adapter.class, "neutronNetworkCache").set(neutronL3Adapter , neutronNetworkCache);
142 neutronL3Adapter.handleNeutronSubnetEvent(mock(NeutronSubnet.class), Action.ADD);
146 public void testHandleNeutronPortEvent() throws Exception {
147 Map<String, NeutronRouter_Interface> subnetIdToRouterInterfaceCache = new HashMap<>();
148 Map<String,NeutronPort> portCleanupCache = new HashMap<>();
150 Neutron_IPs neutronIP = mock(Neutron_IPs.class);
151 when(neutronIP.getSubnetUUID()).thenReturn(UUID);
152 List<Neutron_IPs> list_neutronIP = new ArrayList<>();
153 list_neutronIP.add(neutronIP);
154 NeutronPort neutronPort = mock(NeutronPort.class);
155 when(neutronPort.getDeviceOwner()).thenReturn(OWNER_ROUTER_INTERFACE);
156 when(neutronPort.getFixedIPs()).thenReturn(list_neutronIP);
158 // init instance variables
159 MemberModifier.field(NeutronL3Adapter.class, "neutronPortCache").set(neutronL3Adapter , mock(INeutronPortCRUD.class));
160 subnetIdToRouterInterfaceCache.put(UUID, mock(NeutronRouter_Interface.class));
161 MemberModifier.field(NeutronL3Adapter.class, "subnetIdToRouterInterfaceCache").set(neutronL3Adapter , subnetIdToRouterInterfaceCache);
162 MemberModifier.field(NeutronL3Adapter.class, "portCleanupCache").set(neutronL3Adapter , portCleanupCache);
164 // Suppress the called to these functions
165 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "updateL3ForNeutronPort", NeutronPort.class, boolean.class));
166 Mockito.doNothing().when(neutronL3Adapter).handleNeutronRouterInterfaceEvent(any(NeutronRouter.class), any(NeutronRouter_Interface.class), any(Action.class));
168 neutronL3Adapter.handleNeutronPortEvent(neutronPort, Action.ADD);
169 Mockito.verify(neutronL3Adapter).handleNeutronRouterInterfaceEvent(any(NeutronRouter.class), any(NeutronRouter_Interface.class), eq(Action.ADD));
171 when(neutronPort.getDeviceOwner()).thenReturn("");
172 neutronL3Adapter.handleNeutronPortEvent(neutronPort, Action.ADD);
173 Mockito.verify(neutronL3Adapter, times(2)).handleNeutronRouterInterfaceEvent(any(NeutronRouter.class), any(NeutronRouter_Interface.class), eq(Action.ADD));
174 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("updateL3ForNeutronPort", any(NeutronPort.class), eq(false));
176 neutronL3Adapter.handleNeutronPortEvent(neutronPort, Action.DELETE);
177 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("updateL3ForNeutronPort", any(NeutronPort.class), eq(true));
181 public void testhandleNeutronRouterEvent() throws Exception {
182 // Nothing to be done here
183 neutronL3Adapter.handleNeutronRouterEvent(mock(NeutronRouter.class), Action.ADD);
187 public void testHandleNeutronRouterInterfaceEvent() throws Exception {
189 NeutronRouter_Interface neutronRouterInterface = mock(NeutronRouter_Interface.class);
190 when(neutronRouterInterface.getPortUUID()).thenReturn(UUID);
191 when(neutronRouterInterface.getSubnetUUID()).thenReturn(UUID);
193 Neutron_IPs neutronIP = mock(Neutron_IPs.class);
194 when(neutronIP.getSubnetUUID()).thenReturn(UUID);
195 NeutronPort neutronPort = mock(NeutronPort.class);
196 List<Neutron_IPs> list_neutronIP = new ArrayList<>();
197 list_neutronIP.add(neutronIP);
198 when(neutronPort.getFixedIPs()).thenReturn(list_neutronIP);
199 List<NeutronPort> list_neutronPort = new ArrayList<>();
200 list_neutronPort.add(neutronPort);
201 INeutronPortCRUD neutronPortCache = mock(INeutronPortCRUD.class);
202 when(neutronPortCache.getAllPorts()).thenReturn(list_neutronPort);
204 // init instance variables
205 MemberModifier.field(NeutronL3Adapter.class, "neutronPortCache").set(neutronL3Adapter , neutronPortCache);
207 // Suppress the called to these functions
208 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programFlowsForNeutronRouterInterface", NeutronRouter_Interface.class, Boolean.class));
209 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "updateL3ForNeutronPort", NeutronPort.class, boolean.class));
211 neutronL3Adapter.handleNeutronRouterInterfaceEvent(mock(NeutronRouter.class), neutronRouterInterface, Action.ADD);
212 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programFlowsForNeutronRouterInterface", any(NeutronRouter_Interface.class), eq(false));
213 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("updateL3ForNeutronPort", any(NeutronPort.class), eq(false));
215 neutronL3Adapter.handleNeutronRouterInterfaceEvent(mock(NeutronRouter.class), neutronRouterInterface, Action.DELETE);
216 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programFlowsForNeutronRouterInterface", any(NeutronRouter_Interface.class), eq(true));
217 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("updateL3ForNeutronPort", any(NeutronPort.class), eq(true));
221 public void testHandleNeutronFloatingIPEvent() throws Exception {
223 NeutronFloatingIP neutronFloatingIP = mock(NeutronFloatingIP.class);
224 when(neutronFloatingIP.getFixedIPAddress()).thenReturn(FIXED_IP_ADDRESS);
225 when(neutronFloatingIP.getFloatingIPAddress()).thenReturn(FLOATING_IP_ADDRESS);
226 when(neutronFloatingIP.getID()).thenReturn(UUID);
228 // Suppress the called to these functions
229 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programFlowsForFloatingIPArpAdd", NeutronFloatingIP.class));
230 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programFlowsForFloatingIPInbound", NeutronFloatingIP.class, Action.class));
231 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programFlowsForFloatingIPOutbound", NeutronFloatingIP.class, Action.class));
232 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programFlowsForFloatingIPArpDelete", String.class));
234 neutronL3Adapter.handleNeutronFloatingIPEvent(neutronFloatingIP, Action.ADD);
235 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programFlowsForFloatingIPArpAdd", any(NeutronFloatingIP.class));
236 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programFlowsForFloatingIPInbound", any(NeutronFloatingIP.class), eq(Action.ADD));
237 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programFlowsForFloatingIPOutbound", any(NeutronFloatingIP.class), eq(Action.ADD));
239 neutronL3Adapter.handleNeutronFloatingIPEvent(neutronFloatingIP, Action.DELETE);
240 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programFlowsForFloatingIPArpDelete", anyString());
241 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programFlowsForFloatingIPInbound", any(NeutronFloatingIP.class), eq(Action.DELETE));
242 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programFlowsForFloatingIPOutbound", any(NeutronFloatingIP.class), eq(Action.DELETE));
245 @SuppressWarnings({ "unchecked", "rawtypes" })
247 public void testProgramFlowsForFloatingIPInbound() throws Exception {
248 Map floatIpDataMapCache = new HashMap();
250 NeutronFloatingIP neutronFloatingIp = mock(NeutronFloatingIP.class);
251 when(neutronFloatingIp.getID()).thenReturn(ID);
253 // init instance variables
254 floatIpDataMapCache .put(ID, floatingIpObject);
255 MemberModifier.field(NeutronL3Adapter.class, "floatIpDataMapCache").set(neutronL3Adapter , floatIpDataMapCache);
257 // Suppress the called to these functions
258 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programInboundIpRewriteStage1", Long.class, Long.class, String.class, String.class, String.class, Action.class));
260 Whitebox.invokeMethod(neutronL3Adapter, "programFlowsForFloatingIPInbound", neutronFloatingIp, Action.ADD);
261 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programInboundIpRewriteStage1", anyLong(), anyLong(), anyString(), anyString(), anyString(), eq(Action.ADD));
264 @SuppressWarnings({ "unchecked", "rawtypes" })
266 public void testProgramFlowsForFloatingIPOutbound() throws Exception {
267 Map floatIpDataMapCache = new HashMap();
269 NeutronFloatingIP neutronFloatingIp = mock(NeutronFloatingIP.class);
270 when(neutronFloatingIp.getID()).thenReturn(ID);
272 // init instance variables
273 floatIpDataMapCache.put(ID, floatingIpObject);
274 MemberModifier.field(NeutronL3Adapter.class, "floatIpDataMapCache").set(neutronL3Adapter , floatIpDataMapCache);
276 // Suppress the called to these functions
277 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programOutboundIpRewriteStage1", floatingIpClass, Action.class));
279 Whitebox.invokeMethod(neutronL3Adapter, "programFlowsForFloatingIPOutbound", neutronFloatingIp, Action.ADD);
280 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programOutboundIpRewriteStage1", any(floatingIpClass), eq(Action.ADD));
283 @SuppressWarnings({ "unchecked", "rawtypes" })
285 public void testFlushExistingIpRewrite() throws Exception {
286 Map floatIpDataMapCache = new HashMap();
288 // init instance variables
289 floatIpDataMapCache.put(ID, floatingIpObject);
290 MemberModifier.field(NeutronL3Adapter.class, "floatIpDataMapCache").set(neutronL3Adapter , floatIpDataMapCache);
292 // Suppress the called to these functions
293 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programOutboundIpRewriteStage1", floatingIpClass, Action.class));
294 PowerMockito.doReturn(floatIpDataMapCache.values()).when(neutronL3Adapter, "getAllFloatingIPsWithMetadata");
295 Whitebox.invokeMethod(neutronL3Adapter, "flushExistingIpRewrite");
296 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programOutboundIpRewriteStage1", any(floatingIpClass), eq(Action.DELETE));
299 @SuppressWarnings({ "unchecked", "rawtypes" })
301 public void testRebuildExistingIpRewrite() throws Exception {
302 Map floatIpDataMapCache = new HashMap();
304 // init instance variables
305 floatIpDataMapCache.put(ID, floatingIpObject);
306 MemberModifier.field(NeutronL3Adapter.class, "floatIpDataMapCache").set(neutronL3Adapter , floatIpDataMapCache);
308 // Suppress the called to these functions
309 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programOutboundIpRewriteStage1", floatingIpClass, Action.class));
311 PowerMockito.doReturn(floatIpDataMapCache.values()).when(neutronL3Adapter, "getAllFloatingIPsWithMetadata");
312 Whitebox.invokeMethod(neutronL3Adapter, "rebuildExistingIpRewrite");
313 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programOutboundIpRewriteStage1", any(floatingIpClass), eq(Action.ADD));
316 @SuppressWarnings({ "unchecked", "rawtypes" })
318 public void testProgramFlowsForFloatingIPArpAdd() throws Exception {
319 Map<String, Pair> neutronPortToDpIdCache = new HashMap<>();
320 Map<String, String> networkIdToRouterMacCache = new HashMap<>();
321 Map floatIpDataMapCache = new HashMap();
323 NeutronFloatingIP neutronFloatingIP = mock(NeutronFloatingIP.class);
324 when(neutronFloatingIP.getFixedIPAddress()).thenReturn(FIXED_IP_ADDRESS);
325 when(neutronFloatingIP.getFloatingIPAddress()).thenReturn(FLOATING_IP_ADDRESS);
326 when(neutronFloatingIP.getPortUUID()).thenReturn(UUID);
327 NeutronPort neutronPort = mock(NeutronPort.class);
328 when(neutronPort.getMacAddress()).thenReturn(MAC_ADDRESS);
329 NeutronNetwork neutronNetwork = mock(NeutronNetwork.class);
330 when(neutronNetwork.getProviderSegmentationID()).thenReturn(ID);
331 when(neutronNetwork.getID()).thenReturn(ID);
333 // init instance variables
334 floatIpDataMapCache.put(ID, floatingIpObject);
335 neutronPortToDpIdCache.put(UUID, mock(Pair.class));
336 networkIdToRouterMacCache.put(ID, MAC_ADDRESS);
337 INeutronNetworkCRUD neutronNetworkCache = mock(INeutronNetworkCRUD.class);
338 when(neutronNetworkCache.getNetwork(anyString())).thenReturn(neutronNetwork);
339 INeutronPortCRUD neutronPortCache = mock(INeutronPortCRUD.class);
340 when(neutronPortCache.getPort(anyString())).thenReturn(neutronPort);
341 PowerMockito.doReturn(neutronPort).when(neutronL3Adapter, "findNeutronPortForFloatingIp", anyString());
342 PowerMockito.doReturn(15L).when(neutronL3Adapter, "findOFPortForExtPatch", anyLong());
343 MemberModifier.field(NeutronL3Adapter.class, "floatIpDataMapCache").set(neutronL3Adapter , floatIpDataMapCache);
344 MemberModifier.field(NeutronL3Adapter.class, "neutronPortToDpIdCache").set(neutronL3Adapter , neutronPortToDpIdCache);
345 MemberModifier.field(NeutronL3Adapter.class, "neutronPortCache").set(neutronL3Adapter , neutronPortCache);
346 MemberModifier.field(NeutronL3Adapter.class, "neutronNetworkCache").set(neutronL3Adapter , neutronNetworkCache);
347 MemberModifier.field(NeutronL3Adapter.class, "networkIdToRouterMacCache").set(neutronL3Adapter , networkIdToRouterMacCache);
349 // Suppress the called to these functions
350 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "findNeutronPortForFloatingIp", String.class));
351 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "findOFPortForExtPatch", Long.class));
353 Whitebox.invokeMethod(neutronL3Adapter, "programFlowsForFloatingIPArpAdd", neutronFloatingIP);
354 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("findNeutronPortForFloatingIp", anyString());
355 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("findOFPortForExtPatch", anyLong());
358 @SuppressWarnings({ "unchecked", "rawtypes" })
360 public void testProgramFlowsForFloatingIPArpDelete() throws Exception {
361 Map floatIpDataMapCache = new HashMap();
363 // init instance variables
364 floatIpDataMapCache.put(ID, floatingIpObject);
365 MemberModifier.field(NeutronL3Adapter.class, "floatIpDataMapCache").set(neutronL3Adapter , floatIpDataMapCache);
367 Whitebox.invokeMethod(neutronL3Adapter, "programFlowsForFloatingIPArpDelete", ID);
371 public void testFindNeutronPortForFloatingIp() throws Exception {
372 NeutronPort neutronPort = mock(NeutronPort.class);
373 when(neutronPort.getDeviceOwner()).thenReturn(OWNER_FLOATING_IP);
374 when(neutronPort.getDeviceID()).thenReturn(ID);
375 List<NeutronPort> list_neutronPort = new ArrayList<>();
376 list_neutronPort.add(neutronPort);
377 INeutronPortCRUD neutronPortCache = mock(INeutronPortCRUD.class);
378 when(neutronPortCache.getAllPorts()).thenReturn(list_neutronPort);
380 MemberModifier.field(NeutronL3Adapter.class, "neutronPortCache").set(neutronL3Adapter , neutronPortCache);
382 assertEquals("Error, did not return the correct NeutronPort", neutronPort, Whitebox.invokeMethod(neutronL3Adapter, "findNeutronPortForFloatingIp", ID));
386 public void testFindOFPortForExtPatch() throws Exception {
387 ConfigurationService configurationService = mock(ConfigurationService.class);
388 when(configurationService.getPatchPortName(any(Pair.class))).thenReturn(PORT_INT);
389 MemberModifier.field(NeutronL3Adapter.class, "configurationService").set(neutronL3Adapter , configurationService);
390 List<Node> nodes = new ArrayList<>();
391 nodes.add(mock(Node.class));
392 NodeCacheManager nodeCacheManager = mock(NodeCacheManager.class);
393 when(nodeCacheManager.getBridgeNodes()).thenReturn(nodes);
394 MemberModifier.field(NeutronL3Adapter.class, "nodeCacheManager").set(neutronL3Adapter , nodeCacheManager);
395 Southbound southbound = mock(Southbound.class);
396 when(southbound.getDataPathId(any(Node.class))).thenReturn(Long.valueOf(ID));
397 OvsdbTerminationPointAugmentation terminationPointOfBridge = mock(OvsdbTerminationPointAugmentation.class);
398 when(terminationPointOfBridge.getOfport()).thenReturn(Long.valueOf(ID));
399 when(southbound.getTerminationPointOfBridge(any(Node.class), anyString())).thenReturn(terminationPointOfBridge);
400 MemberModifier.field(NeutronL3Adapter.class, "southbound").set(neutronL3Adapter , southbound);
402 assertEquals("Error, did not return the correct NeutronPort", Long.valueOf(ID), Whitebox.invokeMethod(neutronL3Adapter, "findOFPortForExtPatch", Long.valueOf(ID)));
406 public void testHandleNeutronNetworkEvent() throws Exception {
407 // Nothing to be done here
408 Map<String,NeutronNetwork> networkCleanupCache = new HashMap<>();
410 MemberModifier.field(NeutronL3Adapter.class, "networkCleanupCache").set(neutronL3Adapter , networkCleanupCache);
411 Whitebox.invokeMethod(neutronL3Adapter, "handleNeutronNetworkEvent", mock(NeutronNetwork.class), Action.ADD);
415 public void testHandleInterfaceEvent() throws Exception {
416 Map<String, Pair<Long, Uuid>> neutronPortToDpIdCache = new HashMap<>();
417 // init instance variables
418 TenantNetworkManager tenantNetworkManager = mock(TenantNetworkManager.class);
419 MemberModifier.field(NeutronL3Adapter.class, "tenantNetworkManager").set(neutronL3Adapter , tenantNetworkManager);
420 MemberModifier.field(NeutronL3Adapter.class, "neutronPortToDpIdCache").set(neutronL3Adapter , neutronPortToDpIdCache);
423 NodeId nodeId = mock(NodeId.class);
424 when(nodeId.getValue()).thenReturn(ID);
425 Node node = mock(Node.class);
426 when(node.getNodeId()).thenReturn(nodeId);
428 OvsdbTerminationPointAugmentation intf = mock(OvsdbTerminationPointAugmentation.class);
429 when(intf.getInterfaceUuid()).thenReturn(mock(Uuid.class));
430 when(intf.getName()).thenReturn(INTF_NAME);
432 NeutronPort neutronPort = mock(NeutronPort.class);
433 when(neutronPort.getPortUUID()).thenReturn(UUID);
435 when(tenantNetworkManager.getTenantPort(intf)).thenReturn(neutronPort);
437 // Suppress the called to these functions
438 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "getDpidForIntegrationBridge", Node.class));
439 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "handleInterfaceEventAdd", String.class, Long.class, Uuid.class));
440 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "handleInterfaceEventDelete", OvsdbTerminationPointAugmentation.class, Long.class));
441 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "storePortInCleanupCache", NeutronPort.class));
443 PowerMockito.when(neutronL3Adapter, "getDpidForIntegrationBridge", any(Node.class)).thenReturn(45L);
444 Mockito.doNothing().when(neutronL3Adapter).handleNeutronPortEvent(any(NeutronPort.class), any(Action.class));
446 neutronL3Adapter.handleInterfaceEvent(node, intf, mock(NeutronNetwork.class), Action.ADD);
447 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("getDpidForIntegrationBridge", any(Node.class));
448 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("handleInterfaceEventAdd", any(String.class), anyLong(), any(Uuid.class));
449 Mockito.verify(neutronL3Adapter).handleNeutronPortEvent(neutronPort, Action.ADD);
451 neutronL3Adapter.handleInterfaceEvent(node, intf, mock(NeutronNetwork.class), Action.DELETE);
452 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("handleInterfaceEventDelete", any(OvsdbTerminationPointAugmentation.class), anyLong());
453 Mockito.verify(neutronL3Adapter).handleNeutronPortEvent(neutronPort, Action.DELETE);
457 public void testHandleInterfaceEventAdd() throws Exception {
458 Map<String, Pair<Long, Uuid>> neutronPortToDpIdCache = new HashMap<>();
459 // init instance variables
460 MemberModifier.field(NeutronL3Adapter.class, "neutronPortToDpIdCache").set(neutronL3Adapter , neutronPortToDpIdCache);
461 int temp = neutronPortToDpIdCache.size();
463 Whitebox.invokeMethod(neutronL3Adapter, "handleInterfaceEventAdd", "", Long.valueOf(5), mock(Uuid.class));
465 assertEquals("Error, did not add the port", temp+1, neutronPortToDpIdCache.size());
468 @SuppressWarnings("unchecked")
470 public void testHandleInterfaceEventDelete() throws Exception {
471 Map<String, Pair<Long, Uuid>> neutronPortToDpIdCache = new HashMap<>();
472 OvsdbTerminationPointAugmentation intf = mock(OvsdbTerminationPointAugmentation.class);
473 Uuid uuid = mock(Uuid.class);
474 when(intf.getInterfaceUuid()).thenReturn(uuid );
475 Pair<Long, Uuid> pair = mock(Pair.class);
476 when(pair.getRight()).thenReturn(uuid);
478 // init instance variables
479 neutronPortToDpIdCache.put("key", pair);
480 MemberModifier.field(NeutronL3Adapter.class, "neutronPortToDpIdCache").set(neutronL3Adapter , neutronPortToDpIdCache);
481 int temp = neutronPortToDpIdCache.size();
483 Whitebox.invokeMethod(neutronL3Adapter, "handleInterfaceEventDelete", intf, Long.valueOf(ID));
485 assertEquals("Error, did not remove the port", temp-1, neutronPortToDpIdCache.size());
489 public void testUpdateL3ForNeutronPort() throws Exception {
490 Map<String, String> networkIdToRouterMacCache = new HashMap<>();
492 Neutron_IPs neutronIp = mock(Neutron_IPs.class);
493 when(neutronIp.getIpAddress()).thenReturn(FIXED_IP_ADDRESS);
494 List<Neutron_IPs> neutronIps = new ArrayList<>();
495 neutronIps.add(neutronIp);
496 NeutronPort neutronPort = mock(NeutronPort.class);
497 when(neutronPort.getNetworkUUID()).thenReturn(UUID);
498 when(neutronPort.getMacAddress()).thenReturn(MAC_ADDRESS_2);
499 when(neutronPort.getFixedIPs()).thenReturn(neutronIps);
500 NeutronNetwork neutronNetwork = mock(NeutronNetwork.class);
501 when(neutronNetwork.getProviderSegmentationID()).thenReturn(ID);
502 List<Node> nodes = new ArrayList<>();
503 nodes.add(mock(Node.class));
504 TenantNetworkManager tenantNetworkManager = mock(TenantNetworkManager.class);
505 MemberModifier.field(NeutronL3Adapter.class, "tenantNetworkManager").set(neutronL3Adapter , tenantNetworkManager);
506 when(tenantNetworkManager.isTenantNetworkPresentInNode(any(Node.class), eq(ID))).thenReturn(true);
507 PowerMockito.doReturn(15L).when(neutronL3Adapter, "getDpidForIntegrationBridge", any(Node.class));
509 // init instance variables
510 networkIdToRouterMacCache .put(UUID, MAC_ADDRESS);
511 MemberModifier.field(NeutronL3Adapter.class, "networkIdToRouterMacCache").set(neutronL3Adapter , networkIdToRouterMacCache);
512 INeutronNetworkCRUD neutronNetworkCache = mock(INeutronNetworkCRUD.class);
513 when(neutronNetworkCache.getNetwork(anyString())).thenReturn(neutronNetwork);
514 MemberModifier.field(NeutronL3Adapter.class, "neutronNetworkCache").set(neutronL3Adapter , neutronNetworkCache);
515 NodeCacheManager nodeCacheManager = mock(NodeCacheManager.class);
516 when(nodeCacheManager.getBridgeNodes()).thenReturn(nodes);
517 MemberModifier.field(NeutronL3Adapter.class, "nodeCacheManager").set(neutronL3Adapter , nodeCacheManager);
519 // Suppress the called to these functions
520 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "getDpidForIntegrationBridge", Node.class));
521 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programL3ForwardingStage1", Node.class, Long.class, String.class, String.class, String.class, Action.class));
523 Whitebox.invokeMethod(neutronL3Adapter, "updateL3ForNeutronPort", neutronPort, false);
524 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("getDpidForIntegrationBridge", any(Node.class));
525 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programL3ForwardingStage1", any(Node.class), anyLong(), anyString(), anyString(), anyString(), eq(Action.ADD));
527 Whitebox.invokeMethod(neutronL3Adapter, "updateL3ForNeutronPort", neutronPort, true);
528 PowerMockito.verifyPrivate(neutronL3Adapter, times(2)).invoke("getDpidForIntegrationBridge", any(Node.class));
529 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programL3ForwardingStage1", any(Node.class), anyLong(), anyString(), anyString(), anyString(), eq(Action.DELETE));
533 public void testProgramL3ForwardingStage1() throws Exception {
535 NodeId nodeId = mock(NodeId.class);
536 when(nodeId.getValue()).thenReturn(ID);
537 Node node = mock(Node.class);
538 when(node.getNodeId()).thenReturn(nodeId);
540 // Suppress the called to these functions
541 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programL3ForwardingStage2", Node.class, Long.class, String.class, String.class, String.class, Action.class));
543 // init instance variables
544 PowerMockito.when(neutronL3Adapter, "programL3ForwardingStage2", any(Node.class), anyLong(), anyString(), anyString(), anyString(), eq(Action.ADD)).thenReturn(new Status(StatusCode.SUCCESS));
545 PowerMockito.when(neutronL3Adapter, "programL3ForwardingStage2", any(Node.class), anyLong(), anyString(), anyString(), anyString(), eq(Action.DELETE)).thenReturn(new Status(StatusCode.SUCCESS));
548 Whitebox.invokeMethod(neutronL3Adapter, "programL3ForwardingStage1", node, Long.valueOf(45), SEG_ID, MAC_ADDRESS, IP, Action.ADD);
549 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programL3ForwardingStage2", any(Node.class), anyLong(), anyString(), anyString(), anyString(), eq(Action.ADD));
552 Whitebox.invokeMethod(neutronL3Adapter, "programL3ForwardingStage1", node, Long.valueOf(45), SEG_ID, MAC_ADDRESS, IP, Action.DELETE);
553 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programL3ForwardingStage2", any(Node.class), anyLong(), anyString(), anyString(), anyString(), eq(Action.DELETE));
557 public void testProgramL3ForwardingStage2() throws Exception {
558 NodeId nodeId = mock(NodeId.class);
559 when(nodeId.getValue()).thenReturn(ID);
560 Node node = mock(Node.class);
561 when(node.getNodeId()).thenReturn(nodeId);
563 assertEquals("Error, this not return the correct status code", new Status(StatusCode.BADREQUEST), Whitebox.invokeMethod(neutronL3Adapter, "programL3ForwardingStage2", node, Long.valueOf(45), SEG_ID, MAC_ADDRESS, MALFORM_IP, Action.ADD));
565 PowerMockito.mockStatic(InetAddress.class);
566 InetAddress inetAddress = mock(InetAddress.class);
567 PowerMockito.when(InetAddress.getByName(anyString())).thenReturn(inetAddress);
569 assertEquals("Error, this not return the correct status code", new Status(StatusCode.SUCCESS), Whitebox.invokeMethod(neutronL3Adapter, "programL3ForwardingStage2", node, Long.valueOf(45), SEG_ID, MAC_ADDRESS, IP, Action.ADD));
573 public void testProgramFlowsForNeutronRouterInterface() throws Exception {
574 Map<String, String> networkIdToRouterMacCache = new HashMap<>();
575 Map<String, List<Neutron_IPs>> networkIdToRouterIpListCache = new HashMap<>();
576 Map<String, NeutronRouter_Interface> subnetIdToRouterInterfaceCache = new HashMap<>();
578 NeutronRouter_Interface intf = mock(NeutronRouter_Interface.class);
579 when(intf.getPortUUID()).thenReturn(UUID);
580 when(intf.getSubnetUUID()).thenReturn(UUID);
581 Neutron_IPs neutronIp = mock(Neutron_IPs.class);
582 when(neutronIp.getIpAddress()).thenReturn(FIXED_IP_ADDRESS);
583 List<Neutron_IPs> ips = new ArrayList<>();
585 NeutronPort neutronPort = mock(NeutronPort.class);
586 when(neutronPort.getMacAddress()).thenReturn(MAC_ADDRESS);
587 when(neutronPort.getFixedIPs()).thenReturn(ips);
588 when(neutronPort.getNetworkUUID()).thenReturn(UUID);
589 NeutronSubnet neutronSubnet = mock(NeutronSubnet.class);
590 when(neutronSubnet.getNetworkUUID()).thenReturn(UUID);
591 when(neutronSubnet.getGatewayIP()).thenReturn(IP);
592 when(neutronSubnet.getCidr()).thenReturn("cidr");
593 NeutronNetwork neutronNetwork = mock(NeutronNetwork.class);
594 when(neutronNetwork.getProviderSegmentationID()).thenReturn(ID);
595 when(neutronNetwork.getRouterExternal()).thenReturn(false); //might change that to true
596 when(neutronNetwork.getNetworkUUID()).thenReturn(UUID);
597 NeutronRouter neutronRouter = mock(NeutronRouter.class);
599 Node node = mock(Node.class);
600 List<Node> nodes = new ArrayList<>();
603 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "getDpidForIntegrationBridge", Node.class));
604 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programFlowsForNeutronRouterInterfacePair", Node.class, Long.class, NeutronRouter_Interface.class, NeutronRouter_Interface.class, NeutronNetwork.class, String.class, String.class, String.class, int.class, Action.class, Boolean.class));
605 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programFlowForNetworkFromExternal", Node.class, Long.class, String.class, String.class, String.class, int.class, Action.class));
606 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programIpRewriteExclusionStage1", Node.class, Long.class, String.class, String.class, Action.class));
608 // init instance variables
609 INeutronPortCRUD neutronPortCache = mock(INeutronPortCRUD.class);
610 PowerMockito.when(neutronPortCache.getPort(anyString())).thenReturn(neutronPort);
611 PowerMockito.when(neutronPortCache.getAllPorts()).thenReturn(new ArrayList<NeutronPort>());
612 INeutronSubnetCRUD neutronSubnetCache = mock(INeutronSubnetCRUD.class);
613 PowerMockito.when(neutronSubnetCache.getSubnet(anyString())).thenReturn(neutronSubnet);
614 INeutronNetworkCRUD neutronNetworkCache = mock(INeutronNetworkCRUD.class);
615 PowerMockito.when(neutronNetworkCache.getNetwork(anyString())).thenReturn(neutronNetwork);
616 NodeCacheManager nodeCacheManager = mock(NodeCacheManager.class);
617 PowerMockito.when(nodeCacheManager.getBridgeNodes()).thenReturn(nodes);
618 MemberModifier.field(NeutronL3Adapter.class, "networkIdToRouterMacCache").set(neutronL3Adapter , networkIdToRouterMacCache);
619 MemberModifier.field(NeutronL3Adapter.class, "networkIdToRouterIpListCache").set(neutronL3Adapter , networkIdToRouterIpListCache);
620 MemberModifier.field(NeutronL3Adapter.class, "subnetIdToRouterInterfaceCache").set(neutronL3Adapter , subnetIdToRouterInterfaceCache);
621 MemberModifier.field(NeutronL3Adapter.class, "neutronPortCache").set(neutronL3Adapter , neutronPortCache);
622 MemberModifier.field(NeutronL3Adapter.class, "neutronSubnetCache").set(neutronL3Adapter , neutronSubnetCache);
623 MemberModifier.field(NeutronL3Adapter.class, "neutronNetworkCache").set(neutronL3Adapter , neutronNetworkCache);
624 MemberModifier.field(NeutronL3Adapter.class, "nodeCacheManager").set(neutronL3Adapter , nodeCacheManager);
625 PowerMockito.when(neutronL3Adapter, "getDpidForIntegrationBridge", any(Node.class)).thenReturn(45L);
627 int networkIdToRouterMacCacheSize, networkIdToRouterIpListCacheSize, subnetIdToRouterInterfaceCacheSize;
628 networkIdToRouterMacCacheSize = networkIdToRouterMacCache.size();
629 networkIdToRouterIpListCacheSize = networkIdToRouterIpListCache.size();
630 subnetIdToRouterInterfaceCacheSize = subnetIdToRouterInterfaceCache.size();
632 Whitebox.invokeMethod(neutronL3Adapter, "programFlowsForNeutronRouterInterface", intf, false);
634 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("getDpidForIntegrationBridge", any(Node.class));
635 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programFlowsForNeutronRouterInterfacePair", any(Node.class), anyLong(), any(NeutronRouter_Interface.class), any(NeutronRouter_Interface.class), any(NeutronNetwork.class), anyString(), anyString(), anyString(), anyInt(), eq(Action.ADD), anyBoolean());
636 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programFlowForNetworkFromExternal", any(Node.class), anyLong(), anyString(), anyString(), anyString(), anyInt(), eq(Action.ADD));
637 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programIpRewriteExclusionStage1", any(Node.class), anyLong(), anyString(), anyString(), eq(Action.ADD));
638 assertEquals("Error, did not add the RouterMac", networkIdToRouterMacCacheSize, networkIdToRouterMacCache.size() -1);
639 assertEquals("Error, did not add the RouterIP", networkIdToRouterIpListCacheSize, networkIdToRouterIpListCache.size() -1);
640 assertEquals("Error, did not add the RouterInterface", subnetIdToRouterInterfaceCacheSize, subnetIdToRouterInterfaceCache.size() -1);
642 networkIdToRouterMacCache.put(UUID, MAC_ADDRESS);
643 networkIdToRouterIpListCache.put(UUID, ips);
644 subnetIdToRouterInterfaceCache.put(UUID, intf);
645 networkIdToRouterMacCacheSize = networkIdToRouterMacCache.size();
646 networkIdToRouterIpListCacheSize = networkIdToRouterIpListCache.size();
647 subnetIdToRouterInterfaceCacheSize = subnetIdToRouterInterfaceCache.size();
649 Whitebox.invokeMethod(neutronL3Adapter, "handleNeutronRouterInterfaceEvent", neutronRouter, intf, Action.DELETE);
651 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programFlowsForNeutronRouterInterface", intf, true);
652 PowerMockito.verifyPrivate(neutronL3Adapter, times(2)).invoke("getDpidForIntegrationBridge", any(Node.class));
653 PowerMockito.verifyPrivate(neutronL3Adapter, times(2)).invoke("programFlowsForNeutronRouterInterfacePair", any(Node.class), anyLong(), any(NeutronRouter_Interface.class), any(NeutronRouter_Interface.class), any(NeutronNetwork.class), anyString(), anyString(), anyString(), anyInt(), eq(Action.DELETE), anyBoolean());
654 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programFlowForNetworkFromExternal", any(Node.class), anyLong(), anyString(), anyString(), anyString(), anyInt(), eq(Action.DELETE));
655 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programIpRewriteExclusionStage1", any(Node.class), anyLong(), anyString(), anyString(), eq(Action.DELETE));
656 assertEquals("Error, did not remove the RouterMac", networkIdToRouterMacCacheSize, networkIdToRouterMacCache.size() +1);
657 assertEquals("Error, did not remove the RouterIP", networkIdToRouterIpListCacheSize, networkIdToRouterIpListCache.size() +1);
658 assertEquals("Error, did not remove the RouterInterface", subnetIdToRouterInterfaceCacheSize, subnetIdToRouterInterfaceCache.size() +1);
662 public void testProgramFlowForNetworkFromExternal() throws Exception {
663 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programRouterInterfaceStage1", Node.class, Long.class, String.class, String.class, String.class, String.class, int.class, Action.class));
665 Whitebox.invokeMethod(neutronL3Adapter, "programFlowForNetworkFromExternal", mock(Node.class), Long.valueOf(12), "", "", "", 4, Action.ADD);
667 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programRouterInterfaceStage1", any(Node.class), anyLong(), anyString(), anyString(), anyString(), anyString(), anyInt(), any(Action.class));
671 public void testProgramFlowsForNeutronRouterInterfacePair() throws Exception {
672 NeutronRouter_Interface srcNeutronRouterInterface = mock(NeutronRouter_Interface.class);
673 when(srcNeutronRouterInterface.getSubnetUUID()).thenReturn(UUID);
674 when(srcNeutronRouterInterface.getID()).thenReturn(ID);
675 when(srcNeutronRouterInterface.getPortUUID()).thenReturn(UUID);
676 NeutronRouter_Interface dstNeutronRouterInterface = mock(NeutronRouter_Interface.class);
677 NeutronNetwork neutronNetwork = mock(NeutronNetwork.class);
678 when(neutronNetwork.getTenantID()).thenReturn(ID);
679 when(neutronNetwork.getProviderSegmentationID()).thenReturn(ID);
680 Neutron_IPs ip = mock(Neutron_IPs.class);
681 when(ip.getIpAddress()).thenReturn(IP);
682 List<Neutron_IPs> ips = new ArrayList<>();
686 NeutronPort neutronPort = mock(NeutronPort.class);
687 when(neutronPort.getMacAddress()).thenReturn(MAC_ADDRESS);
688 when(neutronPort.getFixedIPs()).thenReturn(ips);
689 NeutronSubnet neutronSubnet = mock(NeutronSubnet.class);
690 when(neutronSubnet.getNetworkUUID()).thenReturn(UUID);
691 when(neutronSubnet.getCidr()).thenReturn(CIDR);
693 INeutronSubnetCRUD neutronSubnetCache = mock(INeutronSubnetCRUD.class);
694 PowerMockito.when(neutronSubnetCache.getSubnet(anyString())).thenReturn(neutronSubnet);
695 MemberModifier.field(NeutronL3Adapter.class, "neutronSubnetCache").set(neutronL3Adapter , neutronSubnetCache);
696 INeutronNetworkCRUD neutronNetworkCache = mock(INeutronNetworkCRUD.class);
697 PowerMockito.when(neutronNetworkCache.getNetwork(anyString())).thenReturn(neutronNetwork);
698 MemberModifier.field(NeutronL3Adapter.class, "neutronNetworkCache").set(neutronL3Adapter , neutronNetworkCache);
699 INeutronPortCRUD neutronPortCache = mock(INeutronPortCRUD.class);
700 PowerMockito.when(neutronPortCache.getPort(anyString())).thenReturn(neutronPort);
701 MemberModifier.field(NeutronL3Adapter.class, "neutronPortCache").set(neutronL3Adapter , neutronPortCache);
703 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programRouterInterfaceStage1", Node.class, Long.class, String.class, String.class, String.class, String.class, int.class, Action.class));
704 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "getMaskLenFromCidr", String.class));
706 Whitebox.invokeMethod(neutronL3Adapter, "programFlowsForNeutronRouterInterfacePair", mock(Node.class), Long.valueOf(12), srcNeutronRouterInterface, dstNeutronRouterInterface, neutronNetwork, SEG_ID, MAC_ADDRESS, IP, 4, Action.ADD, false);
707 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programRouterInterfaceStage1", any(Node.class), anyLong(), anyString(), anyString(), anyString(), anyString(), anyInt(), any(Action.class));
709 Whitebox.invokeMethod(neutronL3Adapter, "programFlowsForNeutronRouterInterfacePair", mock(Node.class), Long.valueOf(12), srcNeutronRouterInterface, dstNeutronRouterInterface, neutronNetwork, SEG_ID, MAC_ADDRESS, IP, 4, Action.ADD, true);
710 PowerMockito.verifyPrivate(neutronL3Adapter, times(2)).invoke("programRouterInterfaceStage1", any(Node.class), anyLong(), anyString(), anyString(), anyString(), anyString(), anyInt(), any(Action.class));
711 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("getMaskLenFromCidr", anyString());
712 PowerMockito.verifyPrivate(neutronL3Adapter, times(4)).invoke("programFlowsForNeutronRouterInterfacePair", any(Node.class), anyLong(), any(NeutronRouter_Interface.class), any(NeutronRouter_Interface.class), any(NeutronNetwork.class), anyString(), anyString(), anyString(), anyInt(), any(Action.class), eq(false)); //3 + 1 above
716 public void testProgramRouterInterfaceStage1() throws Exception {
718 NodeId nodeId = mock(NodeId.class);
719 when(nodeId.getValue()).thenReturn(ID);
720 Node node = mock(Node.class);
721 when(node.getNodeId()).thenReturn(nodeId);
723 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programRouterInterfaceStage2", Node.class, Long.class, String.class, String.class, String.class, String.class, int.class, Action.class));
725 PowerMockito.when(neutronL3Adapter, "programRouterInterfaceStage2", any(Node.class), anyLong(), anyString(), anyString(), anyString(), anyString(), anyInt(), any(Action.class)).thenReturn(new Status(StatusCode.SUCCESS));
728 Whitebox.invokeMethod(neutronL3Adapter, "programRouterInterfaceStage1", node, Long.valueOf(12), SEG_ID, SEG_ID, MAC_ADDRESS, IP, 4, Action.ADD);
730 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programRouterInterfaceStage1", any(Node.class), anyLong(), anyString(), anyString(), anyString(), anyString(), anyInt(), eq(Action.ADD));
732 Whitebox.invokeMethod(neutronL3Adapter, "programRouterInterfaceStage1", node, Long.valueOf(12), SEG_ID, SEG_ID, MAC_ADDRESS, IP, 4, Action.DELETE);
734 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programRouterInterfaceStage1", any(Node.class), anyLong(), anyString(), anyString(), anyString(), anyString(), anyInt(), eq(Action.DELETE));
738 public void testProgramRouterInterfaceStage2() throws Exception {
739 NodeId nodeId = mock(NodeId.class);
740 when(nodeId.getValue()).thenReturn(ID);
741 Node node = mock(Node.class);
742 when(node.getNodeId()).thenReturn(nodeId);
744 assertEquals("Error, this not return the correct status code", new Status(StatusCode.BADREQUEST), Whitebox.invokeMethod(neutronL3Adapter, "programRouterInterfaceStage2", node, Long.valueOf(45), SEG_ID, SEG_ID , MAC_ADDRESS, MALFORM_IP, 4, Action.ADD));
746 PowerMockito.mockStatic(InetAddress.class);
747 InetAddress inetAddress = mock(InetAddress.class);
748 PowerMockito.when(InetAddress.getByName(anyString())).thenReturn(inetAddress);
750 assertEquals("Error, this not return the correct status code", new Status(StatusCode.SUCCESS), Whitebox.invokeMethod(neutronL3Adapter, "programRouterInterfaceStage2", node, Long.valueOf(45), SEG_ID, SEG_ID, MAC_ADDRESS, IP, 4, Action.ADD));
755 public void testProgramInboundIpRewriteStage1() throws Exception {
757 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programInboundIpRewriteStage2", Long.class, Long.class, String.class, String.class, String.class, Action.class));
759 PowerMockito.when(neutronL3Adapter, "programInboundIpRewriteStage2", anyLong(), anyLong(), anyString(), anyString(), anyString(), any(Action.class)).thenReturn(new Status(StatusCode.SUCCESS));
762 Whitebox.invokeMethod(neutronL3Adapter, "programInboundIpRewriteStage1", Long.valueOf(12), Long.valueOf(12), PORT_INT, MAC_ADDRESS, IP, Action.ADD);
764 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programInboundIpRewriteStage2", anyLong(), anyLong(), anyString(), anyString(), anyString(), eq(Action.ADD));
766 Whitebox.invokeMethod(neutronL3Adapter, "programInboundIpRewriteStage1", Long.valueOf(12), Long.valueOf(12),PORT_INT, MAC_ADDRESS, IP, Action.DELETE);
768 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programInboundIpRewriteStage2", anyLong(), anyLong(), anyString(), anyString(), anyString(), eq(Action.DELETE));
772 public void testProgramInboundIpRewriteStage2() throws Exception {
773 assertEquals("Error, this not return the correct status code", new Status(StatusCode.BADREQUEST), Whitebox.invokeMethod(neutronL3Adapter, "programInboundIpRewriteStage2", Long.valueOf(45), Long.valueOf(45), SEG_ID, MAC_ADDRESS, IP, Action.ADD));
775 PowerMockito.mockStatic(InetAddress.class);
776 InetAddress inetAddress = mock(InetAddress.class);
777 PowerMockito.when(InetAddress.getByName(anyString())).thenReturn(inetAddress);
779 assertEquals("Error, this not return the correct status code", new Status(StatusCode.SUCCESS), Whitebox.invokeMethod(neutronL3Adapter, "programInboundIpRewriteStage2", Long.valueOf(45), Long.valueOf(45), SEG_ID, MAC_ADDRESS, IP, Action.ADD));
783 public void testProgramIpRewriteExclusionStage1() throws Exception {
785 NodeId nodeId = mock(NodeId.class);
786 when(nodeId.getValue()).thenReturn(ID);
787 Node node = mock(Node.class);
788 when(node.getNodeId()).thenReturn(nodeId);
790 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programIpRewriteExclusionStage2", Node.class, Long.class, String.class, String.class, Action.class));
792 PowerMockito.when(neutronL3Adapter, "programIpRewriteExclusionStage2", any(Node.class), anyLong(), anyString(), anyString(), any(Action.class)).thenReturn(new Status(StatusCode.SUCCESS));
795 Whitebox.invokeMethod(neutronL3Adapter, "programIpRewriteExclusionStage1", node, Long.valueOf(12), SEG_ID, CIDR, Action.ADD);
797 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programIpRewriteExclusionStage2", any(Node.class), anyLong(), anyString(), anyString(), eq(Action.ADD));
799 Whitebox.invokeMethod(neutronL3Adapter, "programIpRewriteExclusionStage1", node, Long.valueOf(12), SEG_ID, CIDR, Action.DELETE);
801 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programIpRewriteExclusionStage2", any(Node.class), anyLong(), anyString(), anyString(), eq(Action.DELETE));
805 public void testProgramIpRewriteExclusionStage2() throws Exception {
806 NodeId nodeId = mock(NodeId.class);
807 when(nodeId.getValue()).thenReturn(ID);
808 Node node = mock(Node.class);
809 when(node.getNodeId()).thenReturn(nodeId);
811 assertEquals("Error, this not return the correct status code", new Status(StatusCode.SUCCESS), Whitebox.invokeMethod(neutronL3Adapter, "programIpRewriteExclusionStage2", node, Long.valueOf(45), SEG_ID, CIDR, Action.ADD));
814 @SuppressWarnings("unchecked")
816 public void testProgramOutboundIpRewriteStage1() throws Exception{
818 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programOutboundIpRewriteStage2", floatingIpClass, Action.class));
820 PowerMockito.when(neutronL3Adapter, "programOutboundIpRewriteStage2", any(floatingIpClass), any(Action.class)).thenReturn(new Status(StatusCode.SUCCESS));
823 Whitebox.invokeMethod(neutronL3Adapter, "programOutboundIpRewriteStage1", floatingIpObject, Action.ADD);
825 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programOutboundIpRewriteStage2", any(floatingIpClass), eq(Action.ADD));
827 Whitebox.invokeMethod(neutronL3Adapter, "programOutboundIpRewriteStage1", floatingIpObject, Action.DELETE);
829 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programOutboundIpRewriteStage2", any(floatingIpClass), eq(Action.DELETE));
833 public void testPrepareProgramOutboundIpRewriteStage2() throws Exception {
834 assertEquals("Error, did not return the correct status code", new Status(StatusCode.BADREQUEST), Whitebox.invokeMethod(neutronL3Adapter, "programOutboundIpRewriteStage2", floatingIpObject, Action.ADD));
836 PowerMockito.mockStatic(InetAddress.class);
837 InetAddress inetAddress = mock(InetAddress.class);
838 PowerMockito.when(InetAddress.getByName(anyString())).thenReturn(inetAddress);
840 assertEquals("Error, did not return the correct status code", new Status(StatusCode.SUCCESS), Whitebox.invokeMethod(neutronL3Adapter, "programOutboundIpRewriteStage2", floatingIpObject, Action.ADD));
844 public void testGetMaskLenFromCidr() throws Exception {
845 assertEquals("Error, did not return the correct mask", 32, (int) Whitebox.invokeMethod(neutronL3Adapter, "getMaskLenFromCidr", IP_MASK));
849 public void testGetDpidForIntegrationBridge() throws Exception {
850 Southbound southbound = mock(Southbound.class);
851 ConfigurationService configurationService = mock(ConfigurationService.class);
853 MemberModifier.field(NeutronL3Adapter.class, "southbound").set(neutronL3Adapter , southbound);
854 MemberModifier.field(NeutronL3Adapter.class, "configurationService").set(neutronL3Adapter , configurationService);
856 PowerMockito.when(southbound.getBridge(any(Node.class), anyString())).thenReturn(mock(OvsdbBridgeAugmentation.class));
857 PowerMockito.when(configurationService.getIntegrationBridgeName()).thenReturn("");
858 PowerMockito.when(southbound.getDataPathId(any(Node.class))).thenReturn(45L);
860 assertEquals("Error, did not return the correct Dpid", 45L, (long) Whitebox.invokeMethod(neutronL3Adapter, "getDpidForIntegrationBridge", mock(Node.class)));
864 public void testencodeExcplicitOFPort() throws Exception {
865 assertEquals("Error, did not correctly encode the port", OFPort, NeutronL3Adapter.encodeExcplicitOFPort(45L));
869 public void testSetDependencies() throws Exception {
870 Map<String,NeutronNetwork> networkCleanupCache = new HashMap<>();
871 INeutronNetworkCRUD neutronNetworkCache = mock(INeutronNetworkCRUD.class);
872 NeutronNetwork neutronNetwork = mock(NeutronNetwork.class);
873 List <NeutronNetwork> neutronNetworkList = new ArrayList<NeutronNetwork>();
874 neutronNetworkList.add(neutronNetwork);
875 when(neutronNetworkCache.getAllNetworks()).thenReturn(neutronNetworkList);
877 Map<String,NeutronPort> portCleanupCache = new HashMap<>();
878 INeutronPortCRUD neutronPortCache = mock(INeutronPortCRUD.class);
879 NeutronPort neutronPort = mock(NeutronPort.class);
880 List <NeutronPort> neutronPortList = new ArrayList<NeutronPort>();
881 neutronPortList.add(neutronPort);
882 when(neutronPortCache.getAllPorts()).thenReturn(neutronPortList);
884 MemberModifier.field(NeutronL3Adapter.class, "networkCleanupCache").set(neutronL3Adapter , networkCleanupCache);
885 MemberModifier.field(NeutronL3Adapter.class, "neutronNetworkCache").set(neutronL3Adapter , neutronNetworkCache);
886 MemberModifier.field(NeutronL3Adapter.class, "portCleanupCache").set(neutronL3Adapter , portCleanupCache);
887 MemberModifier.field(NeutronL3Adapter.class, "neutronPortCache").set(neutronL3Adapter , neutronPortCache);
890 when(neutronPort.getDeviceOwner()).thenReturn(OWNER_ROUTER_INTERFACE);
891 MemberModifier.field(NeutronL3Adapter.class, "portCleanupCache").set(neutronL3Adapter , portCleanupCache);
895 EventDispatcher eventDispatcher = mock(EventDispatcher.class);
896 TenantNetworkManager tenantNetworkManager = mock(TenantNetworkManager.class);
897 ConfigurationService configurationService = mock(ConfigurationService.class);
898 ArpProvider arpProvider = mock(ArpProvider.class);
899 DistributedArpService distributedArpService = mock(DistributedArpService.class);
900 InboundNatProvider inboundNatProvider = mock(InboundNatProvider.class);
901 OutboundNatProvider outboundNatProvider = mock(OutboundNatProvider.class);
902 RoutingProvider routingProvider = mock(RoutingProvider.class);
903 L3ForwardingProvider l3ForwardingProvider = mock(L3ForwardingProvider.class);
904 NodeCacheManager nodeCacheManager = mock(NodeCacheManager.class);
905 Southbound southbound = mock(Southbound.class);
907 ServiceHelper.overrideGlobalInstance(EventDispatcher.class, eventDispatcher);
908 ServiceHelper.overrideGlobalInstance(TenantNetworkManager.class, tenantNetworkManager);
909 ServiceHelper.overrideGlobalInstance(ConfigurationService.class, configurationService);
910 ServiceHelper.overrideGlobalInstance(ArpProvider.class, arpProvider);
911 ServiceHelper.overrideGlobalInstance(DistributedArpService.class, distributedArpService);
912 ServiceHelper.overrideGlobalInstance(InboundNatProvider.class, inboundNatProvider);
913 ServiceHelper.overrideGlobalInstance(OutboundNatProvider.class, outboundNatProvider);
914 ServiceHelper.overrideGlobalInstance(RoutingProvider.class, routingProvider);
915 ServiceHelper.overrideGlobalInstance(L3ForwardingProvider.class, l3ForwardingProvider);
916 ServiceHelper.overrideGlobalInstance(NodeCacheManager.class, nodeCacheManager);
917 ServiceHelper.overrideGlobalInstance(Southbound.class, southbound);
919 neutronL3Adapter.setDependencies(mock(ServiceReference.class));
921 assertEquals("Error, did not return the correct object", getAbstractHandlerField("eventDispatcher"),
923 assertEquals("Error, did not return the correct object", getField("tenantNetworkManager"), tenantNetworkManager);
924 assertEquals("Error, did not return the correct object", getField("configurationService"), configurationService);
925 assertEquals("Error, did not return the correct object", getField("arpProvider"), arpProvider);
926 assertEquals("Error, did not return the correct object", getField("distributedArpService"), distributedArpService);
927 assertEquals("Error, did not return the correct object", getField("inboundNatProvider"), inboundNatProvider);
928 assertEquals("Error, did not return the correct object", getField("outboundNatProvider"), outboundNatProvider);
929 assertEquals("Error, did not return the correct object", getField("routingProvider"), routingProvider);
930 assertEquals("Error, did not return the correct object", getField("l3ForwardingProvider"), l3ForwardingProvider);
931 assertEquals("Error, did not return the correct object", getField("nodeCacheManager"), nodeCacheManager);
932 assertEquals("Error, did not return the correct object", getField("southbound"), southbound);
936 public void testSetDependenciesObject() throws Exception{
937 MemberModifier.field(NeutronL3Adapter.class, "enabled").set(neutronL3Adapter , false);
939 INeutronNetworkCRUD iNeutronNetworkCRUD = mock(INeutronNetworkCRUD.class);
940 neutronL3Adapter.setDependencies(iNeutronNetworkCRUD);
941 assertEquals("Error, did not return the correct object", getField("neutronNetworkCache"), iNeutronNetworkCRUD);
943 INeutronPortCRUD iNeutronPortCRUD = mock(INeutronPortCRUD.class);
944 neutronL3Adapter.setDependencies(iNeutronPortCRUD);
945 assertEquals("Error, did not return the correct object", getField("neutronPortCache"), iNeutronPortCRUD);
947 INeutronSubnetCRUD iNeutronSubnetCRUD = mock(INeutronSubnetCRUD.class);
948 neutronL3Adapter.setDependencies(iNeutronSubnetCRUD);
949 assertEquals("Error, did not return the correct object", getField("neutronSubnetCache"), iNeutronSubnetCRUD);
951 ArpProvider arpProvider = mock(ArpProvider.class);
952 neutronL3Adapter.setDependencies(arpProvider);
953 assertEquals("Error, did not return the correct object", getField("arpProvider"), arpProvider);
955 InboundNatProvider inboundNatProvider = mock(InboundNatProvider.class);
956 neutronL3Adapter.setDependencies(inboundNatProvider);
957 assertEquals("Error, did not return the correct object", getField("inboundNatProvider"), inboundNatProvider);
959 OutboundNatProvider outboundNatProvider = mock(OutboundNatProvider.class);
960 neutronL3Adapter.setDependencies(outboundNatProvider);
961 assertEquals("Error, did not return the correct object", getField("outboundNatProvider"), outboundNatProvider);
963 RoutingProvider routingProvider = mock(RoutingProvider.class);
964 neutronL3Adapter.setDependencies(routingProvider);
965 assertEquals("Error, did not return the correct object", getField("routingProvider"), routingProvider);
967 L3ForwardingProvider l3ForwardingProvider = mock(L3ForwardingProvider.class);
968 neutronL3Adapter.setDependencies(l3ForwardingProvider);
969 assertEquals("Error, did not return the correct object", getField("l3ForwardingProvider"), l3ForwardingProvider);
971 MemberModifier.field(NeutronL3Adapter.class, "enabled").set(neutronL3Adapter , true);
974 private Object getAbstractHandlerField(String fieldName) throws Exception {
975 Field field = AbstractHandler.class.getDeclaredField(fieldName);
976 field.setAccessible(true);
977 return field.get(neutronL3Adapter);
980 private Object getField(String fieldName) throws Exception {
981 Field field = NeutronL3Adapter.class.getDeclaredField(fieldName);
982 field.setAccessible(true);
983 return field.get(neutronL3Adapter);
986 @SuppressWarnings("rawtypes")
987 private Object createFloatingIpObject() throws Exception{
988 Class clazz = Whitebox.getInnerClassType(NeutronL3Adapter.class, "FloatIpData");
989 Constructor [] constructors = clazz.getConstructors();
990 Constructor c = constructors[0];
991 return c.newInstance(neutronL3Adapter, 415L, 415L, "a", "b", "c", "d", "e");