2 * Copyright (c) 2015 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.ovsdb.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.net.HttpURLConnection;
21 import java.util.ArrayList;
22 import java.util.List;
24 import java.util.Map.Entry;
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.opendaylight.neutron.spi.INeutronLoadBalancerCRUD;
33 import org.opendaylight.neutron.spi.INeutronLoadBalancerPoolCRUD;
34 import org.opendaylight.neutron.spi.INeutronNetworkCRUD;
35 import org.opendaylight.neutron.spi.INeutronPortCRUD;
36 import org.opendaylight.neutron.spi.INeutronSubnetCRUD;
37 import org.opendaylight.neutron.spi.NeutronLoadBalancer;
38 import org.opendaylight.neutron.spi.NeutronLoadBalancerPool;
39 import org.opendaylight.neutron.spi.NeutronLoadBalancerPoolMember;
40 import org.opendaylight.ovsdb.openstack.netvirt.api.Action;
41 import org.opendaylight.ovsdb.openstack.netvirt.api.LoadBalancerConfiguration;
42 import org.opendaylight.ovsdb.openstack.netvirt.api.LoadBalancerConfiguration.LoadBalancerPoolMember;
43 import org.opendaylight.ovsdb.openstack.netvirt.api.LoadBalancerProvider;
44 import org.opendaylight.ovsdb.openstack.netvirt.api.NodeCacheManager;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
46 import org.powermock.api.mockito.PowerMockito;
47 import org.powermock.core.classloader.annotations.PrepareForTest;
48 import org.powermock.modules.junit4.PowerMockRunner;
51 * Unit test for {@link LBaaSPoolMemberHandler}
53 @PrepareForTest(NeutronCacheUtils.class)
54 @RunWith(PowerMockRunner.class)
55 public class LBaaSPoolMemberHandlerTest {
57 @InjectMocks LBaaSPoolMemberHandler lBaaSPoolMemberHandler;
59 @Mock private INeutronLoadBalancerPoolCRUD neutronLBPoolCache;
60 @Mock private INeutronLoadBalancerCRUD neutronLBCache;
61 @Mock private LoadBalancerProvider loadBalancerProvider;
62 @Mock private NodeCacheManager nodeCacheManager;
64 private NeutronLoadBalancerPoolMember neutronLBMember;
68 neutronLBMember = mock(NeutronLoadBalancerPoolMember.class);
69 when(neutronLBMember.getPoolMemberID()).thenReturn("pool_memberID");
70 when(neutronLBMember.getPoolMemberAddress()).thenReturn("pool_member_address");
71 when(neutronLBMember.getPoolMemberSubnetID()).thenReturn("pool_member_subnetID");
72 when(neutronLBMember.getPoolMemberProtoPort()).thenReturn(1);
73 when(neutronLBMember.getPoolID()).thenReturn("poolID");
75 Map.Entry<String,String> providerInfo = mock(Entry.class);
76 when(providerInfo.getKey()).thenReturn("key");
77 when(providerInfo.getValue()).thenReturn("value");
79 PowerMockito.mockStatic(NeutronCacheUtils.class);
80 when(NeutronCacheUtils.getMacAddress(any(INeutronPortCRUD.class), anyString(), anyString())).thenReturn("mac_address");
81 when(NeutronCacheUtils.getProviderInformation(any(INeutronNetworkCRUD.class), any(INeutronSubnetCRUD.class), anyString())).thenReturn(providerInfo);
83 List<NeutronLoadBalancerPoolMember> members = new ArrayList();
84 NeutronLoadBalancerPoolMember neutronLBPoolMember = mock(NeutronLoadBalancerPoolMember.class);
85 when(neutronLBPoolMember.getPoolMemberAdminStateIsUp()).thenReturn(true);
86 when(neutronLBPoolMember.getPoolMemberSubnetID()).thenReturn("subnetID");
87 when(neutronLBPoolMember.getPoolMemberID()).thenReturn("pool_memberID1");
88 when(neutronLBPoolMember.getPoolMemberProtoPort()).thenReturn(1);
89 members.add(neutronLBPoolMember);
91 NeutronLoadBalancerPool neutronLBPool = mock(NeutronLoadBalancerPool.class);
92 when(neutronLBPool.getLoadBalancerPoolProtocol()).thenReturn(LoadBalancerConfiguration.PROTOCOL_TCP);
93 when(neutronLBPool.getLoadBalancerPoolMembers()).thenReturn(members);
94 when(neutronLBPoolCache.getNeutronLoadBalancerPool(anyString())).thenReturn(neutronLBPool);
96 List<NeutronLoadBalancer> list_neutronLB = new ArrayList();
97 NeutronLoadBalancer neutronLB = mock(NeutronLoadBalancer.class);
98 when(neutronLB.getLoadBalancerName()).thenReturn("load_balancer_name");
99 when(neutronLB.getLoadBalancerVipAddress()).thenReturn("vip_address");
100 when(neutronLB.getLoadBalancerVipSubnetID()).thenReturn("subnetID");
101 list_neutronLB.add(neutronLB);
102 when(neutronLBCache.getAllNeutronLoadBalancers()).thenReturn(list_neutronLB);
106 * Test method {@link LBaaSPoolMemberHandler#canCreateNeutronLoadBalancerPoolMember(NeutronLoadBalancerPoolMember)}
109 public void testCanCreateNeutronLoadBalancerPoolMember() {
110 when(neutronLBMember.getPoolID())
111 .thenReturn(null) // to test HTTP_BAD_REQUEST
112 .thenReturn("poolID"); // to test HTTP_OK
114 Map.Entry<String,String> providerInfo = mock(Entry.class);
115 when(providerInfo.getKey()).thenReturn("key");
116 when(providerInfo.getValue()).thenReturn("value");
117 when(NeutronCacheUtils.getProviderInformation(any(INeutronNetworkCRUD.class), any(INeutronSubnetCRUD.class), anyString()))
118 .thenReturn(providerInfo)
119 .thenReturn(null); // to test HTTP_NOT_ACCEPTABLE
122 assertEquals("Error, canCreateNeutronLoadBalancerPoolMember() didn't return the correct HTTP flag", HttpURLConnection.HTTP_BAD_REQUEST, lBaaSPoolMemberHandler.canCreateNeutronLoadBalancerPoolMember(neutronLBMember));
123 assertEquals("Error, canCreateNeutronLoadBalancerPoolMember() didn't return the correct HTTP flag", HttpURLConnection.HTTP_OK, lBaaSPoolMemberHandler.canCreateNeutronLoadBalancerPoolMember(neutronLBMember));
124 assertEquals("Error, canCreateNeutronLoadBalancerPoolMember() didn't return the correct HTTP flag", HttpURLConnection.HTTP_NOT_ACCEPTABLE, lBaaSPoolMemberHandler.canCreateNeutronLoadBalancerPoolMember(neutronLBMember));
128 * Test method {@link LBaaSPoolMemberHandler#canUpdateNeutronLoadBalancerPoolMember(NeutronLoadBalancerPoolMember, NeutronLoadBalancerPoolMember)}
131 public void testCanUpdateNeutronLoadBalancerPoolMember() {
132 assertEquals("Error, did not return the correct HTTP flag", HttpURLConnection.HTTP_NOT_IMPLEMENTED, lBaaSPoolMemberHandler.canUpdateNeutronLoadBalancerPoolMember(any(NeutronLoadBalancerPoolMember.class), any(NeutronLoadBalancerPoolMember.class)));
136 * Test method {@link LBaaSPoolMemberHandler#canDeleteNeutronLoadBalancerPoolMember(NeutronLoadBalancerPoolMember)}
139 public void testCanDeleteNeutronLoadBalancerPoolMember() {
140 when(neutronLBMember.getPoolID())
141 .thenReturn(null) // to test HTTP_BAD_REQUEST
142 .thenReturn("poolID"); // to test HTTP_OK
144 Map.Entry<String,String> providerInfo = mock(Entry.class);
145 when(providerInfo.getKey()).thenReturn("key");
146 when(providerInfo.getValue()).thenReturn("value");
147 when(NeutronCacheUtils.getProviderInformation(any(INeutronNetworkCRUD.class), any(INeutronSubnetCRUD.class), anyString()))
148 .thenReturn(providerInfo)
149 .thenReturn(null); // to test HTTP_NOT_ACCEPTABLE
152 assertEquals("Error, canDeleteNeutronLoadBalancerPoolMember() didn't return the correct HTTP flag", HttpURLConnection.HTTP_BAD_REQUEST, lBaaSPoolMemberHandler.canDeleteNeutronLoadBalancerPoolMember(neutronLBMember));
153 assertEquals("Error, canDeleteNeutronLoadBalancerPoolMember() didn't return the correct HTTP flag", HttpURLConnection.HTTP_OK, lBaaSPoolMemberHandler.canDeleteNeutronLoadBalancerPoolMember(neutronLBMember));
154 assertEquals("Error, canDeleteNeutronLoadBalancerPoolMember() didn't return the correct HTTP flag", HttpURLConnection.HTTP_NOT_ACCEPTABLE, lBaaSPoolMemberHandler.canDeleteNeutronLoadBalancerPoolMember(neutronLBMember));
158 * Test method {@link LBaaSPoolMemberHandler#processEvent(AbstractEvent)}
161 public void testProcessEvent(){
162 LBaaSPoolMemberHandler lbaasPoolMemberHandlerSpy = Mockito.spy(lBaaSPoolMemberHandler);
164 NorthboundEvent ev = mock(NorthboundEvent.class);
165 when(ev.getLoadBalancerPoolMember()).thenReturn(neutronLBMember);
167 List<Node> list_node = new ArrayList();
168 list_node .add(mock(Node.class));
169 when(nodeCacheManager.getNodes()).thenReturn(list_node);
171 when(ev.getAction()).thenReturn(Action.ADD);
172 lbaasPoolMemberHandlerSpy.processEvent(ev);
173 verify(lbaasPoolMemberHandlerSpy, times(1)).extractLBConfiguration(any(NeutronLoadBalancerPoolMember.class));
175 when(ev.getAction()).thenReturn(Action.DELETE);
176 lbaasPoolMemberHandlerSpy.processEvent(ev);
177 verify(lbaasPoolMemberHandlerSpy, times(2)).extractLBConfiguration(any(NeutronLoadBalancerPoolMember.class)); // 1 + 1 above
179 when(ev.getAction()).thenReturn(Action.UPDATE);
180 lbaasPoolMemberHandlerSpy.processEvent(ev);
181 verify(lbaasPoolMemberHandlerSpy, times(2)).extractLBConfiguration(any(NeutronLoadBalancerPoolMember.class)); // same as before as nothing as been done
185 * Test method {@link LBaaSPoolMemberHandler#extractLBConfiguration(NeutronLoadBalancerPoolMember)}
188 public void testExtractLBConfiguration() {
189 LoadBalancerConfiguration lbConfig = lBaaSPoolMemberHandler.extractLBConfiguration(neutronLBMember);
191 verify(neutronLBPoolCache, times(1)).getNeutronLoadBalancerPool(anyString());
192 verify(neutronLBCache, times(1)).getAllNeutronLoadBalancers();
194 // make sure the load balancer configuration was correctly populated
195 assertEquals("Error, did not return the correct value", "key", lbConfig.getProviderNetworkType());
196 assertEquals("Error, did not return the correct value", "value", lbConfig.getProviderSegmentationId());
197 assertEquals("Error, did not return the correct value", "mac_address", lbConfig.getVmac());
199 // make sure the load balancer pool member was correctly populated
200 LoadBalancerPoolMember member = lbConfig.getMembers().get("pool_memberID");
201 assertEquals("Error, did not return the correct value", "pool_member_address", member.getIP());
202 assertEquals("Error, did not return the correct value", "mac_address", member.getMAC());
203 assertEquals("Error, did not return the correct value", LoadBalancerConfiguration.PROTOCOL_TCP, member.getProtocol());
204 assertTrue("Error, did not return the correct value", 1 == member.getPort());