Skip to content

Commit

Permalink
teuthology/suite/run.py: Improve scheduling exceptions
Browse files Browse the repository at this point in the history
Added more loggings and utilizes exceptions e.g.,

ScheduleFail, GitError

Signed-off-by: Kamoltat Sirivadhna <[email protected]>
  • Loading branch information
kamoltat committed Aug 18, 2024
1 parent d2949d6 commit 4140fde
Show file tree
Hide file tree
Showing 4 changed files with 75 additions and 44 deletions.
1 change: 0 additions & 1 deletion docs/docker-compose/teuthology/teuthology.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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 \
Expand Down
12 changes: 8 additions & 4 deletions teuthology/repo_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
67 changes: 37 additions & 30 deletions teuthology/suite/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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__)

Expand Down Expand Up @@ -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


Expand Down
39 changes: 30 additions & 9 deletions teuthology/suite/run.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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_
Expand Down Expand Up @@ -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
Expand All @@ -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,
Expand Down Expand Up @@ -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}")
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 4140fde

Please sign in to comment.