mirror of https://github.com/containers/podman.git
Merge pull request #9173 from mlegenovic/api_fixes
Endpoint that lists containers does not return correct Status value
This commit is contained in:
commit
b045c17375
|
@ -22,6 +22,7 @@ import (
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types"
|
||||||
"github.com/docker/docker/api/types/container"
|
"github.com/docker/docker/api/types/container"
|
||||||
"github.com/docker/go-connections/nat"
|
"github.com/docker/go-connections/nat"
|
||||||
|
"github.com/docker/go-units"
|
||||||
"github.com/gorilla/mux"
|
"github.com/gorilla/mux"
|
||||||
"github.com/gorilla/schema"
|
"github.com/gorilla/schema"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
|
@ -264,6 +265,7 @@ func LibpodToContainer(l *libpod.Container, sz bool) (*handlers.Container, error
|
||||||
sizeRootFs int64
|
sizeRootFs int64
|
||||||
sizeRW int64
|
sizeRW int64
|
||||||
state define.ContainerStatus
|
state define.ContainerStatus
|
||||||
|
status string
|
||||||
)
|
)
|
||||||
|
|
||||||
if state, err = l.State(); err != nil {
|
if state, err = l.State(); err != nil {
|
||||||
|
@ -274,6 +276,35 @@ func LibpodToContainer(l *libpod.Container, sz bool) (*handlers.Container, error
|
||||||
stateStr = "created"
|
stateStr = "created"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if state == define.ContainerStateConfigured || state == define.ContainerStateCreated {
|
||||||
|
status = "Created"
|
||||||
|
} else if state == define.ContainerStateStopped || state == define.ContainerStateExited {
|
||||||
|
exitCode, _, err := l.ExitCode()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
finishedTime, err := l.FinishedTime()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
status = fmt.Sprintf("Exited (%d) %s ago", exitCode, units.HumanDuration(time.Since(finishedTime)))
|
||||||
|
} else if state == define.ContainerStateRunning || state == define.ContainerStatePaused {
|
||||||
|
startedTime, err := l.StartedTime()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
status = fmt.Sprintf("Up %s", units.HumanDuration(time.Since(startedTime)))
|
||||||
|
if state == define.ContainerStatePaused {
|
||||||
|
status += " (Paused)"
|
||||||
|
}
|
||||||
|
} else if state == define.ContainerStateRemoving {
|
||||||
|
status = "Removal In Progress"
|
||||||
|
} else if state == define.ContainerStateStopping {
|
||||||
|
status = "Stopping"
|
||||||
|
} else {
|
||||||
|
status = "Unknown"
|
||||||
|
}
|
||||||
|
|
||||||
if sz {
|
if sz {
|
||||||
if sizeRW, err = l.RWSize(); err != nil {
|
if sizeRW, err = l.RWSize(); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -295,7 +326,7 @@ func LibpodToContainer(l *libpod.Container, sz bool) (*handlers.Container, error
|
||||||
SizeRootFs: sizeRootFs,
|
SizeRootFs: sizeRootFs,
|
||||||
Labels: l.Labels(),
|
Labels: l.Labels(),
|
||||||
State: stateStr,
|
State: stateStr,
|
||||||
Status: "",
|
Status: status,
|
||||||
HostConfig: struct {
|
HostConfig: struct {
|
||||||
NetworkMode string `json:",omitempty"`
|
NetworkMode string `json:",omitempty"`
|
||||||
}{
|
}{
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
import random
|
import random
|
||||||
import shutil
|
|
||||||
import string
|
import string
|
||||||
import subprocess
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
|
@ -357,6 +356,7 @@ class TestApi(unittest.TestCase):
|
||||||
|
|
||||||
def test_search_compat(self):
|
def test_search_compat(self):
|
||||||
url = PODMAN_URL + "/v1.40/images/search"
|
url = PODMAN_URL + "/v1.40/images/search"
|
||||||
|
|
||||||
# Had issues with this test hanging when repositories not happy
|
# Had issues with this test hanging when repositories not happy
|
||||||
def do_search1():
|
def do_search1():
|
||||||
payload = {'term': 'alpine'}
|
payload = {'term': 'alpine'}
|
||||||
|
@ -619,6 +619,53 @@ class TestApi(unittest.TestCase):
|
||||||
# self.assertIn(img["Id"], prune_payload["ImagesDeleted"][1]["Deleted"])
|
# self.assertIn(img["Id"], prune_payload["ImagesDeleted"][1]["Deleted"])
|
||||||
self.assertIsNotNone(prune_payload["ImagesDeleted"][1]["Deleted"])
|
self.assertIsNotNone(prune_payload["ImagesDeleted"][1]["Deleted"])
|
||||||
|
|
||||||
|
def test_status_compat(self):
|
||||||
|
r = requests.post(PODMAN_URL + "/v1.40/containers/create?name=topcontainer",
|
||||||
|
json={"Cmd": ["top"], "Image": "alpine:latest"})
|
||||||
|
self.assertEqual(r.status_code, 201, r.text)
|
||||||
|
payload = json.loads(r.text)
|
||||||
|
container_id = payload["Id"]
|
||||||
|
self.assertIsNotNone(container_id)
|
||||||
|
|
||||||
|
r = requests.get(PODMAN_URL + "/v1.40/containers/json",
|
||||||
|
params={'all': 'true', 'filters': f'{{"id":["{container_id}"]}}'})
|
||||||
|
self.assertEqual(r.status_code, 200, r.text)
|
||||||
|
payload = json.loads(r.text)
|
||||||
|
self.assertEqual(payload[0]["Status"], "Created")
|
||||||
|
|
||||||
|
r = requests.post(PODMAN_URL + f"/v1.40/containers/{container_id}/start")
|
||||||
|
self.assertEqual(r.status_code, 204, r.text)
|
||||||
|
|
||||||
|
r = requests.get(PODMAN_URL + "/v1.40/containers/json",
|
||||||
|
params={'all': 'true', 'filters': f'{{"id":["{container_id}"]}}'})
|
||||||
|
self.assertEqual(r.status_code, 200, r.text)
|
||||||
|
payload = json.loads(r.text)
|
||||||
|
self.assertTrue(str(payload[0]["Status"]).startswith("Up"))
|
||||||
|
|
||||||
|
r = requests.post(PODMAN_URL + f"/v1.40/containers/{container_id}/pause")
|
||||||
|
self.assertEqual(r.status_code, 204, r.text)
|
||||||
|
|
||||||
|
r = requests.get(PODMAN_URL + "/v1.40/containers/json",
|
||||||
|
params={'all': 'true', 'filters': f'{{"id":["{container_id}"]}}'})
|
||||||
|
self.assertEqual(r.status_code, 200, r.text)
|
||||||
|
payload = json.loads(r.text)
|
||||||
|
self.assertTrue(str(payload[0]["Status"]).startswith("Up"))
|
||||||
|
self.assertTrue(str(payload[0]["Status"]).endswith("(Paused)"))
|
||||||
|
|
||||||
|
r = requests.post(PODMAN_URL + f"/v1.40/containers/{container_id}/unpause")
|
||||||
|
self.assertEqual(r.status_code, 204, r.text)
|
||||||
|
r = requests.post(PODMAN_URL + f"/v1.40/containers/{container_id}/stop")
|
||||||
|
self.assertEqual(r.status_code, 204, r.text)
|
||||||
|
|
||||||
|
r = requests.get(PODMAN_URL + "/v1.40/containers/json",
|
||||||
|
params={'all': 'true', 'filters': f'{{"id":["{container_id}"]}}'})
|
||||||
|
self.assertEqual(r.status_code, 200, r.text)
|
||||||
|
payload = json.loads(r.text)
|
||||||
|
self.assertTrue(str(payload[0]["Status"]).startswith("Exited"))
|
||||||
|
|
||||||
|
r = requests.delete(PODMAN_URL + f"/v1.40/containers/{container_id}")
|
||||||
|
self.assertEqual(r.status_code, 204, r.text)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|
Loading…
Reference in New Issue