Skip to content

Commit

Permalink
Merge pull request containers#12634 from baude/bz2024229
Browse files Browse the repository at this point in the history
Removed .service file for healthchecks
  • Loading branch information
openshift-merge-robot authored Dec 17, 2021
2 parents 52d5f36 + e88c213 commit c9a3f4e
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 10 deletions.
4 changes: 2 additions & 2 deletions libpod/container_internal.go
Original file line number Diff line number Diff line change
Expand Up @@ -1877,15 +1877,15 @@ func (c *Container) cleanupStorage() error {
return cleanupErr
}

// Unmount the a container and free its resources
// Unmount the container and free its resources
func (c *Container) cleanup(ctx context.Context) error {
var lastError error

logrus.Debugf("Cleaning up container %s", c.ID())

// Remove healthcheck unit/timer file if it execs
if c.config.HealthCheckConfig != nil {
if err := c.removeTimer(); err != nil {
if err := c.removeTransientFiles(ctx); err != nil {
logrus.Errorf("Removing timer for container %s healthcheck: %v", c.ID(), err)
}
}
Expand Down
24 changes: 16 additions & 8 deletions libpod/healthcheck_linux.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package libpod

import (
"context"
"fmt"
"os"
"os/exec"
Expand Down Expand Up @@ -59,9 +60,9 @@ func (c *Container) startTimer() error {
return err
}

// removeTimer removes the systemd timer and unit files
// removeTransientFiles removes the systemd timer and unit files
// for the container
func (c *Container) removeTimer() error {
func (c *Container) removeTransientFiles(ctx context.Context) error {
if c.disableHealthCheckSystemd() {
return nil
}
Expand All @@ -71,12 +72,19 @@ func (c *Container) removeTimer() error {
}
defer conn.Close()
timerFile := fmt.Sprintf("%s.timer", c.ID())
_, err = conn.StopUnit(timerFile, "fail", nil)

// We want to ignore errors where the timer unit has already been removed. The error
// return is generic so we have to check against the string in the error
if err != nil && strings.HasSuffix(err.Error(), ".timer not loaded.") {
return nil
serviceFile := fmt.Sprintf("%s.service", c.ID())
// We want to ignore errors where the timer unit and/or service unit has already
// been removed. The error return is generic so we have to check against the
// string in the error
if _, err = conn.StopUnitContext(ctx, serviceFile, "fail", nil); err != nil {
if !strings.HasSuffix(err.Error(), ".service not loaded.") {
return errors.Wrapf(err, "unable to remove service file")
}
}
if _, err = conn.StopUnitContext(ctx, timerFile, "fail", nil); err != nil {
if strings.HasSuffix(err.Error(), ".timer not loaded.") {
return nil
}
}
return err
}
16 changes: 16 additions & 0 deletions test/e2e/healthcheck_run_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -242,4 +242,20 @@ var _ = Describe("Podman healthcheck run", func() {
Expect(ps.OutputToStringArray()).To(HaveLen(2))
Expect(ps.OutputToString()).To(ContainSubstring("hc"))
})

It("stopping and then starting a container with healthcheck cmd", func() {
session := podmanTest.Podman([]string{"run", "-dt", "--name", "hc", "--health-cmd", "[\"ls\", \"/foo\"]", ALPINE, "top"})
session.WaitWithDefaultTimeout()
Expect(session).Should(Exit(0))

stop := podmanTest.Podman([]string{"stop", "-t0", "hc"})
stop.WaitWithDefaultTimeout()
Expect(stop).Should(Exit(0))

startAgain := podmanTest.Podman([]string{"start", "hc"})
startAgain.WaitWithDefaultTimeout()
Expect(startAgain).Should(Exit(0))
Expect(startAgain.OutputToString()).To(Equal("hc"))
Expect(startAgain.ErrorToString()).To(Equal(""))
})
})

0 comments on commit c9a3f4e

Please sign in to comment.