mirror of
https://github.com/containers/podman.git
synced 2025-06-18 07:28:57 +08:00
Fixed Healthcheck formatting, string to []string
Compat healthcheck tests are of the format []string but podman's were of the format string. Converted podman's to []string at the specgen level since it has the same effect and removed the incorrect parsing of compat healthchecks. fixes #10617 Signed-off-by: cdoern <cdoern@redhat.com>
This commit is contained in:
@ -517,7 +517,12 @@ func ContainerCreateToContainerCLIOpts(cc handlers.CreateContainerConfig, rtc *c
|
|||||||
cliOpts.OOMKillDisable = *cc.HostConfig.OomKillDisable
|
cliOpts.OOMKillDisable = *cc.HostConfig.OomKillDisable
|
||||||
}
|
}
|
||||||
if cc.Config.Healthcheck != nil {
|
if cc.Config.Healthcheck != nil {
|
||||||
cliOpts.HealthCmd = strings.Join(cc.Config.Healthcheck.Test, " ")
|
finCmd := ""
|
||||||
|
for _, str := range cc.Config.Healthcheck.Test {
|
||||||
|
finCmd = finCmd + str + " "
|
||||||
|
}
|
||||||
|
finCmd = finCmd[:len(finCmd)-1]
|
||||||
|
cliOpts.HealthCmd = finCmd
|
||||||
cliOpts.HealthInterval = cc.Config.Healthcheck.Interval.String()
|
cliOpts.HealthInterval = cc.Config.Healthcheck.Interval.String()
|
||||||
cliOpts.HealthRetries = uint(cc.Config.Healthcheck.Retries)
|
cliOpts.HealthRetries = uint(cc.Config.Healthcheck.Retries)
|
||||||
cliOpts.HealthStartPeriod = cc.Config.Healthcheck.StartPeriod.String()
|
cliOpts.HealthStartPeriod = cc.Config.Healthcheck.StartPeriod.String()
|
||||||
|
@ -655,26 +655,29 @@ func FillOutSpecGen(s *specgen.SpecGenerator, c *ContainerCLIOpts, args []string
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func makeHealthCheckFromCli(inCmd, interval string, retries uint, timeout, startPeriod string) (*manifest.Schema2HealthConfig, error) {
|
func makeHealthCheckFromCli(inCmd string, interval string, retries uint, timeout, startPeriod string) (*manifest.Schema2HealthConfig, error) {
|
||||||
|
var cmdArr []string
|
||||||
|
cmdSplitPrelim := strings.SplitN(inCmd, " ", 2)
|
||||||
|
if cmdSplitPrelim[0] == "CMD-SHELL" {
|
||||||
|
cmdArr = cmdSplitPrelim
|
||||||
|
} else if cmdSplitPrelim[0] != "CMD" && cmdSplitPrelim[0] != "none" { // if it isnt a cmd-shell or a cmd, it is a command
|
||||||
|
cmdArr = []string{"CMD-SHELL"}
|
||||||
|
cmdArr = append(cmdArr, inCmd)
|
||||||
|
} else {
|
||||||
|
cmdArr = strings.Fields(inCmd)
|
||||||
|
}
|
||||||
// Every healthcheck requires a command
|
// Every healthcheck requires a command
|
||||||
if len(inCmd) == 0 {
|
if len(cmdArr) == 0 {
|
||||||
return nil, errors.New("Must define a healthcheck command for all healthchecks")
|
return nil, errors.New("Must define a healthcheck command for all healthchecks")
|
||||||
}
|
}
|
||||||
|
|
||||||
// first try to parse option value as JSON array of strings...
|
if cmdArr[0] == "none" { // if specified to remove healtcheck
|
||||||
cmd := []string{}
|
cmdArr = []string{"NONE"}
|
||||||
|
|
||||||
if inCmd == "none" {
|
|
||||||
cmd = []string{"NONE"}
|
|
||||||
} else {
|
|
||||||
err := json.Unmarshal([]byte(inCmd), &cmd)
|
|
||||||
if err != nil {
|
|
||||||
// ...otherwise pass it to "/bin/sh -c" inside the container
|
|
||||||
cmd = []string{"CMD-SHELL", inCmd}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// healthcheck is by default an array, so we simply pass the user input
|
||||||
hc := manifest.Schema2HealthConfig{
|
hc := manifest.Schema2HealthConfig{
|
||||||
Test: cmd,
|
Test: cmdArr,
|
||||||
}
|
}
|
||||||
|
|
||||||
if interval == "disable" {
|
if interval == "disable" {
|
||||||
|
@ -33,9 +33,10 @@ class ContainerTestCase(APITestCase):
|
|||||||
self.assertId(r.content)
|
self.assertId(r.content)
|
||||||
_ = parse(r.json()["Created"])
|
_ = parse(r.json()["Created"])
|
||||||
|
|
||||||
|
|
||||||
r = requests.post(
|
r = requests.post(
|
||||||
self.podman_url + "/v1.40/containers/create?name=topcontainer",
|
self.podman_url + "/v1.40/containers/create?name=topcontainer",
|
||||||
json={"Cmd": ["top"], "Image": "alpine:latest"},
|
json={"Healthcheck": {"Test": ["CMD-SHELL", "exit 0"], "Interval":1000, "Timeout":1000, "Retries": 5}, "Cmd": ["top"], "Image": "alpine:latest"},
|
||||||
)
|
)
|
||||||
self.assertEqual(r.status_code, 201, r.text)
|
self.assertEqual(r.status_code, 201, r.text)
|
||||||
payload = r.json()
|
payload = r.json()
|
||||||
@ -49,6 +50,13 @@ class ContainerTestCase(APITestCase):
|
|||||||
state = out["State"]["Health"]
|
state = out["State"]["Health"]
|
||||||
self.assertIsInstance(state, dict)
|
self.assertIsInstance(state, dict)
|
||||||
|
|
||||||
|
r = requests.get(self.uri(f"/containers/{payload['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)
|
||||||
|
|
||||||
def test_stats(self):
|
def test_stats(self):
|
||||||
r = requests.get(self.uri(self.resolve_container("/containers/{}/stats?stream=false")))
|
r = requests.get(self.uri(self.resolve_container("/containers/{}/stats?stream=false")))
|
||||||
self.assertIn(r.status_code, (200, 409), r.text)
|
self.assertIn(r.status_code, (200, 409), r.text)
|
||||||
|
@ -1205,21 +1205,21 @@ USER mail`, BB)
|
|||||||
})
|
})
|
||||||
|
|
||||||
It("podman run with bad healthcheck retries", func() {
|
It("podman run with bad healthcheck retries", func() {
|
||||||
session := podmanTest.Podman([]string{"run", "-dt", "--health-cmd", "[\"foo\"]", "--health-retries", "0", ALPINE, "top"})
|
session := podmanTest.Podman([]string{"run", "-dt", "--health-cmd", "foo", "--health-retries", "0", ALPINE, "top"})
|
||||||
session.Wait()
|
session.Wait()
|
||||||
Expect(session).To(ExitWithError())
|
Expect(session).To(ExitWithError())
|
||||||
Expect(session.ErrorToString()).To(ContainSubstring("healthcheck-retries must be greater than 0"))
|
Expect(session.ErrorToString()).To(ContainSubstring("healthcheck-retries must be greater than 0"))
|
||||||
})
|
})
|
||||||
|
|
||||||
It("podman run with bad healthcheck timeout", func() {
|
It("podman run with bad healthcheck timeout", func() {
|
||||||
session := podmanTest.Podman([]string{"run", "-dt", "--health-cmd", "[\"foo\"]", "--health-timeout", "0s", ALPINE, "top"})
|
session := podmanTest.Podman([]string{"run", "-dt", "--health-cmd", "foo", "--health-timeout", "0s", ALPINE, "top"})
|
||||||
session.WaitWithDefaultTimeout()
|
session.WaitWithDefaultTimeout()
|
||||||
Expect(session).To(ExitWithError())
|
Expect(session).To(ExitWithError())
|
||||||
Expect(session.ErrorToString()).To(ContainSubstring("healthcheck-timeout must be at least 1 second"))
|
Expect(session.ErrorToString()).To(ContainSubstring("healthcheck-timeout must be at least 1 second"))
|
||||||
})
|
})
|
||||||
|
|
||||||
It("podman run with bad healthcheck start-period", func() {
|
It("podman run with bad healthcheck start-period", func() {
|
||||||
session := podmanTest.Podman([]string{"run", "-dt", "--health-cmd", "[\"foo\"]", "--health-start-period", "-1s", ALPINE, "top"})
|
session := podmanTest.Podman([]string{"run", "-dt", "--health-cmd", "foo", "--health-start-period", "-1s", ALPINE, "top"})
|
||||||
session.WaitWithDefaultTimeout()
|
session.WaitWithDefaultTimeout()
|
||||||
Expect(session).To(ExitWithError())
|
Expect(session).To(ExitWithError())
|
||||||
Expect(session.ErrorToString()).To(ContainSubstring("healthcheck-start-period must be 0 seconds or greater"))
|
Expect(session.ErrorToString()).To(ContainSubstring("healthcheck-start-period must be 0 seconds or greater"))
|
||||||
|
Reference in New Issue
Block a user