Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 10 additions & 6 deletions app/api/challenge.py
Original file line number Diff line number Diff line change
@@ -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

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

Expand Down Expand Up @@ -68,26 +69,29 @@ 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)
if status is None:
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
raise UserChallengeNotFoundError(error_msg=str(e))
1 change: 1 addition & 0 deletions app/exceptions/error_types.py
Original file line number Diff line number Diff line change
Expand Up @@ -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" # 서버 내부 에러
15 changes: 12 additions & 3 deletions app/extensions/db/repository.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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:
"""
챌린지 포트 업데이트
Expand All @@ -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:
"""
챌린지 실행 여부 확인
Expand Down
1 change: 1 addition & 0 deletions app/extensions/k8s/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -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')
Expand Down