From 4998633e2a7118559e578e329f85a41d07a6695c Mon Sep 17 00:00:00 2001 From: Kamoltat Sirivadhna Date: Thu, 7 Mar 2024 13:55:56 -0500 Subject: [PATCH] teuthology/suite/run.py: Improve scheduling exceptions Added more loggings and utilizes exceptions e.g., ScheduleFail, GitError Signed-off-by: Kamoltat Sirivadhna --- docs/docker-compose/teuthology/teuthology.sh | 1 - teuthology/repo_utils.py | 12 ++-- teuthology/suite/__init__.py | 65 ++++++++++++-------- teuthology/suite/run.py | 28 +++++++-- teuthology/suite/util.py | 2 +- 5 files changed, 69 insertions(+), 39 deletions(-) diff --git a/docs/docker-compose/teuthology/teuthology.sh b/docs/docker-compose/teuthology/teuthology.sh index f5e7cd160..b221512c9 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 6ab0747ad..5b29c6133 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 9bb876f2b..833493d25 100644 --- a/teuthology/suite/__init__.py +++ b/teuthology/suite/__init__.py @@ -6,6 +6,7 @@ import os import random import time +import re from distutils.util import strtobool import teuthology @@ -15,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__) @@ -51,33 +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 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 + 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 b69b80b58..30c5142cd 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 @@ -103,8 +104,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, @@ -129,8 +136,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("distro {} doesn't exists".format(self.args.distro),'') else: os_ = OS(os_type, os_version) return os_ @@ -186,8 +196,11 @@ def choose_ceph_hash(self): log.info("ceph sha1 explicitly supplied") elif self.args.ceph_branch: - ceph_hash = util.git_ls_remote( + 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, @@ -575,8 +588,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}") diff --git a/teuthology/suite/util.py b/teuthology/suite/util.py index 7e1ae35cc..b75647e4a 100644 --- a/teuthology/suite/util.py +++ b/teuthology/suite/util.py @@ -356,7 +356,7 @@ def get_sha1s(project, committish, count): if len(sha1s) != count: log.debug('got response: %s', resp.json()) log.error('can''t find %d parents of %s in %s: %s', - int(count), sha1, project, resp.json()['error']) + int(count), sha1, project, resp.json()) return sha1s # index 0 will be the commit whose parents we want to find.