diff --git a/src/videoag_common/miscellaneous/errors.py b/src/videoag_common/miscellaneous/errors.py index 0ca718b2c381c9dd7209ff4180246f8c81b3e8bc..6730d463972796ed139d19008e5035e374d30f81 100644 --- a/src/videoag_common/miscellaneous/errors.py +++ b/src/videoag_common/miscellaneous/errors.py @@ -7,6 +7,9 @@ class ApiError: self.error_code = error_code self.http_status_code = http_status_code self.message = message + + def __str__(self): + return f"ApiError[code={self.error_code}, status={self.http_status_code}, message='{self.message}']" class ApiClientException(Exception): diff --git a/src/videoag_common/miscellaneous/json.py b/src/videoag_common/miscellaneous/json.py index 6399361ab5237b7f868c0784e23b5b0b17ab035a..8895662ae8a52f46ea284f37327a5be97b565a8a 100644 --- a/src/videoag_common/miscellaneous/json.py +++ b/src/videoag_common/miscellaneous/json.py @@ -88,7 +88,7 @@ class CJsonObject(CJsonValue): if optional and not self.has(key): return None if key not in self._data: - raise ApiClientException(ERROR_REQUEST_MISSING_PARAMETER(key)) + raise ApiClientException(ERROR_REQUEST_MISSING_PARAMETER(f"{self._path}.{key}")) return CJsonValue(self._data[key], f"{self._path}.{key}") def get_object(self, key: str) -> "CJsonObject": diff --git a/src/videoag_common/objects/job.py b/src/videoag_common/objects/job.py index 5b9e5a1e9cb49b208f57bfb949714c6cecf2a4fb..df45d68ad0e3b415feb22a8998b444f5ca9b2dae 100644 --- a/src/videoag_common/objects/job.py +++ b/src/videoag_common/objects/job.py @@ -9,8 +9,8 @@ from .user import User class JobState(Enum): READY = "ready" - SPAWNING = "spawning" - RUNNING = "running" + SPAWNING = "spawning" # Job is in K8s but wasn't scheduled yet + RUNNING = "running" # Job is running in K8s FINISHED = "finished" FINISHED_AND_PROCESSED = "finished_and_processed" FAILED = "failed" @@ -22,6 +22,9 @@ _JOB_STATE_ENUM = create_enum_type(JobState) class Job(ApiObject, Base): + ERROR_CODE_UNKNOWN_TYPE = "unknown_type" + ERROR_CODE_SPAWNING_FAILURE = "spawning_failure" + __table_args__ = ( CheckConstraint( "(on_end_event_type IS NULL) = (on_end_event_data IS NULL)", @@ -127,3 +130,10 @@ class Job(ApiObject, Base): }, cause_job_id=cause_job_id ) + + def set_error(self, error_code: str, error_message: str or None = None): + self.status = JobState.FAILED + self.output_data = { + "error_code": error_code, + "error_message": error_message + }