mirror of
https://github.com/containers/podman.git
synced 2025-06-01 17:17:47 +08:00

clean up the reporting of a benign error that can occur when a container is first stopped and then removed. Signed-off-by: baude <bbaude@redhat.com>
75 lines
2.1 KiB
Go
75 lines
2.1 KiB
Go
package libpod
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"os/exec"
|
|
"strings"
|
|
|
|
"github.com/coreos/go-systemd/dbus"
|
|
"github.com/pkg/errors"
|
|
"github.com/sirupsen/logrus"
|
|
)
|
|
|
|
// createTimer systemd timers for healthchecks of a container
|
|
func (c *Container) createTimer() error {
|
|
if c.disableHealthCheckSystemd() {
|
|
return nil
|
|
}
|
|
podman, err := os.Executable()
|
|
if err != nil {
|
|
return errors.Wrapf(err, "failed to get path for podman for a health check timer")
|
|
}
|
|
|
|
var cmd = []string{"--unit", fmt.Sprintf("%s", c.ID()), fmt.Sprintf("--on-unit-inactive=%s", c.HealthCheckConfig().Interval.String()), "--timer-property=AccuracySec=1s", podman, "healthcheck", "run", c.ID()}
|
|
|
|
conn, err := dbus.NewSystemdConnection()
|
|
if err != nil {
|
|
return errors.Wrapf(err, "unable to get systemd connection to add healthchecks")
|
|
}
|
|
conn.Close()
|
|
logrus.Debugf("creating systemd-transient files: %s %s", "systemd-run", cmd)
|
|
systemdRun := exec.Command("systemd-run", cmd...)
|
|
_, err = systemdRun.CombinedOutput()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// startTimer starts a systemd timer for the healthchecks
|
|
func (c *Container) startTimer() error {
|
|
if c.disableHealthCheckSystemd() {
|
|
return nil
|
|
}
|
|
conn, err := dbus.NewSystemdConnection()
|
|
if err != nil {
|
|
return errors.Wrapf(err, "unable to get systemd connection to start healthchecks")
|
|
}
|
|
defer conn.Close()
|
|
_, err = conn.StartUnit(fmt.Sprintf("%s.service", c.ID()), "fail", nil)
|
|
return err
|
|
}
|
|
|
|
// removeTimer removes the systemd timer and unit files
|
|
// for the container
|
|
func (c *Container) removeTimer() error {
|
|
if c.disableHealthCheckSystemd() {
|
|
return nil
|
|
}
|
|
conn, err := dbus.NewSystemdConnection()
|
|
if err != nil {
|
|
return errors.Wrapf(err, "unable to get systemd connection to remove healthchecks")
|
|
}
|
|
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
|
|
}
|
|
return err
|
|
}
|