github.com/containers/libpod@v1.9.4-0.20220419124438-4284fd425507/test/e2e/healthcheck_run_test.go (about) 1 package integration 2 3 import ( 4 "fmt" 5 "os" 6 "time" 7 8 . "github.com/containers/libpod/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 SkipIfRemote() 46 session := podmanTest.Podman([]string{"run", "-dt", "--no-healthcheck", "--name", "hc", healthcheck}) 47 session.WaitWithDefaultTimeout() 48 Expect(session.ExitCode()).To(Equal(0)) 49 hc := podmanTest.Podman([]string{"healthcheck", "run", "hc"}) 50 hc.WaitWithDefaultTimeout() 51 Expect(hc.ExitCode()).To(Equal(125)) 52 }) 53 54 It("podman disable healthcheck with --health-cmd=none on valid container", func() { 55 SkipIfRemote() 56 session := podmanTest.Podman([]string{"run", "-dt", "--health-cmd", "none", "--name", "hc", healthcheck}) 57 session.WaitWithDefaultTimeout() 58 Expect(session.ExitCode()).To(Equal(0)) 59 hc := podmanTest.Podman([]string{"healthcheck", "run", "hc"}) 60 hc.WaitWithDefaultTimeout() 61 Expect(hc.ExitCode()).To(Equal(125)) 62 }) 63 64 It("podman healthcheck on valid container", func() { 65 Skip("Extremely consistent flake - re-enable on debugging") 66 session := podmanTest.Podman([]string{"run", "-dt", "--name", "hc", healthcheck}) 67 session.WaitWithDefaultTimeout() 68 Expect(session.ExitCode()).To(Equal(0)) 69 70 exitCode := 999 71 72 // Buy a little time to get container running 73 for i := 0; i < 5; i++ { 74 hc := podmanTest.Podman([]string{"healthcheck", "run", "hc"}) 75 hc.WaitWithDefaultTimeout() 76 exitCode = hc.ExitCode() 77 if exitCode == 0 || i == 4 { 78 break 79 } 80 time.Sleep(1 * time.Second) 81 } 82 Expect(exitCode).To(Equal(0)) 83 }) 84 85 It("podman healthcheck that should fail", func() { 86 session := podmanTest.Podman([]string{"run", "-dt", "--name", "hc", "docker.io/libpod/badhealthcheck:latest"}) 87 session.WaitWithDefaultTimeout() 88 Expect(session.ExitCode()).To(Equal(0)) 89 90 hc := podmanTest.Podman([]string{"healthcheck", "run", "hc"}) 91 hc.WaitWithDefaultTimeout() 92 Expect(hc.ExitCode()).To(Equal(1)) 93 }) 94 95 It("podman healthcheck on stopped container", func() { 96 session := podmanTest.Podman([]string{"run", "-dt", "--name", "hc", healthcheck, "ls"}) 97 session.WaitWithDefaultTimeout() 98 Expect(session.ExitCode()).To(Equal(0)) 99 100 hc := podmanTest.Podman([]string{"healthcheck", "run", "hc"}) 101 hc.WaitWithDefaultTimeout() 102 Expect(hc.ExitCode()).To(Equal(125)) 103 }) 104 105 It("podman healthcheck on container without healthcheck", func() { 106 session := podmanTest.Podman([]string{"run", "-dt", "--name", "hc", ALPINE, "top"}) 107 session.WaitWithDefaultTimeout() 108 Expect(session.ExitCode()).To(Equal(0)) 109 110 hc := podmanTest.Podman([]string{"healthcheck", "run", "hc"}) 111 hc.WaitWithDefaultTimeout() 112 Expect(hc.ExitCode()).To(Equal(125)) 113 }) 114 115 It("podman healthcheck should be starting", func() { 116 session := podmanTest.Podman([]string{"run", "-dt", "--name", "hc", "--health-retries", "2", "--health-cmd", "ls /foo || exit 1", ALPINE, "top"}) 117 session.WaitWithDefaultTimeout() 118 Expect(session.ExitCode()).To(Equal(0)) 119 inspect := podmanTest.InspectContainer("hc") 120 Expect(inspect[0].State.Healthcheck.Status).To(Equal("starting")) 121 }) 122 123 It("podman healthcheck failed checks in start-period should not change status", func() { 124 session := podmanTest.Podman([]string{"run", "-dt", "--name", "hc", "--health-start-period", "2m", "--health-retries", "2", "--health-cmd", "ls /foo || exit 1", ALPINE, "top"}) 125 session.WaitWithDefaultTimeout() 126 Expect(session.ExitCode()).To(Equal(0)) 127 128 hc := podmanTest.Podman([]string{"healthcheck", "run", "hc"}) 129 hc.WaitWithDefaultTimeout() 130 Expect(hc.ExitCode()).To(Equal(1)) 131 132 hc = podmanTest.Podman([]string{"healthcheck", "run", "hc"}) 133 hc.WaitWithDefaultTimeout() 134 Expect(hc.ExitCode()).To(Equal(1)) 135 136 hc = podmanTest.Podman([]string{"healthcheck", "run", "hc"}) 137 hc.WaitWithDefaultTimeout() 138 Expect(hc.ExitCode()).To(Equal(1)) 139 140 inspect := podmanTest.InspectContainer("hc") 141 Expect(inspect[0].State.Healthcheck.Status).To(Equal("starting")) 142 }) 143 144 It("podman healthcheck failed checks must reach retries before unhealthy ", func() { 145 session := podmanTest.Podman([]string{"run", "-dt", "--name", "hc", "--health-retries", "2", "--health-cmd", "ls /foo || exit 1", ALPINE, "top"}) 146 session.WaitWithDefaultTimeout() 147 Expect(session.ExitCode()).To(Equal(0)) 148 149 hc := podmanTest.Podman([]string{"healthcheck", "run", "hc"}) 150 hc.WaitWithDefaultTimeout() 151 Expect(hc.ExitCode()).To(Equal(1)) 152 153 inspect := podmanTest.InspectContainer("hc") 154 Expect(inspect[0].State.Healthcheck.Status).To(Equal("starting")) 155 156 hc = podmanTest.Podman([]string{"healthcheck", "run", "hc"}) 157 hc.WaitWithDefaultTimeout() 158 Expect(hc.ExitCode()).To(Equal(1)) 159 160 inspect = podmanTest.InspectContainer("hc") 161 Expect(inspect[0].State.Healthcheck.Status).To(Equal("unhealthy")) 162 163 }) 164 165 It("podman healthcheck good check results in healthy even in start-period", func() { 166 session := podmanTest.Podman([]string{"run", "-dt", "--name", "hc", "--health-start-period", "2m", "--health-retries", "2", "--health-cmd", "ls || exit 1", ALPINE, "top"}) 167 session.WaitWithDefaultTimeout() 168 Expect(session.ExitCode()).To(Equal(0)) 169 170 hc := podmanTest.Podman([]string{"healthcheck", "run", "hc"}) 171 hc.WaitWithDefaultTimeout() 172 Expect(hc.ExitCode()).To(Equal(0)) 173 174 inspect := podmanTest.InspectContainer("hc") 175 Expect(inspect[0].State.Healthcheck.Status).To(Equal("healthy")) 176 }) 177 178 It("podman healthcheck single healthy result changes failed to healthy", func() { 179 session := podmanTest.Podman([]string{"run", "-dt", "--name", "hc", "--health-retries", "2", "--health-cmd", "ls /foo || exit 1", ALPINE, "top"}) 180 session.WaitWithDefaultTimeout() 181 Expect(session.ExitCode()).To(Equal(0)) 182 183 hc := podmanTest.Podman([]string{"healthcheck", "run", "hc"}) 184 hc.WaitWithDefaultTimeout() 185 Expect(hc.ExitCode()).To(Equal(1)) 186 187 inspect := podmanTest.InspectContainer("hc") 188 Expect(inspect[0].State.Healthcheck.Status).To(Equal("starting")) 189 190 hc = podmanTest.Podman([]string{"healthcheck", "run", "hc"}) 191 hc.WaitWithDefaultTimeout() 192 Expect(hc.ExitCode()).To(Equal(1)) 193 194 inspect = podmanTest.InspectContainer("hc") 195 Expect(inspect[0].State.Healthcheck.Status).To(Equal("unhealthy")) 196 197 foo := podmanTest.Podman([]string{"exec", "hc", "touch", "/foo"}) 198 foo.WaitWithDefaultTimeout() 199 Expect(foo.ExitCode()).To(BeZero()) 200 201 hc = podmanTest.Podman([]string{"healthcheck", "run", "hc"}) 202 hc.WaitWithDefaultTimeout() 203 Expect(hc.ExitCode()).To(Equal(0)) 204 205 inspect = podmanTest.InspectContainer("hc") 206 Expect(inspect[0].State.Healthcheck.Status).To(Equal("healthy")) 207 }) 208 })