def check_resource(self, cnxt, resource_id, current_traversal, data, is_update, adopt_stack_data): """Process a node in the dependency graph. The node may be associated with either an update or a cleanup of its associated resource. """ resource_data = dict(sync_point.deserialize_input_data(data)) rsrc, rsrc_owning_stack, stack = check_resource.load_resource( cnxt, resource_id, resource_data, is_update) if rsrc is None: return msg_queue = eventlet.queue.LightQueue() try: self.thread_group_mgr.add_msg_queue(stack.id, msg_queue) if current_traversal != stack.current_traversal: LOG.debug('[%s] Traversal cancelled; re-trigerring.', current_traversal) self._retrigger_replaced(is_update, rsrc, stack, msg_queue) else: cr = check_resource.CheckResource(self.engine_id, self._rpc_client, self.thread_group_mgr, msg_queue) cr.check(cnxt, resource_id, current_traversal, resource_data, is_update, adopt_stack_data, rsrc, stack) finally: self.thread_group_mgr.remove_msg_queue(None, stack.id, msg_queue)
def _retrigger_replaced(self, is_update, rsrc, stack, msg_queue): graph = stack.convergence_dependencies.graph() key = (rsrc.id, is_update) if key not in graph and rsrc.replaces is not None: # This resource replaces old one and is not needed in # current traversal. You need to mark the resource as # DELETED so that it gets cleaned up in purge_db. values = {'action': rsrc.DELETE} db_api.resource_update_and_save(stack.context, rsrc.id, values) # The old resource might be in the graph (a rollback case); # just re-trigger it. key = (rsrc.replaces, is_update) cr = check_resource.CheckResource(self.engine_id, self._rpc_client, self.thread_group_mgr, msg_queue) cr.retrigger_check_resource(stack.context, is_update, key[0], stack)
def setUp(self): super(CheckWorkflowUpdateTest, self).setUp() thread_group_mgr = mock.Mock() cfg.CONF.set_default('convergence_engine', True) self.worker = worker.WorkerService('host-1', 'topic-1', 'engine_id', thread_group_mgr) self.cr = check_resource.CheckResource(self.worker.engine_id, self.worker._rpc_client, self.worker.thread_group_mgr) self.worker._rpc_client = worker_client.WorkerClient() self.ctx = utils.dummy_context() self.stack = tools.get_stack('check_workflow_create_stack', self.ctx, template=tools.string_template_five, convergence=True) self.stack.converge_stack(self.stack.t) self.resource = self.stack['A'] self.is_update = True self.graph_key = (self.resource.id, self.is_update) self.orig_load_method = stack.Stack.load stack.Stack.load = mock.Mock(return_value=self.stack)
def check_resource(self, cnxt, resource_id, current_traversal, data, is_update, adopt_stack_data): """Process a node in the dependency graph. The node may be associated with either an update or a cleanup of its associated resource. """ resource_data = dict(sync_point.deserialize_input_data(data)) rsrc, rsrc_owning_stack, stack = check_resource.load_resource( cnxt, resource_id, resource_data, is_update) if rsrc is None: return if current_traversal != stack.current_traversal: LOG.debug('[%s] Traversal cancelled; stopping.', current_traversal) return cr = check_resource.CheckResource(self.engine_id, self._rpc_client, self.thread_group_mgr) cr.check(cnxt, resource_id, current_traversal, resource_data, is_update, adopt_stack_data, rsrc, stack)