The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/7715
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) === Signed-off-by: Stéphane Graber <stgra...@ubuntu.com>
From 94f8c7dd15daa39b4099007a34b7d81f4ad9eded Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com> Date: Fri, 31 Jul 2020 16:50:43 -0400 Subject: [PATCH] lxd/cluster: Fix failure domain updates 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/api_cluster.go | 44 +++++++++++++++++++++----------------------- lxd/db/node.go | 5 +++++ 2 files changed, 26 insertions(+), 23 deletions(-) diff --git a/lxd/api_cluster.go b/lxd/api_cluster.go index 15e2ed39b2..0416cc872f 100644 --- a/lxd/api_cluster.go +++ b/lxd/api_cluster.go @@ -870,7 +870,7 @@ func clusterNodeGet(d *Daemon, r *http.Request) response.Response { for _, node := range nodes { if node.ServerName == name { - return response.SyncResponseETag(true, node, node.Roles) + return response.SyncResponseETag(true, node, node.ClusterMemberPut) } } @@ -886,32 +886,25 @@ func clusterNodePut(d *Daemon, r *http.Request) response.Response { name := mux.Vars(r)["name"] // Find the requested one. - var current db.NodeInfo - var currentFailureDomain string - var err error - err = d.cluster.Transaction(func(tx *db.ClusterTx) error { - current, err = tx.GetNodeByName(name) - if err != nil { - return errors.Wrap(err, "Load current node state") - } + nodes, err := cluster.List(d.State(), d.gateway) + if err != nil { + return response.SmartError(err) + } - currentFailureDomain, err = tx.GetNodeFailureDomain(current.ID) - if err != nil { - return errors.Wrap(err, "Load current failure domain") + var current *api.ClusterMember + for _, node := range nodes { + if node.ServerName == name { + current = &node + break } + } - return nil - }) - if err != nil { - return response.SmartError(err) + if current == nil { + return response.NotFound(fmt.Errorf("Member '%s' not found", name)) } // Validate the request is fine - etag := []interface{}{ - current.Roles, - currentFailureDomain, - } - err = util.EtagCheck(r, etag) + err = util.EtagCheck(r, current.ClusterMemberPut) if err != nil { return response.PreconditionFailed(err) } @@ -935,17 +928,22 @@ func clusterNodePut(d *Daemon, r *http.Request) response.Response { // Update the database err = d.cluster.Transaction(func(tx *db.ClusterTx) error { + nodeInfo, err := tx.GetNodeByName(name) + if err != nil { + return errors.Wrap(err, "Loading node information") + } + dbRoles := []db.ClusterRole{} for _, role := range req.Roles { dbRoles = append(dbRoles, db.ClusterRole(role)) } - err := tx.UpdateNodeRoles(current.ID, dbRoles) + err = tx.UpdateNodeRoles(nodeInfo.ID, dbRoles) if err != nil { return errors.Wrap(err, "Update roles") } - err = tx.UpdateNodeFailureDomain(current.ID, req.FailureDomain) + err = tx.UpdateNodeFailureDomain(nodeInfo.ID, req.FailureDomain) if err != nil { return errors.Wrap(err, "Update failure domain") } diff --git a/lxd/db/node.go b/lxd/db/node.go index ceb2ee2b8c..3afa6a073c 100644 --- a/lxd/db/node.go +++ b/lxd/db/node.go @@ -433,6 +433,11 @@ func (c *ClusterTx) UpdateNodeRoles(id int64, roles []ClusterRole) error { // Translate role names to ids roleIDs := []int{} for _, role := range roles { + // Skip internal-only roles. + if role == ClusterRoleDatabase { + continue + } + roleID, err := getRoleID(role) if err != nil { return err
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel