Ejemplo n.º 1
0
    def test_apply_expression(self):
        expression = 'facts.test := union(facts.test, "test")'

        node = self._model_get_by_id('nodes', self.nodes['node-1']['id'])

        # make sure we are applying into an empty fact
        self.assertFalse('test' in node['facts'])
        ast.apply_expression(self.nodes['node-1']['id'], expression, api)

        node = self._model_get_by_id('nodes', self.nodes['node-1']['id'])

        self.assertTrue('test' in node['facts'])
        self.assertEquals(node['facts']['test'], ['test'])
Ejemplo n.º 2
0
    def __init__(self, api, node_id, constraints,
                 parent=None, prim=None, ns=None, applied_consequences=None):

        self.constraints = copy.deepcopy([api.regularize_expression(x)
                                          for x in constraints])
        self.node_id = node_id
        self.base_api = api
        self.applied_consequences = copy.deepcopy(applied_consequences) if \
            applied_consequences is not None else []

        self.children = []
        classname = self.__class__.__name__.lower()
        self.logger = logging.getLogger('%s.%s' % (__name__, classname))
        self.parent = parent
        self.prim = prim
        self.task_primitives = {}
        self.adventures = []
        self.ns = ns if ns is not None else {}

        self.logger.info('New solver for constraints %s' % constraints)
        self.logger.info('With applied constraints %s' % applied_consequences)

        # roll the applied consequences forward in an ephemeral
        # api, and do our resolution from that.
        self.api = db_api.ephemeral_api_from_api(self.base_api)
        pre_node = self.api._model_get_by_id('nodes', self.node_id)

        for consequence in self.applied_consequences:
            node = self.api._model_get_by_id('nodes', self.node_id)
            ast.apply_expression(node, consequence, self.api)

        # get rid of constraints we've already solved
        self.constraints = [x for x in self.constraints if not
                            self._constraint_satisfied(x)]

        node = self.api._model_get_by_id('nodes', self.node_id)

        # grab the tasks published from this node as possible primitives
        # ...
        # we aren't actually solving through tasks and adventures
        # yet, but likely have the need
        if 'opencenter_agent_actions' in node['attrs'] and \
                'backends' in node['facts'] and \
                'agent' in node['facts']['backends']:
            for task_name in node['attrs']['opencenter_agent_actions']:
                mangled_name = task_name
                task = node['attrs']['opencenter_agent_actions'][task_name]

                id = hash(mangled_name) & 0xFFFFFFFF
                # should verify this unique against backends
                self.task_primitives[id] = {}
                self.task_primitives[id]['id'] = id
                self.task_primitives[id]['name'] = mangled_name
                self.task_primitives[id]['task_name'] = task_name
                self.task_primitives[id]['constraints'] = \
                    task['constraints']
                self.task_primitives[id]['consequences'] = \
                    task['consequences']
                self.task_primitives[id]['args'] = task['args']
                self.task_primitives[id]['weight'] = 50
                self.task_primitives[id]['timeout'] = task['timeout'] if \
                    'timeout' in task else 30

        self.logger.debug('Node before applying consequences: %s' % pre_node)
        self.logger.debug('Applied consequences: %s' %
                          self.applied_consequences)
        # ephemeral_node = self.api._model_get_by_id('nodes', self.node_id)
        self.logger.debug('Node after applying consequences: %s' % node)