@@ -496,6 +496,7 @@ class Run(CoreModel):
496496 submitted_at : datetime
497497 last_processed_at : datetime
498498 status : RunStatus
499+ status_message : Optional [str ] = None
499500 termination_reason : Optional [RunTerminationReason ]
500501 run_spec : RunSpec
501502 jobs : List [Job ]
@@ -524,6 +525,49 @@ def _get_error(termination_reason: Optional[RunTerminationReason]) -> Optional[s
524525 else :
525526 return None
526527
528+ @root_validator
529+ def _status_message (cls , values ) -> Dict :
530+ try :
531+ status = values ["status" ]
532+ run_spec : RunSpec = values ["run_spec" ]
533+ retry_on_events = (
534+ run_spec .configuration .retry .on_events
535+ if run_spec and run_spec .configuration .retry
536+ else []
537+ )
538+ jobs = values ["jobs" ]
539+ termination_reason = Run .get_last_termination_reason (jobs [0 ]) if jobs else None
540+ except KeyError :
541+ return values
542+ values ["status_message" ] = Run ._get_status_message (
543+ status = status ,
544+ retry_on_events = retry_on_events ,
545+ termination_reason = termination_reason ,
546+ )
547+ return values
548+
549+ @staticmethod
550+ def get_last_termination_reason (job : "Job" ) -> Optional [JobTerminationReason ]:
551+ for submission in reversed (job .job_submissions ):
552+ if submission .termination_reason is not None :
553+ return submission .termination_reason
554+ return None
555+
556+ @staticmethod
557+ def _get_status_message (
558+ status : RunStatus ,
559+ retry_on_events : List [RetryEvent ],
560+ termination_reason : Optional [JobTerminationReason ],
561+ ) -> str :
562+ # Currently, `retrying` is shown only for `no-capacity` events
563+ if (
564+ status in [RunStatus .SUBMITTED , RunStatus .PENDING ]
565+ and termination_reason == JobTerminationReason .FAILED_TO_START_DUE_TO_NO_CAPACITY
566+ and RetryEvent .NO_CAPACITY in retry_on_events
567+ ):
568+ return "retrying"
569+ return status .value
570+
527571
528572class JobPlan (CoreModel ):
529573 job_spec : JobSpec
0 commit comments