diff --git a/app/api/challenge.py b/app/api/challenge.py index 12b024a..e61d2cc 100644 --- a/app/api/challenge.py +++ b/app/api/challenge.py @@ -1,5 +1,6 @@ from json import JSONDecodeError from logging import log +import sys from app.monitoring.ctf_metrics_collector import ChallengeMetricsCollector from flask import Blueprint, jsonify, request @@ -30,7 +31,7 @@ def create_challenge(): client = K8sClient() endpoint = client.create_challenge_resource(challenge_id, username) if not endpoint: - raise UserChallengeCreationError(error_msg=f"Failed to create challenge {challenge_id} for user {username}") + raise UserChallengeCreationError(error_msg=f"Failed to create challenge {challenge_id} for user {username} : Endpoint did not exist") return jsonify({'data' : {'port': endpoint}}), 200 @@ -68,21 +69,24 @@ def get_userchallenge_status(): try: # Challenge 관련 정보 가져오기 res = request.get_json() + print(f"/status : {res}",file=sys.stderr) if not res: - raise UserChallengeDeletionError(error_msg="Request body is empty or not valid JSON") + raise InvalidRequest(error_msg="Request body is empty or not valid JSON") if 'challenge_id' not in res: raise InvalidRequest(error_msg="Required field 'challenge_id' is missing in request") + challenge_id = res['challenge_id'] + if not challenge_id: + raise InvalidRequest(error_msg="'challenge_id' is empty or not valid") if 'username' not in res: raise InvalidRequest(error_msg="Required field 'username' is missing in request") - username = res['username'] if not username: - raise InvalidRequest(error_msg="Required field 'username' is missing in request") - + raise InvalidRequest(error_msg="'username' is empty or not valid") + # 사용자 챌린지 상태 조회 repo = UserChallengesRepository() status = repo.get_status(challenge_id, username) @@ -90,4 +94,4 @@ def get_userchallenge_status(): raise UserChallengeNotFoundError(error_msg=f"User challenge not found for {username} and {challenge_id}") return jsonify({'data': {'status': status}}), 200 except Exception as e: - raise UserChallengeNotFoundError(error_msg=str(e)) from e \ No newline at end of file + raise UserChallengeNotFoundError(error_msg=str(e)) \ No newline at end of file diff --git a/app/exceptions/error_types.py b/app/exceptions/error_types.py index 5410f7b..d7f28eb 100644 --- a/app/exceptions/error_types.py +++ b/app/exceptions/error_types.py @@ -52,3 +52,4 @@ class ApiErrorTypes(str, Enum): INTERNAL_ERROR = "INTERNAL_ERROR" # 내부 서버 에러 DATABASE_ERROR = "DATABASE_ERROR" # 데이터베이스 에러 EXTERNAL_SERVICE_ERROR = "EXTERNAL_SERVICE_ERROR" # 외부 서비스 에러 + INTERNAL_SERVER_ERROR = "INTERNAL_SERVER_ERROR" # 서버 내부 에러 diff --git a/app/extensions/db/repository.py b/app/extensions/db/repository.py index a5e0176..86b0deb 100644 --- a/app/extensions/db/repository.py +++ b/app/extensions/db/repository.py @@ -38,6 +38,7 @@ def create(self, username: str, C_idx: int, userChallengeName: str, self.session.commit() return challenge except SQLAlchemyError as e: + self.session.rollback() raise InternalServerError(error_msg=f"Error creating challenge in db: {e}") from e @@ -70,15 +71,17 @@ def update_status(self, challenge: UserChallenges, new_status: str) -> bool: """ try: challenge.status = new_status - self.session.add(challenge) # Add this line to track the object - self.session.flush() + # self.session.add(challenge) # Add this line to track the object + # self.session.flush() self.session.commit() return True except SQLAlchemyError as e: # logger.error(f"Error updating challenge status: {e}") + self.session.rollback() raise InternalServerError(error_msg=f"Error updating challenge status: {e}") from e + def update_port(self, challenge: UserChallenges, port: int) -> bool: """ 챌린지 포트 업데이트 @@ -91,13 +94,19 @@ def update_port(self, challenge: UserChallenges, port: int) -> bool: bool: 업데이트 성공 여부 """ try: - challenge.port = port + # 1) 먼저 challenge 객체를 세션에 맞게 merge + fresh_challenge = self.session.merge(challenge) + + # 2) merge된 객체에 port 갱신 + fresh_challenge.port = port + self.session.commit() return True except SQLAlchemyError as e: self.session.rollback() raise InternalServerError(error_msg=f"Error updating challenge port: {e}") from e + def is_running(self, challenge: UserChallenges) -> bool: """ 챌린지 실행 여부 확인 diff --git a/app/extensions/k8s/client.py b/app/extensions/k8s/client.py index 87a6612..0eeed02 100644 --- a/app/extensions/k8s/client.py +++ b/app/extensions/k8s/client.py @@ -106,6 +106,7 @@ def create_challenge_resource(self, challenge_id, username, namespace="default") body=challenge_manifest ) + time.sleep(5) # status 값 가져오기 status = challenge.get('status', {}) endpoint = status.get('endpoint')