@@ -17,6 +17,9 @@ package orchestrator
1717
1818import (
1919 "fmt"
20+ "log/slog"
21+ "regexp"
22+ "strconv"
2023
2124 "github.com/docker/docker/api/types/container"
2225)
@@ -31,18 +34,25 @@ const (
3134 StatusFailed Status = "failed"
3235)
3336
34- func StatusFromDockerState (s container.ContainerState ) Status {
37+ func StatusFromDockerState (s container.ContainerState , statusMessage string ) Status {
3538 switch s {
3639 case container .StateRunning :
3740 return StatusRunning
3841 case container .StateRestarting :
3942 return StatusStarting
4043 case container .StateRemoving :
4144 return StatusStopping
42- case container .StateCreated , container .StateExited , container .StatePaused :
45+ case container .StateCreated , container .StatePaused , container .StateExited :
46+ failed , err := checkExitCode (statusMessage )
47+ if err != nil {
48+ slog .Warn ("Failed to check exit code" , slog .String ("statusMessage" , statusMessage ), slog .String ("error" , err .Error ()))
49+ } else if failed {
50+ return StatusFailed
51+ }
4352 return StatusStopped
4453 case container .StateDead :
4554 return StatusFailed
55+
4656 default :
4757 panic ("unreachable" )
4858 }
@@ -65,3 +75,19 @@ func (s Status) Validate() error {
6575func (s Status ) AllowedStatuses () []Status {
6676 return []Status {StatusStarting , StatusRunning , StatusStopping , StatusStopped , StatusFailed }
6777}
78+
79+ func checkExitCode (statusMessage string ) (bool , error ) {
80+ var exitCodeRegex = regexp .MustCompile (`Exited \((\d+)\)` )
81+ matches := exitCodeRegex .FindStringSubmatch (statusMessage )
82+
83+ exitCode , err := strconv .Atoi (matches [1 ])
84+ if err != nil {
85+ slog .Error ("Failed to parse exit code from status message" , slog .String ("statusMessage" , statusMessage ), slog .String ("error" , err .Error ()))
86+ return false , fmt .Errorf ("failed to parse exit code from status message: %w" , err )
87+ }
88+ if exitCode >= 0 && exitCode < 128 {
89+ return true , nil
90+ }
91+
92+ return false , nil
93+ }
0 commit comments