Source code for teuthology_api.services.kill

import logging
import os
import subprocess

from fastapi import HTTPException, Request

from teuthology_api.services.helpers import get_username, get_run_details, isAdmin


TEUTHOLOGY_PATH = os.getenv("TEUTHOLOGY_PATH")
ADMIN_TEAM = os.getenv("ADMIN_TEAM")

log = logging.getLogger(__name__)


[docs] async def run(args, send_logs: bool, token: dict, request: Request): """ Kill running teuthology jobs. """ if not token: log.error("access_token empty, user probably is not logged in.") raise HTTPException( status_code=401, detail="You need to be logged in", headers={"WWW-Authenticate": "Bearer"}, ) username = get_username(request) run_name = args.get("--run", "") if run_name: run_details = get_run_details(run_name) jobs_details = run_details.get("jobs", []) if jobs_details: run_owner = jobs_details[0].get("owner", "") else: log.error("teuthology-kill is missing --run") raise HTTPException(status_code=400, detail="--run is a required argument") if (run_owner.lower() != username.lower()) and ( run_owner.lower() != f"scheduled_{username.lower()}@teuthology" ): isUserAdmin = await isAdmin(username, token.get("access_token")) if not isUserAdmin: log.error( "%s doesn't have permission to kill a job scheduled by: %s", username, run_owner, ) raise HTTPException( status_code=401, detail="You don't have permission to kill this run/job" ) log.info("Killing with admin privileges") try: kill_cmd = [f"{TEUTHOLOGY_PATH}/virtualenv/bin/teuthology-kill"] for flag, flag_value in args.items(): if isinstance(flag_value, bool): # check for --preserve-queues if flag_value == True: kill_cmd += [flag] else: kill_cmd += [flag, str(flag_value)] log.info(kill_cmd) proc = subprocess.Popen( kill_cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT ) stdout, stderr = proc.communicate() returncode = proc.wait(timeout=120) output_logs = stdout.decode() log.info(output_logs) if returncode != 0: raise Exception(output_logs) if send_logs: return {"kill": "success", "logs": stdout} return {"kill": "success"} except Exception as exc: log.error("teuthology-kill command failed with the error: %s", repr(exc)) raise HTTPException(status_code=500, detail=str(exc)) from exc