Merge "Added support for bridge other-config."
[ovsdb.git] / openstack / net-virt / src / test / java / org / opendaylight / ovsdb / openstack / netvirt / LBaaSPoolHandlerTest.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.net.HttpURLConnection;
21 import java.util.ArrayList;
22 import java.util.List;
23 import java.util.Map;
24 import java.util.Map.Entry;
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.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;
49
50 /**
51  * Unit test for {@link LBaaSPoolMemberHandler}
52  */
53 @PrepareForTest(NeutronCacheUtils.class)
54 @RunWith(PowerMockRunner.class)
55 public class LBaaSPoolHandlerTest {
56
57     @InjectMocks LBaaSPoolHandler lBaaSPoolHandler;
58
59     @Mock private INeutronLoadBalancerPoolCRUD neutronLBPoolCache;
60     @Mock private INeutronLoadBalancerCRUD neutronLBCache;
61     @Mock private LoadBalancerProvider loadBalancerProvider;
62     @Mock private NodeCacheManager nodeCacheManager;
63
64     @Mock private NeutronLoadBalancerPool neutronLBPool;
65
66     @Before
67     public void setUp() {
68         when(neutronLBPool.getLoadBalancerPoolProtocol()).thenReturn(LoadBalancerConfiguration.PROTOCOL_HTTP);
69
70         List<NeutronLoadBalancerPoolMember> members = new ArrayList();
71         NeutronLoadBalancerPoolMember neutronLBPoolMember = mock(NeutronLoadBalancerPoolMember.class);
72         when(neutronLBPoolMember.getPoolMemberAdminStateIsUp()).thenReturn(true);
73         when(neutronLBPoolMember.getPoolMemberSubnetID()).thenReturn("subnetID");
74         when(neutronLBPoolMember.getPoolMemberID()).thenReturn("pool_memberID");
75         when(neutronLBPoolMember.getPoolMemberAddress()).thenReturn("pool_member_address");
76         when(neutronLBPoolMember.getPoolMemberProtoPort()).thenReturn(1);
77         members.add(neutronLBPoolMember);
78         when(neutronLBPool.getLoadBalancerPoolMembers()).thenReturn(members);
79
80         List<NeutronLoadBalancer> list_neutronLB = new ArrayList();
81         NeutronLoadBalancer neutronLB = mock(NeutronLoadBalancer.class);
82         when(neutronLB.getLoadBalancerName()).thenReturn("load_balancer_name");
83         when(neutronLB.getLoadBalancerVipAddress()).thenReturn("vip_address");
84         when(neutronLB.getLoadBalancerVipSubnetID()).thenReturn("subnetID");
85         list_neutronLB.add(neutronLB);
86         when(neutronLBCache.getAllNeutronLoadBalancers()).thenReturn(list_neutronLB);
87
88         Map.Entry<String,String> providerInfo = mock(Entry.class);
89         when(providerInfo.getKey()).thenReturn("key");
90         when(providerInfo.getValue()).thenReturn("value");
91
92         PowerMockito.mockStatic(NeutronCacheUtils.class);
93         when(NeutronCacheUtils.getMacAddress(any(INeutronPortCRUD.class), anyString(), anyString())).thenReturn("mac_address");
94         when(NeutronCacheUtils.getProviderInformation(any(INeutronNetworkCRUD.class), any(INeutronSubnetCRUD.class), anyString())).thenReturn(providerInfo);
95     }
96
97     /**
98      * Test method {@link LBaaSPoolHandler#canCreateNeutronLoadBalancerPool(NeutronLoadBalancerPool)}
99      */
100     @Test
101     public void testCanCreateNeutronLoadBalancerPoolMember() {
102         when(neutronLBPool.getLoadBalancerPoolProtocol())
103                                     .thenReturn(LoadBalancerConfiguration.PROTOCOL_HTTP) // to test HTTP_OK
104                                     .thenReturn(null) // to test HTTP_BAD_REQUEST
105                                     .thenReturn("dummy_proto"); // to test HTTP_NOT_ACCEPTABLE
106
107         assertEquals("Error, canCreateNeutronLoadBalancerPool() didn't return the correct HTTP flag", HttpURLConnection.HTTP_OK, lBaaSPoolHandler.canCreateNeutronLoadBalancerPool(neutronLBPool));
108         assertEquals("Error, canCreateNeutronLoadBalancerPool() didn't return the correct HTTP flag", HttpURLConnection.HTTP_BAD_REQUEST, lBaaSPoolHandler.canCreateNeutronLoadBalancerPool(neutronLBPool));
109         assertEquals("Error, canCreateNeutronLoadBalancerPool() didn't return the correct HTTP flag", HttpURLConnection.HTTP_NOT_ACCEPTABLE, lBaaSPoolHandler.canCreateNeutronLoadBalancerPool(neutronLBPool));
110     }
111
112     /**
113      * Test method {@link LBaaSPoolHandler#canUpdateNeutronLoadBalancerPool(NeutronLoadBalancerPool, NeutronLoadBalancerPool)}
114      */
115     public void testCanUpdateNeutronLoadBalancerPool() {
116         assertEquals("Error, did not return the correct HTTP flag", HttpURLConnection.HTTP_NOT_IMPLEMENTED, lBaaSPoolHandler.canUpdateNeutronLoadBalancerPool(any(NeutronLoadBalancerPool.class), any(NeutronLoadBalancerPool.class)));
117     }
118
119     /**
120      * Test method {@link LBaaSPoolHandler#canDeleteNeutronLoadBalancerPool(NeutronLoadBalancerPool)}
121      */
122     @Test
123     public void testCanDeleteNeutronLoadBalancerPool() {
124         when(neutronLBPool.getLoadBalancerPoolProtocol())
125                                         .thenReturn(LoadBalancerConfiguration.PROTOCOL_HTTP) // to test HTTP_OK
126                                         .thenReturn(null) // to test HTTP_BAD_REQUEST
127                                         .thenReturn("dummy_proto"); // to test HTTP_NOT_ACCEPTABLE
128
129         assertEquals("Error, canDeleteNeutronLoadBalancerPool() didn't return the correct HTTP flag", HttpURLConnection.HTTP_OK, lBaaSPoolHandler.canDeleteNeutronLoadBalancerPool(neutronLBPool));
130         assertEquals("Error, canDeleteNeutronLoadBalancerPool() didn't return the correct HTTP flag", HttpURLConnection.HTTP_BAD_REQUEST, lBaaSPoolHandler.canDeleteNeutronLoadBalancerPool(neutronLBPool));
131         assertEquals("Error, canDeleteNeutronLoadBalancerPool() didn't return the correct HTTP flag", HttpURLConnection.HTTP_NOT_ACCEPTABLE, lBaaSPoolHandler.canDeleteNeutronLoadBalancerPool(neutronLBPool));
132     }
133
134     /**
135      * Test method {@link LBaaSPoolHandler#processEvent(AbstractEvent)}
136      */
137     @Test
138     public void testProcessEvent() {
139         LBaaSPoolHandler lbaasPoolHandlerSpy = Mockito.spy(lBaaSPoolHandler);
140
141         NorthboundEvent ev = mock(NorthboundEvent.class);
142         when(ev.getLoadBalancerPool()).thenReturn(neutronLBPool);
143
144         List<Node> list_node = new ArrayList();
145         list_node .add(mock(Node.class));
146         when(nodeCacheManager.getNodes()).thenReturn(list_node);
147
148         when(ev.getAction()).thenReturn(Action.ADD);
149         lbaasPoolHandlerSpy.processEvent(ev);
150         verify(lbaasPoolHandlerSpy, times(1)).extractLBConfiguration(any(NeutronLoadBalancerPool.class));
151
152         when(ev.getAction()).thenReturn(Action.DELETE);
153         lbaasPoolHandlerSpy.processEvent(ev);
154         verify(lbaasPoolHandlerSpy, times(2)).extractLBConfiguration(any(NeutronLoadBalancerPool.class)); // 1 + 1 above
155
156         when(ev.getAction()).thenReturn(Action.UPDATE);
157         lbaasPoolHandlerSpy.processEvent(ev);
158         verify(lbaasPoolHandlerSpy, times(2)).extractLBConfiguration(any(NeutronLoadBalancerPool.class)); // same as before as nothing as been done
159     }
160
161     /**
162      * Test method {@link LBaaSPoolHandler#extractLBConfiguration(NeutronLoadBalancerPool)}
163      */
164     @Test
165     public void testExtractLBConfiguration() {
166         List<LoadBalancerConfiguration> list_lbConfig = lBaaSPoolHandler.extractLBConfiguration(neutronLBPool);
167         LoadBalancerConfiguration lbConfig = list_lbConfig.get(0);
168
169         verify(neutronLBCache, times(1)).getAllNeutronLoadBalancers();
170
171         // make sure the load balancer configuration was correctly populated
172         assertEquals("Error, did not return the correct value",  "key", lbConfig.getProviderNetworkType());
173         assertEquals("Error, did not return the correct value",  "value", lbConfig.getProviderSegmentationId());
174         assertEquals("Error, did not return the correct value",  "mac_address", lbConfig.getVmac());
175
176         // make sure the load balancer pool member was correctly populated
177         LoadBalancerPoolMember member = lbConfig.getMembers().get("pool_memberID");
178         assertEquals("Error, did not return the correct value",  "pool_member_address", member.getIP());
179         assertEquals("Error, did not return the correct value",  "mac_address", member.getMAC());
180         assertEquals("Error, did not return the correct value",  LoadBalancerConfiguration.PROTOCOL_HTTP, member.getProtocol());
181         assertTrue("Error, did not return the correct value",  1 ==  member.getPort());
182     }
183 }