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