mirror of
https://github.com/containrrr/watchtower.git
synced 2025-09-22 05:40:50 +02:00
fix(lifecycle): cleanup lifecycle
- removes unwieldy SkipUpdate return value in favor of errors.Is - generalizes the code for all four phases - allows timeout to be defined for all phases - enables explicit unit in timeout label values (in addition to implicit minutes)
This commit is contained in:
parent
76f9cea516
commit
023c1a7d93
10 changed files with 160 additions and 179 deletions
|
@ -6,101 +6,60 @@ import (
|
|||
log "github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
// ExecutePreChecks tries to run the pre-check lifecycle hook for all containers included by the current filter.
|
||||
func ExecutePreChecks(client container.Client, params types.UpdateParams) {
|
||||
containers, err := client.ListContainers(params.Filter)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
for _, currentContainer := range containers {
|
||||
ExecutePreCheckCommand(client, currentContainer)
|
||||
}
|
||||
}
|
||||
|
||||
// ExecutePostChecks tries to run the post-check lifecycle hook for all containers included by the current filter.
|
||||
func ExecutePostChecks(client container.Client, params types.UpdateParams) {
|
||||
containers, err := client.ListContainers(params.Filter)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
for _, currentContainer := range containers {
|
||||
ExecutePostCheckCommand(client, currentContainer)
|
||||
}
|
||||
}
|
||||
type ExecCommandFunc func(client container.Client, container types.Container)
|
||||
|
||||
// ExecutePreCheckCommand tries to run the pre-check lifecycle hook for a single container.
|
||||
func ExecutePreCheckCommand(client container.Client, container types.Container) {
|
||||
clog := log.WithField("container", container.Name())
|
||||
command := container.GetLifecyclePreCheckCommand()
|
||||
if len(command) == 0 {
|
||||
clog.Debug("No pre-check command supplied. Skipping")
|
||||
return
|
||||
}
|
||||
|
||||
clog.Debug("Executing pre-check command.")
|
||||
_, err := client.ExecuteCommand(container.ID(), command, 1)
|
||||
err := ExecuteLifeCyclePhaseCommand(types.PreCheck, client, container)
|
||||
if err != nil {
|
||||
clog.Error(err)
|
||||
log.WithField("container", container.Name()).Error(err)
|
||||
}
|
||||
}
|
||||
|
||||
// ExecutePostCheckCommand tries to run the post-check lifecycle hook for a single container.
|
||||
func ExecutePostCheckCommand(client container.Client, container types.Container) {
|
||||
clog := log.WithField("container", container.Name())
|
||||
command := container.GetLifecyclePostCheckCommand()
|
||||
if len(command) == 0 {
|
||||
clog.Debug("No post-check command supplied. Skipping")
|
||||
return
|
||||
}
|
||||
|
||||
clog.Debug("Executing post-check command.")
|
||||
_, err := client.ExecuteCommand(container.ID(), command, 1)
|
||||
err := ExecuteLifeCyclePhaseCommand(types.PostCheck, client, container)
|
||||
if err != nil {
|
||||
clog.Error(err)
|
||||
log.WithField("container", container.Name()).Error(err)
|
||||
}
|
||||
}
|
||||
|
||||
// ExecutePreUpdateCommand tries to run the pre-update lifecycle hook for a single container.
|
||||
func ExecutePreUpdateCommand(client container.Client, container types.Container) (SkipUpdate bool, err error) {
|
||||
timeout := container.PreUpdateTimeout()
|
||||
command := container.GetLifecyclePreUpdateCommand()
|
||||
clog := log.WithField("container", container.Name())
|
||||
|
||||
if len(command) == 0 {
|
||||
clog.Debug("No pre-update command supplied. Skipping")
|
||||
return false, nil
|
||||
}
|
||||
|
||||
if !container.IsRunning() || container.IsRestarting() {
|
||||
clog.Debug("Container is not running. Skipping pre-update command.")
|
||||
return false, nil
|
||||
}
|
||||
|
||||
clog.Debug("Executing pre-update command.")
|
||||
return client.ExecuteCommand(container.ID(), command, timeout)
|
||||
func ExecutePreUpdateCommand(client container.Client, container types.Container) error {
|
||||
return ExecuteLifeCyclePhaseCommand(types.PreUpdate, client, container)
|
||||
}
|
||||
|
||||
// ExecutePostUpdateCommand tries to run the post-update lifecycle hook for a single container.
|
||||
func ExecutePostUpdateCommand(client container.Client, newContainerID types.ContainerID) {
|
||||
newContainer, err := client.GetContainer(newContainerID)
|
||||
timeout := newContainer.PostUpdateTimeout()
|
||||
|
||||
if err != nil {
|
||||
log.WithField("containerID", newContainerID.ShortID()).Error(err)
|
||||
return
|
||||
}
|
||||
clog := log.WithField("container", newContainer.Name())
|
||||
|
||||
command := newContainer.GetLifecyclePostUpdateCommand()
|
||||
if len(command) == 0 {
|
||||
clog.Debug("No post-update command supplied. Skipping")
|
||||
return
|
||||
}
|
||||
|
||||
clog.Debug("Executing post-update command.")
|
||||
_, err = client.ExecuteCommand(newContainerID, command, timeout)
|
||||
|
||||
err = ExecuteLifeCyclePhaseCommand(types.PostUpdate, client, newContainer)
|
||||
if err != nil {
|
||||
clog.Error(err)
|
||||
log.WithField("container", newContainer.Name()).Error(err)
|
||||
}
|
||||
}
|
||||
|
||||
// ExecuteLifeCyclePhaseCommand tries to run the corresponding lifecycle hook for a single container.
|
||||
func ExecuteLifeCyclePhaseCommand(phase types.LifecyclePhase, client container.Client, container types.Container) error {
|
||||
|
||||
timeout := container.GetLifecycleTimeout(phase)
|
||||
command := container.GetLifecycleCommand(phase)
|
||||
clog := log.WithField("container", container.Name())
|
||||
|
||||
if len(command) == 0 {
|
||||
clog.Debugf("No %v command supplied. Skipping", phase)
|
||||
return nil
|
||||
}
|
||||
|
||||
if !container.IsRunning() || container.IsRestarting() {
|
||||
clog.Debugf("Container is not running. Skipping %v command.", phase)
|
||||
return nil
|
||||
}
|
||||
|
||||
clog.Debugf("Executing %v command.", phase)
|
||||
return client.ExecuteCommand(container.ID(), command, timeout)
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue