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.assertTrue;
13 import static org.mockito.Matchers.any;
14 import static org.mockito.Matchers.anyString;
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.LoadBalancerProvider;
35 import org.opendaylight.netvirt.openstack.netvirt.api.NodeCacheManager;
36 import org.opendaylight.netvirt.openstack.netvirt.translator.NeutronLoadBalancer;
37 import org.opendaylight.netvirt.openstack.netvirt.translator.NeutronLoadBalancerPoolMember;
38 import org.opendaylight.netvirt.openstack.netvirt.translator.NeutronNetwork;
39 import org.opendaylight.netvirt.openstack.netvirt.translator.crud.INeutronLoadBalancerPoolCRUD;
40 import org.opendaylight.netvirt.openstack.netvirt.translator.crud.INeutronNetworkCRUD;
41 import org.opendaylight.netvirt.openstack.netvirt.translator.crud.INeutronPortCRUD;
42 import org.opendaylight.netvirt.openstack.netvirt.api.EventDispatcher;
43 import org.opendaylight.netvirt.openstack.netvirt.api.LoadBalancerConfiguration;
44 import org.opendaylight.netvirt.openstack.netvirt.api.LoadBalancerConfiguration.LoadBalancerPoolMember;
45 import org.opendaylight.netvirt.openstack.netvirt.translator.NeutronLoadBalancerPool;
46 import org.opendaylight.netvirt.openstack.netvirt.translator.NeutronPort;
47 import org.opendaylight.netvirt.openstack.netvirt.translator.NeutronSubnet;
48 import org.opendaylight.netvirt.openstack.netvirt.translator.Neutron_IPs;
49 import org.opendaylight.netvirt.openstack.netvirt.translator.crud.INeutronLoadBalancerCRUD;
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.Node;
54 import org.osgi.framework.ServiceReference;
57 * Unit test for {@link LBaaSPoolMemberHandler}
59 @RunWith(MockitoJUnitRunner.class)
60 public class LBaaSPoolMemberHandlerTest {
62 @InjectMocks LBaaSPoolMemberHandler lBaaSPoolMemberHandler;
64 @Mock private INeutronLoadBalancerPoolCRUD neutronLBPoolCache;
65 @Mock private INeutronLoadBalancerCRUD neutronLBCache;
66 @Mock private LoadBalancerProvider loadBalancerProvider;
67 @Mock private NodeCacheManager nodeCacheManager;
68 @Mock private INeutronPortCRUD neutronPortCache;
69 @Mock private INeutronNetworkCRUD neutronNetworkCache;
70 @Mock private INeutronSubnetCRUD neutronSubnetCache;
72 private NeutronLoadBalancerPoolMember neutronLBMember;
76 neutronLBMember = new NeutronLoadBalancerPoolMember();
77 neutronLBMember.setID("pool_memberID");
78 neutronLBMember.setPoolMemberAddress("pool_member_address");
79 neutronLBMember.setPoolMemberSubnetID("pool_member_subnetID");
80 neutronLBMember.setPoolMemberProtoPort(1);
81 neutronLBMember.setPoolID("poolID");
83 lBaaSPoolMemberHandler.setDependencies(neutronPortCache);
84 final NeutronPort neutronPort = new NeutronPort();
85 final Neutron_IPs neutronIP1 = new Neutron_IPs();
86 neutronIP1.setSubnetUUID("pool_member_subnetID");
87 neutronIP1.setIpAddress("pool_member_address");
88 final Neutron_IPs neutronIP2 = new Neutron_IPs();
89 neutronIP2.setSubnetUUID("pool_member_subnetID");
90 neutronIP2.setIpAddress("vip_address");
91 final List<Neutron_IPs> neutronIPs = new ArrayList<>();
92 neutronIPs.add(neutronIP1);
93 neutronIPs.add(neutronIP2);
94 neutronPort.setFixedIPs(neutronIPs);
95 neutronPort.setMacAddress("mac_address");
96 when(neutronPortCache.getAllPorts()).thenReturn(Collections.singletonList(neutronPort));
98 lBaaSPoolMemberHandler.setDependencies(neutronSubnetCache);
99 final NeutronSubnet neutronSubnet = new NeutronSubnet();
100 neutronSubnet.setID("pool_member_subnetID");
101 neutronSubnet.setNetworkUUID("pool_member_networkUUID");
102 when(neutronSubnetCache.getAllSubnets()).thenReturn(Collections.singletonList(neutronSubnet));
104 lBaaSPoolMemberHandler.setDependencies(neutronNetworkCache);
105 final NeutronNetwork neutronNetwork = new NeutronNetwork();
106 neutronNetwork.setNetworkUUID("pool_member_networkUUID");
107 neutronNetwork.setProviderNetworkType("key");
108 neutronNetwork.setProviderSegmentationID("value");
109 when(neutronNetworkCache.getAllNetworks()).thenReturn(Collections.singletonList(neutronNetwork));
111 List<NeutronLoadBalancerPoolMember> members = new ArrayList<>();
112 NeutronLoadBalancerPoolMember neutronLBPoolMember = new NeutronLoadBalancerPoolMember();
113 neutronLBPoolMember.setPoolMemberAdminStateIsUp(true);
114 neutronLBPoolMember.setPoolMemberSubnetID("pool_member_subnetID");
115 neutronLBPoolMember.setID("pool_memberID1");
116 neutronLBPoolMember.setPoolMemberProtoPort(1);
117 members.add(neutronLBPoolMember);
119 NeutronLoadBalancerPool neutronLBPool = new NeutronLoadBalancerPool();
120 neutronLBPool.setLoadBalancerPoolProtocol(LoadBalancerConfiguration.PROTOCOL_TCP);
121 neutronLBPool.setLoadBalancerPoolMembers(members);
122 when(neutronLBPoolCache.getNeutronLoadBalancerPool(anyString())).thenReturn(neutronLBPool);
124 NeutronLoadBalancer neutronLB = new NeutronLoadBalancer();
125 neutronLB.setLoadBalancerName("load_balancer_name");
126 neutronLB.setLoadBalancerVipAddress("vip_address");
127 neutronLB.setLoadBalancerVipSubnetID("pool_member_subnetID");
128 when(neutronLBCache.getAllNeutronLoadBalancers()).thenReturn(Collections.singletonList(neutronLB));
132 * Test method {@link LBaaSPoolMemberHandler#canCreateNeutronLoadBalancerPoolMember(NeutronLoadBalancerPoolMember)}
135 public void testCanCreateNeutronLoadBalancerPoolMember() {
137 neutronLBMember.setPoolID(null);
138 assertEquals("Error, canCreateNeutronLoadBalancerPoolMember() didn't return the correct HTTP flag", HttpURLConnection.HTTP_BAD_REQUEST, lBaaSPoolMemberHandler.canCreateNeutronLoadBalancerPoolMember(neutronLBMember));
141 neutronLBMember.setPoolID("poolID");
142 assertEquals("Error, canCreateNeutronLoadBalancerPoolMember() didn't return the correct HTTP flag", HttpURLConnection.HTTP_OK, lBaaSPoolMemberHandler.canCreateNeutronLoadBalancerPoolMember(neutronLBMember));
144 // HTTP_NOT_ACCEPTABLE
145 when(neutronNetworkCache.getAllNetworks()).thenReturn(Collections.emptyList());
146 assertEquals("Error, canCreateNeutronLoadBalancerPoolMember() didn't return the correct HTTP flag", HttpURLConnection.HTTP_NOT_ACCEPTABLE, lBaaSPoolMemberHandler.canCreateNeutronLoadBalancerPoolMember(neutronLBMember));
150 * Test method {@link LBaaSPoolMemberHandler#canUpdateNeutronLoadBalancerPoolMember(NeutronLoadBalancerPoolMember, NeutronLoadBalancerPoolMember)}
153 public void testCanUpdateNeutronLoadBalancerPoolMember() {
154 assertEquals("Error, did not return the correct HTTP flag", HttpURLConnection.HTTP_NOT_IMPLEMENTED, lBaaSPoolMemberHandler.canUpdateNeutronLoadBalancerPoolMember(null, null));
158 * Test method {@link LBaaSPoolMemberHandler#canDeleteNeutronLoadBalancerPoolMember(NeutronLoadBalancerPoolMember)}
161 public void testCanDeleteNeutronLoadBalancerPoolMember() {
163 neutronLBMember.setPoolID(null);
164 assertEquals("Error, canDeleteNeutronLoadBalancerPoolMember() didn't return the correct HTTP flag", HttpURLConnection.HTTP_BAD_REQUEST, lBaaSPoolMemberHandler.canDeleteNeutronLoadBalancerPoolMember(neutronLBMember));
167 neutronLBMember.setPoolID("poolID");
168 assertEquals("Error, canDeleteNeutronLoadBalancerPoolMember() didn't return the correct HTTP flag", HttpURLConnection.HTTP_OK, lBaaSPoolMemberHandler.canDeleteNeutronLoadBalancerPoolMember(neutronLBMember));
170 // HTTP_NOT_ACCEPTABLE
171 when(neutronNetworkCache.getAllNetworks()).thenReturn(Collections.emptyList());
172 assertEquals("Error, canDeleteNeutronLoadBalancerPoolMember() didn't return the correct HTTP flag", HttpURLConnection.HTTP_NOT_ACCEPTABLE, lBaaSPoolMemberHandler.canDeleteNeutronLoadBalancerPoolMember(neutronLBMember));
176 * Test method {@link LBaaSPoolMemberHandler#processEvent(AbstractEvent)}
179 public void testProcessEvent(){
180 LBaaSPoolMemberHandler lbaasPoolMemberHandlerSpy = Mockito.spy(lBaaSPoolMemberHandler);
182 NorthboundEvent ev = mock(NorthboundEvent.class);
183 when(ev.getLoadBalancerPoolMember()).thenReturn(neutronLBMember);
185 List<Node> list_node = new ArrayList<>();
186 list_node .add(mock(Node.class));
187 when(nodeCacheManager.getBridgeNodes()).thenReturn(list_node);
189 when(ev.getAction()).thenReturn(Action.ADD);
190 lbaasPoolMemberHandlerSpy.processEvent(ev);
191 verify(lbaasPoolMemberHandlerSpy, times(1)).extractLBConfiguration(any(NeutronLoadBalancerPoolMember.class));
193 when(ev.getAction()).thenReturn(Action.DELETE);
194 lbaasPoolMemberHandlerSpy.processEvent(ev);
195 verify(lbaasPoolMemberHandlerSpy, times(2)).extractLBConfiguration(any(NeutronLoadBalancerPoolMember.class)); // 1 + 1 above
197 when(ev.getAction()).thenReturn(Action.UPDATE);
198 lbaasPoolMemberHandlerSpy.processEvent(ev);
199 verify(lbaasPoolMemberHandlerSpy, times(2)).extractLBConfiguration(any(NeutronLoadBalancerPoolMember.class)); // same as before as nothing as been done
203 * Test method {@link LBaaSPoolMemberHandler#extractLBConfiguration(NeutronLoadBalancerPoolMember)}
206 public void testExtractLBConfiguration() {
207 LoadBalancerConfiguration lbConfig = lBaaSPoolMemberHandler.extractLBConfiguration(neutronLBMember);
209 // make sure the load balancer configuration was correctly populated
210 assertEquals("Error, did not return the correct value", "key", lbConfig.getProviderNetworkType());
211 assertEquals("Error, did not return the correct value", "value", lbConfig.getProviderSegmentationId());
212 assertEquals("Error, did not return the correct value", "mac_address", lbConfig.getVmac());
214 // make sure the load balancer pool member was correctly populated
215 LoadBalancerPoolMember member = lbConfig.getMembers().get("pool_memberID");
216 assertEquals("Error, did not return the correct value", "pool_member_address", member.getIP());
217 assertEquals("Error, did not return the correct value", "mac_address", member.getMAC());
218 assertEquals("Error, did not return the correct value", LoadBalancerConfiguration.PROTOCOL_TCP, member.getProtocol());
219 assertTrue("Error, did not return the correct value", 1 == member.getPort());
223 public void testSetDependencies() throws Exception {
224 EventDispatcher eventDispatcher = mock(EventDispatcher.class);
225 LoadBalancerProvider loadBalancerProvider = mock(LoadBalancerProvider.class);
226 NodeCacheManager nodeCacheManager = mock(NodeCacheManager.class);
228 ServiceHelper.overrideGlobalInstance(EventDispatcher.class, eventDispatcher);
229 ServiceHelper.overrideGlobalInstance(LoadBalancerProvider.class, loadBalancerProvider);
230 ServiceHelper.overrideGlobalInstance(NodeCacheManager.class, nodeCacheManager);
232 lBaaSPoolMemberHandler.setDependencies(mock(ServiceReference.class));
234 assertEquals("Error, did not return the correct object", lBaaSPoolMemberHandler.eventDispatcher, eventDispatcher);
235 assertEquals("Error, did not return the correct object", getField("loadBalancerProvider"), loadBalancerProvider);
236 assertEquals("Error, did not return the correct object", getField("nodeCacheManager"), nodeCacheManager);
240 public void testSetDependenciesObject() throws Exception{
241 INeutronNetworkCRUD iNeutronNetworkCRUD = mock(INeutronNetworkCRUD.class);
242 lBaaSPoolMemberHandler.setDependencies(iNeutronNetworkCRUD);
243 assertEquals("Error, did not return the correct object", getField("neutronNetworkCache"), iNeutronNetworkCRUD);
245 INeutronPortCRUD iNeutronPortCRUD = mock(INeutronPortCRUD.class);
246 lBaaSPoolMemberHandler.setDependencies(iNeutronPortCRUD);
247 assertEquals("Error, did not return the correct object", getField("neutronPortCache"), iNeutronPortCRUD);
249 INeutronSubnetCRUD iNeutronSubnetCRUD = mock(INeutronSubnetCRUD.class);
250 lBaaSPoolMemberHandler.setDependencies(iNeutronSubnetCRUD);
251 assertEquals("Error, did not return the correct object", getField("neutronSubnetCache"), iNeutronSubnetCRUD);
253 INeutronLoadBalancerCRUD iNeutronLoadBalancerCRUD = mock(INeutronLoadBalancerCRUD.class);
254 lBaaSPoolMemberHandler.setDependencies(iNeutronLoadBalancerCRUD);
255 assertEquals("Error, did not return the correct object", getField("neutronLBCache"), iNeutronLoadBalancerCRUD);
257 INeutronLoadBalancerPoolCRUD iNeutronLoadBalancerPoolCRUD = mock(INeutronLoadBalancerPoolCRUD.class);
258 lBaaSPoolMemberHandler.setDependencies(iNeutronLoadBalancerPoolCRUD);
259 assertEquals("Error, did not return the correct object", getField("neutronLBPoolCache"), iNeutronLoadBalancerPoolCRUD);
261 LoadBalancerProvider loadBalancerProvider = mock(LoadBalancerProvider.class);
262 lBaaSPoolMemberHandler.setDependencies(loadBalancerProvider);
263 assertEquals("Error, did not return the correct object", getField("loadBalancerProvider"), loadBalancerProvider);
266 private Object getField(String fieldName) throws Exception {
267 Field field = LBaaSPoolMemberHandler.class.getDeclaredField(fieldName);
268 field.setAccessible(true);
269 return field.get(lBaaSPoolMemberHandler);