[lxc-devel] [lxd/master] Instance Interface

tomponline on Github lxc-bot at linuxcontainers.org
Mon Sep 16 12:03:16 UTC 2019


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 646 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20190916/c551c41c/attachment-0001.bin>
-------------- next part --------------
From e125cd950eb3d2b3356c7e7a80a1ca41228812ee Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 16 Sep 2019 12:49:26 +0100
Subject: [PATCH 1/3] lxd: Adds instance interface

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/instance_interface.go | 118 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 118 insertions(+)
 create mode 100644 lxd/instance_interface.go

diff --git a/lxd/instance_interface.go b/lxd/instance_interface.go
new file mode 100644
index 0000000000..dcdc4c2198
--- /dev/null
+++ b/lxd/instance_interface.go
@@ -0,0 +1,118 @@
+package main
+
+import (
+	"io"
+	"os"
+	"os/exec"
+	"time"
+
+	"github.com/lxc/lxd/lxd/db"
+	"github.com/lxc/lxd/lxd/device"
+	"github.com/lxc/lxd/lxd/device/config"
+	"github.com/lxc/lxd/lxd/instance"
+	"github.com/lxc/lxd/lxd/state"
+	"github.com/lxc/lxd/shared/api"
+)
+
+// The Instance interface
+type Instance interface {
+	// Instance actions
+	Freeze() error
+	Shutdown(timeout time.Duration) error
+	Start(stateful bool) error
+	Stop(stateful bool) error
+	Unfreeze() error
+
+	IsPrivileged() bool
+
+	// Snapshots & migration & backups
+	Restore(source Instance, stateful bool) error
+	Snapshots() ([]Instance, error)
+	Backups() ([]backup, error)
+
+	// Config handling
+	Rename(newName string) error
+
+	// TODO rename db.ContainerArgs to db.InstanceArgs.
+	Update(newConfig db.ContainerArgs, userRequested bool) error
+
+	Delete() error
+	Export(w io.Writer, properties map[string]string) error
+
+	// Live configuration
+	CGroupGet(key string) (string, error)
+	CGroupSet(key string, value string) error
+	VolatileSet(changes map[string]string) error
+
+	// File handling
+	FileExists(path string) error
+	FilePull(srcpath string, dstpath string) (int64, int64, os.FileMode, string, []string, error)
+	FilePush(type_ string, srcpath string, dstpath string, uid int64, gid int64, mode int, write string) error
+	FileRemove(path string) error
+
+	// Console - Allocate and run a console tty.
+	//
+	// terminal  - Bidirectional file descriptor.
+	//
+	// This function will not return until the console has been exited by
+	// the user.
+	Console(terminal *os.File) *exec.Cmd
+	Exec(command []string, env map[string]string, stdin *os.File, stdout *os.File, stderr *os.File, wait bool, cwd string, uid uint32, gid uint32) (*exec.Cmd, int, int, error)
+
+	// Status
+	Render() (interface{}, interface{}, error)
+	RenderFull() (*api.InstanceFull, interface{}, error)
+	RenderState() (*api.InstanceState, error)
+	IsRunning() bool
+	IsFrozen() bool
+	IsEphemeral() bool
+	IsSnapshot() bool
+	IsStateful() bool
+
+	// Hooks
+	DeviceEventHandler(*device.RunConfig) error
+
+	// Properties
+	Id() int
+	Location() string
+	Project() string
+	Name() string
+	Type() instance.Type
+	Description() string
+	Architecture() int
+	CreationDate() time.Time
+	LastUsedDate() time.Time
+	ExpandedConfig() map[string]string
+	ExpandedDevices() config.Devices
+	LocalConfig() map[string]string
+	LocalDevices() config.Devices
+	Profiles() []string
+	InitPID() int
+	State() string
+	ExpiryDate() time.Time
+
+	// Paths
+	Path() string
+	RootfsPath() string
+	TemplatesPath() string
+	StatePath() string
+	LogFilePath() string
+	ConsoleBufferLogPath() string
+	LogPath() string
+	DevicesPath() string
+
+	// Storage
+	StoragePool() (string, error)
+
+	// Progress reporting
+
+	SetOperation(op *operation)
+
+	// FIXME: Those should be internal functions
+	// Needed for migration for now.
+	StorageStart() (bool, error)
+	StorageStop() (bool, error)
+	Storage() storage
+	TemplateApply(trigger string) error
+	DaemonState() *state.State
+}

From 31e214f05da08a32c92128ac2ed6b4815f0d655f Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 16 Sep 2019 12:50:50 +0100
Subject: [PATCH 2/3] lxd/container: Embeds the Instance interface into the
 container interface

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/container.go | 107 ++---------------------------------------------
 1 file changed, 4 insertions(+), 103 deletions(-)

diff --git a/lxd/container.go b/lxd/container.go
index dc97c5686c..e9b317c313 100644
--- a/lxd/container.go
+++ b/lxd/container.go
@@ -214,122 +214,23 @@ func containerValidDevices(state *state.State, cluster *db.Cluster, instanceName
 
 // The container interface
 type container interface {
-	// Container actions
-	Freeze() error
-	Shutdown(timeout time.Duration) error
-	Start(stateful bool) error
-	Stop(stateful bool) error
-	Unfreeze() error
-
-	// Snapshots & migration & backups
-	Restore(sourceContainer container, stateful bool) error
+	Instance
+
 	/* actionScript here is a script called action.sh in the stateDir, to
 	 * be passed to CRIU as --action-script
 	 */
 	Migrate(args *CriuMigrationArgs) error
-	Snapshots() ([]container, error)
-	Backups() ([]backup, error)
-
-	// Config handling
-	Rename(newName string) error
-	Update(newConfig db.ContainerArgs, userRequested bool) error
-
-	Delete() error
-	Export(w io.Writer, properties map[string]string) error
-
-	// Live configuration
-	CGroupGet(key string) (string, error)
-	CGroupSet(key string, value string) error
-	VolatileSet(changes map[string]string) error
-
-	// File handling
-	FileExists(path string) error
-	FilePull(srcpath string, dstpath string) (int64, int64, os.FileMode, string, []string, error)
-	FilePush(type_ string, srcpath string, dstpath string, uid int64, gid int64, mode int, write string) error
-	FileRemove(path string) error
-
-	// Console - Allocate and run a console tty.
-	//
-	// terminal  - Bidirectional file descriptor.
-	//
-	// This function will not return until the console has been exited by
-	// the user.
-	Console(terminal *os.File) *exec.Cmd
+
 	ConsoleLog(opts lxc.ConsoleLogOptions) (string, error)
-	/* Command execution:
-		 * 1. passing in false for wait
-		 *    - equivalent to calling cmd.Run()
-		 * 2. passing in true for wait
-	         *    - start the command and return its PID in the first return
-	         *      argument and the PID of the attached process in the second
-	         *      argument. It's the callers responsibility to wait on the
-	         *      command. (Note. The returned PID of the attached process can not
-	         *      be waited upon since it's a child of the lxd forkexec command
-	         *      (the PID returned in the first return argument). It can however
-	         *      be used to e.g. forward signals.)
-	*/
-	Exec(command []string, env map[string]string, stdin *os.File, stdout *os.File, stderr *os.File, wait bool, cwd string, uid uint32, gid uint32) (*exec.Cmd, int, int, error)
 
 	// Status
-	Render() (interface{}, interface{}, error)
-	RenderFull() (*api.InstanceFull, interface{}, error)
-	RenderState() (*api.InstanceState, error)
-	IsPrivileged() bool
-	IsRunning() bool
-	IsFrozen() bool
-	IsEphemeral() bool
-	IsSnapshot() bool
-	IsStateful() bool
 	IsNesting() bool
 
 	// Hooks
 	OnStart() error
 	OnStopNS(target string, netns string) error
 	OnStop(target string) error
-	DeviceEventHandler(*device.RunConfig) error
-
-	// Properties
-	Id() int
-	Location() string
-	Project() string
-	Name() string
-	Type() instance.Type
-	Description() string
-	Architecture() int
-	CreationDate() time.Time
-	LastUsedDate() time.Time
-	ExpandedConfig() map[string]string
-	ExpandedDevices() config.Devices
-	LocalConfig() map[string]string
-	LocalDevices() config.Devices
-	Profiles() []string
-	InitPID() int
-	State() string
-	ExpiryDate() time.Time
-
-	// Paths
-	Path() string
-	RootfsPath() string
-	TemplatesPath() string
-	StatePath() string
-	LogFilePath() string
-	ConsoleBufferLogPath() string
-	LogPath() string
-	DevicesPath() string
-
-	// Storage
-	StoragePool() (string, error)
-
-	// Progress reporting
-	SetOperation(op *operation)
-
-	// FIXME: Those should be internal functions
-	// Needed for migration for now.
-	StorageStart() (bool, error)
-	StorageStop() (bool, error)
-	Storage() storage
-	TemplateApply(trigger string) error
-	DaemonState() *state.State
+
 	InsertSeccompUnixDevice(prefix string, m config.Device, pid int) error
 
 	CurrentIdmap() (*idmap.IdmapSet, error)

From 836276715d0d3d5b64d841aa53211b410d4871fd Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 16 Sep 2019 12:58:17 +0100
Subject: [PATCH 3/3] lxd: Migrates storage references to container interface
 to instance interface

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/container.go               | 12 ++++----
 lxd/container_lxc.go           | 13 ++++++---
 lxd/migrate_container.go       |  6 ++--
 lxd/storage.go                 | 36 +++++++++++------------
 lxd/storage_btrfs.go           | 48 +++++++++++++++----------------
 lxd/storage_ceph.go            | 41 +++++++++++++--------------
 lxd/storage_ceph_utils.go      |  8 ++----
 lxd/storage_cephfs.go          | 38 ++++++++++++-------------
 lxd/storage_dir.go             | 44 ++++++++++++++--------------
 lxd/storage_lvm.go             | 40 +++++++++++++-------------
 lxd/storage_lvm_utils.go       | 12 ++++----
 lxd/storage_migration.go       |  8 +++---
 lxd/storage_migration_btrfs.go |  4 +--
 lxd/storage_mock.go            | 50 ++++++++++++--------------------
 lxd/storage_zfs.go             | 52 +++++++++++++++++-----------------
 15 files changed, 200 insertions(+), 212 deletions(-)

diff --git a/lxd/container.go b/lxd/container.go
index e9b317c313..ecae6c8ce4 100644
--- a/lxd/container.go
+++ b/lxd/container.go
@@ -463,7 +463,7 @@ func containerCreateAsCopy(s *state.State, args db.ContainerArgs, sourceContaine
 	}
 
 	csList := []*container{}
-	var snapshots []container
+	var snapshots []Instance
 
 	if !containerOnly {
 		if refresh {
@@ -1133,7 +1133,7 @@ func containerLoadAllInternal(cts []db.Instance, s *state.State) ([]container, e
 	return containers, nil
 }
 
-func containerCompareSnapshots(source container, target container) ([]container, []container, error) {
+func containerCompareSnapshots(source Instance, target container) ([]Instance, []Instance, error) {
 	// Get the source snapshots
 	sourceSnapshots, err := source.Snapshots()
 	if err != nil {
@@ -1150,8 +1150,8 @@ func containerCompareSnapshots(source container, target container) ([]container,
 	sourceSnapshotsTime := map[string]time.Time{}
 	targetSnapshotsTime := map[string]time.Time{}
 
-	toDelete := []container{}
-	toSync := []container{}
+	toDelete := []Instance{}
+	toSync := []Instance{}
 
 	for _, snap := range sourceSnapshots {
 		_, snapName, _ := shared.ContainerGetParentAndSnapshotName(snap.Name())
@@ -1336,7 +1336,7 @@ func pruneExpiredContainerSnapshotsTask(d *Daemon) (task.Func, task.Schedule) {
 		}
 
 		// Figure out which need snapshotting (if any)
-		expiredSnapshots := []container{}
+		expiredSnapshots := []Instance{}
 		for _, c := range allContainers {
 			snapshots, err := c.Snapshots()
 			if err != nil {
@@ -1395,7 +1395,7 @@ func pruneExpiredContainerSnapshotsTask(d *Daemon) (task.Func, task.Schedule) {
 	return f, schedule
 }
 
-func pruneExpiredContainerSnapshots(ctx context.Context, d *Daemon, snapshots []container) error {
+func pruneExpiredContainerSnapshots(ctx context.Context, d *Daemon, snapshots []Instance) error {
 	// Find snapshots to delete
 	for _, snapshot := range snapshots {
 		err := snapshot.Delete()
diff --git a/lxd/container_lxc.go b/lxd/container_lxc.go
index 140b735cd6..a93d3b6504 100644
--- a/lxd/container_lxc.go
+++ b/lxd/container_lxc.go
@@ -3369,11 +3369,11 @@ func (c *containerLXC) RenderState() (*api.InstanceState, error) {
 	return &status, nil
 }
 
-func (c *containerLXC) Snapshots() ([]container, error) {
+func (c *containerLXC) Snapshots() ([]Instance, error) {
 	var snaps []db.Instance
 
 	if c.IsSnapshot() {
-		return []container{}, nil
+		return []Instance{}, nil
 	}
 
 	// Get all the snapshots
@@ -3396,7 +3396,12 @@ func (c *containerLXC) Snapshots() ([]container, error) {
 		return nil, err
 	}
 
-	return containers, nil
+	instances := make([]Instance, len(containers))
+	for k, v := range containers {
+		instances[k] = Instance(v)
+	}
+
+	return instances, nil
 }
 
 func (c *containerLXC) Backups() ([]backup, error) {
@@ -3420,7 +3425,7 @@ func (c *containerLXC) Backups() ([]backup, error) {
 	return backups, nil
 }
 
-func (c *containerLXC) Restore(sourceContainer container, stateful bool) error {
+func (c *containerLXC) Restore(sourceContainer Instance, stateful bool) error {
 	var ctxMap log.Ctx
 
 	// Initialize storage interface for the container.
diff --git a/lxd/migrate_container.go b/lxd/migrate_container.go
index 850d761e63..188612b98e 100644
--- a/lxd/migrate_container.go
+++ b/lxd/migrate_container.go
@@ -77,7 +77,7 @@ fi
 	return err
 }
 
-func snapshotToProtobuf(c container) *migration.Snapshot {
+func snapshotToProtobuf(c Instance) *migration.Snapshot {
 	config := []*migration.Config{}
 	for k, v := range c.LocalConfig() {
 		kCopy := string(k)
@@ -1137,12 +1137,12 @@ func (s *migrationSourceWs) ConnectContainerTarget(target api.InstancePostTarget
 	return s.ConnectTarget(target.Certificate, target.Operation, target.Websockets)
 }
 
-func migrationCompareSnapshots(sourceSnapshots []*migration.Snapshot, targetSnapshots []container) ([]*migration.Snapshot, []container) {
+func migrationCompareSnapshots(sourceSnapshots []*migration.Snapshot, targetSnapshots []Instance) ([]*migration.Snapshot, []Instance) {
 	// Compare source and target
 	sourceSnapshotsTime := map[string]int64{}
 	targetSnapshotsTime := map[string]int64{}
 
-	toDelete := []container{}
+	toDelete := []Instance{}
 	toSync := []*migration.Snapshot{}
 
 	for _, snap := range sourceSnapshots {
diff --git a/lxd/storage.go b/lxd/storage.go
index 266216c127..9db3c4f91b 100644
--- a/lxd/storage.go
+++ b/lxd/storage.go
@@ -189,32 +189,32 @@ type storage interface {
 
 	// Functions dealing with container storage volumes.
 	// ContainerCreate creates an empty container (no rootfs/metadata.yaml)
-	ContainerCreate(container container) error
+	ContainerCreate(container Instance) error
 
 	// ContainerCreateFromImage creates a container from a image.
-	ContainerCreateFromImage(c container, fingerprint string, tracker *ioprogress.ProgressTracker) error
-	ContainerDelete(c container) error
-	ContainerCopy(target container, source container, containerOnly bool) error
-	ContainerRefresh(target container, source container, snapshots []container) error
-	ContainerMount(c container) (bool, error)
-	ContainerUmount(c container, path string) (bool, error)
-	ContainerRename(container container, newName string) error
-	ContainerRestore(container container, sourceContainer container) error
-	ContainerGetUsage(container container) (int64, error)
+	ContainerCreateFromImage(c Instance, fingerprint string, tracker *ioprogress.ProgressTracker) error
+	ContainerDelete(c Instance) error
+	ContainerCopy(target Instance, source Instance, containerOnly bool) error
+	ContainerRefresh(target Instance, source Instance, snapshots []Instance) error
+	ContainerMount(c Instance) (bool, error)
+	ContainerUmount(c Instance, path string) (bool, error)
+	ContainerRename(container Instance, newName string) error
+	ContainerRestore(container Instance, sourceContainer Instance) error
+	ContainerGetUsage(container Instance) (int64, error)
 	GetContainerPoolInfo() (int64, string, string)
-	ContainerStorageReady(container container) bool
+	ContainerStorageReady(container Instance) bool
 
-	ContainerSnapshotCreate(target container, source container) error
-	ContainerSnapshotDelete(c container) error
-	ContainerSnapshotRename(c container, newName string) error
-	ContainerSnapshotStart(c container) (bool, error)
-	ContainerSnapshotStop(c container) (bool, error)
+	ContainerSnapshotCreate(target Instance, source Instance) error
+	ContainerSnapshotDelete(c Instance) error
+	ContainerSnapshotRename(c Instance, newName string) error
+	ContainerSnapshotStart(c Instance) (bool, error)
+	ContainerSnapshotStop(c Instance) (bool, error)
 
-	ContainerBackupCreate(backup backup, sourceContainer container) error
+	ContainerBackupCreate(backup backup, sourceContainer Instance) error
 	ContainerBackupLoad(info backupInfo, data io.ReadSeeker, tarArgs []string) error
 
 	// For use in migrating snapshots.
-	ContainerSnapshotCreateEmpty(c container) error
+	ContainerSnapshotCreateEmpty(c Instance) error
 
 	// Functions dealing with image storage volumes.
 	ImageCreate(fingerprint string, tracker *ioprogress.ProgressTracker) error
diff --git a/lxd/storage_btrfs.go b/lxd/storage_btrfs.go
index 7aad51d7fb..7d93d29d80 100644
--- a/lxd/storage_btrfs.go
+++ b/lxd/storage_btrfs.go
@@ -800,7 +800,7 @@ func (s *storageBtrfs) StoragePoolVolumeRename(newName string) error {
 }
 
 // Functions dealing with container storage.
-func (s *storageBtrfs) ContainerStorageReady(container container) bool {
+func (s *storageBtrfs) ContainerStorageReady(container Instance) bool {
 	containerMntPoint := driver.GetContainerMountPoint(container.Project(), s.pool.Name, container.Name())
 	return isBtrfsSubVolume(containerMntPoint)
 }
@@ -845,7 +845,7 @@ func (s *storageBtrfs) doContainerCreate(projectName, name string, privileged bo
 	return nil
 }
 
-func (s *storageBtrfs) ContainerCreate(container container) error {
+func (s *storageBtrfs) ContainerCreate(container Instance) error {
 	err := s.doContainerCreate(container.Project(), container.Name(), container.IsPrivileged())
 	if err != nil {
 		return err
@@ -855,7 +855,7 @@ func (s *storageBtrfs) ContainerCreate(container container) error {
 }
 
 // And this function is why I started hating on btrfs...
-func (s *storageBtrfs) ContainerCreateFromImage(container container, fingerprint string, tracker *ioprogress.ProgressTracker) error {
+func (s *storageBtrfs) ContainerCreateFromImage(container Instance, fingerprint string, tracker *ioprogress.ProgressTracker) error {
 	logger.Debugf("Creating BTRFS storage volume for container \"%s\" on storage pool \"%s\"", s.volume.Name, s.pool.Name)
 
 	source := s.pool.Config["source"]
@@ -938,7 +938,7 @@ func (s *storageBtrfs) ContainerCreateFromImage(container container, fingerprint
 	return nil
 }
 
-func (s *storageBtrfs) ContainerDelete(container container) error {
+func (s *storageBtrfs) ContainerDelete(container Instance) error {
 	logger.Debugf("Deleting BTRFS storage volume for container \"%s\" on storage pool \"%s\"", s.volume.Name, s.pool.Name)
 
 	// The storage pool needs to be mounted.
@@ -985,7 +985,7 @@ func (s *storageBtrfs) ContainerDelete(container container) error {
 	return nil
 }
 
-func (s *storageBtrfs) copyContainer(target container, source container) error {
+func (s *storageBtrfs) copyContainer(target Instance, source Instance) error {
 	sourceContainerSubvolumeName := driver.GetContainerMountPoint(source.Project(), s.pool.Name, source.Name())
 	if source.IsSnapshot() {
 		sourceContainerSubvolumeName = driver.GetSnapshotMountPoint(source.Project(), s.pool.Name, source.Name())
@@ -1050,7 +1050,7 @@ func (s *storageBtrfs) copySnapshot(target container, source container) error {
 	return nil
 }
 
-func (s *storageBtrfs) doCrossPoolContainerCopy(target container, source container, containerOnly bool, refresh bool, refreshSnapshots []container) error {
+func (s *storageBtrfs) doCrossPoolContainerCopy(target Instance, source Instance, containerOnly bool, refresh bool, refreshSnapshots []Instance) error {
 	sourcePool, err := source.StoragePool()
 	if err != nil {
 		return err
@@ -1075,7 +1075,7 @@ func (s *storageBtrfs) doCrossPoolContainerCopy(target container, source contain
 		return err
 	}
 
-	var snapshots []container
+	var snapshots []Instance
 
 	if refresh {
 		snapshots = refreshSnapshots
@@ -1122,7 +1122,7 @@ func (s *storageBtrfs) doCrossPoolContainerCopy(target container, source contain
 	return nil
 }
 
-func (s *storageBtrfs) ContainerCopy(target container, source container, containerOnly bool) error {
+func (s *storageBtrfs) ContainerCopy(target Instance, source Instance, containerOnly bool) error {
 	logger.Debugf("Copying BTRFS container storage %s to %s", source.Name(), target.Name())
 
 	// The storage pool needs to be mounted.
@@ -1188,7 +1188,7 @@ func (s *storageBtrfs) ContainerCopy(target container, source container, contain
 	return nil
 }
 
-func (s *storageBtrfs) ContainerRefresh(target container, source container, snapshots []container) error {
+func (s *storageBtrfs) ContainerRefresh(target Instance, source Instance, snapshots []Instance) error {
 	logger.Debugf("Refreshing BTRFS container storage for %s from %s", target.Name(), source.Name())
 
 	// The storage pool needs to be mounted.
@@ -1208,7 +1208,7 @@ func (s *storageBtrfs) ContainerRefresh(target container, source container, snap
 	return s.doCrossPoolContainerCopy(target, source, len(snapshots) == 0, true, snapshots)
 }
 
-func (s *storageBtrfs) ContainerMount(c container) (bool, error) {
+func (s *storageBtrfs) ContainerMount(c Instance) (bool, error) {
 	logger.Debugf("Mounting BTRFS storage volume for container \"%s\" on storage pool \"%s\"", s.volume.Name, s.pool.Name)
 
 	// The storage pool must be mounted.
@@ -1221,11 +1221,11 @@ func (s *storageBtrfs) ContainerMount(c container) (bool, error) {
 	return true, nil
 }
 
-func (s *storageBtrfs) ContainerUmount(c container, path string) (bool, error) {
+func (s *storageBtrfs) ContainerUmount(c Instance, path string) (bool, error) {
 	return true, nil
 }
 
-func (s *storageBtrfs) ContainerRename(container container, newName string) error {
+func (s *storageBtrfs) ContainerRename(container Instance, newName string) error {
 	logger.Debugf("Renaming BTRFS storage volume for container \"%s\" from %s to %s", s.volume.Name, s.volume.Name, newName)
 
 	// The storage pool must be mounted.
@@ -1274,7 +1274,7 @@ func (s *storageBtrfs) ContainerRename(container container, newName string) erro
 	return nil
 }
 
-func (s *storageBtrfs) ContainerRestore(container container, sourceContainer container) error {
+func (s *storageBtrfs) ContainerRestore(container Instance, sourceContainer Instance) error {
 	logger.Debugf("Restoring BTRFS storage volume for container \"%s\" from %s to %s", s.volume.Name, sourceContainer.Name(), container.Name())
 
 	// The storage pool must be mounted.
@@ -1359,7 +1359,7 @@ func (s *storageBtrfs) ContainerRestore(container container, sourceContainer con
 	return failure
 }
 
-func (s *storageBtrfs) ContainerGetUsage(container container) (int64, error) {
+func (s *storageBtrfs) ContainerGetUsage(container Instance) (int64, error) {
 	return s.btrfsPoolVolumeQGroupUsage(container.Path())
 }
 
@@ -1412,7 +1412,7 @@ func (s *storageBtrfs) doContainerSnapshotCreate(projectName string, targetName
 	return nil
 }
 
-func (s *storageBtrfs) ContainerSnapshotCreate(snapshotContainer container, sourceContainer container) error {
+func (s *storageBtrfs) ContainerSnapshotCreate(snapshotContainer Instance, sourceContainer Instance) error {
 	err := s.doContainerSnapshotCreate(sourceContainer.Project(), snapshotContainer.Name(), sourceContainer.Name())
 	if err != nil {
 		s.ContainerSnapshotDelete(snapshotContainer)
@@ -1451,7 +1451,7 @@ func btrfsSnapshotDeleteInternal(projectName, poolName string, snapshotName stri
 	return nil
 }
 
-func (s *storageBtrfs) ContainerSnapshotDelete(snapshotContainer container) error {
+func (s *storageBtrfs) ContainerSnapshotDelete(snapshotContainer Instance) error {
 	logger.Debugf("Deleting BTRFS storage volume for snapshot \"%s\" on storage pool \"%s\"", s.volume.Name, s.pool.Name)
 
 	_, err := s.StoragePoolMount()
@@ -1468,7 +1468,7 @@ func (s *storageBtrfs) ContainerSnapshotDelete(snapshotContainer container) erro
 	return nil
 }
 
-func (s *storageBtrfs) ContainerSnapshotStart(container container) (bool, error) {
+func (s *storageBtrfs) ContainerSnapshotStart(container Instance) (bool, error) {
 	logger.Debugf("Initializing BTRFS storage volume for snapshot \"%s\" on storage pool \"%s\"", s.volume.Name, s.pool.Name)
 
 	_, err := s.StoragePoolMount()
@@ -1497,7 +1497,7 @@ func (s *storageBtrfs) ContainerSnapshotStart(container container) (bool, error)
 	return true, nil
 }
 
-func (s *storageBtrfs) ContainerSnapshotStop(container container) (bool, error) {
+func (s *storageBtrfs) ContainerSnapshotStop(container Instance) (bool, error) {
 	logger.Debugf("Stopping BTRFS storage volume for snapshot \"%s\" on storage pool \"%s\"", s.volume.Name, s.pool.Name)
 
 	_, err := s.StoragePoolMount()
@@ -1529,7 +1529,7 @@ func (s *storageBtrfs) ContainerSnapshotStop(container container) (bool, error)
 }
 
 // ContainerSnapshotRename renames a snapshot of a container.
-func (s *storageBtrfs) ContainerSnapshotRename(snapshotContainer container, newName string) error {
+func (s *storageBtrfs) ContainerSnapshotRename(snapshotContainer Instance, newName string) error {
 	logger.Debugf("Renaming BTRFS storage volume for snapshot \"%s\" from %s to %s", s.volume.Name, s.volume.Name, newName)
 
 	// The storage pool must be mounted.
@@ -1553,7 +1553,7 @@ func (s *storageBtrfs) ContainerSnapshotRename(snapshotContainer container, newN
 
 // Needed for live migration where an empty snapshot needs to be created before
 // rsyncing into it.
-func (s *storageBtrfs) ContainerSnapshotCreateEmpty(snapshotContainer container) error {
+func (s *storageBtrfs) ContainerSnapshotCreateEmpty(snapshotContainer Instance) error {
 	logger.Debugf("Creating empty BTRFS storage volume for snapshot \"%s\" on storage pool \"%s\"", s.volume.Name, s.pool.Name)
 
 	// Mount the storage pool.
@@ -1615,7 +1615,7 @@ func (s *storageBtrfs) doBtrfsBackup(cur string, prev string, target string) err
 	return err
 }
 
-func (s *storageBtrfs) doContainerBackupCreateOptimized(tmpPath string, backup backup, source container) error {
+func (s *storageBtrfs) doContainerBackupCreateOptimized(tmpPath string, backup backup, source Instance) error {
 	// Handle snapshots
 	finalParent := ""
 	if !backup.instanceOnly {
@@ -1688,7 +1688,7 @@ func (s *storageBtrfs) doContainerBackupCreateOptimized(tmpPath string, backup b
 	return nil
 }
 
-func (s *storageBtrfs) doContainerBackupCreateVanilla(tmpPath string, backup backup, source container) error {
+func (s *storageBtrfs) doContainerBackupCreateVanilla(tmpPath string, backup backup, source Instance) error {
 	// Prepare for rsync
 	rsync := func(oldPath string, newPath string, bwlimit string) error {
 		output, err := rsyncLocalCopy(oldPath, newPath, bwlimit, true)
@@ -1771,7 +1771,7 @@ func (s *storageBtrfs) doContainerBackupCreateVanilla(tmpPath string, backup bac
 	return nil
 }
 
-func (s *storageBtrfs) ContainerBackupCreate(backup backup, source container) error {
+func (s *storageBtrfs) ContainerBackupCreate(backup backup, source Instance) error {
 	// Start storage
 	ourStart, err := source.StorageStart()
 	if err != nil {
@@ -2456,7 +2456,7 @@ func (s *storageBtrfs) MigrationSource(args MigrationSourceArgs) (MigrationStora
 	 * xfer costs. Then, after all that, we send the container itself.
 	 */
 	var err error
-	var snapshots = []container{}
+	var snapshots = []Instance{}
 	if !args.InstanceOnly {
 		snapshots, err = args.Container.Snapshots()
 		if err != nil {
diff --git a/lxd/storage_ceph.go b/lxd/storage_ceph.go
index 7085688140..c76a3741fe 100644
--- a/lxd/storage_ceph.go
+++ b/lxd/storage_ceph.go
@@ -758,7 +758,7 @@ func (s *storageCeph) StoragePoolUpdate(writable *api.StoragePoolPut, changedCon
 	return nil
 }
 
-func (s *storageCeph) ContainerStorageReady(container container) bool {
+func (s *storageCeph) ContainerStorageReady(container Instance) bool {
 	name := container.Name()
 	logger.Debugf(`Checking if RBD storage volume for container "%s" on storage pool "%s" is ready`, name, s.pool.Name)
 
@@ -773,7 +773,7 @@ func (s *storageCeph) ContainerStorageReady(container container) bool {
 	return true
 }
 
-func (s *storageCeph) ContainerCreate(container container) error {
+func (s *storageCeph) ContainerCreate(container Instance) error {
 	containerName := container.Name()
 	err := s.doContainerCreate(container.Project(), containerName, container.IsPrivileged())
 	if err != nil {
@@ -792,7 +792,7 @@ func (s *storageCeph) ContainerCreate(container container) error {
 	return nil
 }
 
-func (s *storageCeph) ContainerCreateFromImage(container container, fingerprint string, tracker *ioprogress.ProgressTracker) error {
+func (s *storageCeph) ContainerCreateFromImage(container Instance, fingerprint string, tracker *ioprogress.ProgressTracker) error {
 	logger.Debugf(`Creating RBD storage volume for container "%s" on storage pool "%s"`, s.volume.Name, s.pool.Name)
 
 	revert := true
@@ -944,7 +944,7 @@ func (s *storageCeph) ContainerCreateFromImage(container container, fingerprint
 	return nil
 }
 
-func (s *storageCeph) ContainerDelete(container container) error {
+func (s *storageCeph) ContainerDelete(container Instance) error {
 	containerName := container.Name()
 	logger.Debugf(`Deleting RBD storage volume for container "%s" on storage pool "%s"`, containerName, s.pool.Name)
 
@@ -993,7 +993,7 @@ func (s *storageCeph) ContainerDelete(container container) error {
 // - for each snapshot dump the contents into the empty storage volume and
 //   after each dump take a snapshot of the rbd storage volume
 // - dump the container contents into the rbd storage volume.
-func (s *storageCeph) doCrossPoolContainerCopy(target container, source container, containerOnly bool, refresh bool, refreshSnapshots []container) error {
+func (s *storageCeph) doCrossPoolContainerCopy(target Instance, source Instance, containerOnly bool, refresh bool, refreshSnapshots []Instance) error {
 	sourcePool, err := source.StoragePool()
 	if err != nil {
 		return err
@@ -1018,7 +1018,7 @@ func (s *storageCeph) doCrossPoolContainerCopy(target container, source containe
 		return err
 	}
 
-	var snapshots []container
+	var snapshots []Instance
 
 	if refresh {
 		snapshots = refreshSnapshots
@@ -1088,8 +1088,7 @@ func (s *storageCeph) doCrossPoolContainerCopy(target container, source containe
 	return nil
 }
 
-func (s *storageCeph) ContainerCopy(target container, source container,
-	containerOnly bool) error {
+func (s *storageCeph) ContainerCopy(target Instance, source Instance, containerOnly bool) error {
 	sourceContainerName := source.Name()
 	logger.Debugf(`Copying RBD container storage %s to %s`, sourceContainerName, target.Name())
 
@@ -1322,13 +1321,13 @@ func (s *storageCeph) ContainerCopy(target container, source container,
 	return nil
 }
 
-func (s *storageCeph) ContainerRefresh(target container, source container, snapshots []container) error {
+func (s *storageCeph) ContainerRefresh(target Instance, source Instance, snapshots []Instance) error {
 	logger.Debugf(`Refreshing RBD container storage for %s from %s`, target.Name(), source.Name())
 
 	return s.doCrossPoolContainerCopy(target, source, len(snapshots) == 0, true, snapshots)
 }
 
-func (s *storageCeph) ContainerMount(c container) (bool, error) {
+func (s *storageCeph) ContainerMount(c Instance) (bool, error) {
 	logger.Debugf("Mounting RBD storage volume for container \"%s\" on storage pool \"%s\"", s.volume.Name, s.pool.Name)
 
 	ourMount, err := s.doContainerMount(c.Project(), c.Name())
@@ -1340,7 +1339,7 @@ func (s *storageCeph) ContainerMount(c container) (bool, error) {
 	return ourMount, nil
 }
 
-func (s *storageCeph) ContainerUmount(c container, path string) (bool, error) {
+func (s *storageCeph) ContainerUmount(c Instance, path string) (bool, error) {
 	logger.Debugf("Unmounting RBD storage volume for container \"%s\" on storage pool \"%s\"", s.volume.Name, s.pool.Name)
 	name := c.Name()
 
@@ -1389,7 +1388,7 @@ func (s *storageCeph) ContainerUmount(c container, path string) (bool, error) {
 	return ourUmount, nil
 }
 
-func (s *storageCeph) ContainerRename(c container, newName string) error {
+func (s *storageCeph) ContainerRename(c Instance, newName string) error {
 	oldName := c.Name()
 	containerPath := c.Path()
 
@@ -1541,7 +1540,7 @@ func (s *storageCeph) ContainerRename(c container, newName string) error {
 	return nil
 }
 
-func (s *storageCeph) ContainerRestore(target container, source container) error {
+func (s *storageCeph) ContainerRestore(target Instance, source Instance) error {
 	sourceName := source.Name()
 	targetName := target.Name()
 
@@ -1583,11 +1582,11 @@ func (s *storageCeph) ContainerRestore(target container, source container) error
 	return nil
 }
 
-func (s *storageCeph) ContainerGetUsage(container container) (int64, error) {
+func (s *storageCeph) ContainerGetUsage(container Instance) (int64, error) {
 	return -1, fmt.Errorf("RBD quotas are currently not supported")
 }
 
-func (s *storageCeph) ContainerSnapshotCreate(snapshotContainer container, sourceContainer container) error {
+func (s *storageCeph) ContainerSnapshotCreate(snapshotContainer Instance, sourceContainer Instance) error {
 	containerMntPoint := driver.GetContainerMountPoint(sourceContainer.Project(), s.pool.Name, sourceContainer.Name())
 	if shared.IsMountPoint(containerMntPoint) {
 		// This is costly but we need to ensure that all cached data has
@@ -1606,7 +1605,7 @@ func (s *storageCeph) ContainerSnapshotCreate(snapshotContainer container, sourc
 	return s.doContainerSnapshotCreate(sourceContainer.Project(), snapshotContainer.Name(), sourceContainer.Name())
 }
 
-func (s *storageCeph) ContainerSnapshotDelete(snapshotContainer container) error {
+func (s *storageCeph) ContainerSnapshotDelete(snapshotContainer Instance) error {
 	logger.Debugf(`Deleting RBD storage volume for snapshot "%s" on storage pool "%s"`, s.volume.Name, s.pool.Name)
 
 	snapshotContainerName := snapshotContainer.Name()
@@ -1672,7 +1671,7 @@ func (s *storageCeph) ContainerSnapshotDelete(snapshotContainer container) error
 	return nil
 }
 
-func (s *storageCeph) ContainerSnapshotRename(c container, newName string) error {
+func (s *storageCeph) ContainerSnapshotRename(c Instance, newName string) error {
 	oldName := c.Name()
 	logger.Debugf(`Renaming RBD storage volume for snapshot "%s" from "%s" to "%s"`, oldName, oldName, newName)
 
@@ -1720,7 +1719,7 @@ func (s *storageCeph) ContainerSnapshotRename(c container, newName string) error
 	return nil
 }
 
-func (s *storageCeph) ContainerSnapshotStart(c container) (bool, error) {
+func (s *storageCeph) ContainerSnapshotStart(c Instance) (bool, error) {
 	containerName := c.Name()
 	logger.Debugf(`Initializing RBD storage volume for snapshot "%s" on storage pool "%s"`, containerName, s.pool.Name)
 
@@ -1836,7 +1835,7 @@ func (s *storageCeph) ContainerSnapshotStart(c container) (bool, error) {
 	return true, nil
 }
 
-func (s *storageCeph) ContainerSnapshotStop(c container) (bool, error) {
+func (s *storageCeph) ContainerSnapshotStop(c Instance) (bool, error) {
 	logger.Debugf(`Stopping RBD storage volume for snapshot "%s" on storage pool "%s"`, c.Name(), s.pool.Name)
 
 	containerName := c.Name()
@@ -1883,14 +1882,14 @@ func (s *storageCeph) ContainerSnapshotStop(c container) (bool, error) {
 	return true, nil
 }
 
-func (s *storageCeph) ContainerSnapshotCreateEmpty(c container) error {
+func (s *storageCeph) ContainerSnapshotCreateEmpty(c Instance) error {
 	logger.Debugf(`Creating empty RBD storage volume for snapshot "%s" on storage pool "%s" (noop)`, c.Name(), s.pool.Name)
 
 	logger.Debugf(`Created empty RBD storage volume for snapshot "%s" on storage pool "%s" (noop)`, c.Name(), s.pool.Name)
 	return nil
 }
 
-func (s *storageCeph) ContainerBackupCreate(backup backup, source container) error {
+func (s *storageCeph) ContainerBackupCreate(backup backup, source Instance) error {
 	// Start storage
 	ourStart, err := source.StorageStart()
 	if err != nil {
diff --git a/lxd/storage_ceph_utils.go b/lxd/storage_ceph_utils.go
index 1a82a510f6..4d5c20222e 100644
--- a/lxd/storage_ceph_utils.go
+++ b/lxd/storage_ceph_utils.go
@@ -727,8 +727,7 @@ func (s *storageCeph) getRBDMountOptions() string {
 // copyWithoutSnapshotsFull creates a non-sparse copy of a container
 // This does not introduce a dependency relation between the source RBD storage
 // volume and the target RBD storage volume.
-func (s *storageCeph) copyWithoutSnapshotsFull(target container,
-	source container) error {
+func (s *storageCeph) copyWithoutSnapshotsFull(target Instance, source Instance) error {
 	logger.Debugf(`Creating non-sparse copy of RBD storage volume for container "%s" to "%s" without snapshots`, source.Name(), target.Name())
 
 	sourceIsSnapshot := source.IsSnapshot()
@@ -796,8 +795,7 @@ func (s *storageCeph) copyWithoutSnapshotsFull(target container,
 // copyWithoutSnapshotsFull creates a sparse copy of a container
 // This introduces a dependency relation between the source RBD storage volume
 // and the target RBD storage volume.
-func (s *storageCeph) copyWithoutSnapshotsSparse(target container,
-	source container) error {
+func (s *storageCeph) copyWithoutSnapshotsSparse(target Instance, source Instance) error {
 	logger.Debugf(`Creating sparse copy of RBD storage volume for container "%s" to "%s" without snapshots`, source.Name(),
 		target.Name())
 
@@ -1586,7 +1584,7 @@ func (s *storageCeph) cephRBDVolumeDumpToFile(sourceVolumeName string, file stri
 }
 
 // cephRBDVolumeBackupCreate creates a backup of a container or snapshot.
-func (s *storageCeph) cephRBDVolumeBackupCreate(tmpPath string, backup backup, source container) error {
+func (s *storageCeph) cephRBDVolumeBackupCreate(tmpPath string, backup backup, source Instance) error {
 	sourceIsSnapshot := source.IsSnapshot()
 	sourceContainerName := source.Name()
 	sourceContainerOnlyName := project.Prefix(source.Project(), sourceContainerName)
diff --git a/lxd/storage_cephfs.go b/lxd/storage_cephfs.go
index 305de37498..0c3f8b9aa3 100644
--- a/lxd/storage_cephfs.go
+++ b/lxd/storage_cephfs.go
@@ -618,81 +618,81 @@ func (s *storageCephFs) StoragePoolVolumeRename(newName string) error {
 	return nil
 }
 
-func (s *storageCephFs) ContainerStorageReady(container container) bool {
+func (s *storageCephFs) ContainerStorageReady(container Instance) bool {
 	containerMntPoint := driver.GetContainerMountPoint(container.Project(), s.pool.Name, container.Name())
 	ok, _ := shared.PathIsEmpty(containerMntPoint)
 	return !ok
 }
 
-func (s *storageCephFs) ContainerCreate(container container) error {
+func (s *storageCephFs) ContainerCreate(container Instance) error {
 	return fmt.Errorf("CEPHFS cannot be used for containers")
 }
 
-func (s *storageCephFs) ContainerCreateFromImage(container container, imageFingerprint string, tracker *ioprogress.ProgressTracker) error {
+func (s *storageCephFs) ContainerCreateFromImage(container Instance, imageFingerprint string, tracker *ioprogress.ProgressTracker) error {
 	return fmt.Errorf("CEPHFS cannot be used for containers")
 }
 
-func (s *storageCephFs) ContainerCanRestore(container container, sourceContainer container) error {
+func (s *storageCephFs) ContainerCanRestore(container Instance, sourceContainer Instance) error {
 	return fmt.Errorf("CEPHFS cannot be used for containers")
 }
 
-func (s *storageCephFs) ContainerDelete(container container) error {
+func (s *storageCephFs) ContainerDelete(container Instance) error {
 	return fmt.Errorf("CEPHFS cannot be used for containers")
 }
 
-func (s *storageCephFs) ContainerCopy(target container, source container, containerOnly bool) error {
+func (s *storageCephFs) ContainerCopy(target Instance, source Instance, containerOnly bool) error {
 	return fmt.Errorf("CEPHFS cannot be used for containers")
 }
 
-func (s *storageCephFs) ContainerRefresh(target container, source container, snapshots []container) error {
+func (s *storageCephFs) ContainerRefresh(target Instance, source Instance, snapshots []Instance) error {
 	return fmt.Errorf("CEPHFS cannot be used for containers")
 }
 
-func (s *storageCephFs) ContainerMount(c container) (bool, error) {
+func (s *storageCephFs) ContainerMount(c Instance) (bool, error) {
 	return false, fmt.Errorf("CEPHFS cannot be used for containers")
 }
 
-func (s *storageCephFs) ContainerUmount(c container, path string) (bool, error) {
+func (s *storageCephFs) ContainerUmount(c Instance, path string) (bool, error) {
 	return false, fmt.Errorf("CEPHFS cannot be used for containers")
 }
 
-func (s *storageCephFs) ContainerRename(container container, newName string) error {
+func (s *storageCephFs) ContainerRename(container Instance, newName string) error {
 	return fmt.Errorf("CEPHFS cannot be used for containers")
 }
 
-func (s *storageCephFs) ContainerRestore(container container, sourceContainer container) error {
+func (s *storageCephFs) ContainerRestore(container Instance, sourceContainer Instance) error {
 	return fmt.Errorf("CEPHFS cannot be used for containers")
 }
 
-func (s *storageCephFs) ContainerGetUsage(c container) (int64, error) {
+func (s *storageCephFs) ContainerGetUsage(c Instance) (int64, error) {
 	return -1, fmt.Errorf("CEPHFS cannot be used for containers")
 }
 
-func (s *storageCephFs) ContainerSnapshotCreate(snapshotContainer container, sourceContainer container) error {
+func (s *storageCephFs) ContainerSnapshotCreate(snapshotContainer Instance, sourceContainer Instance) error {
 	return fmt.Errorf("CEPHFS cannot be used for containers")
 }
 
-func (s *storageCephFs) ContainerSnapshotCreateEmpty(snapshotContainer container) error {
+func (s *storageCephFs) ContainerSnapshotCreateEmpty(snapshotContainer Instance) error {
 	return fmt.Errorf("CEPHFS cannot be used for containers")
 }
 
-func (s *storageCephFs) ContainerSnapshotDelete(snapshotContainer container) error {
+func (s *storageCephFs) ContainerSnapshotDelete(snapshotContainer Instance) error {
 	return fmt.Errorf("CEPHFS cannot be used for containers")
 }
 
-func (s *storageCephFs) ContainerSnapshotRename(snapshotContainer container, newName string) error {
+func (s *storageCephFs) ContainerSnapshotRename(snapshotContainer Instance, newName string) error {
 	return fmt.Errorf("CEPHFS cannot be used for containers")
 }
 
-func (s *storageCephFs) ContainerSnapshotStart(container container) (bool, error) {
+func (s *storageCephFs) ContainerSnapshotStart(container Instance) (bool, error) {
 	return false, fmt.Errorf("CEPHFS cannot be used for containers")
 }
 
-func (s *storageCephFs) ContainerSnapshotStop(container container) (bool, error) {
+func (s *storageCephFs) ContainerSnapshotStop(container Instance) (bool, error) {
 	return false, fmt.Errorf("CEPHFS cannot be used for containers")
 }
 
-func (s *storageCephFs) ContainerBackupCreate(backup backup, source container) error {
+func (s *storageCephFs) ContainerBackupCreate(backup backup, source Instance) error {
 	return fmt.Errorf("CEPHFS cannot be used for containers")
 }
 
diff --git a/lxd/storage_dir.go b/lxd/storage_dir.go
index 3c0d464b1a..ee04ffad0b 100644
--- a/lxd/storage_dir.go
+++ b/lxd/storage_dir.go
@@ -488,13 +488,13 @@ func (s *storageDir) StoragePoolVolumeRename(newName string) error {
 		storagePoolVolumeTypeCustom, s.poolID)
 }
 
-func (s *storageDir) ContainerStorageReady(container container) bool {
+func (s *storageDir) ContainerStorageReady(container Instance) bool {
 	containerMntPoint := driver.GetContainerMountPoint(container.Project(), s.pool.Name, container.Name())
 	ok, _ := shared.PathIsEmpty(containerMntPoint)
 	return !ok
 }
 
-func (s *storageDir) ContainerCreate(container container) error {
+func (s *storageDir) ContainerCreate(container Instance) error {
 	logger.Debugf("Creating empty DIR storage volume for container \"%s\" on storage pool \"%s\"", s.volume.Name, s.pool.Name)
 
 	_, err := s.StoragePoolMount()
@@ -536,7 +536,7 @@ func (s *storageDir) ContainerCreate(container container) error {
 	return nil
 }
 
-func (s *storageDir) ContainerCreateFromImage(container container, imageFingerprint string, tracker *ioprogress.ProgressTracker) error {
+func (s *storageDir) ContainerCreateFromImage(container Instance, imageFingerprint string, tracker *ioprogress.ProgressTracker) error {
 	logger.Debugf("Creating DIR storage volume for container \"%s\" on storage pool \"%s\"", s.volume.Name, s.pool.Name)
 
 	_, err := s.StoragePoolMount()
@@ -586,7 +586,7 @@ func (s *storageDir) ContainerCreateFromImage(container container, imageFingerpr
 	return nil
 }
 
-func (s *storageDir) ContainerDelete(container container) error {
+func (s *storageDir) ContainerDelete(container Instance) error {
 	logger.Debugf("Deleting DIR storage volume for container \"%s\" on storage pool \"%s\"", s.volume.Name, s.pool.Name)
 
 	source := s.pool.Config["source"]
@@ -648,7 +648,7 @@ func (s *storageDir) ContainerDelete(container container) error {
 	return nil
 }
 
-func (s *storageDir) copyContainer(target container, source container) error {
+func (s *storageDir) copyContainer(target Instance, source Instance) error {
 	_, sourcePool, _ := source.Storage().GetContainerPoolInfo()
 	_, targetPool, _ := target.Storage().GetContainerPoolInfo()
 	sourceContainerMntPoint := driver.GetContainerMountPoint(source.Project(), sourcePool, source.Name())
@@ -705,7 +705,7 @@ func (s *storageDir) copySnapshot(target container, targetPool string, source co
 	return nil
 }
 
-func (s *storageDir) ContainerCopy(target container, source container, containerOnly bool) error {
+func (s *storageDir) ContainerCopy(target Instance, source Instance, containerOnly bool) error {
 	logger.Debugf("Copying DIR container storage %s to %s", source.Name(), target.Name())
 
 	err := s.doContainerCopy(target, source, containerOnly, false, nil)
@@ -717,7 +717,7 @@ func (s *storageDir) ContainerCopy(target container, source container, container
 	return nil
 }
 
-func (s *storageDir) doContainerCopy(target container, source container, containerOnly bool, refresh bool, refreshSnapshots []container) error {
+func (s *storageDir) doContainerCopy(target Instance, source Instance, containerOnly bool, refresh bool, refreshSnapshots []Instance) error {
 	_, err := s.StoragePoolMount()
 	if err != nil {
 		return err
@@ -767,7 +767,7 @@ func (s *storageDir) doContainerCopy(target container, source container, contain
 		return nil
 	}
 
-	var snapshots []container
+	var snapshots []Instance
 
 	if refresh {
 		snapshots = refreshSnapshots
@@ -804,7 +804,7 @@ func (s *storageDir) doContainerCopy(target container, source container, contain
 	return nil
 }
 
-func (s *storageDir) ContainerRefresh(target container, source container, snapshots []container) error {
+func (s *storageDir) ContainerRefresh(target Instance, source Instance, snapshots []Instance) error {
 	logger.Debugf("Refreshing DIR container storage for %s from %s", target.Name(), source.Name())
 
 	err := s.doContainerCopy(target, source, len(snapshots) == 0, true, snapshots)
@@ -816,15 +816,15 @@ func (s *storageDir) ContainerRefresh(target container, source container, snapsh
 	return nil
 }
 
-func (s *storageDir) ContainerMount(c container) (bool, error) {
+func (s *storageDir) ContainerMount(c Instance) (bool, error) {
 	return s.StoragePoolMount()
 }
 
-func (s *storageDir) ContainerUmount(c container, path string) (bool, error) {
+func (s *storageDir) ContainerUmount(c Instance, path string) (bool, error) {
 	return true, nil
 }
 
-func (s *storageDir) ContainerRename(container container, newName string) error {
+func (s *storageDir) ContainerRename(container Instance, newName string) error {
 	logger.Debugf("Renaming DIR storage volume for container \"%s\" from %s to %s", s.volume.Name, s.volume.Name, newName)
 
 	_, err := s.StoragePoolMount()
@@ -879,7 +879,7 @@ func (s *storageDir) ContainerRename(container container, newName string) error
 	return nil
 }
 
-func (s *storageDir) ContainerRestore(container container, sourceContainer container) error {
+func (s *storageDir) ContainerRestore(container Instance, sourceContainer Instance) error {
 	logger.Debugf("Restoring DIR storage volume for container \"%s\" from %s to %s", s.volume.Name, sourceContainer.Name(), container.Name())
 
 	_, err := s.StoragePoolMount()
@@ -901,7 +901,7 @@ func (s *storageDir) ContainerRestore(container container, sourceContainer conta
 	return nil
 }
 
-func (s *storageDir) ContainerGetUsage(c container) (int64, error) {
+func (s *storageDir) ContainerGetUsage(c Instance) (int64, error) {
 	path := driver.GetContainerMountPoint(c.Project(), s.pool.Name, c.Name())
 
 	ok, err := quota.Supported(path)
@@ -918,7 +918,7 @@ func (s *storageDir) ContainerGetUsage(c container) (int64, error) {
 	return size, nil
 }
 
-func (s *storageDir) ContainerSnapshotCreate(snapshotContainer container, sourceContainer container) error {
+func (s *storageDir) ContainerSnapshotCreate(snapshotContainer Instance, sourceContainer Instance) error {
 	logger.Debugf("Creating DIR storage volume for snapshot \"%s\" on storage pool \"%s\"", s.volume.Name, s.pool.Name)
 
 	_, err := s.StoragePoolMount()
@@ -934,7 +934,7 @@ func (s *storageDir) ContainerSnapshotCreate(snapshotContainer container, source
 		return err
 	}
 
-	rsync := func(snapshotContainer container, oldPath string, newPath string, bwlimit string) error {
+	rsync := func(snapshotContainer Instance, oldPath string, newPath string, bwlimit string) error {
 		output, err := rsyncLocalCopy(oldPath, newPath, bwlimit, true)
 		if err != nil {
 			s.ContainerDelete(snapshotContainer)
@@ -995,7 +995,7 @@ onSuccess:
 	return nil
 }
 
-func (s *storageDir) ContainerSnapshotCreateEmpty(snapshotContainer container) error {
+func (s *storageDir) ContainerSnapshotCreateEmpty(snapshotContainer Instance) error {
 	logger.Debugf("Creating empty DIR storage volume for snapshot \"%s\" on storage pool \"%s\"", s.volume.Name, s.pool.Name)
 
 	_, err := s.StoragePoolMount()
@@ -1069,7 +1069,7 @@ func dirSnapshotDeleteInternal(projectName, poolName string, snapshotName string
 	return nil
 }
 
-func (s *storageDir) ContainerSnapshotDelete(snapshotContainer container) error {
+func (s *storageDir) ContainerSnapshotDelete(snapshotContainer Instance) error {
 	logger.Debugf("Deleting DIR storage volume for snapshot \"%s\" on storage pool \"%s\"", s.volume.Name, s.pool.Name)
 
 	_, err := s.StoragePoolMount()
@@ -1092,7 +1092,7 @@ func (s *storageDir) ContainerSnapshotDelete(snapshotContainer container) error
 	return nil
 }
 
-func (s *storageDir) ContainerSnapshotRename(snapshotContainer container, newName string) error {
+func (s *storageDir) ContainerSnapshotRename(snapshotContainer Instance, newName string) error {
 	logger.Debugf("Renaming DIR storage volume for snapshot \"%s\" from %s to %s", s.volume.Name, s.volume.Name, newName)
 
 	_, err := s.StoragePoolMount()
@@ -1113,15 +1113,15 @@ func (s *storageDir) ContainerSnapshotRename(snapshotContainer container, newNam
 	return nil
 }
 
-func (s *storageDir) ContainerSnapshotStart(container container) (bool, error) {
+func (s *storageDir) ContainerSnapshotStart(container Instance) (bool, error) {
 	return s.StoragePoolMount()
 }
 
-func (s *storageDir) ContainerSnapshotStop(container container) (bool, error) {
+func (s *storageDir) ContainerSnapshotStop(container Instance) (bool, error) {
 	return true, nil
 }
 
-func (s *storageDir) ContainerBackupCreate(backup backup, source container) error {
+func (s *storageDir) ContainerBackupCreate(backup backup, source Instance) error {
 	// Start storage
 	ourStart, err := source.StorageStart()
 	if err != nil {
diff --git a/lxd/storage_lvm.go b/lxd/storage_lvm.go
index 87be1a097f..b764dc9f59 100644
--- a/lxd/storage_lvm.go
+++ b/lxd/storage_lvm.go
@@ -916,7 +916,7 @@ func (s *storageLvm) StoragePoolVolumeRename(newName string) error {
 		storagePoolVolumeTypeCustom, s.poolID)
 }
 
-func (s *storageLvm) ContainerStorageReady(container container) bool {
+func (s *storageLvm) ContainerStorageReady(container Instance) bool {
 	containerLvmName := containerNameToLVName(container.Name())
 	poolName := s.getOnDiskPoolName()
 	containerLvmPath := getLvmDevPath(container.Project(), poolName, storagePoolVolumeAPIEndpointContainers, containerLvmName)
@@ -924,7 +924,7 @@ func (s *storageLvm) ContainerStorageReady(container container) bool {
 	return ok
 }
 
-func (s *storageLvm) ContainerCreate(container container) error {
+func (s *storageLvm) ContainerCreate(container Instance) error {
 	logger.Debugf("Creating empty LVM storage volume for container \"%s\" on storage pool \"%s\"", s.volume.Name, s.pool.Name)
 
 	tryUndo := true
@@ -988,7 +988,7 @@ func (s *storageLvm) ContainerCreate(container container) error {
 	return nil
 }
 
-func (s *storageLvm) ContainerCreateFromImage(container container, fingerprint string, tracker *ioprogress.ProgressTracker) error {
+func (s *storageLvm) ContainerCreateFromImage(container Instance, fingerprint string, tracker *ioprogress.ProgressTracker) error {
 	logger.Debugf("Creating LVM storage volume for container \"%s\" on storage pool \"%s\"", s.volume.Name, s.pool.Name)
 
 	tryUndo := true
@@ -1107,7 +1107,7 @@ func lvmContainerDeleteInternal(projectName, poolName string, ctName string, isS
 	return nil
 }
 
-func (s *storageLvm) ContainerDelete(container container) error {
+func (s *storageLvm) ContainerDelete(container Instance) error {
 	logger.Debugf("Deleting LVM storage volume for container \"%s\" on storage pool \"%s\"", s.volume.Name, s.pool.Name)
 
 	containerName := container.Name()
@@ -1121,7 +1121,7 @@ func (s *storageLvm) ContainerDelete(container container) error {
 	return nil
 }
 
-func (s *storageLvm) ContainerCopy(target container, source container, containerOnly bool) error {
+func (s *storageLvm) ContainerCopy(target Instance, source Instance, containerOnly bool) error {
 	logger.Debugf("Copying LVM container storage for container %s to %s", source.Name(), target.Name())
 
 	err := s.doContainerCopy(target, source, containerOnly, false, nil)
@@ -1133,7 +1133,7 @@ func (s *storageLvm) ContainerCopy(target container, source container, container
 	return nil
 }
 
-func (s *storageLvm) doContainerCopy(target container, source container, containerOnly bool, refresh bool, refreshSnapshots []container) error {
+func (s *storageLvm) doContainerCopy(target Instance, source Instance, containerOnly bool, refresh bool, refreshSnapshots []Instance) error {
 	ourStart, err := source.StorageStart()
 	if err != nil {
 		return err
@@ -1177,7 +1177,7 @@ func (s *storageLvm) doContainerCopy(target container, source container, contain
 		return nil
 	}
 
-	var snapshots []container
+	var snapshots []Instance
 
 	if refresh {
 		snapshots = refreshSnapshots
@@ -1219,7 +1219,7 @@ func (s *storageLvm) doContainerCopy(target container, source container, contain
 	return nil
 }
 
-func (s *storageLvm) ContainerRefresh(target container, source container, snapshots []container) error {
+func (s *storageLvm) ContainerRefresh(target Instance, source Instance, snapshots []Instance) error {
 	logger.Debugf("Refreshing LVM container storage for %s from %s", target.Name(), source.Name())
 
 	err := s.doContainerCopy(target, source, len(snapshots) == 0, true, snapshots)
@@ -1231,7 +1231,7 @@ func (s *storageLvm) ContainerRefresh(target container, source container, snapsh
 	return nil
 }
 
-func (s *storageLvm) ContainerMount(c container) (bool, error) {
+func (s *storageLvm) ContainerMount(c Instance) (bool, error) {
 	return s.doContainerMount(c.Project(), c.Name(), false)
 }
 
@@ -1292,7 +1292,7 @@ func (s *storageLvm) doContainerMount(project, name string, snap bool) (bool, er
 	return ourMount, nil
 }
 
-func (s *storageLvm) ContainerUmount(c container, path string) (bool, error) {
+func (s *storageLvm) ContainerUmount(c Instance, path string) (bool, error) {
 	return s.umount(c.Project(), c.Name(), path)
 }
 
@@ -1340,7 +1340,7 @@ func (s *storageLvm) umount(project, name string, path string) (bool, error) {
 	return ourUmount, nil
 }
 
-func (s *storageLvm) ContainerRename(container container, newContainerName string) error {
+func (s *storageLvm) ContainerRename(container Instance, newContainerName string) error {
 	logger.Debugf("Renaming LVM storage volume for container \"%s\" from %s to %s", s.volume.Name, s.volume.Name, newContainerName)
 
 	tryUndo := true
@@ -1421,7 +1421,7 @@ func (s *storageLvm) ContainerRename(container container, newContainerName strin
 	return nil
 }
 
-func (s *storageLvm) ContainerRestore(target container, source container) error {
+func (s *storageLvm) ContainerRestore(target Instance, source Instance) error {
 	logger.Debugf("Restoring LVM storage volume for container \"%s\" from %s to %s", s.volume.Name, source.Name(), target.Name())
 
 	_, sourcePool, _ := source.Storage().GetContainerPoolInfo()
@@ -1500,11 +1500,11 @@ func (s *storageLvm) ContainerRestore(target container, source container) error
 	return nil
 }
 
-func (s *storageLvm) ContainerGetUsage(container container) (int64, error) {
+func (s *storageLvm) ContainerGetUsage(container Instance) (int64, error) {
 	return -1, fmt.Errorf("the LVM container backend doesn't support quotas")
 }
 
-func (s *storageLvm) ContainerSnapshotCreate(snapshotContainer container, sourceContainer container) error {
+func (s *storageLvm) ContainerSnapshotCreate(snapshotContainer Instance, sourceContainer Instance) error {
 	logger.Debugf("Creating LVM storage volume for snapshot \"%s\" on storage pool \"%s\"", s.volume.Name, s.pool.Name)
 
 	err := s.createSnapshotContainer(snapshotContainer, sourceContainer, true)
@@ -1516,7 +1516,7 @@ func (s *storageLvm) ContainerSnapshotCreate(snapshotContainer container, source
 	return nil
 }
 
-func (s *storageLvm) ContainerSnapshotDelete(snapshotContainer container) error {
+func (s *storageLvm) ContainerSnapshotDelete(snapshotContainer Instance) error {
 	logger.Debugf("Deleting LVM storage volume for snapshot \"%s\" on storage pool \"%s\"", s.volume.Name, s.pool.Name)
 
 	err := s.ContainerDelete(snapshotContainer)
@@ -1528,7 +1528,7 @@ func (s *storageLvm) ContainerSnapshotDelete(snapshotContainer container) error
 	return nil
 }
 
-func (s *storageLvm) ContainerSnapshotRename(snapshotContainer container, newContainerName string) error {
+func (s *storageLvm) ContainerSnapshotRename(snapshotContainer Instance, newContainerName string) error {
 	logger.Debugf("Renaming LVM storage volume for snapshot \"%s\" from %s to %s", s.volume.Name, s.volume.Name, newContainerName)
 
 	tryUndo := true
@@ -1560,7 +1560,7 @@ func (s *storageLvm) ContainerSnapshotRename(snapshotContainer container, newCon
 	return nil
 }
 
-func (s *storageLvm) ContainerSnapshotStart(container container) (bool, error) {
+func (s *storageLvm) ContainerSnapshotStart(container Instance) (bool, error) {
 	logger.Debugf(`Initializing LVM storage volume for snapshot "%s" on storage pool "%s"`, s.volume.Name, s.pool.Name)
 
 	poolName := s.getOnDiskPoolName()
@@ -1610,7 +1610,7 @@ func (s *storageLvm) ContainerSnapshotStart(container container) (bool, error) {
 	return true, nil
 }
 
-func (s *storageLvm) ContainerSnapshotStop(container container) (bool, error) {
+func (s *storageLvm) ContainerSnapshotStop(container Instance) (bool, error) {
 	logger.Debugf("Stopping LVM storage volume for snapshot \"%s\" on storage pool \"%s\"", s.volume.Name, s.pool.Name)
 
 	containerName := container.Name()
@@ -1649,7 +1649,7 @@ func (s *storageLvm) ContainerSnapshotStop(container container) (bool, error) {
 	return true, nil
 }
 
-func (s *storageLvm) ContainerSnapshotCreateEmpty(snapshotContainer container) error {
+func (s *storageLvm) ContainerSnapshotCreateEmpty(snapshotContainer Instance) error {
 	logger.Debugf("Creating empty LVM storage volume for snapshot \"%s\" on storage pool \"%s\"", s.volume.Name, s.pool.Name)
 
 	err := s.ContainerCreate(snapshotContainer)
@@ -1661,7 +1661,7 @@ func (s *storageLvm) ContainerSnapshotCreateEmpty(snapshotContainer container) e
 	return nil
 }
 
-func (s *storageLvm) ContainerBackupCreate(backup backup, source container) error {
+func (s *storageLvm) ContainerBackupCreate(backup backup, source Instance) error {
 	poolName := s.getOnDiskPoolName()
 
 	// Start storage
diff --git a/lxd/storage_lvm_utils.go b/lxd/storage_lvm_utils.go
index 7ea61f13f2..14d627c447 100644
--- a/lxd/storage_lvm_utils.go
+++ b/lxd/storage_lvm_utils.go
@@ -257,7 +257,7 @@ func (s *storageLvm) createSnapshotLV(project, vgName string, origLvName string,
 	return targetLvmVolumePath, nil
 }
 
-func (s *storageLvm) createSnapshotContainer(snapshotContainer container, sourceContainer container, readonly bool) error {
+func (s *storageLvm) createSnapshotContainer(snapshotContainer Instance, sourceContainer Instance, readonly bool) error {
 	tryUndo := true
 
 	sourceContainerName := sourceContainer.Name()
@@ -304,7 +304,7 @@ func (s *storageLvm) createSnapshotContainer(snapshotContainer container, source
 }
 
 // Copy a container on a storage pool that does use a thinpool.
-func (s *storageLvm) copyContainerThinpool(target container, source container, readonly bool) error {
+func (s *storageLvm) copyContainerThinpool(target Instance, source Instance, readonly bool) error {
 	err := s.createSnapshotContainer(target, source, readonly)
 	if err != nil {
 		logger.Errorf("Error creating snapshot LV for copy: %s", err)
@@ -371,7 +371,7 @@ func (s *storageLvm) copySnapshot(target container, source container, refresh bo
 }
 
 // Copy a container on a storage pool that does not use a thinpool.
-func (s *storageLvm) copyContainerLv(target container, source container, readonly bool, refresh bool) error {
+func (s *storageLvm) copyContainerLv(target Instance, source Instance, readonly bool, refresh bool) error {
 	exists, err := storageLVExists(getLvmDevPath(target.Project(), s.getOnDiskPoolName(),
 		storagePoolVolumeAPIEndpointContainers, containerNameToLVName(target.Name())))
 	if err != nil {
@@ -446,7 +446,7 @@ func (s *storageLvm) copyContainerLv(target container, source container, readonl
 }
 
 // Copy an lvm container.
-func (s *storageLvm) copyContainer(target container, source container, refresh bool) error {
+func (s *storageLvm) copyContainer(target Instance, source Instance, refresh bool) error {
 	targetPool, err := target.StoragePool()
 	if err != nil {
 		return err
@@ -484,7 +484,7 @@ func (s *storageLvm) copyContainer(target container, source container, refresh b
 	return nil
 }
 
-func (s *storageLvm) containerCreateFromImageLv(c container, fp string) error {
+func (s *storageLvm) containerCreateFromImageLv(c Instance, fp string) error {
 	containerName := c.Name()
 
 	err := s.ContainerCreate(c)
@@ -516,7 +516,7 @@ func (s *storageLvm) containerCreateFromImageLv(c container, fp string) error {
 	return nil
 }
 
-func (s *storageLvm) containerCreateFromImageThinLv(c container, fp string) error {
+func (s *storageLvm) containerCreateFromImageThinLv(c Instance, fp string) error {
 	poolName := s.getOnDiskPoolName()
 	// Check if the image already exists.
 	imageLvmDevPath := getLvmDevPath("default", poolName, storagePoolVolumeAPIEndpointImages, fp)
diff --git a/lxd/storage_migration.go b/lxd/storage_migration.go
index 218458d118..2453fd5f9f 100644
--- a/lxd/storage_migration.go
+++ b/lxd/storage_migration.go
@@ -41,8 +41,8 @@ type MigrationStorageSourceDriver interface {
 }
 
 type rsyncStorageSourceDriver struct {
-	container     container
-	snapshots     []container
+	container     Instance
+	snapshots     []Instance
 	rsyncFeatures []string
 }
 
@@ -145,7 +145,7 @@ func rsyncStorageMigrationSource(args MigrationSourceArgs) (MigrationStorageSour
 }
 
 func rsyncRefreshSource(refreshSnapshots []string, args MigrationSourceArgs) (MigrationStorageSourceDriver, error) {
-	var snapshots = []container{}
+	var snapshots = []Instance{}
 	if !args.InstanceOnly {
 		allSnapshots, err := args.Container.Snapshots()
 		if err != nil {
@@ -167,7 +167,7 @@ func rsyncRefreshSource(refreshSnapshots []string, args MigrationSourceArgs) (Mi
 
 func rsyncMigrationSource(args MigrationSourceArgs) (MigrationStorageSourceDriver, error) {
 	var err error
-	var snapshots = []container{}
+	var snapshots = []Instance{}
 	if !args.InstanceOnly {
 		snapshots, err = args.Container.Snapshots()
 		if err != nil {
diff --git a/lxd/storage_migration_btrfs.go b/lxd/storage_migration_btrfs.go
index 2f58187467..166fd8599c 100644
--- a/lxd/storage_migration_btrfs.go
+++ b/lxd/storage_migration_btrfs.go
@@ -15,8 +15,8 @@ import (
 )
 
 type btrfsMigrationSourceDriver struct {
-	container          container
-	snapshots          []container
+	container          Instance
+	snapshots          []Instance
 	btrfsSnapshotNames []string
 	btrfs              *storageBtrfs
 	runningSnapName    string
diff --git a/lxd/storage_mock.go b/lxd/storage_mock.go
index 950aa4d215..3b9520928e 100644
--- a/lxd/storage_mock.go
+++ b/lxd/storage_mock.go
@@ -109,87 +109,73 @@ func (s *storageMock) StoragePoolUpdate(writable *api.StoragePoolPut, changedCon
 	return nil
 }
 
-func (s *storageMock) ContainerStorageReady(container container) bool {
+func (s *storageMock) ContainerStorageReady(container Instance) bool {
 	return true
 }
 
-func (s *storageMock) ContainerCreate(container container) error {
+func (s *storageMock) ContainerCreate(container Instance) error {
 	return nil
 }
 
-func (s *storageMock) ContainerCreateFromImage(
-	container container, imageFingerprint string, tracker *ioprogress.ProgressTracker) error {
-
+func (s *storageMock) ContainerCreateFromImage(container Instance, imageFingerprint string, tracker *ioprogress.ProgressTracker) error {
 	return nil
 }
 
-func (s *storageMock) ContainerDelete(container container) error {
+func (s *storageMock) ContainerDelete(container Instance) error {
 	return nil
 }
 
-func (s *storageMock) ContainerCopy(target container, source container, containerOnly bool) error {
+func (s *storageMock) ContainerCopy(target Instance, source Instance, containerOnly bool) error {
 	return nil
 }
 
-func (s *storageMock) ContainerRefresh(target container, source container, snapshots []container) error {
+func (s *storageMock) ContainerRefresh(target Instance, source Instance, snapshots []Instance) error {
 	return nil
 }
 
-func (s *storageMock) ContainerMount(c container) (bool, error) {
+func (s *storageMock) ContainerMount(c Instance) (bool, error) {
 	return true, nil
 }
 
-func (s *storageMock) ContainerUmount(c container, path string) (bool, error) {
+func (s *storageMock) ContainerUmount(c Instance, path string) (bool, error) {
 	return true, nil
 }
 
-func (s *storageMock) ContainerRename(
-	container container, newName string) error {
-
+func (s *storageMock) ContainerRename(container Instance, newName string) error {
 	return nil
 }
 
-func (s *storageMock) ContainerRestore(
-	container container, sourceContainer container) error {
-
+func (s *storageMock) ContainerRestore(container Instance, sourceContainer Instance) error {
 	return nil
 }
 
-func (s *storageMock) ContainerGetUsage(
-	container container) (int64, error) {
-
+func (s *storageMock) ContainerGetUsage(container Instance) (int64, error) {
 	return 0, nil
 }
-func (s *storageMock) ContainerSnapshotCreate(
-	snapshotContainer container, sourceContainer container) error {
-
+func (s *storageMock) ContainerSnapshotCreate(snapshotContainer Instance, sourceContainer Instance) error {
 	return nil
 }
-func (s *storageMock) ContainerSnapshotDelete(
-	snapshotContainer container) error {
-
+func (s *storageMock) ContainerSnapshotDelete(snapshotContainer Instance) error {
 	return nil
 }
 
-func (s *storageMock) ContainerSnapshotRename(
-	snapshotContainer container, newName string) error {
-
+func (s *storageMock) ContainerSnapshotRename(snapshotContainer Instance, newName string) error {
 	return nil
 }
 
-func (s *storageMock) ContainerSnapshotStart(container container) (bool, error) {
+func (s *storageMock) ContainerSnapshotStart(container Instance) (bool, error) {
 	return true, nil
 }
 
-func (s *storageMock) ContainerSnapshotStop(container container) (bool, error) {
+func (s *storageMock) ContainerSnapshotStop(container Instance) (bool, error) {
 	return true, nil
 }
 
-func (s *storageMock) ContainerSnapshotCreateEmpty(snapshotContainer container) error {
+func (s *storageMock) ContainerSnapshotCreateEmpty(snapshotContainer Instance) error {
 	return nil
 }
 
-func (s *storageMock) ContainerBackupCreate(backup backup, sourceContainer container) error {
+func (s *storageMock) ContainerBackupCreate(backup backup, sourceContainer Instance) error {
 	return nil
 }
 
diff --git a/lxd/storage_zfs.go b/lxd/storage_zfs.go
index be35447063..9c75819e96 100644
--- a/lxd/storage_zfs.go
+++ b/lxd/storage_zfs.go
@@ -760,11 +760,11 @@ func (s *storageZfs) StoragePoolVolumeRename(newName string) error {
 }
 
 // Things we don't need to care about
-func (s *storageZfs) ContainerMount(c container) (bool, error) {
+func (s *storageZfs) ContainerMount(c Instance) (bool, error) {
 	return s.doContainerMount(c.Project(), c.Name(), c.IsPrivileged())
 }
 
-func (s *storageZfs) ContainerUmount(c container, path string) (bool, error) {
+func (s *storageZfs) ContainerUmount(c Instance, path string) (bool, error) {
 	logger.Debugf("Unmounting ZFS storage volume for container \"%s\" on storage pool \"%s\"", s.volume.Name, s.pool.Name)
 	name := c.Name()
 
@@ -809,13 +809,13 @@ func (s *storageZfs) ContainerUmount(c container, path string) (bool, error) {
 }
 
 // Things we do have to care about
-func (s *storageZfs) ContainerStorageReady(container container) bool {
+func (s *storageZfs) ContainerStorageReady(container Instance) bool {
 	volumeName := project.Prefix(container.Project(), container.Name())
 	fs := fmt.Sprintf("containers/%s", volumeName)
 	return zfsFilesystemEntityExists(s.getOnDiskPoolName(), fs)
 }
 
-func (s *storageZfs) ContainerCreate(container container) error {
+func (s *storageZfs) ContainerCreate(container Instance) error {
 	err := s.doContainerCreate(container.Project(), container.Name(), container.IsPrivileged())
 	if err != nil {
 		s.doContainerDelete(container.Project(), container.Name())
@@ -838,7 +838,7 @@ func (s *storageZfs) ContainerCreate(container container) error {
 	return nil
 }
 
-func (s *storageZfs) ContainerCreateFromImage(container container, fingerprint string, tracker *ioprogress.ProgressTracker) error {
+func (s *storageZfs) ContainerCreateFromImage(container Instance, fingerprint string, tracker *ioprogress.ProgressTracker) error {
 	logger.Debugf("Creating ZFS storage volume for container \"%s\" on storage pool \"%s\"", s.volume.Name, s.pool.Name)
 
 	containerPath := container.Path()
@@ -916,7 +916,7 @@ func (s *storageZfs) ContainerCreateFromImage(container container, fingerprint s
 	return nil
 }
 
-func (s *storageZfs) ContainerDelete(container container) error {
+func (s *storageZfs) ContainerDelete(container Instance) error {
 	err := s.doContainerDelete(container.Project(), container.Name())
 	if err != nil {
 		return err
@@ -925,7 +925,7 @@ func (s *storageZfs) ContainerDelete(container container) error {
 	return nil
 }
 
-func (s *storageZfs) copyWithoutSnapshotsSparse(target container, source container) error {
+func (s *storageZfs) copyWithoutSnapshotsSparse(target Instance, source Instance) error {
 	poolName := s.getOnDiskPoolName()
 
 	sourceContainerName := source.Name()
@@ -1027,7 +1027,7 @@ func (s *storageZfs) copyWithoutSnapshotsSparse(target container, source contain
 	return nil
 }
 
-func (s *storageZfs) copyWithoutSnapshotFull(target container, source container) error {
+func (s *storageZfs) copyWithoutSnapshotFull(target Instance, source Instance) error {
 	logger.Debugf("Creating full ZFS copy \"%s\" to \"%s\"", source.Name(), target.Name())
 
 	sourceIsSnapshot := source.IsSnapshot()
@@ -1128,7 +1128,7 @@ func (s *storageZfs) copyWithoutSnapshotFull(target container, source container)
 	return nil
 }
 
-func (s *storageZfs) copyWithSnapshots(target container, source container, parentSnapshot string) error {
+func (s *storageZfs) copyWithSnapshots(target Instance, source Instance, parentSnapshot string) error {
 	sourceName := source.Name()
 	targetParentName, targetSnapOnlyName, _ := shared.ContainerGetParentAndSnapshotName(target.Name())
 	containersPath := driver.GetSnapshotMountPoint(target.Project(), s.pool.Name, targetParentName)
@@ -1175,7 +1175,7 @@ func (s *storageZfs) copyWithSnapshots(target container, source container, paren
 	return nil
 }
 
-func (s *storageZfs) doCrossPoolContainerCopy(target container, source container, containerOnly bool, refresh bool, refreshSnapshots []container) error {
+func (s *storageZfs) doCrossPoolContainerCopy(target Instance, source Instance, containerOnly bool, refresh bool, refreshSnapshots []Instance) error {
 	sourcePool, err := source.StoragePool()
 	if err != nil {
 		return err
@@ -1200,7 +1200,7 @@ func (s *storageZfs) doCrossPoolContainerCopy(target container, source container
 		return err
 	}
 
-	var snapshots []container
+	var snapshots []Instance
 
 	if refresh {
 		snapshots = refreshSnapshots
@@ -1253,7 +1253,7 @@ func (s *storageZfs) doCrossPoolContainerCopy(target container, source container
 	return nil
 }
 
-func (s *storageZfs) ContainerCopy(target container, source container, containerOnly bool) error {
+func (s *storageZfs) ContainerCopy(target Instance, source Instance, containerOnly bool) error {
 	logger.Debugf("Copying ZFS container storage %s to %s", source.Name(), target.Name())
 
 	ourStart, err := source.StorageStart()
@@ -1380,7 +1380,7 @@ func (s *storageZfs) ContainerCopy(target container, source container, container
 	return nil
 }
 
-func (s *storageZfs) ContainerRefresh(target container, source container, snapshots []container) error {
+func (s *storageZfs) ContainerRefresh(target Instance, source Instance, snapshots []Instance) error {
 	logger.Debugf("Refreshing ZFS container storage for %s from %s", target.Name(), source.Name())
 
 	ourStart, err := source.StorageStart()
@@ -1394,7 +1394,7 @@ func (s *storageZfs) ContainerRefresh(target container, source container, snapsh
 	return s.doCrossPoolContainerCopy(target, source, len(snapshots) == 0, true, snapshots)
 }
 
-func (s *storageZfs) ContainerRename(container container, newName string) error {
+func (s *storageZfs) ContainerRename(container Instance, newName string) error {
 	logger.Debugf("Renaming ZFS storage volume for container \"%s\" from %s to %s", s.volume.Name, s.volume.Name, newName)
 
 	poolName := s.getOnDiskPoolName()
@@ -1478,7 +1478,7 @@ func (s *storageZfs) ContainerRename(container container, newName string) error
 	return nil
 }
 
-func (s *storageZfs) ContainerRestore(target container, source container) error {
+func (s *storageZfs) ContainerRestore(target Instance, source Instance) error {
 	logger.Debugf("Restoring ZFS storage volume for container \"%s\" from %s to %s", s.volume.Name, source.Name(), target.Name())
 
 	snaps, err := target.Snapshots()
@@ -1542,7 +1542,7 @@ func (s *storageZfs) ContainerRestore(target container, source container) error
 	return nil
 }
 
-func (s *storageZfs) ContainerGetUsage(container container) (int64, error) {
+func (s *storageZfs) ContainerGetUsage(container Instance) (int64, error) {
 	var err error
 
 	fs := fmt.Sprintf("containers/%s", project.Prefix(container.Project(), container.Name()))
@@ -1621,7 +1621,7 @@ func (s *storageZfs) doContainerSnapshotCreate(projectName, targetName string, s
 	return nil
 }
 
-func (s *storageZfs) ContainerSnapshotCreate(snapshotContainer container, sourceContainer container) error {
+func (s *storageZfs) ContainerSnapshotCreate(snapshotContainer Instance, sourceContainer Instance) error {
 	err := s.doContainerSnapshotCreate(sourceContainer.Project(), snapshotContainer.Name(), sourceContainer.Name())
 	if err != nil {
 		s.ContainerSnapshotDelete(snapshotContainer)
@@ -1715,7 +1715,7 @@ func zfsSnapshotDeleteInternal(projectName, poolName string, ctName string, onDi
 	return nil
 }
 
-func (s *storageZfs) ContainerSnapshotDelete(snapshotContainer container) error {
+func (s *storageZfs) ContainerSnapshotDelete(snapshotContainer Instance) error {
 	logger.Debugf("Deleting ZFS storage volume for snapshot \"%s\" on storage pool \"%s\"", s.volume.Name, s.pool.Name)
 
 	poolName := s.getOnDiskPoolName()
@@ -1729,7 +1729,7 @@ func (s *storageZfs) ContainerSnapshotDelete(snapshotContainer container) error
 	return nil
 }
 
-func (s *storageZfs) ContainerSnapshotRename(snapshotContainer container, newName string) error {
+func (s *storageZfs) ContainerSnapshotRename(snapshotContainer Instance, newName string) error {
 	logger.Debugf("Renaming ZFS storage volume for snapshot \"%s\" from %s to %s", s.volume.Name, s.volume.Name, newName)
 
 	oldName := snapshotContainer.Name()
@@ -1794,7 +1794,7 @@ func (s *storageZfs) ContainerSnapshotRename(snapshotContainer container, newNam
 	return nil
 }
 
-func (s *storageZfs) ContainerSnapshotStart(container container) (bool, error) {
+func (s *storageZfs) ContainerSnapshotStart(container Instance) (bool, error) {
 	logger.Debugf("Initializing ZFS storage volume for snapshot \"%s\" on storage pool \"%s\"", s.volume.Name, s.pool.Name)
 
 	cName, sName, _ := shared.ContainerGetParentAndSnapshotName(container.Name())
@@ -1818,7 +1818,7 @@ func (s *storageZfs) ContainerSnapshotStart(container container) (bool, error) {
 	return true, nil
 }
 
-func (s *storageZfs) ContainerSnapshotStop(container container) (bool, error) {
+func (s *storageZfs) ContainerSnapshotStop(container Instance) (bool, error) {
 	logger.Debugf("Stopping ZFS storage volume for snapshot \"%s\" on storage pool \"%s\"", s.volume.Name, s.pool.Name)
 
 	cName, sName, _ := shared.ContainerGetParentAndSnapshotName(container.Name())
@@ -1833,12 +1833,12 @@ func (s *storageZfs) ContainerSnapshotStop(container container) (bool, error) {
 	return true, nil
 }
 
-func (s *storageZfs) ContainerSnapshotCreateEmpty(snapshotContainer container) error {
+func (s *storageZfs) ContainerSnapshotCreateEmpty(snapshotContainer Instance) error {
 	/* don't touch the fs yet, as migration will do that for us */
 	return nil
 }
 
-func (s *storageZfs) doContainerOnlyBackup(tmpPath string, backup backup, source container) error {
+func (s *storageZfs) doContainerOnlyBackup(tmpPath string, backup backup, source Instance) error {
 	sourceIsSnapshot := source.IsSnapshot()
 	poolName := s.getOnDiskPoolName()
 
@@ -1918,7 +1918,7 @@ func (s *storageZfs) doSnapshotBackup(tmpPath string, backup backup, source cont
 	return zfsSendCmd.Run()
 }
 
-func (s *storageZfs) doContainerBackupCreateOptimized(tmpPath string, backup backup, source container) error {
+func (s *storageZfs) doContainerBackupCreateOptimized(tmpPath string, backup backup, source Instance) error {
 	// Handle snapshots
 	snapshots, err := source.Snapshots()
 	if err != nil {
@@ -1987,7 +1987,7 @@ func (s *storageZfs) doContainerBackupCreateOptimized(tmpPath string, backup bac
 	return nil
 }
 
-func (s *storageZfs) doContainerBackupCreateVanilla(tmpPath string, backup backup, source container) error {
+func (s *storageZfs) doContainerBackupCreateVanilla(tmpPath string, backup backup, source Instance) error {
 	// Prepare for rsync
 	rsync := func(oldPath string, newPath string, bwlimit string) error {
 		output, err := rsyncLocalCopy(oldPath, newPath, bwlimit, true)
@@ -2090,7 +2090,7 @@ func (s *storageZfs) doContainerBackupCreateVanilla(tmpPath string, backup backu
 	return nil
 }
 
-func (s *storageZfs) ContainerBackupCreate(backup backup, source container) error {
+func (s *storageZfs) ContainerBackupCreate(backup backup, source Instance) error {
 	// Start storage
 	ourStart, err := source.StorageStart()
 	if err != nil {


More information about the lxc-devel mailing list