The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/6939
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) === The code in ```ContainerListExpanded``` did not honor the ```features.profiles``` project configuration when expanding instance configs. This code path is hit only when checking if a Ceph storage volume is attachable, and is such a corner case that it probably went unnoticed so far.
From c0a344b2152783641f6d2a134394cf26dfddce90 Mon Sep 17 00:00:00 2001 From: Free Ekanayaka <free.ekanay...@canonical.com> Date: Tue, 25 Feb 2020 11:12:03 +0000 Subject: [PATCH 1/2] lxd/db: Rename ContainerListExpanded to instanceListExpanded Signed-off-by: Free Ekanayaka <free.ekanay...@canonical.com> --- lxd/db/containers.go | 6 +++--- lxd/db/containers_export_test.go | 5 +++++ lxd/db/containers_test.go | 2 +- lxd/db/storage_volumes.go | 2 +- 4 files changed, 10 insertions(+), 5 deletions(-) create mode 100644 lxd/db/containers_export_test.go diff --git a/lxd/db/containers.go b/lxd/db/containers.go index 6e855dfda6..6ede82234f 100644 --- a/lxd/db/containers.go +++ b/lxd/db/containers.go @@ -332,9 +332,9 @@ SELECT instances.name, nodes.id, nodes.address, nodes.heartbeat return result, nil } -// ContainerListExpanded loads all containers across all projects and expands -// their config and devices using the profiles they are associated to. -func (c *ClusterTx) ContainerListExpanded() ([]Instance, error) { +// Load all instances across all projects and expands their config and devices +// using the profiles they are associated to. +func (c *ClusterTx) instanceListExpanded() ([]Instance, error) { instances, err := c.InstanceList(InstanceFilter{}) if err != nil { return nil, errors.Wrap(err, "Load containers") diff --git a/lxd/db/containers_export_test.go b/lxd/db/containers_export_test.go new file mode 100644 index 0000000000..898b8b02e5 --- /dev/null +++ b/lxd/db/containers_export_test.go @@ -0,0 +1,5 @@ +package db + +func (c *ClusterTx) InstanceListExpanded() ([]Instance, error) { + return c.instanceListExpanded() +} diff --git a/lxd/db/containers_test.go b/lxd/db/containers_test.go index ce10ef4b10..57666f571a 100644 --- a/lxd/db/containers_test.go +++ b/lxd/db/containers_test.go @@ -187,7 +187,7 @@ func TestInstanceListExpanded(t *testing.T) { _, err = tx.InstanceCreate(container) require.NoError(t, err) - containers, err := tx.ContainerListExpanded() + containers, err := tx.InstanceListExpanded() require.NoError(t, err) assert.Len(t, containers, 1) diff --git a/lxd/db/storage_volumes.go b/lxd/db/storage_volumes.go index 33cc9ffd83..9bb2323bf1 100644 --- a/lxd/db/storage_volumes.go +++ b/lxd/db/storage_volumes.go @@ -228,7 +228,7 @@ func (c *Cluster) StorageVolumeIsAvailable(pool, volume string) (bool, error) { return errors.Wrapf(err, "Fetch node name") } - containers, err := tx.ContainerListExpanded() + containers, err := tx.instanceListExpanded() if err != nil { return errors.Wrapf(err, "Fetch containers") } From e1939aacf369221287ea11f900b369bc716c2af3 Mon Sep 17 00:00:00 2001 From: Free Ekanayaka <free.ekanay...@canonical.com> Date: Wed, 26 Feb 2020 11:46:02 +0000 Subject: [PATCH 2/2] lxd/db: Make instanceListExpanded account for projects without "features.profiles" enabled Signed-off-by: Free Ekanayaka <free.ekanay...@canonical.com> --- lxd/db/containers.go | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/lxd/db/containers.go b/lxd/db/containers.go index 6ede82234f..29652a84c1 100644 --- a/lxd/db/containers.go +++ b/lxd/db/containers.go @@ -340,6 +340,17 @@ func (c *ClusterTx) instanceListExpanded() ([]Instance, error) { return nil, errors.Wrap(err, "Load containers") } + projects, err := c.ProjectList(ProjectFilter{}) + if err != nil { + return nil, errors.Wrap(err, "Load projects") + } + + // Map to check which projects have the profiles features on. + projectHasProfiles := map[string]bool{} + for _, project := range projects { + projectHasProfiles[project.Name] = project.Config["features.profiles"] == "true" + } + profiles, err := c.ProfileList(ProfileFilter{}) if err != nil { return nil, errors.Wrap(err, "Load profiles") @@ -358,8 +369,17 @@ func (c *ClusterTx) instanceListExpanded() ([]Instance, error) { for i, instance := range instances { profiles := make([]api.Profile, len(instance.Profiles)) + + profilesProject := instance.Project + + // If the instance's project does not have the profiles feature + // enable, we fall back to the default project. + if !projectHasProfiles[profilesProject] { + profilesProject = "default" + } + for j, name := range instance.Profiles { - profile := profilesByProjectAndName[instance.Project][name] + profile := profilesByProjectAndName[profilesProject][name] profiles[j] = *ProfileToAPI(&profile) }
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel