mirror of
https://github.com/containers/podman.git
synced 2025-06-18 15:39:08 +08:00
Compat API: Fix healthcheck status and healthcheck config
Fixes: - Do not show healthcheck status if not available or if container status is "created" (Docker behaviour) - Show healthcheck configuration if present (Config.Healthcheck) Tests: - Ensure State.Health is not present if container status is "created" - Ensure Config.Healthcheck is present and values correct - Ensure State.Health is present if container started Signed-off-by: Milivoje Legenovic <m.legenovic@gmail.com>
This commit is contained in:
@ -403,22 +403,24 @@ func LibpodToContainerJSON(l *libpod.Container, sz bool) (*types.ContainerJSON,
|
||||
state.Status = define.ContainerStateCreated.String()
|
||||
}
|
||||
|
||||
state.Health = &types.Health{
|
||||
Status: inspect.State.Healthcheck.Status,
|
||||
FailingStreak: inspect.State.Healthcheck.FailingStreak,
|
||||
}
|
||||
if l.HasHealthCheck() && state.Status != "created" {
|
||||
state.Health = &types.Health{
|
||||
Status: inspect.State.Healthcheck.Status,
|
||||
FailingStreak: inspect.State.Healthcheck.FailingStreak,
|
||||
}
|
||||
|
||||
log := inspect.State.Healthcheck.Log
|
||||
log := inspect.State.Healthcheck.Log
|
||||
|
||||
for _, item := range log {
|
||||
res := &types.HealthcheckResult{}
|
||||
s, _ := time.Parse(time.RFC3339Nano, item.Start)
|
||||
e, _ := time.Parse(time.RFC3339Nano, item.End)
|
||||
res.Start = s
|
||||
res.End = e
|
||||
res.ExitCode = item.ExitCode
|
||||
res.Output = item.Output
|
||||
state.Health.Log = append(state.Health.Log, res)
|
||||
for _, item := range log {
|
||||
res := &types.HealthcheckResult{}
|
||||
s, _ := time.Parse(time.RFC3339Nano, item.Start)
|
||||
e, _ := time.Parse(time.RFC3339Nano, item.End)
|
||||
res.Start = s
|
||||
res.End = e
|
||||
res.ExitCode = item.ExitCode
|
||||
res.Output = item.Output
|
||||
state.Health.Log = append(state.Health.Log, res)
|
||||
}
|
||||
}
|
||||
|
||||
formatCapabilities(inspect.HostConfig.CapDrop)
|
||||
@ -495,6 +497,17 @@ func LibpodToContainerJSON(l *libpod.Container, sz bool) (*types.ContainerJSON,
|
||||
exposedPorts[exposedPort] = struct{}{}
|
||||
}
|
||||
|
||||
var healthcheck *container.HealthConfig
|
||||
if inspect.Config.Healthcheck != nil {
|
||||
healthcheck = &container.HealthConfig{
|
||||
Test: inspect.Config.Healthcheck.Test,
|
||||
Interval: inspect.Config.Healthcheck.Interval,
|
||||
Timeout: inspect.Config.Healthcheck.Timeout,
|
||||
StartPeriod: inspect.Config.Healthcheck.StartPeriod,
|
||||
Retries: inspect.Config.Healthcheck.Retries,
|
||||
}
|
||||
}
|
||||
|
||||
config := container.Config{
|
||||
Hostname: l.Hostname(),
|
||||
Domainname: inspect.Config.DomainName,
|
||||
@ -508,7 +521,7 @@ func LibpodToContainerJSON(l *libpod.Container, sz bool) (*types.ContainerJSON,
|
||||
StdinOnce: inspect.Config.StdinOnce,
|
||||
Env: inspect.Config.Env,
|
||||
Cmd: l.Command(),
|
||||
Healthcheck: nil,
|
||||
Healthcheck: healthcheck,
|
||||
ArgsEscaped: false,
|
||||
Image: imageName,
|
||||
Volumes: nil,
|
||||
|
@ -36,26 +36,48 @@ class ContainerTestCase(APITestCase):
|
||||
|
||||
r = requests.post(
|
||||
self.podman_url + "/v1.40/containers/create?name=topcontainer",
|
||||
json={"Healthcheck": {"Test": ["CMD-SHELL", "exit 0"], "Interval":1000, "Timeout":1000, "Retries": 5}, "Cmd": ["top"], "Image": "alpine:latest"},
|
||||
json={"Cmd": ["top"],
|
||||
"Image": "alpine:latest",
|
||||
"Healthcheck": {
|
||||
"Test": ["CMD", "pidof", "top"],
|
||||
"Interval": 5000000000,
|
||||
"Timeout": 2000000000,
|
||||
"Retries": 3,
|
||||
"StartPeriod": 5000000000
|
||||
}
|
||||
},
|
||||
)
|
||||
self.assertEqual(r.status_code, 201, r.text)
|
||||
payload = r.json()
|
||||
container_id = payload["Id"]
|
||||
self.assertIsNotNone(container_id)
|
||||
|
||||
r = requests.get(self.podman_url + f"/v1.40/containers/{payload['Id']}/json")
|
||||
r = requests.get(self.podman_url + f"/v1.40/containers/{container_id}/json")
|
||||
self.assertEqual(r.status_code, 200, r.text)
|
||||
self.assertId(r.content)
|
||||
out = r.json()
|
||||
state = out["State"]["Health"]
|
||||
self.assertIsInstance(state, dict)
|
||||
self.assertIsNone(out["State"].get("Health"))
|
||||
self.assertListEqual(["CMD", "pidof", "top"], out["Config"]["Healthcheck"]["Test"])
|
||||
self.assertEqual(5000000000, out["Config"]["Healthcheck"]["Interval"])
|
||||
self.assertEqual(2000000000, out["Config"]["Healthcheck"]["Timeout"])
|
||||
self.assertEqual(3, out["Config"]["Healthcheck"]["Retries"])
|
||||
self.assertEqual(5000000000, out["Config"]["Healthcheck"]["StartPeriod"])
|
||||
|
||||
r = requests.get(self.uri(f"/containers/{payload['Id']}/json"))
|
||||
r = requests.get(self.uri(f"/containers/{container_id}/json"))
|
||||
self.assertEqual(r.status_code, 200, r.text)
|
||||
self.assertId(r.content)
|
||||
out = r.json()
|
||||
hc = out["Config"]["Healthcheck"]["Test"]
|
||||
self.assertListEqual(["CMD-SHELL", "exit 0"], hc)
|
||||
self.assertListEqual(["CMD", "pidof", "top"], hc)
|
||||
|
||||
r = requests.post(self.podman_url + f"/v1.40/containers/{container_id}/start")
|
||||
self.assertEqual(r.status_code, 204, r.text)
|
||||
|
||||
r = requests.get(self.podman_url + f"/v1.40/containers/{container_id}/json")
|
||||
self.assertEqual(r.status_code, 200, r.text)
|
||||
out = r.json()
|
||||
state = out["State"]["Health"]
|
||||
self.assertIsInstance(state, dict)
|
||||
|
||||
def test_stats(self):
|
||||
r = requests.get(self.uri(self.resolve_container("/containers/{}/stats?stream=false")))
|
||||
|
Reference in New Issue
Block a user