The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/5313
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) ===
From 232a9a4f54de644922f4991312ae34a390358cfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com> Date: Tue, 27 Nov 2018 17:06:35 -0500 Subject: [PATCH 1/3] lxd/migration: Simplify MigrationSource MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move all regular arguments over to MigrationSourceArgs struct. Signed-off-by: Stéphane Graber <stgra...@ubuntu.com> --- lxd/migrate.go | 6 +++++- lxd/migrate_container.go | 13 +++++++++---- lxd/migrate_storage_volumes.go | 5 ++++- lxd/storage.go | 2 +- lxd/storage_btrfs.go | 12 ++++++------ lxd/storage_ceph_migration.go | 16 ++++++++-------- lxd/storage_dir.go | 4 ++-- lxd/storage_lvm.go | 4 ++-- lxd/storage_migration.go | 16 ++++++++-------- lxd/storage_mock.go | 5 ++--- lxd/storage_zfs.go | 16 ++++++++-------- 11 files changed, 55 insertions(+), 44 deletions(-) diff --git a/lxd/migrate.go b/lxd/migrate.go index d2589f3a5d..8257a35a68 100644 --- a/lxd/migrate.go +++ b/lxd/migrate.go @@ -274,7 +274,11 @@ type MigrationSinkArgs struct { } type MigrationSourceArgs struct { - // transport specific fields + // Container specific fields + Container container + ContainerOnly bool + + // Transport specific fields RsyncArgs []string ZfsArgs []string } diff --git a/lxd/migrate_container.go b/lxd/migrate_container.go index e911784d38..af0e3e0e6a 100644 --- a/lxd/migrate_container.go +++ b/lxd/migrate_container.go @@ -444,10 +444,15 @@ func (s *migrationSourceWs) Do(migrateOp *operation) error { } // Set source args - sourceArgs := MigrationSourceArgs{rsyncArgs, zfsArgs} + sourceArgs := MigrationSourceArgs{ + Container: s.container, + ContainerOnly: s.containerOnly, + RsyncArgs: rsyncArgs, + ZfsArgs: zfsArgs, + } // Initialize storage driver - driver, fsErr := s.container.Storage().MigrationSource(s.container, s.containerOnly, sourceArgs) + driver, fsErr := s.container.Storage().MigrationSource(sourceArgs) if fsErr != nil { s.sendControl(fsErr) return fsErr @@ -459,9 +464,9 @@ func (s *migrationSourceWs) Do(migrateOp *operation) error { header.Fs = &myType if header.GetRefresh() { - driver, _ = rsyncRefreshSource(s.container, s.containerOnly, header.GetSnapshotNames(), sourceArgs) + driver, _ = rsyncRefreshSource(header.GetSnapshotNames(), sourceArgs) } else { - driver, _ = rsyncMigrationSource(s.container, s.containerOnly, sourceArgs) + driver, _ = rsyncMigrationSource(sourceArgs) } // Check if this storage pool has a rate limit set for rsync. diff --git a/lxd/migrate_storage_volumes.go b/lxd/migrate_storage_volumes.go index 66c8978873..991d133044 100644 --- a/lxd/migrate_storage_volumes.go +++ b/lxd/migrate_storage_volumes.go @@ -110,7 +110,10 @@ func (s *migrationSourceWs) DoStorage(migrateOp *operation) error { } // Set source args - sourceArgs := MigrationSourceArgs{rsyncArgs, zfsArgs} + sourceArgs := MigrationSourceArgs{ + RsyncArgs: rsyncArgs, + ZfsArgs: zfsArgs, + } driver, fsErr := s.storage.StorageMigrationSource(sourceArgs) if fsErr != nil { diff --git a/lxd/storage.go b/lxd/storage.go index b394968d8d..52b0bef699 100644 --- a/lxd/storage.go +++ b/lxd/storage.go @@ -232,7 +232,7 @@ type storage interface { // We leave sending containers which are snapshots of other containers // already present on the target instance as an exercise for the // enterprising developer. - MigrationSource(c container, containerOnly bool, args MigrationSourceArgs) (MigrationStorageSourceDriver, error) + MigrationSource(args MigrationSourceArgs) (MigrationStorageSourceDriver, error) MigrationSink( live bool, c container, diff --git a/lxd/storage_btrfs.go b/lxd/storage_btrfs.go index 3325fa0ea7..1b797a73a4 100644 --- a/lxd/storage_btrfs.go +++ b/lxd/storage_btrfs.go @@ -2625,9 +2625,9 @@ func (s *storageBtrfs) PreservesInodes() bool { return true } -func (s *storageBtrfs) MigrationSource(c container, containerOnly bool, args MigrationSourceArgs) (MigrationStorageSourceDriver, error) { +func (s *storageBtrfs) MigrationSource(args MigrationSourceArgs) (MigrationStorageSourceDriver, error) { if s.s.OS.RunningInUserNS { - return rsyncMigrationSource(c, containerOnly, args) + return rsyncMigrationSource(args) } /* List all the snapshots in order of reverse creation. The idea here @@ -2636,21 +2636,21 @@ func (s *storageBtrfs) MigrationSource(c container, containerOnly bool, args Mig */ var err error var snapshots = []container{} - if !containerOnly { - snapshots, err = c.Snapshots() + if !args.ContainerOnly { + snapshots, err = args.Container.Snapshots() if err != nil { return nil, err } } driver := &btrfsMigrationSourceDriver{ - container: c, + container: args.Container, snapshots: snapshots, btrfsSnapshotNames: []string{}, btrfs: s, } - if !containerOnly { + if !args.ContainerOnly { for _, snap := range snapshots { btrfsPath := getSnapshotMountPoint(snap.Project(), s.pool.Name, snap.Name()) driver.btrfsSnapshotNames = append(driver.btrfsSnapshotNames, btrfsPath) diff --git a/lxd/storage_ceph_migration.go b/lxd/storage_ceph_migration.go index 6abd4d76af..f9951328f9 100644 --- a/lxd/storage_ceph_migration.go +++ b/lxd/storage_ceph_migration.go @@ -159,25 +159,25 @@ func (s *storageCeph) PreservesInodes() bool { return false } -func (s *storageCeph) MigrationSource(c container, containerOnly bool, args MigrationSourceArgs) (MigrationStorageSourceDriver, error) { +func (s *storageCeph) MigrationSource(args MigrationSourceArgs) (MigrationStorageSourceDriver, error) { // If the container is a snapshot, let's just send that. We don't need // to send anything else, because that's all the user asked for. - if c.IsSnapshot() { + if args.Container.IsSnapshot() { return &rbdMigrationSourceDriver{ - container: c, + container: args.Container, ceph: s, }, nil } driver := rbdMigrationSourceDriver{ - container: c, + container: args.Container, snapshots: []container{}, rbdSnapshotNames: []string{}, ceph: s, } - containerName := c.Name() - if containerOnly { + containerName := args.Container.Name() + if args.ContainerOnly { logger.Debugf(`Only migrating the RBD storage volume for container "%s" on storage pool "%s`, containerName, s.pool.Name) return &driver, nil } @@ -186,7 +186,7 @@ func (s *storageCeph) MigrationSource(c container, containerOnly bool, args Migr // that we send the oldest to newest snapshot, hopefully saving on xfer // costs. Then, after all that, we send the container itself. snapshots, err := cephRBDVolumeListSnapshots(s.ClusterName, - s.OSDPoolName, projectPrefix(c.Project(), containerName), + s.OSDPoolName, projectPrefix(args.Container.Project(), containerName), storagePoolVolumeTypeNameContainer, s.UserName) if err != nil { if err != db.ErrNoSuchObject { @@ -206,7 +206,7 @@ func (s *storageCeph) MigrationSource(c container, containerOnly bool, args Migr } lxdName := fmt.Sprintf("%s%s%s", containerName, shared.SnapshotDelimiter, snap[len("snapshot_"):]) - snapshot, err := containerLoadByProjectAndName(s.s, c.Project(), lxdName) + snapshot, err := containerLoadByProjectAndName(s.s, args.Container.Project(), lxdName) if err != nil { logger.Errorf(`Failed to load snapshot "%s" for RBD storage volume "%s" on storage pool "%s": %s`, lxdName, containerName, s.pool.Name, err) return nil, err diff --git a/lxd/storage_dir.go b/lxd/storage_dir.go index 20059b4993..bc9a6c014f 100644 --- a/lxd/storage_dir.go +++ b/lxd/storage_dir.go @@ -1272,8 +1272,8 @@ func (s *storageDir) PreservesInodes() bool { return false } -func (s *storageDir) MigrationSource(container container, containerOnly bool, args MigrationSourceArgs) (MigrationStorageSourceDriver, error) { - return rsyncMigrationSource(container, containerOnly, args) +func (s *storageDir) MigrationSource(args MigrationSourceArgs) (MigrationStorageSourceDriver, error) { + return rsyncMigrationSource(args) } func (s *storageDir) MigrationSink(live bool, container container, snapshots []*migration.Snapshot, conn *websocket.Conn, srcIdmap *idmap.IdmapSet, op *operation, containerOnly bool, args MigrationSinkArgs) error { diff --git a/lxd/storage_lvm.go b/lxd/storage_lvm.go index a2b5df8d82..505afe2c83 100644 --- a/lxd/storage_lvm.go +++ b/lxd/storage_lvm.go @@ -2069,8 +2069,8 @@ func (s *storageLvm) PreservesInodes() bool { return false } -func (s *storageLvm) MigrationSource(container container, containerOnly bool, args MigrationSourceArgs) (MigrationStorageSourceDriver, error) { - return rsyncMigrationSource(container, containerOnly, args) +func (s *storageLvm) MigrationSource(args MigrationSourceArgs) (MigrationStorageSourceDriver, error) { + return rsyncMigrationSource(args) } func (s *storageLvm) MigrationSink(live bool, container container, snapshots []*migration.Snapshot, conn *websocket.Conn, srcIdmap *idmap.IdmapSet, op *operation, containerOnly bool, args MigrationSinkArgs) error { diff --git a/lxd/storage_migration.go b/lxd/storage_migration.go index c7e7c8e972..3064bfa5d7 100644 --- a/lxd/storage_migration.go +++ b/lxd/storage_migration.go @@ -113,10 +113,10 @@ func rsyncStorageMigrationSource(args MigrationSourceArgs) (MigrationStorageSour return rsyncStorageSourceDriver{nil, nil, args.RsyncArgs}, nil } -func rsyncRefreshSource(c container, containerOnly bool, refreshSnapshots []string, args MigrationSourceArgs) (MigrationStorageSourceDriver, error) { +func rsyncRefreshSource(refreshSnapshots []string, args MigrationSourceArgs) (MigrationStorageSourceDriver, error) { var snapshots = []container{} - if !containerOnly { - allSnapshots, err := c.Snapshots() + if !args.ContainerOnly { + allSnapshots, err := args.Container.Snapshots() if err != nil { return nil, err } @@ -131,20 +131,20 @@ func rsyncRefreshSource(c container, containerOnly bool, refreshSnapshots []stri } } - return rsyncStorageSourceDriver{c, snapshots, args.RsyncArgs}, nil + return rsyncStorageSourceDriver{args.Container, snapshots, args.RsyncArgs}, nil } -func rsyncMigrationSource(c container, containerOnly bool, args MigrationSourceArgs) (MigrationStorageSourceDriver, error) { +func rsyncMigrationSource(args MigrationSourceArgs) (MigrationStorageSourceDriver, error) { var err error var snapshots = []container{} - if !containerOnly { - snapshots, err = c.Snapshots() + if !args.ContainerOnly { + snapshots, err = args.Container.Snapshots() if err != nil { return nil, err } } - return rsyncStorageSourceDriver{c, snapshots, args.RsyncArgs}, nil + return rsyncStorageSourceDriver{args.Container, snapshots, args.RsyncArgs}, nil } func snapshotProtobufToContainerArgs(project string, containerName string, snap *migration.Snapshot) db.ContainerArgs { diff --git a/lxd/storage_mock.go b/lxd/storage_mock.go index d7757612f4..897ec9a2e8 100644 --- a/lxd/storage_mock.go +++ b/lxd/storage_mock.go @@ -1,7 +1,6 @@ package main import ( - "fmt" "io" "github.com/gorilla/websocket" @@ -226,8 +225,8 @@ func (s *storageMock) PreservesInodes() bool { return false } -func (s *storageMock) MigrationSource(container container, containerOnly bool, args MigrationSourceArgs) (MigrationStorageSourceDriver, error) { - return nil, fmt.Errorf("not implemented") +func (s *storageMock) MigrationSource(args MigrationSourceArgs) (MigrationStorageSourceDriver, error) { + return nil, nil } func (s *storageMock) MigrationSink(live bool, container container, snapshots []*migration.Snapshot, conn *websocket.Conn, srcIdmap *idmap.IdmapSet, op *operation, containerOnly bool, args MigrationSinkArgs) error { diff --git a/lxd/storage_zfs.go b/lxd/storage_zfs.go index a008909172..3cf2c7e543 100644 --- a/lxd/storage_zfs.go +++ b/lxd/storage_zfs.go @@ -2663,23 +2663,23 @@ func (s *storageZfs) PreservesInodes() bool { return true } -func (s *storageZfs) MigrationSource(ct container, containerOnly bool, args MigrationSourceArgs) (MigrationStorageSourceDriver, error) { +func (s *storageZfs) MigrationSource(args MigrationSourceArgs) (MigrationStorageSourceDriver, error) { /* If the container is a snapshot, let's just send that; we don't need * to send anything else, because that's all the user asked for. */ - if ct.IsSnapshot() { - return &zfsMigrationSourceDriver{container: ct, zfs: s, zfsArgs: args.ZfsArgs}, nil + if args.Container.IsSnapshot() { + return &zfsMigrationSourceDriver{container: args.Container, zfs: s, zfsArgs: args.ZfsArgs}, nil } driver := zfsMigrationSourceDriver{ - container: ct, + container: args.Container, snapshots: []container{}, zfsSnapshotNames: []string{}, zfs: s, zfsArgs: args.ZfsArgs, } - if containerOnly { + if args.ContainerOnly { return &driver, nil } @@ -2687,7 +2687,7 @@ func (s *storageZfs) MigrationSource(ct container, containerOnly bool, args Migr * is that we send the oldest to newest snapshot, hopefully saving on * xfer costs. Then, after all that, we send the container itself. */ - snapshots, err := zfsPoolListSnapshots(s.getOnDiskPoolName(), fmt.Sprintf("containers/%s", projectPrefix(ct.Project(), ct.Name()))) + snapshots, err := zfsPoolListSnapshots(s.getOnDiskPoolName(), fmt.Sprintf("containers/%s", projectPrefix(args.Container.Project(), args.Container.Name()))) if err != nil { return nil, err } @@ -2702,8 +2702,8 @@ func (s *storageZfs) MigrationSource(ct container, containerOnly bool, args Migr continue } - lxdName := fmt.Sprintf("%s%s%s", ct.Name(), shared.SnapshotDelimiter, snap[len("snapshot-"):]) - snapshot, err := containerLoadByProjectAndName(s.s, ct.Project(), lxdName) + lxdName := fmt.Sprintf("%s%s%s", args.Container.Name(), shared.SnapshotDelimiter, snap[len("snapshot-"):]) + snapshot, err := containerLoadByProjectAndName(s.s, args.Container.Project(), lxdName) if err != nil { return nil, err } From a46f1956c58b4a80445de62dc7cf873b919af351 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com> Date: Tue, 27 Nov 2018 17:57:36 -0500 Subject: [PATCH 2/3] lxd/migration: Simplify StorageMigrationSink MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Graber <stgra...@ubuntu.com> --- lxd/migrate.go | 12 ++++++------ lxd/migrate_storage_volumes.go | 18 +++++++++++------- lxd/storage.go | 2 +- lxd/storage_btrfs.go | 4 ++-- lxd/storage_ceph.go | 4 ++-- lxd/storage_dir.go | 4 ++-- lxd/storage_lvm.go | 4 ++-- lxd/storage_migration.go | 12 ++++++------ lxd/storage_mock.go | 2 +- lxd/storage_zfs.go | 4 ++-- 10 files changed, 35 insertions(+), 31 deletions(-) diff --git a/lxd/migrate.go b/lxd/migrate.go index 8257a35a68..a7133a8b65 100644 --- a/lxd/migrate.go +++ b/lxd/migrate.go @@ -254,23 +254,23 @@ type migrationSink struct { } type MigrationSinkArgs struct { + // General migration fields Url string Dialer websocket.Dialer Secrets map[string]string Push bool - // container specific fields - Live bool + // Container specific fields Container container ContainerOnly bool + Live bool + Refresh bool - // storage specific fields + // Storage specific fields Storage storage - // transport specific fields + // Transport specific fields RsyncArgs []string - - Refresh bool } type MigrationSourceArgs struct { diff --git a/lxd/migrate_storage_volumes.go b/lxd/migrate_storage_volumes.go index 991d133044..3d0f76b836 100644 --- a/lxd/migrate_storage_volumes.go +++ b/lxd/migrate_storage_volumes.go @@ -288,20 +288,24 @@ func (c *migrationSink) DoStorage(migrateOp *operation) error { resp.Fs = &myType } - args := MigrationSinkArgs{} rsyncFeatures := header.GetRsyncFeatures() // Handle rsync options - args.RsyncArgs = []string{} + rsyncArgs := []string{} if rsyncFeatures.GetXattrs() { - args.RsyncArgs = append(args.RsyncArgs, "--xattrs") + rsyncArgs = append(rsyncArgs, "--xattrs") } if rsyncFeatures.GetDelete() { - args.RsyncArgs = append(args.RsyncArgs, "--delete") + rsyncArgs = append(rsyncArgs, "--delete") } if rsyncFeatures.GetCompress() { - args.RsyncArgs = append(args.RsyncArgs, "--compress") - args.RsyncArgs = append(args.RsyncArgs, "--compress-level=2") + rsyncArgs = append(rsyncArgs, "--compress") + rsyncArgs = append(rsyncArgs, "--compress-level=2") + } + + args := MigrationSinkArgs{ + Storage: c.dest.storage, + RsyncArgs: rsyncArgs, } err = sender(&resp) @@ -318,7 +322,7 @@ func (c *migrationSink) DoStorage(migrateOp *operation) error { fsConn = c.src.fsConn } - err = mySink(fsConn, migrateOp, c.dest.storage, args) + err = mySink(fsConn, migrateOp, args) if err != nil { logger.Errorf("Failed to start storage volume migration sink") controller(err) diff --git a/lxd/storage.go b/lxd/storage.go index 52b0bef699..a43632c501 100644 --- a/lxd/storage.go +++ b/lxd/storage.go @@ -244,7 +244,7 @@ type storage interface { args MigrationSinkArgs) error StorageMigrationSource(args MigrationSourceArgs) (MigrationStorageSourceDriver, error) - StorageMigrationSink(conn *websocket.Conn, op *operation, storage storage, args MigrationSinkArgs) error + StorageMigrationSink(conn *websocket.Conn, op *operation, args MigrationSinkArgs) error } func storageCoreInit(driver string) (storage, error) { diff --git a/lxd/storage_btrfs.go b/lxd/storage_btrfs.go index 1b797a73a4..331a86b5ab 100644 --- a/lxd/storage_btrfs.go +++ b/lxd/storage_btrfs.go @@ -3042,8 +3042,8 @@ func (s *storageBtrfs) StorageMigrationSource(args MigrationSourceArgs) (Migrati return rsyncStorageMigrationSource(args) } -func (s *storageBtrfs) StorageMigrationSink(conn *websocket.Conn, op *operation, storage storage, args MigrationSinkArgs) error { - return rsyncStorageMigrationSink(conn, op, storage, args) +func (s *storageBtrfs) StorageMigrationSink(conn *websocket.Conn, op *operation, args MigrationSinkArgs) error { + return rsyncStorageMigrationSink(conn, op, args) } func (s *storageBtrfs) GetStoragePool() *api.StoragePool { diff --git a/lxd/storage_ceph.go b/lxd/storage_ceph.go index 2382757dab..c141c26974 100644 --- a/lxd/storage_ceph.go +++ b/lxd/storage_ceph.go @@ -2738,8 +2738,8 @@ func (s *storageCeph) StorageMigrationSource(args MigrationSourceArgs) (Migratio return rsyncStorageMigrationSource(args) } -func (s *storageCeph) StorageMigrationSink(conn *websocket.Conn, op *operation, storage storage, args MigrationSinkArgs) error { - return rsyncStorageMigrationSink(conn, op, storage, args) +func (s *storageCeph) StorageMigrationSink(conn *websocket.Conn, op *operation, args MigrationSinkArgs) error { + return rsyncStorageMigrationSink(conn, op, args) } func (s *storageCeph) GetStoragePool() *api.StoragePool { diff --git a/lxd/storage_dir.go b/lxd/storage_dir.go index bc9a6c014f..b13c66a83d 100644 --- a/lxd/storage_dir.go +++ b/lxd/storage_dir.go @@ -1359,8 +1359,8 @@ func (s *storageDir) StorageMigrationSource(args MigrationSourceArgs) (Migration return rsyncStorageMigrationSource(args) } -func (s *storageDir) StorageMigrationSink(conn *websocket.Conn, op *operation, storage storage, args MigrationSinkArgs) error { - return rsyncStorageMigrationSink(conn, op, storage, args) +func (s *storageDir) StorageMigrationSink(conn *websocket.Conn, op *operation, args MigrationSinkArgs) error { + return rsyncStorageMigrationSink(conn, op, args) } func (s *storageDir) GetStoragePool() *api.StoragePool { diff --git a/lxd/storage_lvm.go b/lxd/storage_lvm.go index 505afe2c83..7ed618b7fe 100644 --- a/lxd/storage_lvm.go +++ b/lxd/storage_lvm.go @@ -2282,8 +2282,8 @@ func (s *storageLvm) StorageMigrationSource(args MigrationSourceArgs) (Migration return rsyncStorageMigrationSource(args) } -func (s *storageLvm) StorageMigrationSink(conn *websocket.Conn, op *operation, storage storage, args MigrationSinkArgs) error { - return rsyncStorageMigrationSink(conn, op, storage, args) +func (s *storageLvm) StorageMigrationSink(conn *websocket.Conn, op *operation, args MigrationSinkArgs) error { + return rsyncStorageMigrationSink(conn, op, args) } func (s *storageLvm) GetStoragePool() *api.StoragePool { diff --git a/lxd/storage_migration.go b/lxd/storage_migration.go index 3064bfa5d7..379a09be61 100644 --- a/lxd/storage_migration.go +++ b/lxd/storage_migration.go @@ -188,22 +188,22 @@ func snapshotProtobufToContainerArgs(project string, containerName string, snap return args } -func rsyncStorageMigrationSink(conn *websocket.Conn, op *operation, storage storage, args MigrationSinkArgs) error { - err := storage.StoragePoolVolumeCreate() +func rsyncStorageMigrationSink(conn *websocket.Conn, op *operation, args MigrationSinkArgs) error { + err := args.Storage.StoragePoolVolumeCreate() if err != nil { return err } - ourMount, err := storage.StoragePoolVolumeMount() + ourMount, err := args.Storage.StoragePoolVolumeMount() if err != nil { return err } if ourMount { - defer storage.StoragePoolVolumeUmount() + defer args.Storage.StoragePoolVolumeUmount() } - pool := storage.GetStoragePool() - volume := storage.GetStoragePoolVolume() + pool := args.Storage.GetStoragePool() + volume := args.Storage.GetStoragePoolVolume() wrapper := StorageProgressWriter(op, "fs_progress", volume.Name) path := getStoragePoolVolumeMountPoint(pool.Name, volume.Name) diff --git a/lxd/storage_mock.go b/lxd/storage_mock.go index 897ec9a2e8..dca8827238 100644 --- a/lxd/storage_mock.go +++ b/lxd/storage_mock.go @@ -249,7 +249,7 @@ func (s *storageMock) StorageMigrationSource(args MigrationSourceArgs) (Migratio return nil, nil } -func (s *storageMock) StorageMigrationSink(conn *websocket.Conn, op *operation, storage storage, args MigrationSinkArgs) error { +func (s *storageMock) StorageMigrationSink(conn *websocket.Conn, op *operation, args MigrationSinkArgs) error { return nil } diff --git a/lxd/storage_zfs.go b/lxd/storage_zfs.go index 3cf2c7e543..e3ada9b2e3 100644 --- a/lxd/storage_zfs.go +++ b/lxd/storage_zfs.go @@ -3251,8 +3251,8 @@ func (s *storageZfs) StorageMigrationSource(args MigrationSourceArgs) (Migration return rsyncStorageMigrationSource(args) } -func (s *storageZfs) StorageMigrationSink(conn *websocket.Conn, op *operation, storage storage, args MigrationSinkArgs) error { - return rsyncStorageMigrationSink(conn, op, storage, args) +func (s *storageZfs) StorageMigrationSink(conn *websocket.Conn, op *operation, args MigrationSinkArgs) error { + return rsyncStorageMigrationSink(conn, op, args) } func (s *storageZfs) GetStoragePool() *api.StoragePool { From 4ef6e87c5885b2c6d11a099036dc84a5e67ea322 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com> Date: Tue, 27 Nov 2018 22:40:51 -0500 Subject: [PATCH 3/3] lxd/migration: Simplify MigrationSink MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Graber <stgra...@ubuntu.com> --- lxd/migrate.go | 7 +++-- lxd/migrate_container.go | 13 +++++--- lxd/storage.go | 10 +----- lxd/storage_btrfs.go | 51 +++++++++++++++--------------- lxd/storage_ceph_migration.go | 47 +++++++++++++--------------- lxd/storage_dir.go | 5 ++- lxd/storage_lvm.go | 5 ++- lxd/storage_migration.go | 59 +++++++++++++++++------------------ lxd/storage_mock.go | 3 +- lxd/storage_zfs.go | 43 +++++++++++++------------ 10 files changed, 116 insertions(+), 127 deletions(-) diff --git a/lxd/migrate.go b/lxd/migrate.go index a7133a8b65..2b4bcc2437 100644 --- a/lxd/migrate.go +++ b/lxd/migrate.go @@ -20,6 +20,7 @@ import ( "github.com/lxc/lxd/lxd/migration" "github.com/lxc/lxd/shared" + "github.com/lxc/lxd/shared/idmap" "github.com/lxc/lxd/shared/logger" ) @@ -255,16 +256,18 @@ type migrationSink struct { type MigrationSinkArgs struct { // General migration fields - Url string Dialer websocket.Dialer - Secrets map[string]string Push bool + Secrets map[string]string + Url string // Container specific fields Container container ContainerOnly bool + Idmap *idmap.IdmapSet Live bool Refresh bool + Snapshots []*migration.Snapshot // Storage specific fields Storage storage diff --git a/lxd/migrate_container.go b/lxd/migrate_container.go index af0e3e0e6a..a3dae97243 100644 --- a/lxd/migrate_container.go +++ b/lxd/migrate_container.go @@ -999,13 +999,16 @@ func (c *migrationSink) Do(migrateOp *operation) error { } args := MigrationSinkArgs{ - Refresh: c.refresh, - RsyncArgs: c.rsyncArgs, + Container: c.src.container, + ContainerOnly: c.src.containerOnly, + Idmap: srcIdmap, + Live: sendFinalFsDelta, + Refresh: c.refresh, + RsyncArgs: c.rsyncArgs, + Snapshots: snapshots, } - err = mySink(sendFinalFsDelta, c.src.container, - snapshots, fsConn, srcIdmap, migrateOp, - c.src.containerOnly, args) + err = mySink(fsConn, migrateOp, args) if err != nil { fsTransfer <- err return diff --git a/lxd/storage.go b/lxd/storage.go index a43632c501..3b2dca1ddc 100644 --- a/lxd/storage.go +++ b/lxd/storage.go @@ -233,15 +233,7 @@ type storage interface { // already present on the target instance as an exercise for the // enterprising developer. MigrationSource(args MigrationSourceArgs) (MigrationStorageSourceDriver, error) - MigrationSink( - live bool, - c container, - objects []*migration.Snapshot, - conn *websocket.Conn, - srcIdmap *idmap.IdmapSet, - op *operation, - containerOnly bool, - args MigrationSinkArgs) error + MigrationSink(conn *websocket.Conn, op *operation, args MigrationSinkArgs) error StorageMigrationSource(args MigrationSourceArgs) (MigrationStorageSourceDriver, error) StorageMigrationSink(conn *websocket.Conn, op *operation, args MigrationSinkArgs) error diff --git a/lxd/storage_btrfs.go b/lxd/storage_btrfs.go index 331a86b5ab..7c423976c3 100644 --- a/lxd/storage_btrfs.go +++ b/lxd/storage_btrfs.go @@ -22,7 +22,6 @@ import ( "github.com/lxc/lxd/lxd/util" "github.com/lxc/lxd/shared" "github.com/lxc/lxd/shared/api" - "github.com/lxc/lxd/shared/idmap" "github.com/lxc/lxd/shared/logger" ) @@ -2660,9 +2659,9 @@ func (s *storageBtrfs) MigrationSource(args MigrationSourceArgs) (MigrationStora return driver, nil } -func (s *storageBtrfs) MigrationSink(live bool, container container, snapshots []*migration.Snapshot, conn *websocket.Conn, srcIdmap *idmap.IdmapSet, op *operation, containerOnly bool, args MigrationSinkArgs) error { +func (s *storageBtrfs) MigrationSink(conn *websocket.Conn, op *operation, args MigrationSinkArgs) error { if s.s.OS.RunningInUserNS { - return rsyncMigrationSink(live, container, snapshots, conn, srcIdmap, op, containerOnly, args) + return rsyncMigrationSink(conn, op, args) } btrfsRecv := func(snapName string, btrfsPath string, targetPath string, isSnapshot bool, writeWrapper func(io.WriteCloser) io.WriteCloser) error { @@ -2734,17 +2733,17 @@ func (s *storageBtrfs) MigrationSink(live bool, container container, snapshots [ return nil } - containerName := container.Name() - _, containerPool, _ := container.Storage().GetContainerPoolInfo() - containersPath := getSnapshotMountPoint(container.Project(), containerPool, containerName) - if !containerOnly && len(snapshots) > 0 { + containerName := args.Container.Name() + _, containerPool, _ := args.Container.Storage().GetContainerPoolInfo() + containersPath := getSnapshotMountPoint(args.Container.Project(), containerPool, containerName) + if !args.ContainerOnly && len(args.Snapshots) > 0 { err := os.MkdirAll(containersPath, containersDirMode) if err != nil { return err } - snapshotMntPointSymlinkTarget := shared.VarPath("storage-pools", containerPool, "containers-snapshots", projectPrefix(container.Project(), containerName)) - snapshotMntPointSymlink := shared.VarPath("snapshots", projectPrefix(container.Project(), containerName)) + snapshotMntPointSymlinkTarget := shared.VarPath("storage-pools", containerPool, "containers-snapshots", projectPrefix(args.Container.Project(), containerName)) + snapshotMntPointSymlink := shared.VarPath("snapshots", projectPrefix(args.Container.Project(), containerName)) if !shared.PathExists(snapshotMntPointSymlink) { err := os.Symlink(snapshotMntPointSymlinkTarget, snapshotMntPointSymlink) if err != nil { @@ -2757,7 +2756,7 @@ func (s *storageBtrfs) MigrationSink(live bool, container container, snapshots [ // container's root disk device so we can simply // retrieve it from the expanded devices. parentStoragePool := "" - parentExpandedDevices := container.ExpandedDevices() + parentExpandedDevices := args.Container.ExpandedDevices() parentLocalRootDiskDeviceKey, parentLocalRootDiskDevice, _ := shared.GetRootDiskDevice(parentExpandedDevices) if parentLocalRootDiskDeviceKey != "" { parentStoragePool = parentLocalRootDiskDevice["pool"] @@ -2768,36 +2767,36 @@ func (s *storageBtrfs) MigrationSink(live bool, container container, snapshots [ return fmt.Errorf("Detected that the container's root device is missing the pool property during BTRFS migration") } - if !containerOnly { - for _, snap := range snapshots { - args := snapshotProtobufToContainerArgs(container.Project(), containerName, snap) + if !args.ContainerOnly { + for _, snap := range args.Snapshots { + ctArgs := snapshotProtobufToContainerArgs(args.Container.Project(), containerName, snap) // Ensure that snapshot and parent container have the // same storage pool in their local root disk device. // If the root disk device for the snapshot comes from a // profile on the new instance as well we don't need to // do anything. - if args.Devices != nil { - snapLocalRootDiskDeviceKey, _, _ := shared.GetRootDiskDevice(args.Devices) + if ctArgs.Devices != nil { + snapLocalRootDiskDeviceKey, _, _ := shared.GetRootDiskDevice(ctArgs.Devices) if snapLocalRootDiskDeviceKey != "" { - args.Devices[snapLocalRootDiskDeviceKey]["pool"] = parentStoragePool + ctArgs.Devices[snapLocalRootDiskDeviceKey]["pool"] = parentStoragePool } } - snapshotMntPoint := getSnapshotMountPoint(container.Project(), containerPool, args.Name) - _, err := containerCreateEmptySnapshot(container.DaemonState(), args) + snapshotMntPoint := getSnapshotMountPoint(args.Container.Project(), containerPool, ctArgs.Name) + _, err := containerCreateEmptySnapshot(args.Container.DaemonState(), ctArgs) if err != nil { return err } - snapshotMntPointSymlinkTarget := shared.VarPath("storage-pools", s.pool.Name, "containers-snapshots", projectPrefix(container.Project(), containerName)) - snapshotMntPointSymlink := shared.VarPath("snapshots", projectPrefix(container.Project(), containerName)) + snapshotMntPointSymlinkTarget := shared.VarPath("storage-pools", s.pool.Name, "containers-snapshots", projectPrefix(args.Container.Project(), containerName)) + snapshotMntPointSymlink := shared.VarPath("snapshots", projectPrefix(args.Container.Project(), containerName)) err = createSnapshotMountpoint(snapshotMntPoint, snapshotMntPointSymlinkTarget, snapshotMntPointSymlink) if err != nil { return err } - tmpSnapshotMntPoint, err := ioutil.TempDir(containersPath, projectPrefix(container.Project(), containerName)) + tmpSnapshotMntPoint, err := ioutil.TempDir(containersPath, projectPrefix(args.Container.Project(), containerName)) if err != nil { return err } @@ -2816,15 +2815,15 @@ func (s *storageBtrfs) MigrationSink(live bool, container container, snapshots [ } } - containersMntPoint := getContainerMountPoint(container.Project(), s.pool.Name, "") - err := createContainerMountpoint(containersMntPoint, container.Path(), container.IsPrivileged()) + containersMntPoint := getContainerMountPoint(args.Container.Project(), s.pool.Name, "") + err := createContainerMountpoint(containersMntPoint, args.Container.Path(), args.Container.IsPrivileged()) if err != nil { return err } /* finally, do the real container */ wrapper := StorageProgressWriter(op, "fs_progress", containerName) - tmpContainerMntPoint, err := ioutil.TempDir(containersMntPoint, projectPrefix(container.Project(), containerName)) + tmpContainerMntPoint, err := ioutil.TempDir(containersMntPoint, projectPrefix(args.Container.Project(), containerName)) if err != nil { return err } @@ -2835,13 +2834,13 @@ func (s *storageBtrfs) MigrationSink(live bool, container container, snapshots [ return err } - containerMntPoint := getContainerMountPoint(container.Project(), s.pool.Name, containerName) + containerMntPoint := getContainerMountPoint(args.Container.Project(), s.pool.Name, containerName) err = btrfsRecv("", tmpContainerMntPoint, containerMntPoint, false, wrapper) if err != nil { return err } - if live { + if args.Live { err = btrfsRecv("", tmpContainerMntPoint, containerMntPoint, false, wrapper) if err != nil { return err diff --git a/lxd/storage_ceph_migration.go b/lxd/storage_ceph_migration.go index f9951328f9..5f3e441888 100644 --- a/lxd/storage_ceph_migration.go +++ b/lxd/storage_ceph_migration.go @@ -10,7 +10,6 @@ import ( "github.com/lxc/lxd/lxd/db" "github.com/lxc/lxd/lxd/migration" "github.com/lxc/lxd/shared" - "github.com/lxc/lxd/shared/idmap" "github.com/lxc/lxd/shared/logger" "github.com/pborman/uuid" @@ -219,13 +218,11 @@ func (s *storageCeph) MigrationSource(args MigrationSourceArgs) (MigrationStorag return &driver, nil } -func (s *storageCeph) MigrationSink(live bool, c container, - snapshots []*migration.Snapshot, conn *websocket.Conn, srcIdmap *idmap.IdmapSet, - op *operation, containerOnly bool, args MigrationSinkArgs) error { +func (s *storageCeph) MigrationSink(conn *websocket.Conn, op *operation, args MigrationSinkArgs) error { // Check that we received a valid root disk device with a pool property // set. parentStoragePool := "" - parentExpandedDevices := c.ExpandedDevices() + parentExpandedDevices := args.Container.ExpandedDevices() parentLocalRootDiskDeviceKey, parentLocalRootDiskDevice, _ := shared.GetRootDiskDevice(parentExpandedDevices) if parentLocalRootDiskDeviceKey != "" { parentStoragePool = parentLocalRootDiskDevice["pool"] @@ -245,9 +242,9 @@ func (s *storageCeph) MigrationSink(live bool, c container, // the receiving LXD instance it also means that s.ClusterName has been // set to the correct cluster name for that LXD instance. Yeah, I think // that's actually correct. - containerName := c.Name() - if !cephRBDVolumeExists(s.ClusterName, s.OSDPoolName, projectPrefix(c.Project(), containerName), storagePoolVolumeTypeNameContainer, s.UserName) { - err := cephRBDVolumeCreate(s.ClusterName, s.OSDPoolName, projectPrefix(c.Project(), containerName), storagePoolVolumeTypeNameContainer, "0", s.UserName) + containerName := args.Container.Name() + if !cephRBDVolumeExists(s.ClusterName, s.OSDPoolName, projectPrefix(args.Container.Project(), containerName), storagePoolVolumeTypeNameContainer, s.UserName) { + err := cephRBDVolumeCreate(s.ClusterName, s.OSDPoolName, projectPrefix(args.Container.Project(), containerName), storagePoolVolumeTypeNameContainer, "0", s.UserName) if err != nil { logger.Errorf(`Failed to create RBD storage volume "%s" for cluster "%s" in OSD pool "%s" on storage pool "%s": %s`, containerName, s.ClusterName, s.OSDPoolName, s.pool.Name, err) return err @@ -255,9 +252,9 @@ func (s *storageCeph) MigrationSink(live bool, c container, logger.Debugf(`Created RBD storage volume "%s" on storage pool "%s"`, containerName, s.pool.Name) } - if len(snapshots) > 0 { - snapshotMntPointSymlinkTarget := shared.VarPath("storage-pools", s.pool.Name, "containers-snapshots", projectPrefix(c.Project(), containerName)) - snapshotMntPointSymlink := shared.VarPath("snapshots", projectPrefix(c.Project(), containerName)) + if len(args.Snapshots) > 0 { + snapshotMntPointSymlinkTarget := shared.VarPath("storage-pools", s.pool.Name, "containers-snapshots", projectPrefix(args.Container.Project(), containerName)) + snapshotMntPointSymlink := shared.VarPath("snapshots", projectPrefix(args.Container.Project(), containerName)) if !shared.PathExists(snapshotMntPointSymlink) { err := os.Symlink(snapshotMntPointSymlinkTarget, snapshotMntPointSymlink) if err != nil { @@ -267,22 +264,22 @@ func (s *storageCeph) MigrationSink(live bool, c container, } // Now we're ready to receive the actual fs. - recvName := fmt.Sprintf("%s/container_%s", s.OSDPoolName, projectPrefix(c.Project(), containerName)) - for _, snap := range snapshots { + recvName := fmt.Sprintf("%s/container_%s", s.OSDPoolName, projectPrefix(args.Container.Project(), containerName)) + for _, snap := range args.Snapshots { curSnapName := snap.GetName() - args := snapshotProtobufToContainerArgs(c.Project(), containerName, snap) + ctArgs := snapshotProtobufToContainerArgs(args.Container.Project(), containerName, snap) // Ensure that snapshot and parent container have the same // storage pool in their local root disk device. If the root // disk device for the snapshot comes from a profile on the new // instance as well we don't need to do anything. - if args.Devices != nil { - snapLocalRootDiskDeviceKey, _, _ := shared.GetRootDiskDevice(args.Devices) + if ctArgs.Devices != nil { + snapLocalRootDiskDeviceKey, _, _ := shared.GetRootDiskDevice(ctArgs.Devices) if snapLocalRootDiskDeviceKey != "" { - args.Devices[snapLocalRootDiskDeviceKey]["pool"] = parentStoragePool + ctArgs.Devices[snapLocalRootDiskDeviceKey]["pool"] = parentStoragePool } } - _, err := containerCreateEmptySnapshot(c.DaemonState(), args) + _, err := containerCreateEmptySnapshot(args.Container.DaemonState(), ctArgs) if err != nil { logger.Errorf(`Failed to create empty RBD storage volume for container "%s" on storage pool "%s: %s`, containerName, s.OSDPoolName, err) return err @@ -297,7 +294,7 @@ func (s *storageCeph) MigrationSink(live bool, c container, } logger.Debugf(`Received RBD storage volume "%s"`, curSnapName) - snapshotMntPoint := getSnapshotMountPoint(c.Project(), s.pool.Name, fmt.Sprintf("%s/%s", containerName, *snap.Name)) + snapshotMntPoint := getSnapshotMountPoint(args.Container.Project(), s.pool.Name, fmt.Sprintf("%s/%s", containerName, *snap.Name)) if !shared.PathExists(snapshotMntPoint) { err := os.MkdirAll(snapshotMntPoint, 0700) if err != nil { @@ -307,7 +304,7 @@ func (s *storageCeph) MigrationSink(live bool, c container, } defer func() { - snaps, err := cephRBDVolumeListSnapshots(s.ClusterName, s.OSDPoolName, projectPrefix(c.Project(), containerName), storagePoolVolumeTypeNameContainer, s.UserName) + snaps, err := cephRBDVolumeListSnapshots(s.ClusterName, s.OSDPoolName, projectPrefix(args.Container.Project(), containerName), storagePoolVolumeTypeNameContainer, s.UserName) if err == nil { for _, snap := range snaps { snapOnlyName, _, _ := containerGetParentAndSnapshotName(snap) @@ -315,7 +312,7 @@ func (s *storageCeph) MigrationSink(live bool, c container, continue } - err := cephRBDSnapshotDelete(s.ClusterName, s.OSDPoolName, projectPrefix(c.Project(), containerName), storagePoolVolumeTypeNameContainer, snapOnlyName, s.UserName) + err := cephRBDSnapshotDelete(s.ClusterName, s.OSDPoolName, projectPrefix(args.Container.Project(), containerName), storagePoolVolumeTypeNameContainer, snapOnlyName, s.UserName) if err != nil { logger.Warnf(`Failed to delete RBD container storage for snapshot "%s" of container "%s"`, snapOnlyName, containerName) } @@ -332,7 +329,7 @@ func (s *storageCeph) MigrationSink(live bool, c container, } logger.Debugf(`Received RBD storage volume "%s"`, recvName) - if live { + if args.Live { err := s.rbdRecv(conn, recvName, wrapper) if err != nil { logger.Errorf(`Failed to receive RBD storage volume "%s": %s`, recvName, err) @@ -341,11 +338,11 @@ func (s *storageCeph) MigrationSink(live bool, c container, logger.Debugf(`Received RBD storage volume "%s"`, recvName) } - containerMntPoint := getContainerMountPoint(c.Project(), s.pool.Name, containerName) + containerMntPoint := getContainerMountPoint(args.Container.Project(), s.pool.Name, containerName) err = createContainerMountpoint( containerMntPoint, - c.Path(), - c.IsPrivileged()) + args.Container.Path(), + args.Container.IsPrivileged()) if err != nil { logger.Errorf(`Failed to create mountpoint "%s" for RBD storage volume for container "%s" on storage pool "%s": %s"`, containerMntPoint, containerName, s.pool.Name, err) return err diff --git a/lxd/storage_dir.go b/lxd/storage_dir.go index b13c66a83d..dd7f7a3396 100644 --- a/lxd/storage_dir.go +++ b/lxd/storage_dir.go @@ -16,7 +16,6 @@ import ( "github.com/lxc/lxd/lxd/state" "github.com/lxc/lxd/shared" "github.com/lxc/lxd/shared/api" - "github.com/lxc/lxd/shared/idmap" "github.com/lxc/lxd/shared/logger" ) @@ -1276,8 +1275,8 @@ func (s *storageDir) MigrationSource(args MigrationSourceArgs) (MigrationStorage return rsyncMigrationSource(args) } -func (s *storageDir) MigrationSink(live bool, container container, snapshots []*migration.Snapshot, conn *websocket.Conn, srcIdmap *idmap.IdmapSet, op *operation, containerOnly bool, args MigrationSinkArgs) error { - return rsyncMigrationSink(live, container, snapshots, conn, srcIdmap, op, containerOnly, args) +func (s *storageDir) MigrationSink(conn *websocket.Conn, op *operation, args MigrationSinkArgs) error { + return rsyncMigrationSink(conn, op, args) } func (s *storageDir) StorageEntitySetQuota(volumeType int, size int64, data interface{}) error { diff --git a/lxd/storage_lvm.go b/lxd/storage_lvm.go index 7ed618b7fe..5377c0a49b 100644 --- a/lxd/storage_lvm.go +++ b/lxd/storage_lvm.go @@ -17,7 +17,6 @@ import ( "github.com/lxc/lxd/lxd/state" "github.com/lxc/lxd/shared" "github.com/lxc/lxd/shared/api" - "github.com/lxc/lxd/shared/idmap" "github.com/lxc/lxd/shared/logger" ) @@ -2073,8 +2072,8 @@ func (s *storageLvm) MigrationSource(args MigrationSourceArgs) (MigrationStorage return rsyncMigrationSource(args) } -func (s *storageLvm) MigrationSink(live bool, container container, snapshots []*migration.Snapshot, conn *websocket.Conn, srcIdmap *idmap.IdmapSet, op *operation, containerOnly bool, args MigrationSinkArgs) error { - return rsyncMigrationSink(live, container, snapshots, conn, srcIdmap, op, containerOnly, args) +func (s *storageLvm) MigrationSink(conn *websocket.Conn, op *operation, args MigrationSinkArgs) error { + return rsyncMigrationSink(conn, op, args) } func (s *storageLvm) StorageEntitySetQuota(volumeType int, size int64, data interface{}) error { diff --git a/lxd/storage_migration.go b/lxd/storage_migration.go index 379a09be61..7ee15ed430 100644 --- a/lxd/storage_migration.go +++ b/lxd/storage_migration.go @@ -10,7 +10,6 @@ import ( "github.com/lxc/lxd/lxd/migration" "github.com/lxc/lxd/lxd/types" "github.com/lxc/lxd/shared" - "github.com/lxc/lxd/shared/idmap" "github.com/lxc/lxd/shared/logger" ) @@ -212,19 +211,19 @@ func rsyncStorageMigrationSink(conn *websocket.Conn, op *operation, args Migrati return RsyncRecv(path, conn, wrapper, args.RsyncArgs) } -func rsyncMigrationSink(live bool, container container, snapshots []*migration.Snapshot, conn *websocket.Conn, srcIdmap *idmap.IdmapSet, op *operation, containerOnly bool, args MigrationSinkArgs) error { - ourStart, err := container.StorageStart() +func rsyncMigrationSink(conn *websocket.Conn, op *operation, args MigrationSinkArgs) error { + ourStart, err := args.Container.StorageStart() if err != nil { return err } if ourStart { - defer container.StorageStop() + defer args.Container.StorageStop() } // At this point we have already figured out the parent container's root // disk device so we can simply retrieve it from the expanded devices. parentStoragePool := "" - parentExpandedDevices := container.ExpandedDevices() + parentExpandedDevices := args.Container.ExpandedDevices() parentLocalRootDiskDeviceKey, parentLocalRootDiskDevice, _ := shared.GetRootDiskDevice(parentExpandedDevices) if parentLocalRootDiskDeviceKey != "" { parentStoragePool = parentLocalRootDiskDevice["pool"] @@ -235,15 +234,15 @@ func rsyncMigrationSink(live bool, container container, snapshots []*migration.S return fmt.Errorf("the container's root device is missing the pool property") } - localSnapshots, err := container.Snapshots() + localSnapshots, err := args.Container.Snapshots() if err != nil { return err } - isDirBackend := container.Storage().GetStorageType() == storageTypeDir + isDirBackend := args.Container.Storage().GetStorageType() == storageTypeDir if isDirBackend { - if !containerOnly { - for _, snap := range snapshots { + if !args.ContainerOnly { + for _, snap := range args.Snapshots { isSnapshotOutdated := true for _, localSnap := range localSnapshots { @@ -260,7 +259,7 @@ func rsyncMigrationSink(live bool, container container, snapshots []*migration.S continue } - snapArgs := snapshotProtobufToContainerArgs(container.Project(), container.Name(), snap) + snapArgs := snapshotProtobufToContainerArgs(args.Container.Project(), args.Container.Name(), snap) // Ensure that snapshot and parent container have the // same storage pool in their local root disk device. @@ -275,11 +274,11 @@ func rsyncMigrationSink(live bool, container container, snapshots []*migration.S } // Try and a load container - s, err := containerLoadByProjectAndName(container.DaemonState(), - container.Project(), snapArgs.Name) + s, err := containerLoadByProjectAndName(args.Container.DaemonState(), + args.Container.Project(), snapArgs.Name) if err != nil { // Create the snapshot since it doesn't seem to exist - s, err = containerCreateEmptySnapshot(container.DaemonState(), snapArgs) + s, err = containerCreateEmptySnapshot(args.Container.DaemonState(), snapArgs) if err != nil { return err } @@ -290,21 +289,21 @@ func rsyncMigrationSink(live bool, container container, snapshots []*migration.S return err } - err = ShiftIfNecessary(container, srcIdmap) + err = ShiftIfNecessary(args.Container, args.Idmap) if err != nil { return err } } } - wrapper := StorageProgressWriter(op, "fs_progress", container.Name()) - err = RsyncRecv(shared.AddSlash(container.Path()), conn, wrapper, args.RsyncArgs) + wrapper := StorageProgressWriter(op, "fs_progress", args.Container.Name()) + err = RsyncRecv(shared.AddSlash(args.Container.Path()), conn, wrapper, args.RsyncArgs) if err != nil { return err } } else { - if !containerOnly { - for _, snap := range snapshots { + if !args.ContainerOnly { + for _, snap := range args.Snapshots { isSnapshotOutdated := true for _, localSnap := range localSnapshots { @@ -321,7 +320,7 @@ func rsyncMigrationSink(live bool, container container, snapshots []*migration.S continue } - snapArgs := snapshotProtobufToContainerArgs(container.Project(), container.Name(), snap) + snapArgs := snapshotProtobufToContainerArgs(args.Container.Project(), args.Container.Name(), snap) // Ensure that snapshot and parent container have the // same storage pool in their local root disk device. @@ -336,20 +335,20 @@ func rsyncMigrationSink(live bool, container container, snapshots []*migration.S } wrapper := StorageProgressWriter(op, "fs_progress", snap.GetName()) - err := RsyncRecv(shared.AddSlash(container.Path()), conn, wrapper, args.RsyncArgs) + err := RsyncRecv(shared.AddSlash(args.Container.Path()), conn, wrapper, args.RsyncArgs) if err != nil { return err } - err = ShiftIfNecessary(container, srcIdmap) + err = ShiftIfNecessary(args.Container, args.Idmap) if err != nil { return err } - _, err = containerLoadByProjectAndName(container.DaemonState(), - container.Project(), snapArgs.Name) + _, err = containerLoadByProjectAndName(args.Container.DaemonState(), + args.Container.Project(), snapArgs.Name) if err != nil { - _, err = containerCreateAsSnapshot(container.DaemonState(), snapArgs, container) + _, err = containerCreateAsSnapshot(args.Container.DaemonState(), snapArgs, args.Container) if err != nil { return err } @@ -357,23 +356,23 @@ func rsyncMigrationSink(live bool, container container, snapshots []*migration.S } } - wrapper := StorageProgressWriter(op, "fs_progress", container.Name()) - err = RsyncRecv(shared.AddSlash(container.Path()), conn, wrapper, args.RsyncArgs) + wrapper := StorageProgressWriter(op, "fs_progress", args.Container.Name()) + err = RsyncRecv(shared.AddSlash(args.Container.Path()), conn, wrapper, args.RsyncArgs) if err != nil { return err } } - if live { + if args.Live { /* now receive the final sync */ - wrapper := StorageProgressWriter(op, "fs_progress", container.Name()) - err := RsyncRecv(shared.AddSlash(container.Path()), conn, wrapper, args.RsyncArgs) + wrapper := StorageProgressWriter(op, "fs_progress", args.Container.Name()) + err := RsyncRecv(shared.AddSlash(args.Container.Path()), conn, wrapper, args.RsyncArgs) if err != nil { return err } } - err = ShiftIfNecessary(container, srcIdmap) + err = ShiftIfNecessary(args.Container, args.Idmap) if err != nil { return err } diff --git a/lxd/storage_mock.go b/lxd/storage_mock.go index dca8827238..c5f2e23772 100644 --- a/lxd/storage_mock.go +++ b/lxd/storage_mock.go @@ -8,7 +8,6 @@ import ( "github.com/lxc/lxd/lxd/migration" "github.com/lxc/lxd/lxd/state" "github.com/lxc/lxd/shared/api" - "github.com/lxc/lxd/shared/idmap" "github.com/lxc/lxd/shared/logger" ) @@ -229,7 +228,7 @@ func (s *storageMock) MigrationSource(args MigrationSourceArgs) (MigrationStorag return nil, nil } -func (s *storageMock) MigrationSink(live bool, container container, snapshots []*migration.Snapshot, conn *websocket.Conn, srcIdmap *idmap.IdmapSet, op *operation, containerOnly bool, args MigrationSinkArgs) error { +func (s *storageMock) MigrationSink(conn *websocket.Conn, op *operation, args MigrationSinkArgs) error { return nil } diff --git a/lxd/storage_zfs.go b/lxd/storage_zfs.go index e3ada9b2e3..4fe785f984 100644 --- a/lxd/storage_zfs.go +++ b/lxd/storage_zfs.go @@ -19,7 +19,6 @@ import ( "github.com/lxc/lxd/lxd/util" "github.com/lxc/lxd/shared" "github.com/lxc/lxd/shared/api" - "github.com/lxc/lxd/shared/idmap" "github.com/lxc/lxd/shared/logger" "github.com/pborman/uuid" @@ -2715,7 +2714,7 @@ func (s *storageZfs) MigrationSource(args MigrationSourceArgs) (MigrationStorage return &driver, nil } -func (s *storageZfs) MigrationSink(live bool, container container, snapshots []*migration.Snapshot, conn *websocket.Conn, srcIdmap *idmap.IdmapSet, op *operation, containerOnly bool, args MigrationSinkArgs) error { +func (s *storageZfs) MigrationSink(conn *websocket.Conn, op *operation, args MigrationSinkArgs) error { poolName := s.getOnDiskPoolName() zfsRecv := func(zfsName string, writeWrapper func(io.WriteCloser) io.WriteCloser) error { zfsFsName := fmt.Sprintf("%s/%s", poolName, zfsName) @@ -2761,8 +2760,8 @@ func (s *storageZfs) MigrationSink(live bool, container container, snapshots []* * of a snapshot also needs tha actual fs that it has snapshotted * unmounted, so we do this before receiving anything. */ - zfsName := fmt.Sprintf("containers/%s", projectPrefix(container.Project(), container.Name())) - containerMntPoint := getContainerMountPoint(container.Project(), s.pool.Name, container.Name()) + zfsName := fmt.Sprintf("containers/%s", projectPrefix(args.Container.Project(), args.Container.Name())) + containerMntPoint := getContainerMountPoint(args.Container.Project(), s.pool.Name, args.Container.Name()) if shared.IsMountPoint(containerMntPoint) { err := zfsUmount(poolName, zfsName, containerMntPoint) if err != nil { @@ -2770,9 +2769,9 @@ func (s *storageZfs) MigrationSink(live bool, container container, snapshots []* } } - if len(snapshots) > 0 { - snapshotMntPointSymlinkTarget := shared.VarPath("storage-pools", s.pool.Name, "containers-snapshots", projectPrefix(container.Project(), s.volume.Name)) - snapshotMntPointSymlink := shared.VarPath("snapshots", projectPrefix(container.Project(), container.Name())) + if len(args.Snapshots) > 0 { + snapshotMntPointSymlinkTarget := shared.VarPath("storage-pools", s.pool.Name, "containers-snapshots", projectPrefix(args.Container.Project(), s.volume.Name)) + snapshotMntPointSymlink := shared.VarPath("snapshots", projectPrefix(args.Container.Project(), args.Container.Name())) if !shared.PathExists(snapshotMntPointSymlink) { err := os.Symlink(snapshotMntPointSymlinkTarget, snapshotMntPointSymlink) if err != nil { @@ -2785,7 +2784,7 @@ func (s *storageZfs) MigrationSink(live bool, container container, snapshots []* // container's root disk device so we can simply // retrieve it from the expanded devices. parentStoragePool := "" - parentExpandedDevices := container.ExpandedDevices() + parentExpandedDevices := args.Container.ExpandedDevices() parentLocalRootDiskDeviceKey, parentLocalRootDiskDevice, _ := shared.GetRootDiskDevice(parentExpandedDevices) if parentLocalRootDiskDeviceKey != "" { parentStoragePool = parentLocalRootDiskDevice["pool"] @@ -2796,32 +2795,32 @@ func (s *storageZfs) MigrationSink(live bool, container container, snapshots []* return fmt.Errorf("detected that the container's root device is missing the pool property during BTRFS migration") } - for _, snap := range snapshots { - args := snapshotProtobufToContainerArgs(container.Project(), container.Name(), snap) + for _, snap := range args.Snapshots { + ctArgs := snapshotProtobufToContainerArgs(args.Container.Project(), args.Container.Name(), snap) // Ensure that snapshot and parent container have the // same storage pool in their local root disk device. // If the root disk device for the snapshot comes from a // profile on the new instance as well we don't need to // do anything. - if args.Devices != nil { - snapLocalRootDiskDeviceKey, _, _ := shared.GetRootDiskDevice(args.Devices) + if ctArgs.Devices != nil { + snapLocalRootDiskDeviceKey, _, _ := shared.GetRootDiskDevice(ctArgs.Devices) if snapLocalRootDiskDeviceKey != "" { - args.Devices[snapLocalRootDiskDeviceKey]["pool"] = parentStoragePool + ctArgs.Devices[snapLocalRootDiskDeviceKey]["pool"] = parentStoragePool } } - _, err := containerCreateEmptySnapshot(container.DaemonState(), args) + _, err := containerCreateEmptySnapshot(args.Container.DaemonState(), ctArgs) if err != nil { return err } wrapper := StorageProgressWriter(op, "fs_progress", snap.GetName()) - name := fmt.Sprintf("containers/%s@snapshot-%s", projectPrefix(container.Project(), container.Name()), snap.GetName()) + name := fmt.Sprintf("containers/%s@snapshot-%s", projectPrefix(args.Container.Project(), args.Container.Name()), snap.GetName()) if err := zfsRecv(name, wrapper); err != nil { return err } - snapshotMntPoint := getSnapshotMountPoint(container.Project(), poolName, fmt.Sprintf("%s/%s", container.Name(), *snap.Name)) + snapshotMntPoint := getSnapshotMountPoint(args.Container.Project(), poolName, fmt.Sprintf("%s/%s", args.Container.Name(), *snap.Name)) if !shared.PathExists(snapshotMntPoint) { err := os.MkdirAll(snapshotMntPoint, 0700) if err != nil { @@ -2832,7 +2831,7 @@ func (s *storageZfs) MigrationSink(live bool, container container, snapshots []* defer func() { /* clean up our migration-send snapshots that we got from recv. */ - zfsSnapshots, err := zfsPoolListSnapshots(poolName, fmt.Sprintf("containers/%s", projectPrefix(container.Project(), container.Name()))) + zfsSnapshots, err := zfsPoolListSnapshots(poolName, fmt.Sprintf("containers/%s", projectPrefix(args.Container.Project(), args.Container.Name()))) if err != nil { logger.Errorf("Failed listing snapshots post migration: %s", err) return @@ -2840,23 +2839,23 @@ func (s *storageZfs) MigrationSink(live bool, container container, snapshots []* for _, snap := range zfsSnapshots { // If we received a bunch of snapshots, remove the migration-send-* ones, if not, wipe any snapshot we got - if snapshots != nil && len(snapshots) > 0 && !strings.HasPrefix(snap, "migration-send") { + if args.Snapshots != nil && len(args.Snapshots) > 0 && !strings.HasPrefix(snap, "migration-send") { continue } - zfsPoolVolumeSnapshotDestroy(poolName, fmt.Sprintf("containers/%s", projectPrefix(container.Project(), container.Name())), snap) + zfsPoolVolumeSnapshotDestroy(poolName, fmt.Sprintf("containers/%s", projectPrefix(args.Container.Project(), args.Container.Name())), snap) } }() /* finally, do the real container */ - wrapper := StorageProgressWriter(op, "fs_progress", container.Name()) + wrapper := StorageProgressWriter(op, "fs_progress", args.Container.Name()) if err := zfsRecv(zfsName, wrapper); err != nil { return err } - if live { + if args.Live { /* and again for the post-running snapshot if this was a live migration */ - wrapper := StorageProgressWriter(op, "fs_progress", container.Name()) + wrapper := StorageProgressWriter(op, "fs_progress", args.Container.Name()) if err := zfsRecv(zfsName, wrapper); err != nil { return err }
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel