blob: 474e1c3af9d0e63d09e7bbedf210fdc7b38bef4c [file] [log] [blame]
Tetiana Lashchova1d74d3d2015-01-29 15:05:05 +02001# Licensed under the Apache License, Version 2.0 (the "License"); you may
2# not use this file except in compliance with the License. You may obtain
3# a copy of the License at
4#
5# http://www.apache.org/licenses/LICENSE-2.0
6#
7# Unless required by applicable law or agreed to in writing, software
8# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
9# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
10# License for the specific language governing permissions and limitations
11# under the License.
12
Rakesh H Sde6ad902016-04-28 15:30:54 +053013from heat_integrationtests.common import test
Rabi Mishra477efc92015-07-31 13:01:45 +053014from heat_integrationtests.functional import functional_base
Tetiana Lashchova1d74d3d2015-01-29 15:05:05 +020015
16
Rabi Mishra477efc92015-07-31 13:01:45 +053017class HeatAutoscalingTest(functional_base.FunctionalTestsBase):
Tetiana Lashchova1d74d3d2015-01-29 15:05:05 +020018 template = '''
19heat_template_version: 2014-10-16
20
21resources:
22 random_group:
23 type: OS::Heat::AutoScalingGroup
24 properties:
Rakesh H Sde6ad902016-04-28 15:30:54 +053025 cooldown: 0
26 desired_capacity: 3
27 max_size: 5
28 min_size: 2
Tetiana Lashchova1d74d3d2015-01-29 15:05:05 +020029 resource:
30 type: OS::Heat::RandomString
31
Rakesh H Sde6ad902016-04-28 15:30:54 +053032 scale_up_policy:
33 type: OS::Heat::ScalingPolicy
34 properties:
35 adjustment_type: change_in_capacity
36 auto_scaling_group_id: { get_resource: random_group }
37 scaling_adjustment: 1
38
39 scale_down_policy:
40 type: OS::Heat::ScalingPolicy
41 properties:
42 adjustment_type: change_in_capacity
43 auto_scaling_group_id: { get_resource: random_group }
44 scaling_adjustment: -1
45
Tetiana Lashchova1d74d3d2015-01-29 15:05:05 +020046outputs:
47 all_values:
48 value: {get_attr: [random_group, outputs_list, value]}
49 value_0:
50 value: {get_attr: [random_group, resource.0.value]}
Rakesh H Sde6ad902016-04-28 15:30:54 +053051 value_1:
52 value: {get_attr: [random_group, resource.1.value]}
53 value_2:
54 value: {get_attr: [random_group, resource.2.value]}
55 asg_size:
56 value: {get_attr: [random_group, current_size]}
Tetiana Lashchova1d74d3d2015-01-29 15:05:05 +020057'''
58
59 template_nested = '''
60heat_template_version: 2014-10-16
61
62resources:
63 random_group:
64 type: OS::Heat::AutoScalingGroup
65 properties:
Rakesh H Sde6ad902016-04-28 15:30:54 +053066 desired_capacity: 3
67 max_size: 5
68 min_size: 2
Tetiana Lashchova1d74d3d2015-01-29 15:05:05 +020069 resource:
70 type: randomstr.yaml
71
72outputs:
73 all_values:
74 value: {get_attr: [random_group, outputs_list, random_str]}
75 value_0:
76 value: {get_attr: [random_group, resource.0.random_str]}
Rakesh H Sde6ad902016-04-28 15:30:54 +053077 value_1:
78 value: {get_attr: [random_group, resource.1.random_str]}
79 value_2:
80 value: {get_attr: [random_group, resource.2.random_str]}
Tetiana Lashchova1d74d3d2015-01-29 15:05:05 +020081'''
82
83 template_randomstr = '''
84heat_template_version: 2013-05-23
85
86resources:
87 random_str:
88 type: OS::Heat::RandomString
89
90outputs:
91 random_str:
92 value: {get_attr: [random_str, value]}
93'''
94
Tetiana Lashchova1d74d3d2015-01-29 15:05:05 +020095 def _assert_output_values(self, stack_id):
96 stack = self.client.stacks.get(stack_id)
97 all_values = self._stack_output(stack, 'all_values')
Rakesh H Sde6ad902016-04-28 15:30:54 +053098 self.assertEqual(3, len(all_values))
Tetiana Lashchova1d74d3d2015-01-29 15:05:05 +020099 self.assertEqual(all_values[0], self._stack_output(stack, 'value_0'))
Rakesh H Sde6ad902016-04-28 15:30:54 +0530100 self.assertEqual(all_values[1], self._stack_output(stack, 'value_1'))
101 self.assertEqual(all_values[2], self._stack_output(stack, 'value_2'))
102
103 def test_asg_scale_up_max_size(self):
104 stack_id = self.stack_create(template=self.template,
105 expected_status='CREATE_COMPLETE')
106 stack = self.client.stacks.get(stack_id)
107 asg_size = self._stack_output(stack, 'asg_size')
108 # Ensure that initial desired capacity is met
109 self.assertEqual(3, asg_size)
110
111 # send scale up signals and ensure that asg honors max_size
112 asg = self.client.resources.get(stack_id, 'random_group')
113 max_size = 5
114 for num in range(asg_size+1, max_size+2):
115 expected_resources = num if num <= max_size else max_size
116 self.client.resources.signal(stack_id, 'scale_up_policy')
Thomas Herve49488792017-04-10 17:00:57 +0200117 self.assertTrue(
118 test.call_until_true(self.conf.build_timeout,
119 self.conf.build_interval,
120 self.check_autoscale_complete,
121 asg.physical_resource_id,
Thomas Hervea6afca82017-04-10 23:44:26 +0200122 expected_resources, stack_id,
123 'scale_up_policy'))
Rakesh H Sde6ad902016-04-28 15:30:54 +0530124
125 def test_asg_scale_down_min_size(self):
126 stack_id = self.stack_create(template=self.template,
127 expected_status='CREATE_COMPLETE')
128 stack = self.client.stacks.get(stack_id)
129 asg_size = self._stack_output(stack, 'asg_size')
130 # Ensure that initial desired capacity is met
131 self.assertEqual(3, asg_size)
132
133 # send scale down signals and ensure that asg honors min_size
134 asg = self.client.resources.get(stack_id, 'random_group')
135 min_size = 2
136 for num in range(asg_size-1, 0, -1):
137 expected_resources = num if num >= min_size else min_size
138 self.client.resources.signal(stack_id, 'scale_down_policy')
Thomas Herve49488792017-04-10 17:00:57 +0200139 self.assertTrue(
140 test.call_until_true(self.conf.build_timeout,
141 self.conf.build_interval,
142 self.check_autoscale_complete,
143 asg.physical_resource_id,
Thomas Hervea6afca82017-04-10 23:44:26 +0200144 expected_resources, stack_id,
145 'scale_down_policy'))
Tetiana Lashchova1d74d3d2015-01-29 15:05:05 +0200146
Rakesh H S20d93d52016-05-02 14:23:24 +0530147 def test_asg_cooldown(self):
148 cooldown_tmpl = self.template.replace('cooldown: 0',
rabi34b88ee2017-06-09 09:38:15 +0530149 'cooldown: 60')
Rakesh H S20d93d52016-05-02 14:23:24 +0530150 stack_id = self.stack_create(template=cooldown_tmpl,
151 expected_status='CREATE_COMPLETE')
152 stack = self.client.stacks.get(stack_id)
153 asg_size = self._stack_output(stack, 'asg_size')
154 # Ensure that initial desired capacity is met
155 self.assertEqual(3, asg_size)
156
157 # send scale up signal.
158 # Since cooldown is in effect, number of resources should not change
159 asg = self.client.resources.get(stack_id, 'random_group')
160 expected_resources = 3
161 self.client.resources.signal(stack_id, 'scale_up_policy')
Thomas Herve49488792017-04-10 17:00:57 +0200162 self.assertTrue(
163 test.call_until_true(self.conf.build_timeout,
164 self.conf.build_interval,
165 self.check_autoscale_complete,
166 asg.physical_resource_id,
Thomas Hervea6afca82017-04-10 23:44:26 +0200167 expected_resources, stack_id,
168 'scale_up_policy'))
Rakesh H S20d93d52016-05-02 14:23:24 +0530169
Tetiana Lashchova1d74d3d2015-01-29 15:05:05 +0200170 def test_path_attrs(self):
171 stack_id = self.stack_create(template=self.template)
Rakesh H Sde6ad902016-04-28 15:30:54 +0530172 expected_resources = {'random_group': 'OS::Heat::AutoScalingGroup',
173 'scale_up_policy': 'OS::Heat::ScalingPolicy',
174 'scale_down_policy': 'OS::Heat::ScalingPolicy'}
Tetiana Lashchova1d74d3d2015-01-29 15:05:05 +0200175 self.assertEqual(expected_resources, self.list_resources(stack_id))
176 self._assert_output_values(stack_id)
177
178 def test_path_attrs_nested(self):
179 files = {'randomstr.yaml': self.template_randomstr}
180 stack_id = self.stack_create(template=self.template_nested,
181 files=files)
182 expected_resources = {'random_group': 'OS::Heat::AutoScalingGroup'}
183 self.assertEqual(expected_resources, self.list_resources(stack_id))
184 self._assert_output_values(stack_id)
kairat_kushaev6f9f8602015-03-16 11:32:24 +1000185
186
Rabi Mishra477efc92015-07-31 13:01:45 +0530187class AutoScalingGroupUpdateWithNoChanges(functional_base.FunctionalTestsBase):
kairat_kushaev6f9f8602015-03-16 11:32:24 +1000188
189 template = '''
190heat_template_version: 2013-05-23
191
192resources:
193 test_group:
194 type: OS::Heat::AutoScalingGroup
195 properties:
196 desired_capacity: 0
197 max_size: 0
198 min_size: 0
199 resource:
200 type: OS::Heat::RandomString
201 test_policy:
202 type: OS::Heat::ScalingPolicy
203 properties:
204 adjustment_type: change_in_capacity
205 auto_scaling_group_id: { get_resource: test_group }
206 scaling_adjustment: 1
207'''
208
kairat_kushaev6f9f8602015-03-16 11:32:24 +1000209 def test_as_group_update_without_resource_changes(self):
210 stack_identifier = self.stack_create(template=self.template)
211 new_template = self.template.replace(
212 'scaling_adjustment: 1',
213 'scaling_adjustment: 2')
214
215 self.update_stack(stack_identifier, template=new_template)