The following pull request was submitted through Github.
It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/3288

This e-mail was sent by the LXC bot, direct replies will not reach the author
unless they happen to be subscribed to this list.

=== Description (from pull-request) ===
Extract the code to update a single image from autoUpdateImages, so that the logic can be reused.
From 7bb3b558ae8ee8b4a7c35b0f72e562ec198e12b4 Mon Sep 17 00:00:00 2001
From: Alberto Donato <[email protected]>
Date: Fri, 5 May 2017 12:49:38 +0200
Subject: [PATCH] Split autoUpdateImage function.

Signed-off-by: Alberto Donato <[email protected]>
---
 lxd/images.go | 158 +++++++++++++++++++++++++++++++---------------------------
 1 file changed, 84 insertions(+), 74 deletions(-)

diff --git a/lxd/images.go b/lxd/images.go
index 1bcd5d9..5e47e30 100644
--- a/lxd/images.go
+++ b/lxd/images.go
@@ -880,10 +880,10 @@ func autoUpdateImages(d *Daemon) {
                return
        }
 
-       for _, fp := range images {
-               id, info, err := dbImageGet(d.db, fp, false, true)
+       for _, fingerprint := range images {
+               id, info, err := dbImageGet(d.db, fingerprint, false, true)
                if err != nil {
-                       logger.Error("Error loading image", log.Ctx{"err": err, 
"fp": fp})
+                       logger.Error("Error loading image", log.Ctx{"err": err, 
"fp": fingerprint})
                        continue
                }
 
@@ -891,100 +891,110 @@ func autoUpdateImages(d *Daemon) {
                        continue
                }
 
-               _, source, err := dbImageSourceGet(d.db, id)
+               autoUpdateImage(d, fingerprint, id, info)
+       }
+
+       logger.Infof("Done updating images")
+}
+
+// Update a single image
+func autoUpdateImage(d *Daemon, fingerprint string, id int, info *api.Image) {
+       _, source, err := dbImageSourceGet(d.db, id)
+       if err != nil {
+               logger.Error("Error getting source image", log.Ctx{"err": err, 
"fp": fingerprint})
+               return
+       }
+
+       // Get the IDs of all storage pools on which a storage volume
+       // for the requested image currently exists.
+       poolIDs, err := dbImageGetPools(d.db, fingerprint)
+       if err != nil {
+               logger.Error("Error getting image pools", log.Ctx{"err": err, 
"fp": fingerprint})
+               return
+       }
+
+       // Translate the IDs to poolNames.
+       poolNames, err := dbImageGetPoolNamesFromIDs(d.db, poolIDs)
+       if err != nil {
+               logger.Error("Error getting image pools", log.Ctx{"err": err, 
"fp": fingerprint})
+               return
+       }
+
+       // If no optimized pools at least update the base store
+       if len(poolNames) == 0 {
+               poolNames = append(poolNames, "")
+       }
+
+       logger.Debug("Processing image", log.Ctx{"fp": fingerprint, "server": 
source.Server, "protocol": source.Protocol, "alias": source.Alias})
+
+       // Update the image on each pool where it currently exists.
+       hash := fingerprint
+       for _, poolName := range poolNames {
+               newInfo, err := d.ImageDownload(nil, source.Server, 
source.Protocol, "", "", source.Alias, false, true, poolName)
                if err != nil {
+                       logger.Error("Failed to update the image", 
log.Ctx{"err": err, "fp": fingerprint})
                        continue
                }
 
-               // Get the IDs of all storage pools on which a storage volume
-               // for the requested image currently exists.
-               poolIDs, err := dbImageGetPools(d.db, fp)
-               if err != nil {
+               hash = newInfo.Fingerprint
+               if hash == fingerprint {
+                       logger.Debug("Already up to date", log.Ctx{"fp": 
fingerprint})
                        continue
                }
 
-               // Translate the IDs to poolNames.
-               poolNames, err := dbImageGetPoolNamesFromIDs(d.db, poolIDs)
+               newId, _, err := dbImageGet(d.db, hash, false, true)
                if err != nil {
+                       logger.Error("Error loading image", log.Ctx{"err": err, 
"fp": hash})
                        continue
                }
 
-               // If no optimized pools at least update the base store
-               if len(poolNames) == 0 {
-                       poolNames = append(poolNames, "")
-               }
-
-               logger.Debug("Processing image", log.Ctx{"fp": fp, "server": 
source.Server, "protocol": source.Protocol, "alias": source.Alias})
-
-               // Update the image on each pool where it currently exists.
-               hash := fp
-               for _, poolName := range poolNames {
-                       newInfo, err := d.ImageDownload(nil, source.Server, 
source.Protocol, "", "", source.Alias, false, true, poolName)
-                       if err != nil {
-                               logger.Error("Failed to update the image", 
log.Ctx{"err": err, "fp": fp})
-                               continue
-                       }
-
-                       hash = newInfo.Fingerprint
-                       if hash == fp {
-                               logger.Debug("Already up to date", 
log.Ctx{"fp": fp})
-                               continue
-                       }
-
-                       newId, _, err := dbImageGet(d.db, hash, false, true)
-                       if err != nil {
-                               logger.Error("Error loading image", 
log.Ctx{"err": err, "fp": hash})
-                               continue
-                       }
-
-                       err = dbImageLastAccessUpdate(d.db, hash, 
info.LastUsedAt)
-                       if err != nil {
-                               logger.Error("Error setting last use date", 
log.Ctx{"err": err, "fp": hash})
-                               continue
-                       }
-
-                       err = dbImageAliasesMove(d.db, id, newId)
-                       if err != nil {
-                               logger.Error("Error moving aliases", 
log.Ctx{"err": err, "fp": hash})
-                               continue
-                       }
-
-                       err = doDeleteImageFromPool(d, fp, poolName)
-                       if err != nil {
-                               logger.Error("Error deleting image", 
log.Ctx{"err": err, "fp": fp})
-                       }
+               err = dbImageLastAccessUpdate(d.db, hash, info.LastUsedAt)
+               if err != nil {
+                       logger.Error("Error setting last use date", 
log.Ctx{"err": err, "fp": hash})
+                       continue
                }
 
-               // Image didn't change, move on
-               if hash == fp {
+               err = dbImageAliasesMove(d.db, id, newId)
+               if err != nil {
+                       logger.Error("Error moving aliases", log.Ctx{"err": 
err, "fp": hash})
                        continue
                }
 
-               // Remove main image file.
-               fname := shared.VarPath("images", fp)
-               if shared.PathExists(fname) {
-                       err = os.Remove(fname)
-                       if err != nil {
-                               logger.Debugf("Error deleting image file %s: 
%s", fname, err)
-                       }
+               err = doDeleteImageFromPool(d, fingerprint, poolName)
+               if err != nil {
+                       logger.Error("Error deleting image", log.Ctx{"err": 
err, "fp": fingerprint})
                }
+       }
 
-               // Remove the rootfs file for the image.
-               fname = shared.VarPath("images", fp) + ".rootfs"
-               if shared.PathExists(fname) {
-                       err = os.Remove(fname)
-                       if err != nil {
-                               logger.Debugf("Error deleting image file %s: 
%s", fname, err)
-                       }
+       // Image didn't change, nothing to do.
+       if hash == fingerprint {
+               return
+       }
+
+       // Remove main image file.
+       fname := shared.VarPath("images", fingerprint)
+       if shared.PathExists(fname) {
+               err = os.Remove(fname)
+               if err != nil {
+                       logger.Debugf("Error deleting image file %s: %s", 
fname, err)
                }
+       }
 
-               // Remove the database entry for the image.
-               if err = dbImageDelete(d.db, id); err != nil {
-                       logger.Debugf("Error deleting image from database %s: 
%s", fname, err)
+       // Remove the rootfs file for the image.
+       fname = shared.VarPath("images", fingerprint) + ".rootfs"
+       if shared.PathExists(fname) {
+               err = os.Remove(fname)
+               if err != nil {
+                       logger.Debugf("Error deleting image file %s: %s", 
fname, err)
                }
        }
 
-       logger.Infof("Done updating images")
+       // Remove the database entry for the image.
+       if err = dbImageDelete(d.db, id); err != nil {
+               logger.Debugf("Error deleting image from database %s: %s", 
fname, err)
+       }
+
+       return
 }
 
 func pruneExpiredImages(d *Daemon) {
_______________________________________________
lxc-devel mailing list
[email protected]
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to