예제 #1
0
 def setUpClass(cls):
     super(TestActionExecutionHistoryWorker, cls).setUpClass()
     runners_registrar.register_runner_types()
     action_local = ActionAPI(**copy.deepcopy(fixture.ARTIFACTS['actions']['local']))
     Action.add_or_update(ActionAPI.to_model(action_local))
     action_chain = ActionAPI(**copy.deepcopy(fixture.ARTIFACTS['actions']['chain']))
     action_chain.entry_point = fixture.PATH + '/chain.yaml'
     Action.add_or_update(ActionAPI.to_model(action_chain))
예제 #2
0
 def setUpClass(cls):
     super(TestMistralRunner, cls).setUpClass()
     runners_registrar.register_runner_types()
     metadata = fixture.ARTIFACTS['metadata']
     action_local = ActionAPI(**copy.deepcopy(metadata['actions']['local']))
     Action.add_or_update(ActionAPI.to_model(action_local))
     action_wkflow = ActionAPI(
         **copy.deepcopy(metadata['actions']['workflow-v2']))
     Action.add_or_update(ActionAPI.to_model(action_wkflow))
예제 #3
0
 def setUpClass(cls):
     super(TestActionExecutionHistoryWorker, cls).setUpClass()
     runners_registrar.register_runners()
     action_local = ActionAPI(
         **copy.deepcopy(fixture.ARTIFACTS["actions"]["local"]))
     Action.add_or_update(ActionAPI.to_model(action_local))
     action_chain = ActionAPI(
         **copy.deepcopy(fixture.ARTIFACTS["actions"]["chain"]))
     action_chain.entry_point = fixture.PATH + "/chain.yaml"
     Action.add_or_update(ActionAPI.to_model(action_chain))
예제 #4
0
    def setUpClass(cls):
        super(DSLTransformTestCase, cls).setUpClass()
        runners_registrar.register_runner_types()

        action_local = ActionAPI(**copy.deepcopy(FIXTURES['actions']['local.yaml']))
        Action.add_or_update(ActionAPI.to_model(action_local))

        for action_name in ['action1', 'action2', 'action3']:
            metadata = copy.deepcopy(FIXTURES['actions']['local.yaml'])
            metadata['name'] = action_name
            metadata['pack'] = 'demo'
            action = ActionAPI(**metadata)
            Action.add_or_update(ActionAPI.to_model(action))
예제 #5
0
    def setUpClass(cls):
        super(MistralRunnerTest, cls).setUpClass()
        runners_registrar.register_runner_types()

        for _, fixture in six.iteritems(FIXTURES['actions']):
            instance = ActionAPI(**fixture)
            Action.add_or_update(ActionAPI.to_model(instance))
    def get_all(self,
                sort=None,
                offset=0,
                limit=None,
                requester_user=None,
                **raw_filters):
        """
            List all actions.

            Handles requests:
                GET /actions/views/overview
        """
        resp = super(OverviewController,
                     self)._get_all(sort=sort,
                                    offset=offset,
                                    limit=limit,
                                    raw_filters=raw_filters)
        result = []
        for item in resp.json:
            action_api = ActionAPI(**item)
            result.append(
                self._transform_action_api(action_api=action_api,
                                           requester_user=requester_user))
        resp.json = result
        return resp
 def test_validate_runner_type_happy_case(self):
     action_api_dict = fixture.ARTIFACTS['actions']['local']
     action_api = ActionAPI(**action_api_dict)
     try:
         action_validator.validate_action(action_api)
     except:
         self.fail('Exception validating action: %s' % json.dumps(action_api_dict))
예제 #8
0
    def _register_action(self, pack, action):
        content = self._meta_loader.load(action)
        pack_field = content.get('pack', None)
        if not pack_field:
            content['pack'] = pack
            pack_field = pack
        if pack_field != pack:
            raise Exception('Model is in pack "%s" but field "pack" is different: %s' %
                            (pack, pack_field))

        action_api = ActionAPI(**content)
        action_api.validate()
        action_validator.validate_action(action_api)
        model = ActionAPI.to_model(action_api)

        action_ref = ResourceReference.to_string_reference(pack=pack, name=str(content['name']))
        existing = action_utils.get_action_by_ref(action_ref)
        if not existing:
            LOG.debug('Action %s not found. Creating new one with: %s', action_ref, content)
        else:
            LOG.debug('Action %s found. Will be updated from: %s to: %s',
                      action_ref, existing, model)
            model.id = existing.id

        try:
            model = Action.add_or_update(model)
            extra = {'action_db': model}
            LOG.audit('Action updated. Action %s from %s.', model, action, extra=extra)
        except Exception:
            LOG.exception('Failed to write action to db %s.', model.name)
            raise
예제 #9
0
    def setUpClass(cls):
        super(ExecutionCancellationTestCase, cls).setUpClass()
        for _, fixture in six.iteritems(FIXTURES['actions']):
            instance = ActionAPI(**fixture)
            Action.add_or_update(ActionAPI.to_model(instance))

        runners_registrar.register_runners()
예제 #10
0
 def setUpClass(cls):
     super(TestActionExecutionService, cls).setUpClass()
     cls.runner = RunnerTypeAPI(**RUNNER)
     cls.runnerdb = RunnerType.add_or_update(
         RunnerTypeAPI.to_model(cls.runner))
     cls.action = ActionAPI(**ACTION)
     cls.actiondb = Action.add_or_update(ActionAPI.to_model(cls.action))
예제 #11
0
    def get_all(
        self,
        exclude_attributes=None,
        include_attributes=None,
        sort=None,
        offset=0,
        limit=None,
        requester_user=None,
        **raw_filters,
    ):
        """
        List all actions.

        Handles requests:
            GET /actions/views/overview
        """
        resp = super(OverviewController, self)._get_all(
            exclude_fields=exclude_attributes,
            include_fields=include_attributes,
            sort=sort,
            offset=offset,
            limit=limit,
            raw_filters=raw_filters,
            requester_user=requester_user,
        )
        runner_type_names = set([])
        action_ids = []

        result = []
        for item in resp.json:
            action_api = ActionAPI(**item)
            result.append(action_api)

            runner_type_names.add(action_api.runner_type)
            action_ids.append(str(action_api.id))

        # Add combined runner and action parameters to the compound result object
        # NOTE: This approach results in 2 additional queries while previous one resulted in
        # N * 2 additional queries

        # 1. Retrieve all the respective runner objects - we only need parameters
        runner_type_dbs = RunnerType.query(
            name__in=runner_type_names,
            only_fields=["name", "runner_parameters"])
        runner_type_dbs = dict([(runner_db.name, runner_db)
                                for runner_db in runner_type_dbs])

        # 2. Retrieve all the respective action objects - we only need parameters
        action_dbs = dict([(action_db.id, action_db) for action_db in result])

        for action_api in result:
            action_db = action_dbs.get(action_api.id, None)
            runner_db = runner_type_dbs.get(action_api.runner_type, None)
            all_params = action_param_utils.get_params_view(
                action_db=action_db, runner_db=runner_db, merged_only=True)
            action_api.parameters = all_params

        resp.json = result
        return resp
예제 #12
0
    def setUpClass(cls):
        super(TestStreamController, cls).setUpClass()

        instance = RunnerTypeAPI(**RUNNER_TYPE_1)
        RunnerType.add_or_update(RunnerTypeAPI.to_model(instance))

        instance = ActionAPI(**ACTION_1)
        Action.add_or_update(ActionAPI.to_model(instance))
예제 #13
0
 def test_validate_runner_type_invalid_runner(self):
     action_api_dict = fixture.ARTIFACTS['actions']['action-with-invalid-runner']
     action_api = ActionAPI(**action_api_dict)
     try:
         action_validator.validate_action(action_api)
         self.fail('Action validation should not have passed. %s' % json.dumps(action_api_dict))
     except ValueValidationException:
         pass
예제 #14
0
 def test_validate_override_immutable_runner_param(self):
     action_api_dict = fixture.ARTIFACTS['actions']['local-override-runner-immutable']
     action_api = ActionAPI(**action_api_dict)
     try:
         action_validator.validate_action(action_api)
         self.fail('Action validation should not have passed. %s' % json.dumps(action_api_dict))
     except ValueValidationException as e:
         self.assertTrue('Cannot override in action.' in e.message)
예제 #15
0
 def test_validate_action_param_immutable(self):
     action_api_dict = fixture.ARTIFACTS['actions']['action-immutable-param-no-default']
     action_api = ActionAPI(**action_api_dict)
     try:
         action_validator.validate_action(action_api)
         self.fail('Action validation should not have passed. %s' % json.dumps(action_api_dict))
     except ValueValidationException as e:
         self.assertTrue('requires a default value.' in e.message)
예제 #16
0
 def setUpClass(cls):
     super(ActionParamsUtilsTest, cls).setUpClass()
     cls.runnertype = RunnerTypeAPI(
         **FIXTURES['runners']['testrunner1.yaml'])
     cls.runnertype_db = RunnerType.add_or_update(
         RunnerTypeAPI.to_model(cls.runnertype))
     cls.action = ActionAPI(**FIXTURES['actions']['action1.yaml'])
     cls.action_db = Action.add_or_update(ActionAPI.to_model(cls.action))
예제 #17
0
    def setUpClass(cls):
        super(TestActionExecutionService, cls).setUpClass()
        cls.runner = RunnerTypeAPI(**RUNNER)
        cls.runnerdb = RunnerType.add_or_update(
            RunnerTypeAPI.to_model(cls.runner))

        runner_api = RunnerTypeAPI(**RUNNER_ACTION_CHAIN)
        RunnerType.add_or_update(RunnerTypeAPI.to_model(runner_api))

        cls.actions = {
            ACTION['name']:
            ActionAPI(**ACTION),
            ACTION_WORKFLOW['name']:
            ActionAPI(**ACTION_WORKFLOW),
            ACTION_OVR_PARAM['name']:
            ActionAPI(**ACTION_OVR_PARAM),
            ACTION_OVR_PARAM_MUTABLE['name']:
            ActionAPI(**ACTION_OVR_PARAM_MUTABLE),
            ACTION_OVR_PARAM_IMMUTABLE['name']:
            ActionAPI(**ACTION_OVR_PARAM_IMMUTABLE),
            ACTION_OVR_PARAM_BAD_ATTR['name']:
            ActionAPI(**ACTION_OVR_PARAM_BAD_ATTR),
            ACTION_OVR_PARAM_BAD_ATTR_NOOP['name']:
            ActionAPI(**ACTION_OVR_PARAM_BAD_ATTR_NOOP)
        }

        cls.actiondbs = {
            name: Action.add_or_update(ActionAPI.to_model(action))
            for name, action in six.iteritems(cls.actions)
        }

        cls.container = RunnerContainer()
예제 #18
0
    def _register_action(self, pack, action):
        content = self._meta_loader.load(action)
        pack_field = content.get('pack', None)
        if not pack_field:
            content['pack'] = pack
            pack_field = pack
        if pack_field != pack:
            raise Exception(
                'Model is in pack "%s" but field "pack" is different: %s' %
                (pack, pack_field))

        action_api = ActionAPI(**content)

        try:
            action_api.validate()
        except jsonschema.ValidationError as e:
            # We throw a more user-friendly exception on invalid parameter name
            msg = str(e)

            is_invalid_parameter_name = 'Additional properties are not allowed' in msg
            is_invalid_parameter_name &= 'in schema[\'properties\'][\'parameters\']' in msg

            if is_invalid_parameter_name:
                parameter_name = re.search('\'(.+?)\' was unexpected',
                                           msg).groups()[0]
                new_msg = (
                    'Parameter name "%s" is invalid. Valid characters for parameter name '
                    'are [a-zA-Z0-0_].' % (parameter_name))
                new_msg += '\n\n' + msg
                raise jsonschema.ValidationError(new_msg)
            raise e

        action_validator.validate_action(action_api)
        model = ActionAPI.to_model(action_api)

        action_ref = ResourceReference.to_string_reference(
            pack=pack, name=str(content['name']))
        existing = action_utils.get_action_by_ref(action_ref)
        if not existing:
            LOG.debug('Action %s not found. Creating new one with: %s',
                      action_ref, content)
        else:
            LOG.debug('Action %s found. Will be updated from: %s to: %s',
                      action_ref, existing, model)
            model.id = existing.id

        try:
            model = Action.add_or_update(model)
            extra = {'action_db': model}
            LOG.audit('Action updated. Action %s from %s.',
                      model,
                      action,
                      extra=extra)
        except Exception:
            LOG.exception('Failed to write action to db %s.', model.name)
            raise
예제 #19
0
 def test_validate_action_param_immutable(self):
     action_api_dict = fixture.ARTIFACTS["actions"][
         "action-immutable-param-no-default"]
     action_api = ActionAPI(**action_api_dict)
     try:
         action_validator.validate_action(action_api)
         self.fail("Action validation should not have passed. %s" %
                   json.dumps(action_api_dict))
     except ValueValidationException as e:
         self.assertIn("requires a default value.", six.text_type(e))
    def setUpClass(cls):
        super(SchedulerTest, cls).setUpClass()

        for _, fixture in six.iteritems(FIXTURES['runners']):
            instance = RunnerTypeAPI(**fixture)
            RunnerType.add_or_update(RunnerTypeAPI.to_model(instance))

        for _, fixture in six.iteritems(FIXTURES['actions']):
            instance = ActionAPI(**fixture)
            Action.add_or_update(ActionAPI.to_model(instance))
예제 #21
0
 def test_validate_override_immutable_runner_param(self):
     action_api_dict = fixture.ARTIFACTS["actions"][
         "remote-override-runner-immutable"]
     action_api = ActionAPI(**action_api_dict)
     try:
         action_validator.validate_action(action_api)
         self.fail("Action validation should not have passed. %s" %
                   json.dumps(action_api_dict))
     except ValueValidationException as e:
         self.assertIn("Cannot override in action.", six.text_type(e))
예제 #22
0
    def setUpClass(cls):
        super(DSLTransformTestCase, cls).setUpClass()
        runners_registrar.register_runner_types()

        for _, fixture in six.iteritems(FIXTURES['runners']):
            instance = RunnerTypeAPI(**fixture)
            RunnerType.add_or_update(RunnerTypeAPI.to_model(instance))

        for _, fixture in six.iteritems(FIXTURES['actions']):
            instance = ActionAPI(**fixture)
            Action.add_or_update(ActionAPI.to_model(instance))
예제 #23
0
    def test_validate_action_param_position_values_unique(self):
        action_api_dict = fixture.ARTIFACTS["actions"][
            "action-with-non-unique-positions"]
        action_api = ActionAPI(**action_api_dict)

        try:
            action_validator.validate_action(action_api)
            self.fail("Action validation should have failed " +
                      "because position values are not unique." %
                      json.dumps(action_api_dict))
        except ValueValidationException as e:
            self.assertIn("have same position", six.text_type(e))
예제 #24
0
    def setUpClass(cls):
        super(MistralValidationTest, cls).setUpClass()

        for _, fixture in six.iteritems(FIXTURES['runners']):
            instance = RunnerTypeAPI(**fixture)
            RunnerType.add_or_update(RunnerTypeAPI.to_model(instance))

        for _, fixture in six.iteritems(FIXTURES['actions']):
            instance = ActionAPI(**fixture)
            Action.add_or_update(ActionAPI.to_model(instance))

        cls.validator = wf_validation_utils.get_validator()
    def test_validate_action_param_position_values_unique(self):
        action_api_dict = fixture.ARTIFACTS['actions'][
            'action-with-non-unique-positions']
        action_api = ActionAPI(**action_api_dict)

        try:
            action_validator.validate_action(action_api)
            self.fail('Action validation should have failed ' +
                      'because position values are not unique.' %
                      json.dumps(action_api_dict))
        except ValueValidationException as e:
            self.assertTrue('have same position' in e.message)
예제 #26
0
    def get_one(self, ref_or_id):
        """
            List action by id.

            Handle:
                GET /actions/views/overview/1
        """
        resp = super(OverviewController, self)._get_one(ref_or_id)
        action_api = ActionAPI(**resp.json)
        result = self._transform_action_api(action_api)
        resp.json = result
        return resp
예제 #27
0
    def test_validate_action_param_position_values_contiguous(self):
        action_api_dict = fixture.ARTIFACTS['actions'][
            'action-with-non-contiguous-positions']
        action_api = ActionAPI(**action_api_dict)

        try:
            action_validator.validate_action(action_api)
            self.fail('Action validation should have failed ' +
                      'because position values are not contiguous.' %
                      json.dumps(action_api_dict))
        except ValueValidationException as e:
            self.assertIn('are not contiguous', six.text_type(e))
예제 #28
0
    def test_validate_action_param_immutable_no_default(self):
        action_api_dict = fixture.ARTIFACTS['actions'][
            'action-immutable-runner-param-no-default']
        action_api = ActionAPI(**action_api_dict)

        # Runner param sudo is decalred immutable in action but no defualt value
        # supplied in action. We should pick up default value from runner.
        try:
            action_validator.validate_action(action_api)
        except ValueValidationException as e:
            print(e)
            self.fail('Action validation should have passed. %s' %
                      json.dumps(action_api_dict))
예제 #29
0
    def get_all(self, **kwargs):
        """
            List all actions.

            Handles requests:
                GET /actions/views/overview
        """
        resp = super(OverviewController, self)._get_all(**kwargs)
        result = []
        for item in resp.json:
            action_api = ActionAPI(**item)
            result.append(self._transform_action_api(action_api))
        resp.json = result
        return resp
예제 #30
0
    def get_one(self, ref_or_id, requester_user):
        """
            List action by id.

            Handle:
                GET /actions/views/overview/1
        """
        resp = super(OverviewController,
                     self)._get_one(ref_or_id,
                                    requester_user=requester_user,
                                    permission_type=PermissionType.ACTION_VIEW)
        action_api = ActionAPI(**resp.json)
        result = self._transform_action_api(action_api)
        resp.json = result
        return resp