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.INeutronFloatingIPCRUD;
46 import org.opendaylight.ovsdb.openstack.netvirt.translator.crud.INeutronNetworkCRUD;
47 import org.opendaylight.ovsdb.openstack.netvirt.translator.crud.INeutronPortCRUD;
48 import org.opendaylight.ovsdb.openstack.netvirt.translator.crud.INeutronSubnetCRUD;
49 import org.opendaylight.ovsdb.openstack.netvirt.AbstractHandler;
50 import org.opendaylight.ovsdb.openstack.netvirt.api.Action;
51 import org.opendaylight.ovsdb.openstack.netvirt.api.ArpProvider;
52 import org.opendaylight.ovsdb.openstack.netvirt.api.ConfigurationService;
53 import org.opendaylight.ovsdb.openstack.netvirt.api.EventDispatcher;
54 import org.opendaylight.ovsdb.openstack.netvirt.api.InboundNatProvider;
55 import org.opendaylight.ovsdb.openstack.netvirt.api.L3ForwardingProvider;
56 import org.opendaylight.ovsdb.openstack.netvirt.api.NodeCacheManager;
57 import org.opendaylight.ovsdb.openstack.netvirt.api.OutboundNatProvider;
58 import org.opendaylight.ovsdb.openstack.netvirt.api.RoutingProvider;
59 import org.opendaylight.ovsdb.openstack.netvirt.api.Southbound;
60 import org.opendaylight.ovsdb.openstack.netvirt.api.Status;
61 import org.opendaylight.ovsdb.openstack.netvirt.api.StatusCode;
62 import org.opendaylight.ovsdb.openstack.netvirt.api.TenantNetworkManager;
63 import org.opendaylight.ovsdb.utils.servicehelper.ServiceHelper;
64 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation;
67 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
68 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
70 import org.osgi.framework.ServiceReference;
71 import org.powermock.api.mockito.PowerMockito;
72 import org.powermock.api.support.membermodification.MemberMatcher;
73 import org.powermock.api.support.membermodification.MemberModifier;
74 import org.powermock.core.classloader.annotations.PrepareForTest;
75 import org.powermock.modules.junit4.PowerMockRunner;
76 import org.powermock.reflect.Whitebox;
79 * Unit test for {@link NeutronL3Adapter}
81 @PrepareForTest({ServiceHelper.class, InetAddress.class, NeutronL3Adapter.class, DistributedArpService.class})
82 @RunWith(PowerMockRunner.class)
83 public class NeutronL3AdapterTest {
85 @Mock private NeutronL3Adapter neutronL3Adapter;
86 @Mock private DistributedArpService distributedArpService;
88 private static final String ID = "45";
89 private static final String IP = "127.0.0.1";
90 private static final String MALFORM_IP = "127.0.0.1.5";
91 private static final String INTF_NAME = "br-int";
92 private static final String EXTERNAL_ROUTER_MAC_UPDATE = "";
93 private static final String UUID = "7da709ff-397f-4778-a0e8-994811272fdb";
94 private static final String FIXED_IP_ADDRESS = "192.168.1.0";
95 private static final String FLOATING_IP_ADDRESS = "192.168.1.1";
96 private static final String OWNER_ROUTER_INTERFACE = "network:router_interface";
97 private static final String OWNER_FLOATING_IP = "network:floatingip";
98 private static final String MAC_ADDRESS = "00:00:5E:00:02:01";
99 private static final String MAC_ADDRESS_2 = "00:00:5E:00:02:02";
100 private static final String PORT_INT = "port_int";
101 private static final String SEG_ID = "2";
102 private static final String CIDR = "192.168.100.0/24";
103 private static final String OFPort = "OFPort|45";
104 private static final String IP_MASK = "127.0.0.1/32";
106 @SuppressWarnings("rawtypes")
107 private Class floatingIpClass;
108 private Object floatingIpObject;
111 public void setUp() throws Exception{
112 neutronL3Adapter = PowerMockito.mock(NeutronL3Adapter.class, Mockito.CALLS_REAL_METHODS);
113 Whitebox.setInternalState(neutronL3Adapter, "distributedArpService", distributedArpService);
114 // init instance variables
115 MemberModifier.field(NeutronL3Adapter.class, "enabled").set(neutronL3Adapter, true);
117 // floating ip (nested private class from NeutronL3Adapter)
118 floatingIpClass = Whitebox.getInnerClassType(NeutronL3Adapter.class, "FloatIpData");
119 floatingIpObject = createFloatingIpObject();
123 public void testUpdateExternalRouterMac() throws Exception {
124 // Suppress the called to these functions
125 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "flushExistingIpRewrite"));
126 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "rebuildExistingIpRewrite"));
128 neutronL3Adapter.updateExternalRouterMac(EXTERNAL_ROUTER_MAC_UPDATE);
130 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("flushExistingIpRewrite");
131 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("rebuildExistingIpRewrite");
135 public void testhandleNeutronSubnetEvent() throws Exception {
136 Map<String,NeutronNetwork> networkCleanupCache = new HashMap<>();
137 INeutronNetworkCRUD neutronNetworkCache = mock(INeutronNetworkCRUD.class);
138 NeutronNetwork neutronNetwork = mock(NeutronNetwork.class);
139 when(neutronNetworkCache.getNetwork(anyString())).thenReturn(neutronNetwork);
141 MemberModifier.field(NeutronL3Adapter.class, "networkCleanupCache").set(neutronL3Adapter , networkCleanupCache);
142 MemberModifier.field(NeutronL3Adapter.class, "neutronNetworkCache").set(neutronL3Adapter , neutronNetworkCache);
143 neutronL3Adapter.handleNeutronSubnetEvent(mock(NeutronSubnet.class), Action.ADD);
147 public void testHandleNeutronPortEvent() throws Exception {
148 Map<String, NeutronRouter_Interface> subnetIdToRouterInterfaceCache = new HashMap<>();
149 Map<String,NeutronPort> portCleanupCache = new HashMap<>();
151 Neutron_IPs neutronIP = mock(Neutron_IPs.class);
152 when(neutronIP.getSubnetUUID()).thenReturn(UUID);
153 List<Neutron_IPs> list_neutronIP = new ArrayList<>();
154 list_neutronIP.add(neutronIP);
155 NeutronPort neutronPort = mock(NeutronPort.class);
156 when(neutronPort.getDeviceOwner()).thenReturn(OWNER_ROUTER_INTERFACE);
157 when(neutronPort.getFixedIPs()).thenReturn(list_neutronIP);
158 INeutronFloatingIPCRUD neutronFloatingIpCache = mock(INeutronFloatingIPCRUD.class);
160 // init instance variables
161 MemberModifier.field(NeutronL3Adapter.class, "neutronPortCache").set(neutronL3Adapter , mock(INeutronPortCRUD.class));
162 subnetIdToRouterInterfaceCache.put(UUID, mock(NeutronRouter_Interface.class));
163 MemberModifier.field(NeutronL3Adapter.class, "subnetIdToRouterInterfaceCache").set(neutronL3Adapter , subnetIdToRouterInterfaceCache);
164 MemberModifier.field(NeutronL3Adapter.class, "portCleanupCache").set(neutronL3Adapter , portCleanupCache);
165 MemberModifier.field(NeutronL3Adapter.class, "neutronFloatingIpCache").set(neutronL3Adapter , neutronFloatingIpCache);
167 // Suppress the called to these functions
168 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "updateL3ForNeutronPort", NeutronPort.class, boolean.class));
169 Mockito.doNothing().when(neutronL3Adapter).handleNeutronRouterInterfaceEvent(any(NeutronRouter.class), any(NeutronRouter_Interface.class), any(Action.class));
171 neutronL3Adapter.handleNeutronPortEvent(neutronPort, Action.ADD);
172 Mockito.verify(neutronL3Adapter).handleNeutronRouterInterfaceEvent(any(NeutronRouter.class), any(NeutronRouter_Interface.class), eq(Action.ADD));
174 when(neutronPort.getDeviceOwner()).thenReturn("");
175 neutronL3Adapter.handleNeutronPortEvent(neutronPort, Action.ADD);
176 Mockito.verify(neutronL3Adapter, times(2)).handleNeutronRouterInterfaceEvent(any(NeutronRouter.class), any(NeutronRouter_Interface.class), eq(Action.ADD));
177 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("updateL3ForNeutronPort", any(NeutronPort.class), eq(false));
179 neutronL3Adapter.handleNeutronPortEvent(neutronPort, Action.DELETE);
180 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("updateL3ForNeutronPort", any(NeutronPort.class), eq(true));
184 public void testhandleNeutronRouterEvent() throws Exception {
185 // Nothing to be done here
186 neutronL3Adapter.handleNeutronRouterEvent(mock(NeutronRouter.class), Action.ADD);
190 public void testHandleNeutronRouterInterfaceEvent() throws Exception {
192 NeutronRouter_Interface neutronRouterInterface = mock(NeutronRouter_Interface.class);
193 when(neutronRouterInterface.getPortUUID()).thenReturn(UUID);
194 when(neutronRouterInterface.getSubnetUUID()).thenReturn(UUID);
196 Neutron_IPs neutronIP = mock(Neutron_IPs.class);
197 when(neutronIP.getSubnetUUID()).thenReturn(UUID);
198 NeutronPort neutronPort = mock(NeutronPort.class);
199 List<Neutron_IPs> list_neutronIP = new ArrayList<>();
200 list_neutronIP.add(neutronIP);
201 when(neutronPort.getFixedIPs()).thenReturn(list_neutronIP);
202 List<NeutronPort> list_neutronPort = new ArrayList<>();
203 list_neutronPort.add(neutronPort);
204 INeutronPortCRUD neutronPortCache = mock(INeutronPortCRUD.class);
205 when(neutronPortCache.getAllPorts()).thenReturn(list_neutronPort);
207 // init instance variables
208 MemberModifier.field(NeutronL3Adapter.class, "neutronPortCache").set(neutronL3Adapter , neutronPortCache);
210 // Suppress the called to these functions
211 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programFlowsForNeutronRouterInterface", NeutronRouter_Interface.class, Boolean.class));
212 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "updateL3ForNeutronPort", NeutronPort.class, boolean.class));
214 neutronL3Adapter.handleNeutronRouterInterfaceEvent(mock(NeutronRouter.class), neutronRouterInterface, Action.ADD);
215 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programFlowsForNeutronRouterInterface", any(NeutronRouter_Interface.class), eq(false));
216 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("updateL3ForNeutronPort", any(NeutronPort.class), eq(false));
218 neutronL3Adapter.handleNeutronRouterInterfaceEvent(mock(NeutronRouter.class), neutronRouterInterface, Action.DELETE);
219 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programFlowsForNeutronRouterInterface", any(NeutronRouter_Interface.class), eq(true));
220 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("updateL3ForNeutronPort", any(NeutronPort.class), eq(true));
224 public void testHandleNeutronFloatingIPEvent() throws Exception {
226 NeutronFloatingIP neutronFloatingIP = mock(NeutronFloatingIP.class);
227 when(neutronFloatingIP.getFixedIPAddress()).thenReturn(FIXED_IP_ADDRESS);
228 when(neutronFloatingIP.getFloatingIPAddress()).thenReturn(FLOATING_IP_ADDRESS);
229 when(neutronFloatingIP.getID()).thenReturn(UUID);
231 // Suppress the called to these functions
232 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programFlowsForFloatingIPArpAdd", NeutronFloatingIP.class));
233 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programFlowsForFloatingIPInbound", NeutronFloatingIP.class, Action.class));
234 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programFlowsForFloatingIPOutbound", NeutronFloatingIP.class, Action.class));
235 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programFlowsForFloatingIPArpDelete", String.class));
237 neutronL3Adapter.handleNeutronFloatingIPEvent(neutronFloatingIP, Action.ADD);
238 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programFlowsForFloatingIPArpAdd", any(NeutronFloatingIP.class));
239 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programFlowsForFloatingIPInbound", any(NeutronFloatingIP.class), eq(Action.ADD));
240 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programFlowsForFloatingIPOutbound", any(NeutronFloatingIP.class), eq(Action.ADD));
242 neutronL3Adapter.handleNeutronFloatingIPEvent(neutronFloatingIP, Action.DELETE);
243 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programFlowsForFloatingIPArpDelete", anyString());
244 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programFlowsForFloatingIPInbound", any(NeutronFloatingIP.class), eq(Action.DELETE));
245 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programFlowsForFloatingIPOutbound", any(NeutronFloatingIP.class), eq(Action.DELETE));
248 @SuppressWarnings({ "unchecked", "rawtypes" })
250 public void testProgramFlowsForFloatingIPInbound() throws Exception {
251 Map floatIpDataMapCache = new HashMap();
253 NeutronFloatingIP neutronFloatingIp = mock(NeutronFloatingIP.class);
254 when(neutronFloatingIp.getID()).thenReturn(ID);
256 // init instance variables
257 floatIpDataMapCache .put(ID, floatingIpObject);
258 MemberModifier.field(NeutronL3Adapter.class, "floatIpDataMapCache").set(neutronL3Adapter , floatIpDataMapCache);
260 // Suppress the called to these functions
261 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programInboundIpRewriteStage1", Long.class, Long.class, String.class, String.class, String.class, Action.class));
263 Whitebox.invokeMethod(neutronL3Adapter, "programFlowsForFloatingIPInbound", neutronFloatingIp, Action.ADD);
264 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programInboundIpRewriteStage1", anyLong(), anyLong(), anyString(), anyString(), anyString(), eq(Action.ADD));
267 @SuppressWarnings({ "unchecked", "rawtypes" })
269 public void testProgramFlowsForFloatingIPOutbound() throws Exception {
270 Map floatIpDataMapCache = new HashMap();
272 NeutronFloatingIP neutronFloatingIp = mock(NeutronFloatingIP.class);
273 when(neutronFloatingIp.getID()).thenReturn(ID);
275 // init instance variables
276 floatIpDataMapCache.put(ID, floatingIpObject);
277 MemberModifier.field(NeutronL3Adapter.class, "floatIpDataMapCache").set(neutronL3Adapter , floatIpDataMapCache);
279 // Suppress the called to these functions
280 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programOutboundIpRewriteStage1", floatingIpClass, Action.class));
282 Whitebox.invokeMethod(neutronL3Adapter, "programFlowsForFloatingIPOutbound", neutronFloatingIp, Action.ADD);
283 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programOutboundIpRewriteStage1", any(floatingIpClass), eq(Action.ADD));
286 @SuppressWarnings({ "unchecked", "rawtypes" })
288 public void testFlushExistingIpRewrite() throws Exception {
289 Map floatIpDataMapCache = new HashMap();
291 // init instance variables
292 floatIpDataMapCache.put(ID, floatingIpObject);
293 MemberModifier.field(NeutronL3Adapter.class, "floatIpDataMapCache").set(neutronL3Adapter , floatIpDataMapCache);
295 // Suppress the called to these functions
296 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programOutboundIpRewriteStage1", floatingIpClass, Action.class));
297 PowerMockito.doReturn(floatIpDataMapCache.values()).when(neutronL3Adapter, "getAllFloatingIPsWithMetadata");
298 Whitebox.invokeMethod(neutronL3Adapter, "flushExistingIpRewrite");
299 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programOutboundIpRewriteStage1", any(floatingIpClass), eq(Action.DELETE));
302 @SuppressWarnings({ "unchecked", "rawtypes" })
304 public void testRebuildExistingIpRewrite() throws Exception {
305 Map floatIpDataMapCache = new HashMap();
307 // init instance variables
308 floatIpDataMapCache.put(ID, floatingIpObject);
309 MemberModifier.field(NeutronL3Adapter.class, "floatIpDataMapCache").set(neutronL3Adapter , floatIpDataMapCache);
311 // Suppress the called to these functions
312 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programOutboundIpRewriteStage1", floatingIpClass, Action.class));
314 PowerMockito.doReturn(floatIpDataMapCache.values()).when(neutronL3Adapter, "getAllFloatingIPsWithMetadata");
315 Whitebox.invokeMethod(neutronL3Adapter, "rebuildExistingIpRewrite");
316 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programOutboundIpRewriteStage1", any(floatingIpClass), eq(Action.ADD));
319 @SuppressWarnings({ "unchecked", "rawtypes" })
321 public void testProgramFlowsForFloatingIPArpAdd() throws Exception {
322 Map<String, Pair> neutronPortToDpIdCache = new HashMap<>();
323 Map<String, String> networkIdToRouterMacCache = new HashMap<>();
324 Map floatIpDataMapCache = new HashMap();
326 NeutronFloatingIP neutronFloatingIP = mock(NeutronFloatingIP.class);
327 when(neutronFloatingIP.getFixedIPAddress()).thenReturn(FIXED_IP_ADDRESS);
328 when(neutronFloatingIP.getFloatingIPAddress()).thenReturn(FLOATING_IP_ADDRESS);
329 when(neutronFloatingIP.getPortUUID()).thenReturn(UUID);
330 NeutronPort neutronPort = mock(NeutronPort.class);
331 when(neutronPort.getMacAddress()).thenReturn(MAC_ADDRESS);
332 NeutronNetwork neutronNetwork = mock(NeutronNetwork.class);
333 when(neutronNetwork.getProviderSegmentationID()).thenReturn(ID);
334 when(neutronNetwork.getID()).thenReturn(ID);
336 // init instance variables
337 floatIpDataMapCache.put(ID, floatingIpObject);
338 neutronPortToDpIdCache.put(UUID, mock(Pair.class));
339 networkIdToRouterMacCache.put(ID, MAC_ADDRESS);
340 INeutronNetworkCRUD neutronNetworkCache = mock(INeutronNetworkCRUD.class);
341 when(neutronNetworkCache.getNetwork(anyString())).thenReturn(neutronNetwork);
342 INeutronPortCRUD neutronPortCache = mock(INeutronPortCRUD.class);
343 when(neutronPortCache.getPort(anyString())).thenReturn(neutronPort);
344 PowerMockito.doReturn(neutronPort).when(neutronL3Adapter, "findNeutronPortForFloatingIp", anyString());
345 PowerMockito.doReturn(15L).when(neutronL3Adapter, "findOFPortForExtPatch", anyLong());
346 MemberModifier.field(NeutronL3Adapter.class, "floatIpDataMapCache").set(neutronL3Adapter , floatIpDataMapCache);
347 MemberModifier.field(NeutronL3Adapter.class, "neutronPortToDpIdCache").set(neutronL3Adapter , neutronPortToDpIdCache);
348 MemberModifier.field(NeutronL3Adapter.class, "neutronPortCache").set(neutronL3Adapter , neutronPortCache);
349 MemberModifier.field(NeutronL3Adapter.class, "neutronNetworkCache").set(neutronL3Adapter , neutronNetworkCache);
350 MemberModifier.field(NeutronL3Adapter.class, "networkIdToRouterMacCache").set(neutronL3Adapter , networkIdToRouterMacCache);
352 // Suppress the called to these functions
353 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "findNeutronPortForFloatingIp", String.class));
354 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "findOFPortForExtPatch", Long.class));
356 Whitebox.invokeMethod(neutronL3Adapter, "programFlowsForFloatingIPArpAdd", neutronFloatingIP);
357 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("findNeutronPortForFloatingIp", anyString());
358 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("findOFPortForExtPatch", anyLong());
361 @SuppressWarnings({ "unchecked", "rawtypes" })
363 public void testProgramFlowsForFloatingIPArpDelete() throws Exception {
364 Map floatIpDataMapCache = new HashMap();
366 // init instance variables
367 floatIpDataMapCache.put(ID, floatingIpObject);
368 MemberModifier.field(NeutronL3Adapter.class, "floatIpDataMapCache").set(neutronL3Adapter , floatIpDataMapCache);
370 Whitebox.invokeMethod(neutronL3Adapter, "programFlowsForFloatingIPArpDelete", ID);
374 public void testFindNeutronPortForFloatingIp() throws Exception {
375 NeutronPort neutronPort = mock(NeutronPort.class);
376 when(neutronPort.getDeviceOwner()).thenReturn(OWNER_FLOATING_IP);
377 when(neutronPort.getDeviceID()).thenReturn(ID);
378 List<NeutronPort> list_neutronPort = new ArrayList<>();
379 list_neutronPort.add(neutronPort);
380 INeutronPortCRUD neutronPortCache = mock(INeutronPortCRUD.class);
381 when(neutronPortCache.getAllPorts()).thenReturn(list_neutronPort);
383 MemberModifier.field(NeutronL3Adapter.class, "neutronPortCache").set(neutronL3Adapter , neutronPortCache);
385 assertEquals("Error, did not return the correct NeutronPort", neutronPort, Whitebox.invokeMethod(neutronL3Adapter, "findNeutronPortForFloatingIp", ID));
389 public void testFindOFPortForExtPatch() throws Exception {
390 ConfigurationService configurationService = mock(ConfigurationService.class);
391 when(configurationService.getPatchPortName(any(Pair.class))).thenReturn(PORT_INT);
392 MemberModifier.field(NeutronL3Adapter.class, "configurationService").set(neutronL3Adapter , configurationService);
393 List<Node> nodes = new ArrayList<>();
394 nodes.add(mock(Node.class));
395 NodeCacheManager nodeCacheManager = mock(NodeCacheManager.class);
396 when(nodeCacheManager.getBridgeNodes()).thenReturn(nodes);
397 MemberModifier.field(NeutronL3Adapter.class, "nodeCacheManager").set(neutronL3Adapter , nodeCacheManager);
398 Southbound southbound = mock(Southbound.class);
399 when(southbound.getDataPathId(any(Node.class))).thenReturn(Long.valueOf(ID));
400 OvsdbTerminationPointAugmentation terminationPointOfBridge = mock(OvsdbTerminationPointAugmentation.class);
401 when(terminationPointOfBridge.getOfport()).thenReturn(Long.valueOf(ID));
402 when(southbound.getTerminationPointOfBridge(any(Node.class), anyString())).thenReturn(terminationPointOfBridge);
403 MemberModifier.field(NeutronL3Adapter.class, "southbound").set(neutronL3Adapter , southbound);
405 assertEquals("Error, did not return the correct NeutronPort", Long.valueOf(ID), Whitebox.invokeMethod(neutronL3Adapter, "findOFPortForExtPatch", Long.valueOf(ID)));
409 public void testHandleNeutronNetworkEvent() throws Exception {
410 // Nothing to be done here
411 Map<String,NeutronNetwork> networkCleanupCache = new HashMap<>();
413 MemberModifier.field(NeutronL3Adapter.class, "networkCleanupCache").set(neutronL3Adapter , networkCleanupCache);
414 Whitebox.invokeMethod(neutronL3Adapter, "handleNeutronNetworkEvent", mock(NeutronNetwork.class), Action.ADD);
418 public void testHandleInterfaceEvent() throws Exception {
419 Map<String, Pair<Long, Uuid>> neutronPortToDpIdCache = new HashMap<>();
420 // init instance variables
421 TenantNetworkManager tenantNetworkManager = mock(TenantNetworkManager.class);
422 MemberModifier.field(NeutronL3Adapter.class, "tenantNetworkManager").set(neutronL3Adapter , tenantNetworkManager);
423 MemberModifier.field(NeutronL3Adapter.class, "neutronPortToDpIdCache").set(neutronL3Adapter , neutronPortToDpIdCache);
426 NodeId nodeId = mock(NodeId.class);
427 when(nodeId.getValue()).thenReturn(ID);
428 Node node = mock(Node.class);
429 when(node.getNodeId()).thenReturn(nodeId);
431 OvsdbTerminationPointAugmentation intf = mock(OvsdbTerminationPointAugmentation.class);
432 when(intf.getInterfaceUuid()).thenReturn(mock(Uuid.class));
433 when(intf.getName()).thenReturn(INTF_NAME);
435 NeutronPort neutronPort = mock(NeutronPort.class);
436 when(neutronPort.getPortUUID()).thenReturn(UUID);
438 when(tenantNetworkManager.getTenantPort(intf)).thenReturn(neutronPort);
440 // Suppress the called to these functions
441 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "getDpidForIntegrationBridge", Node.class));
442 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "handleInterfaceEventAdd", String.class, Long.class, Uuid.class));
443 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "handleInterfaceEventDelete", OvsdbTerminationPointAugmentation.class, Long.class));
444 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "storePortInCleanupCache", NeutronPort.class));
446 PowerMockito.when(neutronL3Adapter, "getDpidForIntegrationBridge", any(Node.class)).thenReturn(45L);
447 Mockito.doNothing().when(neutronL3Adapter).handleNeutronPortEvent(any(NeutronPort.class), any(Action.class));
449 neutronL3Adapter.handleInterfaceEvent(node, intf, mock(NeutronNetwork.class), Action.ADD);
450 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("getDpidForIntegrationBridge", any(Node.class));
451 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("handleInterfaceEventAdd", any(String.class), anyLong(), any(Uuid.class));
452 Mockito.verify(neutronL3Adapter).handleNeutronPortEvent(neutronPort, Action.ADD);
454 neutronL3Adapter.handleInterfaceEvent(node, intf, mock(NeutronNetwork.class), Action.DELETE);
455 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("handleInterfaceEventDelete", any(OvsdbTerminationPointAugmentation.class), anyLong());
456 Mockito.verify(neutronL3Adapter).handleNeutronPortEvent(neutronPort, Action.DELETE);
460 public void testHandleInterfaceEventAdd() throws Exception {
461 Map<String, Pair<Long, Uuid>> neutronPortToDpIdCache = new HashMap<>();
462 // init instance variables
463 MemberModifier.field(NeutronL3Adapter.class, "neutronPortToDpIdCache").set(neutronL3Adapter , neutronPortToDpIdCache);
464 int temp = neutronPortToDpIdCache.size();
466 Whitebox.invokeMethod(neutronL3Adapter, "handleInterfaceEventAdd", "", Long.valueOf(5), mock(Uuid.class));
468 assertEquals("Error, did not add the port", temp+1, neutronPortToDpIdCache.size());
471 @SuppressWarnings("unchecked")
473 public void testHandleInterfaceEventDelete() throws Exception {
474 Map<String, Pair<Long, Uuid>> neutronPortToDpIdCache = new HashMap<>();
475 OvsdbTerminationPointAugmentation intf = mock(OvsdbTerminationPointAugmentation.class);
476 Uuid uuid = mock(Uuid.class);
477 when(intf.getInterfaceUuid()).thenReturn(uuid );
478 Pair<Long, Uuid> pair = mock(Pair.class);
479 when(pair.getRight()).thenReturn(uuid);
481 // init instance variables
482 neutronPortToDpIdCache.put("key", pair);
483 MemberModifier.field(NeutronL3Adapter.class, "neutronPortToDpIdCache").set(neutronL3Adapter , neutronPortToDpIdCache);
484 int temp = neutronPortToDpIdCache.size();
486 Whitebox.invokeMethod(neutronL3Adapter, "handleInterfaceEventDelete", intf, Long.valueOf(ID));
488 assertEquals("Error, did not remove the port", temp-1, neutronPortToDpIdCache.size());
492 public void testUpdateL3ForNeutronPort() throws Exception {
493 Map<String, String> networkIdToRouterMacCache = new HashMap<>();
495 Neutron_IPs neutronIp = mock(Neutron_IPs.class);
496 when(neutronIp.getIpAddress()).thenReturn(FIXED_IP_ADDRESS);
497 List<Neutron_IPs> neutronIps = new ArrayList<>();
498 neutronIps.add(neutronIp);
499 NeutronPort neutronPort = mock(NeutronPort.class);
500 when(neutronPort.getNetworkUUID()).thenReturn(UUID);
501 when(neutronPort.getMacAddress()).thenReturn(MAC_ADDRESS_2);
502 when(neutronPort.getFixedIPs()).thenReturn(neutronIps);
503 NeutronNetwork neutronNetwork = mock(NeutronNetwork.class);
504 when(neutronNetwork.getProviderSegmentationID()).thenReturn(ID);
505 List<Node> nodes = new ArrayList<>();
506 nodes.add(mock(Node.class));
507 TenantNetworkManager tenantNetworkManager = mock(TenantNetworkManager.class);
508 MemberModifier.field(NeutronL3Adapter.class, "tenantNetworkManager").set(neutronL3Adapter , tenantNetworkManager);
509 when(tenantNetworkManager.isTenantNetworkPresentInNode(any(Node.class), eq(ID))).thenReturn(true);
510 PowerMockito.doReturn(15L).when(neutronL3Adapter, "getDpidForIntegrationBridge", any(Node.class));
512 // init instance variables
513 networkIdToRouterMacCache .put(UUID, MAC_ADDRESS);
514 MemberModifier.field(NeutronL3Adapter.class, "networkIdToRouterMacCache").set(neutronL3Adapter , networkIdToRouterMacCache);
515 INeutronNetworkCRUD neutronNetworkCache = mock(INeutronNetworkCRUD.class);
516 when(neutronNetworkCache.getNetwork(anyString())).thenReturn(neutronNetwork);
517 MemberModifier.field(NeutronL3Adapter.class, "neutronNetworkCache").set(neutronL3Adapter , neutronNetworkCache);
518 NodeCacheManager nodeCacheManager = mock(NodeCacheManager.class);
519 when(nodeCacheManager.getBridgeNodes()).thenReturn(nodes);
520 MemberModifier.field(NeutronL3Adapter.class, "nodeCacheManager").set(neutronL3Adapter , nodeCacheManager);
522 // Suppress the called to these functions
523 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "getDpidForIntegrationBridge", Node.class));
524 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programL3ForwardingStage1", Node.class, Long.class, String.class, String.class, String.class, Action.class));
526 Whitebox.invokeMethod(neutronL3Adapter, "updateL3ForNeutronPort", neutronPort, false);
527 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("getDpidForIntegrationBridge", any(Node.class));
528 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programL3ForwardingStage1", any(Node.class), anyLong(), anyString(), anyString(), anyString(), eq(Action.ADD));
530 Whitebox.invokeMethod(neutronL3Adapter, "updateL3ForNeutronPort", neutronPort, true);
531 PowerMockito.verifyPrivate(neutronL3Adapter, times(2)).invoke("getDpidForIntegrationBridge", any(Node.class));
532 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programL3ForwardingStage1", any(Node.class), anyLong(), anyString(), anyString(), anyString(), eq(Action.DELETE));
536 public void testProgramL3ForwardingStage1() throws Exception {
538 NodeId nodeId = mock(NodeId.class);
539 when(nodeId.getValue()).thenReturn(ID);
540 Node node = mock(Node.class);
541 when(node.getNodeId()).thenReturn(nodeId);
543 // Suppress the called to these functions
544 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programL3ForwardingStage2", Node.class, Long.class, String.class, String.class, String.class, Action.class));
546 // init instance variables
547 PowerMockito.when(neutronL3Adapter, "programL3ForwardingStage2", any(Node.class), anyLong(), anyString(), anyString(), anyString(), eq(Action.ADD)).thenReturn(new Status(StatusCode.SUCCESS));
548 PowerMockito.when(neutronL3Adapter, "programL3ForwardingStage2", any(Node.class), anyLong(), anyString(), anyString(), anyString(), eq(Action.DELETE)).thenReturn(new Status(StatusCode.SUCCESS));
551 Whitebox.invokeMethod(neutronL3Adapter, "programL3ForwardingStage1", node, Long.valueOf(45), SEG_ID, MAC_ADDRESS, IP, Action.ADD);
552 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programL3ForwardingStage2", any(Node.class), anyLong(), anyString(), anyString(), anyString(), eq(Action.ADD));
555 Whitebox.invokeMethod(neutronL3Adapter, "programL3ForwardingStage1", node, Long.valueOf(45), SEG_ID, MAC_ADDRESS, IP, Action.DELETE);
556 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programL3ForwardingStage2", any(Node.class), anyLong(), anyString(), anyString(), anyString(), eq(Action.DELETE));
560 public void testProgramL3ForwardingStage2() throws Exception {
561 NodeId nodeId = mock(NodeId.class);
562 when(nodeId.getValue()).thenReturn(ID);
563 Node node = mock(Node.class);
564 when(node.getNodeId()).thenReturn(nodeId);
566 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));
568 PowerMockito.mockStatic(InetAddress.class);
569 InetAddress inetAddress = mock(InetAddress.class);
570 PowerMockito.when(InetAddress.getByName(anyString())).thenReturn(inetAddress);
572 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));
576 public void testProgramFlowsForNeutronRouterInterface() throws Exception {
577 Map<String, String> networkIdToRouterMacCache = new HashMap<>();
578 Map<String, List<Neutron_IPs>> networkIdToRouterIpListCache = new HashMap<>();
579 Map<String, NeutronRouter_Interface> subnetIdToRouterInterfaceCache = new HashMap<>();
581 NeutronRouter_Interface intf = mock(NeutronRouter_Interface.class);
582 when(intf.getPortUUID()).thenReturn(UUID);
583 when(intf.getSubnetUUID()).thenReturn(UUID);
584 Neutron_IPs neutronIp = mock(Neutron_IPs.class);
585 when(neutronIp.getIpAddress()).thenReturn(FIXED_IP_ADDRESS);
586 List<Neutron_IPs> ips = new ArrayList<>();
588 NeutronPort neutronPort = mock(NeutronPort.class);
589 when(neutronPort.getMacAddress()).thenReturn(MAC_ADDRESS);
590 when(neutronPort.getFixedIPs()).thenReturn(ips);
591 when(neutronPort.getNetworkUUID()).thenReturn(UUID);
592 NeutronSubnet neutronSubnet = mock(NeutronSubnet.class);
593 when(neutronSubnet.getNetworkUUID()).thenReturn(UUID);
594 when(neutronSubnet.getGatewayIP()).thenReturn(IP);
595 when(neutronSubnet.getCidr()).thenReturn("cidr");
596 NeutronNetwork neutronNetwork = mock(NeutronNetwork.class);
597 when(neutronNetwork.getProviderSegmentationID()).thenReturn(ID);
598 when(neutronNetwork.getRouterExternal()).thenReturn(false); //might change that to true
599 when(neutronNetwork.getNetworkUUID()).thenReturn(UUID);
600 NeutronRouter neutronRouter = mock(NeutronRouter.class);
602 Node node = mock(Node.class);
603 List<Node> nodes = new ArrayList<>();
606 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "getDpidForIntegrationBridge", Node.class));
607 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));
608 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programFlowForNetworkFromExternal", Node.class, Long.class, String.class, String.class, String.class, int.class, Action.class));
609 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programIpRewriteExclusionStage1", Node.class, Long.class, String.class, String.class, Action.class));
611 // init instance variables
612 INeutronPortCRUD neutronPortCache = mock(INeutronPortCRUD.class);
613 PowerMockito.when(neutronPortCache.getPort(anyString())).thenReturn(neutronPort);
614 PowerMockito.when(neutronPortCache.getAllPorts()).thenReturn(new ArrayList<NeutronPort>());
615 INeutronSubnetCRUD neutronSubnetCache = mock(INeutronSubnetCRUD.class);
616 PowerMockito.when(neutronSubnetCache.getSubnet(anyString())).thenReturn(neutronSubnet);
617 INeutronNetworkCRUD neutronNetworkCache = mock(INeutronNetworkCRUD.class);
618 PowerMockito.when(neutronNetworkCache.getNetwork(anyString())).thenReturn(neutronNetwork);
619 NodeCacheManager nodeCacheManager = mock(NodeCacheManager.class);
620 PowerMockito.when(nodeCacheManager.getBridgeNodes()).thenReturn(nodes);
621 MemberModifier.field(NeutronL3Adapter.class, "networkIdToRouterMacCache").set(neutronL3Adapter , networkIdToRouterMacCache);
622 MemberModifier.field(NeutronL3Adapter.class, "networkIdToRouterIpListCache").set(neutronL3Adapter , networkIdToRouterIpListCache);
623 MemberModifier.field(NeutronL3Adapter.class, "subnetIdToRouterInterfaceCache").set(neutronL3Adapter , subnetIdToRouterInterfaceCache);
624 MemberModifier.field(NeutronL3Adapter.class, "neutronPortCache").set(neutronL3Adapter , neutronPortCache);
625 MemberModifier.field(NeutronL3Adapter.class, "neutronSubnetCache").set(neutronL3Adapter , neutronSubnetCache);
626 MemberModifier.field(NeutronL3Adapter.class, "neutronNetworkCache").set(neutronL3Adapter , neutronNetworkCache);
627 MemberModifier.field(NeutronL3Adapter.class, "nodeCacheManager").set(neutronL3Adapter , nodeCacheManager);
628 PowerMockito.when(neutronL3Adapter, "getDpidForIntegrationBridge", any(Node.class)).thenReturn(45L);
630 int networkIdToRouterMacCacheSize, networkIdToRouterIpListCacheSize, subnetIdToRouterInterfaceCacheSize;
631 networkIdToRouterMacCacheSize = networkIdToRouterMacCache.size();
632 networkIdToRouterIpListCacheSize = networkIdToRouterIpListCache.size();
633 subnetIdToRouterInterfaceCacheSize = subnetIdToRouterInterfaceCache.size();
635 Whitebox.invokeMethod(neutronL3Adapter, "programFlowsForNeutronRouterInterface", intf, false);
637 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("getDpidForIntegrationBridge", any(Node.class));
638 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());
639 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programFlowForNetworkFromExternal", any(Node.class), anyLong(), anyString(), anyString(), anyString(), anyInt(), eq(Action.ADD));
640 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programIpRewriteExclusionStage1", any(Node.class), anyLong(), anyString(), anyString(), eq(Action.ADD));
641 assertEquals("Error, did not add the RouterMac", networkIdToRouterMacCacheSize, networkIdToRouterMacCache.size() -1);
642 assertEquals("Error, did not add the RouterIP", networkIdToRouterIpListCacheSize, networkIdToRouterIpListCache.size() -1);
643 assertEquals("Error, did not add the RouterInterface", subnetIdToRouterInterfaceCacheSize, subnetIdToRouterInterfaceCache.size() -1);
645 networkIdToRouterMacCache.put(UUID, MAC_ADDRESS);
646 networkIdToRouterIpListCache.put(UUID, ips);
647 subnetIdToRouterInterfaceCache.put(UUID, intf);
648 networkIdToRouterMacCacheSize = networkIdToRouterMacCache.size();
649 networkIdToRouterIpListCacheSize = networkIdToRouterIpListCache.size();
650 subnetIdToRouterInterfaceCacheSize = subnetIdToRouterInterfaceCache.size();
652 Whitebox.invokeMethod(neutronL3Adapter, "handleNeutronRouterInterfaceEvent", neutronRouter, intf, Action.DELETE);
654 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programFlowsForNeutronRouterInterface", intf, true);
655 PowerMockito.verifyPrivate(neutronL3Adapter, times(2)).invoke("getDpidForIntegrationBridge", any(Node.class));
656 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());
657 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programFlowForNetworkFromExternal", any(Node.class), anyLong(), anyString(), anyString(), anyString(), anyInt(), eq(Action.DELETE));
658 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programIpRewriteExclusionStage1", any(Node.class), anyLong(), anyString(), anyString(), eq(Action.DELETE));
659 assertEquals("Error, did not remove the RouterMac", networkIdToRouterMacCacheSize, networkIdToRouterMacCache.size() +1);
660 assertEquals("Error, did not remove the RouterIP", networkIdToRouterIpListCacheSize, networkIdToRouterIpListCache.size() +1);
661 assertEquals("Error, did not remove the RouterInterface", subnetIdToRouterInterfaceCacheSize, subnetIdToRouterInterfaceCache.size() +1);
665 public void testProgramFlowForNetworkFromExternal() throws Exception {
666 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programRouterInterfaceStage1", Node.class, Long.class, String.class, String.class, String.class, String.class, int.class, Action.class));
668 Whitebox.invokeMethod(neutronL3Adapter, "programFlowForNetworkFromExternal", mock(Node.class), Long.valueOf(12), "", "", "", 4, Action.ADD);
670 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programRouterInterfaceStage1", any(Node.class), anyLong(), anyString(), anyString(), anyString(), anyString(), anyInt(), any(Action.class));
674 public void testProgramFlowsForNeutronRouterInterfacePair() throws Exception {
675 NeutronRouter_Interface srcNeutronRouterInterface = mock(NeutronRouter_Interface.class);
676 when(srcNeutronRouterInterface.getSubnetUUID()).thenReturn(UUID);
677 when(srcNeutronRouterInterface.getID()).thenReturn(ID);
678 when(srcNeutronRouterInterface.getPortUUID()).thenReturn(UUID);
679 NeutronRouter_Interface dstNeutronRouterInterface = mock(NeutronRouter_Interface.class);
680 NeutronNetwork neutronNetwork = mock(NeutronNetwork.class);
681 when(neutronNetwork.getTenantID()).thenReturn(ID);
682 when(neutronNetwork.getProviderSegmentationID()).thenReturn(ID);
683 Neutron_IPs ip = mock(Neutron_IPs.class);
684 when(ip.getIpAddress()).thenReturn(IP);
685 List<Neutron_IPs> ips = new ArrayList<>();
689 NeutronPort neutronPort = mock(NeutronPort.class);
690 when(neutronPort.getMacAddress()).thenReturn(MAC_ADDRESS);
691 when(neutronPort.getFixedIPs()).thenReturn(ips);
692 NeutronSubnet neutronSubnet = mock(NeutronSubnet.class);
693 when(neutronSubnet.getNetworkUUID()).thenReturn(UUID);
694 when(neutronSubnet.getCidr()).thenReturn(CIDR);
696 INeutronSubnetCRUD neutronSubnetCache = mock(INeutronSubnetCRUD.class);
697 PowerMockito.when(neutronSubnetCache.getSubnet(anyString())).thenReturn(neutronSubnet);
698 MemberModifier.field(NeutronL3Adapter.class, "neutronSubnetCache").set(neutronL3Adapter , neutronSubnetCache);
699 INeutronNetworkCRUD neutronNetworkCache = mock(INeutronNetworkCRUD.class);
700 PowerMockito.when(neutronNetworkCache.getNetwork(anyString())).thenReturn(neutronNetwork);
701 MemberModifier.field(NeutronL3Adapter.class, "neutronNetworkCache").set(neutronL3Adapter , neutronNetworkCache);
702 INeutronPortCRUD neutronPortCache = mock(INeutronPortCRUD.class);
703 PowerMockito.when(neutronPortCache.getPort(anyString())).thenReturn(neutronPort);
704 MemberModifier.field(NeutronL3Adapter.class, "neutronPortCache").set(neutronL3Adapter , neutronPortCache);
706 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programRouterInterfaceStage1", Node.class, Long.class, String.class, String.class, String.class, String.class, int.class, Action.class));
707 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "getMaskLenFromCidr", String.class));
709 Whitebox.invokeMethod(neutronL3Adapter, "programFlowsForNeutronRouterInterfacePair", mock(Node.class), Long.valueOf(12), srcNeutronRouterInterface, dstNeutronRouterInterface, neutronNetwork, SEG_ID, MAC_ADDRESS, IP, 4, Action.ADD, false);
710 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programRouterInterfaceStage1", any(Node.class), anyLong(), anyString(), anyString(), anyString(), anyString(), anyInt(), any(Action.class));
712 Whitebox.invokeMethod(neutronL3Adapter, "programFlowsForNeutronRouterInterfacePair", mock(Node.class), Long.valueOf(12), srcNeutronRouterInterface, dstNeutronRouterInterface, neutronNetwork, SEG_ID, MAC_ADDRESS, IP, 4, Action.ADD, true);
713 PowerMockito.verifyPrivate(neutronL3Adapter, times(2)).invoke("programRouterInterfaceStage1", any(Node.class), anyLong(), anyString(), anyString(), anyString(), anyString(), anyInt(), any(Action.class));
714 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("getMaskLenFromCidr", anyString());
715 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
719 public void testProgramRouterInterfaceStage1() throws Exception {
721 NodeId nodeId = mock(NodeId.class);
722 when(nodeId.getValue()).thenReturn(ID);
723 Node node = mock(Node.class);
724 when(node.getNodeId()).thenReturn(nodeId);
726 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programRouterInterfaceStage2", Node.class, Long.class, String.class, String.class, String.class, String.class, int.class, Action.class));
728 PowerMockito.when(neutronL3Adapter, "programRouterInterfaceStage2", any(Node.class), anyLong(), anyString(), anyString(), anyString(), anyString(), anyInt(), any(Action.class)).thenReturn(new Status(StatusCode.SUCCESS));
731 Whitebox.invokeMethod(neutronL3Adapter, "programRouterInterfaceStage1", node, Long.valueOf(12), SEG_ID, SEG_ID, MAC_ADDRESS, IP, 4, Action.ADD);
733 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programRouterInterfaceStage1", any(Node.class), anyLong(), anyString(), anyString(), anyString(), anyString(), anyInt(), eq(Action.ADD));
735 Whitebox.invokeMethod(neutronL3Adapter, "programRouterInterfaceStage1", node, Long.valueOf(12), SEG_ID, SEG_ID, MAC_ADDRESS, IP, 4, Action.DELETE);
737 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programRouterInterfaceStage1", any(Node.class), anyLong(), anyString(), anyString(), anyString(), anyString(), anyInt(), eq(Action.DELETE));
741 public void testProgramRouterInterfaceStage2() throws Exception {
742 NodeId nodeId = mock(NodeId.class);
743 when(nodeId.getValue()).thenReturn(ID);
744 Node node = mock(Node.class);
745 when(node.getNodeId()).thenReturn(nodeId);
747 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));
749 PowerMockito.mockStatic(InetAddress.class);
750 InetAddress inetAddress = mock(InetAddress.class);
751 PowerMockito.when(InetAddress.getByName(anyString())).thenReturn(inetAddress);
753 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));
758 public void testProgramInboundIpRewriteStage1() throws Exception {
760 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programInboundIpRewriteStage2", Long.class, Long.class, String.class, String.class, String.class, Action.class));
762 PowerMockito.when(neutronL3Adapter, "programInboundIpRewriteStage2", anyLong(), anyLong(), anyString(), anyString(), anyString(), any(Action.class)).thenReturn(new Status(StatusCode.SUCCESS));
765 Whitebox.invokeMethod(neutronL3Adapter, "programInboundIpRewriteStage1", Long.valueOf(12), Long.valueOf(12), PORT_INT, MAC_ADDRESS, IP, Action.ADD);
767 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programInboundIpRewriteStage2", anyLong(), anyLong(), anyString(), anyString(), anyString(), eq(Action.ADD));
769 Whitebox.invokeMethod(neutronL3Adapter, "programInboundIpRewriteStage1", Long.valueOf(12), Long.valueOf(12),PORT_INT, MAC_ADDRESS, IP, Action.DELETE);
771 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programInboundIpRewriteStage2", anyLong(), anyLong(), anyString(), anyString(), anyString(), eq(Action.DELETE));
775 public void testProgramInboundIpRewriteStage2() throws Exception {
776 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));
778 PowerMockito.mockStatic(InetAddress.class);
779 InetAddress inetAddress = mock(InetAddress.class);
780 PowerMockito.when(InetAddress.getByName(anyString())).thenReturn(inetAddress);
782 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));
786 public void testProgramIpRewriteExclusionStage1() throws Exception {
788 NodeId nodeId = mock(NodeId.class);
789 when(nodeId.getValue()).thenReturn(ID);
790 Node node = mock(Node.class);
791 when(node.getNodeId()).thenReturn(nodeId);
793 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programIpRewriteExclusionStage2", Node.class, Long.class, String.class, String.class, Action.class));
795 PowerMockito.when(neutronL3Adapter, "programIpRewriteExclusionStage2", any(Node.class), anyLong(), anyString(), anyString(), any(Action.class)).thenReturn(new Status(StatusCode.SUCCESS));
798 Whitebox.invokeMethod(neutronL3Adapter, "programIpRewriteExclusionStage1", node, Long.valueOf(12), SEG_ID, CIDR, Action.ADD);
800 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programIpRewriteExclusionStage2", any(Node.class), anyLong(), anyString(), anyString(), eq(Action.ADD));
802 Whitebox.invokeMethod(neutronL3Adapter, "programIpRewriteExclusionStage1", node, Long.valueOf(12), SEG_ID, CIDR, Action.DELETE);
804 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programIpRewriteExclusionStage2", any(Node.class), anyLong(), anyString(), anyString(), eq(Action.DELETE));
808 public void testProgramIpRewriteExclusionStage2() throws Exception {
809 NodeId nodeId = mock(NodeId.class);
810 when(nodeId.getValue()).thenReturn(ID);
811 Node node = mock(Node.class);
812 when(node.getNodeId()).thenReturn(nodeId);
814 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));
817 @SuppressWarnings("unchecked")
819 public void testProgramOutboundIpRewriteStage1() throws Exception{
821 MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programOutboundIpRewriteStage2", floatingIpClass, Action.class));
823 PowerMockito.when(neutronL3Adapter, "programOutboundIpRewriteStage2", any(floatingIpClass), any(Action.class)).thenReturn(new Status(StatusCode.SUCCESS));
826 Whitebox.invokeMethod(neutronL3Adapter, "programOutboundIpRewriteStage1", floatingIpObject, Action.ADD);
828 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programOutboundIpRewriteStage2", any(floatingIpClass), eq(Action.ADD));
830 Whitebox.invokeMethod(neutronL3Adapter, "programOutboundIpRewriteStage1", floatingIpObject, Action.DELETE);
832 PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programOutboundIpRewriteStage2", any(floatingIpClass), eq(Action.DELETE));
836 public void testPrepareProgramOutboundIpRewriteStage2() throws Exception {
837 assertEquals("Error, did not return the correct status code", new Status(StatusCode.BADREQUEST), Whitebox.invokeMethod(neutronL3Adapter, "programOutboundIpRewriteStage2", floatingIpObject, Action.ADD));
839 PowerMockito.mockStatic(InetAddress.class);
840 InetAddress inetAddress = mock(InetAddress.class);
841 PowerMockito.when(InetAddress.getByName(anyString())).thenReturn(inetAddress);
843 assertEquals("Error, did not return the correct status code", new Status(StatusCode.SUCCESS), Whitebox.invokeMethod(neutronL3Adapter, "programOutboundIpRewriteStage2", floatingIpObject, Action.ADD));
847 public void testGetMaskLenFromCidr() throws Exception {
848 assertEquals("Error, did not return the correct mask", 32, (int) Whitebox.invokeMethod(neutronL3Adapter, "getMaskLenFromCidr", IP_MASK));
852 public void testGetDpidForIntegrationBridge() throws Exception {
853 Southbound southbound = mock(Southbound.class);
854 ConfigurationService configurationService = mock(ConfigurationService.class);
856 MemberModifier.field(NeutronL3Adapter.class, "southbound").set(neutronL3Adapter , southbound);
857 MemberModifier.field(NeutronL3Adapter.class, "configurationService").set(neutronL3Adapter , configurationService);
859 PowerMockito.when(southbound.getBridge(any(Node.class), anyString())).thenReturn(mock(OvsdbBridgeAugmentation.class));
860 PowerMockito.when(configurationService.getIntegrationBridgeName()).thenReturn("");
861 PowerMockito.when(southbound.getDataPathId(any(Node.class))).thenReturn(45L);
863 assertEquals("Error, did not return the correct Dpid", 45L, (long) Whitebox.invokeMethod(neutronL3Adapter, "getDpidForIntegrationBridge", mock(Node.class)));
867 public void testencodeExcplicitOFPort() throws Exception {
868 assertEquals("Error, did not correctly encode the port", OFPort, NeutronL3Adapter.encodeExcplicitOFPort(45L));
872 public void testSetDependencies() throws Exception {
873 Map<String,NeutronNetwork> networkCleanupCache = new HashMap<>();
874 INeutronNetworkCRUD neutronNetworkCache = mock(INeutronNetworkCRUD.class);
875 NeutronNetwork neutronNetwork = mock(NeutronNetwork.class);
876 List <NeutronNetwork> neutronNetworkList = new ArrayList<NeutronNetwork>();
877 neutronNetworkList.add(neutronNetwork);
878 when(neutronNetworkCache.getAllNetworks()).thenReturn(neutronNetworkList);
880 Map<String,NeutronPort> portCleanupCache = new HashMap<>();
881 INeutronPortCRUD neutronPortCache = mock(INeutronPortCRUD.class);
882 NeutronPort neutronPort = mock(NeutronPort.class);
883 List <NeutronPort> neutronPortList = new ArrayList<NeutronPort>();
884 neutronPortList.add(neutronPort);
885 when(neutronPortCache.getAllPorts()).thenReturn(neutronPortList);
887 MemberModifier.field(NeutronL3Adapter.class, "networkCleanupCache").set(neutronL3Adapter , networkCleanupCache);
888 MemberModifier.field(NeutronL3Adapter.class, "neutronNetworkCache").set(neutronL3Adapter , neutronNetworkCache);
889 MemberModifier.field(NeutronL3Adapter.class, "portCleanupCache").set(neutronL3Adapter , portCleanupCache);
890 MemberModifier.field(NeutronL3Adapter.class, "neutronPortCache").set(neutronL3Adapter , neutronPortCache);
893 when(neutronPort.getDeviceOwner()).thenReturn(OWNER_ROUTER_INTERFACE);
894 MemberModifier.field(NeutronL3Adapter.class, "portCleanupCache").set(neutronL3Adapter , portCleanupCache);
898 EventDispatcher eventDispatcher = mock(EventDispatcher.class);
899 TenantNetworkManager tenantNetworkManager = mock(TenantNetworkManager.class);
900 ConfigurationService configurationService = mock(ConfigurationService.class);
901 ArpProvider arpProvider = mock(ArpProvider.class);
902 DistributedArpService distributedArpService = mock(DistributedArpService.class);
903 InboundNatProvider inboundNatProvider = mock(InboundNatProvider.class);
904 OutboundNatProvider outboundNatProvider = mock(OutboundNatProvider.class);
905 RoutingProvider routingProvider = mock(RoutingProvider.class);
906 L3ForwardingProvider l3ForwardingProvider = mock(L3ForwardingProvider.class);
907 NodeCacheManager nodeCacheManager = mock(NodeCacheManager.class);
908 Southbound southbound = mock(Southbound.class);
910 ServiceHelper.overrideGlobalInstance(EventDispatcher.class, eventDispatcher);
911 ServiceHelper.overrideGlobalInstance(TenantNetworkManager.class, tenantNetworkManager);
912 ServiceHelper.overrideGlobalInstance(ConfigurationService.class, configurationService);
913 ServiceHelper.overrideGlobalInstance(ArpProvider.class, arpProvider);
914 ServiceHelper.overrideGlobalInstance(DistributedArpService.class, distributedArpService);
915 ServiceHelper.overrideGlobalInstance(InboundNatProvider.class, inboundNatProvider);
916 ServiceHelper.overrideGlobalInstance(OutboundNatProvider.class, outboundNatProvider);
917 ServiceHelper.overrideGlobalInstance(RoutingProvider.class, routingProvider);
918 ServiceHelper.overrideGlobalInstance(L3ForwardingProvider.class, l3ForwardingProvider);
919 ServiceHelper.overrideGlobalInstance(NodeCacheManager.class, nodeCacheManager);
920 ServiceHelper.overrideGlobalInstance(Southbound.class, southbound);
922 neutronL3Adapter.setDependencies(mock(ServiceReference.class));
924 assertEquals("Error, did not return the correct object", getAbstractHandlerField("eventDispatcher"),
926 assertEquals("Error, did not return the correct object", getField("tenantNetworkManager"), tenantNetworkManager);
927 assertEquals("Error, did not return the correct object", getField("configurationService"), configurationService);
928 assertEquals("Error, did not return the correct object", getField("arpProvider"), arpProvider);
929 assertEquals("Error, did not return the correct object", getField("distributedArpService"), distributedArpService);
930 assertEquals("Error, did not return the correct object", getField("inboundNatProvider"), inboundNatProvider);
931 assertEquals("Error, did not return the correct object", getField("outboundNatProvider"), outboundNatProvider);
932 assertEquals("Error, did not return the correct object", getField("routingProvider"), routingProvider);
933 assertEquals("Error, did not return the correct object", getField("l3ForwardingProvider"), l3ForwardingProvider);
934 assertEquals("Error, did not return the correct object", getField("nodeCacheManager"), nodeCacheManager);
935 assertEquals("Error, did not return the correct object", getField("southbound"), southbound);
939 public void testSetDependenciesObject() throws Exception{
940 MemberModifier.field(NeutronL3Adapter.class, "enabled").set(neutronL3Adapter , false);
942 INeutronNetworkCRUD iNeutronNetworkCRUD = mock(INeutronNetworkCRUD.class);
943 neutronL3Adapter.setDependencies(iNeutronNetworkCRUD);
944 assertEquals("Error, did not return the correct object", getField("neutronNetworkCache"), iNeutronNetworkCRUD);
946 INeutronPortCRUD iNeutronPortCRUD = mock(INeutronPortCRUD.class);
947 neutronL3Adapter.setDependencies(iNeutronPortCRUD);
948 assertEquals("Error, did not return the correct object", getField("neutronPortCache"), iNeutronPortCRUD);
950 INeutronSubnetCRUD iNeutronSubnetCRUD = mock(INeutronSubnetCRUD.class);
951 neutronL3Adapter.setDependencies(iNeutronSubnetCRUD);
952 assertEquals("Error, did not return the correct object", getField("neutronSubnetCache"), iNeutronSubnetCRUD);
954 ArpProvider arpProvider = mock(ArpProvider.class);
955 neutronL3Adapter.setDependencies(arpProvider);
956 assertEquals("Error, did not return the correct object", getField("arpProvider"), arpProvider);
958 InboundNatProvider inboundNatProvider = mock(InboundNatProvider.class);
959 neutronL3Adapter.setDependencies(inboundNatProvider);
960 assertEquals("Error, did not return the correct object", getField("inboundNatProvider"), inboundNatProvider);
962 OutboundNatProvider outboundNatProvider = mock(OutboundNatProvider.class);
963 neutronL3Adapter.setDependencies(outboundNatProvider);
964 assertEquals("Error, did not return the correct object", getField("outboundNatProvider"), outboundNatProvider);
966 RoutingProvider routingProvider = mock(RoutingProvider.class);
967 neutronL3Adapter.setDependencies(routingProvider);
968 assertEquals("Error, did not return the correct object", getField("routingProvider"), routingProvider);
970 L3ForwardingProvider l3ForwardingProvider = mock(L3ForwardingProvider.class);
971 neutronL3Adapter.setDependencies(l3ForwardingProvider);
972 assertEquals("Error, did not return the correct object", getField("l3ForwardingProvider"), l3ForwardingProvider);
974 MemberModifier.field(NeutronL3Adapter.class, "enabled").set(neutronL3Adapter , true);
977 private Object getAbstractHandlerField(String fieldName) throws Exception {
978 Field field = AbstractHandler.class.getDeclaredField(fieldName);
979 field.setAccessible(true);
980 return field.get(neutronL3Adapter);
983 private Object getField(String fieldName) throws Exception {
984 Field field = NeutronL3Adapter.class.getDeclaredField(fieldName);
985 field.setAccessible(true);
986 return field.get(neutronL3Adapter);
989 @SuppressWarnings("rawtypes")
990 private Object createFloatingIpObject() throws Exception{
991 Class clazz = Whitebox.getInnerClassType(NeutronL3Adapter.class, "FloatIpData");
992 Constructor [] constructors = clazz.getConstructors();
993 Constructor c = constructors[0];
994 return c.newInstance(neutronL3Adapter, 415L, 415L, "a", "b", "c", "d", "e");