def instantiate(self, update_existing): main_tmpl = _load_template('main.heat', {'resources': self._serialize_resources()}) heat = client() kwargs = { 'stack_name': self.cluster.name, 'timeout_mins': 180, 'disable_rollback': True, 'parameters': {}, 'template': json.loads(main_tmpl) } if not update_existing: heat.stacks.create(**kwargs) else: for stack in heat.stacks.list(): if stack.stack_name == self.cluster.name: stack.update(**kwargs) break for stack in heat.stacks.list(): if stack.stack_name == self.cluster.name: return ClusterStack(self, stack) raise ex.HeatStackException('Failed to find just created stack %s' % self.cluster.name)
def wait_stack_completion(stack): # NOTE: expected empty status because status of stack # maybe is not set in heat database while stack.status in ['IN_PROGRESS', '']: context.sleep(1) stack.get() if stack.status != 'COMPLETE': raise ex.HeatStackException(stack.stack_status)
def wait_till_active(self): while self.heat_stack.stack_status in ('CREATE_IN_PROGRESS', 'UPDATE_IN_PROGRESS'): context.sleep(1) self.heat_stack.get() if self.heat_stack.stack_status not in ('CREATE_COMPLETE', 'UPDATE_COMPLETE'): raise ex.HeatStackException(self.heat_stack.stack_status)
def wait_stack_completion(cluster, is_update=False, last_updated_time=None): stack_name = cluster.stack_name stack = get_stack(stack_name) while not _verify_completion(stack, is_update, last_updated_time): context.sleep(1) stack = get_stack(stack_name) if stack.status != 'COMPLETE': raise ex.HeatStackException(stack.stack_status_reason)
def delete_stack(cluster): stack_name = cluster.stack_name base.execute_with_retries(client().stacks.delete, stack_name) stack = get_stack(stack_name, raise_on_missing=False) while stack is not None: # Valid states: IN_PROGRESS, empty and COMPLETE if stack.status in ['IN_PROGRESS', '', 'COMPLETE']: context.sleep(5) else: raise ex.HeatStackException( message=_("Cannot delete heat stack {name}, reason: " "stack status: {status}, status reason: {reason}" ).format(name=stack_name, status=stack.status, reason=stack.stack_status_reason)) stack = get_stack(stack_name, raise_on_missing=False)