The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/5142
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) === Fixes #5137.
From 0e3141b38458491afa61020a6aa8dc7ad6baf488 Mon Sep 17 00:00:00 2001 From: Free Ekanayaka <free.ekanay...@canonical.com> Date: Thu, 11 Oct 2018 13:00:01 +0200 Subject: [PATCH 1/2] Associate a container with the profile from its own project Signed-off-by: Free Ekanayaka <free.ekanay...@canonical.com> --- lxd/container_lxc.go | 2 +- lxd/db/containers.go | 23 ++++++++++++++++------- lxd/db/containers.mapper.go | 3 ++- shared/generate/db/method.go | 2 +- 4 files changed, 20 insertions(+), 10 deletions(-) diff --git a/lxd/container_lxc.go b/lxd/container_lxc.go index 6dab67109a..02059964ac 100644 --- a/lxd/container_lxc.go +++ b/lxd/container_lxc.go @@ -4867,7 +4867,7 @@ func (c *containerLXC) Update(args db.ContainerArgs, userRequested bool) error { return errors.Wrap(err, "Config insert") } - err = db.ContainerProfilesInsert(tx, c.id, c.profiles) + err = db.ContainerProfilesInsert(tx, c.id, c.project, c.profiles) if err != nil { tx.Rollback() return errors.Wrap(err, "Profiles insert") diff --git a/lxd/db/containers.go b/lxd/db/containers.go index 36ca875640..f5612cb23b 100644 --- a/lxd/db/containers.go +++ b/lxd/db/containers.go @@ -596,21 +596,30 @@ func (c *Cluster) ContainerSetStateful(id int, stateful bool) error { } // ContainerProfilesInsert associates the container with the given ID with the -// profiles with the given names. -func ContainerProfilesInsert(tx *sql.Tx, id int, profiles []string) error { +// profiles with the given names in the given project. +func ContainerProfilesInsert(tx *sql.Tx, id int, project string, profiles []string) error { applyOrder := 1 - str := `INSERT INTO containers_profiles (container_id, profile_id, apply_order) VALUES - (?, (SELECT id FROM profiles WHERE name=?), ?);` + str := ` +INSERT INTO containers_profiles (container_id, profile_id, apply_order) + VALUES ( + ?, + (SELECT profiles.id + FROM profiles + JOIN projects ON projects.id=profiles.project_id + WHERE projects.name=? AND profiles.name=?), + ? + ) +` stmt, err := tx.Prepare(str) if err != nil { return err } defer stmt.Close() - for _, p := range profiles { - _, err = stmt.Exec(id, p, applyOrder) + for _, profile := range profiles { + _, err = stmt.Exec(id, project, profile, applyOrder) if err != nil { logger.Debugf("Error adding profile %s to container: %s", - p, err) + profile, err) return err } applyOrder = applyOrder + 1 diff --git a/lxd/db/containers.mapper.go b/lxd/db/containers.mapper.go index f60ec5c284..9aec50d48f 100644 --- a/lxd/db/containers.mapper.go +++ b/lxd/db/containers.mapper.go @@ -5,6 +5,7 @@ package db import ( "database/sql" "fmt" + "github.com/lxc/lxd/lxd/db/cluster" "github.com/lxc/lxd/lxd/db/query" "github.com/lxc/lxd/shared/api" @@ -423,7 +424,7 @@ func (c *ClusterTx) ContainerCreate(object Container) (int64, error) { } // Insert profiles reference. - err = ContainerProfilesInsert(c.tx, int(id), object.Profiles) + err = ContainerProfilesInsert(c.tx, int(id), object.Project, object.Profiles) if err != nil { return -1, errors.Wrap(err, "Insert profiles for container") } diff --git a/shared/generate/db/method.go b/shared/generate/db/method.go index 0cb25e9fbe..dc0ca3b368 100644 --- a/shared/generate/db/method.go +++ b/shared/generate/db/method.go @@ -682,7 +682,7 @@ func (m *Method) create(buf *file.Buffer) error { if field.Name == "Profiles" { // TODO: get rid of the special case buf.L("// Insert profiles reference. ") - buf.L("err = ContainerProfilesInsert(c.tx, int(id), object.Profiles)") + buf.L("err = ContainerProfilesInsert(c.tx, int(id), object.Project, object.Profiles)") buf.L("if err != nil {") buf.L(" return -1, errors.Wrap(err, \"Insert profiles for %s\")", m.entity) buf.L("}") From 05d0d73a722494165ada60235e0ab31b291d67c0 Mon Sep 17 00:00:00 2001 From: Free Ekanayaka <free.ekanay...@canonical.com> Date: Thu, 11 Oct 2018 13:15:30 +0200 Subject: [PATCH 2/2] Expand container devices and configs from the associated project Signed-off-by: Free Ekanayaka <free.ekanay...@canonical.com> --- lxd/container_lxc.go | 2 +- lxd/db/db_internal_test.go | 4 ++-- lxd/db/devices.go | 18 ++++++++++-------- lxd/profiles_test.go | 2 +- lxd/profiles_utils.go | 2 +- 5 files changed, 15 insertions(+), 13 deletions(-) diff --git a/lxd/container_lxc.go b/lxd/container_lxc.go index 02059964ac..1d83ce70f7 100644 --- a/lxd/container_lxc.go +++ b/lxd/container_lxc.go @@ -1828,7 +1828,7 @@ func (c *containerLXC) expandDevices(profiles []api.Profile) error { } } else { for _, p := range c.profiles { - devices, err := c.state.Cluster.Devices(p, true) + devices, err := c.state.Cluster.Devices(c.project, p, true) if err != nil { return err } diff --git a/lxd/db/db_internal_test.go b/lxd/db/db_internal_test.go index cb3943ec60..b0372dd41d 100644 --- a/lxd/db/db_internal_test.go +++ b/lxd/db/db_internal_test.go @@ -335,7 +335,7 @@ func (s *dbTestSuite) Test_dbDevices_profiles() { var subresult types.Device var expected types.Device - result, err = s.db.Devices("theprofile", true) + result, err = s.db.Devices("default", "theprofile", true) s.Nil(err) expected = types.Device{"type": "nic", "devicekey": "devicevalue"} @@ -353,7 +353,7 @@ func (s *dbTestSuite) Test_dbDevices_containers() { var subresult types.Device var expected types.Device - result, err = s.db.Devices("thename", false) + result, err = s.db.Devices("default", "thename", false) s.Nil(err) expected = types.Device{"type": "nic", "configkey": "configvalue"} diff --git a/lxd/db/devices.go b/lxd/db/devices.go index 5af6f08280..114813c4c0 100644 --- a/lxd/db/devices.go +++ b/lxd/db/devices.go @@ -138,22 +138,24 @@ func dbDeviceConfig(db *sql.DB, id int, isprofile bool) (types.Device, error) { } // Devices returns the devices matching the given filters. -func (c *Cluster) Devices(qName string, isprofile bool) (types.Devices, error) { +func (c *Cluster) Devices(project, qName string, isprofile bool) (types.Devices, error) { var q string if isprofile { q = `SELECT profiles_devices.id, profiles_devices.name, profiles_devices.type - FROM profiles_devices JOIN profiles - ON profiles_devices.profile_id = profiles.id - WHERE profiles.name=?` + FROM profiles_devices + JOIN profiles ON profiles_devices.profile_id = profiles.id + JOIN projects ON projects.id=profiles.project_id + WHERE projects.name=? AND profiles.name=?` } else { q = `SELECT containers_devices.id, containers_devices.name, containers_devices.type - FROM containers_devices JOIN containers - ON containers_devices.container_id = containers.id - WHERE containers.name=?` + FROM containers_devices + JOIN containers ON containers_devices.container_id = containers.id + JOIN projects ON projects.id=containers.project_id + WHERE projects.name=? AND containers.name=?` } var id, dtype int var name, stype string - inargs := []interface{}{qName} + inargs := []interface{}{project, qName} outfmt := []interface{}{id, name, dtype} results, err := queryScan(c.db, q, inargs, outfmt) if err != nil { diff --git a/lxd/profiles_test.go b/lxd/profiles_test.go index 5e3c1b3de1..dc437d90c5 100644 --- a/lxd/profiles_test.go +++ b/lxd/profiles_test.go @@ -42,7 +42,7 @@ func Test_removing_a_profile_deletes_associated_configuration_entries(t *testing } // Make sure there are 0 profiles_devices entries left. - devices, err := cluster.Devices("theprofile", true) + devices, err := cluster.Devices("default", "theprofile", true) if err != nil { t.Fatal(err) } diff --git a/lxd/profiles_utils.go b/lxd/profiles_utils.go index 62d55c735f..2aa5ad9039 100644 --- a/lxd/profiles_utils.go +++ b/lxd/profiles_utils.go @@ -215,7 +215,7 @@ func doProfileUpdateContainer(d *Daemon, name string, old api.ProfilePut, nodeNa continue } // Use the config currently in the database. - devices, err := d.cluster.Devices(profileName, true) + devices, err := d.cluster.Devices(args.Project, profileName, true) if err != nil { return errors.Wrapf(err, "failed to load profile devices for '%s'", profileName) }
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel