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  }