From 220779c8c4d6020f868a4edf24ede46c9cacf513 Mon Sep 17 00:00:00 2001 From: Zack Cerza Date: Thu, 19 Dec 2013 16:12:56 -0600 Subject: [PATCH] Implement single-job killing Signed-off-by: Zack Cerza --- scripts/kill.py | 4 +++- teuthology/kill.py | 40 ++++++++++++++++++++++++++++++---------- 2 files changed, 33 insertions(+), 11 deletions(-) diff --git a/scripts/kill.py b/scripts/kill.py index 9333b0672..032b4fdc0 100644 --- a/scripts/kill.py +++ b/scripts/kill.py @@ -5,6 +5,7 @@ import teuthology.kill doc = """ usage: teuthology-kill [-h] [-a ARCHIVE] -r RUN + teuthology-kill [-h] [-a ARCHIVE] -r RUN -j JOB teuthology-kill [-h] -o OWNER -m MACHINE_TYPE -r RUN Kill running teuthology jobs: @@ -17,7 +18,8 @@ optional arguments: -a ARCHIVE, --archive ARCHIVE The base archive directory [default: {archive_base}] - -r, --run RUN The name(s) of the run(s) to kill + -r, --run RUN The name(s) of the run(s) to kill + -j, --job JOB The job_id of the job to kill -o, --owner OWNER The owner of the job(s) -m, --machine_type MACHINE_TYPE The type of machine the job(s) are running on diff --git a/teuthology/kill.py b/teuthology/kill.py index 3024ac9aa..430fcf1f7 100755 --- a/teuthology/kill.py +++ b/teuthology/kill.py @@ -15,11 +15,15 @@ log = logging.getLogger(__name__) def main(args): run_name = args['--run'] + job_id = args['--job'] archive_base = args['--archive'] owner = args['--owner'] machine_type = args['--machine_type'] - kill_run(run_name, archive_base, owner, machine_type) + if job_id: + kill_job(run_name, job_id, archive_base, owner, machine_type) + else: + kill_run(run_name, archive_base, owner, machine_type) def kill_run(run_name, archive_base=None, owner=None, machine_type=None): @@ -32,7 +36,18 @@ def kill_run(run_name, archive_base=None, owner=None, machine_type=None): remove_beanstalk_jobs(run_name, machine_type) kill_processes(run_name, run_info.get('pids')) - nuke_machines(run_name, owner) + targets = find_targets(run_name, owner) + nuke_targets(targets, owner) + + +def kill_job(run_name, job_id, archive_base=None, owner=None, + machine_type=None): + job_archive_dir = os.path.join(archive_base, run_name, job_id) + job_info = find_job_info(job_archive_dir) + owner = job_info['owner'] + kill_processes(run_name, [job_info.get('pid')]) + targets = dict(targets=job_info['targets']) + nuke_targets(targets, owner) def find_run_info(run_archive_dir): @@ -118,15 +133,21 @@ def kill_processes(run_name, pids=None): subprocess.call(['sudo', 'kill', str(pid)]) +def process_matches_run(pid, run_name): + try: + p = psutil.Process(pid) + if run_name in p.cmdline and sys.argv[0] not in p.cmdline: + return True + except psutil.NoSuchProcess: + pass + return False + + def find_pids(run_name): run_pids = [] for pid in psutil.get_pid_list(): - try: - p = psutil.Process(pid) - except psutil.NoSuchProcess: - continue - if run_name in p.cmdline and sys.argv[0] not in p.cmdline: - run_pids.append(pid) + if process_matches_run(pid, run_name): + run_pids.append(pid) return run_pids @@ -150,8 +171,7 @@ def find_targets(run_name, owner): return out_obj -def nuke_machines(run_name, owner): - targets_dict = find_targets(run_name, owner) +def nuke_targets(targets_dict, owner): targets = targets_dict.get('targets') if not targets: log.info("No locked machines. Not nuking anything") -- 2.47.3