summaryrefslogtreecommitdiff
path: root/pkg/autoupdate/autoupdate.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/autoupdate/autoupdate.go')
-rw-r--r--pkg/autoupdate/autoupdate.go57
1 files changed, 32 insertions, 25 deletions
diff --git a/pkg/autoupdate/autoupdate.go b/pkg/autoupdate/autoupdate.go
index c792ee4e9..7bda0ac27 100644
--- a/pkg/autoupdate/autoupdate.go
+++ b/pkg/autoupdate/autoupdate.go
@@ -53,6 +53,15 @@ var supportedPolicies = map[string]Policy{
// policyMapper is used for tying a container to it's autoupdate policy
type policyMapper map[Policy][]*libpod.Container
+// updater includes shared state for auto-updating one or more containers.
+type updater struct {
+ conn *dbus.Conn
+ imageToPolicyMapper map[string]policyMapper
+ options *entities.AutoUpdateOptions
+ updatedRawImages map[string]bool
+ runtime *libpod.Runtime
+}
+
// LookupPolicy looks up the corresponding Policy for the specified
// string. If none is found, an errors is returned including the list of
// supported policies.
@@ -116,12 +125,22 @@ func ValidateImageReference(imageName string) error {
// It returns a slice of successfully restarted systemd units and a slice of
// errors encountered during auto update.
func AutoUpdate(ctx context.Context, runtime *libpod.Runtime, options entities.AutoUpdateOptions) ([]*entities.AutoUpdateReport, []error) {
+ auto := updater{
+ options: &options,
+ runtime: runtime,
+ updatedRawImages: make(map[string]bool),
+ }
+
// Create a map from `image ID -> []*Container`.
- containerMap, errs := imageContainersMap(runtime)
- if len(containerMap) == 0 {
+ if errs := auto.imageContainersMap(); len(errs) > 0 {
return nil, errs
}
+ // Nothing to do.
+ if len(auto.imageToPolicyMapper) == 0 {
+ return nil, nil
+ }
+
// Create a map from `image ID -> *libimage.Image` for image lookups.
listOptions := &libimage.ListImagesOptions{
Filters: []string{"readonly=false"},
@@ -142,19 +161,14 @@ func AutoUpdate(ctx context.Context, runtime *libpod.Runtime, options entities.A
return nil, []error{err}
}
defer conn.Close()
+ auto.conn = conn
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
- for imageID, policyMapper := range containerMap {
+ var errs []error
+ for imageID, policyMapper := range auto.imageToPolicyMapper {
image, exists := imageMap[imageID]
if !exists {
errs = append(errs, fmt.Errorf("container image ID %q not found in local storage", imageID))
@@ -185,14 +199,6 @@ func AutoUpdate(ctx context.Context, runtime *libpod.Runtime, options entities.A
return allReports, errs
}
-// 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()
@@ -353,14 +359,15 @@ func (u *updater) restartSystemdUnit(ctx context.Context, ctr *libpod.Container,
// imageContainersMap generates a map[image ID] -> [containers using the image]
// of all containers with a valid auto-update policy.
-func imageContainersMap(runtime *libpod.Runtime) (map[string]policyMapper, []error) {
- allContainers, err := runtime.GetAllContainers()
+func (u *updater) imageContainersMap() []error {
+ allContainers, err := u.runtime.GetAllContainers()
if err != nil {
- return nil, []error{err}
+ return []error{err}
}
+ u.imageToPolicyMapper = make(map[string]policyMapper)
+
errors := []error{}
- containerMap := make(map[string]policyMapper)
for _, ctr := range allContainers {
state, err := ctr.State()
if err != nil {
@@ -390,17 +397,17 @@ func imageContainersMap(runtime *libpod.Runtime) (map[string]policyMapper, []err
continue
} else {
id, _ := ctr.Image()
- policyMap, exists := containerMap[id]
+ policyMap, exists := u.imageToPolicyMapper[id]
if !exists {
policyMap = make(map[Policy][]*libpod.Container)
}
policyMap[policy] = append(policyMap[policy], ctr)
- containerMap[id] = policyMap
+ u.imageToPolicyMapper[id] = policyMap
// Now we know that `ctr` is configured for auto updates.
}
}
- return containerMap, errors
+ return errors
}
// getAuthfilePath returns an authfile path, if set. The authfile label in the