示例#1
0
    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)
示例#2
0
 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)
示例#3
0
 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)
示例#4
0
    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)