Add UT for SouthboundMapper and SouthboundProvider
[netvirt.git] / openstack / net-virt / src / test / java / org / opendaylight / ovsdb / openstack / netvirt / LBaaSPoolMemberHandlerTest.java
1 /*
2  * Copyright (c) 2015 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.ovsdb.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.List;
24 import java.util.Map;
25 import java.util.Map.Entry;
26
27 import org.junit.Before;
28 import org.junit.Test;
29 import org.junit.runner.RunWith;
30 import org.mockito.InjectMocks;
31 import org.mockito.Mock;
32 import org.mockito.Mockito;
33 import org.opendaylight.neutron.spi.INeutronLoadBalancerCRUD;
34 import org.opendaylight.neutron.spi.INeutronLoadBalancerPoolCRUD;
35 import org.opendaylight.neutron.spi.INeutronNetworkCRUD;
36 import org.opendaylight.neutron.spi.INeutronPortCRUD;
37 import org.opendaylight.neutron.spi.INeutronSubnetCRUD;
38 import org.opendaylight.neutron.spi.NeutronLoadBalancer;
39 import org.opendaylight.neutron.spi.NeutronLoadBalancerPool;
40 import org.opendaylight.neutron.spi.NeutronLoadBalancerPoolMember;
41 import org.opendaylight.ovsdb.openstack.netvirt.api.Action;
42 import org.opendaylight.ovsdb.openstack.netvirt.api.EventDispatcher;
43 import org.opendaylight.ovsdb.openstack.netvirt.api.LoadBalancerConfiguration;
44 import org.opendaylight.ovsdb.openstack.netvirt.api.LoadBalancerConfiguration.LoadBalancerPoolMember;
45 import org.opendaylight.ovsdb.openstack.netvirt.api.LoadBalancerProvider;
46 import org.opendaylight.ovsdb.openstack.netvirt.api.NodeCacheManager;
47 import org.opendaylight.ovsdb.utils.servicehelper.ServiceHelper;
48 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
49 import org.osgi.framework.BundleContext;
50 import org.osgi.framework.ServiceReference;
51 import org.powermock.api.mockito.PowerMockito;
52 import org.powermock.core.classloader.annotations.PrepareForTest;
53 import org.powermock.modules.junit4.PowerMockRunner;
54
55 /**
56  * Unit test for {@link LBaaSPoolMemberHandler}
57  */
58 @PrepareForTest({NeutronCacheUtils.class, ServiceHelper.class})
59 @RunWith(PowerMockRunner.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
69     private NeutronLoadBalancerPoolMember neutronLBMember;
70
71     @Before
72     public void setUp() {
73         neutronLBMember = mock(NeutronLoadBalancerPoolMember.class);
74         when(neutronLBMember.getID()).thenReturn("pool_memberID");
75         when(neutronLBMember.getPoolMemberAddress()).thenReturn("pool_member_address");
76         when(neutronLBMember.getPoolMemberSubnetID()).thenReturn("pool_member_subnetID");
77         when(neutronLBMember.getPoolMemberProtoPort()).thenReturn(1);
78         when(neutronLBMember.getPoolID()).thenReturn("poolID");
79
80         Map.Entry<String,String> providerInfo = mock(Entry.class);
81         when(providerInfo.getKey()).thenReturn("key");
82         when(providerInfo.getValue()).thenReturn("value");
83
84         PowerMockito.mockStatic(NeutronCacheUtils.class);
85         when(NeutronCacheUtils.getMacAddress(any(INeutronPortCRUD.class), anyString(), anyString())).thenReturn("mac_address");
86         when(NeutronCacheUtils.getProviderInformation(any(INeutronNetworkCRUD.class), any(INeutronSubnetCRUD.class), anyString())).thenReturn(providerInfo);
87
88         List<NeutronLoadBalancerPoolMember> members = new ArrayList<NeutronLoadBalancerPoolMember>();
89         NeutronLoadBalancerPoolMember neutronLBPoolMember = mock(NeutronLoadBalancerPoolMember.class);
90         when(neutronLBPoolMember.getPoolMemberAdminStateIsUp()).thenReturn(true);
91         when(neutronLBPoolMember.getPoolMemberSubnetID()).thenReturn("subnetID");
92         when(neutronLBPoolMember.getID()).thenReturn("pool_memberID1");
93         when(neutronLBPoolMember.getPoolMemberProtoPort()).thenReturn(1);
94         members.add(neutronLBPoolMember);
95
96         NeutronLoadBalancerPool neutronLBPool = mock(NeutronLoadBalancerPool.class);
97         when(neutronLBPool.getLoadBalancerPoolProtocol()).thenReturn(LoadBalancerConfiguration.PROTOCOL_TCP);
98         when(neutronLBPool.getLoadBalancerPoolMembers()).thenReturn(members);
99         when(neutronLBPoolCache.getNeutronLoadBalancerPool(anyString())).thenReturn(neutronLBPool);
100
101         List<NeutronLoadBalancer> list_neutronLB = new ArrayList<NeutronLoadBalancer>();
102         NeutronLoadBalancer neutronLB = mock(NeutronLoadBalancer.class);
103         when(neutronLB.getLoadBalancerName()).thenReturn("load_balancer_name");
104         when(neutronLB.getLoadBalancerVipAddress()).thenReturn("vip_address");
105         when(neutronLB.getLoadBalancerVipSubnetID()).thenReturn("subnetID");
106         list_neutronLB.add(neutronLB);
107         when(neutronLBCache.getAllNeutronLoadBalancers()).thenReturn(list_neutronLB);
108     }
109
110     /**
111      * Test method {@link LBaaSPoolMemberHandler#canCreateNeutronLoadBalancerPoolMember(NeutronLoadBalancerPoolMember)}
112      */
113     @Test
114     public void testCanCreateNeutronLoadBalancerPoolMember() {
115         when(neutronLBMember.getPoolID())
116                                     .thenReturn(null)  // to test HTTP_BAD_REQUEST
117                                     .thenReturn("poolID"); // to test HTTP_OK
118
119         Map.Entry<String,String> providerInfo = mock(Entry.class);
120         when(providerInfo.getKey()).thenReturn("key");
121         when(providerInfo.getValue()).thenReturn("value");
122         when(NeutronCacheUtils.getProviderInformation(any(INeutronNetworkCRUD.class), any(INeutronSubnetCRUD.class), anyString()))
123                                     .thenReturn(providerInfo)
124                                     .thenReturn(null); // to test HTTP_NOT_ACCEPTABLE
125
126
127         assertEquals("Error, canCreateNeutronLoadBalancerPoolMember() didn't return the correct HTTP flag", HttpURLConnection.HTTP_BAD_REQUEST, lBaaSPoolMemberHandler.canCreateNeutronLoadBalancerPoolMember(neutronLBMember));
128         assertEquals("Error, canCreateNeutronLoadBalancerPoolMember() didn't return the correct HTTP flag", HttpURLConnection.HTTP_OK, lBaaSPoolMemberHandler.canCreateNeutronLoadBalancerPoolMember(neutronLBMember));
129         assertEquals("Error, canCreateNeutronLoadBalancerPoolMember() didn't return the correct HTTP flag", HttpURLConnection.HTTP_NOT_ACCEPTABLE, lBaaSPoolMemberHandler.canCreateNeutronLoadBalancerPoolMember(neutronLBMember));
130     }
131
132     /**
133      * Test method {@link LBaaSPoolMemberHandler#canUpdateNeutronLoadBalancerPoolMember(NeutronLoadBalancerPoolMember, NeutronLoadBalancerPoolMember)}
134      */
135     @Test
136     public void testCanUpdateNeutronLoadBalancerPoolMember() {
137         assertEquals("Error, did not return the correct HTTP flag", HttpURLConnection.HTTP_NOT_IMPLEMENTED, lBaaSPoolMemberHandler.canUpdateNeutronLoadBalancerPoolMember(any(NeutronLoadBalancerPoolMember.class), any(NeutronLoadBalancerPoolMember.class)));
138     }
139
140     /**
141      * Test method {@link LBaaSPoolMemberHandler#canDeleteNeutronLoadBalancerPoolMember(NeutronLoadBalancerPoolMember)}
142      */
143     @Test
144     public void testCanDeleteNeutronLoadBalancerPoolMember() {
145         when(neutronLBMember.getPoolID())
146                                     .thenReturn(null)  // to test HTTP_BAD_REQUEST
147                                     .thenReturn("poolID"); // to test HTTP_OK
148
149         Map.Entry<String,String> providerInfo = mock(Entry.class);
150         when(providerInfo.getKey()).thenReturn("key");
151         when(providerInfo.getValue()).thenReturn("value");
152         when(NeutronCacheUtils.getProviderInformation(any(INeutronNetworkCRUD.class), any(INeutronSubnetCRUD.class), anyString()))
153                                     .thenReturn(providerInfo)
154                                     .thenReturn(null); // to test HTTP_NOT_ACCEPTABLE
155
156
157         assertEquals("Error, canDeleteNeutronLoadBalancerPoolMember() didn't return the correct HTTP flag", HttpURLConnection.HTTP_BAD_REQUEST, lBaaSPoolMemberHandler.canDeleteNeutronLoadBalancerPoolMember(neutronLBMember));
158         assertEquals("Error, canDeleteNeutronLoadBalancerPoolMember() didn't return the correct HTTP flag", HttpURLConnection.HTTP_OK, lBaaSPoolMemberHandler.canDeleteNeutronLoadBalancerPoolMember(neutronLBMember));
159         assertEquals("Error, canDeleteNeutronLoadBalancerPoolMember() didn't return the correct HTTP flag", HttpURLConnection.HTTP_NOT_ACCEPTABLE, lBaaSPoolMemberHandler.canDeleteNeutronLoadBalancerPoolMember(neutronLBMember));
160     }
161
162     /**
163      * Test method {@link LBaaSPoolMemberHandler#processEvent(AbstractEvent)}
164      */
165     @Test
166     public void testProcessEvent(){
167         LBaaSPoolMemberHandler lbaasPoolMemberHandlerSpy = Mockito.spy(lBaaSPoolMemberHandler);
168
169         NorthboundEvent ev = mock(NorthboundEvent.class);
170         when(ev.getLoadBalancerPoolMember()).thenReturn(neutronLBMember);
171
172         List<Node> list_node = new ArrayList<Node>();
173         list_node .add(mock(Node.class));
174         when(nodeCacheManager.getBridgeNodes()).thenReturn(list_node);
175
176         when(ev.getAction()).thenReturn(Action.ADD);
177         lbaasPoolMemberHandlerSpy.processEvent(ev);
178         verify(lbaasPoolMemberHandlerSpy, times(1)).extractLBConfiguration(any(NeutronLoadBalancerPoolMember.class));
179
180         when(ev.getAction()).thenReturn(Action.DELETE);
181         lbaasPoolMemberHandlerSpy.processEvent(ev);
182         verify(lbaasPoolMemberHandlerSpy, times(2)).extractLBConfiguration(any(NeutronLoadBalancerPoolMember.class)); // 1 + 1 above
183
184         when(ev.getAction()).thenReturn(Action.UPDATE);
185         lbaasPoolMemberHandlerSpy.processEvent(ev);
186         verify(lbaasPoolMemberHandlerSpy, times(2)).extractLBConfiguration(any(NeutronLoadBalancerPoolMember.class)); // same as before as nothing as been done
187     }
188
189     /**
190      * Test method {@link LBaaSPoolMemberHandler#extractLBConfiguration(NeutronLoadBalancerPoolMember)}
191      */
192     @Test
193     public void testExtractLBConfiguration() {
194         LoadBalancerConfiguration lbConfig = lBaaSPoolMemberHandler.extractLBConfiguration(neutronLBMember);
195
196         verify(neutronLBPoolCache, times(1)).getNeutronLoadBalancerPool(anyString());
197         verify(neutronLBCache, times(1)).getAllNeutronLoadBalancers();
198
199         // make sure the load balancer configuration was correctly populated
200         assertEquals("Error, did not return the correct value",  "key", lbConfig.getProviderNetworkType());
201         assertEquals("Error, did not return the correct value",  "value", lbConfig.getProviderSegmentationId());
202         assertEquals("Error, did not return the correct value",  "mac_address", lbConfig.getVmac());
203
204         // make sure the load balancer pool member was correctly populated
205         LoadBalancerPoolMember member = lbConfig.getMembers().get("pool_memberID");
206         assertEquals("Error, did not return the correct value",  "pool_member_address", member.getIP());
207         assertEquals("Error, did not return the correct value",  "mac_address", member.getMAC());
208         assertEquals("Error, did not return the correct value",  LoadBalancerConfiguration.PROTOCOL_TCP, member.getProtocol());
209         assertTrue("Error, did not return the correct value",  1 ==  member.getPort());
210     }
211
212     @Test
213     public void testSetDependencies() throws Exception {
214         EventDispatcher eventDispatcher = mock(EventDispatcher.class);
215         LoadBalancerProvider loadBalancerProvider = mock(LoadBalancerProvider.class);
216         NodeCacheManager nodeCacheManager = mock(NodeCacheManager.class);
217
218         PowerMockito.mockStatic(ServiceHelper.class);
219         PowerMockito.when(ServiceHelper.getGlobalInstance(EventDispatcher.class, lBaaSPoolMemberHandler)).thenReturn(eventDispatcher);
220         PowerMockito.when(ServiceHelper.getGlobalInstance(LoadBalancerProvider.class, lBaaSPoolMemberHandler)).thenReturn(loadBalancerProvider);
221         PowerMockito.when(ServiceHelper.getGlobalInstance(NodeCacheManager.class, lBaaSPoolMemberHandler)).thenReturn(nodeCacheManager);
222
223         lBaaSPoolMemberHandler.setDependencies(mock(BundleContext.class), mock(ServiceReference.class));
224
225         assertEquals("Error, did not return the correct object", lBaaSPoolMemberHandler.eventDispatcher, eventDispatcher);
226         assertEquals("Error, did not return the correct object", getField("loadBalancerProvider"), loadBalancerProvider);
227         assertEquals("Error, did not return the correct object", getField("nodeCacheManager"), nodeCacheManager);
228     }
229
230     @Test
231     public void testSetDependenciesObject() throws Exception{
232         INeutronNetworkCRUD iNeutronNetworkCRUD = mock(INeutronNetworkCRUD.class);
233         lBaaSPoolMemberHandler.setDependencies(iNeutronNetworkCRUD);
234         assertEquals("Error, did not return the correct object", getField("neutronNetworkCache"), iNeutronNetworkCRUD);
235
236         INeutronPortCRUD iNeutronPortCRUD = mock(INeutronPortCRUD.class);
237         lBaaSPoolMemberHandler.setDependencies(iNeutronPortCRUD);
238         assertEquals("Error, did not return the correct object", getField("neutronPortCache"), iNeutronPortCRUD);
239
240         INeutronSubnetCRUD iNeutronSubnetCRUD = mock(INeutronSubnetCRUD.class);
241         lBaaSPoolMemberHandler.setDependencies(iNeutronSubnetCRUD);
242         assertEquals("Error, did not return the correct object", getField("neutronSubnetCache"), iNeutronSubnetCRUD);
243
244         INeutronLoadBalancerCRUD iNeutronLoadBalancerCRUD = mock(INeutronLoadBalancerCRUD.class);
245         lBaaSPoolMemberHandler.setDependencies(iNeutronLoadBalancerCRUD);
246         assertEquals("Error, did not return the correct object", getField("neutronLBCache"), iNeutronLoadBalancerCRUD);
247
248         INeutronLoadBalancerPoolCRUD iNeutronLoadBalancerPoolCRUD = mock(INeutronLoadBalancerPoolCRUD.class);
249         lBaaSPoolMemberHandler.setDependencies(iNeutronLoadBalancerPoolCRUD);
250         assertEquals("Error, did not return the correct object", getField("neutronLBPoolCache"), iNeutronLoadBalancerPoolCRUD);
251
252         LoadBalancerProvider loadBalancerProvider = mock(LoadBalancerProvider.class);
253         lBaaSPoolMemberHandler.setDependencies(loadBalancerProvider);
254         assertEquals("Error, did not return the correct object", getField("loadBalancerProvider"), loadBalancerProvider);
255     }
256
257     private Object getField(String fieldName) throws Exception {
258         Field field = LBaaSPoolMemberHandler.class.getDeclaredField(fieldName);
259         field.setAccessible(true);
260         return field.get(lBaaSPoolMemberHandler);
261     }
262 }