aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pkg/autoupdate/autoupdate.go60
1 files changed, 37 insertions, 23 deletions
diff --git a/pkg/autoupdate/autoupdate.go b/pkg/autoupdate/autoupdate.go
index 8d9991622..c792ee4e9 100644
--- a/pkg/autoupdate/autoupdate.go
+++ b/pkg/autoupdate/autoupdate.go
@@ -145,9 +145,15 @@ func AutoUpdate(ctx context.Context, runtime *libpod.Runtime, options entities.A
runtime.NewSystemEvent(events.AutoUpdate)
+ auto := updater{
+ conn: conn,
+ options: &options,
+ runtime: runtime,
+ updatedRawImages: make(map[string]bool),
+ }
+
// Update all images/container according to their auto-update policy.
var allReports []*entities.AutoUpdateReport
- updatedRawImages := make(map[string]bool)
for imageID, policyMapper := range containerMap {
image, exists := imageMap[imageID]
if !exists {
@@ -156,7 +162,7 @@ func AutoUpdate(ctx context.Context, runtime *libpod.Runtime, options entities.A
}
for _, ctr := range policyMapper[PolicyRegistryImage] {
- report, err := autoUpdateRegistry(ctx, image, ctr, updatedRawImages, &options, conn, runtime)
+ report, err := auto.updateRegistry(ctx, image, ctr)
if err != nil {
errs = append(errs, err)
}
@@ -166,7 +172,7 @@ func AutoUpdate(ctx context.Context, runtime *libpod.Runtime, options entities.A
}
for _, ctr := range policyMapper[PolicyLocalImage] {
- report, err := autoUpdateLocally(ctx, image, ctr, &options, conn, runtime)
+ report, err := auto.updateLocally(ctx, image, ctr)
if err != nil {
errs = append(errs, err)
}
@@ -179,8 +185,16 @@ func AutoUpdate(ctx context.Context, runtime *libpod.Runtime, options entities.A
return allReports, errs
}
-// autoUpdateRegistry updates the image/container according to the "registry" policy.
-func autoUpdateRegistry(ctx context.Context, image *libimage.Image, ctr *libpod.Container, updatedRawImages map[string]bool, options *entities.AutoUpdateOptions, conn *dbus.Conn, runtime *libpod.Runtime) (*entities.AutoUpdateReport, error) {
+// updater includes shared state for auto-updating one or more containers.
+type updater struct {
+ conn *dbus.Conn
+ options *entities.AutoUpdateOptions
+ updatedRawImages map[string]bool
+ runtime *libpod.Runtime
+}
+
+// updateRegistry updates the image/container according to the "registry" policy.
+func (u *updater) updateRegistry(ctx context.Context, image *libimage.Image, ctr *libpod.Container) (*entities.AutoUpdateReport, error) {
cid := ctr.ID()
rawImageName := ctr.RawImageName()
if rawImageName == "" {
@@ -202,16 +216,16 @@ func autoUpdateRegistry(ctx context.Context, image *libimage.Image, ctr *libpod.
Updated: "failed",
}
- if _, updated := updatedRawImages[rawImageName]; updated {
+ if _, updated := u.updatedRawImages[rawImageName]; updated {
logrus.Infof("Auto-updating container %q using registry image %q", cid, rawImageName)
- if err := restartSystemdUnit(ctx, ctr, unit, conn); err != nil {
+ if err := u.restartSystemdUnit(ctx, ctr, unit); err != nil {
return report, err
}
report.Updated = "true"
return report, nil
}
- authfile := getAuthfilePath(ctr, options)
+ authfile := getAuthfilePath(ctr, u.options)
needsUpdate, err := newerRemoteImageAvailable(ctx, image, rawImageName, authfile)
if err != nil {
return report, fmt.Errorf("registry auto-updating container %q: image check for %q failed: %w", cid, rawImageName, err)
@@ -222,24 +236,24 @@ func autoUpdateRegistry(ctx context.Context, image *libimage.Image, ctr *libpod.
return report, nil
}
- if options.DryRun {
+ if u.options.DryRun {
report.Updated = "pending"
return report, nil
}
- if _, err := updateImage(ctx, runtime, rawImageName, authfile); err != nil {
+ if _, err := updateImage(ctx, u.runtime, rawImageName, authfile); err != nil {
return report, fmt.Errorf("registry auto-updating container %q: image update for %q failed: %w", cid, rawImageName, err)
}
- updatedRawImages[rawImageName] = true
+ u.updatedRawImages[rawImageName] = true
logrus.Infof("Auto-updating container %q using registry image %q", cid, rawImageName)
- updateErr := restartSystemdUnit(ctx, ctr, unit, conn)
+ updateErr := u.restartSystemdUnit(ctx, ctr, unit)
if updateErr == nil {
report.Updated = "true"
return report, nil
}
- if !options.Rollback {
+ if !u.options.Rollback {
return report, updateErr
}
@@ -247,7 +261,7 @@ func autoUpdateRegistry(ctx context.Context, image *libimage.Image, ctr *libpod.
if err := image.Tag(rawImageName); err != nil {
return report, fmt.Errorf("falling back to previous image: %w", err)
}
- if err := restartSystemdUnit(ctx, ctr, unit, conn); err != nil {
+ if err := u.restartSystemdUnit(ctx, ctr, unit); err != nil {
return report, fmt.Errorf("restarting unit with old image during fallback: %w", err)
}
@@ -255,8 +269,8 @@ func autoUpdateRegistry(ctx context.Context, image *libimage.Image, ctr *libpod.
return report, nil
}
-// autoUpdateRegistry updates the image/container according to the "local" policy.
-func autoUpdateLocally(ctx context.Context, image *libimage.Image, ctr *libpod.Container, options *entities.AutoUpdateOptions, conn *dbus.Conn, runtime *libpod.Runtime) (*entities.AutoUpdateReport, error) {
+// updateRegistry updates the image/container according to the "local" policy.
+func (u *updater) updateLocally(ctx context.Context, image *libimage.Image, ctr *libpod.Container) (*entities.AutoUpdateReport, error) {
cid := ctr.ID()
rawImageName := ctr.RawImageName()
if rawImageName == "" {
@@ -278,7 +292,7 @@ func autoUpdateLocally(ctx context.Context, image *libimage.Image, ctr *libpod.C
Updated: "failed",
}
- needsUpdate, err := newerLocalImageAvailable(runtime, image, rawImageName)
+ needsUpdate, err := newerLocalImageAvailable(u.runtime, image, rawImageName)
if err != nil {
return report, fmt.Errorf("locally auto-updating container %q: image check for %q failed: %w", cid, rawImageName, err)
}
@@ -288,19 +302,19 @@ func autoUpdateLocally(ctx context.Context, image *libimage.Image, ctr *libpod.C
return report, nil
}
- if options.DryRun {
+ if u.options.DryRun {
report.Updated = "pending"
return report, nil
}
logrus.Infof("Auto-updating container %q using local image %q", cid, rawImageName)
- updateErr := restartSystemdUnit(ctx, ctr, unit, conn)
+ updateErr := u.restartSystemdUnit(ctx, ctr, unit)
if updateErr == nil {
report.Updated = "true"
return report, nil
}
- if !options.Rollback {
+ if !u.options.Rollback {
return report, updateErr
}
@@ -308,7 +322,7 @@ func autoUpdateLocally(ctx context.Context, image *libimage.Image, ctr *libpod.C
if err := image.Tag(rawImageName); err != nil {
return report, fmt.Errorf("falling back to previous image: %w", err)
}
- if err := restartSystemdUnit(ctx, ctr, unit, conn); err != nil {
+ if err := u.restartSystemdUnit(ctx, ctr, unit); err != nil {
return report, fmt.Errorf("restarting unit with old image during fallback: %w", err)
}
@@ -317,9 +331,9 @@ func autoUpdateLocally(ctx context.Context, image *libimage.Image, ctr *libpod.C
}
// restartSystemdUnit restarts the systemd unit the container is running in.
-func restartSystemdUnit(ctx context.Context, ctr *libpod.Container, unit string, conn *dbus.Conn) error {
+func (u *updater) restartSystemdUnit(ctx context.Context, ctr *libpod.Container, unit string) error {
restartChan := make(chan string)
- if _, err := conn.RestartUnitContext(ctx, unit, "replace", restartChan); err != nil {
+ if _, err := u.conn.RestartUnitContext(ctx, unit, "replace", restartChan); err != nil {
return fmt.Errorf("auto-updating container %q: restarting systemd unit %q failed: %w", ctr.ID(), unit, err)
}