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