From 5da70b04dd95263a536cc148288d2e20cd9dea30 Mon Sep 17 00:00:00 2001
From: Brent Baude <bbaude@redhat.com>
Date: Fri, 24 Jan 2020 08:59:20 -0600
Subject: APIv2 review corrections #3

The third pass of corrections for the APIv2.

Signed-off-by: Brent Baude <bbaude@redhat.com>
---
 libpod/define/podstate.go | 19 +++++++++++++++
 libpod/pod_status.go      | 59 +++++++++++++++++++++++++++++++++++++++++++++++
 libpod/runtime_pod.go     | 28 ++++++++++++++++++++++
 3 files changed, 106 insertions(+)
 create mode 100644 libpod/define/podstate.go
 create mode 100644 libpod/pod_status.go

(limited to 'libpod')

diff --git a/libpod/define/podstate.go b/libpod/define/podstate.go
new file mode 100644
index 000000000..2b59aabfb
--- /dev/null
+++ b/libpod/define/podstate.go
@@ -0,0 +1,19 @@
+package define
+
+const (
+	// PodStateCreated indicates the pod is created but has not been started
+	PodStateCreated = "Created"
+	// PodStateErrored indicates the pod is in an errored state where
+	// information about it can no longer be retrieved
+	PodStateErrored = "Error"
+	// PodStateExited indicates the pod ran but has been stopped
+	PodStateExited = "Exited"
+	// PodStatePaused indicates the pod has been paused
+	PodStatePaused = "Paused"
+	// PodStateRunning indicates that one or more of the containers in
+	// the pod is running
+	PodStateRunning = "Running"
+	// PodStateStopped indicates all of the containers belonging to the pod
+	// are stopped.
+	PodStateStopped = "Stopped"
+)
diff --git a/libpod/pod_status.go b/libpod/pod_status.go
new file mode 100644
index 000000000..3a44c4457
--- /dev/null
+++ b/libpod/pod_status.go
@@ -0,0 +1,59 @@
+package libpod
+
+import "github.com/containers/libpod/libpod/define"
+
+// GetPodStatus determines the status of the pod based on the
+// statuses of the containers in the pod.
+// Returns a string representation of the pod status
+func (p *Pod) GetPodStatus() (string, error) {
+	ctrStatuses, err := p.Status()
+	if err != nil {
+		return define.PodStateErrored, err
+	}
+	return CreatePodStatusResults(ctrStatuses)
+}
+
+func CreatePodStatusResults(ctrStatuses map[string]define.ContainerStatus) (string, error) {
+	ctrNum := len(ctrStatuses)
+	if ctrNum == 0 {
+		return define.PodStateCreated, nil
+	}
+	statuses := map[string]int{
+		define.PodStateStopped: 0,
+		define.PodStateRunning: 0,
+		define.PodStatePaused:  0,
+		define.PodStateCreated: 0,
+		define.PodStateErrored: 0,
+	}
+	for _, ctrStatus := range ctrStatuses {
+		switch ctrStatus {
+		case define.ContainerStateExited:
+			fallthrough
+		case define.ContainerStateStopped:
+			statuses[define.PodStateStopped]++
+		case define.ContainerStateRunning:
+			statuses[define.PodStateRunning]++
+		case define.ContainerStatePaused:
+			statuses[define.PodStatePaused]++
+		case define.ContainerStateCreated, define.ContainerStateConfigured:
+			statuses[define.PodStateCreated]++
+		default:
+			statuses[define.PodStateErrored]++
+		}
+	}
+
+	switch {
+	case statuses[define.PodStateRunning] > 0:
+		return define.PodStateRunning, nil
+	case statuses[define.PodStatePaused] == ctrNum:
+		return define.PodStatePaused, nil
+	case statuses[define.PodStateStopped] == ctrNum:
+		return define.PodStateExited, nil
+	case statuses[define.PodStateStopped] > 0:
+		return define.PodStateStopped, nil
+	case statuses[define.PodStateErrored] > 0:
+		return define.PodStateErrored, nil
+	default:
+		return define.PodStateCreated, nil
+	}
+}
diff --git a/libpod/runtime_pod.go b/libpod/runtime_pod.go
index 66f9b10c9..e1dc31391 100644
--- a/libpod/runtime_pod.go
+++ b/libpod/runtime_pod.go
@@ -182,3 +182,31 @@ func (r *Runtime) GetRunningPods() ([]*Pod, error) {
 	}
 	return runningPods, nil
 }
+
+// PrunePods removes unused pods and their containers from local storage.
+// If force is given, then running pods are also included in the pruning.
+func (r *Runtime) PrunePods() (map[string]error, error) {
+	response := make(map[string]error)
+	states := []string{define.PodStateStopped, define.PodStateExited}
+	filterFunc := func(p *Pod) bool {
+		state, _ := p.GetPodStatus()
+		for _, status := range states {
+			if state == status {
+				return true
+			}
+		}
+		return false
+	}
+	pods, err := r.Pods(filterFunc)
+	if err != nil {
+		return nil, err
+	}
+	if len(pods) < 1 {
+		return response, nil
+	}
+	for _, pod := range pods {
+		err := r.removePod(context.TODO(), pod, true, false)
+		response[pod.ID()] = err
+	}
+	return response, nil
+}
-- 
cgit v1.2.3-54-g00ecf