blob: e3de091b735b146024cdc0c79649650876df0ae8 [file] [log] [blame]
Pavlo Shchelokovskyy9ede1852015-03-19 17:54:52 +00001#
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
14import time
15
16import requests
17
18from heat_integrationtests.common import test
19from heat_integrationtests.scenario import scenario_base
20
21
22class AutoscalingLoadBalancerTest(scenario_base.ScenarioTestsBase):
Mark Vanderwiel6d8e0862015-10-15 12:51:07 -050023 """The class is responsible for testing ASG + LBv1 scenario.
Pavlo Shchelokovskyy9ede1852015-03-19 17:54:52 +000024
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(AutoscalingLoadBalancerTest, self).setUp()
31 self.template_name = 'test_autoscaling_lb_neutron.yaml'
32 self.app_server_template_name = 'app_server_neutron.yaml'
33 self.webapp_template_name = 'netcat-webapp.yaml'
Mark Vanderwiel6d8e0862015-10-15 12:51:07 -050034 if not self.is_network_extension_supported('lbaas'):
35 self.skipTest('LBaas v1 extension not available, skipping')
Pavlo Shchelokovskyy9ede1852015-03-19 17:54:52 +000036
37 def check_num_responses(self, url, expected_num, retries=10):
38 resp = set()
39 for count in range(retries):
40 time.sleep(1)
Thomas Herve983fcf62016-02-18 13:15:37 +010041 try:
42 r = requests.get(url)
43 except requests.exceptions.ConnectionError:
44 # The LB may not be up yet, let's retry
45 continue
venkatamahesha9d3fdd2016-02-03 13:18:17 +053046 # skip unsuccessful requests
Pavlo Shchelokovskyy9ede1852015-03-19 17:54:52 +000047 if r.status_code == 200:
48 resp.add(r.text)
49 self.assertEqual(expected_num, len(resp))
50
51 def autoscale_complete(self, stack_id, expected_num):
52 res_list = self.client.resources.list(stack_id)
53 all_res_complete = all(res.resource_status in ('UPDATE_COMPLETE',
54 'CREATE_COMPLETE')
55 for res in res_list)
56 all_res = len(res_list) == expected_num
57 return all_res and all_res_complete
58
59 def test_autoscaling_loadbalancer_neutron(self):
Mark Vanderwiel6d8e0862015-10-15 12:51:07 -050060 """Check work of AutoScaing and Neutron LBaaS v1 resource in Heat.
Pavlo Shchelokovskyy9ede1852015-03-19 17:54:52 +000061
62 The scenario is the following:
63 1. Launch a stack with a load balancer and autoscaling group
64 of one server, wait until stack create is complete.
65 2. Check that there is only one distinctive response from
66 loadbalanced IP.
67 3. Signal the scale_up policy, wait until all resources in
68 autoscaling group are complete.
69 4. Check that now there are two distinctive responses from
70 loadbalanced IP.
71 """
72
73 parameters = {
74 'flavor': self.conf.minimal_instance_type,
75 'image': self.conf.minimal_image_ref,
76 'net': self.conf.fixed_network_name,
77 'subnet': self.conf.fixed_subnet_name,
78 'public_net': self.conf.floating_network_name,
79 'app_port': 8080,
80 'lb_port': 80,
81 'timeout': 600
82 }
83
84 app_server_template = self._load_template(
85 __file__, self.app_server_template_name, self.sub_dir
86 )
87 webapp_template = self._load_template(
88 __file__, self.webapp_template_name, self.sub_dir
89 )
90 files = {'appserver.yaml': app_server_template,
91 'webapp.yaml': webapp_template}
92 env = {'resource_registry':
93 {'OS::Test::NeutronAppServer': 'appserver.yaml',
94 'OS::Test::WebAppConfig': 'webapp.yaml'}}
95 # Launch stack
96 sid = self.launch_stack(
97 template_name=self.template_name,
98 parameters=parameters,
99 files=files,
100 environment=env
101 )
102 stack = self.client.stacks.get(sid)
103 lb_url = self._stack_output(stack, 'lburl')
104 # Check number of distinctive responces, must be 1
105 self.check_num_responses(lb_url, 1)
106
107 # Signal the scaling hook
108 self.client.resources.signal(sid, 'scale_up')
109
110 # Wait for AutoScalingGroup update to finish
111 asg = self.client.resources.get(sid, 'asg')
112 test.call_until_true(self.conf.build_timeout,
113 self.conf.build_interval,
114 self.autoscale_complete,
115 asg.physical_resource_id, 2)
116
117 # Check number of distinctive responses, must now be 2
118 self.check_num_responses(lb_url, 2)