github.com/containers/podman/v2@v2.2.2-0.20210501105131-c1e07d070c4c/test/e2e/healthcheck_run_test.go (about) 1 package integration 2 3 import ( 4 "fmt" 5 "os" 6 "time" 7 8 . "github.com/containers/podman/v2/test/utils" 9 . "github.com/onsi/ginkgo" 10 . "github.com/onsi/gomega" 11 ) 12 13 var _ = Describe("Podman healthcheck run", func() { 14 var ( 15 tempdir string 16 err error 17 podmanTest *PodmanTestIntegration 18 ) 19 20 BeforeEach(func() { 21 tempdir, err = CreateTempDirInTempDir() 22 if err != nil { 23 os.Exit(1) 24 } 25 podmanTest = PodmanTestCreate(tempdir) 26 podmanTest.Setup() 27 podmanTest.SeedImages() 28 }) 29 30 AfterEach(func() { 31 podmanTest.Cleanup() 32 f := CurrentGinkgoTestDescription() 33 timedResult := fmt.Sprintf("Test: %s completed in %f seconds", f.TestText, f.Duration.Seconds()) 34 GinkgoWriter.Write([]byte(timedResult)) 35 36 }) 37 38 It("podman healthcheck run bogus container", func() { 39 session := podmanTest.Podman([]string{"healthcheck", "run", "foobar"}) 40 session.WaitWithDefaultTimeout() 41 Expect(session).To(ExitWithError()) 42 }) 43 44 It("podman disable healthcheck with --no-healthcheck on valid container", func() { 45 session := podmanTest.Podman([]string{"run", "-dt", "--no-healthcheck", "--name", "hc", healthcheck}) 46 session.WaitWithDefaultTimeout() 47 Expect(session.ExitCode()).To(Equal(0)) 48 hc := podmanTest.Podman([]string{"healthcheck", "run", "hc"}) 49 hc.WaitWithDefaultTimeout() 50 Expect(hc.ExitCode()).To(Equal(125)) 51 }) 52 53 It("podman disable healthcheck with --health-cmd=none on valid container", func() { 54 session := podmanTest.Podman([]string{"run", "-dt", "--health-cmd", "none", "--name", "hc", healthcheck}) 55 session.WaitWithDefaultTimeout() 56 Expect(session.ExitCode()).To(Equal(0)) 57 hc := podmanTest.Podman([]string{"healthcheck", "run", "hc"}) 58 hc.WaitWithDefaultTimeout() 59 Expect(hc.ExitCode()).To(Equal(125)) 60 }) 61 62 It("podman healthcheck on valid container", func() { 63 Skip("Extremely consistent flake - re-enable on debugging") 64 session := podmanTest.Podman([]string{"run", "-dt", "--name", "hc", healthcheck}) 65 session.WaitWithDefaultTimeout() 66 Expect(session.ExitCode()).To(Equal(0)) 67 68 exitCode := 999 69 70 // Buy a little time to get container running 71 for i := 0; i < 5; i++ { 72 hc := podmanTest.Podman([]string{"healthcheck", "run", "hc"}) 73 hc.WaitWithDefaultTimeout() 74 exitCode = hc.ExitCode() 75 if exitCode == 0 || i == 4 { 76 break 77 } 78 time.Sleep(1 * time.Second) 79 } 80 Expect(exitCode).To(Equal(0)) 81 }) 82 83 It("podman healthcheck that should fail", func() { 84 session := podmanTest.Podman([]string{"run", "-dt", "--name", "hc", "quay.io/libpod/badhealthcheck:latest"}) 85 session.WaitWithDefaultTimeout() 86 Expect(session.ExitCode()).To(Equal(0)) 87 88 hc := podmanTest.Podman([]string{"healthcheck", "run", "hc"}) 89 hc.WaitWithDefaultTimeout() 90 Expect(hc.ExitCode()).To(Equal(1)) 91 }) 92 93 It("podman healthcheck on stopped container", func() { 94 session := podmanTest.Podman([]string{"run", "-dt", "--name", "hc", healthcheck, "ls"}) 95 session.WaitWithDefaultTimeout() 96 Expect(session.ExitCode()).To(Equal(0)) 97 98 hc := podmanTest.Podman([]string{"healthcheck", "run", "hc"}) 99 hc.WaitWithDefaultTimeout() 100 Expect(hc.ExitCode()).To(Equal(125)) 101 }) 102 103 It("podman healthcheck on container without healthcheck", func() { 104 session := podmanTest.Podman([]string{"run", "-dt", "--name", "hc", ALPINE, "top"}) 105 session.WaitWithDefaultTimeout() 106 Expect(session.ExitCode()).To(Equal(0)) 107 108 hc := podmanTest.Podman([]string{"healthcheck", "run", "hc"}) 109 hc.WaitWithDefaultTimeout() 110 Expect(hc.ExitCode()).To(Equal(125)) 111 }) 112 113 It("podman healthcheck should be starting", func() { 114 session := podmanTest.Podman([]string{"run", "-dt", "--name", "hc", "--health-retries", "2", "--health-cmd", "ls /foo || exit 1", ALPINE, "top"}) 115 session.WaitWithDefaultTimeout() 116 Expect(session.ExitCode()).To(Equal(0)) 117 inspect := podmanTest.InspectContainer("hc") 118 Expect(inspect[0].State.Healthcheck.Status).To(Equal("starting")) 119 }) 120 121 It("podman healthcheck failed checks in start-period should not change status", func() { 122 session := podmanTest.Podman([]string{"run", "-dt", "--name", "hc", "--health-start-period", "2m", "--health-retries", "2", "--health-cmd", "ls /foo || exit 1", ALPINE, "top"}) 123 session.WaitWithDefaultTimeout() 124 Expect(session.ExitCode()).To(Equal(0)) 125 126 hc := podmanTest.Podman([]string{"healthcheck", "run", "hc"}) 127 hc.WaitWithDefaultTimeout() 128 Expect(hc.ExitCode()).To(Equal(1)) 129 130 hc = podmanTest.Podman([]string{"healthcheck", "run", "hc"}) 131 hc.WaitWithDefaultTimeout() 132 Expect(hc.ExitCode()).To(Equal(1)) 133 134 hc = podmanTest.Podman([]string{"healthcheck", "run", "hc"}) 135 hc.WaitWithDefaultTimeout() 136 Expect(hc.ExitCode()).To(Equal(1)) 137 138 inspect := podmanTest.InspectContainer("hc") 139 Expect(inspect[0].State.Healthcheck.Status).To(Equal("starting")) 140 }) 141 142 It("podman healthcheck failed checks must reach retries before unhealthy ", func() { 143 session := podmanTest.Podman([]string{"run", "-dt", "--name", "hc", "--health-retries", "2", "--health-cmd", "ls /foo || exit 1", ALPINE, "top"}) 144 session.WaitWithDefaultTimeout() 145 Expect(session.ExitCode()).To(Equal(0)) 146 147 hc := podmanTest.Podman([]string{"healthcheck", "run", "hc"}) 148 hc.WaitWithDefaultTimeout() 149 Expect(hc.ExitCode()).To(Equal(1)) 150 151 inspect := podmanTest.InspectContainer("hc") 152 Expect(inspect[0].State.Healthcheck.Status).To(Equal("starting")) 153 154 hc = podmanTest.Podman([]string{"healthcheck", "run", "hc"}) 155 hc.WaitWithDefaultTimeout() 156 Expect(hc.ExitCode()).To(Equal(1)) 157 158 inspect = podmanTest.InspectContainer("hc") 159 Expect(inspect[0].State.Healthcheck.Status).To(Equal("unhealthy")) 160 161 }) 162 163 It("podman healthcheck good check results in healthy even in start-period", func() { 164 session := podmanTest.Podman([]string{"run", "-dt", "--name", "hc", "--health-start-period", "2m", "--health-retries", "2", "--health-cmd", "ls || exit 1", ALPINE, "top"}) 165 session.WaitWithDefaultTimeout() 166 Expect(session.ExitCode()).To(Equal(0)) 167 168 hc := podmanTest.Podman([]string{"healthcheck", "run", "hc"}) 169 hc.WaitWithDefaultTimeout() 170 Expect(hc.ExitCode()).To(Equal(0)) 171 172 inspect := podmanTest.InspectContainer("hc") 173 Expect(inspect[0].State.Healthcheck.Status).To(Equal("healthy")) 174 }) 175 176 It("podman healthcheck single healthy result changes failed to healthy", func() { 177 session := podmanTest.Podman([]string{"run", "-dt", "--name", "hc", "--health-retries", "2", "--health-cmd", "ls /foo || exit 1", ALPINE, "top"}) 178 session.WaitWithDefaultTimeout() 179 Expect(session.ExitCode()).To(Equal(0)) 180 181 hc := podmanTest.Podman([]string{"healthcheck", "run", "hc"}) 182 hc.WaitWithDefaultTimeout() 183 Expect(hc.ExitCode()).To(Equal(1)) 184 185 inspect := podmanTest.InspectContainer("hc") 186 Expect(inspect[0].State.Healthcheck.Status).To(Equal("starting")) 187 188 hc = podmanTest.Podman([]string{"healthcheck", "run", "hc"}) 189 hc.WaitWithDefaultTimeout() 190 Expect(hc.ExitCode()).To(Equal(1)) 191 192 inspect = podmanTest.InspectContainer("hc") 193 Expect(inspect[0].State.Healthcheck.Status).To(Equal("unhealthy")) 194 195 foo := podmanTest.Podman([]string{"exec", "hc", "touch", "/foo"}) 196 foo.WaitWithDefaultTimeout() 197 Expect(foo.ExitCode()).To(BeZero()) 198 199 hc = podmanTest.Podman([]string{"healthcheck", "run", "hc"}) 200 hc.WaitWithDefaultTimeout() 201 Expect(hc.ExitCode()).To(Equal(0)) 202 203 inspect = podmanTest.InspectContainer("hc") 204 Expect(inspect[0].State.Healthcheck.Status).To(Equal("healthy")) 205 }) 206 })