@@ -1947,7 +1947,20 @@ def run_succeeded(self):
1947
1947
def run_failed (self ):
1948
1948
"""Return True if the execution failed."""
1949
1949
fail_exitcode = self .run_exitcode and self .run_exitcode > 0
1950
- return fail_exitcode or self .job_status == "failed"
1950
+
1951
+ if not fail_exitcode :
1952
+ job = self .job
1953
+ if job .is_failed :
1954
+ # Job was killed externally.
1955
+ end_date = job .ended_at .replace (tzinfo = datetime .timezone .utc )
1956
+ self .set_run_ended (
1957
+ exitcode = 1 ,
1958
+ output = f"Killed from outside, exc_info={ job .latest_result ().exc_string } " ,
1959
+ end_date = end_date ,
1960
+ )
1961
+ return True
1962
+
1963
+ return fail_exitcode
1951
1964
1952
1965
@property
1953
1966
def run_stopped (self ):
@@ -2001,11 +2014,11 @@ def set_run_started(self):
2001
2014
self .run_start_date = timezone .now ()
2002
2015
self .save (update_fields = ["run_start_date" ])
2003
2016
2004
- def set_run_ended (self , exitcode , output = "" ):
2017
+ def set_run_ended (self , exitcode , output = "" , end_date = None ):
2005
2018
"""Set the run-related fields after the run execution."""
2006
2019
self .run_exitcode = exitcode
2007
2020
self .run_output = output
2008
- self .run_end_date = timezone .now ()
2021
+ self .run_end_date = end_date or timezone .now ()
2009
2022
self .save (update_fields = ["run_exitcode" , "run_output" , "run_end_date" ])
2010
2023
2011
2024
def set_run_staled (self ):
@@ -2030,9 +2043,12 @@ def stop_run(self):
2030
2043
return
2031
2044
2032
2045
if self .job_status == JobStatus .FAILED :
2046
+ job = self .job
2047
+ end_date = job .ended_at .replace (tzinfo = datetime .timezone .utc )
2033
2048
self .set_run_ended (
2034
2049
exitcode = 1 ,
2035
- output = f"Killed from outside, latest_result={ self .job .latest_result ()} " ,
2050
+ output = f"Killed from outside, exc_info={ job .latest_result ().exc_string } " ,
2051
+ end_date = end_date ,
2036
2052
)
2037
2053
return
2038
2054
@@ -2143,19 +2159,22 @@ def pipeline_class(self):
2143
2159
@property
2144
2160
def all_runs (self ):
2145
2161
"""Return all the previous run instances for this pipeline."""
2146
- return self .pipelineruns .all (). order_by ( "-created_date" )
2162
+ return self .pipelineruns .all ()
2147
2163
2148
2164
@property
2149
2165
def latest_run (self ):
2150
- return self .pipelineruns .latest ( "created_date" ) if self .pipelineruns .exists () else None
2166
+ return self .pipelineruns .first ( ) if self .pipelineruns .exists () else None
2151
2167
2152
2168
@property
2153
2169
def earliest_run (self ):
2154
2170
return self .pipelineruns .earliest ("created_date" ) if self .pipelineruns .exists () else None
2155
2171
2156
2172
@property
2157
2173
def latest_run_date (self ):
2158
- return self .latest_run .run_start_date if self .latest_run else None
2174
+ if not self .pipelineruns .exists ():
2175
+ return
2176
+ latest_run = self .pipelineruns .values ("created_date" ).first ()
2177
+ return latest_run ["created_date" ]
2159
2178
2160
2179
@property
2161
2180
def next_run_date (self ):
@@ -2175,8 +2194,9 @@ def status(self):
2175
2194
if not self .is_active :
2176
2195
return
2177
2196
2178
- if self .latest_run :
2179
- return self .latest_run .status
2197
+ if self .pipelineruns .exists ():
2198
+ latest = self .pipelineruns .only ("pk" ).first ()
2199
+ return latest .status
2180
2200
2181
2201
def create_new_job (self , execute_now = False ):
2182
2202
"""
0 commit comments