blob: 4ddc21ea32298b4438fdd7f25d4fd38ec89cbfcc [file] [log] [blame]
Mark Vanderwiel6d8e0862015-10-15 12:51:07 -05001#
2# Licensed under the Apache License, Version 2.0 (the "License"); you may
3# not use this file except in compliance with the License. You may obtain
4# a copy of the License at
5#
6# http://www.apache.org/licenses/LICENSE-2.0
7#
8# Unless required by applicable law or agreed to in writing, software
9# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
10# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
11# License for the specific language governing permissions and limitations
12# under the License.
13
Mark Vanderwiel2e923a72015-10-19 16:12:05 -050014import time
15
16import requests
17
18from heat_integrationtests.common import test
Mark Vanderwiel6d8e0862015-10-15 12:51:07 -050019from heat_integrationtests.scenario import scenario_base
20
21
22class AutoscalingLoadBalancerv2Test(scenario_base.ScenarioTestsBase):
23 """The class is responsible for testing ASG + LBv2 scenario.
24
25 The very common use case tested is an autoscaling group
26 of some web application servers behind a loadbalancer.
27 """
28
29 def setUp(self):
30 super(AutoscalingLoadBalancerv2Test, self).setUp()
31 self.template_name = 'test_autoscaling_lbv2_neutron.yaml'
32 self.app_server_template_name = 'app_server_lbv2_neutron.yaml'
33 self.webapp_template_name = 'netcat-webapp.yaml'
34 if not self.is_network_extension_supported('lbaasv2'):
35 self.skipTest('LBaasv2 extension not available, skipping')
36
Mark Vanderwiel2e923a72015-10-19 16:12:05 -050037 def check_num_responses(self, url, expected_num, retries=20):
38 resp = set()
39 for count in range(retries):
40 time.sleep(2)
41 try:
42 r = requests.get(url, verify=self.verify_cert)
43 except requests.exceptions.ConnectionError:
44 # The LB may not be up yet, let's retry
45 continue
46 # skip unsuccessful requests
47 if r.status_code == 200:
48 resp.add(r.text)
Thomas Herveb8259272016-08-29 14:08:15 +020049 if len(resp) == expected_num:
50 break
Mark Vanderwiel2e923a72015-10-19 16:12:05 -050051 self.assertEqual(expected_num, len(resp))
52
Mark Vanderwiel6d8e0862015-10-15 12:51:07 -050053 def test_autoscaling_loadbalancer_neutron(self):
54 """Check work of AutoScaing and Neutron LBaaS v2 resource in Heat.
55
56 The scenario is the following:
57 1. Launch a stack with a load balancer and autoscaling group
58 of one server, wait until stack create is complete.
59 2. Check that there is only one distinctive response from
60 loadbalanced IP.
61 3. Signal the scale_up policy, wait until all resources in
62 autoscaling group are complete.
63 4. Check that now there are two distinctive responses from
64 loadbalanced IP.
65 """
66
Mark Vanderwiel2e923a72015-10-19 16:12:05 -050067 parameters = {
68 'flavor': self.conf.minimal_instance_type,
69 'image': self.conf.minimal_image_ref,
70 'net': self.conf.fixed_network_name,
71 'subnet': self.conf.fixed_subnet_name,
72 'public_net': self.conf.floating_network_name
73 }
74
75 app_server_template = self._load_template(
76 __file__, self.app_server_template_name, self.sub_dir
77 )
78 webapp_template = self._load_template(
79 __file__, self.webapp_template_name, self.sub_dir
80 )
81 files = {'appserver.yaml': app_server_template,
82 'webapp.yaml': webapp_template}
83 env = {'resource_registry':
84 {'OS::Test::NeutronAppServer': 'appserver.yaml',
85 'OS::Test::WebAppConfig': 'webapp.yaml'}}
86
87 # Launch stack
88 sid = self.launch_stack(
89 template_name=self.template_name,
90 parameters=parameters,
91 files=files,
92 environment=env
93 )
94 stack = self.client.stacks.get(sid)
95 lb_url = self._stack_output(stack, 'lburl')
96 # Check number of distinctive responces, must be 1
97 self.check_num_responses(lb_url, 1)
98
99 # Signal the scaling hook
100 self.client.resources.signal(sid, 'scale_up')
101
102 # Wait for AutoScalingGroup update to finish
103 asg = self.client.resources.get(sid, 'asg')
104 test.call_until_true(self.conf.build_timeout,
105 self.conf.build_interval,
Rakesh H Sc5735a82016-04-28 15:38:09 +0530106 self.check_autoscale_complete,
Thomas Hervea6afca82017-04-10 23:44:26 +0200107 asg.physical_resource_id, 2, sid, 'scale_up')
Mark Vanderwiel2e923a72015-10-19 16:12:05 -0500108
109 # Check number of distinctive responses, must now be 2
110 self.check_num_responses(lb_url, 2)