diff --git a/src/teuthology_api/main.py b/src/teuthology_api/main.py index c1d8afb..150d3bf 100644 --- a/src/teuthology_api/main.py +++ b/src/teuthology_api/main.py @@ -9,7 +9,7 @@ load_dotenv() -DEPLOYMENT = os.getenv("DEPLOYMENT") +DEPLOYMENT = os.getenv("DEPLOYMENT", "development") SESSION_SECRET_KEY = os.getenv("SESSION_SECRET_KEY") PULPITO_URL = os.getenv("PULPITO_URL") PADDLES_URL = os.getenv("PADDLES_URL") @@ -26,6 +26,7 @@ def read_root(request: Request): return {"root": "success", "session": request.session.get("user", None)} + if DEPLOYMENT == "development": app.add_middleware( CORSMiddleware, @@ -35,7 +36,12 @@ def read_root(request: Request): allow_headers=["*"], ) -app.add_middleware(SessionMiddleware, secret_key=SESSION_SECRET_KEY) + +if SESSION_SECRET_KEY: + app.add_middleware(SessionMiddleware, secret_key=SESSION_SECRET_KEY) +else: + log.warning("SESSION_SECRET_KEY is not set. Sessions are disabled.") + app.include_router(suite.router) app.include_router(kill.router) app.include_router(login.router) diff --git a/src/teuthology_api/routes/suite.py b/src/teuthology_api/routes/suite.py index 13f1905..1a84299 100644 --- a/src/teuthology_api/routes/suite.py +++ b/src/teuthology_api/routes/suite.py @@ -1,7 +1,7 @@ import logging +import os from fastapi import APIRouter, HTTPException, Depends, Request - from teuthology_api.services.suite import run from teuthology_api.services.helpers import get_token, get_username from teuthology_api.schemas.suite import SuiteArgs @@ -14,6 +14,7 @@ responses={404: {"description": "Not found"}}, ) +DEPLOYMENT = os.getenv("DEPLOYMENT", "development") @router.post("/", status_code=200) def create_run( @@ -22,6 +23,13 @@ def create_run( access_token: str = Depends(get_token), logs: bool = False, ): - args = args.model_dump(by_alias=True) - args["--user"] = get_username(request) - return run(args, logs, access_token) + try: + args = args.model_dump(by_alias=True) + args["--user"] = get_username(request) + return run(args, logs, access_token) + except HTTPException as exc: + log.error(f"HTTP exception occurred: {exc.detail}") + raise + except Exception as exc: + log.error(f"Unexpected error occurred: {repr(exc)}") + raise HTTPException(status_code=500, detail="An unexpected error occurred.") diff --git a/src/teuthology_api/services/helpers.py b/src/teuthology_api/services/helpers.py index a86d22c..2fb76db 100644 --- a/src/teuthology_api/services/helpers.py +++ b/src/teuthology_api/services/helpers.py @@ -1,27 +1,25 @@ -from multiprocessing import Process import logging import os import uuid from pathlib import Path - from fastapi import HTTPException, Request from dotenv import load_dotenv - import teuthology -import requests # Note: import requests after teuthology +import requests from requests.exceptions import HTTPError load_dotenv() PADDLES_URL = os.getenv("PADDLES_URL") ARCHIVE_DIR = os.getenv("ARCHIVE_DIR") +DEPLOYMENT = os.getenv("DEPLOYMENT", "development") log = logging.getLogger(__name__) def logs_run(func, args): """ - Run the command function in a seperate process (to isolate logs), + Run the command function in a separate process (to isolate logs), and return logs printed during the execution of the function. """ _id = str(uuid.uuid4()) @@ -70,8 +68,11 @@ def get_run_details(run_name: str): def get_username(request: Request): """ - Get username from request.session + Get username from request.session, bypass authentication if in development. """ + if DEPLOYMENT == "development": + return "dev_user" + username = request.session.get("user", {}).get("username") if username: return username @@ -85,8 +86,11 @@ def get_username(request: Request): def get_token(request: Request): """ - Get access token from request.session + Get access token from request.session, bypass authentication if in development. """ + if DEPLOYMENT == "development": + return {"access_token": "dev_token", "token_type": "bearer"} + token = request.session.get("user", {}).get("access_token") if token: return {"access_token": token, "token_type": "bearer"} @@ -96,3 +100,4 @@ def get_token(request: Request): detail="You need to be logged in", headers={"WWW-Authenticate": "Bearer"}, ) + diff --git a/src/teuthology_api/services/kill.py b/src/teuthology_api/services/kill.py index 4188d23..1487e51 100644 --- a/src/teuthology_api/services/kill.py +++ b/src/teuthology_api/services/kill.py @@ -30,7 +30,7 @@ def run(args, send_logs: bool, access_token: str, request: Request): else: log.error("teuthology-kill is missing --run") raise HTTPException(status_code=400, detail="--run is a required argument") - # TODO if user has admin priviledge, then they can kill any run/job. + # TODO if user has admin privilege, then they can kill any run/job. if run_owner.lower() != username.lower(): log.error( "%s doesn't have permission to kill a job scheduled by: %s", @@ -60,4 +60,4 @@ def run(args, send_logs: bool, access_token: str, request: Request): 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=repr(exc)) from exc + raise HTTPException(status_code=500, detail=repr(exc)) from exc \ No newline at end of file diff --git a/src/teuthology_api/services/suite.py b/src/teuthology_api/services/suite.py index 99d2d6d..e58ba05 100644 --- a/src/teuthology_api/services/suite.py +++ b/src/teuthology_api/services/suite.py @@ -66,4 +66,4 @@ def make_run_name(run_dic): run_dic["flavor"], worker, ] - ).replace("/", ":") + ).replace("/", ":") \ No newline at end of file