diff --git a/heat_integrationtests/common/test.py b/heat_integrationtests/common/test.py index 7a95af320..6c70d830a 100644 --- a/heat_integrationtests/common/test.py +++ b/heat_integrationtests/common/test.py @@ -328,15 +328,32 @@ class HeatIntegrationTest(testscenarios.WithScenarios, env_files = files or {} parameters = parameters or {} stack_name = stack_identifier.split('/')[0] - self.client.stacks.update( - stack_id=stack_identifier, - stack_name=stack_name, - template=template, - files=env_files, - disable_rollback=disable_rollback, - parameters=parameters, - environment=env - ) + + build_timeout = self.conf.build_timeout + build_interval = self.conf.build_interval + start = timeutils.utcnow() + while timeutils.delta_seconds(start, + timeutils.utcnow()) < build_timeout: + try: + self.client.stacks.update( + stack_id=stack_identifier, + stack_name=stack_name, + template=template, + files=env_files, + disable_rollback=disable_rollback, + parameters=parameters, + environment=env + ) + except heat_exceptions.HTTPConflict as ex: + # FIXME(sirushtim): Wait a little for the stack lock to be + # released and hopefully, the stack should be updatable again. + if ex.error['error']['type'] != 'ActionInProgress': + raise ex + + time.sleep(build_interval) + else: + break + kwargs = {'stack_identifier': stack_identifier, 'status': expected_status} if expected_status in ['ROLLBACK_COMPLETE']: