[lxc-devel] [lxd/master] Device: Replaces device.Instance with instance.Instance

tomponline on Github lxc-bot at linuxcontainers.org
Mon Jan 13 15:52:03 UTC 2020


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 351 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20200113/89cec66b/attachment-0001.bin>
-------------- next part --------------
From b15959ae5f48f2a206a87ac9b8b363edfa3320c9 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 13 Jan 2020 15:34:39 +0000
Subject: [PATCH 1/5] lxd/device/device/instance: Removes interface in place of
 instance.Instance

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/device/device_instance.go | 23 -----------------------
 1 file changed, 23 deletions(-)
 delete mode 100644 lxd/device/device_instance.go

diff --git a/lxd/device/device_instance.go b/lxd/device/device_instance.go
deleted file mode 100644
index aa5d36484a..0000000000
--- a/lxd/device/device_instance.go
+++ /dev/null
@@ -1,23 +0,0 @@
-package device
-
-import (
-	deviceConfig "github.com/lxc/lxd/lxd/device/config"
-	"github.com/lxc/lxd/lxd/instance/instancetype"
-)
-
-// Instance is an interface that allows us to identify an Instance and its properties.
-// It is intended that this interface be entirely comprised of functions which cannot be blocking
-// irrespective of when they're called in the instance lifecycle.
-type Instance interface {
-	Name() string
-	Type() instancetype.Type
-	Project() string
-	Path() string
-	DevicesPath() string
-	RootfsPath() string
-	LogPath() string
-	ExpandedConfig() map[string]string
-	LocalDevices() deviceConfig.Devices
-	ExpandedDevices() deviceConfig.Devices
-	DeviceEventHandler(*deviceConfig.RunConfig) error
-}

From 3a6e685d0291fc8191636bfa90d8a24aeae8185e Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 13 Jan 2020 15:35:21 +0000
Subject: [PATCH 2/5] lxd/container: Replaces device.Instance with
 instance.Instance

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

diff --git a/lxd/container.go b/lxd/container.go
index 36055a0b39..1aac67580c 100644
--- a/lxd/container.go
+++ b/lxd/container.go
@@ -42,29 +42,14 @@ import (
 func init() {
 	// Expose instanceLoadNodeAll to the device package converting the response to a slice of Instances.
 	// This is because container types are defined in the main package and are not importable.
-	device.InstanceLoadNodeAll = func(s *state.State) ([]device.Instance, error) {
-		containers, err := instanceLoadNodeAll(s, instancetype.Any)
-		if err != nil {
-			return nil, err
-		}
-
-		identifiers := []device.Instance{}
-		for _, v := range containers {
-			identifiers = append(identifiers, device.Instance(v))
-		}
-
-		return identifiers, nil
+	device.InstanceLoadNodeAll = func(s *state.State) ([]instance.Instance, error) {
+		return instanceLoadNodeAll(s, instancetype.Any)
 	}
 
 	// Expose instance.LoadByProjectAndName to the device package converting the response to an Instance.
 	// This is because container types are defined in the main package and are not importable.
-	device.InstanceLoadByProjectAndName = func(s *state.State, project, name string) (device.Instance, error) {
-		container, err := instance.LoadByProjectAndName(s, project, name)
-		if err != nil {
-			return nil, err
-		}
-
-		return device.Instance(container), nil
+	device.InstanceLoadByProjectAndName = func(s *state.State, project, name string) (instance.Instance, error) {
+		return instance.LoadByProjectAndName(s, project, name)
 	}
 
 	// Expose instanceValidDevices to the instance package. This is because it relies on

From 77dafa72ed95ca894b151d378f3ab83dad6c1599 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 13 Jan 2020 15:35:42 +0000
Subject: [PATCH 3/5] lxd/storage: Replaces device.Instance with
 instance.Instance

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

diff --git a/lxd/storage.go b/lxd/storage.go
index a306df945d..3351aed653 100644
--- a/lxd/storage.go
+++ b/lxd/storage.go
@@ -829,8 +829,8 @@ func storagePoolDriversCacheUpdate(s *state.State) {
 
 // storageVolumeMount initialises a new storage interface and checks the pool and volume are
 // mounted. If they are not then they are mounted.
-func storageVolumeMount(state *state.State, poolName string, volumeName string, volumeTypeName string, instance device.Instance) error {
-	c, ok := instance.(*containerLXC)
+func storageVolumeMount(state *state.State, poolName string, volumeName string, volumeTypeName string, inst instance.Instance) error {
+	c, ok := inst.(*containerLXC)
 	if !ok {
 		return fmt.Errorf("Received non-LXC container instance")
 	}
@@ -924,7 +924,7 @@ func storageVolumeUmount(state *state.State, poolName string, volumeName string,
 
 // storageRootFSApplyQuota applies a quota to an instance if it can, if it cannot then it will
 // return false indicating that the quota needs to be stored in volatile to be applied on next boot.
-func storageRootFSApplyQuota(state *state.State, inst device.Instance, size string) error {
+func storageRootFSApplyQuota(state *state.State, inst instance.Instance, size string) error {
 	c, ok := inst.(*containerLXC)
 	if !ok {
 		return fmt.Errorf("Received non-LXC container instance")

From 8a2702351249bef13c839e5cd73aa07e0235b5f4 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 13 Jan 2020 15:36:39 +0000
Subject: [PATCH 4/5] lxd/device: Replaces device.Instance with
 instance.Instance

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/device/device.go                   | 13 +++++++------
 lxd/device/device_utils_disk.go        |  5 +++--
 lxd/device/device_utils_instance.go    |  5 +++--
 lxd/device/device_utils_network.go     |  3 ++-
 lxd/device/device_utils_unix_events.go |  9 +++++----
 lxd/device/device_utils_usb_events.go  |  9 +++++----
 6 files changed, 25 insertions(+), 19 deletions(-)

diff --git a/lxd/device/device.go b/lxd/device/device.go
index c608f80bc9..5e93458c31 100644
--- a/lxd/device/device.go
+++ b/lxd/device/device.go
@@ -4,6 +4,7 @@ import (
 	"fmt"
 
 	deviceConfig "github.com/lxc/lxd/lxd/device/config"
+	"github.com/lxc/lxd/lxd/instance"
 	"github.com/lxc/lxd/lxd/state"
 )
 
@@ -73,7 +74,7 @@ type device interface {
 	Device
 
 	// init stores the Instance, daemon State and Config into device and performs any setup.
-	init(Instance, *state.State, string, deviceConfig.Device, VolatileGetter, VolatileSetter)
+	init(instance.Instance, *state.State, string, deviceConfig.Device, VolatileGetter, VolatileSetter)
 
 	// validateConfig checks Config stored by init() is valid for the instance type.
 	validateConfig() error
@@ -81,7 +82,7 @@ type device interface {
 
 // deviceCommon represents the common struct for all devices.
 type deviceCommon struct {
-	instance    Instance
+	instance    instance.Instance
 	name        string
 	config      deviceConfig.Device
 	state       *state.State
@@ -93,8 +94,8 @@ type deviceCommon struct {
 // It also needs to be provided with volatile get and set functions for the device to allow
 // persistent data to be accessed. This is implemented as part of deviceCommon so that the majority
 // of devices don't need to implement it and can just embed deviceCommon.
-func (d *deviceCommon) init(instance Instance, state *state.State, name string, conf deviceConfig.Device, volatileGet VolatileGetter, volatileSet VolatileSetter) {
-	d.instance = instance
+func (d *deviceCommon) init(inst instance.Instance, state *state.State, name string, conf deviceConfig.Device, volatileGet VolatileGetter, volatileSet VolatileSetter) {
+	d.instance = inst
 	d.name = name
 	d.config = conf
 	d.state = state
@@ -132,7 +133,7 @@ func (d *deviceCommon) Remove() error {
 // If the device type is valid, but the other config validation fails then an instantiated device
 // is still returned with the validation error. If an unknown device is requested or the device is
 // not compatible with the instance type then an ErrUnsupportedDevType error is returned.
-func New(instance Instance, state *state.State, name string, conf deviceConfig.Device, volatileGet VolatileGetter, volatileSet VolatileSetter) (Device, error) {
+func New(inst instance.Instance, state *state.State, name string, conf deviceConfig.Device, volatileGet VolatileGetter, volatileSet VolatileSetter) (Device, error) {
 	if conf["type"] == "" {
 		return nil, fmt.Errorf("Missing device type for device '%s'", name)
 	}
@@ -151,7 +152,7 @@ func New(instance Instance, state *state.State, name string, conf deviceConfig.D
 	}
 
 	// Init the device and run validation of supplied config.
-	dev.init(instance, state, name, conf, volatileGet, volatileSet)
+	dev.init(inst, state, name, conf, volatileGet, volatileSet)
 	err := dev.validateConfig()
 
 	// We still return the instantiated device here, as in some scenarios the caller
diff --git a/lxd/device/device_utils_disk.go b/lxd/device/device_utils_disk.go
index 16da30c264..25f21090fa 100644
--- a/lxd/device/device_utils_disk.go
+++ b/lxd/device/device_utils_disk.go
@@ -11,18 +11,19 @@ import (
 
 	"golang.org/x/sys/unix"
 
+	"github.com/lxc/lxd/lxd/instance"
 	"github.com/lxc/lxd/lxd/state"
 	"github.com/lxc/lxd/shared"
 )
 
 // StorageVolumeMount checks if storage volume is mounted and if not tries to mount it.
-var StorageVolumeMount func(s *state.State, poolName string, volumeName string, volumeTypeName string, instance Instance) error
+var StorageVolumeMount func(s *state.State, poolName string, volumeName string, volumeTypeName string, inst instance.Instance) error
 
 // StorageVolumeUmount unmounts a storage volume.
 var StorageVolumeUmount func(s *state.State, poolName string, volumeName string, volumeType int) error
 
 // StorageRootFSApplyQuota applies a new quota.
-var StorageRootFSApplyQuota func(s *state.State, instance Instance, size string) error
+var StorageRootFSApplyQuota func(s *state.State, inst instance.Instance, size string) error
 
 // BlockFsDetect detects the type of block device.
 func BlockFsDetect(dev string) (string, error) {
diff --git a/lxd/device/device_utils_instance.go b/lxd/device/device_utils_instance.go
index 9fdd778750..d001461ee5 100644
--- a/lxd/device/device_utils_instance.go
+++ b/lxd/device/device_utils_instance.go
@@ -5,14 +5,15 @@ import (
 	"sync"
 
 	deviceConfig "github.com/lxc/lxd/lxd/device/config"
+	"github.com/lxc/lxd/lxd/instance"
 	"github.com/lxc/lxd/lxd/state"
 )
 
 // InstanceLoadNodeAll returns all local instance configs.
-var InstanceLoadNodeAll func(s *state.State) ([]Instance, error)
+var InstanceLoadNodeAll func(s *state.State) ([]instance.Instance, error)
 
 // InstanceLoadByProjectAndName returns instance config by project and name.
-var InstanceLoadByProjectAndName func(s *state.State, project, name string) (Instance, error)
+var InstanceLoadByProjectAndName func(s *state.State, project, name string) (instance.Instance, error)
 
 // reservedDevicesMutex used to coordinate access for checking reserved devices.
 var reservedDevicesMutex sync.Mutex
diff --git a/lxd/device/device_utils_network.go b/lxd/device/device_utils_network.go
index 78c3232300..02016faa24 100644
--- a/lxd/device/device_utils_network.go
+++ b/lxd/device/device_utils_network.go
@@ -14,6 +14,7 @@ import (
 	"sync"
 
 	deviceConfig "github.com/lxc/lxd/lxd/device/config"
+	"github.com/lxc/lxd/lxd/instance"
 	"github.com/lxc/lxd/lxd/state"
 	"github.com/lxc/lxd/lxd/util"
 	"github.com/lxc/lxd/shared"
@@ -135,7 +136,7 @@ func NetworkRemoveInterface(nic string) error {
 }
 
 // NetworkRemoveInterfaceIfNeeded removes a network interface by name but only if no other instance is using it.
-func NetworkRemoveInterfaceIfNeeded(state *state.State, nic string, current Instance, parent string, vlanID string) error {
+func NetworkRemoveInterfaceIfNeeded(state *state.State, nic string, current instance.Instance, parent string, vlanID string) error {
 	// Check if it's used by another instance.
 	instances, err := InstanceLoadNodeAll(state)
 	if err != nil {
diff --git a/lxd/device/device_utils_unix_events.go b/lxd/device/device_utils_unix_events.go
index 1ef75eef40..ec12643683 100644
--- a/lxd/device/device_utils_unix_events.go
+++ b/lxd/device/device_utils_unix_events.go
@@ -7,6 +7,7 @@ import (
 	"sync"
 
 	deviceConfig "github.com/lxc/lxd/lxd/device/config"
+	"github.com/lxc/lxd/lxd/instance"
 	"github.com/lxc/lxd/lxd/state"
 	"github.com/lxc/lxd/shared"
 	log "github.com/lxc/lxd/shared/log15"
@@ -32,7 +33,7 @@ var unixHandlers = map[string]UnixSubscription{}
 var unixMutex sync.Mutex
 
 // unixRegisterHandler registers a handler function to be called whenever a Unix device event occurs.
-func unixRegisterHandler(s *state.State, instance Instance, deviceName, path string, handler func(UnixEvent) (*deviceConfig.RunConfig, error)) error {
+func unixRegisterHandler(s *state.State, inst instance.Instance, deviceName, path string, handler func(UnixEvent) (*deviceConfig.RunConfig, error)) error {
 	if path == "" || handler == nil {
 		return fmt.Errorf("Invalid subscription")
 	}
@@ -41,7 +42,7 @@ func unixRegisterHandler(s *state.State, instance Instance, deviceName, path str
 	defer unixMutex.Unlock()
 
 	// Null delimited string of project name, instance name and device name.
-	key := fmt.Sprintf("%s\000%s\000%s", instance.Project(), instance.Name(), deviceName)
+	key := fmt.Sprintf("%s\000%s\000%s", inst.Project(), inst.Name(), deviceName)
 	unixHandlers[key] = UnixSubscription{
 		Path:    path,
 		Handler: handler,
@@ -59,12 +60,12 @@ func unixRegisterHandler(s *state.State, instance Instance, deviceName, path str
 }
 
 // unixUnregisterHandler removes a registered Unix handler function for a device.
-func unixUnregisterHandler(s *state.State, instance Instance, deviceName string) error {
+func unixUnregisterHandler(s *state.State, inst instance.Instance, deviceName string) error {
 	unixMutex.Lock()
 	defer unixMutex.Unlock()
 
 	// Null delimited string of project name, instance name and device name.
-	key := fmt.Sprintf("%s\000%s\000%s", instance.Project(), instance.Name(), deviceName)
+	key := fmt.Sprintf("%s\000%s\000%s", inst.Project(), inst.Name(), deviceName)
 
 	sub, exists := unixHandlers[key]
 	if !exists {
diff --git a/lxd/device/device_utils_usb_events.go b/lxd/device/device_utils_usb_events.go
index 5f04530a7b..dfa02ba796 100644
--- a/lxd/device/device_utils_usb_events.go
+++ b/lxd/device/device_utils_usb_events.go
@@ -8,6 +8,7 @@ import (
 	"sync"
 
 	deviceConfig "github.com/lxc/lxd/lxd/device/config"
+	"github.com/lxc/lxd/lxd/instance"
 	"github.com/lxc/lxd/lxd/state"
 	log "github.com/lxc/lxd/shared/log15"
 	"github.com/lxc/lxd/shared/logger"
@@ -34,22 +35,22 @@ var usbHandlers = map[string]func(USBEvent) (*deviceConfig.RunConfig, error){}
 var usbMutex sync.Mutex
 
 // usbRegisterHandler registers a handler function to be called whenever a USB device event occurs.
-func usbRegisterHandler(instance Instance, deviceName string, handler func(USBEvent) (*deviceConfig.RunConfig, error)) {
+func usbRegisterHandler(inst instance.Instance, deviceName string, handler func(USBEvent) (*deviceConfig.RunConfig, error)) {
 	usbMutex.Lock()
 	defer usbMutex.Unlock()
 
 	// Null delimited string of project name, instance name and device name.
-	key := fmt.Sprintf("%s\000%s\000%s", instance.Project(), instance.Name(), deviceName)
+	key := fmt.Sprintf("%s\000%s\000%s", inst.Project(), inst.Name(), deviceName)
 	usbHandlers[key] = handler
 }
 
 // usbUnregisterHandler removes a registered USB handler function for a device.
-func usbUnregisterHandler(instance Instance, deviceName string) {
+func usbUnregisterHandler(inst instance.Instance, deviceName string) {
 	usbMutex.Lock()
 	defer usbMutex.Unlock()
 
 	// Null delimited string of project name, instance name and device name.
-	key := fmt.Sprintf("%s\000%s\000%s", instance.Project(), instance.Name(), deviceName)
+	key := fmt.Sprintf("%s\000%s\000%s", inst.Project(), inst.Name(), deviceName)
 	delete(usbHandlers, key)
 }
 

From fdc80a1b317e23d10fbe1062a4034648edf1a4aa Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 13 Jan 2020 15:38:11 +0000
Subject: [PATCH 5/5] lxd/device: Renames d.instance to d.inst to avoid
 conflicts with instance package

Also for consistency with other package usage of instance.Instance.

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/device/device.go              |  4 +--
 lxd/device/disk.go                | 50 +++++++++++++++----------------
 lxd/device/gpu.go                 | 20 ++++++-------
 lxd/device/infiniband_physical.go |  8 ++---
 lxd/device/infiniband_sriov.go    |  8 ++---
 lxd/device/nic_bridged.go         | 38 +++++++++++------------
 lxd/device/nic_ipvlan.go          |  4 +--
 lxd/device/nic_macvlan.go         |  4 +--
 lxd/device/nic_p2p.go             |  2 +-
 lxd/device/nic_physical.go        |  2 +-
 lxd/device/nic_routed.go          |  4 +--
 lxd/device/nic_sriov.go           |  2 +-
 lxd/device/proxy.go               | 18 +++++------
 lxd/device/unix_common.go         | 16 +++++-----
 lxd/device/usb.go                 | 14 ++++-----
 15 files changed, 97 insertions(+), 97 deletions(-)

diff --git a/lxd/device/device.go b/lxd/device/device.go
index 5e93458c31..45ba6a7bca 100644
--- a/lxd/device/device.go
+++ b/lxd/device/device.go
@@ -82,7 +82,7 @@ type device interface {
 
 // deviceCommon represents the common struct for all devices.
 type deviceCommon struct {
-	instance    instance.Instance
+	inst        instance.Instance
 	name        string
 	config      deviceConfig.Device
 	state       *state.State
@@ -95,7 +95,7 @@ type deviceCommon struct {
 // persistent data to be accessed. This is implemented as part of deviceCommon so that the majority
 // of devices don't need to implement it and can just embed deviceCommon.
 func (d *deviceCommon) init(inst instance.Instance, state *state.State, name string, conf deviceConfig.Device, volatileGet VolatileGetter, volatileSet VolatileSetter) {
-	d.instance = inst
+	d.inst = inst
 	d.name = name
 	d.config = conf
 	d.state = state
diff --git a/lxd/device/disk.go b/lxd/device/disk.go
index 76dc6bcefc..252a42b57c 100644
--- a/lxd/device/disk.go
+++ b/lxd/device/disk.go
@@ -49,7 +49,7 @@ func (d *disk) isRequired(devConfig deviceConfig.Device) bool {
 
 // validateConfig checks the supplied config for correctness.
 func (d *disk) validateConfig() error {
-	if d.instance.Type() != instancetype.Container && d.instance.Type() != instancetype.VM {
+	if d.inst.Type() != instancetype.Container && d.inst.Type() != instancetype.VM {
 		return ErrUnsupportedDevType
 	}
 
@@ -128,7 +128,7 @@ func (d *disk) validateConfig() error {
 	// same path, so that if merged profiles share the same the path and then one is removed
 	// this can still be cleanly removed.
 	pathCount := 0
-	for _, devConfig := range d.instance.LocalDevices() {
+	for _, devConfig := range d.inst.LocalDevices() {
 		if devConfig["type"] == "disk" && devConfig["path"] == d.config["path"] {
 			pathCount++
 			if pathCount > 1 {
@@ -164,7 +164,7 @@ func (d *disk) validateConfig() error {
 		// and not a profile device (check for non-empty instance name), and we have least
 		// one expanded device (this is so we only do this expensive check after devices
 		// have been expanded).
-		if d.instance.Name() != "" && len(d.instance.ExpandedDevices()) > 0 && d.config["source"] != "" && d.config["path"] != "/" {
+		if d.inst.Name() != "" && len(d.inst.ExpandedDevices()) > 0 && d.config["source"] != "" && d.config["path"] != "/" {
 			isAvailable, err := d.state.Cluster.StorageVolumeIsAvailable(d.config["pool"], d.config["source"])
 			if err != nil {
 				return fmt.Errorf("Check if volume is available: %v", err)
@@ -182,7 +182,7 @@ func (d *disk) validateConfig() error {
 func (d *disk) getDevicePath(devName string, devConfig deviceConfig.Device) string {
 	relativeDestPath := strings.TrimPrefix(devConfig["path"], "/")
 	devPath := deviceNameEncode(deviceJoinPath("disk", devName, relativeDestPath))
-	return filepath.Join(d.instance.DevicesPath(), devPath)
+	return filepath.Join(d.inst.DevicesPath(), devPath)
 }
 
 // validateEnvironment checks the runtime environment for correctness.
@@ -191,7 +191,7 @@ func (d *disk) validateEnvironment() error {
 		return fmt.Errorf("shiftfs is required by disk entry but isn't supported on system")
 	}
 
-	if d.instance.Type() != instancetype.VM && d.config["source"] == diskSourceCloudInit {
+	if d.inst.Type() != instancetype.VM && d.config["source"] == diskSourceCloudInit {
 		return fmt.Errorf("disks with source=%s are only supported by virtual machines", diskSourceCloudInit)
 	}
 
@@ -211,7 +211,7 @@ func (d *disk) Start() (*deviceConfig.RunConfig, error) {
 		return nil, err
 	}
 
-	if d.instance.Type() == instancetype.VM {
+	if d.inst.Type() == instancetype.VM {
 		return d.startVM()
 	}
 
@@ -232,7 +232,7 @@ func (d *disk) startContainer() (*deviceConfig.RunConfig, error) {
 			return err
 		}
 
-		err = d.instance.DeviceEventHandler(&runConf)
+		err = d.inst.DeviceEventHandler(&runConf)
 		if err != nil {
 			return err
 		}
@@ -244,7 +244,7 @@ func (d *disk) startContainer() (*deviceConfig.RunConfig, error) {
 	if shared.IsRootDiskDevice(d.config) {
 		// Set the rootfs path.
 		rootfs := deviceConfig.RootFSEntryItem{
-			Path: d.instance.RootfsPath(),
+			Path: d.inst.RootfsPath(),
 		}
 
 		// Read-only rootfs (unlikely to work very well).
@@ -300,7 +300,7 @@ func (d *disk) startContainer() (*deviceConfig.RunConfig, error) {
 				return nil, err
 			}
 
-			_, volume, err := d.state.Cluster.StoragePoolNodeVolumeGetTypeByProject(d.instance.Project(), d.config["source"], db.StoragePoolVolumeTypeCustom, poolID)
+			_, volume, err := d.state.Cluster.StoragePoolNodeVolumeGetTypeByProject(d.inst.Project(), d.config["source"], db.StoragePoolVolumeTypeCustom, poolID)
 			if err != nil {
 				return nil, err
 			}
@@ -397,7 +397,7 @@ func (d *disk) postStart() error {
 
 // Update applies configuration changes to a started device.
 func (d *disk) Update(oldDevices deviceConfig.Devices, isRunning bool) error {
-	if d.instance.Type() == instancetype.VM {
+	if d.inst.Type() == instancetype.VM {
 		if shared.IsRootDiskDevice(d.config) {
 			return nil
 		}
@@ -407,7 +407,7 @@ func (d *disk) Update(oldDevices deviceConfig.Devices, isRunning bool) error {
 
 	if shared.IsRootDiskDevice(d.config) {
 		// Make sure we have a valid root disk device (and only one).
-		expandedDevices := d.instance.ExpandedDevices()
+		expandedDevices := d.inst.ExpandedDevices()
 		newRootDiskDeviceKey, _, err := shared.GetRootDiskDevice(expandedDevices.CloneNative())
 		if err != nil {
 			return errors.Wrap(err, "Detect root disk device")
@@ -456,7 +456,7 @@ func (d *disk) Update(oldDevices deviceConfig.Devices, isRunning bool) error {
 			return err
 		}
 
-		err = d.instance.DeviceEventHandler(&runConf)
+		err = d.inst.DeviceEventHandler(&runConf)
 		if err != nil {
 			return err
 		}
@@ -466,13 +466,13 @@ func (d *disk) Update(oldDevices deviceConfig.Devices, isRunning bool) error {
 }
 
 func (d *disk) applyQuota(newSize string) error {
-	return StorageRootFSApplyQuota(d.state, d.instance, newSize)
+	return StorageRootFSApplyQuota(d.state, d.inst, newSize)
 }
 
 // generateLimits adds a set of cgroup rules to apply specified limits to the supplied RunConfig.
 func (d *disk) generateLimits(runConf *deviceConfig.RunConfig) error {
 	// Disk priority limits.
-	diskPriority := d.instance.ExpandedConfig()["limits.disk.priority"]
+	diskPriority := d.inst.ExpandedConfig()["limits.disk.priority"]
 	if diskPriority != "" {
 		if d.state.OS.CGInfo.Supports(cgroup.BlkioWeight, nil) {
 			priorityInt, err := strconv.Atoi(diskPriority)
@@ -498,7 +498,7 @@ func (d *disk) generateLimits(runConf *deviceConfig.RunConfig) error {
 
 	// Disk throttle limits.
 	hasDiskLimits := false
-	for _, dev := range d.instance.ExpandedDevices() {
+	for _, dev := range d.inst.ExpandedDevices() {
 		if dev["type"] != "disk" {
 			continue
 		}
@@ -679,7 +679,7 @@ func (d *disk) createDevice() (string, error) {
 			return "", fmt.Errorf("Unknown storage type prefix \"%s\" found", volumeTypeName)
 		}
 
-		err := StorageVolumeMount(d.state, d.config["pool"], volumeName, volumeTypeName, d.instance)
+		err := StorageVolumeMount(d.state, d.config["pool"], volumeName, volumeTypeName, d.inst)
 		if err != nil {
 			msg := fmt.Sprintf("Could not mount storage volume \"%s\" of type \"%s\" on storage pool \"%s\": %s.", volumeName, volumeTypeName, d.config["pool"], err)
 			if !isRequired {
@@ -700,8 +700,8 @@ func (d *disk) createDevice() (string, error) {
 	}
 
 	// Create the devices directory if missing.
-	if !shared.PathExists(d.instance.DevicesPath()) {
-		err := os.Mkdir(d.instance.DevicesPath(), 0711)
+	if !shared.PathExists(d.inst.DevicesPath()) {
+		err := os.Mkdir(d.inst.DevicesPath(), 0711)
 		if err != nil {
 			return "", err
 		}
@@ -741,7 +741,7 @@ func (d *disk) createDevice() (string, error) {
 
 // Stop is run when the device is removed from the instance.
 func (d *disk) Stop() (*deviceConfig.RunConfig, error) {
-	if d.instance.Type() == instancetype.VM {
+	if d.inst.Type() == instancetype.VM {
 		// Only root disks and cloud-init:config drives supported on VMs.
 		if shared.IsRootDiskDevice(d.config) || d.config["source"] == diskSourceCloudInit {
 			return &deviceConfig.RunConfig{}, nil
@@ -841,7 +841,7 @@ func (d *disk) getDiskLimits() (map[string]diskBlockLimit, error) {
 
 	// Process all the limits
 	blockLimits := map[string][]diskBlockLimit{}
-	for devName, dev := range d.instance.ExpandedDevices() {
+	for devName, dev := range d.inst.ExpandedDevices() {
 		if dev["type"] != "disk" {
 			continue
 		}
@@ -861,7 +861,7 @@ func (d *disk) getDiskLimits() (map[string]diskBlockLimit, error) {
 		// Set the source path
 		source := d.getDevicePath(devName, dev)
 		if dev["source"] == "" {
-			source = d.instance.RootfsPath()
+			source = d.inst.RootfsPath()
 		}
 
 		if !shared.PathExists(source) {
@@ -1149,7 +1149,7 @@ func (d *disk) getParentBlocks(path string) ([]string, error) {
 // generateVMConfigDrive generates an ISO containing the cloud init config for a VM.
 // Returns the path to the ISO.
 func (d *disk) generateVMConfigDrive() (string, error) {
-	scratchDir := filepath.Join(d.instance.DevicesPath(), deviceNameEncode(d.name))
+	scratchDir := filepath.Join(d.inst.DevicesPath(), deviceNameEncode(d.name))
 
 	// Create config drive dir.
 	err := os.MkdirAll(scratchDir, 0100)
@@ -1157,7 +1157,7 @@ func (d *disk) generateVMConfigDrive() (string, error) {
 		return "", err
 	}
 
-	instanceConfig := d.instance.ExpandedConfig()
+	instanceConfig := d.inst.ExpandedConfig()
 
 	// Use an empty user-data file if no custom vendor-data supplied.
 	vendorData := instanceConfig["user.vendor-data"]
@@ -1185,7 +1185,7 @@ func (d *disk) generateVMConfigDrive() (string, error) {
 	metaData := fmt.Sprintf(`instance-id: %s
 local-hostname: %s
 %s
-`, d.instance.Name(), d.instance.Name(), instanceConfig["user.meta-data"])
+`, d.inst.Name(), d.inst.Name(), instanceConfig["user.meta-data"])
 
 	err = ioutil.WriteFile(filepath.Join(scratchDir, "meta-data"), []byte(metaData), 0400)
 	if err != nil {
@@ -1196,7 +1196,7 @@ local-hostname: %s
 	// as this is what cloud-init uses to detect, mount the drive and run the cloud-init
 	// templates on first boot. The vendor-data template then modifies the system so that the
 	// config drive is mounted and the agent is started on subsequent boots.
-	isoPath := filepath.Join(d.instance.Path(), "config.iso")
+	isoPath := filepath.Join(d.inst.Path(), "config.iso")
 	_, err = shared.RunCommand("mkisofs", "-R", "-V", "cidata", "-o", isoPath, scratchDir)
 	if err != nil {
 		return "", err
diff --git a/lxd/device/gpu.go b/lxd/device/gpu.go
index fb59d404e6..30c5888040 100644
--- a/lxd/device/gpu.go
+++ b/lxd/device/gpu.go
@@ -32,7 +32,7 @@ type gpu struct {
 
 // validateConfig checks the supplied config for correctness.
 func (d *gpu) validateConfig() error {
-	if d.instance.Type() != instancetype.Container {
+	if d.inst.Type() != instancetype.Container {
 		return ErrUnsupportedDevType
 	}
 
@@ -104,7 +104,7 @@ func (d *gpu) Start() (*deviceConfig.RunConfig, error) {
 					return nil, err
 				}
 
-				err = unixDeviceSetupCharNum(d.state, d.instance.DevicesPath(), "unix", d.name, d.config, major, minor, path, false, &runConf)
+				err = unixDeviceSetupCharNum(d.state, d.inst.DevicesPath(), "unix", d.name, d.config, major, minor, path, false, &runConf)
 				if err != nil {
 					return nil, err
 				}
@@ -117,7 +117,7 @@ func (d *gpu) Start() (*deviceConfig.RunConfig, error) {
 					return nil, err
 				}
 
-				err = unixDeviceSetupCharNum(d.state, d.instance.DevicesPath(), "unix", d.name, d.config, major, minor, path, false, &runConf)
+				err = unixDeviceSetupCharNum(d.state, d.inst.DevicesPath(), "unix", d.name, d.config, major, minor, path, false, &runConf)
 				if err != nil {
 					return nil, err
 				}
@@ -130,7 +130,7 @@ func (d *gpu) Start() (*deviceConfig.RunConfig, error) {
 					return nil, err
 				}
 
-				err = unixDeviceSetupCharNum(d.state, d.instance.DevicesPath(), "unix", d.name, d.config, major, minor, path, false, &runConf)
+				err = unixDeviceSetupCharNum(d.state, d.inst.DevicesPath(), "unix", d.name, d.config, major, minor, path, false, &runConf)
 				if err != nil {
 					return nil, err
 				}
@@ -145,7 +145,7 @@ func (d *gpu) Start() (*deviceConfig.RunConfig, error) {
 					return nil, err
 				}
 
-				err = unixDeviceSetupCharNum(d.state, d.instance.DevicesPath(), "unix", d.name, d.config, major, minor, path, false, &runConf)
+				err = unixDeviceSetupCharNum(d.state, d.inst.DevicesPath(), "unix", d.name, d.config, major, minor, path, false, &runConf)
 				if err != nil {
 					return nil, err
 				}
@@ -156,7 +156,7 @@ func (d *gpu) Start() (*deviceConfig.RunConfig, error) {
 	if sawNvidia {
 		// No need to mount additional nvidia non-card devices as the nvidia.runtime
 		// setting will do this for us.
-		instanceConfig := d.instance.ExpandedConfig()
+		instanceConfig := d.inst.ExpandedConfig()
 		if !shared.IsTrue(instanceConfig["nvidia.runtime"]) {
 			nvidiaDevices, err := d.getNvidiaNonCardDevices()
 			if err != nil {
@@ -165,11 +165,11 @@ func (d *gpu) Start() (*deviceConfig.RunConfig, error) {
 
 			for _, dev := range nvidiaDevices {
 				prefix := deviceJoinPath("unix", d.name)
-				if UnixDeviceExists(d.instance.DevicesPath(), prefix, dev.path) {
+				if UnixDeviceExists(d.inst.DevicesPath(), prefix, dev.path) {
 					continue
 				}
 
-				err = unixDeviceSetupCharNum(d.state, d.instance.DevicesPath(), "unix", d.name, d.config, dev.major, dev.minor, dev.path, false, &runConf)
+				err = unixDeviceSetupCharNum(d.state, d.inst.DevicesPath(), "unix", d.name, d.config, dev.major, dev.minor, dev.path, false, &runConf)
 				if err != nil {
 					return nil, err
 				}
@@ -190,7 +190,7 @@ func (d *gpu) Stop() (*deviceConfig.RunConfig, error) {
 		PostHooks: []func() error{d.postStop},
 	}
 
-	err := unixDeviceRemove(d.instance.DevicesPath(), "unix", d.name, "", &runConf)
+	err := unixDeviceRemove(d.inst.DevicesPath(), "unix", d.name, "", &runConf)
 	if err != nil {
 		return nil, err
 	}
@@ -201,7 +201,7 @@ func (d *gpu) Stop() (*deviceConfig.RunConfig, error) {
 // postStop is run after the device is removed from the instance.
 func (d *gpu) postStop() error {
 	// Remove host files for this device.
-	err := unixDeviceDeleteFiles(d.state, d.instance.DevicesPath(), "unix", d.name, "")
+	err := unixDeviceDeleteFiles(d.state, d.inst.DevicesPath(), "unix", d.name, "")
 	if err != nil {
 		return fmt.Errorf("Failed to delete files for device '%s': %v", d.name, err)
 	}
diff --git a/lxd/device/infiniband_physical.go b/lxd/device/infiniband_physical.go
index 71392f7180..564625461a 100644
--- a/lxd/device/infiniband_physical.go
+++ b/lxd/device/infiniband_physical.go
@@ -15,7 +15,7 @@ type infinibandPhysical struct {
 
 // validateConfig checks the supplied config for correctness.
 func (d *infinibandPhysical) validateConfig() error {
-	if d.instance.Type() != instancetype.Container {
+	if d.inst.Type() != instancetype.Container {
 		return ErrUnsupportedDevType
 	}
 
@@ -105,7 +105,7 @@ func (d *infinibandPhysical) Start() (*deviceConfig.RunConfig, error) {
 	runConf := deviceConfig.RunConfig{}
 
 	// Configure runConf with infiniband setup instructions.
-	err = infinibandAddDevices(d.state, d.instance.DevicesPath(), d.name, ibDev, &runConf)
+	err = infinibandAddDevices(d.state, d.inst.DevicesPath(), d.name, ibDev, &runConf)
 	if err != nil {
 		return nil, err
 	}
@@ -135,7 +135,7 @@ func (d *infinibandPhysical) Stop() (*deviceConfig.RunConfig, error) {
 		},
 	}
 
-	err := unixDeviceRemove(d.instance.DevicesPath(), IBDevPrefix, d.name, "", &runConf)
+	err := unixDeviceRemove(d.inst.DevicesPath(), IBDevPrefix, d.name, "", &runConf)
 	if err != nil {
 		return nil, err
 	}
@@ -152,7 +152,7 @@ func (d *infinibandPhysical) postStop() error {
 	})
 
 	// Remove infiniband host files for this device.
-	err := unixDeviceDeleteFiles(d.state, d.instance.DevicesPath(), IBDevPrefix, d.name, "")
+	err := unixDeviceDeleteFiles(d.state, d.inst.DevicesPath(), IBDevPrefix, d.name, "")
 	if err != nil {
 		return fmt.Errorf("Failed to delete files for device '%s': %v", d.name, err)
 	}
diff --git a/lxd/device/infiniband_sriov.go b/lxd/device/infiniband_sriov.go
index aa3e35b477..f471d9419b 100644
--- a/lxd/device/infiniband_sriov.go
+++ b/lxd/device/infiniband_sriov.go
@@ -16,7 +16,7 @@ type infinibandSRIOV struct {
 
 // validateConfig checks the supplied config for correctness.
 func (d *infinibandSRIOV) validateConfig() error {
-	if d.instance.Type() != instancetype.Container {
+	if d.inst.Type() != instancetype.Container {
 		return ErrUnsupportedDevType
 	}
 
@@ -127,7 +127,7 @@ func (d *infinibandSRIOV) Start() (*deviceConfig.RunConfig, error) {
 	runConf := deviceConfig.RunConfig{}
 
 	// Configure runConf with infiniband setup instructions.
-	err = infinibandAddDevices(d.state, d.instance.DevicesPath(), d.name, vfDev, &runConf)
+	err = infinibandAddDevices(d.state, d.inst.DevicesPath(), d.name, vfDev, &runConf)
 	if err != nil {
 		return nil, err
 	}
@@ -155,7 +155,7 @@ func (d *infinibandSRIOV) Stop() (*deviceConfig.RunConfig, error) {
 		NetworkInterface: []deviceConfig.RunConfigItem{{Key: "link", Value: v["host_name"]}},
 	}
 
-	err := unixDeviceRemove(d.instance.DevicesPath(), IBDevPrefix, d.name, "", &runConf)
+	err := unixDeviceRemove(d.inst.DevicesPath(), IBDevPrefix, d.name, "", &runConf)
 	if err != nil {
 		return nil, err
 	}
@@ -172,7 +172,7 @@ func (d *infinibandSRIOV) postStop() error {
 	})
 
 	// Remove infiniband host files for this device.
-	err := unixDeviceDeleteFiles(d.state, d.instance.DevicesPath(), IBDevPrefix, d.name, "")
+	err := unixDeviceDeleteFiles(d.state, d.inst.DevicesPath(), IBDevPrefix, d.name, "")
 	if err != nil {
 		return fmt.Errorf("Failed to delete files for device '%s': %v", d.name, err)
 	}
diff --git a/lxd/device/nic_bridged.go b/lxd/device/nic_bridged.go
index 0522fdbd8e..d34d7d6aeb 100644
--- a/lxd/device/nic_bridged.go
+++ b/lxd/device/nic_bridged.go
@@ -49,7 +49,7 @@ type nicBridged struct {
 
 // validateConfig checks the supplied config for correctness.
 func (d *nicBridged) validateConfig() error {
-	if d.instance.Type() != instancetype.Container && d.instance.Type() != instancetype.VM {
+	if d.inst.Type() != instancetype.Container && d.inst.Type() != instancetype.VM {
 		return ErrUnsupportedDevType
 	}
 
@@ -126,9 +126,9 @@ func (d *nicBridged) Start() (*deviceConfig.RunConfig, error) {
 	var peerName string // Only used with containers, empty for VMs.
 
 	// Create veth pair and configure the peer end with custom hwaddr and mtu if supplied.
-	if d.instance.Type() == instancetype.Container {
+	if d.inst.Type() == instancetype.Container {
 		peerName, err = networkCreateVethPair(saveData["host_name"], d.config)
-	} else if d.instance.Type() == instancetype.VM {
+	} else if d.inst.Type() == instancetype.VM {
 		peerName = saveData["host_name"] // VMs use the host_name to link to the TAP FD.
 		err = networkCreateTap(saveData["host_name"])
 	}
@@ -178,7 +178,7 @@ func (d *nicBridged) Start() (*deviceConfig.RunConfig, error) {
 		{Key: "link", Value: peerName},
 	}
 
-	if d.instance.Type() == instancetype.VM {
+	if d.inst.Type() == instancetype.VM {
 		runConf.NetworkInterface = append(runConf.NetworkInterface,
 			deviceConfig.RunConfigItem{Key: "hwaddr", Value: d.config["hwaddr"]},
 		)
@@ -195,7 +195,7 @@ func (d *nicBridged) Update(oldDevices deviceConfig.Devices, isRunning bool) err
 	// isn't allocated old IP. This is important with IPv6 because DHCPv6 supports multiple IP
 	// address allocation and would result in instance having leases for both old and new IPs.
 	if d.config["hwaddr"] != "" && d.config["ipv6.address"] != oldConfig["ipv6.address"] {
-		err := d.networkClearLease(d.instance.Name(), d.config["parent"], d.config["hwaddr"], clearLeaseIPv6Only)
+		err := d.networkClearLease(d.inst.Name(), d.config["parent"], d.config["hwaddr"], clearLeaseIPv6Only)
 		if err != nil {
 			return err
 		}
@@ -291,7 +291,7 @@ func (d *nicBridged) postStop() error {
 
 // Remove is run when the device is removed from the instance or the instance is deleted.
 func (d *nicBridged) Remove() error {
-	err := d.networkClearLease(d.instance.Name(), d.config["parent"], d.config["hwaddr"], clearLeaseAll)
+	err := d.networkClearLease(d.inst.Name(), d.config["parent"], d.config["hwaddr"], clearLeaseAll)
 	if err != nil {
 		return err
 	}
@@ -301,7 +301,7 @@ func (d *nicBridged) Remove() error {
 		defer dnsmasq.ConfigMutex.Unlock()
 
 		// Remove dnsmasq config if it exists (doesn't return error if file is missing).
-		err := dnsmasq.RemoveStaticEntry(d.config["parent"], d.instance.Project(), d.instance.Name())
+		err := dnsmasq.RemoveStaticEntry(d.config["parent"], d.inst.Project(), d.inst.Name())
 		if err != nil {
 			return err
 		}
@@ -341,7 +341,7 @@ func (d *nicBridged) rebuildDnsmasqEntry() error {
 	// If IP filtering is enabled, and no static IP in config, check if there is already a
 	// dynamically assigned static IP in dnsmasq config and write that back out in new config.
 	if (shared.IsTrue(d.config["security.ipv4_filtering"]) && ipv4Address == "") || (shared.IsTrue(d.config["security.ipv6_filtering"]) && ipv6Address == "") {
-		curIPv4, curIPv6, err := dnsmasq.DHCPStaticIPs(d.config["parent"], d.instance.Name())
+		curIPv4, curIPv6, err := dnsmasq.DHCPStaticIPs(d.config["parent"], d.inst.Name())
 		if err != nil && !os.IsNotExist(err) {
 			return err
 		}
@@ -355,7 +355,7 @@ func (d *nicBridged) rebuildDnsmasqEntry() error {
 		}
 	}
 
-	err = dnsmasq.UpdateStaticEntry(d.config["parent"], d.instance.Project(), d.instance.Name(), netConfig, d.config["hwaddr"], ipv4Address, ipv6Address)
+	err = dnsmasq.UpdateStaticEntry(d.config["parent"], d.inst.Project(), d.inst.Name(), netConfig, d.config["hwaddr"], ipv4Address, ipv6Address)
 	if err != nil {
 		return err
 	}
@@ -398,15 +398,15 @@ func (d *nicBridged) removeFilters(m deviceConfig.Device) error {
 	}
 
 	// Remove any IPv6 filters used for this instance.
-	err := d.state.Firewall.InstanceClear(firewallConsts.FamilyIPv6, firewallConsts.TableFilter, fmt.Sprintf("%s - ipv6_filtering", d.instance.Name()))
+	err := d.state.Firewall.InstanceClear(firewallConsts.FamilyIPv6, firewallConsts.TableFilter, fmt.Sprintf("%s - ipv6_filtering", d.inst.Name()))
 	if err != nil {
 		return fmt.Errorf("Failed to clear ip6tables ipv6_filter rules for %s: %v", m["name"], err)
 	}
 
 	// Read current static IP allocation configured from dnsmasq host config (if exists).
 	var IPv4, IPv6 dhcpAllocation
-	if shared.PathExists(shared.VarPath("networks", m["parent"], "dnsmasq.hosts") + "/" + d.instance.Name()) {
-		IPv4, IPv6, err = d.getDHCPStaticIPs(m["parent"], d.instance.Name())
+	if shared.PathExists(shared.VarPath("networks", m["parent"], "dnsmasq.hosts") + "/" + d.inst.Name()) {
+		IPv4, IPv6, err = d.getDHCPStaticIPs(m["parent"], d.inst.Name())
 		if err != nil {
 			return fmt.Errorf("Failed to retrieve static IPs for filter removal from %s: %v", m["name"], err)
 		}
@@ -436,14 +436,14 @@ func (d *nicBridged) getDHCPStaticIPs(network string, instanceName string) (dhcp
 				if IP.To4() == nil {
 					return IPv4, IPv6, fmt.Errorf("Error parsing IP address: %v", field)
 				}
-				IPv4 = dhcpAllocation{Name: d.instance.Name(), Static: true, IP: IP.To4()}
+				IPv4 = dhcpAllocation{Name: d.inst.Name(), Static: true, IP: IP.To4()}
 
 			} else if strings.HasPrefix(field, "[") && strings.HasSuffix(field, "]") {
 				IP := net.ParseIP(field[1 : len(field)-1])
 				if IP == nil {
 					return IPv4, IPv6, fmt.Errorf("Error parsing IP address: %v", field)
 				}
-				IPv6 = dhcpAllocation{Name: d.instance.Name(), Static: true, IP: IP}
+				IPv6 = dhcpAllocation{Name: d.inst.Name(), Static: true, IP: IP}
 			}
 		}
 	}
@@ -576,7 +576,7 @@ func (d *nicBridged) setFilters() (err error) {
 		}
 	}()
 
-	return d.state.Firewall.InstanceNicBridgedSetFilters(d.config, IPv4, IPv6, d.instance.Name())
+	return d.state.Firewall.InstanceNicBridgedSetFilters(d.config, IPv4, IPv6, d.inst.Name())
 }
 
 // networkAllocateVethFilterIPs retrieves previously allocated IPs, or allocate new ones if needed.
@@ -619,7 +619,7 @@ func (d *nicBridged) allocateFilterIPs(netConfig map[string]string) (net.IP, net
 	defer dnsmasq.ConfigMutex.Unlock()
 
 	// Read current static IP allocation configured from dnsmasq host config (if exists).
-	curIPv4, curIPv6, err := d.getDHCPStaticIPs(d.config["parent"], d.instance.Name())
+	curIPv4, curIPv6, err := d.getDHCPStaticIPs(d.config["parent"], d.inst.Name())
 	if err != nil && !os.IsNotExist(err) {
 		return nil, nil, err
 	}
@@ -664,7 +664,7 @@ func (d *nicBridged) allocateFilterIPs(netConfig map[string]string) (net.IP, net
 
 		// Allocate a new IPv4 address if IPv4 filtering enabled.
 		if IPv4 == nil && canIPv4Allocate && shared.IsTrue(d.config["security.ipv4_filtering"]) {
-			IPv4, err = d.getDHCPFreeIPv4(IPv4Allocs, netConfig, d.instance.Name(), d.config["hwaddr"])
+			IPv4, err = d.getDHCPFreeIPv4(IPv4Allocs, netConfig, d.inst.Name(), d.config["hwaddr"])
 			if err != nil {
 				return nil, nil, err
 			}
@@ -672,7 +672,7 @@ func (d *nicBridged) allocateFilterIPs(netConfig map[string]string) (net.IP, net
 
 		// Allocate a new IPv6 address if IPv6 filtering enabled.
 		if IPv6 == nil && canIPv6Allocate && shared.IsTrue(d.config["security.ipv6_filtering"]) {
-			IPv6, err = d.getDHCPFreeIPv6(IPv6Allocs, netConfig, d.instance.Name(), d.config["hwaddr"])
+			IPv6, err = d.getDHCPFreeIPv6(IPv6Allocs, netConfig, d.inst.Name(), d.config["hwaddr"])
 			if err != nil {
 				return nil, nil, err
 			}
@@ -692,7 +692,7 @@ func (d *nicBridged) allocateFilterIPs(netConfig map[string]string) (net.IP, net
 			IPv6Str = IPv6.String()
 		}
 
-		err = dnsmasq.UpdateStaticEntry(d.config["parent"], d.instance.Project(), d.instance.Name(), netConfig, d.config["hwaddr"], IPv4Str, IPv6Str)
+		err = dnsmasq.UpdateStaticEntry(d.config["parent"], d.inst.Project(), d.inst.Name(), netConfig, d.config["hwaddr"], IPv4Str, IPv6Str)
 		if err != nil {
 			return nil, nil, err
 		}
diff --git a/lxd/device/nic_ipvlan.go b/lxd/device/nic_ipvlan.go
index 1dca274a5e..480b8af1df 100644
--- a/lxd/device/nic_ipvlan.go
+++ b/lxd/device/nic_ipvlan.go
@@ -20,7 +20,7 @@ func (d *nicIPVLAN) CanHotPlug() (bool, []string) {
 
 // validateConfig checks the supplied config for correctness.
 func (d *nicIPVLAN) validateConfig() error {
-	if d.instance.Type() != instancetype.Container {
+	if d.inst.Type() != instancetype.Container {
 		return ErrUnsupportedDevType
 	}
 
@@ -232,7 +232,7 @@ func (d *nicIPVLAN) postStop() error {
 	// This will delete the parent interface if we created it for VLAN parent.
 	if shared.IsTrue(v["last_state.created"]) {
 		parentName := NetworkGetHostDevice(d.config["parent"], d.config["vlan"])
-		err := NetworkRemoveInterfaceIfNeeded(d.state, parentName, d.instance, d.config["parent"], d.config["vlan"])
+		err := NetworkRemoveInterfaceIfNeeded(d.state, parentName, d.inst, d.config["parent"], d.config["vlan"])
 		if err != nil {
 			return err
 		}
diff --git a/lxd/device/nic_macvlan.go b/lxd/device/nic_macvlan.go
index 03b48fad5d..fb7b87d21d 100644
--- a/lxd/device/nic_macvlan.go
+++ b/lxd/device/nic_macvlan.go
@@ -14,7 +14,7 @@ type nicMACVLAN struct {
 
 // validateConfig checks the supplied config for correctness.
 func (d *nicMACVLAN) validateConfig() error {
-	if d.instance.Type() != instancetype.Container {
+	if d.inst.Type() != instancetype.Container {
 		return ErrUnsupportedDevType
 	}
 
@@ -151,7 +151,7 @@ func (d *nicMACVLAN) postStop() error {
 	// This will delete the parent interface if we created it for VLAN parent.
 	if shared.IsTrue(v["last_state.created"]) {
 		parentName := NetworkGetHostDevice(d.config["parent"], d.config["vlan"])
-		err := NetworkRemoveInterfaceIfNeeded(d.state, parentName, d.instance, d.config["parent"], d.config["vlan"])
+		err := NetworkRemoveInterfaceIfNeeded(d.state, parentName, d.inst, d.config["parent"], d.config["vlan"])
 		if err != nil {
 			errs = append(errs, err)
 		}
diff --git a/lxd/device/nic_p2p.go b/lxd/device/nic_p2p.go
index 4112188523..2349039c50 100644
--- a/lxd/device/nic_p2p.go
+++ b/lxd/device/nic_p2p.go
@@ -14,7 +14,7 @@ type nicP2P struct {
 
 // validateConfig checks the supplied config for correctness.
 func (d *nicP2P) validateConfig() error {
-	if d.instance.Type() != instancetype.Container {
+	if d.inst.Type() != instancetype.Container {
 		return ErrUnsupportedDevType
 	}
 
diff --git a/lxd/device/nic_physical.go b/lxd/device/nic_physical.go
index 8ab2bb19c5..8376da3a07 100644
--- a/lxd/device/nic_physical.go
+++ b/lxd/device/nic_physical.go
@@ -14,7 +14,7 @@ type nicPhysical struct {
 
 // validateConfig checks the supplied config for correctness.
 func (d *nicPhysical) validateConfig() error {
-	if d.instance.Type() != instancetype.Container {
+	if d.inst.Type() != instancetype.Container {
 		return ErrUnsupportedDevType
 	}
 
diff --git a/lxd/device/nic_routed.go b/lxd/device/nic_routed.go
index a77eadc3d9..8b9db5eb31 100644
--- a/lxd/device/nic_routed.go
+++ b/lxd/device/nic_routed.go
@@ -23,7 +23,7 @@ func (d *nicRouted) CanHotPlug() (bool, []string) {
 
 // validateConfig checks the supplied config for correctness.
 func (d *nicRouted) validateConfig() error {
-	if d.instance.Type() != instancetype.Container {
+	if d.inst.Type() != instancetype.Container {
 		return ErrUnsupportedDevType
 	}
 
@@ -310,7 +310,7 @@ func (d *nicRouted) postStop() error {
 	// This will delete the parent interface if we created it for VLAN parent.
 	if shared.IsTrue(v["last_state.created"]) {
 		parentName := NetworkGetHostDevice(d.config["parent"], d.config["vlan"])
-		err := NetworkRemoveInterfaceIfNeeded(d.state, parentName, d.instance, d.config["parent"], d.config["vlan"])
+		err := NetworkRemoveInterfaceIfNeeded(d.state, parentName, d.inst, d.config["parent"], d.config["vlan"])
 		if err != nil {
 			return err
 		}
diff --git a/lxd/device/nic_sriov.go b/lxd/device/nic_sriov.go
index 4e727f4d0d..1079b9773f 100644
--- a/lxd/device/nic_sriov.go
+++ b/lxd/device/nic_sriov.go
@@ -24,7 +24,7 @@ type nicSRIOV struct {
 
 // validateConfig checks the supplied config for correctness.
 func (d *nicSRIOV) validateConfig() error {
-	if d.instance.Type() != instancetype.Container {
+	if d.inst.Type() != instancetype.Container {
 		return ErrUnsupportedDevType
 	}
 
diff --git a/lxd/device/proxy.go b/lxd/device/proxy.go
index 49e7223e80..1ac382907c 100644
--- a/lxd/device/proxy.go
+++ b/lxd/device/proxy.go
@@ -41,7 +41,7 @@ type proxyProcInfo struct {
 
 // validateConfig checks the supplied config for correctness.
 func (d *proxy) validateConfig() error {
-	if d.instance.Type() != instancetype.Container {
+	if d.inst.Type() != instancetype.Container {
 		return ErrUnsupportedDevType
 	}
 
@@ -148,9 +148,9 @@ func (d *proxy) Start() (*deviceConfig.RunConfig, error) {
 			}
 
 			devFileName := fmt.Sprintf("proxy.%s", d.name)
-			pidPath := filepath.Join(d.instance.DevicesPath(), devFileName)
+			pidPath := filepath.Join(d.inst.DevicesPath(), devFileName)
 			logFileName := fmt.Sprintf("proxy.%s.log", d.name)
-			logPath := filepath.Join(d.instance.LogPath(), logFileName)
+			logPath := filepath.Join(d.inst.LogPath(), logFileName)
 
 			_, err = shared.RunCommand(
 				d.state.OS.ExecPath,
@@ -227,11 +227,11 @@ func (d *proxy) checkProcStarted(logPath string) (bool, error) {
 // Stop is run when the device is removed from the instance.
 func (d *proxy) Stop() (*deviceConfig.RunConfig, error) {
 	// Remove possible iptables entries
-	d.state.Firewall.InstanceClear(firewallConsts.FamilyIPv4, firewallConsts.TableNat, fmt.Sprintf("%s (%s)", d.instance.Name(), d.name))
-	d.state.Firewall.InstanceClear(firewallConsts.FamilyIPv6, firewallConsts.TableNat, fmt.Sprintf("%s (%s)", d.instance.Name(), d.name))
+	d.state.Firewall.InstanceClear(firewallConsts.FamilyIPv4, firewallConsts.TableNat, fmt.Sprintf("%s (%s)", d.inst.Name(), d.name))
+	d.state.Firewall.InstanceClear(firewallConsts.FamilyIPv6, firewallConsts.TableNat, fmt.Sprintf("%s (%s)", d.inst.Name(), d.name))
 
 	devFileName := fmt.Sprintf("proxy.%s", d.name)
-	devPath := filepath.Join(d.instance.DevicesPath(), devFileName)
+	devPath := filepath.Join(d.inst.DevicesPath(), devFileName)
 
 	if !shared.PathExists(devPath) {
 		// There's no proxy process if NAT is enabled
@@ -265,7 +265,7 @@ func (d *proxy) setupNAT() error {
 	var IPv4Addr net.IP
 	var IPv6Addr net.IP
 
-	for _, devConfig := range d.instance.ExpandedDevices() {
+	for _, devConfig := range d.inst.ExpandedDevices() {
 		if devConfig["type"] != "nic" || (devConfig["type"] == "nic" && devConfig["nictype"] != "bridged") {
 			continue
 		}
@@ -288,7 +288,7 @@ func (d *proxy) setupNAT() error {
 		return fmt.Errorf("NIC IP doesn't match proxy target IP")
 	}
 
-	firewallComment := fmt.Sprintf("%s (%s)", d.instance.Name(), d.name)
+	firewallComment := fmt.Sprintf("%s (%s)", d.inst.Name(), d.name)
 
 	revert := true
 	defer func() {
@@ -347,7 +347,7 @@ func (d *proxy) rewriteHostAddr(addr string) string {
 }
 
 func (d *proxy) setupProxyProcInfo() (*proxyProcInfo, error) {
-	cname := project.Prefix(d.instance.Project(), d.instance.Name())
+	cname := project.Prefix(d.inst.Project(), d.inst.Name())
 	cc, err := lxc.NewContainer(cname, d.state.OS.LxcPath)
 	if err != nil {
 		return nil, err
diff --git a/lxd/device/unix_common.go b/lxd/device/unix_common.go
index fa47d244df..ba32170f90 100644
--- a/lxd/device/unix_common.go
+++ b/lxd/device/unix_common.go
@@ -39,7 +39,7 @@ func (d *unixCommon) isRequired() bool {
 
 // validateConfig checks the supplied config for correctness.
 func (d *unixCommon) validateConfig() error {
-	if d.instance.Type() != instancetype.Container {
+	if d.inst.Type() != instancetype.Container {
 		return ErrUnsupportedDevType
 	}
 
@@ -75,7 +75,7 @@ func (d *unixCommon) Register() error {
 
 	// Extract variables needed to run the event hook so that the reference to this device
 	// struct is not needed to be kept in memory.
-	devicesPath := d.instance.DevicesPath()
+	devicesPath := d.inst.DevicesPath()
 	devConfig := d.config
 	deviceName := d.name
 	state := d.state
@@ -142,7 +142,7 @@ func (d *unixCommon) Register() error {
 
 	// Register the handler function against the device's source path.
 	subPath := unixDeviceSourcePath(devConfig)
-	err := unixRegisterHandler(d.state, d.instance, d.name, subPath, f)
+	err := unixRegisterHandler(d.state, d.inst, d.name, subPath, f)
 	if err != nil {
 		return err
 	}
@@ -164,7 +164,7 @@ func (d *unixCommon) Start() (*deviceConfig.RunConfig, error) {
 			return nil, fmt.Errorf("Path specified is not a %s device", d.config["type"])
 		}
 
-		err = unixDeviceSetup(d.state, d.instance.DevicesPath(), "unix", d.name, d.config, true, &runConf)
+		err = unixDeviceSetup(d.state, d.inst.DevicesPath(), "unix", d.name, d.config, true, &runConf)
 		if err != nil {
 			return nil, err
 		}
@@ -172,7 +172,7 @@ func (d *unixCommon) Start() (*deviceConfig.RunConfig, error) {
 		// If the device file doesn't exist on the system, but major & minor numbers have
 		// been provided in the config then we can go ahead and create the device anyway.
 		if d.config["major"] != "" && d.config["minor"] != "" {
-			err := unixDeviceSetup(d.state, d.instance.DevicesPath(), "unix", d.name, d.config, true, &runConf)
+			err := unixDeviceSetup(d.state, d.inst.DevicesPath(), "unix", d.name, d.config, true, &runConf)
 			if err != nil {
 				return nil, err
 			}
@@ -188,7 +188,7 @@ func (d *unixCommon) Start() (*deviceConfig.RunConfig, error) {
 // Stop is run when the device is removed from the instance.
 func (d *unixCommon) Stop() (*deviceConfig.RunConfig, error) {
 	// Unregister any Unix event handlers for this device.
-	err := unixUnregisterHandler(d.state, d.instance, d.name)
+	err := unixUnregisterHandler(d.state, d.inst, d.name)
 	if err != nil {
 		return nil, err
 	}
@@ -197,7 +197,7 @@ func (d *unixCommon) Stop() (*deviceConfig.RunConfig, error) {
 		PostHooks: []func() error{d.postStop},
 	}
 
-	err = unixDeviceRemove(d.instance.DevicesPath(), "unix", d.name, "", &runConf)
+	err = unixDeviceRemove(d.inst.DevicesPath(), "unix", d.name, "", &runConf)
 	if err != nil {
 		return nil, err
 	}
@@ -208,7 +208,7 @@ func (d *unixCommon) Stop() (*deviceConfig.RunConfig, error) {
 // postStop is run after the device is removed from the instance.
 func (d *unixCommon) postStop() error {
 	// Remove host files for this device.
-	err := unixDeviceDeleteFiles(d.state, d.instance.DevicesPath(), "unix", d.name, "")
+	err := unixDeviceDeleteFiles(d.state, d.inst.DevicesPath(), "unix", d.name, "")
 	if err != nil {
 		return fmt.Errorf("Failed to delete files for device '%s': %v", d.name, err)
 	}
diff --git a/lxd/device/usb.go b/lxd/device/usb.go
index c077d768b0..fd42b33f45 100644
--- a/lxd/device/usb.go
+++ b/lxd/device/usb.go
@@ -43,7 +43,7 @@ func (d *usb) isRequired() bool {
 
 // validateConfig checks the supplied config for correctness.
 func (d *usb) validateConfig() error {
-	if d.instance.Type() != instancetype.Container {
+	if d.inst.Type() != instancetype.Container {
 		return ErrUnsupportedDevType
 	}
 
@@ -68,7 +68,7 @@ func (d *usb) validateConfig() error {
 func (d *usb) Register() error {
 	// Extract variables needed to run the event hook so that the reference to this device
 	// struct is not needed to be kept in memory.
-	devicesPath := d.instance.DevicesPath()
+	devicesPath := d.inst.DevicesPath()
 	devConfig := d.config
 	deviceName := d.name
 	state := d.state
@@ -109,7 +109,7 @@ func (d *usb) Register() error {
 		return &runConf, nil
 	}
 
-	usbRegisterHandler(d.instance, d.name, f)
+	usbRegisterHandler(d.inst, d.name, f)
 
 	return nil
 }
@@ -129,7 +129,7 @@ func (d *usb) Start() (*deviceConfig.RunConfig, error) {
 			continue
 		}
 
-		err := unixDeviceSetupCharNum(d.state, d.instance.DevicesPath(), "unix", d.name, d.config, usb.Major, usb.Minor, usb.Path, false, &runConf)
+		err := unixDeviceSetupCharNum(d.state, d.inst.DevicesPath(), "unix", d.name, d.config, usb.Major, usb.Minor, usb.Path, false, &runConf)
 		if err != nil {
 			return nil, err
 		}
@@ -145,13 +145,13 @@ func (d *usb) Start() (*deviceConfig.RunConfig, error) {
 // Stop is run when the device is removed from the instance.
 func (d *usb) Stop() (*deviceConfig.RunConfig, error) {
 	// Unregister any USB event handlers for this device.
-	usbUnregisterHandler(d.instance, d.name)
+	usbUnregisterHandler(d.inst, d.name)
 
 	runConf := deviceConfig.RunConfig{
 		PostHooks: []func() error{d.postStop},
 	}
 
-	err := unixDeviceRemove(d.instance.DevicesPath(), "unix", d.name, "", &runConf)
+	err := unixDeviceRemove(d.inst.DevicesPath(), "unix", d.name, "", &runConf)
 	if err != nil {
 		return nil, err
 	}
@@ -162,7 +162,7 @@ func (d *usb) Stop() (*deviceConfig.RunConfig, error) {
 // postStop is run after the device is removed from the instance.
 func (d *usb) postStop() error {
 	// Remove host files for this device.
-	err := unixDeviceDeleteFiles(d.state, d.instance.DevicesPath(), "unix", d.name, "")
+	err := unixDeviceDeleteFiles(d.state, d.inst.DevicesPath(), "unix", d.name, "")
 	if err != nil {
 		return fmt.Errorf("Failed to delete files for device '%s': %v", d.name, err)
 	}


More information about the lxc-devel mailing list