| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); you may |
| # not use this file except in compliance with the License. You may obtain |
| # a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| # License for the specific language governing permissions and limitations |
| # under the License. |
| |
| import time |
| import urllib |
| |
| from heat_integrationtests.scenario import scenario_base |
| |
| |
| class NeutronLoadBalancerTest(scenario_base.ScenarioTestsBase): |
| """ |
| The class is responsible for testing of neutron resources balancer. |
| """ |
| |
| def setUp(self): |
| super(NeutronLoadBalancerTest, self).setUp() |
| self.public_net = self._get_network('public') |
| self.template_name = 'test_neutron_loadbalancer.yaml' |
| |
| def collect_responses(self, ip, expected_resp): |
| resp = set() |
| for count in range(10): |
| time.sleep(1) |
| resp.add(urllib.urlopen('http://%s/' % ip).read()) |
| |
| self.assertEqual(expected_resp, resp) |
| |
| def test_neutron_loadbalancer(self): |
| """ |
| Check work of Neutron LBaaS resource in Heat. |
| |
| The alternative scenario is the following: |
| 1. Launch a stack with a load balancer, two servers, |
| but use only one as a LB member. |
| 2. Check connection to the servers and LB. |
| 3. Collect info about responces, which were received by LB from |
| its members (responces have to be received only from 'server1'). |
| 4. Update stack definition: include 'server2' into LBaaS. |
| 5. Check that number of members in LB was increased and |
| responces were received from 'server1' and 'server2'. |
| """ |
| |
| parameters = { |
| 'key_name': self.keypair_name, |
| 'flavor': self.conf.instance_type, |
| 'image': self.conf.image_ref, |
| 'private_subnet_id': self.net['subnets'][0], |
| 'external_network_id': self.public_net['id'] |
| } |
| |
| # Launch stack |
| sid = self.launch_stack( |
| template_name=self.template_name, |
| parameters=parameters |
| ) |
| |
| server1_id = self.client.resources.get( |
| sid, 'server1').physical_resource_id |
| server2_id = self.client.resources.get( |
| sid, 'server2').physical_resource_id |
| floating_ip_id = self.client.resources.get( |
| sid, 'floating_ip').physical_resource_id |
| floating_ip = self.network_client.show_floatingip( |
| floating_ip_id)['floatingip']['floating_ip_address'] |
| pool_id = self.client.resources.get( |
| sid, 'test_pool').physical_resource_id |
| vip_id = self.network_client.show_pool(pool_id)['pool']['vip_id'] |
| |
| vip = self.network_client.show_vip(vip_id)['vip']['address'] |
| server1_ip = self.compute_client.servers.get( |
| server1_id).networks['private'][0] |
| server2_ip = self.compute_client.servers.get( |
| server2_id).networks['private'][0] |
| |
| # Check connection and info about received responces |
| self.check_connectivity(server1_ip) |
| self.collect_responses(server1_ip, {'server1\n'}) |
| |
| self.check_connectivity(server2_ip) |
| self.collect_responses(server2_ip, {'server2\n'}) |
| |
| self.check_connectivity(vip) |
| self.collect_responses(vip, {'server1\n'}) |
| |
| self.check_connectivity(floating_ip) |
| self.collect_responses(floating_ip, {'server1\n'}) |
| |
| # Include 'server2' to LB and update the stack |
| template = self._load_template( |
| __file__, self.template_name, self.sub_dir |
| ) |
| |
| template = template.replace( |
| '- { get_resource: server1 }', |
| '- { get_resource: server1 }\n - { get_resource: server2 }\n' |
| ) |
| |
| self.update_stack( |
| sid, |
| template=template, |
| parameters=parameters |
| ) |
| |
| self.check_connectivity(vip) |
| self.collect_responses(vip, {'server1\n', 'server2\n'}) |
| |
| self.check_connectivity(floating_ip) |
| self.collect_responses(floating_ip, {'server1\n', 'server2\n'}) |