+
+
+class RallyJobs(RallyBase):
+ """Rally OpenStack CI testcase implementation."""
+
+ TESTS = ["neutron"]
+
+ def __init__(self, **kwargs):
+ """Initialize RallyJobs object."""
+ if "case_name" not in kwargs:
+ kwargs["case_name"] = "rally_jobs"
+ super(RallyJobs, self).__init__(**kwargs)
+ self.test_name = 'all'
+ self.task_file = os.path.join(self.RALLY_DIR, 'rally_jobs.yaml')
+ self.task_yaml = None
+
+ def prepare_run(self):
+ """Create resources needed by test scenarios."""
+ super(RallyJobs, self).prepare_run()
+ with open(os.path.join(self.RALLY_DIR,
+ 'rally_jobs.yaml'), 'r') as task_file:
+ self.task_yaml = yaml.safe_load(task_file)
+
+ if not all(task in self.task_yaml for task in self.tests):
+ raise Exception("Test '%s' not in '%s'" %
+ (self.test_name, self.tests))
+
+ def apply_blacklist(self, case_file_name, result_file_name):
+ # pylint: disable=too-many-branches
+ """Apply blacklist."""
+ LOGGER.debug("Applying blacklist...")
+ black_tests = list(set(self.excl_func() +
+ self.excl_scenario()))
+ if black_tests:
+ LOGGER.debug("Blacklisted tests: %s", str(black_tests))
+
+ template = YAML(typ='jinja2')
+ with open(case_file_name, 'r') as fname:
+ cases = template.load(fname)
+ if cases.get("version", 1) == 1:
+ # scenarios in dictionary
+ for name in cases.keys():
+ if self.in_iterable_re(name, black_tests):
+ cases.pop(name)
+ else:
+ # workloads in subtasks
+ for sind, subtask in enumerate(cases.get('subtasks', [])):
+ idx = []
+ for wind, workload in enumerate(subtask.get('workloads', [])):
+ scenario = workload.get('scenario', {})
+ for name in scenario.keys():
+ if self.in_iterable_re(name, black_tests):
+ idx.append(wind)
+ break
+ for wind in reversed(idx):
+ cases['subtasks'][sind]['workloads'].pop(wind)
+ # scenarios in subtasks
+ idx = []
+ for sind, subtask in enumerate(cases.get('subtasks', [])):
+ scenario = subtask.get('scenario', {})
+ for name in scenario.keys():
+ if self.in_iterable_re(name, black_tests):
+ idx.append(sind)
+ break
+ for sind in reversed(idx):
+ cases['subtasks'].pop(sind)
+
+ with open(result_file_name, 'w') as fname:
+ template.dump(cases, fname)
+
+ @staticmethod
+ def _remove_plugins_extra():
+ inst_dir = getattr(config.CONF, 'dir_rally_inst')
+ try:
+ shutil.rmtree(os.path.join(inst_dir, 'plugins'))
+ shutil.rmtree(os.path.join(inst_dir, 'extra'))
+ except Exception: # pylint: disable=broad-except
+ pass
+
+ def prepare_task(self, test_name):
+ """Prepare resources for test run."""
+ self._remove_plugins_extra()
+ jobs_dir = os.path.join(
+ getattr(config.CONF, 'dir_rally_data'), test_name, 'rally-jobs')
+ inst_dir = getattr(config.CONF, 'dir_rally_inst')
+ shutil.copytree(os.path.join(jobs_dir, 'plugins'),
+ os.path.join(inst_dir, 'plugins'))
+ shutil.copytree(os.path.join(jobs_dir, 'extra'),
+ os.path.join(inst_dir, 'extra'))
+
+ task_name = self.task_yaml.get(test_name).get("task")
+ task = os.path.join(jobs_dir, task_name)
+ if not os.path.exists(task):
+ raise Exception("The scenario '%s' does not exist." % task)
+ LOGGER.debug('Scenario fetched from : %s', task)
+
+ if not os.path.exists(self.TEMP_DIR):
+ os.makedirs(self.TEMP_DIR)
+ task_file_name = os.path.join(self.TEMP_DIR, task_name)
+ self.apply_blacklist(task, task_file_name)
+ self.run_cmd = (["rally", "task", "start", "--task", task_file_name])
+ return True
+
+ def clean(self):
+ self._remove_plugins_extra()
+ super(RallyJobs, self).clean()