The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/7892
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) === This is to accommodate custom future custom volume backups that will go in `shared.VarPath("backups", "custom")` without conflict.
From 13cc075b6270508f205779751273641cf4f7157c Mon Sep 17 00:00:00 2001 From: Thomas Parrott <thomas.parr...@canonical.com> Date: Fri, 18 Sep 2020 16:05:50 +0100 Subject: [PATCH 1/9] lxd/backup: Adds WorkingDirPrefix constant To link all variations that use temporary working directories in the codebase. Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com> --- lxd/backup/backup.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lxd/backup/backup.go b/lxd/backup/backup.go index 5d20ac00f9..b4dd5736fa 100644 --- a/lxd/backup/backup.go +++ b/lxd/backup/backup.go @@ -17,6 +17,9 @@ import ( "github.com/lxc/lxd/shared/api" ) +// WorkingDirPrefix is used when temporary working directories are needed. +const WorkingDirPrefix = "lxd_backup_" + // Instance represents the backup relevant subset of a LXD instance. // This is used rather than instance.Instance to avoid import loops. type Instance interface { From fb9935e94507258e39680b6c78906da86c672781 Mon Sep 17 00:00:00 2001 From: Thomas Parrott <thomas.parr...@canonical.com> Date: Fri, 18 Sep 2020 16:06:47 +0100 Subject: [PATCH 2/9] lxd: backup.WorkingDirPrefix usage Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com> --- lxd/instances_post.go | 4 ++-- lxd/storage/drivers/driver_btrfs_volumes.go | 2 +- lxd/storage/drivers/driver_zfs_volumes.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lxd/instances_post.go b/lxd/instances_post.go index b3a83e89b8..cbe58a1bba 100644 --- a/lxd/instances_post.go +++ b/lxd/instances_post.go @@ -550,7 +550,7 @@ func createFromBackup(d *Daemon, project string, data io.Reader, pool string) re defer revert.Fail() // Create temporary file to store uploaded backup data. - backupFile, err := ioutil.TempFile(shared.VarPath("backups"), "lxd_backup_") + backupFile, err := ioutil.TempFile(shared.VarPath("backups"), fmt.Sprintf("%s_", backup.WorkingDirPrefix)) if err != nil { return response.InternalError(err) } @@ -575,7 +575,7 @@ func createFromBackup(d *Daemon, project string, data io.Reader, pool string) re decomArgs := append(decomArgs, backupFile.Name()) // Create temporary file to store the decompressed tarball in. - tarFile, err := ioutil.TempFile(shared.VarPath("backups"), "lxd_backup_decompress_") + tarFile, err := ioutil.TempFile(shared.VarPath("backups"), fmt.Sprintf("%s_decompress_", backup.WorkingDirPrefix)) if err != nil { return response.InternalError(err) } diff --git a/lxd/storage/drivers/driver_btrfs_volumes.go b/lxd/storage/drivers/driver_btrfs_volumes.go index 222efcd031..ebe7dc5334 100644 --- a/lxd/storage/drivers/driver_btrfs_volumes.go +++ b/lxd/storage/drivers/driver_btrfs_volumes.go @@ -1029,7 +1029,7 @@ func (d *btrfs) BackupVolume(vol Volume, tarWriter *instancewriter.InstanceTarWr // Create temporary file to store output of btrfs send. backupsPath := shared.VarPath("backups") - tmpFile, err := ioutil.TempFile(backupsPath, "lxd_backup_btrfs") + tmpFile, err := ioutil.TempFile(backupsPath, fmt.Sprintf("%s_btrfs", backup.WorkingDirPrefix)) if err != nil { return errors.Wrapf(err, "Failed to open temporary file for BTRFS backup") } diff --git a/lxd/storage/drivers/driver_zfs_volumes.go b/lxd/storage/drivers/driver_zfs_volumes.go index 5c548061e0..5cae1d92d1 100644 --- a/lxd/storage/drivers/driver_zfs_volumes.go +++ b/lxd/storage/drivers/driver_zfs_volumes.go @@ -1390,7 +1390,7 @@ func (d *zfs) BackupVolume(vol Volume, tarWriter *instancewriter.InstanceTarWrit // Create temporary file to store output of ZFS send. backupsPath := shared.VarPath("backups") - tmpFile, err := ioutil.TempFile(backupsPath, "lxd_backup_zfs") + tmpFile, err := ioutil.TempFile(backupsPath, fmt.Sprintf("%s_zfs", backup.WorkingDirPrefix)) if err != nil { return errors.Wrapf(err, "Failed to open temporary file for ZFS backup") } From c461d50b923bc6151fa926afc665aa5158eef9b0 Mon Sep 17 00:00:00 2001 From: Thomas Parrott <thomas.parr...@canonical.com> Date: Fri, 18 Sep 2020 15:25:42 +0100 Subject: [PATCH 3/9] lxd/backup: Updates backupCreate to store backups in backups/instances Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com> --- lxd/backup.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lxd/backup.go b/lxd/backup.go index a938311e14..3014912073 100644 --- a/lxd/backup.go +++ b/lxd/backup.go @@ -83,7 +83,7 @@ func backupCreate(s *state.State, args db.InstanceBackup, sourceInst instance.In } // Create the target path if needed. - backupsPath := shared.VarPath("backups", project.Instance(sourceInst.Project(), sourceInst.Name())) + backupsPath := shared.VarPath("backups", "instances", project.Instance(sourceInst.Project(), sourceInst.Name())) if !shared.PathExists(backupsPath) { err := os.MkdirAll(backupsPath, 0700) if err != nil { @@ -93,7 +93,7 @@ func backupCreate(s *state.State, args db.InstanceBackup, sourceInst instance.In revert.Add(func() { os.Remove(backupsPath) }) } - target := shared.VarPath("backups", project.Instance(sourceInst.Project(), b.Name())) + target := shared.VarPath("backups", "instances", project.Instance(sourceInst.Project(), b.Name())) // Setup the tarball writer. logger.Debug("Opening backup tarball for writing", log.Ctx{"path": target}) From 61ea832674555527b831fee5986d4cd7e2f7a34c Mon Sep 17 00:00:00 2001 From: Thomas Parrott <thomas.parr...@canonical.com> Date: Fri, 18 Sep 2020 15:26:34 +0100 Subject: [PATCH 4/9] lxd/backup: Updates Rename to support new backup location Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com> --- lxd/backup/backup.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lxd/backup/backup.go b/lxd/backup/backup.go index b4dd5736fa..5f924d3a6e 100644 --- a/lxd/backup/backup.go +++ b/lxd/backup/backup.go @@ -179,13 +179,13 @@ func (b *Backup) OptimizedStorage() bool { return b.optimizedStorage } -// Rename renames a container backup +// Rename renames an instance backup. func (b *Backup) Rename(newName string) error { - oldBackupPath := shared.VarPath("backups", project.Instance(b.instance.Project(), b.name)) - newBackupPath := shared.VarPath("backups", project.Instance(b.instance.Project(), newName)) + oldBackupPath := shared.VarPath("backups", "instances", project.Instance(b.instance.Project(), b.name)) + newBackupPath := shared.VarPath("backups", "instances", project.Instance(b.instance.Project(), newName)) - // Create the new backup path - backupsPath := shared.VarPath("backups", project.Instance(b.instance.Project(), b.instance.Name())) + // Create the new backup path. + backupsPath := shared.VarPath("backups", "instances", project.Instance(b.instance.Project(), b.instance.Name())) if !shared.PathExists(backupsPath) { err := os.MkdirAll(backupsPath, 0700) if err != nil { From 620630dc7d346357cd84cff922636a615668e359 Mon Sep 17 00:00:00 2001 From: Thomas Parrott <thomas.parr...@canonical.com> Date: Fri, 18 Sep 2020 15:26:52 +0100 Subject: [PATCH 5/9] lxd/backup: Rename comment ending Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com> --- lxd/backup/backup.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lxd/backup/backup.go b/lxd/backup/backup.go index 5f924d3a6e..ef1c0d18d4 100644 --- a/lxd/backup/backup.go +++ b/lxd/backup/backup.go @@ -193,13 +193,13 @@ func (b *Backup) Rename(newName string) error { } } - // Rename the backup directory + // Rename the backup directory. err := os.Rename(oldBackupPath, newBackupPath) if err != nil { return err } - // Check if we can remove the container directory + // Check if we can remove the instance directory. empty, _ := shared.PathIsEmpty(backupsPath) if empty { err := os.Remove(backupsPath) @@ -208,7 +208,7 @@ func (b *Backup) Rename(newName string) error { } } - // Rename the database record + // Rename the database record. err = b.state.Cluster.RenameInstanceBackup(b.name, newName) if err != nil { return err From 5d740dcd5ecc254d92742d2245586f9e6f9619be Mon Sep 17 00:00:00 2001 From: Thomas Parrott <thomas.parr...@canonical.com> Date: Fri, 18 Sep 2020 15:27:14 +0100 Subject: [PATCH 6/9] lxd/backup: Updates DoBackupDelete to handle new backup location Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com> --- lxd/backup/backup.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lxd/backup/backup.go b/lxd/backup/backup.go index ef1c0d18d4..2147d717c8 100644 --- a/lxd/backup/backup.go +++ b/lxd/backup/backup.go @@ -235,10 +235,10 @@ func (b *Backup) Render() *api.InstanceBackup { } // DoBackupDelete deletes a backup. -func DoBackupDelete(s *state.State, projectName, backupName, containerName string) error { - backupPath := shared.VarPath("backups", project.Instance(projectName, backupName)) +func DoBackupDelete(s *state.State, projectName, backupName, instanceName string) error { + backupPath := shared.VarPath("backups", "instances", project.Instance(projectName, backupName)) - // Delete the on-disk data + // Delete the on-disk data. if shared.PathExists(backupPath) { err := os.RemoveAll(backupPath) if err != nil { @@ -246,8 +246,8 @@ func DoBackupDelete(s *state.State, projectName, backupName, containerName strin } } - // Check if we can remove the container directory - backupsPath := shared.VarPath("backups", project.Instance(projectName, containerName)) + // Check if we can remove the instance directory. + backupsPath := shared.VarPath("backups", "instances", project.Instance(projectName, instanceName)) empty, _ := shared.PathIsEmpty(backupsPath) if empty { err := os.Remove(backupsPath) From 5b483afe3786f6abc0a8dd4c71283341c8cac7f9 Mon Sep 17 00:00:00 2001 From: Thomas Parrott <thomas.parr...@canonical.com> Date: Fri, 18 Sep 2020 15:27:28 +0100 Subject: [PATCH 7/9] lxd/backup: DoBackupDelete comment ending Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com> --- lxd/backup/backup.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lxd/backup/backup.go b/lxd/backup/backup.go index 2147d717c8..d20b2a7b3d 100644 --- a/lxd/backup/backup.go +++ b/lxd/backup/backup.go @@ -256,7 +256,7 @@ func DoBackupDelete(s *state.State, projectName, backupName, instanceName string } } - // Remove the database record + // Remove the database record. err := s.Cluster.DeleteInstanceBackup(backupName) if err != nil { return err From f7610f06f044e0c090010f534974ba266f90bfea Mon Sep 17 00:00:00 2001 From: Thomas Parrott <thomas.parr...@canonical.com> Date: Fri, 18 Sep 2020 15:27:43 +0100 Subject: [PATCH 8/9] lxd/instance/backup: Updates containerBackupExportGet to support new backup location Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com> --- lxd/instance_backup.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lxd/instance_backup.go b/lxd/instance_backup.go index f4fd540316..4f9dfd8011 100644 --- a/lxd/instance_backup.go +++ b/lxd/instance_backup.go @@ -351,7 +351,7 @@ func containerBackupExportGet(d *Daemon, r *http.Request) response.Response { } ent := response.FileResponseEntry{ - Path: shared.VarPath("backups", project.Instance(proj, backup.Name())), + Path: shared.VarPath("backups", "instances", project.Instance(proj, backup.Name())), } return response.FileResponse(r, []response.FileResponseEntry{ent}, nil, false) From 68ca95c7cb50a3267286a4e02b7c7893791e2b0d Mon Sep 17 00:00:00 2001 From: Thomas Parrott <thomas.parr...@canonical.com> Date: Fri, 18 Sep 2020 15:55:39 +0100 Subject: [PATCH 9/9] lxd/patches: Adds patchMoveBackupsInstances to move backups into backups/instances dir Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com> --- lxd/patches.go | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/lxd/patches.go b/lxd/patches.go index a5d849721f..2ac752323e 100644 --- a/lxd/patches.go +++ b/lxd/patches.go @@ -99,6 +99,7 @@ var patches = []patch{ {name: "storage_lvm_skipactivation", stage: patchPostDaemonStorage, run: patchGenericStorage}, {name: "clustering_drop_database_role", stage: patchPostDaemonStorage, run: patchClusteringDropDatabaseRole}, {name: "network_clear_bridge_volatile_hwaddr", stage: patchPostDaemonStorage, run: patchNetworkCearBridgeVolatileHwaddr}, + {name: "move_backups_instances", stage: patchPostDaemonStorage, run: patchMoveBackupsInstances}, } type patch struct { @@ -162,6 +163,42 @@ func patchesApply(d *Daemon, stage patchStage) error { } // Patches begin here + +// Moves backups from shared.VarPath("backups") to shared.VarPath("backups", "instances"). +func patchMoveBackupsInstances(name string, d *Daemon) error { + if !shared.PathExists(shared.VarPath("backups")) { + return nil // Nothing to do, no backups directory. + } + + backupsPath := shared.VarPath("backups", "instances") + + err := os.MkdirAll(backupsPath, 0700) + if err != nil { + return errors.Wrapf(err, "Failed creating instances backup directory %q", backupsPath) + } + + backups, err := ioutil.ReadDir(shared.VarPath("backups")) + if err != nil { + return errors.Wrapf(err, "Failed listing existing backup directory %q", shared.VarPath("backups")) + } + + for _, backup := range backups { + if backup.Name() == "instances" || strings.HasPrefix(backup.Name(), "lxd_backup_") { + continue // Don't try and move our new instances directory or temporary directories. + } + + oldPath := shared.VarPath("backups", backup.Name()) + newPath := filepath.Join(backupsPath, backup.Name()) + logger.Debugf("Moving backup from %q to %q", oldPath, newPath) + err = os.Rename(oldPath, newPath) + if err != nil { + return errors.Wrapf(err, "Failed moving backup from %q to %q", oldPath, newPath) + } + } + + return nil +} + func patchNetworkPIDFiles(name string, d *Daemon) error { networks, err := ioutil.ReadDir(shared.VarPath("networks")) if err != nil {
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel