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