Fix NPE triggered after disabling SG on a port
[netvirt.git] / openstack / net-virt / src / test / java / org / opendaylight / netvirt / openstack / netvirt / LBaaSPoolMemberHandlerTest.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.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;
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.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;
53
54 import org.osgi.framework.ServiceReference;
55
56 /**
57  * Unit test for {@link LBaaSPoolMemberHandler}
58  */
59 @RunWith(MockitoJUnitRunner.class)
60 public class LBaaSPoolMemberHandlerTest {
61
62     @InjectMocks LBaaSPoolMemberHandler lBaaSPoolMemberHandler;
63
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;
71
72     private NeutronLoadBalancerPoolMember neutronLBMember;
73
74     @Before
75     public void setUp() {
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");
82
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));
97
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));
103
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));
110
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);
118
119         NeutronLoadBalancerPool neutronLBPool = new NeutronLoadBalancerPool();
120         neutronLBPool.setLoadBalancerPoolProtocol(LoadBalancerConfiguration.PROTOCOL_TCP);
121         neutronLBPool.setLoadBalancerPoolMembers(members);
122         when(neutronLBPoolCache.getNeutronLoadBalancerPool(anyString())).thenReturn(neutronLBPool);
123
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));
129     }
130
131     /**
132      * Test method {@link LBaaSPoolMemberHandler#canCreateNeutronLoadBalancerPoolMember(NeutronLoadBalancerPoolMember)}
133      */
134     @Test
135     public void testCanCreateNeutronLoadBalancerPoolMember() {
136         // HTTP_BAD_REQUEST
137         neutronLBMember.setPoolID(null);
138         assertEquals("Error, canCreateNeutronLoadBalancerPoolMember() didn't return the correct HTTP flag", HttpURLConnection.HTTP_BAD_REQUEST, lBaaSPoolMemberHandler.canCreateNeutronLoadBalancerPoolMember(neutronLBMember));
139
140         // HTTP_OK
141         neutronLBMember.setPoolID("poolID");
142         assertEquals("Error, canCreateNeutronLoadBalancerPoolMember() didn't return the correct HTTP flag", HttpURLConnection.HTTP_OK, lBaaSPoolMemberHandler.canCreateNeutronLoadBalancerPoolMember(neutronLBMember));
143
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));
147     }
148
149     /**
150      * Test method {@link LBaaSPoolMemberHandler#canUpdateNeutronLoadBalancerPoolMember(NeutronLoadBalancerPoolMember, NeutronLoadBalancerPoolMember)}
151      */
152     @Test
153     public void testCanUpdateNeutronLoadBalancerPoolMember() {
154         assertEquals("Error, did not return the correct HTTP flag", HttpURLConnection.HTTP_NOT_IMPLEMENTED, lBaaSPoolMemberHandler.canUpdateNeutronLoadBalancerPoolMember(null, null));
155     }
156
157     /**
158      * Test method {@link LBaaSPoolMemberHandler#canDeleteNeutronLoadBalancerPoolMember(NeutronLoadBalancerPoolMember)}
159      */
160     @Test
161     public void testCanDeleteNeutronLoadBalancerPoolMember() {
162         // HTTP_BAD_REQUEST
163         neutronLBMember.setPoolID(null);
164         assertEquals("Error, canDeleteNeutronLoadBalancerPoolMember() didn't return the correct HTTP flag", HttpURLConnection.HTTP_BAD_REQUEST, lBaaSPoolMemberHandler.canDeleteNeutronLoadBalancerPoolMember(neutronLBMember));
165
166         // HTTP_OK
167         neutronLBMember.setPoolID("poolID");
168         assertEquals("Error, canDeleteNeutronLoadBalancerPoolMember() didn't return the correct HTTP flag", HttpURLConnection.HTTP_OK, lBaaSPoolMemberHandler.canDeleteNeutronLoadBalancerPoolMember(neutronLBMember));
169
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));
173     }
174
175     /**
176      * Test method {@link LBaaSPoolMemberHandler#processEvent(AbstractEvent)}
177      */
178     @Test
179     public void testProcessEvent(){
180         LBaaSPoolMemberHandler lbaasPoolMemberHandlerSpy = Mockito.spy(lBaaSPoolMemberHandler);
181
182         NorthboundEvent ev = mock(NorthboundEvent.class);
183         when(ev.getLoadBalancerPoolMember()).thenReturn(neutronLBMember);
184
185         List<Node> list_node = new ArrayList<>();
186         list_node .add(mock(Node.class));
187         when(nodeCacheManager.getBridgeNodes()).thenReturn(list_node);
188
189         when(ev.getAction()).thenReturn(Action.ADD);
190         lbaasPoolMemberHandlerSpy.processEvent(ev);
191         verify(lbaasPoolMemberHandlerSpy, times(1)).extractLBConfiguration(any(NeutronLoadBalancerPoolMember.class));
192
193         when(ev.getAction()).thenReturn(Action.DELETE);
194         lbaasPoolMemberHandlerSpy.processEvent(ev);
195         verify(lbaasPoolMemberHandlerSpy, times(2)).extractLBConfiguration(any(NeutronLoadBalancerPoolMember.class)); // 1 + 1 above
196
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
200     }
201
202     /**
203      * Test method {@link LBaaSPoolMemberHandler#extractLBConfiguration(NeutronLoadBalancerPoolMember)}
204      */
205     @Test
206     public void testExtractLBConfiguration() {
207         LoadBalancerConfiguration lbConfig = lBaaSPoolMemberHandler.extractLBConfiguration(neutronLBMember);
208
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());
213
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());
220     }
221
222     @Test
223     public void testSetDependencies() throws Exception {
224         EventDispatcher eventDispatcher = mock(EventDispatcher.class);
225         LoadBalancerProvider loadBalancerProvider = mock(LoadBalancerProvider.class);
226         NodeCacheManager nodeCacheManager = mock(NodeCacheManager.class);
227
228         ServiceHelper.overrideGlobalInstance(EventDispatcher.class, eventDispatcher);
229         ServiceHelper.overrideGlobalInstance(LoadBalancerProvider.class, loadBalancerProvider);
230         ServiceHelper.overrideGlobalInstance(NodeCacheManager.class, nodeCacheManager);
231
232         lBaaSPoolMemberHandler.setDependencies(mock(ServiceReference.class));
233
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);
237     }
238
239     @Test
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);
244
245         INeutronPortCRUD iNeutronPortCRUD = mock(INeutronPortCRUD.class);
246         lBaaSPoolMemberHandler.setDependencies(iNeutronPortCRUD);
247         assertEquals("Error, did not return the correct object", getField("neutronPortCache"), iNeutronPortCRUD);
248
249         INeutronSubnetCRUD iNeutronSubnetCRUD = mock(INeutronSubnetCRUD.class);
250         lBaaSPoolMemberHandler.setDependencies(iNeutronSubnetCRUD);
251         assertEquals("Error, did not return the correct object", getField("neutronSubnetCache"), iNeutronSubnetCRUD);
252
253         INeutronLoadBalancerCRUD iNeutronLoadBalancerCRUD = mock(INeutronLoadBalancerCRUD.class);
254         lBaaSPoolMemberHandler.setDependencies(iNeutronLoadBalancerCRUD);
255         assertEquals("Error, did not return the correct object", getField("neutronLBCache"), iNeutronLoadBalancerCRUD);
256
257         INeutronLoadBalancerPoolCRUD iNeutronLoadBalancerPoolCRUD = mock(INeutronLoadBalancerPoolCRUD.class);
258         lBaaSPoolMemberHandler.setDependencies(iNeutronLoadBalancerPoolCRUD);
259         assertEquals("Error, did not return the correct object", getField("neutronLBPoolCache"), iNeutronLoadBalancerPoolCRUD);
260
261         LoadBalancerProvider loadBalancerProvider = mock(LoadBalancerProvider.class);
262         lBaaSPoolMemberHandler.setDependencies(loadBalancerProvider);
263         assertEquals("Error, did not return the correct object", getField("loadBalancerProvider"), loadBalancerProvider);
264     }
265
266     private Object getField(String fieldName) throws Exception {
267         Field field = LBaaSPoolMemberHandler.class.getDeclaredField(fieldName);
268         field.setAccessible(true);
269         return field.get(lBaaSPoolMemberHandler);
270     }
271 }