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

Reply via email to