Merge ~freyes/ubuntu/+source/heat:stable/xena into ~ubuntu-openstack-dev/ubuntu/+source/heat:stable/xena
- Git
- lp:~freyes/ubuntu/+source/heat
- stable/xena
- Merge into stable/xena
Proposed by
Felipe Reyes
Status: | Merged | ||||
---|---|---|---|---|---|
Merge reported by: | Corey Bryant | ||||
Merged at revision: | 45af92db98c1334c7bcaad1dda8d0486aa5a1deb | ||||
Proposed branch: | ~freyes/ubuntu/+source/heat:stable/xena | ||||
Merge into: | ~ubuntu-openstack-dev/ubuntu/+source/heat:stable/xena | ||||
Diff against target: |
378 lines (+134/-33) 12 files modified
AUTHORS (+1/-0) ChangeLog (+9/-0) PKG-INFO (+1/-1) debian/changelog (+6/-2) devstack/lib/heat (+10/-1) heat/engine/resources/openstack/heat/resource_group.py (+12/-6) heat/engine/resources/openstack/nova/server_group.py (+25/-18) heat/tests/openstack/nova/test_server_group.py (+13/-3) heat_integrationtests/functional/test_resource_group.py (+54/-0) openstack_heat.egg-info/PKG-INFO (+1/-1) openstack_heat.egg-info/pbr.json (+1/-1) tox.ini (+1/-0) |
||||
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Corey Bryant | Pending | ||
Review via email: mp+416206@code.launchpad.net |
Commit message
Description of the change
To post a comment you must log in.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | diff --git a/AUTHORS b/AUTHORS | |||
2 | index 4f34a6b..f8705d9 100644 | |||
3 | --- a/AUTHORS | |||
4 | +++ b/AUTHORS | |||
5 | @@ -49,6 +49,7 @@ Atsushi Sasaki <atsaki01@gmail.com> | |||
6 | 49 | Attila Fazekas <afazekas@redhat.com> | 49 | Attila Fazekas <afazekas@redhat.com> |
7 | 50 | AvnishPal <avnish.pal@nectechnologies.in> | 50 | AvnishPal <avnish.pal@nectechnologies.in> |
8 | 51 | BK Box <bk@theboxes.org> | 51 | BK Box <bk@theboxes.org> |
9 | 52 | Balazs Gibizer <balazs.gibizer@est.tech> | ||
10 | 52 | Bartosz Górski <bartosz.gorski@ntti3.com> | 53 | Bartosz Górski <bartosz.gorski@ntti3.com> |
11 | 53 | Ben Nemec <bnemec@redhat.com> | 54 | Ben Nemec <bnemec@redhat.com> |
12 | 54 | Ben Nemec <openstack@nemebean.com> | 55 | Ben Nemec <openstack@nemebean.com> |
13 | diff --git a/ChangeLog b/ChangeLog | |||
14 | index 3720f19..a35becd 100644 | |||
15 | --- a/ChangeLog | |||
16 | +++ b/ChangeLog | |||
17 | @@ -1,6 +1,15 @@ | |||
18 | 1 | CHANGES | 1 | CHANGES |
19 | 2 | ======= | 2 | ======= |
20 | 3 | 3 | ||
21 | 4 | 17.0.1 | ||
22 | 5 | ------ | ||
23 | 6 | |||
24 | 7 | * Provide install\_command to pip install with upper-constraints | ||
25 | 8 | * Fix timeout calc of nested resource groups | ||
26 | 9 | * Reproduce bug story/2009237 | ||
27 | 10 | * Fallback to upstream for Fedora image | ||
28 | 11 | * Fix ServerGroup create | ||
29 | 12 | |||
30 | 4 | 17.0.0 | 13 | 17.0.0 |
31 | 5 | ------ | 14 | ------ |
32 | 6 | 15 | ||
33 | diff --git a/PKG-INFO b/PKG-INFO | |||
34 | index 7ef1230..315b8c6 100644 | |||
35 | --- a/PKG-INFO | |||
36 | +++ b/PKG-INFO | |||
37 | @@ -1,6 +1,6 @@ | |||
38 | 1 | Metadata-Version: 1.2 | 1 | Metadata-Version: 1.2 |
39 | 2 | Name: openstack-heat | 2 | Name: openstack-heat |
41 | 3 | Version: 17.0.0 | 3 | Version: 17.0.1 |
42 | 4 | Summary: OpenStack Orchestration | 4 | Summary: OpenStack Orchestration |
43 | 5 | Home-page: https://docs.openstack.org/heat/latest/ | 5 | Home-page: https://docs.openstack.org/heat/latest/ |
44 | 6 | Author: OpenStack | 6 | Author: OpenStack |
45 | diff --git a/debian/changelog b/debian/changelog | |||
46 | index 41503e0..f83520d 100644 | |||
47 | --- a/debian/changelog | |||
48 | +++ b/debian/changelog | |||
49 | @@ -1,8 +1,12 @@ | |||
51 | 1 | heat (1:17.0.0-0ubuntu1.1) UNRELEASED; urgency=medium | 1 | heat (1:17.0.1-0ubuntu1) UNRELEASED; urgency=medium |
52 | 2 | 2 | ||
53 | 3 | [ Corey Bryant ] | ||
54 | 3 | * d/gbp.conf: Create stable/xena branch. | 4 | * d/gbp.conf: Create stable/xena branch. |
55 | 4 | 5 | ||
57 | 5 | -- Corey Bryant <corey.bryant@canonical.com> Fri, 15 Oct 2021 14:53:00 -0400 | 6 | [ Felipe Reyes ] |
58 | 7 | * New stable point release for OpenStack Xena (LP: #1962582). | ||
59 | 8 | |||
60 | 9 | -- Felipe Reyes <felipe.reyes@canonical.com> Tue, 01 Mar 2022 14:51:07 +0000 | ||
61 | 6 | 10 | ||
62 | 7 | heat (1:17.0.0-0ubuntu1) impish; urgency=medium | 11 | heat (1:17.0.0-0ubuntu1) impish; urgency=medium |
63 | 8 | 12 | ||
64 | diff --git a/devstack/lib/heat b/devstack/lib/heat | |||
65 | index 5993d7d..5f5f172 100644 | |||
66 | --- a/devstack/lib/heat | |||
67 | +++ b/devstack/lib/heat | |||
68 | @@ -471,10 +471,19 @@ function configure_tempest_for_heat { | |||
69 | 471 | source $TOP_DIR/openrc admin admin | 471 | source $TOP_DIR/openrc admin admin |
70 | 472 | iniset $TEMPEST_CONFIG heat_plugin admin_username $OS_USERNAME | 472 | iniset $TEMPEST_CONFIG heat_plugin admin_username $OS_USERNAME |
71 | 473 | iniset $TEMPEST_CONFIG heat_plugin admin_password $OS_PASSWORD | 473 | iniset $TEMPEST_CONFIG heat_plugin admin_password $OS_PASSWORD |
72 | 474 | |||
73 | 475 | # NOTE(ianw) OpenDev infra only keeps the latest two Fedora's | ||
74 | 476 | # around; prefer the mirror but allow fallback | ||
75 | 474 | if [[ -e /etc/ci/mirror_info.sh ]]; then | 477 | if [[ -e /etc/ci/mirror_info.sh ]]; then |
76 | 475 | source /etc/ci/mirror_info.sh | 478 | source /etc/ci/mirror_info.sh |
77 | 476 | fi | 479 | fi |
79 | 477 | export HEAT_TEST_FEDORA_IMAGE=${NODEPOOL_FEDORA_MIRROR:-https://download.fedoraproject.org/pub/fedora/linux}/releases/33/Cloud/x86_64/images/Fedora-Cloud-Base-33-1.2.x86_64.qcow2 | 480 | HEAT_TEST_FEDORA_IMAGE_UPSTREAM=https://download.fedoraproject.org/pub/fedora/linux |
80 | 481 | HEAT_TEST_FEDORA_IMAGE_PATH=releases/33/Cloud/x86_64/images/Fedora-Cloud-Base-33-1.2.x86_64.qcow2 | ||
81 | 482 | if curl --output /dev/null --silent --head --fail "${NODEPOOL_FEDORA_MIRROR}/${HEAT_TEST_FEDORA_IMAGE_PATH}"; then | ||
82 | 483 | export HEAT_TEST_FEDORA_IMAGE="${NODEPOOL_FEDORA_MIRROR}/${HEAT_TEST_FEDORA_IMAGE_PATH}" | ||
83 | 484 | else | ||
84 | 485 | export HEAT_TEST_FEDORA_IMAGE="${HEAT_TEST_FEDORA_IMAGE_UPSTREAM}/${HEAT_TEST_FEDORA_IMAGE_PATH}" | ||
85 | 486 | fi | ||
86 | 478 | TOKEN=$(openstack token issue -c id -f value) | 487 | TOKEN=$(openstack token issue -c id -f value) |
87 | 479 | local image_exists=$( openstack image list | grep "Fedora-Cloud-Base-33-1.2.x86_64" ) | 488 | local image_exists=$( openstack image list | grep "Fedora-Cloud-Base-33-1.2.x86_64" ) |
88 | 480 | if [[ -z $image_exists ]]; then | 489 | if [[ -z $image_exists ]]; then |
89 | diff --git a/heat/engine/resources/openstack/heat/resource_group.py b/heat/engine/resources/openstack/heat/resource_group.py | |||
90 | index 48ef05a..1bdc0c3 100644 | |||
91 | --- a/heat/engine/resources/openstack/heat/resource_group.py | |||
92 | +++ b/heat/engine/resources/openstack/heat/resource_group.py | |||
93 | @@ -15,6 +15,7 @@ import collections | |||
94 | 15 | import copy | 15 | import copy |
95 | 16 | import functools | 16 | import functools |
96 | 17 | import itertools | 17 | import itertools |
97 | 18 | import math | ||
98 | 18 | 19 | ||
99 | 19 | from oslo_log import log as logging | 20 | from oslo_log import log as logging |
100 | 20 | 21 | ||
101 | @@ -433,18 +434,18 @@ class ResourceGroup(stack_resource.StackResource): | |||
102 | 433 | return False | 434 | return False |
103 | 434 | return True | 435 | return True |
104 | 435 | 436 | ||
106 | 436 | def _run_to_completion(self, template, timeout): | 437 | def _run_to_completion(self, template, timeout_mins): |
107 | 437 | updater = self.update_with_template(template, {}, | 438 | updater = self.update_with_template(template, {}, |
109 | 438 | timeout) | 439 | timeout_mins) |
110 | 439 | 440 | ||
111 | 440 | while not super(ResourceGroup, | 441 | while not super(ResourceGroup, |
112 | 441 | self).check_update_complete(updater): | 442 | self).check_update_complete(updater): |
113 | 442 | yield | 443 | yield |
114 | 443 | 444 | ||
116 | 444 | def _run_update(self, total_capacity, max_updates, timeout): | 445 | def _run_update(self, total_capacity, max_updates, timeout_mins): |
117 | 445 | template = self._assemble_for_rolling_update(total_capacity, | 446 | template = self._assemble_for_rolling_update(total_capacity, |
118 | 446 | max_updates) | 447 | max_updates) |
120 | 447 | return self._run_to_completion(template, timeout) | 448 | return self._run_to_completion(template, timeout_mins) |
121 | 448 | 449 | ||
122 | 449 | def check_update_complete(self, checkers): | 450 | def check_update_complete(self, checkers): |
123 | 450 | for checker in checkers: | 451 | for checker in checkers: |
124 | @@ -776,13 +777,18 @@ class ResourceGroup(stack_resource.StackResource): | |||
125 | 776 | 777 | ||
126 | 777 | batches = list(self._get_batches(self.get_size(), curr_cap, batch_size, | 778 | batches = list(self._get_batches(self.get_size(), curr_cap, batch_size, |
127 | 778 | min_in_service)) | 779 | min_in_service)) |
129 | 779 | update_timeout = self._update_timeout(len(batches), pause_sec) | 780 | update_timeout_secs = self._update_timeout(len(batches), pause_sec) |
130 | 781 | |||
131 | 782 | # NOTE(gibi) update_timeout is in seconds but the _run_update | ||
132 | 783 | # eventually calls StackResource.update_with_template that takes | ||
133 | 784 | # timeout in minutes so we need to convert here. | ||
134 | 785 | update_timeout_mins = math.ceil(update_timeout_secs / 60) | ||
135 | 780 | 786 | ||
136 | 781 | def tasks(): | 787 | def tasks(): |
137 | 782 | for index, (curr_cap, max_upd) in enumerate(batches): | 788 | for index, (curr_cap, max_upd) in enumerate(batches): |
138 | 783 | yield scheduler.TaskRunner(self._run_update, | 789 | yield scheduler.TaskRunner(self._run_update, |
139 | 784 | curr_cap, max_upd, | 790 | curr_cap, max_upd, |
141 | 785 | update_timeout) | 791 | update_timeout_mins) |
142 | 786 | 792 | ||
143 | 787 | if index < (len(batches) - 1) and pause_sec > 0: | 793 | if index < (len(batches) - 1) and pause_sec > 0: |
144 | 788 | yield scheduler.TaskRunner(pause_between_batch, pause_sec) | 794 | yield scheduler.TaskRunner(pause_between_batch, pause_sec) |
145 | diff --git a/heat/engine/resources/openstack/nova/server_group.py b/heat/engine/resources/openstack/nova/server_group.py | |||
146 | index afc417b..b4eb956 100644 | |||
147 | --- a/heat/engine/resources/openstack/nova/server_group.py | |||
148 | +++ b/heat/engine/resources/openstack/nova/server_group.py | |||
149 | @@ -35,11 +35,13 @@ class ServerGroup(resource.Resource): | |||
150 | 35 | entity = 'server_groups' | 35 | entity = 'server_groups' |
151 | 36 | 36 | ||
152 | 37 | PROPERTIES = ( | 37 | PROPERTIES = ( |
154 | 38 | NAME, POLICIES, RULE | 38 | NAME, POLICIES, RULES |
155 | 39 | ) = ( | 39 | ) = ( |
157 | 40 | 'name', 'policies', 'rule' | 40 | 'name', 'policies', 'rules' |
158 | 41 | ) | 41 | ) |
159 | 42 | 42 | ||
160 | 43 | _RULES = (MAX_SERVER_PER_HOST) = ('max_server_per_host') | ||
161 | 44 | |||
162 | 43 | properties_schema = { | 45 | properties_schema = { |
163 | 44 | NAME: properties.Schema( | 46 | NAME: properties.Schema( |
164 | 45 | properties.Schema.STRING, | 47 | properties.Schema.STRING, |
165 | @@ -47,7 +49,7 @@ class ServerGroup(resource.Resource): | |||
166 | 47 | ), | 49 | ), |
167 | 48 | POLICIES: properties.Schema( | 50 | POLICIES: properties.Schema( |
168 | 49 | properties.Schema.LIST, | 51 | properties.Schema.LIST, |
170 | 50 | _('A list of string policies to apply. ' | 52 | _('A list of exactly one policy to apply. ' |
171 | 51 | 'Defaults to anti-affinity.'), | 53 | 'Defaults to anti-affinity.'), |
172 | 52 | default=['anti-affinity'], | 54 | default=['anti-affinity'], |
173 | 53 | constraints=[ | 55 | constraints=[ |
174 | @@ -59,11 +61,17 @@ class ServerGroup(resource.Resource): | |||
175 | 59 | properties.Schema.STRING, | 61 | properties.Schema.STRING, |
176 | 60 | ), | 62 | ), |
177 | 61 | ), | 63 | ), |
179 | 62 | RULE: properties.Schema( | 64 | RULES: properties.Schema( |
180 | 63 | properties.Schema.MAP, | 65 | properties.Schema.MAP, |
184 | 64 | _('A rule for the policy. Currently, only the ' | 66 | _('Rules for a policy.'), |
185 | 65 | '"max_server_per_host" rule is supported for the ' | 67 | schema={ |
186 | 66 | '"anti-affinity" policy.'), | 68 | MAX_SERVER_PER_HOST: properties.Schema( |
187 | 69 | properties.Schema.NUMBER, | ||
188 | 70 | _('Maximum servers in a group on a given host. ' | ||
189 | 71 | 'Rule for anti-affinity policy.') | ||
190 | 72 | ) | ||
191 | 73 | }, | ||
192 | 74 | support_status=support.SupportStatus(version='17.0.0'), | ||
193 | 67 | ), | 75 | ), |
194 | 68 | } | 76 | } |
195 | 69 | 77 | ||
196 | @@ -77,26 +85,25 @@ class ServerGroup(resource.Resource): | |||
197 | 77 | msg = _('Required microversion for soft policies not supported.') | 85 | msg = _('Required microversion for soft policies not supported.') |
198 | 78 | raise exception.StackValidationFailed(message=msg) | 86 | raise exception.StackValidationFailed(message=msg) |
199 | 79 | 87 | ||
201 | 80 | if self.properties[self.RULE]: | 88 | if self.properties[self.RULES]: |
202 | 81 | is_supported = self.client_plugin().is_version_supported( | 89 | is_supported = self.client_plugin().is_version_supported( |
203 | 82 | MICROVERSION_RULE) | 90 | MICROVERSION_RULE) |
204 | 83 | if not is_supported: | 91 | if not is_supported: |
206 | 84 | msg = _('Required microversion for rule not supported.') | 92 | msg = _('Required microversion for rules not supported.') |
207 | 85 | raise exception.StackValidationFailed(message=msg) | 93 | raise exception.StackValidationFailed(message=msg) |
208 | 86 | 94 | ||
209 | 87 | def handle_create(self): | 95 | def handle_create(self): |
210 | 88 | name = self.physical_resource_name() | 96 | name = self.physical_resource_name() |
211 | 89 | policies = self.properties[self.POLICIES] | 97 | policies = self.properties[self.POLICIES] |
218 | 90 | if self.properties[self.RULE] and 'soft-affinity' in policies: | 98 | rules = self.properties[self.RULES] |
219 | 91 | rule = self.properties[self.RULE] | 99 | rules_supported = self.client_plugin().is_version_supported( |
220 | 92 | client = self.client() | 100 | MICROVERSION_RULE) |
221 | 93 | server_group = client.server_groups.create(name=name, | 101 | if rules_supported: |
222 | 94 | policies=policies, | 102 | server_group = self.client().server_groups.create( |
223 | 95 | rule=rule) | 103 | name=name, policy=policies[0], rules=rules) |
224 | 96 | else: | 104 | else: |
228 | 97 | client = self.client() | 105 | server_group = self.client().server_groups.create( |
229 | 98 | server_group = client.server_groups.create(name=name, | 106 | name=name, policies=policies) |
227 | 99 | policies=policies) | ||
230 | 100 | self.resource_id_set(server_group.id) | 107 | self.resource_id_set(server_group.id) |
231 | 101 | 108 | ||
232 | 102 | def physical_resource_name(self): | 109 | def physical_resource_name(self): |
233 | diff --git a/heat/tests/openstack/nova/test_server_group.py b/heat/tests/openstack/nova/test_server_group.py | |||
234 | index 0a1e682..c2dfda4 100644 | |||
235 | --- a/heat/tests/openstack/nova/test_server_group.py | |||
236 | +++ b/heat/tests/openstack/nova/test_server_group.py | |||
237 | @@ -26,7 +26,9 @@ sg_template = { | |||
238 | 26 | "type": "OS::Nova::ServerGroup", | 26 | "type": "OS::Nova::ServerGroup", |
239 | 27 | "properties": { | 27 | "properties": { |
240 | 28 | "name": "test", | 28 | "name": "test", |
242 | 29 | "policies": ["anti-affinity"] | 29 | "policies": ["anti-affinity"], |
243 | 30 | "rules": { | ||
244 | 31 | "max_server_per_host": 8} | ||
245 | 30 | } | 32 | } |
246 | 31 | } | 33 | } |
247 | 32 | } | 34 | } |
248 | @@ -50,6 +52,12 @@ class NovaServerGroupTest(common.HeatTestCase): | |||
249 | 50 | # create mock clients and objects | 52 | # create mock clients and objects |
250 | 51 | nova = mock.MagicMock() | 53 | nova = mock.MagicMock() |
251 | 52 | self.sg.client = mock.MagicMock(return_value=nova) | 54 | self.sg.client = mock.MagicMock(return_value=nova) |
252 | 55 | mock_plugin = mock.MagicMock() | ||
253 | 56 | self.patchobject(mock_plugin, | ||
254 | 57 | 'is_version_supported', | ||
255 | 58 | return_value=True) | ||
256 | 59 | self.patchobject(self.sg, 'client_plugin', | ||
257 | 60 | return_value=mock_plugin) | ||
258 | 53 | self.sg_mgr = nova.server_groups | 61 | self.sg_mgr = nova.server_groups |
259 | 54 | 62 | ||
260 | 55 | def _create_sg(self, name): | 63 | def _create_sg(self, name): |
261 | @@ -68,7 +76,7 @@ class NovaServerGroupTest(common.HeatTestCase): | |||
262 | 68 | name = 'test' | 76 | name = 'test' |
263 | 69 | n = name | 77 | n = name |
264 | 70 | 78 | ||
266 | 71 | def fake_create(name, policies): | 79 | def fake_create(name, policy, rules): |
267 | 72 | self.assertGreater(len(name), 1) | 80 | self.assertGreater(len(name), 1) |
268 | 73 | return FakeGroup(n) | 81 | return FakeGroup(n) |
269 | 74 | self.sg_mgr.create = fake_create | 82 | self.sg_mgr.create = fake_create |
270 | @@ -81,7 +89,9 @@ class NovaServerGroupTest(common.HeatTestCase): | |||
271 | 81 | self._create_sg('test') | 89 | self._create_sg('test') |
272 | 82 | expected_args = () | 90 | expected_args = () |
273 | 83 | expected_kwargs = {'name': 'test', | 91 | expected_kwargs = {'name': 'test', |
275 | 84 | 'policies': ["anti-affinity"], | 92 | 'policy': "anti-affinity", |
276 | 93 | 'rules': { | ||
277 | 94 | 'max_server_per_host': 8} | ||
278 | 85 | } | 95 | } |
279 | 86 | self.sg_mgr.create.assert_called_once_with(*expected_args, | 96 | self.sg_mgr.create.assert_called_once_with(*expected_args, |
280 | 87 | **expected_kwargs) | 97 | **expected_kwargs) |
281 | diff --git a/heat_integrationtests/functional/test_resource_group.py b/heat_integrationtests/functional/test_resource_group.py | |||
282 | index ebce70d..07be7f2 100644 | |||
283 | --- a/heat_integrationtests/functional/test_resource_group.py | |||
284 | +++ b/heat_integrationtests/functional/test_resource_group.py | |||
285 | @@ -129,6 +129,60 @@ resources: | |||
286 | 129 | outputs.append(validate_output(stack, 'random2', 30)) | 129 | outputs.append(validate_output(stack, 'random2', 30)) |
287 | 130 | self.assertEqual(outputs, self._stack_output(stack, 'all_values')) | 130 | self.assertEqual(outputs, self._stack_output(stack, 'all_values')) |
288 | 131 | 131 | ||
289 | 132 | def test_create_nested_groups_with_timeout(self): | ||
290 | 133 | parent_template = ''' | ||
291 | 134 | heat_template_version: rocky | ||
292 | 135 | resources: | ||
293 | 136 | parent_group: | ||
294 | 137 | type: OS::Heat::ResourceGroup | ||
295 | 138 | update_policy: | ||
296 | 139 | batch_create: { max_batch_size: 1, pause_time: 1 } | ||
297 | 140 | properties: | ||
298 | 141 | count: 2 | ||
299 | 142 | resource_def: | ||
300 | 143 | type: child.yaml | ||
301 | 144 | ''' | ||
302 | 145 | child_template = ''' | ||
303 | 146 | heat_template_version: rocky | ||
304 | 147 | resources: | ||
305 | 148 | child_group: | ||
306 | 149 | type: OS::Heat::ResourceGroup | ||
307 | 150 | update_policy: | ||
308 | 151 | batch_create: { max_batch_size: 1, pause_time: 1 } | ||
309 | 152 | properties: | ||
310 | 153 | count: 2 | ||
311 | 154 | resource_def: | ||
312 | 155 | type: value.yaml | ||
313 | 156 | ''' | ||
314 | 157 | value_template = ''' | ||
315 | 158 | heat_template_version: rocky | ||
316 | 159 | resources: | ||
317 | 160 | value: | ||
318 | 161 | type: OS::Heat::Value | ||
319 | 162 | properties: | ||
320 | 163 | type: string | ||
321 | 164 | value: 'test' | ||
322 | 165 | ''' | ||
323 | 166 | files = { | ||
324 | 167 | 'child.yaml': child_template, | ||
325 | 168 | 'value.yaml': value_template, | ||
326 | 169 | } | ||
327 | 170 | stack_identifier = self.stack_create( | ||
328 | 171 | template=parent_template, | ||
329 | 172 | files=files, | ||
330 | 173 | timeout=10, # in minutes | ||
331 | 174 | ) | ||
332 | 175 | |||
333 | 176 | resources = self.client.resources.list( | ||
334 | 177 | stack_identifier, nested_depth=2, with_detail=True) | ||
335 | 178 | timeouts = set() | ||
336 | 179 | for res in resources: | ||
337 | 180 | if res.resource_type == "OS::Heat::ResourceGroup": | ||
338 | 181 | nested_stack = self.client.stacks.get(res.physical_resource_id) | ||
339 | 182 | timeouts.add(nested_stack.timeout_mins) | ||
340 | 183 | |||
341 | 184 | self.assertEqual({10}, timeouts) | ||
342 | 185 | |||
343 | 132 | def test_update_increase_decrease_count(self): | 186 | def test_update_increase_decrease_count(self): |
344 | 133 | # create stack with resource group count 2 | 187 | # create stack with resource group count 2 |
345 | 134 | env = {'resource_registry': | 188 | env = {'resource_registry': |
346 | diff --git a/openstack_heat.egg-info/PKG-INFO b/openstack_heat.egg-info/PKG-INFO | |||
347 | index 7ef1230..315b8c6 100644 | |||
348 | --- a/openstack_heat.egg-info/PKG-INFO | |||
349 | +++ b/openstack_heat.egg-info/PKG-INFO | |||
350 | @@ -1,6 +1,6 @@ | |||
351 | 1 | Metadata-Version: 1.2 | 1 | Metadata-Version: 1.2 |
352 | 2 | Name: openstack-heat | 2 | Name: openstack-heat |
354 | 3 | Version: 17.0.0 | 3 | Version: 17.0.1 |
355 | 4 | Summary: OpenStack Orchestration | 4 | Summary: OpenStack Orchestration |
356 | 5 | Home-page: https://docs.openstack.org/heat/latest/ | 5 | Home-page: https://docs.openstack.org/heat/latest/ |
357 | 6 | Author: OpenStack | 6 | Author: OpenStack |
358 | diff --git a/openstack_heat.egg-info/pbr.json b/openstack_heat.egg-info/pbr.json | |||
359 | index 4773ead..9aeecc8 100644 | |||
360 | --- a/openstack_heat.egg-info/pbr.json | |||
361 | +++ b/openstack_heat.egg-info/pbr.json | |||
362 | @@ -1 +1 @@ | |||
363 | 1 | {"git_version": "4cf0ff641", "is_release": true} | ||
364 | 2 | \ No newline at end of file | 1 | \ No newline at end of file |
365 | 2 | {"git_version": "ef36cb304", "is_release": true} | ||
366 | 3 | \ No newline at end of file | 3 | \ No newline at end of file |
367 | diff --git a/tox.ini b/tox.ini | |||
368 | index 5e76541..eb87eff 100644 | |||
369 | --- a/tox.ini | |||
370 | +++ b/tox.ini | |||
371 | @@ -9,6 +9,7 @@ basepython = python3 | |||
372 | 9 | setenv = VIRTUAL_ENV={envdir} | 9 | setenv = VIRTUAL_ENV={envdir} |
373 | 10 | PYTHONWARNINGS=default::DeprecationWarning | 10 | PYTHONWARNINGS=default::DeprecationWarning |
374 | 11 | OS_TEST_PATH=heat/tests | 11 | OS_TEST_PATH=heat/tests |
375 | 12 | install_command = pip install -c{env:UPPER_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/xena} {opts} {packages} | ||
376 | 12 | usedevelop = True | 13 | usedevelop = True |
377 | 13 | deps = -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/xena} | 14 | deps = -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/xena} |
378 | 14 | -r{toxinidir}/requirements.txt | 15 | -r{toxinidir}/requirements.txt |