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  })