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.netvirt.openstack.netvirt;
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertFalse;
13 import static org.junit.Assert.assertTrue;
14 import static org.mockito.Matchers.any;
15 import static org.mockito.Mockito.mock;
16 import static org.mockito.Mockito.times;
17 import static org.mockito.Mockito.verify;
18 import static org.mockito.Mockito.when;
20 import java.lang.reflect.Field;
21 import java.net.HttpURLConnection;
22 import java.util.ArrayList;
23 import java.util.Collections;
24 import java.util.List;
26 import org.junit.Before;
27 import org.junit.Test;
28 import org.junit.runner.RunWith;
29 import org.mockito.InjectMocks;
30 import org.mockito.Mock;
31 import org.mockito.Mockito;
32 import org.mockito.runners.MockitoJUnitRunner;
33 import org.opendaylight.netvirt.openstack.netvirt.api.Action;
34 import org.opendaylight.netvirt.openstack.netvirt.api.NodeCacheManager;
35 import org.opendaylight.netvirt.openstack.netvirt.translator.NeutronLoadBalancer;
36 import org.opendaylight.netvirt.openstack.netvirt.translator.NeutronLoadBalancerPoolMember;
37 import org.opendaylight.netvirt.openstack.netvirt.translator.crud.INeutronLoadBalancerPoolCRUD;
38 import org.opendaylight.netvirt.openstack.netvirt.translator.crud.INeutronNetworkCRUD;
39 import org.opendaylight.netvirt.openstack.netvirt.api.EventDispatcher;
40 import org.opendaylight.netvirt.openstack.netvirt.api.LoadBalancerConfiguration;
41 import org.opendaylight.netvirt.openstack.netvirt.api.LoadBalancerConfiguration.LoadBalancerPoolMember;
42 import org.opendaylight.netvirt.openstack.netvirt.api.LoadBalancerProvider;
43 import org.opendaylight.netvirt.openstack.netvirt.translator.NeutronLoadBalancerPool;
44 import org.opendaylight.netvirt.openstack.netvirt.translator.NeutronNetwork;
45 import org.opendaylight.netvirt.openstack.netvirt.translator.NeutronPort;
46 import org.opendaylight.netvirt.openstack.netvirt.translator.NeutronSubnet;
47 import org.opendaylight.netvirt.openstack.netvirt.translator.Neutron_IPs;
48 import org.opendaylight.netvirt.openstack.netvirt.translator.crud.INeutronLoadBalancerCRUD;
49 import org.opendaylight.netvirt.openstack.netvirt.translator.crud.INeutronPortCRUD;
50 import org.opendaylight.netvirt.openstack.netvirt.translator.crud.INeutronSubnetCRUD;
51 import org.opendaylight.netvirt.utils.servicehelper.ServiceHelper;
52 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology
54 import org.osgi.framework.ServiceReference;
57 * Unit test for {@link LBaaSPoolMemberHandler}
59 @RunWith(MockitoJUnitRunner.class)
60 public class LBaaSPoolHandlerTest {
62 @InjectMocks LBaaSPoolHandler lBaaSPoolHandler;
64 @Mock private INeutronLoadBalancerPoolCRUD neutronLBPoolCache;
65 @Mock private INeutronLoadBalancerCRUD neutronLBCache;
66 @Mock private LoadBalancerProvider loadBalancerProvider;
67 @Mock private NodeCacheManager nodeCacheManager;
69 @Mock private NeutronLoadBalancerPool neutronLBPool;
70 @Mock private INeutronSubnetCRUD neutronSubnetCache;
71 @Mock private INeutronNetworkCRUD neutronNetworkCache;
72 @Mock private INeutronPortCRUD neutronPortCache;
76 when(neutronLBPool.getLoadBalancerPoolProtocol()).thenReturn(LoadBalancerConfiguration.PROTOCOL_HTTP);
78 lBaaSPoolHandler.setDependencies(neutronPortCache);
79 final NeutronPort neutronPort = new NeutronPort();
80 final Neutron_IPs neutronIP1 = new Neutron_IPs();
81 neutronIP1.setSubnetUUID("pool_member_subnetID");
82 neutronIP1.setIpAddress("pool_member_address");
83 final Neutron_IPs neutronIP2 = new Neutron_IPs();
84 neutronIP2.setSubnetUUID("subnetID");
85 neutronIP2.setIpAddress("vip_address");
86 final Neutron_IPs neutronIP3 = new Neutron_IPs();
87 neutronIP3.setSubnetUUID("subnetID");
88 neutronIP3.setIpAddress("pool_member_address");
89 final List<Neutron_IPs> neutronIPs = new ArrayList<>();
90 neutronIPs.add(neutronIP1);
91 neutronIPs.add(neutronIP2);
92 neutronIPs.add(neutronIP3);
93 neutronPort.setFixedIPs(neutronIPs);
94 neutronPort.setMacAddress("mac_address");
95 when(neutronPortCache.getAllPorts()).thenReturn(Collections.singletonList(neutronPort));
97 lBaaSPoolHandler.setDependencies(neutronSubnetCache);
98 final NeutronSubnet neutronSubnet1 = new NeutronSubnet();
99 neutronSubnet1.setID("pool_member_subnetID");
100 neutronSubnet1.setNetworkUUID("pool_member_networkUUID");
101 final NeutronSubnet neutronSubnet2 = new NeutronSubnet();
102 neutronSubnet2.setID("subnetID");
103 neutronSubnet2.setNetworkUUID("pool_member_networkUUID");
104 List<NeutronSubnet> neutronSubnets = new ArrayList<>();
105 neutronSubnets.add(neutronSubnet1);
106 neutronSubnets.add(neutronSubnet2);
107 when(neutronSubnetCache.getAllSubnets()).thenReturn(neutronSubnets);
109 lBaaSPoolHandler.setDependencies(neutronNetworkCache);
110 final NeutronNetwork neutronNetwork = new NeutronNetwork();
111 neutronNetwork.setNetworkUUID("pool_member_networkUUID");
112 neutronNetwork.setProviderNetworkType("key");
113 neutronNetwork.setProviderSegmentationID("value");
114 when(neutronNetworkCache.getAllNetworks()).thenReturn(Collections.singletonList(neutronNetwork));
116 List<NeutronLoadBalancerPoolMember> members = new ArrayList<>();
117 NeutronLoadBalancerPoolMember neutronLBPoolMember = mock(NeutronLoadBalancerPoolMember.class);
118 when(neutronLBPoolMember.getPoolMemberAdminStateIsUp()).thenReturn(true);
119 when(neutronLBPoolMember.getPoolMemberSubnetID()).thenReturn("subnetID");
120 when(neutronLBPoolMember.getID()).thenReturn("pool_memberID");
121 when(neutronLBPoolMember.getPoolMemberAddress()).thenReturn("pool_member_address");
122 when(neutronLBPoolMember.getPoolMemberProtoPort()).thenReturn(1);
123 members.add(neutronLBPoolMember);
124 when(neutronLBPool.getLoadBalancerPoolMembers()).thenReturn(members);
126 List<NeutronLoadBalancer> list_neutronLB = new ArrayList<>();
127 NeutronLoadBalancer neutronLB = mock(NeutronLoadBalancer.class);
128 when(neutronLB.getLoadBalancerName()).thenReturn("load_balancer_name");
129 when(neutronLB.getLoadBalancerVipAddress()).thenReturn("vip_address");
130 when(neutronLB.getLoadBalancerVipSubnetID()).thenReturn("subnetID");
131 list_neutronLB.add(neutronLB);
132 when(neutronLBCache.getAllNeutronLoadBalancers()).thenReturn(list_neutronLB);
136 * Test method {@link LBaaSPoolHandler#canCreateNeutronLoadBalancerPool(NeutronLoadBalancerPool)}
139 public void testCanCreateNeutronLoadBalancerPoolMember() {
140 when(neutronLBPool.getLoadBalancerPoolProtocol())
141 .thenReturn(LoadBalancerConfiguration.PROTOCOL_HTTP) // to test HTTP_OK
142 .thenReturn(null) // to test HTTP_BAD_REQUEST
143 .thenReturn("dummy_proto"); // to test HTTP_NOT_ACCEPTABLE
145 assertEquals("Error, canCreateNeutronLoadBalancerPool() didn't return the correct HTTP flag", HttpURLConnection.HTTP_OK, lBaaSPoolHandler.canCreateNeutronLoadBalancerPool(neutronLBPool));
146 assertEquals("Error, canCreateNeutronLoadBalancerPool() didn't return the correct HTTP flag", HttpURLConnection.HTTP_BAD_REQUEST, lBaaSPoolHandler.canCreateNeutronLoadBalancerPool(neutronLBPool));
147 assertEquals("Error, canCreateNeutronLoadBalancerPool() didn't return the correct HTTP flag", HttpURLConnection.HTTP_NOT_ACCEPTABLE, lBaaSPoolHandler.canCreateNeutronLoadBalancerPool(neutronLBPool));
151 * Test method {@link LBaaSPoolHandler#canUpdateNeutronLoadBalancerPool(NeutronLoadBalancerPool, NeutronLoadBalancerPool)}
153 public void testCanUpdateNeutronLoadBalancerPool() {
154 assertEquals("Error, did not return the correct HTTP flag", HttpURLConnection.HTTP_NOT_IMPLEMENTED, lBaaSPoolHandler.canUpdateNeutronLoadBalancerPool(any(NeutronLoadBalancerPool.class), any(NeutronLoadBalancerPool.class)));
158 * Test method {@link LBaaSPoolHandler#canDeleteNeutronLoadBalancerPool(NeutronLoadBalancerPool)}
161 public void testCanDeleteNeutronLoadBalancerPool() {
162 when(neutronLBPool.getLoadBalancerPoolProtocol())
163 .thenReturn(LoadBalancerConfiguration.PROTOCOL_HTTP) // to test HTTP_OK
164 .thenReturn(null) // to test HTTP_BAD_REQUEST
165 .thenReturn("dummy_proto"); // to test HTTP_NOT_ACCEPTABLE
167 assertEquals("Error, canDeleteNeutronLoadBalancerPool() didn't return the correct HTTP flag", HttpURLConnection.HTTP_OK, lBaaSPoolHandler.canDeleteNeutronLoadBalancerPool(neutronLBPool));
168 assertEquals("Error, canDeleteNeutronLoadBalancerPool() didn't return the correct HTTP flag", HttpURLConnection.HTTP_BAD_REQUEST, lBaaSPoolHandler.canDeleteNeutronLoadBalancerPool(neutronLBPool));
169 assertEquals("Error, canDeleteNeutronLoadBalancerPool() didn't return the correct HTTP flag", HttpURLConnection.HTTP_NOT_ACCEPTABLE, lBaaSPoolHandler.canDeleteNeutronLoadBalancerPool(neutronLBPool));
173 * Test method {@link LBaaSPoolHandler#processEvent(AbstractEvent)}
176 public void testProcessEvent() {
177 LBaaSPoolHandler lbaasPoolHandlerSpy = Mockito.spy(lBaaSPoolHandler);
179 NorthboundEvent ev = mock(NorthboundEvent.class);
180 when(ev.getLoadBalancerPool()).thenReturn(neutronLBPool);
182 List<Node> list_node = new ArrayList<>();
183 list_node .add(mock(Node.class));
184 when(nodeCacheManager.getBridgeNodes()).thenReturn(list_node);
186 when(ev.getAction()).thenReturn(Action.ADD);
187 lbaasPoolHandlerSpy.processEvent(ev);
188 verify(lbaasPoolHandlerSpy, times(1)).extractLBConfiguration(any(NeutronLoadBalancerPool.class));
190 when(ev.getAction()).thenReturn(Action.DELETE);
191 lbaasPoolHandlerSpy.processEvent(ev);
192 verify(lbaasPoolHandlerSpy, times(2)).extractLBConfiguration(any(NeutronLoadBalancerPool.class)); // 1 + 1 above
194 when(ev.getAction()).thenReturn(Action.UPDATE);
195 lbaasPoolHandlerSpy.processEvent(ev);
196 verify(lbaasPoolHandlerSpy, times(2)).extractLBConfiguration(any(NeutronLoadBalancerPool.class)); // same as before as nothing as been done
200 * Test method {@link LBaaSPoolHandler#extractLBConfiguration(NeutronLoadBalancerPool)}
203 public void testExtractLBConfiguration() {
204 List<LoadBalancerConfiguration> list_lbConfig = lBaaSPoolHandler.extractLBConfiguration(neutronLBPool);
205 assertFalse(list_lbConfig.isEmpty());
206 LoadBalancerConfiguration lbConfig = list_lbConfig.get(0);
208 verify(neutronLBCache, times(1)).getAllNeutronLoadBalancers();
210 // make sure the load balancer configuration was correctly populated
211 assertEquals("Error, did not return the correct value", "key", lbConfig.getProviderNetworkType());
212 assertEquals("Error, did not return the correct value", "value", lbConfig.getProviderSegmentationId());
213 assertEquals("Error, did not return the correct value", "mac_address", lbConfig.getVmac());
215 // make sure the load balancer pool member was correctly populated
216 LoadBalancerPoolMember member = lbConfig.getMembers().get("pool_memberID");
217 assertEquals("Error, did not return the correct value", "pool_member_address", member.getIP());
218 assertEquals("Error, did not return the correct value", "mac_address", member.getMAC());
219 assertEquals("Error, did not return the correct value", LoadBalancerConfiguration.PROTOCOL_HTTP, member.getProtocol());
220 assertTrue("Error, did not return the correct value", 1 == member.getPort());
224 public void testSetDependencies() throws Exception {
225 EventDispatcher eventDispatcher = mock(EventDispatcher.class);
226 LoadBalancerProvider loadBalancerProvider = mock(LoadBalancerProvider.class);
227 NodeCacheManager nodeCacheManager = mock(NodeCacheManager.class);
229 ServiceHelper.overrideGlobalInstance(EventDispatcher.class, eventDispatcher);
230 ServiceHelper.overrideGlobalInstance(LoadBalancerProvider.class, loadBalancerProvider);
231 ServiceHelper.overrideGlobalInstance(NodeCacheManager.class, nodeCacheManager);
233 lBaaSPoolHandler.setDependencies(mock(ServiceReference.class));
235 assertEquals("Error, did not return the correct object", lBaaSPoolHandler.eventDispatcher, eventDispatcher);
236 assertEquals("Error, did not return the correct object", getField("loadBalancerProvider"), loadBalancerProvider);
237 assertEquals("Error, did not return the correct object", getField("nodeCacheManager"), nodeCacheManager);
241 public void testSetDependenciesObject() throws Exception{
242 INeutronNetworkCRUD iNeutronNetworkCRUD = mock(INeutronNetworkCRUD.class);
243 lBaaSPoolHandler.setDependencies(iNeutronNetworkCRUD);
244 assertEquals("Error, did not return the correct object", getField("neutronNetworkCache"), iNeutronNetworkCRUD);
246 INeutronPortCRUD iNeutronPortCRUD = mock(INeutronPortCRUD.class);
247 lBaaSPoolHandler.setDependencies(iNeutronPortCRUD);
248 assertEquals("Error, did not return the correct object", getField("neutronPortCache"), iNeutronPortCRUD);
250 INeutronSubnetCRUD iNeutronSubnetCRUD = mock(INeutronSubnetCRUD.class);
251 lBaaSPoolHandler.setDependencies(iNeutronSubnetCRUD);
252 assertEquals("Error, did not return the correct object", getField("neutronSubnetCache"), iNeutronSubnetCRUD);
254 INeutronLoadBalancerCRUD iNeutronLoadBalancerCRUD = mock(INeutronLoadBalancerCRUD.class);
255 lBaaSPoolHandler.setDependencies(iNeutronLoadBalancerCRUD);
256 assertEquals("Error, did not return the correct object", getField("neutronLBCache"), iNeutronLoadBalancerCRUD);
258 LoadBalancerProvider loadBalancerProvider = mock(LoadBalancerProvider.class);
259 lBaaSPoolHandler.setDependencies(loadBalancerProvider);
260 assertEquals("Error, did not return the correct object", getField("loadBalancerProvider"), loadBalancerProvider);
263 private Object getField(String fieldName) throws Exception {
264 Field field = LBaaSPoolHandler.class.getDeclaredField(fieldName);
265 field.setAccessible(true);
266 return field.get(lBaaSPoolHandler);