[lxc-devel] [lxd/master] alphabetize device processing

tych0 on Github lxc-bot at linuxcontainers.org
Thu Aug 4 19:52:15 UTC 2016


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 513 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20160804/430b0014/attachment.bin>
-------------- next part --------------
From 7b39b9900e91ca88e84ef8d132bfeb671d8b9871 Mon Sep 17 00:00:00 2001
From: Tycho Andersen <tycho.andersen at canonical.com>
Date: Thu, 4 Aug 2016 10:58:08 -0600
Subject: [PATCH] alphabetize device processing

Unfortunately, there's not a way to range over a custom type, and there's
no way to sort a map, so we end up with this verbosity :(

Closes #2233

Signed-off-by: Tycho Andersen <tycho.andersen at canonical.com>
---
 lxd/container_lxc.go | 36 ++++++++++++++++++++++++------------
 lxd/devices.go       |  4 +++-
 lxd/networks.go      |  5 ++++-
 shared/devices.go    | 16 ++++++++++++++++
 4 files changed, 47 insertions(+), 14 deletions(-)

diff --git a/lxd/container_lxc.go b/lxd/container_lxc.go
index 3a9ca74..cb2f2ca 100644
--- a/lxd/container_lxc.go
+++ b/lxd/container_lxc.go
@@ -118,7 +118,8 @@ func containerLXCCreate(d *Daemon, args containerArgs) (container, error) {
 
 	// Look for a rootfs entry
 	rootfs := false
-	for _, m := range c.expandedDevices {
+	for _, name := range c.expandedDevices.DeviceNames() {
+		m := c.expandedDevices[name]
 		if m["type"] == "disk" && m["path"] == "/" {
 			rootfs = true
 			break
@@ -654,7 +655,8 @@ func (c *containerLXC) initLXC() error {
 		}
 
 		hasDiskLimits := false
-		for _, m := range c.expandedDevices {
+		for _, name := range c.expandedDevices.DeviceNames() {
+			m := c.expandedDevices[name]
 			if m["type"] != "disk" {
 				continue
 			}
@@ -720,7 +722,8 @@ func (c *containerLXC) initLXC() error {
 	}
 
 	// Setup devices
-	for k, m := range c.expandedDevices {
+	for _, k := range c.expandedDevices.DeviceNames() {
+		m := c.expandedDevices[k]
 		if shared.StringInSlice(m["type"], []string{"unix-char", "unix-block"}) {
 			// Prepare all the paths
 			srcPath := m["path"]
@@ -965,7 +968,8 @@ func (c *containerLXC) startCommon() (string, error) {
 	}
 
 	// Sanity checks for devices
-	for name, m := range c.expandedDevices {
+	for _, name := range c.expandedDevices.DeviceNames() {
+		m := c.expandedDevices[name]
 		switch m["type"] {
 		case "disk":
 			if m["source"] != "" && !shared.PathExists(m["source"]) {
@@ -1083,7 +1087,8 @@ func (c *containerLXC) startCommon() (string, error) {
 	var usbs []usbDevice
 
 	// Create the devices
-	for k, m := range c.expandedDevices {
+	for _, k := range c.expandedDevices.DeviceNames() {
+		m := c.expandedDevices[k]
 		if shared.StringInSlice(m["type"], []string{"unix-char", "unix-block"}) {
 			// Unix device
 			devPath, err := c.createUnixDevice(m)
@@ -1177,7 +1182,8 @@ func (c *containerLXC) startCommon() (string, error) {
 
 	// Cleanup any leftover volatile entries
 	netNames := []string{}
-	for k, v := range c.expandedDevices {
+	for _, k := range c.expandedDevices.DeviceNames() {
+		v := c.expandedDevices[k]
 		if v["type"] == "nic" {
 			netNames = append(netNames, k)
 		}
@@ -1404,7 +1410,8 @@ func (c *containerLXC) OnStart() error {
 	}
 
 	// Apply network limits
-	for name, m := range c.expandedDevices {
+	for _, name := range c.expandedDevices.DeviceNames() {
+		m := c.expandedDevices[name]
 		if m["type"] != "nic" {
 			continue
 		}
@@ -2259,7 +2266,8 @@ func (c *containerLXC) Update(args containerArgs, userRequested bool) error {
 		}
 
 		var newRootfs shared.Device
-		for _, m := range c.expandedDevices {
+		for _, name := range c.expandedDevices.DeviceNames() {
+			m := c.expandedDevices[name]
 			if m["type"] == "disk" && m["path"] == "/" {
 				newRootfs = m
 				break
@@ -3314,7 +3322,8 @@ func (c *containerLXC) Exec(command []string, env map[string]string, stdin *os.F
 func (c *containerLXC) diskState() map[string]shared.ContainerStateDisk {
 	disk := map[string]shared.ContainerStateDisk{}
 
-	for name, d := range c.expandedDevices {
+	for _, name := range c.expandedDevices.DeviceNames() {
+		d := c.expandedDevices[name]
 		if d["type"] != "disk" {
 			continue
 		}
@@ -3946,7 +3955,8 @@ func (c *containerLXC) fillNetworkDevice(name string, m shared.Device) (shared.D
 		devNames := []string{}
 
 		// Include all static interface names
-		for _, v := range c.expandedDevices {
+		for _, k := range c.expandedDevices.DeviceNames() {
+			v := c.expandedDevices[k]
 			if v["name"] != "" && !shared.StringInSlice(v["name"], devNames) {
 				devNames = append(devNames, v["name"])
 			}
@@ -4344,7 +4354,8 @@ func (c *containerLXC) getDiskLimits() (map[string]deviceBlockLimit, error) {
 
 	// Process all the limits
 	blockLimits := map[string][]deviceBlockLimit{}
-	for _, m := range c.expandedDevices {
+	for _, k := range c.expandedDevices.DeviceNames() {
+		m := c.expandedDevices[k]
 		if m["type"] != "disk" {
 			continue
 		}
@@ -4518,7 +4529,8 @@ func (c *containerLXC) getHostInterface(name string) string {
 		}
 	}
 
-	for k, dev := range c.expandedDevices {
+	for _, k := range c.expandedDevices.DeviceNames() {
+		dev := c.expandedDevices[k]
 		if dev["type"] != "nic" {
 			continue
 		}
diff --git a/lxd/devices.go b/lxd/devices.go
index 3932fc8..595c6aa 100644
--- a/lxd/devices.go
+++ b/lxd/devices.go
@@ -480,7 +480,9 @@ func deviceUSBEvent(d *Daemon, usb usbDevice) {
 			continue
 		}
 
-		for _, m := range c.ExpandedDevices() {
+		devices := c.ExpandedDevices()
+		for _, name := range devices.DeviceNames() {
+			m := devices[name]
 			if m["type"] != "usb" {
 				continue
 			}
diff --git a/lxd/networks.go b/lxd/networks.go
index f649b4e..bc209e4 100644
--- a/lxd/networks.go
+++ b/lxd/networks.go
@@ -54,7 +54,10 @@ type network struct {
 }
 
 func isOnBridge(c container, bridge string) bool {
-	for _, device := range c.ExpandedDevices() {
+	devices := c.ExpandedDevices()
+	for _, name := range devices.DeviceNames() {
+		device := devices[name]
+
 		if device["type"] != "nic" {
 			continue
 		}
diff --git a/shared/devices.go b/shared/devices.go
index 93eb294..fb2938e 100644
--- a/shared/devices.go
+++ b/shared/devices.go
@@ -1,5 +1,9 @@
 package shared
 
+import (
+	"sort"
+)
+
 type Device map[string]string
 type Devices map[string]Device
 
@@ -102,3 +106,15 @@ func (newBaseDevices Devices) ExtendFromProfile(currentFullDevices Devices, newD
 
 	return nil
 }
+
+/* DeviceNames returns the device names for this Devices in sorted order */
+func (devices Devices) DeviceNames() []string {
+	sorted := sort.StringSlice([]string{})
+	for k, _ := range devices {
+		sorted = append(sorted, k)
+	}
+
+	sort.Sort(sorted)
+
+	return sorted
+}


More information about the lxc-devel mailing list