The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/8181
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 2c9fdc5afd27c2d90dd9dfa176e2ebab8295c7e0 Mon Sep 17 00:00:00 2001 From: Thomas Parrott <thomas.parr...@canonical.com> Date: Tue, 24 Nov 2020 16:46:40 +0000 Subject: [PATCH 1/8] shared/instance: golint fixes Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com> --- shared/instance.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/shared/instance.go b/shared/instance.go index f4ac70993b..0b4ddff8e9 100644 --- a/shared/instance.go +++ b/shared/instance.go @@ -14,8 +14,10 @@ import ( "github.com/lxc/lxd/shared/validate" ) +// InstanceAction indicates the type of action being performed. type InstanceAction string +// InstanceAction types. const ( Stop InstanceAction = "stop" Start InstanceAction = "start" From 79941f59a92d0734d4273c75fb197c85a964163c Mon Sep 17 00:00:00 2001 From: Thomas Parrott <thomas.parr...@canonical.com> Date: Tue, 24 Nov 2020 16:46:53 +0000 Subject: [PATCH 2/8] shared/instance: Adds ConfigVolatilePrefix constant To avoid inconsistent use of "volatile" and "volatile." prefix checks. Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com> --- shared/instance.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/shared/instance.go b/shared/instance.go index 0b4ddff8e9..2a0986f9b8 100644 --- a/shared/instance.go +++ b/shared/instance.go @@ -26,6 +26,9 @@ const ( Unfreeze InstanceAction = "unfreeze" ) +// ConfigVolatilePrefix indicates the prefix used for volatile config keys. +const ConfigVolatilePrefix = "volatile." + // IsRootDiskDevice returns true if the given device representation is configured as root disk for // an instance. It typically get passed a specific entry of api.Instance.Devices. func IsRootDiskDevice(device map[string]string) bool { From 1e7d93cc87128b919c2d6dbe5ae280bb9d5d5476 Mon Sep 17 00:00:00 2001 From: Thomas Parrott <thomas.parr...@canonical.com> Date: Tue, 24 Nov 2020 16:47:21 +0000 Subject: [PATCH 3/8] shared/instance: ConfigVolatilePrefix usage Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com> --- shared/instance.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared/instance.go b/shared/instance.go index 2a0986f9b8..000825c247 100644 --- a/shared/instance.go +++ b/shared/instance.go @@ -275,7 +275,7 @@ func ConfigKeyChecker(key string) (func(value string) error, error) { return f, nil } - if strings.HasPrefix(key, "volatile.") { + if strings.HasPrefix(key, ConfigVolatilePrefix) { if strings.HasSuffix(key, ".hwaddr") { return validate.IsAny, nil } From 91277c1649fdf97fd888d3fc9465330226292280 Mon Sep 17 00:00:00 2001 From: Thomas Parrott <thomas.parr...@canonical.com> Date: Tue, 24 Nov 2020 16:47:29 +0000 Subject: [PATCH 4/8] shared/instance: Adds InstanceIncludeWhenCopying function Brings together the volatile inclusion/exclusion logic that was spread over lxd and lxc. Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com> --- shared/instance.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/shared/instance.go b/shared/instance.go index 000825c247..c1f1483776 100644 --- a/shared/instance.go +++ b/shared/instance.go @@ -355,3 +355,21 @@ func InstanceGetParentAndSnapshotName(name string) (string, string, bool) { return fields[0], fields[1], true } + +// InstanceIncludeWhenCopying is used to decide whether to include a config item or not when copying an instance. +// The remoteCopy argument indicates if the copy is remote (i.e between LXD nodes) as this affects the keys kept. +func InstanceIncludeWhenCopying(configKey string, remoteCopy bool) bool { + if configKey == "volatile.base_image" { + return true // Include volatile.base_image always as it can help optimize copies. + } + + if configKey == "volatile.last_state.idmap" && !remoteCopy { + return true // Include volatile.last_state.idmap when doing local copy to avoid needless remapping. + } + + if strings.HasPrefix(configKey, ConfigVolatilePrefix) { + return false // Exclude all other volatile keys. + } + + return true // Keep all other keys. +} From 76dcd882dd1bef3bb9713bd223f76630b24a2ba1 Mon Sep 17 00:00:00 2001 From: Thomas Parrott <thomas.parr...@canonical.com> Date: Tue, 24 Nov 2020 16:48:13 +0000 Subject: [PATCH 5/8] lxd/copy: shared.InstanceIncludeWhenCopying usage in copyInstance Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com> --- lxc/copy.go | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/lxc/copy.go b/lxc/copy.go index 7b88270ee4..128c52230b 100644 --- a/lxc/copy.go +++ b/lxc/copy.go @@ -224,13 +224,8 @@ func (c *cmdCopy) copyInstance(conf *config.Config, sourceResource string, destR delete(entry.Config, "volatile.last_state.power") if !keepVolatile { - // Strip all volatile keys for k := range entry.Config { - if k == "volatile.base_image" { - continue - } - - if strings.HasPrefix(k, "volatile") { + if !shared.InstanceIncludeWhenCopying(k, true) { delete(entry.Config, k) } } @@ -319,11 +314,7 @@ func (c *cmdCopy) copyInstance(conf *config.Config, sourceResource string, destR // Strip the volatile keys if requested if !keepVolatile { for k := range entry.Config { - if k == "volatile.base_image" { - continue - } - - if strings.HasPrefix(k, "volatile") { + if !shared.InstanceIncludeWhenCopying(k, true) { delete(entry.Config, k) } } From fd15eb80b127ccc6ba6308872e7931eab98bcf49 Mon Sep 17 00:00:00 2001 From: Thomas Parrott <thomas.parr...@canonical.com> Date: Tue, 24 Nov 2020 16:48:25 +0000 Subject: [PATCH 6/8] lxc: shared.ConfigVolatilePrefix usage Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com> --- lxc/list_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lxc/list_test.go b/lxc/list_test.go index 5bb084e044..9bb986961b 100644 --- a/lxc/list_test.go +++ b/lxc/list_test.go @@ -97,11 +97,11 @@ func TestColumns(t *testing.T) { randString(buffer) case 3: if rand.Intn(2) == 0 { - buffer.WriteString("volatile.") + buffer.WriteString(shared.ConfigVolatilePrefix) randString(buffer) buffer.WriteString(".hwaddr") } else { - buffer.WriteString("volatile.") + buffer.WriteString(shared.ConfigVolatilePrefix) randString(buffer) buffer.WriteString(".name") } From ecbb32591a01af930bf93fa85011a65d6cb8b469 Mon Sep 17 00:00:00 2001 From: Thomas Parrott <thomas.parr...@canonical.com> Date: Tue, 24 Nov 2020 16:48:42 +0000 Subject: [PATCH 7/8] lxd: shared.ConfigVolatilePrefix usage Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com> --- lxd/api_cluster.go | 4 ++-- lxd/instance/drivers/driver_common.go | 2 +- lxd/instance/drivers/driver_lxc.go | 2 +- lxd/instance/instance_utils.go | 2 +- lxd/project/permissions.go | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lxd/api_cluster.go b/lxd/api_cluster.go index 7e88bcce2f..4261f90ae2 100644 --- a/lxd/api_cluster.go +++ b/lxd/api_cluster.go @@ -144,7 +144,7 @@ func clusterGetMemberConfig(cluster *db.Cluster) ([]api.ClusterMemberConfigKey, for pool, config := range pools { for key := range config { - if strings.HasPrefix(key, "volatile.") { + if strings.HasPrefix(key, shared.ConfigVolatilePrefix) { continue } @@ -160,7 +160,7 @@ func clusterGetMemberConfig(cluster *db.Cluster) ([]api.ClusterMemberConfigKey, for network, config := range networks { for key := range config { - if strings.HasPrefix(key, "volatile.") { + if strings.HasPrefix(key, shared.ConfigVolatilePrefix) { continue } diff --git a/lxd/instance/drivers/driver_common.go b/lxd/instance/drivers/driver_common.go index 161cb1416a..395a200cf7 100644 --- a/lxd/instance/drivers/driver_common.go +++ b/lxd/instance/drivers/driver_common.go @@ -236,7 +236,7 @@ func (d *common) Snapshots() ([]instance.Instance, error) { func (d *common) VolatileSet(changes map[string]string) error { // Sanity check. for key := range changes { - if !strings.HasPrefix(key, "volatile.") { + if !strings.HasPrefix(key, shared.ConfigVolatilePrefix) { return fmt.Errorf("Only volatile keys can be modified with VolatileSet") } } diff --git a/lxd/instance/drivers/driver_lxc.go b/lxd/instance/drivers/driver_lxc.go index e731beba16..ab7eeba24c 100644 --- a/lxd/instance/drivers/driver_lxc.go +++ b/lxd/instance/drivers/driver_lxc.go @@ -6058,7 +6058,7 @@ func (d *lxc) FillNetworkDevice(name string, m deviceConfig.Device) (deviceConfi // Include all currently allocated interface names for k, v := range d.expandedConfig { - if !strings.HasPrefix(k, "volatile.") { + if !strings.HasPrefix(k, shared.ConfigVolatilePrefix) { continue } diff --git a/lxd/instance/instance_utils.go b/lxd/instance/instance_utils.go index 589ab7b567..3ea6b4d6ae 100644 --- a/lxd/instance/instance_utils.go +++ b/lxd/instance/instance_utils.go @@ -127,7 +127,7 @@ func ValidConfig(sysOS *sys.OS, config map[string]string, profile bool, expanded } for k, v := range config { - if profile && strings.HasPrefix(k, "volatile.") { + if profile && strings.HasPrefix(k, shared.ConfigVolatilePrefix) { return fmt.Errorf("Volatile keys can only be set on instances") } diff --git a/lxd/project/permissions.go b/lxd/project/permissions.go index 3950396bb6..cc3ba5d5b4 100644 --- a/lxd/project/permissions.go +++ b/lxd/project/permissions.go @@ -125,7 +125,7 @@ func checkRestrictionsOnVolatileConfig(project *api.Project, instanceType instan } for key, value := range config { - if !strings.HasPrefix(key, "volatile.") { + if !strings.HasPrefix(key, shared.ConfigVolatilePrefix) { continue } From f98ed83b30211bce54ebcc23f233c406e4c1b115 Mon Sep 17 00:00:00 2001 From: Thomas Parrott <thomas.parr...@canonical.com> Date: Tue, 24 Nov 2020 16:49:08 +0000 Subject: [PATCH 8/8] lxd/instances/post: shared.InstanceIncludeWhenCopying usage in createFromCopy Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com> --- lxd/instances_post.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lxd/instances_post.go b/lxd/instances_post.go index 3a7028a1de..369f44230b 100644 --- a/lxd/instances_post.go +++ b/lxd/instances_post.go @@ -438,9 +438,8 @@ func createFromCopy(d *Daemon, project string, req *api.InstancesPost) response. } for key, value := range sourceConfig { - if len(key) > 8 && key[0:8] == "volatile" && !shared.StringInSlice(key[9:], []string{"base_image", "last_state.idmap"}) { - logger.Debug("Skipping volatile key from copy source", - log.Ctx{"key": key}) + if !shared.InstanceIncludeWhenCopying(key, false) { + logger.Debug("Skipping key from copy source", log.Ctx{"key": key, "sourceProject": source.Project(), "sourceInstance": source.Name(), "project": targetProject, "instance": req.Name}) continue }
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel