blob: b3a1842158026c631424a48ec77648c518e20276 [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)
49 self.assertEqual(expected_num, len(resp))
50
Mark Vanderwiel6d8e0862015-10-15 12:51:07 -050051 def test_autoscaling_loadbalancer_neutron(self):
52 """Check work of AutoScaing and Neutron LBaaS v2 resource in Heat.
53
54 The scenario is the following:
55 1. Launch a stack with a load balancer and autoscaling group
56 of one server, wait until stack create is complete.
57 2. Check that there is only one distinctive response from
58 loadbalanced IP.
59 3. Signal the scale_up policy, wait until all resources in
60 autoscaling group are complete.
61 4. Check that now there are two distinctive responses from
62 loadbalanced IP.
63 """
64
Mark Vanderwiel2e923a72015-10-19 16:12:05 -050065 parameters = {
66 'flavor': self.conf.minimal_instance_type,
67 'image': self.conf.minimal_image_ref,
68 'net': self.conf.fixed_network_name,
69 'subnet': self.conf.fixed_subnet_name,
70 'public_net': self.conf.floating_network_name
71 }
72
73 app_server_template = self._load_template(
74 __file__, self.app_server_template_name, self.sub_dir
75 )
76 webapp_template = self._load_template(
77 __file__, self.webapp_template_name, self.sub_dir
78 )
79 files = {'appserver.yaml': app_server_template,
80 'webapp.yaml': webapp_template}
81 env = {'resource_registry':
82 {'OS::Test::NeutronAppServer': 'appserver.yaml',
83 'OS::Test::WebAppConfig': 'webapp.yaml'}}
84
85 # Launch stack
86 sid = self.launch_stack(
87 template_name=self.template_name,
88 parameters=parameters,
89 files=files,
90 environment=env
91 )
92 stack = self.client.stacks.get(sid)
93 lb_url = self._stack_output(stack, 'lburl')
94 # Check number of distinctive responces, must be 1
95 self.check_num_responses(lb_url, 1)
96
97 # Signal the scaling hook
98 self.client.resources.signal(sid, 'scale_up')
99
100 # Wait for AutoScalingGroup update to finish
101 asg = self.client.resources.get(sid, 'asg')
102 test.call_until_true(self.conf.build_timeout,
103 self.conf.build_interval,
Rakesh H Sc5735a82016-04-28 15:38:09 +0530104 self.check_autoscale_complete,
Mark Vanderwiel2e923a72015-10-19 16:12:05 -0500105 asg.physical_resource_id, 2)
106
107 # Check number of distinctive responses, must now be 2
108 self.check_num_responses(lb_url, 2)