diff --git a/docs/docker-compose/teuthology/teuthology.sh b/docs/docker-compose/teuthology/teuthology.sh index 7ce05144a..c9e007671 100755 --- a/docs/docker-compose/teuthology/teuthology.sh +++ b/docs/docker-compose/teuthology/teuthology.sh @@ -40,7 +40,6 @@ if [ -z "$TEUTHOLOGY_WAIT" ]; then teuthology-queue -m $MACHINE_TYPE -s | \ python3 -c "import sys, json; assert json.loads(sys.stdin.read())['count'] > 0, 'queue is empty!'" fi -echo "$(pwd)" teuthology-dispatcher -v \ --log-dir /teuthology/log \ --tube $MACHINE_TYPE \ diff --git a/teuthology/repo_utils.py b/teuthology/repo_utils.py index 79fd92eda..280a6b0e0 100644 --- a/teuthology/repo_utils.py +++ b/teuthology/repo_utils.py @@ -66,10 +66,14 @@ def ls_remote(url, ref): """ sha1 = None cmd = "git ls-remote {} {}".format(url, ref) - result = subprocess.check_output( - cmd, shell=True).split() - if result: - sha1 = result[0].decode() + try: + result = subprocess.check_output( + cmd, stderr=subprocess.STDOUT, + shell=True).split() + if result: + sha1 = result[0].decode() + except subprocess.CalledProcessError as e: + raise GitError(e.output) from None log.debug("{} -> {}".format(cmd, sha1)) return sha1 diff --git a/teuthology/suite/__init__.py b/teuthology/suite/__init__.py index 8a17cf5f1..8d4c316d3 100644 --- a/teuthology/suite/__init__.py +++ b/teuthology/suite/__init__.py @@ -16,6 +16,7 @@ from teuthology.suite.run import Run from teuthology.suite.util import schedule_fail +from teuthology.exceptions import ScheduleFailError log = logging.getLogger(__name__) @@ -52,36 +53,42 @@ def process_args(args): key = key.lstrip('--').replace('-', '_') # Rename the key if necessary key = rename_args.get(key) or key - if key == 'suite_branch': - value = value or override_arg_defaults('--suite-branch', None) - if key == 'suite' and value is not None: - value = normalize_suite_name(value) - if key == 'suite_relpath' and value is None: - value = '' - elif key in ('limit', 'priority', 'num', 'newest', 'seed', 'job_threshold'): - value = int(value) - elif key == 'subset' and value is not None: - # take input string '2/3' and turn into (2, 3) - value = tuple(map(int, value.split('/'))) - elif key == 'expire' and value is None: - # Skip empty 'expire' values - continue - elif key in ('filter_all', 'filter_in', 'filter_out', 'rerun_statuses'): - if not value: - value = [] - else: - value = [x.strip() for x in value.split(',')] - elif key == 'ceph_repo': - value = expand_short_repo_name( - value, - config.get_ceph_git_url()) - elif key == 'suite_repo': - value = expand_short_repo_name( - value, - config.get_ceph_qa_suite_git_url()) - elif key in ('validate_sha1', 'filter_fragments', 'kdb'): - value = strtobool(value) - conf[key] = value + try: + if key == 'suite_branch': + value = value or override_arg_defaults('--suite-branch', None) + if key == 'suite' and value is not None: + value = normalize_suite_name(value) + if key == 'suite_relpath' and value is None: + value = '' + elif key in ('limit', 'priority', 'num', 'newest', 'seed', 'job_threshold'): + value = int(value) + if key != 'seed' and value < 0: + log.error("{} value cannot be < 0".format(key)) + raise ScheduleFailError("{} value cannot be < 0".format(key),'') + elif key == 'subset' and value is not None: + # take input string '2/3' and turn into (2, 3) + value = tuple(map(int, value.split('/'))) + if len(value) != 2: + raise ValueError + elif key in ('filter_all', 'filter_in', 'filter_out', 'rerun_statuses'): + if not value: + value = [] + else: + value = [x.strip() for x in value.split(',')] + elif key == 'ceph_repo': + value = expand_short_repo_name( + value, + config.get_ceph_git_url()) + elif key == 'suite_repo': + value = expand_short_repo_name( + value, + config.get_ceph_qa_suite_git_url()) + elif key in ('validate_sha1', 'filter_fragments'): + value = strtobool(value) + conf[key] = value + except ValueError: + log.error(" --{} value has incorrect type/format".format(key)) + raise ScheduleFailError("--{} value has incorrect type/format".format(key),'') return conf diff --git a/teuthology/suite/run.py b/teuthology/suite/run.py index 4f425cada..77a7dd02a 100644 --- a/teuthology/suite/run.py +++ b/teuthology/suite/run.py @@ -15,6 +15,7 @@ from teuthology.config import config, JobConfig from teuthology.exceptions import ( BranchMismatchError, BranchNotFoundError, CommitNotFoundError, + ScheduleFailError, GitError ) from teuthology.misc import deep_merge, get_results_url from teuthology.orchestra.opsys import OS @@ -113,8 +114,14 @@ def create_initial_config(self): if self.args.distro_version: - self.args.distro_version, _ = \ - OS.version_codename(self.args.distro, self.args.distro_version) + try: + self.args.distro_version, _ = \ + OS.version_codename(self.args.distro, self.args.distro_version) + except KeyError: + raise ScheduleFailError( + " ditro: {} or distro_version: {} doesn't exists".format( + self.args.distro, self.args.distro_version),'' + ) self.config_input = dict( suite=self.args.suite, suite_branch=suite_branch, @@ -159,8 +166,11 @@ def choose_os(self): os_type = self.args.distro os_version = self.args.distro_version if not (os_type and os_version): - os_ = util.get_distro_defaults( - self.args.distro, self.args.machine_type)[2] + try: + os_ = util.get_distro_defaults( + self.args.distro, self.args.machine_type)[2] + except KeyError: + raise ScheduleFailError(f"distro {self.args.distro} doesn't exist") else: os_ = OS(os_type, os_version) return os_ @@ -205,7 +215,10 @@ def choose_ceph_hash(self): tip. """ repo_name = self.ceph_repo_name - + if not repo_name.endswith('.git'): + raise ValueError("Invalid repo name format. Must end with '.git'") + if not repo_name.startswith('https://github.com'): + raise ValueError("Invalid repo name format. Must start with 'https://github.com'") ceph_hash = None if self.args.ceph_sha1: ceph_hash = self.args.ceph_sha1 @@ -220,8 +233,11 @@ def choose_ceph_hash(self): log.info("ceph sha1 explicitly supplied") elif self.args.ceph_branch: - ceph_hash = util.git_ls_remote( - self.args.ceph_repo, self.args.ceph_branch) + try: + ceph_hash = util.git_ls_remote( + self.args.ceph_repo, self.args.ceph_branch) + except GitError as e: + raise util.schedule_fail(message=str(e), name=self.name, dry_run=self.args.dry_run) from None if not ceph_hash: exc = BranchNotFoundError( self.args.ceph_branch, @@ -606,8 +622,11 @@ def schedule_suite(self): self.suite_repo_path, self.args.suite_relpath, 'suites', - self.base_config.suite.replace(':', '/'), + suite_name.replace(':', '/'), )) + if not os.path.exists(suite_path): + log.error("Suite path doesn't exists") + raise ScheduleFailError("Suite path doesn't exists", suite_name) log.debug('Suite %s in %s' % (suite_name, suite_path)) log.debug(f"subset = {self.args.subset}") log.debug(f"no_nested_subset = {self.args.no_nested_subset}") @@ -683,7 +702,9 @@ def schedule_suite(self): if not sha1s: sha1s = util.find_git_parents('ceph', str(self.base_config.sha1), self.args.newest) if not sha1s: - util.schedule_fail('Backtrack for --newest failed', name, dry_run=self.args.dry_run) + util.schedule_fail('Backtrack for --newest failed, could not find a git parent with the packages,' \ + ' (optionally) use --sha1 to directly point to' \ + ' your build.', name, dry_run=self.args.dry_run) self.config_input['ceph_hash'] = sha1s.pop(0) self.base_config = self.build_base_config() backtrack += 1