示例#1
0
 def test_hook_config_compatibility(self):
     cfg = {
         "title": "foo",
         "version": 2,
         "subtasks": [
             {
                 "title": "foo",
                 "scenario": {"xxx": {}},
                 "runner": {"yyy": {}},
                 "hooks": [
                     {"description": "descr",
                      "name": "hook_action",
                      "args": {"k1": "v1"},
                      "trigger": {
                          "name": "hook_trigger",
                          "args": {"k2": "v2"}
                      }}
                 ]
             }
         ]
     }
     task = engine.TaskConfig(cfg)
     workload = task.subtasks[0]["workloads"][0]
     self.assertEqual(
         {"description": "descr",
          "action": ("hook_action", {"k1": "v1"}),
          "trigger": ("hook_trigger", {"k2": "v2"})},
         workload["hooks"][0])
示例#2
0
    def test_run__subtask_crashed(
            self, mock_scenario_runner, mock_scenario,
            mock_context_manager_setup, mock_context_manager_cleanup,
            mock_result_consumer, mock_task_get_status):
        task = mock.MagicMock(spec=objects.Task)
        subtask_obj = task.add_subtask.return_value
        subtask_obj.add_workload.side_effect = MyException()
        mock_result_consumer.is_task_in_aborting_status.return_value = False
        config = engine.TaskConfig({
            "a.task": [{"runner": {"type": "a", "b": 1}}],
            "b.task": [{"runner": {"type": "a", "b": 1}}],
            "c.task": [{"runner": {"type": "a", "b": 1}}]
        })
        fake_runner_cls = mock.MagicMock()
        fake_runner = mock.MagicMock()
        fake_runner_cls.return_value = fake_runner
        mock_scenario_runner.get.return_value = fake_runner_cls
        eng = engine.TaskEngine(config, task, mock.Mock())
        self.assertRaises(MyException, eng.run)

        task.update_status.assert_has_calls((
            mock.call(consts.TaskStatus.RUNNING),
            mock.call(consts.TaskStatus.CRASHED),
        ))
        subtask_obj.update_status.assert_called_once_with(
            consts.SubtaskStatus.CRASHED)
示例#3
0
    def test_schema_is_valid(self):
        scenarios = set()

        for path in self.iterate_samples():
            with open(path) as task_file:
                try:
                    try:
                        task_config = yaml.safe_load(
                            self.rapi.task.render_template(
                                task_template=task_file.read()))
                    except Exception:
                        print(traceback.format_exc())
                        self.fail("Invalid JSON file: %s" % path)
                    eng = engine.TaskEngine(engine.TaskConfig(task_config),
                                            mock.MagicMock(), mock.Mock())
                    eng.validate(only_syntax=True)
                except Exception:
                    print(traceback.format_exc())
                    self.fail("Invalid task file: %s" % path)
                else:
                    scenarios.update(task_config.keys())

        missing = set(s.get_name() for s in scenario.Scenario.get_all())
        missing -= scenarios
        # check missing scenario is not from plugin
        missing = [
            s for s in list(missing)
            if scenario.Scenario.get(s).__module__.startswith("rally")
        ]
        self.assertEqual(missing, [],
                         "These scenarios don't have samples: %s" % missing)
示例#4
0
    def test_schema_is_valid(self):
        scenarios = set()

        for path in self.iterate_samples():
            with open(path) as task_file:
                try:
                    try:
                        task_template = self.rapi.task.render_template(
                            task_template=task_file.read())
                        task_config = yaml.safe_load(task_template)
                        task_config = engine.TaskConfig(task_config)
                    except Exception:
                        print(traceback.format_exc())
                        self.fail("Invalid JSON file: %s" % path)
                    eng = engine.TaskEngine(task_config, mock.MagicMock(),
                                            mock.Mock())
                    eng.validate(only_syntax=True)
                except Exception:
                    print(traceback.format_exc())
                    self.fail("Invalid task file: %s" % path)
                else:
                    workloads = itertools.chain(
                        *[s["workloads"] for s in task_config.subtasks])
                    scenarios.update(w["name"] for w in workloads)

        missing = set(s.get_name() for s in scenario.Scenario.get_all()
                      if s.__module__.startswith("xrally_kubernetes"))
        missing -= scenarios
        if missing:
            self.fail("These scenarios don't have samples: %s" % missing)
示例#5
0
 def test_make_subtasks_v1(self, mock_task_config__validate_json,
                           mock_task_config__get_version, mock_sub_task):
     mock_task_config__get_version.return_value = 1
     config = {"a.task": [{"s": 1}, {"s": 2}], "b.task": [{"s": 3}]}
     self.assertEqual(3, len(engine.TaskConfig(config).subtasks))
     mock_sub_task.assert_has_calls([
         mock.call({
             "title": "a.task",
             "workloads": [{
                 "s": 1,
                 "name": "a.task"
             }]
         }),
         mock.call({
             "title": "a.task",
             "workloads": [{
                 "s": 2,
                 "name": "a.task"
             }]
         }),
         mock.call({
             "title": "b.task",
             "workloads": [{
                 "s": 3,
                 "name": "b.task"
             }]
         })
     ],
                                    any_order=True)
示例#6
0
 def test_make_subtasks_v2(self, mock_task_config__validate_json,
                           mock_task_config__get_version, mock_sub_task):
     mock_task_config__get_version.return_value = 2
     subtask_conf1 = mock.MagicMock()
     subtask_conf2 = mock.MagicMock()
     config = {"subtasks": [subtask_conf1, subtask_conf2]}
     self.assertEqual(2, len(engine.TaskConfig(config).subtasks))
     mock_sub_task.assert_has_calls([
         mock.call(subtask_conf1),
         mock.call(subtask_conf2)])
示例#7
0
 def test__adopt_task_format_v1(
         self, mock_task_config__validate_json,
         mock_task_config__get_version):
     mock_task_config__get_version.return_value = 1
     config = collections.OrderedDict()
     config["a.task"] = [{"s": 1}, {"s": 2}]
     config["b.task"] = [{"s": 3}]
     self.assertEqual([
         {"title": "a.task",
          "context": {},
          "description": None,
          "group": None,
          "tags": [],
          "workloads": [{"s": 1,
                         "name": "a.task",
                         "args": {},
                         "context": {},
                         "runner": {},
                         "sla": {},
                         "hooks": [],
                         "position": 0}]},
         {"title": "a.task",
          "context": {},
          "description": None,
          "group": None,
          "tags": [],
          "workloads": [{"s": 2,
                         "name": "a.task",
                         "args": {},
                         "context": {},
                         "runner": {},
                         "sla": {},
                         "hooks": [],
                         "position": 0}]},
         {"title": "b.task",
          "context": {},
          "description": None,
          "group": None,
          "tags": [],
          "workloads": [{"s": 3,
                         "name": "b.task",
                         "args": {},
                         "context": {},
                         "runner": {},
                         "sla": {},
                         "hooks": [],
                         "position": 0}]}
     ], engine.TaskConfig(config).subtasks)
示例#8
0
    def test_schema_is_valid(self):
        discover.load_plugins(os.path.join(self.rally_jobs_path, "plugins"))

        files = {
            f
            for f in os.listdir(self.rally_jobs_path)
            if (os.path.isfile(os.path.join(self.rally_jobs_path, f))
                and f.endswith(".yaml") and not f.endswith("_args.yaml"))
        }

        # TODO(andreykurilin): figure out why it fails
        files -= {"rally-mos.yaml", "sahara-clusters.yaml"}

        for filename in files:
            full_path = os.path.join(self.rally_jobs_path, filename)

            with open(full_path) as task_file:
                try:
                    args_file = os.path.join(
                        self.rally_jobs_path,
                        filename.rsplit(".", 1)[0] + "_args.yaml")

                    args = {}
                    if os.path.exists(args_file):
                        args = yaml.safe_load(open(args_file).read())
                        if not isinstance(args, dict):
                            raise TypeError(
                                "args file %s must be dict in yaml or json "
                                "presentation" % args_file)

                    task_inst = api._Task(api.API(skip_db_check=True))
                    task = task_inst.render_template(
                        task_template=task_file.read(), **args)
                    task = engine.TaskConfig(yaml.safe_load(task))
                    task_obj = fakes.FakeTask({"uuid": full_path})

                    eng = engine.TaskEngine(task, task_obj, mock.Mock())
                    eng.validate(only_syntax=True)
                except Exception:
                    print(traceback.format_exc())
                    self.fail("Wrong task input file: %s" % full_path)
示例#9
0
 def test_run__task_aborted(
         self, mock_scenario_runner, mock_scenario,
         mock_context_manager_setup, mock_context_manager_cleanup,
         mock_result_consumer, mock_task_get_status):
     task = mock.MagicMock(spec=objects.Task)
     config = engine.TaskConfig({
         "a.task": [{"runner": {"type": "a", "b": 1}}],
         "b.task": [{"runner": {"type": "a", "b": 1}}],
         "c.task": [{"runner": {"type": "a", "b": 1}}]
     })
     fake_runner_cls = mock.MagicMock()
     fake_runner = mock.MagicMock()
     fake_runner_cls.return_value = fake_runner
     mock_task_get_status.return_value = consts.TaskStatus.SOFT_ABORTING
     mock_scenario_runner.get.return_value = fake_runner_cls
     eng = engine.TaskEngine(config, task, mock.Mock())
     eng.run()
     self.assertEqual(mock.call(consts.TaskStatus.ABORTED),
                      task.update_status.mock_calls[-1])
     subtask_obj = task.add_subtask.return_value
     subtask_obj.update_status.assert_called_once_with(
         consts.SubtaskStatus.ABORTED)
示例#10
0
    def test_run__task_soft_aborted(
            self, mock_scenario_runner, mock_scenario,
            mock_context_manager_setup, mock_context_manager_cleanup,
            mock_result_consumer):
        scenario_cls = mock_scenario.get.return_value
        scenario_cls.get_platform.return_value = "openstack"
        scenario_cls.get_info.return_value = {"title": ""}
        task = mock.MagicMock()
        mock_result_consumer.is_task_in_aborting_status.side_effect = [False,
                                                                       False,
                                                                       True]
        config = engine.TaskConfig({
            "a.task": [{"runner": {"type": "a", "b": 1},
                        "description": "foo"}],
            "b.task": [{"runner": {"type": "a", "b": 1},
                        "description": "bar"}],
            "c.task": [{"runner": {"type": "a", "b": 1},
                        "description": "xxx"}]
        })
        fake_runner_cls = mock.MagicMock()
        fake_runner = mock.MagicMock()
        fake_runner_cls.return_value = fake_runner
        mock_scenario_runner.get.return_value = fake_runner_cls
        eng = engine.TaskEngine(config, task, mock.MagicMock())

        eng.run()

        self.assertEqual(2, fake_runner.run.call_count)
        self.assertEqual(mock.call(consts.TaskStatus.ABORTED),
                         task.update_status.mock_calls[-1])
        subtask_obj = task.add_subtask.return_value
        subtask_obj.update_status.assert_has_calls((
            mock.call(consts.SubtaskStatus.FINISHED),
            mock.call(consts.SubtaskStatus.FINISHED),
            mock.call(consts.SubtaskStatus.ABORTED),
        ))
示例#11
0
 def test_validate_json_v2(self, mock_validate):
     config = {"version": 2, "subtasks": []}
     engine.TaskConfig(config)
     mock_validate.assert_has_calls([
         mock.call(config, engine.TaskConfig.CONFIG_SCHEMA_V2)])
示例#12
0
 def test_validate_json(self, mock_validate):
     config = {}
     engine.TaskConfig(config)
     mock_validate.assert_has_calls([
         mock.call(config, engine.TaskConfig.CONFIG_SCHEMA_V1)])
示例#13
0
 def test_validate_version(self, mock_task_config__validate_json,
                           mock_task_config__get_version):
     mock_task_config__get_version.return_value = 1
     engine.TaskConfig(mock.MagicMock())