The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/2263
This e-mail was sent by the LXC bot, direct replies will not reach the author unless they happen to be subscribed to this list. === Description (from pull-request) === 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 <[email protected]>
From 7b39b9900e91ca88e84ef8d132bfeb671d8b9871 Mon Sep 17 00:00:00 2001 From: Tycho Andersen <[email protected]> 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 <[email protected]> --- 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 +}
_______________________________________________ lxc-devel mailing list [email protected] http://lists.linuxcontainers.org/listinfo/lxc-devel
