Imported vpnservice as a subtree
[netvirt.git] / openstack / net-virt / src / test / java / org / opendaylight / netvirt / openstack / netvirt / LBaaSPoolHandlerTest.java
1 /*
2  * Copyright (c) 2015, 2016 Inocybe and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8
9 package org.opendaylight.netvirt.openstack.netvirt;
10
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;
19
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;
25
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
53         .Node;
54 import org.osgi.framework.ServiceReference;
55
56 /**
57  * Unit test for {@link LBaaSPoolMemberHandler}
58  */
59 @RunWith(MockitoJUnitRunner.class)
60 public class LBaaSPoolHandlerTest {
61
62     @InjectMocks LBaaSPoolHandler lBaaSPoolHandler;
63
64     @Mock private INeutronLoadBalancerPoolCRUD neutronLBPoolCache;
65     @Mock private INeutronLoadBalancerCRUD neutronLBCache;
66     @Mock private LoadBalancerProvider loadBalancerProvider;
67     @Mock private NodeCacheManager nodeCacheManager;
68
69     @Mock private NeutronLoadBalancerPool neutronLBPool;
70     @Mock private INeutronSubnetCRUD neutronSubnetCache;
71     @Mock private INeutronNetworkCRUD neutronNetworkCache;
72     @Mock private INeutronPortCRUD neutronPortCache;
73
74     @Before
75     public void setUp() {
76         when(neutronLBPool.getLoadBalancerPoolProtocol()).thenReturn(LoadBalancerConfiguration.PROTOCOL_HTTP);
77
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));
96
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);
108
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));
115
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);
125
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);
133     }
134
135     /**
136      * Test method {@link LBaaSPoolHandler#canCreateNeutronLoadBalancerPool(NeutronLoadBalancerPool)}
137      */
138     @Test
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
144
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));
148     }
149
150     /**
151      * Test method {@link LBaaSPoolHandler#canUpdateNeutronLoadBalancerPool(NeutronLoadBalancerPool, NeutronLoadBalancerPool)}
152      */
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)));
155     }
156
157     /**
158      * Test method {@link LBaaSPoolHandler#canDeleteNeutronLoadBalancerPool(NeutronLoadBalancerPool)}
159      */
160     @Test
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
166
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));
170     }
171
172     /**
173      * Test method {@link LBaaSPoolHandler#processEvent(AbstractEvent)}
174      */
175     @Test
176     public void testProcessEvent() {
177         LBaaSPoolHandler lbaasPoolHandlerSpy = Mockito.spy(lBaaSPoolHandler);
178
179         NorthboundEvent ev = mock(NorthboundEvent.class);
180         when(ev.getLoadBalancerPool()).thenReturn(neutronLBPool);
181
182         List<Node> list_node = new ArrayList<>();
183         list_node .add(mock(Node.class));
184         when(nodeCacheManager.getBridgeNodes()).thenReturn(list_node);
185
186         when(ev.getAction()).thenReturn(Action.ADD);
187         lbaasPoolHandlerSpy.processEvent(ev);
188         verify(lbaasPoolHandlerSpy, times(1)).extractLBConfiguration(any(NeutronLoadBalancerPool.class));
189
190         when(ev.getAction()).thenReturn(Action.DELETE);
191         lbaasPoolHandlerSpy.processEvent(ev);
192         verify(lbaasPoolHandlerSpy, times(2)).extractLBConfiguration(any(NeutronLoadBalancerPool.class)); // 1 + 1 above
193
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
197     }
198
199     /**
200      * Test method {@link LBaaSPoolHandler#extractLBConfiguration(NeutronLoadBalancerPool)}
201      */
202     @Test
203     public void testExtractLBConfiguration() {
204         List<LoadBalancerConfiguration> list_lbConfig = lBaaSPoolHandler.extractLBConfiguration(neutronLBPool);
205         assertFalse(list_lbConfig.isEmpty());
206         LoadBalancerConfiguration lbConfig = list_lbConfig.get(0);
207
208         verify(neutronLBCache, times(1)).getAllNeutronLoadBalancers();
209
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());
214
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());
221     }
222
223     @Test
224     public void testSetDependencies() throws Exception {
225         EventDispatcher eventDispatcher = mock(EventDispatcher.class);
226         LoadBalancerProvider loadBalancerProvider = mock(LoadBalancerProvider.class);
227         NodeCacheManager nodeCacheManager = mock(NodeCacheManager.class);
228
229         ServiceHelper.overrideGlobalInstance(EventDispatcher.class, eventDispatcher);
230         ServiceHelper.overrideGlobalInstance(LoadBalancerProvider.class, loadBalancerProvider);
231         ServiceHelper.overrideGlobalInstance(NodeCacheManager.class, nodeCacheManager);
232
233         lBaaSPoolHandler.setDependencies(mock(ServiceReference.class));
234
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);
238     }
239
240     @Test
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);
245
246         INeutronPortCRUD iNeutronPortCRUD = mock(INeutronPortCRUD.class);
247         lBaaSPoolHandler.setDependencies(iNeutronPortCRUD);
248         assertEquals("Error, did not return the correct object", getField("neutronPortCache"), iNeutronPortCRUD);
249
250         INeutronSubnetCRUD iNeutronSubnetCRUD = mock(INeutronSubnetCRUD.class);
251         lBaaSPoolHandler.setDependencies(iNeutronSubnetCRUD);
252         assertEquals("Error, did not return the correct object", getField("neutronSubnetCache"), iNeutronSubnetCRUD);
253
254         INeutronLoadBalancerCRUD iNeutronLoadBalancerCRUD = mock(INeutronLoadBalancerCRUD.class);
255         lBaaSPoolHandler.setDependencies(iNeutronLoadBalancerCRUD);
256         assertEquals("Error, did not return the correct object", getField("neutronLBCache"), iNeutronLoadBalancerCRUD);
257
258         LoadBalancerProvider loadBalancerProvider = mock(LoadBalancerProvider.class);
259         lBaaSPoolHandler.setDependencies(loadBalancerProvider);
260         assertEquals("Error, did not return the correct object", getField("loadBalancerProvider"), loadBalancerProvider);
261     }
262
263     private Object getField(String fieldName) throws Exception {
264         Field field = LBaaSPoolHandler.class.getDeclaredField(fieldName);
265         field.setAccessible(true);
266         return field.get(lBaaSPoolHandler);
267     }
268 }