github.com/containers/podman/v4@v4.9.4/libpod/pod_status.go (about) 1 //go:build !remote 2 // +build !remote 3 4 package libpod 5 6 import "github.com/containers/podman/v4/libpod/define" 7 8 // GetPodStatus determines the status of the pod based on the 9 // statuses of the containers in the pod. 10 // Returns a string representation of the pod status 11 func (p *Pod) GetPodStatus() (string, error) { 12 ctrStatuses, err := p.Status() 13 if err != nil { 14 return define.PodStateErrored, err 15 } 16 return createPodStatusResults(ctrStatuses) 17 } 18 19 func createPodStatusResults(ctrStatuses map[string]define.ContainerStatus) (string, error) { 20 ctrNum := len(ctrStatuses) 21 if ctrNum == 0 { 22 return define.PodStateCreated, nil 23 } 24 statuses := map[string]int{ 25 define.PodStateStopped: 0, 26 define.PodStateRunning: 0, 27 define.PodStatePaused: 0, 28 define.PodStateCreated: 0, 29 define.PodStateErrored: 0, 30 } 31 for _, ctrStatus := range ctrStatuses { 32 switch ctrStatus { 33 case define.ContainerStateExited: 34 fallthrough 35 case define.ContainerStateStopped: 36 statuses[define.PodStateStopped]++ 37 case define.ContainerStateRunning: 38 statuses[define.PodStateRunning]++ 39 case define.ContainerStatePaused: 40 statuses[define.PodStatePaused]++ 41 case define.ContainerStateCreated, define.ContainerStateConfigured: 42 statuses[define.PodStateCreated]++ 43 default: 44 statuses[define.PodStateErrored]++ 45 } 46 } 47 48 switch { 49 case statuses[define.PodStateRunning] == ctrNum: 50 return define.PodStateRunning, nil 51 case statuses[define.PodStateRunning] > 0: 52 return define.PodStateDegraded, nil 53 case statuses[define.PodStatePaused] == ctrNum: 54 return define.PodStatePaused, nil 55 case statuses[define.PodStateStopped] == ctrNum: 56 return define.PodStateExited, nil 57 case statuses[define.PodStateStopped] > 0: 58 return define.PodStateStopped, nil 59 case statuses[define.PodStateErrored] > 0: 60 return define.PodStateErrored, nil 61 default: 62 return define.PodStateCreated, nil 63 } 64 }