The following pull request was submitted through Github.
It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/2786

This e-mail was sent by the LXC bot, direct replies will not reach the author
unless they happen to be subscribed to this list.

=== Description (from pull-request) ===

From 4546b78577b541b25b031e2e4a1a890ebdad898d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com>
Date: Wed, 11 Jan 2017 11:46:44 +0200
Subject: [PATCH 01/12] lxc: Export image last use date
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgra...@ubuntu.com>
---
 lxc/image.go | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/lxc/image.go b/lxc/image.go
index b81191d..b4ad827 100644
--- a/lxc/image.go
+++ b/lxc/image.go
@@ -356,6 +356,11 @@ func (c *imageCmd) run(config *lxd.Config, args []string) 
error {
                } else {
                        fmt.Printf("    " + i18n.G("Expires: never") + "\n")
                }
+               if info.LastUsedAt.UTC().Unix() != 0 {
+                       fmt.Printf("    "+i18n.G("Last used: %s")+"\n", 
info.LastUsedAt.UTC().Format(layout))
+               } else {
+                       fmt.Printf("    " + i18n.G("Last used: never") + "\n")
+               }
                fmt.Println(i18n.G("Properties:"))
                for key, value := range info.Properties {
                        fmt.Printf("    %s: %s\n", key, value)

From 2d1c4a4c4ad67ced574cac58f3a57a7a1b9294ad Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com>
Date: Wed, 11 Jan 2017 16:21:50 +0200
Subject: [PATCH 02/12] lxc: Better handle network modifications
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Closes #2785

Signed-off-by: Stéphane Graber <stgra...@ubuntu.com>
---
 lxc/network.go | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/lxc/network.go b/lxc/network.go
index 777615b..e4d68d2 100644
--- a/lxc/network.go
+++ b/lxc/network.go
@@ -318,6 +318,10 @@ func (c *networkCmd) doNetworkEdit(client *lxd.Client, 
name string) error {
                return err
        }
 
+       if !network.Managed {
+               return fmt.Errorf(i18n.G("Only managed networks can be 
modified."))
+       }
+
        data, err := yaml.Marshal(&network)
        if err != nil {
                return err
@@ -441,6 +445,10 @@ func (c *networkCmd) doNetworkSet(client *lxd.Client, name 
string, args []string
                return err
        }
 
+       if !network.Managed {
+               return fmt.Errorf(i18n.G("Only managed networks can be 
modified."))
+       }
+
        key := args[0]
        var value string
        if len(args) < 2 {
@@ -452,7 +460,7 @@ func (c *networkCmd) doNetworkSet(client *lxd.Client, name 
string, args []string
        if !termios.IsTerminal(int(syscall.Stdin)) && value == "-" {
                buf, err := ioutil.ReadAll(os.Stdin)
                if err != nil {
-                       return fmt.Errorf("Can't read from stdin: %s", err)
+                       return fmt.Errorf(i18n.G("Can't read from stdin: %s"), 
err)
                }
                value = string(buf[:])
        }

From 77152604eb7de5a76e90bc9b64d736792e8eec62 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com>
Date: Wed, 11 Jan 2017 16:24:55 +0200
Subject: [PATCH 03/12] "gofmt -s" run
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgra...@ubuntu.com>
---
 client.go                             |  4 +--
 config.go                             |  2 +-
 lxc/list.go                           | 24 ++++++-------
 lxc/main_test.go                      |  6 ++--
 lxc/manpage.go                        |  2 +-
 lxd/container.go                      |  2 +-
 lxd/container_lxc.go                  | 10 +++---
 lxd/daemon_config.go                  | 48 ++++++++++++-------------
 lxd/db_update.go                      | 68 +++++++++++++++++------------------
 lxd/devices.go                        |  2 +-
 lxd/devlxd.go                         |  6 ++--
 lxd/main_forkexec.go                  |  2 +-
 lxd/main_test.go                      |  4 +--
 lxd/networks.go                       | 28 +++++++--------
 lxd/networks_utils.go                 |  2 +-
 lxd/patches.go                        |  4 +--
 lxd/types/devices.go                  |  4 +--
 shared/idmapset_linux_test.go         |  8 ++---
 shared/osarch/architectures.go        | 30 ++++++++--------
 shared/simplestreams/simplestreams.go |  2 +-
 shared/stringset.go                   |  2 +-
 shared/util_linux.go                  |  2 +-
 22 files changed, 131 insertions(+), 131 deletions(-)

diff --git a/client.go b/client.go
index 6d4a867..36ab676 100644
--- a/client.go
+++ b/client.go
@@ -2505,7 +2505,7 @@ func (c *Client) ContainerDeviceDelete(container, devname 
string) (*api.Response
                return nil, err
        }
 
-       for n, _ := range st.Devices {
+       for n := range st.Devices {
                if n == devname {
                        delete(st.Devices, n)
                        return c.put(fmt.Sprintf("containers/%s", container), 
st, api.AsyncResponse)
@@ -2576,7 +2576,7 @@ func (c *Client) ProfileDeviceDelete(profile, devname 
string) (*api.Response, er
                return nil, err
        }
 
-       for n, _ := range st.Devices {
+       for n := range st.Devices {
                if n == devname {
                        delete(st.Devices, n)
                        return c.put(fmt.Sprintf("profiles/%s", profile), st, 
api.SyncResponse)
diff --git a/config.go b/config.go
index 8cd47bb..9492740 100644
--- a/config.go
+++ b/config.go
@@ -116,7 +116,7 @@ func LoadConfig(path string) (*Config, error) {
 
 // SaveConfig writes the provided configuration to the config file.
 func SaveConfig(c *Config, fname string) error {
-       for k, _ := range StaticRemotes {
+       for k := range StaticRemotes {
                delete(c.Remotes, k)
        }
 
diff --git a/lxc/list.go b/lxc/list.go
index 8311e90..c5e2f4e 100644
--- a/lxc/list.go
+++ b/lxc/list.go
@@ -134,7 +134,7 @@ func (c *listCmd) dotPrefixMatch(short string, full string) 
bool {
                return false
        }
 
-       for i, _ := range fullMembs {
+       for i := range fullMembs {
                if !strings.HasPrefix(fullMembs[i], shortMembs[i]) {
                        return false
                }
@@ -422,17 +422,17 @@ func (c *listCmd) run(config *lxd.Config, args []string) 
error {
 
 func (c *listCmd) parseColumns() ([]column, error) {
        columnsShorthandMap := map[rune]column{
-               '4': column{i18n.G("IPV4"), c.IP4ColumnData, true, false},
-               '6': column{i18n.G("IPV6"), c.IP6ColumnData, true, false},
-               'a': column{i18n.G("ARCHITECTURE"), c.ArchitectureColumnData, 
false, false},
-               'c': column{i18n.G("CREATED AT"), c.CreatedColumnData, false, 
false},
-               'l': column{i18n.G("LAST USED AT"), c.LastUsedColumnData, 
false, false},
-               'n': column{i18n.G("NAME"), c.nameColumnData, false, false},
-               'p': column{i18n.G("PID"), c.PIDColumnData, true, false},
-               'P': column{i18n.G("PROFILES"), c.ProfilesColumnData, false, 
false},
-               'S': column{i18n.G("SNAPSHOTS"), c.numberSnapshotsColumnData, 
false, true},
-               's': column{i18n.G("STATE"), c.statusColumnData, false, false},
-               't': column{i18n.G("TYPE"), c.typeColumnData, false, false},
+               '4': {i18n.G("IPV4"), c.IP4ColumnData, true, false},
+               '6': {i18n.G("IPV6"), c.IP6ColumnData, true, false},
+               'a': {i18n.G("ARCHITECTURE"), c.ArchitectureColumnData, false, 
false},
+               'c': {i18n.G("CREATED AT"), c.CreatedColumnData, false, false},
+               'l': {i18n.G("LAST USED AT"), c.LastUsedColumnData, false, 
false},
+               'n': {i18n.G("NAME"), c.nameColumnData, false, false},
+               'p': {i18n.G("PID"), c.PIDColumnData, true, false},
+               'P': {i18n.G("PROFILES"), c.ProfilesColumnData, false, false},
+               'S': {i18n.G("SNAPSHOTS"), c.numberSnapshotsColumnData, false, 
true},
+               's': {i18n.G("STATE"), c.statusColumnData, false, false},
+               't': {i18n.G("TYPE"), c.typeColumnData, false, false},
        }
 
        if c.fast {
diff --git a/lxc/main_test.go b/lxc/main_test.go
index 5545894..30fc0cb 100644
--- a/lxc/main_test.go
+++ b/lxc/main_test.go
@@ -40,15 +40,15 @@ func TestExpandAliases(t *testing.T) {
        }
 
        testcases := []aliasTestcase{
-               aliasTestcase{
+               {
                        input:    []string{"lxc", "list"},
                        expected: []string{"lxc", "list"},
                },
-               aliasTestcase{
+               {
                        input:    []string{"lxc", "tester", "12"},
                        expected: []string{"lxc", "list", "--no-alias"},
                },
-               aliasTestcase{
+               {
                        input:    []string{"lxc", "foo", "asdf"},
                        expected: []string{"lxc", "list", "--no-alias", "asdf", 
"-c", "n"},
                },
diff --git a/lxc/manpage.go b/lxc/manpage.go
index 101dc2c..084ae0a 100644
--- a/lxc/manpage.go
+++ b/lxc/manpage.go
@@ -28,7 +28,7 @@ func (c *manpageCmd) run(_ *lxd.Config, args []string) error {
        }
 
        keys := []string{}
-       for k, _ := range commands {
+       for k := range commands {
                keys = append(keys, k)
        }
        sort.Strings(keys)
diff --git a/lxd/container.go b/lxd/container.go
index 1a7556a..2721f47 100644
--- a/lxd/container.go
+++ b/lxd/container.go
@@ -233,7 +233,7 @@ func containerValidDevices(devices types.Devices, profile 
bool, expanded bool) e
                        return fmt.Errorf("Invalid device type for device 
'%s'", name)
                }
 
-               for k, _ := range m {
+               for k := range m {
                        if !containerValidDeviceConfigKey(m["type"], k) {
                                return fmt.Errorf("Invalid device configuration 
key for %s: %s", m["type"], k)
                        }
diff --git a/lxd/container_lxc.go b/lxd/container_lxc.go
index fb9f1c8..d6e9b3c 100644
--- a/lxd/container_lxc.go
+++ b/lxd/container_lxc.go
@@ -640,8 +640,8 @@ func findIdmap(daemon *Daemon, cName string, isolatedStr 
string, configSize stri
 
        mkIdmap := func(offset int, size int) *shared.IdmapSet {
                set := &shared.IdmapSet{Idmap: []shared.IdmapEntry{
-                       shared.IdmapEntry{Isuid: true, Nsid: 0, Hostid: offset, 
Maprange: size},
-                       shared.IdmapEntry{Isgid: true, Nsid: 0, Hostid: offset, 
Maprange: size},
+                       {Isuid: true, Nsid: 0, Hostid: offset, Maprange: size},
+                       {Isgid: true, Nsid: 0, Hostid: offset, Maprange: size},
                }}
 
                for _, ent := range rawMaps {
@@ -1757,7 +1757,7 @@ func (c *containerLXC) startCommon() (string, error) {
                }
        }
 
-       for k, _ := range c.localConfig {
+       for k := range c.localConfig {
                // We only care about volatile
                if !strings.HasPrefix(k, "volatile.") {
                        continue
@@ -3014,7 +3014,7 @@ func (c *containerLXC) Update(args containerArgs, 
userRequested bool) error {
 
        // Diff the configurations
        changedConfig := []string{}
-       for key, _ := range oldExpandedConfig {
+       for key := range oldExpandedConfig {
                if oldExpandedConfig[key] != c.expandedConfig[key] {
                        if !shared.StringInSlice(key, changedConfig) {
                                changedConfig = append(changedConfig, key)
@@ -3022,7 +3022,7 @@ func (c *containerLXC) Update(args containerArgs, 
userRequested bool) error {
                }
        }
 
-       for key, _ := range c.expandedConfig {
+       for key := range c.expandedConfig {
                if oldExpandedConfig[key] != c.expandedConfig[key] {
                        if !shared.StringInSlice(key, changedConfig) {
                                changedConfig = append(changedConfig, key)
diff --git a/lxd/daemon_config.go b/lxd/daemon_config.go
index 3a1ec33..1e5e791 100644
--- a/lxd/daemon_config.go
+++ b/lxd/daemon_config.go
@@ -173,29 +173,29 @@ func (k *daemonConfigKey) GetInt64() int64 {
 func daemonConfigInit(db *sql.DB) error {
        // Set all the keys
        daemonConfig = map[string]*daemonConfigKey{
-               "core.https_address":             &daemonConfigKey{valueType: 
"string", setter: daemonConfigSetAddress},
-               "core.https_allowed_headers":     &daemonConfigKey{valueType: 
"string"},
-               "core.https_allowed_methods":     &daemonConfigKey{valueType: 
"string"},
-               "core.https_allowed_origin":      &daemonConfigKey{valueType: 
"string"},
-               "core.https_allowed_credentials": &daemonConfigKey{valueType: 
"bool"},
-               "core.proxy_http":                &daemonConfigKey{valueType: 
"string", setter: daemonConfigSetProxy},
-               "core.proxy_https":               &daemonConfigKey{valueType: 
"string", setter: daemonConfigSetProxy},
-               "core.proxy_ignore_hosts":        &daemonConfigKey{valueType: 
"string", setter: daemonConfigSetProxy},
-               "core.trust_password":            &daemonConfigKey{valueType: 
"string", hiddenValue: true, setter: daemonConfigSetPassword},
-
-               "images.auto_update_cached":    &daemonConfigKey{valueType: 
"bool", defaultValue: "true"},
-               "images.auto_update_interval":  &daemonConfigKey{valueType: 
"int", defaultValue: "6"},
-               "images.compression_algorithm": &daemonConfigKey{valueType: 
"string", validator: daemonConfigValidateCompression, defaultValue: "gzip"},
-               "images.remote_cache_expiry":   &daemonConfigKey{valueType: 
"int", defaultValue: "10", trigger: daemonConfigTriggerExpiry},
-
-               "storage.lvm_fstype":           &daemonConfigKey{valueType: 
"string", defaultValue: "ext4", validValues: []string{"ext4", "xfs"}},
-               "storage.lvm_mount_options":    &daemonConfigKey{valueType: 
"string", defaultValue: "discard"},
-               "storage.lvm_thinpool_name":    &daemonConfigKey{valueType: 
"string", defaultValue: "LXDPool", validator: storageLVMValidateThinPoolName},
-               "storage.lvm_vg_name":          &daemonConfigKey{valueType: 
"string", validator: storageLVMValidateVolumeGroupName, setter: 
daemonConfigSetStorage},
-               "storage.lvm_volume_size":      &daemonConfigKey{valueType: 
"string", defaultValue: "10GiB"},
-               "storage.zfs_pool_name":        &daemonConfigKey{valueType: 
"string", validator: storageZFSValidatePoolName, setter: 
daemonConfigSetStorage},
-               "storage.zfs_remove_snapshots": &daemonConfigKey{valueType: 
"bool"},
-               "storage.zfs_use_refquota":     &daemonConfigKey{valueType: 
"bool"},
+               "core.https_address":             {valueType: "string", setter: 
daemonConfigSetAddress},
+               "core.https_allowed_headers":     {valueType: "string"},
+               "core.https_allowed_methods":     {valueType: "string"},
+               "core.https_allowed_origin":      {valueType: "string"},
+               "core.https_allowed_credentials": {valueType: "bool"},
+               "core.proxy_http":                {valueType: "string", setter: 
daemonConfigSetProxy},
+               "core.proxy_https":               {valueType: "string", setter: 
daemonConfigSetProxy},
+               "core.proxy_ignore_hosts":        {valueType: "string", setter: 
daemonConfigSetProxy},
+               "core.trust_password":            {valueType: "string", 
hiddenValue: true, setter: daemonConfigSetPassword},
+
+               "images.auto_update_cached":    {valueType: "bool", 
defaultValue: "true"},
+               "images.auto_update_interval":  {valueType: "int", 
defaultValue: "6"},
+               "images.compression_algorithm": {valueType: "string", 
validator: daemonConfigValidateCompression, defaultValue: "gzip"},
+               "images.remote_cache_expiry":   {valueType: "int", 
defaultValue: "10", trigger: daemonConfigTriggerExpiry},
+
+               "storage.lvm_fstype":           {valueType: "string", 
defaultValue: "ext4", validValues: []string{"ext4", "xfs"}},
+               "storage.lvm_mount_options":    {valueType: "string", 
defaultValue: "discard"},
+               "storage.lvm_thinpool_name":    {valueType: "string", 
defaultValue: "LXDPool", validator: storageLVMValidateThinPoolName},
+               "storage.lvm_vg_name":          {valueType: "string", 
validator: storageLVMValidateVolumeGroupName, setter: daemonConfigSetStorage},
+               "storage.lvm_volume_size":      {valueType: "string", 
defaultValue: "10GiB"},
+               "storage.zfs_pool_name":        {valueType: "string", 
validator: storageZFSValidatePoolName, setter: daemonConfigSetStorage},
+               "storage.zfs_remove_snapshots": {valueType: "bool"},
+               "storage.zfs_use_refquota":     {valueType: "bool"},
        }
 
        // Load the values from the DB
@@ -311,7 +311,7 @@ func daemonConfigSetProxy(d *Daemon, key string, value 
string) (string, error) {
 
        // Clear the simplestreams cache as it's tied to the old proxy config
        imageStreamCacheLock.Lock()
-       for k, _ := range imageStreamCache {
+       for k := range imageStreamCache {
                delete(imageStreamCache, k)
        }
        imageStreamCacheLock.Unlock()
diff --git a/lxd/db_update.go b/lxd/db_update.go
index 35f7032..a22d35c 100644
--- a/lxd/db_update.go
+++ b/lxd/db_update.go
@@ -34,40 +34,40 @@ import (
 */
 
 var dbUpdates = []dbUpdate{
-       dbUpdate{version: 1, run: dbUpdateFromV0},
-       dbUpdate{version: 2, run: dbUpdateFromV1},
-       dbUpdate{version: 3, run: dbUpdateFromV2},
-       dbUpdate{version: 4, run: dbUpdateFromV3},
-       dbUpdate{version: 5, run: dbUpdateFromV4},
-       dbUpdate{version: 6, run: dbUpdateFromV5},
-       dbUpdate{version: 7, run: dbUpdateFromV6},
-       dbUpdate{version: 8, run: dbUpdateFromV7},
-       dbUpdate{version: 9, run: dbUpdateFromV8},
-       dbUpdate{version: 10, run: dbUpdateFromV9},
-       dbUpdate{version: 11, run: dbUpdateFromV10},
-       dbUpdate{version: 12, run: dbUpdateFromV11},
-       dbUpdate{version: 13, run: dbUpdateFromV12},
-       dbUpdate{version: 14, run: dbUpdateFromV13},
-       dbUpdate{version: 15, run: dbUpdateFromV14},
-       dbUpdate{version: 16, run: dbUpdateFromV15},
-       dbUpdate{version: 17, run: dbUpdateFromV16},
-       dbUpdate{version: 18, run: dbUpdateFromV17},
-       dbUpdate{version: 19, run: dbUpdateFromV18},
-       dbUpdate{version: 20, run: dbUpdateFromV19},
-       dbUpdate{version: 21, run: dbUpdateFromV20},
-       dbUpdate{version: 22, run: dbUpdateFromV21},
-       dbUpdate{version: 23, run: dbUpdateFromV22},
-       dbUpdate{version: 24, run: dbUpdateFromV23},
-       dbUpdate{version: 25, run: dbUpdateFromV24},
-       dbUpdate{version: 26, run: dbUpdateFromV25},
-       dbUpdate{version: 27, run: dbUpdateFromV26},
-       dbUpdate{version: 28, run: dbUpdateFromV27},
-       dbUpdate{version: 29, run: dbUpdateFromV28},
-       dbUpdate{version: 30, run: dbUpdateFromV29},
-       dbUpdate{version: 31, run: dbUpdateFromV30},
-       dbUpdate{version: 32, run: dbUpdateFromV31},
-       dbUpdate{version: 33, run: dbUpdateFromV32},
-       dbUpdate{version: 34, run: dbUpdateFromV33},
+       {version: 1, run: dbUpdateFromV0},
+       {version: 2, run: dbUpdateFromV1},
+       {version: 3, run: dbUpdateFromV2},
+       {version: 4, run: dbUpdateFromV3},
+       {version: 5, run: dbUpdateFromV4},
+       {version: 6, run: dbUpdateFromV5},
+       {version: 7, run: dbUpdateFromV6},
+       {version: 8, run: dbUpdateFromV7},
+       {version: 9, run: dbUpdateFromV8},
+       {version: 10, run: dbUpdateFromV9},
+       {version: 11, run: dbUpdateFromV10},
+       {version: 12, run: dbUpdateFromV11},
+       {version: 13, run: dbUpdateFromV12},
+       {version: 14, run: dbUpdateFromV13},
+       {version: 15, run: dbUpdateFromV14},
+       {version: 16, run: dbUpdateFromV15},
+       {version: 17, run: dbUpdateFromV16},
+       {version: 18, run: dbUpdateFromV17},
+       {version: 19, run: dbUpdateFromV18},
+       {version: 20, run: dbUpdateFromV19},
+       {version: 21, run: dbUpdateFromV20},
+       {version: 22, run: dbUpdateFromV21},
+       {version: 23, run: dbUpdateFromV22},
+       {version: 24, run: dbUpdateFromV23},
+       {version: 25, run: dbUpdateFromV24},
+       {version: 26, run: dbUpdateFromV25},
+       {version: 27, run: dbUpdateFromV26},
+       {version: 28, run: dbUpdateFromV27},
+       {version: 29, run: dbUpdateFromV28},
+       {version: 30, run: dbUpdateFromV29},
+       {version: 31, run: dbUpdateFromV30},
+       {version: 32, run: dbUpdateFromV31},
+       {version: 33, run: dbUpdateFromV32},
+       {version: 34, run: dbUpdateFromV33},
 }
 
 type dbUpdate struct {
diff --git a/lxd/devices.go b/lxd/devices.go
index 62b0a82..9e0e413 100644
--- a/lxd/devices.go
+++ b/lxd/devices.go
@@ -1210,7 +1210,7 @@ func loadRawValues(p string) (map[string]string, error) {
                "devnum":    "",
        }
 
-       for k, _ := range values {
+       for k := range values {
                v, err := ioutil.ReadFile(path.Join(p, k))
                if err != nil {
                        return nil, err
diff --git a/lxd/devlxd.go b/lxd/devlxd.go
index bf4edc8..7e27a16 100644
--- a/lxd/devlxd.go
+++ b/lxd/devlxd.go
@@ -43,7 +43,7 @@ type devLxdHandler struct {
 
 var configGet = devLxdHandler{"/1.0/config", func(c container, r 
*http.Request) *devLxdResponse {
        filtered := []string{}
-       for k, _ := range c.ExpandedConfig() {
+       for k := range c.ExpandedConfig() {
                if strings.HasPrefix(k, "user.") {
                        filtered = append(filtered, 
fmt.Sprintf("/1.0/config/%s", k))
                }
@@ -71,10 +71,10 @@ var metadataGet = devLxdHandler{"/1.0/meta-data", func(c 
container, r *http.Requ
 }}
 
 var handlers = []devLxdHandler{
-       devLxdHandler{"/", func(c container, r *http.Request) *devLxdResponse {
+       {"/", func(c container, r *http.Request) *devLxdResponse {
                return okResponse([]string{"/1.0"}, "json")
        }},
-       devLxdHandler{"/1.0", func(c container, r *http.Request) 
*devLxdResponse {
+       {"/1.0", func(c container, r *http.Request) *devLxdResponse {
                return okResponse(shared.Jmap{"api_version": 
version.APIVersion}, "json")
        }},
        configGet,
diff --git a/lxd/main_forkexec.go b/lxd/main_forkexec.go
index 8ebb0a6..b9c6cbb 100644
--- a/lxd/main_forkexec.go
+++ b/lxd/main_forkexec.go
@@ -63,7 +63,7 @@ func cmdForkExec(args []string) (int, error) {
        cmd := []string{}
 
        section := ""
-       for _, arg := range args[5:len(args)] {
+       for _, arg := range args[5:] {
                // The "cmd" section must come last as it may contain a --
                if arg == "--" && section != "cmd" {
                        section = ""
diff --git a/lxd/main_test.go b/lxd/main_test.go
index 262c541..f5f4518 100644
--- a/lxd/main_test.go
+++ b/lxd/main_test.go
@@ -24,8 +24,8 @@ func mockStartDaemon() (*Daemon, error) {
        }
 
        d.IdmapSet = &shared.IdmapSet{Idmap: []shared.IdmapEntry{
-               shared.IdmapEntry{Isuid: true, Hostid: 100000, Nsid: 0, 
Maprange: 500000},
-               shared.IdmapEntry{Isgid: true, Hostid: 100000, Nsid: 0, 
Maprange: 500000},
+               {Isuid: true, Hostid: 100000, Nsid: 0, Maprange: 500000},
+               {Isgid: true, Hostid: 100000, Nsid: 0, Maprange: 500000},
        }}
 
        // Call this after Init so we have a log object.
diff --git a/lxd/networks.go b/lxd/networks.go
index 8ad97ec..867844a 100644
--- a/lxd/networks.go
+++ b/lxd/networks.go
@@ -666,12 +666,12 @@ func (n *network) Start() error {
        if n.config["bridge.mode"] == "fan" || 
!shared.StringInSlice(n.config["ipv4.address"], []string{"", "none"}) {
                // Setup basic iptables overrides
                rules := [][]string{
-                       []string{"ipv4", n.name, "", "INPUT", "-i", n.name, 
"-p", "udp", "--dport", "67", "-j", "ACCEPT"},
-                       []string{"ipv4", n.name, "", "INPUT", "-i", n.name, 
"-p", "udp", "--dport", "53", "-j", "ACCEPT"},
-                       []string{"ipv4", n.name, "", "INPUT", "-i", n.name, 
"-p", "tcp", "--dport", "53", "-j", "ACCEPT"},
-                       []string{"ipv4", n.name, "", "OUTPUT", "-o", n.name, 
"-p", "udp", "--sport", "67", "-j", "ACCEPT"},
-                       []string{"ipv4", n.name, "", "OUTPUT", "-o", n.name, 
"-p", "udp", "--sport", "53", "-j", "ACCEPT"},
-                       []string{"ipv4", n.name, "", "OUTPUT", "-o", n.name, 
"-p", "tcp", "--sport", "53", "-j", "ACCEPT"}}
+                       {"ipv4", n.name, "", "INPUT", "-i", n.name, "-p", 
"udp", "--dport", "67", "-j", "ACCEPT"},
+                       {"ipv4", n.name, "", "INPUT", "-i", n.name, "-p", 
"udp", "--dport", "53", "-j", "ACCEPT"},
+                       {"ipv4", n.name, "", "INPUT", "-i", n.name, "-p", 
"tcp", "--dport", "53", "-j", "ACCEPT"},
+                       {"ipv4", n.name, "", "OUTPUT", "-o", n.name, "-p", 
"udp", "--sport", "67", "-j", "ACCEPT"},
+                       {"ipv4", n.name, "", "OUTPUT", "-o", n.name, "-p", 
"udp", "--sport", "53", "-j", "ACCEPT"},
+                       {"ipv4", n.name, "", "OUTPUT", "-o", n.name, "-p", 
"tcp", "--sport", "53", "-j", "ACCEPT"}}
 
                for _, rule := range rules {
                        err = networkIptablesPrepend(rule[0], rule[1], rule[2], 
rule[3], rule[4:]...)
@@ -837,12 +837,12 @@ func (n *network) Start() error {
 
                // Setup basic iptables overrides
                rules := [][]string{
-                       []string{"ipv6", n.name, "", "INPUT", "-i", n.name, 
"-p", "udp", "--dport", "546", "-j", "ACCEPT"},
-                       []string{"ipv6", n.name, "", "INPUT", "-i", n.name, 
"-p", "udp", "--dport", "53", "-j", "ACCEPT"},
-                       []string{"ipv6", n.name, "", "INPUT", "-i", n.name, 
"-p", "tcp", "--dport", "53", "-j", "ACCEPT"},
-                       []string{"ipv6", n.name, "", "OUTPUT", "-o", n.name, 
"-p", "udp", "--sport", "546", "-j", "ACCEPT"},
-                       []string{"ipv6", n.name, "", "OUTPUT", "-o", n.name, 
"-p", "udp", "--sport", "53", "-j", "ACCEPT"},
-                       []string{"ipv6", n.name, "", "OUTPUT", "-o", n.name, 
"-p", "tcp", "--sport", "53", "-j", "ACCEPT"}}
+                       {"ipv6", n.name, "", "INPUT", "-i", n.name, "-p", 
"udp", "--dport", "546", "-j", "ACCEPT"},
+                       {"ipv6", n.name, "", "INPUT", "-i", n.name, "-p", 
"udp", "--dport", "53", "-j", "ACCEPT"},
+                       {"ipv6", n.name, "", "INPUT", "-i", n.name, "-p", 
"tcp", "--dport", "53", "-j", "ACCEPT"},
+                       {"ipv6", n.name, "", "OUTPUT", "-o", n.name, "-p", 
"udp", "--sport", "546", "-j", "ACCEPT"},
+                       {"ipv6", n.name, "", "OUTPUT", "-o", n.name, "-p", 
"udp", "--sport", "53", "-j", "ACCEPT"},
+                       {"ipv6", n.name, "", "OUTPUT", "-o", n.name, "-p", 
"tcp", "--sport", "53", "-j", "ACCEPT"}}
 
                for _, rule := range rules {
                        err = networkIptablesPrepend(rule[0], rule[1], rule[2], 
rule[3], rule[4:]...)
@@ -1263,7 +1263,7 @@ func (n *network) Update(newNetwork api.NetworkPut) error 
{
        // Diff the configurations
        changedConfig := []string{}
        userOnly := true
-       for key, _ := range oldConfig {
+       for key := range oldConfig {
                if oldConfig[key] != newConfig[key] {
                        if !strings.HasPrefix(key, "user.") {
                                userOnly = false
@@ -1275,7 +1275,7 @@ func (n *network) Update(newNetwork api.NetworkPut) error 
{
                }
        }
 
-       for key, _ := range newConfig {
+       for key := range newConfig {
                if oldConfig[key] != newConfig[key] {
                        if !strings.HasPrefix(key, "user.") {
                                userOnly = false
diff --git a/lxd/networks_utils.go b/lxd/networks_utils.go
index b5f2199..f632121 100644
--- a/lxd/networks_utils.go
+++ b/lxd/networks_utils.go
@@ -151,7 +151,7 @@ func networkGetIP(subnet *net.IPNet, host int64) net.IP {
 func networkGetTunnels(config map[string]string) []string {
        tunnels := []string{}
 
-       for k, _ := range config {
+       for k := range config {
                if !strings.HasPrefix(k, "tunnel.") {
                        continue
                }
diff --git a/lxd/patches.go b/lxd/patches.go
index 3d303dd..ae1e258 100644
--- a/lxd/patches.go
+++ b/lxd/patches.go
@@ -26,8 +26,8 @@ import (
 */
 
 var patches = []patch{
-       patch{name: "invalid_profile_names", run: patchInvalidProfileNames},
-       patch{name: "leftover_profile_config", run: patchLeftoverProfileConfig},
+       {name: "invalid_profile_names", run: patchInvalidProfileNames},
+       {name: "leftover_profile_config", run: patchLeftoverProfileConfig},
 }
 
 type patch struct {
diff --git a/lxd/types/devices.go b/lxd/types/devices.go
index 04cd766..263f4c4 100644
--- a/lxd/types/devices.go
+++ b/lxd/types/devices.go
@@ -33,13 +33,13 @@ func (list Devices) Contains(k string, d Device) bool {
 
 func deviceEquals(old Device, d Device) bool {
        // Check for any difference and addition/removal of properties
-       for k, _ := range d {
+       for k := range d {
                if d[k] != old[k] {
                        return false
                }
        }
 
-       for k, _ := range old {
+       for k := range old {
                if d[k] != old[k] {
                        return false
                }
diff --git a/shared/idmapset_linux_test.go b/shared/idmapset_linux_test.go
index 588b847..d8582c8 100644
--- a/shared/idmapset_linux_test.go
+++ b/shared/idmapset_linux_test.go
@@ -6,7 +6,7 @@ import (
 )
 
 func TestIdmapSetAddSafe_split(t *testing.T) {
-       orig := IdmapSet{Idmap: []IdmapEntry{IdmapEntry{Isuid: true, Hostid: 
1000, Nsid: 0, Maprange: 1000}}}
+       orig := IdmapSet{Idmap: []IdmapEntry{{Isuid: true, Hostid: 1000, Nsid: 
0, Maprange: 1000}}}
 
        if err := orig.AddSafe(IdmapEntry{Isuid: true, Hostid: 500, Nsid: 500, 
Maprange: 10}); err != nil {
                t.Error(err)
@@ -35,7 +35,7 @@ func TestIdmapSetAddSafe_split(t *testing.T) {
 }
 
 func TestIdmapSetAddSafe_lower(t *testing.T) {
-       orig := IdmapSet{Idmap: []IdmapEntry{IdmapEntry{Isuid: true, Hostid: 
1000, Nsid: 0, Maprange: 1000}}}
+       orig := IdmapSet{Idmap: []IdmapEntry{{Isuid: true, Hostid: 1000, Nsid: 
0, Maprange: 1000}}}
 
        if err := orig.AddSafe(IdmapEntry{Isuid: true, Hostid: 500, Nsid: 0, 
Maprange: 10}); err != nil {
                t.Error(err)
@@ -59,7 +59,7 @@ func TestIdmapSetAddSafe_lower(t *testing.T) {
 }
 
 func TestIdmapSetAddSafe_upper(t *testing.T) {
-       orig := IdmapSet{Idmap: []IdmapEntry{IdmapEntry{Isuid: true, Hostid: 
1000, Nsid: 0, Maprange: 1000}}}
+       orig := IdmapSet{Idmap: []IdmapEntry{{Isuid: true, Hostid: 1000, Nsid: 
0, Maprange: 1000}}}
 
        if err := orig.AddSafe(IdmapEntry{Isuid: true, Hostid: 500, Nsid: 995, 
Maprange: 10}); err != nil {
                t.Error(err)
@@ -83,7 +83,7 @@ func TestIdmapSetAddSafe_upper(t *testing.T) {
 }
 
 func TestIdmapSetIntersects(t *testing.T) {
-       orig := IdmapSet{Idmap: []IdmapEntry{IdmapEntry{Isuid: true, Hostid: 
165536, Nsid: 0, Maprange: 65536}}}
+       orig := IdmapSet{Idmap: []IdmapEntry{{Isuid: true, Hostid: 165536, 
Nsid: 0, Maprange: 65536}}}
 
        if !orig.Intersects(IdmapEntry{Isuid: true, Hostid: 231071, Nsid: 0, 
Maprange: 65536}) {
                t.Error("ranges don't intersect")
diff --git a/shared/osarch/architectures.go b/shared/osarch/architectures.go
index 728098c..265d7cb 100644
--- a/shared/osarch/architectures.go
+++ b/shared/osarch/architectures.go
@@ -28,13 +28,13 @@ var architectureNames = map[int]string{
 }
 
 var architectureAliases = map[int][]string{
-       ARCH_32BIT_INTEL_X86:             []string{"i386"},
-       ARCH_64BIT_INTEL_X86:             []string{"amd64"},
-       ARCH_32BIT_ARMV7_LITTLE_ENDIAN:   []string{"armel", "armhf"},
-       ARCH_64BIT_ARMV8_LITTLE_ENDIAN:   []string{"arm64"},
-       ARCH_32BIT_POWERPC_BIG_ENDIAN:    []string{"powerpc"},
-       ARCH_64BIT_POWERPC_BIG_ENDIAN:    []string{"powerpc64"},
-       ARCH_64BIT_POWERPC_LITTLE_ENDIAN: []string{"ppc64el"},
+       ARCH_32BIT_INTEL_X86:             {"i386"},
+       ARCH_64BIT_INTEL_X86:             {"amd64"},
+       ARCH_32BIT_ARMV7_LITTLE_ENDIAN:   {"armel", "armhf"},
+       ARCH_64BIT_ARMV8_LITTLE_ENDIAN:   {"arm64"},
+       ARCH_32BIT_POWERPC_BIG_ENDIAN:    {"powerpc"},
+       ARCH_64BIT_POWERPC_BIG_ENDIAN:    {"powerpc64"},
+       ARCH_64BIT_POWERPC_LITTLE_ENDIAN: {"ppc64el"},
 }
 
 var architecturePersonalities = map[int]string{
@@ -49,14 +49,14 @@ var architecturePersonalities = map[int]string{
 }
 
 var architectureSupportedPersonalities = map[int][]int{
-       ARCH_32BIT_INTEL_X86:             []int{},
-       ARCH_64BIT_INTEL_X86:             []int{ARCH_32BIT_INTEL_X86},
-       ARCH_32BIT_ARMV7_LITTLE_ENDIAN:   []int{},
-       ARCH_64BIT_ARMV8_LITTLE_ENDIAN:   []int{ARCH_32BIT_ARMV7_LITTLE_ENDIAN},
-       ARCH_32BIT_POWERPC_BIG_ENDIAN:    []int{},
-       ARCH_64BIT_POWERPC_BIG_ENDIAN:    []int{ARCH_32BIT_POWERPC_BIG_ENDIAN},
-       ARCH_64BIT_POWERPC_LITTLE_ENDIAN: []int{},
-       ARCH_64BIT_S390_BIG_ENDIAN:       []int{},
+       ARCH_32BIT_INTEL_X86:             {},
+       ARCH_64BIT_INTEL_X86:             {ARCH_32BIT_INTEL_X86},
+       ARCH_32BIT_ARMV7_LITTLE_ENDIAN:   {},
+       ARCH_64BIT_ARMV8_LITTLE_ENDIAN:   {ARCH_32BIT_ARMV7_LITTLE_ENDIAN},
+       ARCH_32BIT_POWERPC_BIG_ENDIAN:    {},
+       ARCH_64BIT_POWERPC_BIG_ENDIAN:    {ARCH_32BIT_POWERPC_BIG_ENDIAN},
+       ARCH_64BIT_POWERPC_LITTLE_ENDIAN: {},
+       ARCH_64BIT_S390_BIG_ENDIAN:       {},
 }
 
 const ArchitectureDefault = "x86_64"
diff --git a/shared/simplestreams/simplestreams.go 
b/shared/simplestreams/simplestreams.go
index dd5d206..d71fcd3 100644
--- a/shared/simplestreams/simplestreams.go
+++ b/shared/simplestreams/simplestreams.go
@@ -212,7 +212,7 @@ func (s *SimpleStreamsManifest) ToLXD() ([]api.Image, 
map[string][][]string) {
                                }
                        }
 
-                       downloads[fingerprint] = [][]string{[]string{metaPath, 
metaHash, "meta"}, []string{rootfsPath, rootfsHash, "root"}}
+                       downloads[fingerprint] = [][]string{{metaPath, 
metaHash, "meta"}, {rootfsPath, rootfsHash, "root"}}
                        images = append(images, image)
                }
        }
diff --git a/shared/stringset.go b/shared/stringset.go
index 1094e61..a851d7a 100644
--- a/shared/stringset.go
+++ b/shared/stringset.go
@@ -5,7 +5,7 @@ package shared
 type StringSet map[string]bool
 
 func (ss StringSet) IsSubset(oss StringSet) bool {
-       for k, _ := range map[string]bool(ss) {
+       for k := range map[string]bool(ss) {
                if _, ok := map[string]bool(oss)[k]; !ok {
                        return false
                }
diff --git a/shared/util_linux.go b/shared/util_linux.go
index 8ef5b82..3adfc78 100644
--- a/shared/util_linux.go
+++ b/shared/util_linux.go
@@ -413,7 +413,7 @@ func ReadLastNLines(f *os.File, lines int) (string, error) {
                }
 
                if lines < 0 {
-                       return string(data[i+1 : len(data)]), nil
+                       return string(data[i+1:]), nil
                }
        }
 

From 0c23c13c264fc509d86120c908ced43e8fb0a3c7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com>
Date: Wed, 11 Jan 2017 16:27:27 +0200
Subject: [PATCH 04/12] Fix typos
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgra...@ubuntu.com>
---
 lxd/container_lxc.go   | 2 +-
 lxd/containers_post.go | 2 +-
 lxd/devlxd.go          | 4 ++--
 lxd/images.go          | 2 +-
 lxd/networks.go        | 2 +-
 shared/util.go         | 2 +-
 shared/util_linux.go   | 2 +-
 7 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/lxd/container_lxc.go b/lxd/container_lxc.go
index d6e9b3c..de2fe14 100644
--- a/lxd/container_lxc.go
+++ b/lxd/container_lxc.go
@@ -2804,7 +2804,7 @@ func writeBackupFile(c container) error {
                return os.ErrNotExist
        }
 
-       /* deal with the container occasionaly not being monuted */
+       /* deal with the container occasionally not being monuted */
        if !shared.PathExists(c.RootfsPath()) {
                shared.LogWarn("Unable to update backup.yaml at this time.", 
log.Ctx{"name": c.Name()})
                return nil
diff --git a/lxd/containers_post.go b/lxd/containers_post.go
index fd9babc..598cabf 100644
--- a/lxd/containers_post.go
+++ b/lxd/containers_post.go
@@ -257,7 +257,7 @@ func createFromMigration(d *Daemon, req 
*api.ContainersPost) Response {
        }
 
        run := func(op *operation) error {
-               // And finaly run the migration.
+               // And finally run the migration.
                err = sink.Do(op)
                if err != nil {
                        shared.LogError("Error during migration sink", 
log.Ctx{"err": err})
diff --git a/lxd/devlxd.go b/lxd/devlxd.go
index 7e27a16..1d0acc1 100644
--- a/lxd/devlxd.go
+++ b/lxd/devlxd.go
@@ -269,7 +269,7 @@ func getCred(conn *net.UnixConn) (*ucred, error) {
 /*
  * As near as I can tell, there is no nice way of extracting an underlying
  * net.Conn (or in our case, net.UnixConn) from an http.Request or
- * ResponseWriter without hijacking it [1]. Since we want to send and recieve
+ * ResponseWriter without hijacking it [1]. Since we want to send and receive
  * unix creds to figure out which container this request came from, we need to
  * do this.
  *
@@ -301,7 +301,7 @@ func findContainerForPid(pid int32, d *Daemon) (container, 
error) {
         *    an lxc monitor process and extract its name from there.
         *
         * 2. If this fails, it may be that someone did an `lxc exec foo bash`,
-        *    so the process isn't actually a decendant of the container's
+        *    so the process isn't actually a descendant of the container's
         *    init. In this case we just look through all the containers until
         *    we find an init with a matching pid namespace. This is probably
         *    uncommon, so hopefully the slowness won't hurt us.
diff --git a/lxd/images.go b/lxd/images.go
index 1d34299..10c179b 100644
--- a/lxd/images.go
+++ b/lxd/images.go
@@ -35,7 +35,7 @@ import (
    The CPU and I/O load of publish is such that running multiple ones in
    parallel takes longer than running them serially.
 
-   Additionaly, publishing the same container or container snapshot
+   Additionally, publishing the same container or container snapshot
    twice would lead to storage problem, not to mention a conflict at the
    end for whichever finishes last. */
 var imagePublishLock sync.Mutex
diff --git a/lxd/networks.go b/lxd/networks.go
index 867844a..9635734 100644
--- a/lxd/networks.go
+++ b/lxd/networks.go
@@ -1150,7 +1150,7 @@ func (n *network) Start() error {
                        }
                }
 
-               // Start dnsmasq (occasionaly races, try a few times)
+               // Start dnsmasq (occasionally races, try a few times)
                output, err := tryExec(dnsmasqCmd[0], dnsmasqCmd[1:]...)
                if err != nil {
                        return fmt.Errorf("Failed to run: %s: %s", 
strings.Join(dnsmasqCmd, " "), strings.TrimSpace(string(output)))
diff --git a/shared/util.go b/shared/util.go
index 9afc3f6..351bbd6 100644
--- a/shared/util.go
+++ b/shared/util.go
@@ -726,7 +726,7 @@ func GetByteSizeString(input int64, precision uint) string {
 }
 
 // RemoveDuplicatesFromString removes all duplicates of the string 'sep'
-// from the specified string 's'.  Leading and trailing occurences of sep
+// from the specified string 's'.  Leading and trailing occurrences of sep
 // are NOT removed (duplicate leading/trailing are).  Performs poorly if
 // there are multiple consecutive redundant separators.
 func RemoveDuplicatesFromString(s string, sep string) string {
diff --git a/shared/util_linux.go b/shared/util_linux.go
index 3adfc78..9ce2fb0 100644
--- a/shared/util_linux.go
+++ b/shared/util_linux.go
@@ -642,7 +642,7 @@ func ExecReaderToChannel(r io.Reader, bufferSize int, 
exited <-chan bool, fd int
                                        // still be handling a pure POLLIN 
event from a write prior to the childs
                                        // exit. But the child might have 
exited right before and performed
                                        // atomic.StoreInt32() to update 
attachedChildIsDead before we
-                                       // performed our atomic.LoadInt32(). 
This means we accidently hit this
+                                       // performed our atomic.LoadInt32(). 
This means we accidentally hit this
                                        // codepath and are misinformed about 
the available poll() events. So we
                                        // need to perform a non-blocking 
poll() again to exclude that case:
                                        //

From 2c27bfa93f00b531f7f5940d22ef213c2ea54d84 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com>
Date: Wed, 11 Jan 2017 16:56:24 +0200
Subject: [PATCH 05/12] client: Better handle http errors
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgra...@ubuntu.com>
---
 client.go | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/client.go b/client.go
index 36ab676..b4629b8 100644
--- a/client.go
+++ b/client.go
@@ -998,6 +998,10 @@ func (c *Client) PostImage(imageFile string, rootfsFile 
string, properties []str
                }
 
                req, err = http.NewRequest("POST", uri, progress)
+               if err != nil {
+                       return "", err
+               }
+
                req.Header.Set("Content-Type", w.FormDataContentType())
        } else {
                fImage, err = os.Open(imageFile)
@@ -1020,6 +1024,10 @@ func (c *Client) PostImage(imageFile string, rootfsFile 
string, properties []str
                }
 
                req, err = http.NewRequest("POST", uri, progress)
+               if err != nil {
+                       return "", err
+               }
+
                req.Header.Set("X-LXD-filename", filepath.Base(imageFile))
                req.Header.Set("Content-Type", "application/octet-stream")
        }

From 29ae83fe636c9c23a488cb3a9131cdfce3d54e1d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com>
Date: Wed, 11 Jan 2017 16:57:04 +0200
Subject: [PATCH 06/12] Properly check yaml errors
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgra...@ubuntu.com>
---
 lxc/config.go  | 3 +++
 lxc/network.go | 4 ++++
 lxc/profile.go | 4 ++++
 3 files changed, 11 insertions(+)

diff --git a/lxc/config.go b/lxc/config.go
index 3314ccf..ce79c9e 100644
--- a/lxc/config.go
+++ b/lxc/config.go
@@ -344,6 +344,9 @@ func (c *configCmd) run(config *lxd.Config, args []string) 
error {
 
                        brief := config.Writable()
                        data, err = yaml.Marshal(&brief)
+                       if err != nil {
+                               return err
+                       }
                } else {
                        var brief api.ContainerPut
                        if shared.IsSnapshot(container) {
diff --git a/lxc/network.go b/lxc/network.go
index e4d68d2..853932b 100644
--- a/lxc/network.go
+++ b/lxc/network.go
@@ -477,6 +477,10 @@ func (c *networkCmd) doNetworkShow(client *lxd.Client, 
name string) error {
        }
 
        data, err := yaml.Marshal(&network)
+       if err != nil {
+               return err
+       }
+
        fmt.Printf("%s", data)
 
        return nil
diff --git a/lxc/profile.go b/lxc/profile.go
index 30cc3c8..1685826 100644
--- a/lxc/profile.go
+++ b/lxc/profile.go
@@ -315,6 +315,10 @@ func (c *profileCmd) doProfileShow(client *lxd.Client, p 
string) error {
        }
 
        data, err := yaml.Marshal(&profile)
+       if err != nil {
+               return err
+       }
+
        fmt.Printf("%s", data)
 
        return nil

From 4fa65627e05927346d11ddae928bc381ecc63952 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com>
Date: Wed, 11 Jan 2017 16:58:41 +0200
Subject: [PATCH 07/12] init: Properly replace args list
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgra...@ubuntu.com>
---
 lxc/init.go | 1 +
 1 file changed, 1 insertion(+)

diff --git a/lxc/init.go b/lxc/init.go
index 0e6df1d..4305902 100644
--- a/lxc/init.go
+++ b/lxc/init.go
@@ -126,6 +126,7 @@ func (c *initCmd) massage_args() {
                initRequestedEmptyProfiles = true
                newargs := os.Args[0 : l-2]
                newargs = append(newargs, os.Args[l-1])
+               os.Args = newargs
                return
        }
 }

From 55a6fe1c299acd06fd151ae9271bf39d7d28d850 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com>
Date: Wed, 11 Jan 2017 16:58:59 +0200
Subject: [PATCH 08/12] list: Fix unused variable
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgra...@ubuntu.com>
---
 lxc/list.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lxc/list.go b/lxc/list.go
index c5e2f4e..8ec0a16 100644
--- a/lxc/list.go
+++ b/lxc/list.go
@@ -495,7 +495,7 @@ func (c *listCmd) parseColumns() ([]column, error) {
                        column.Data = func(cInfo api.Container, cState 
*api.ContainerState, cSnaps []api.ContainerSnapshot) string {
                                v, ok := cInfo.Config[k]
                                if !ok {
-                                       v, ok = cInfo.ExpandedConfig[k]
+                                       v, _ = cInfo.ExpandedConfig[k]
                                }
 
                                // Truncate the data according to the max 
width.  A negative max width

From f949777e9bcb01233b7e11c2e212c1ead8efdead Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com>
Date: Wed, 11 Jan 2017 16:59:16 +0200
Subject: [PATCH 09/12] profiles: Fix unusued variable
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgra...@ubuntu.com>
---
 lxd/db_profiles.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lxd/db_profiles.go b/lxd/db_profiles.go
index abbb3ab..b05bdf0 100644
--- a/lxd/db_profiles.go
+++ b/lxd/db_profiles.go
@@ -108,7 +108,7 @@ func dbProfileCreateDefault(db *sql.DB) error {
                return nil
        }
 
-       id, err := dbProfileCreate(db, "default", "Default LXD profile", 
map[string]string{}, types.Devices{})
+       _, err := dbProfileCreate(db, "default", "Default LXD profile", 
map[string]string{}, types.Devices{})
        if err != nil {
                return err
        }

From 5f2ac19de1fdcc4311fb5e122004db8bb0c70be1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com>
Date: Wed, 11 Jan 2017 16:59:37 +0200
Subject: [PATCH 10/12] devices: Don't ignore regexp failures
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgra...@ubuntu.com>
---
 lxd/devices.go | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/lxd/devices.go b/lxd/devices.go
index 9e0e413..a21808d 100644
--- a/lxd/devices.go
+++ b/lxd/devices.go
@@ -187,6 +187,10 @@ func deviceLoadGpu() ([]gpuDevice, []nvidiaGpuDevices, 
error) {
                        tmpGpu.minor = minorInt
 
                        isCard, err := regexp.MatchString("^card[0-9]+", 
drmEnt.Name())
+                       if err != nil {
+                               continue
+                       }
+
                        if isCard {
                                // If it is a card it's minor number will be 
its id.
                                tmpGpu.id = strconv.Itoa(minorInt)

From a42ff29b1a03135c4c3dde28d1ca20e89f33327c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com>
Date: Wed, 11 Jan 2017 16:59:49 +0200
Subject: [PATCH 11/12] migrate: Use the generate snapshot list
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgra...@ubuntu.com>
---
 lxd/migrate.go | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/lxd/migrate.go b/lxd/migrate.go
index e45fb15..db753d0 100644
--- a/lxd/migrate.go
+++ b/lxd/migrate.go
@@ -793,7 +793,8 @@ func (c *migrationSink) Do(migrateOp *operation) error {
                        } else {
                                fsConn = c.src.fsConn
                        }
-                       if err := mySink(live, c.src.container, 
header.Snapshots, fsConn, srcIdmap, migrateOp); err != nil {
+
+                       if err := mySink(live, c.src.container, snapshots, 
fsConn, srcIdmap, migrateOp); err != nil {
                                fsTransfer <- err
                                return
                        }

From aa8f40b6938684bc4bddab5c04fdfbfede892500 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com>
Date: Wed, 11 Jan 2017 17:00:04 +0200
Subject: [PATCH 12/12] tests: Don't ignore errors in db tests
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgra...@ubuntu.com>
---
 lxd/db_test.go | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/lxd/db_test.go b/lxd/db_test.go
index ae0e504..b967127 100644
--- a/lxd/db_test.go
+++ b/lxd/db_test.go
@@ -99,6 +99,9 @@ func Test_deleting_a_container_cascades_on_related_tables(t 
*testing.T) {
        // Make sure there are 0 containers_devices_config entries left.
        statements = `SELECT count(*) FROM containers_devices_config;`
        err = db.QueryRow(statements).Scan(&count)
+       if err != nil {
+               t.Errorf(err)
+       }
 
        if count != 0 {
                t.Errorf("Deleting a container didn't delete the associated 
container_devices_config! There are %d left", count)
@@ -151,6 +154,9 @@ func Test_deleting_a_profile_cascades_on_related_tables(t 
*testing.T) {
        // Make sure there are 0 profiles_devices_config entries left.
        statements = `SELECT count(*) FROM profiles_devices_config WHERE 
profile_device_id == 4;`
        err = db.QueryRow(statements).Scan(&count)
+       if err != nil {
+               t.Errorf(err)
+       }
 
        if count != 0 {
                t.Errorf("Deleting a profile didn't delete the related 
profiles_devices_config! There are %d left", count)
@@ -186,6 +192,9 @@ func Test_deleting_an_image_cascades_on_related_tables(t 
*testing.T) {
        // Make sure there are 0 images_properties entries left.
        statements = `SELECT count(*) FROM images_properties;`
        err = db.QueryRow(statements).Scan(&count)
+       if err != nil {
+               t.Errorf(err)
+       }
 
        if count != 0 {
                t.Errorf("Deleting an image didn't delete the related 
images_properties! There are %d left", count)
@@ -285,6 +294,9 @@ INSERT INTO containers_config (container_id, key, value) 
VALUES (1, 'thekey', 't
        // Make sure there are 0 container_profiles entries left.
        statements = `SELECT count(*) FROM containers_profiles;`
        err = d.db.QueryRow(statements).Scan(&count)
+       if err != nil {
+               t.Errorf(err)
+       }
 
        if count != 0 {
                t.Errorf("Deleting a container didn't delete the profile 
association! There are %d left", count)
@@ -392,6 +404,9 @@ INSERT INTO containers_config (container_id, key, value) 
VALUES (1, 'thekey', 't
        // Make sure there are 0 containers_config entries left.
        statements = `SELECT count(*) FROM containers_config;`
        err = db.QueryRow(statements).Scan(&count)
+       if err != nil {
+               t.Errorf(err)
+       }
 
        if count != 0 {
                t.Fatal("updateDb did not delete orphaned child entries after 
adding ON DELETE CASCADE!")
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to