[lxc-devel] [lxd/master] Fix request redirect when removing a cluster member
freeekanayaka on Github
lxc-bot at linuxcontainers.org
Mon Jan 27 09:09:01 UTC 2020
A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 463 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20200127/8e90bb72/attachment.bin>
-------------- next part --------------
From fc33dbfaecaec65af066a64b55b89002f72a2d3b Mon Sep 17 00:00:00 2001
From: Free Ekanayaka <free.ekanayaka at canonical.com>
Date: Mon, 27 Jan 2020 09:03:48 +0000
Subject: [PATCH] Fix request redirect when removing a cluster member
Since this is not an internal request we can't redirect it, we need to handle
it.
Fixes #6770.
Signed-off-by: Free Ekanayaka <free.ekanayaka at canonical.com>
---
lxd/api_cluster.go | 25 +++++++++++++++----------
test/suites/clustering.sh | 9 +++++++--
2 files changed, 22 insertions(+), 12 deletions(-)
diff --git a/lxd/api_cluster.go b/lxd/api_cluster.go
index ce608d6181..8829745e7d 100644
--- a/lxd/api_cluster.go
+++ b/lxd/api_cluster.go
@@ -909,6 +909,13 @@ func clusterNodeDelete(d *Daemon, r *http.Request) response.Response {
d.clusterMembershipMutex.Lock()
defer d.clusterMembershipMutex.Unlock()
+ force, err := strconv.Atoi(r.FormValue("force"))
+ if err != nil {
+ force = 0
+ }
+
+ name := mux.Vars(r)["name"]
+
// Redirect all requests to the leader, which is the one with
// knowning what nodes are part of the raft cluster.
localAddress, err := node.ClusterAddress(d.db)
@@ -921,20 +928,18 @@ func clusterNodeDelete(d *Daemon, r *http.Request) response.Response {
}
if localAddress != leader {
logger.Debugf("Redirect member delete request to %s", leader)
- url := &url.URL{
- Scheme: "https",
- Path: "/internal/cluster/accept",
- Host: leader,
+ client, err := cluster.Connect(leader, d.endpoints.NetworkCert(), false)
+ if err != nil {
+ return response.SmartError(err)
+ }
+ err = client.DeleteClusterMember(name, force == 1)
+ if err != nil {
+ return response.SmartError(err)
}
- return response.SyncResponseRedirect(url.String())
- }
- force, err := strconv.Atoi(r.FormValue("force"))
- if err != nil {
- force = 0
+ return response.EmptySyncResponse
}
- name := mux.Vars(r)["name"]
logger.Debugf("Deleting member %s from cluster (force=%d)", name, force)
// First check that the node is clear from containers and images and
diff --git a/test/suites/clustering.sh b/test/suites/clustering.sh
index 8aff5590b6..e855206b6b 100644
--- a/test/suites/clustering.sh
+++ b/test/suites/clustering.sh
@@ -124,8 +124,13 @@ test_clustering_membership() {
LXD_DIR="${LXD_ONE_DIR}" lxc config set cluster.offline_threshold 12
LXD_DIR="${LXD_THREE_DIR}" lxd shutdown
sleep 15
- LXD_DIR="${LXD_TWO_DIR}" lxc cluster list
- #| grep "node3" | grep -q "OFFLINE"
+ LXD_DIR="${LXD_TWO_DIR}" lxc cluster list | grep "node3" | grep -q "OFFLINE"
+
+ # Gracefully remove a node.
+ LXD_DIR="${LXD_TWO_DIR}" lxc cluster remove node4
+
+ # The node isn't clustered anymore.
+ ! LXD_DIR="${LXD_FOUR_DIR}" lxc cluster list || false
LXD_DIR="${LXD_FIVE_DIR}" lxd shutdown
LXD_DIR="${LXD_FOUR_DIR}" lxd shutdown
More information about the lxc-devel
mailing list