The following pull request was submitted through Github.
It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/6554

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) ===
For #6380
Registering the native architecture of each server in the nodes database table and updating the generated /1.0 output
From 0c46b5ad924f82328eae1066671eb08f0853354c Mon Sep 17 00:00:00 2001
From: Dinah Baum <dinahbaum...@gmail.com>
Date: Thu, 5 Dec 2019 01:33:20 -0600
Subject: [PATCH 1/7] lxc: Add ARCH column and state information to cluster
 list

Signed-off-by: Dinah Baum <dinahbaum...@gmail.com>
---
 lxc/cluster.go | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/lxc/cluster.go b/lxc/cluster.go
index c147e54155..6231de73d6 100644
--- a/lxc/cluster.go
+++ b/lxc/cluster.go
@@ -117,7 +117,7 @@ func (c *cmdClusterList) Run(cmd *cobra.Command, args 
[]string) error {
                if member.Database {
                        database = "YES"
                }
-               line := []string{member.ServerName, member.URL, database, 
strings.ToUpper(member.Status), member.Message}
+               line := []string{member.ServerName, member.URL, database, 
strings.ToUpper(member.Status), member.Message, member.Arch}
                data = append(data, line)
        }
        sort.Sort(byName(data))
@@ -128,6 +128,7 @@ func (c *cmdClusterList) Run(cmd *cobra.Command, args 
[]string) error {
                i18n.G("DATABASE"),
                i18n.G("STATE"),
                i18n.G("MESSAGE"),
+               i18n.G("ARCH"),
        }
 
        return utils.RenderTable(c.flagFormat, header, data, members)

From dea57e3eca26d1bcf8b9509841b7ec4c850673c8 Mon Sep 17 00:00:00 2001
From: Dinah Baum <dinahbaum...@gmail.com>
Date: Thu, 5 Dec 2019 01:34:09 -0600
Subject: [PATCH 2/7] lxd/cluster: fix cluster.Accept() calls

Signed-off-by: Dinah Baum <dinahbaum...@gmail.com>
---
 lxd/cluster/heartbeat_test.go | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/lxd/cluster/heartbeat_test.go b/lxd/cluster/heartbeat_test.go
index 4b4e247dc0..30fddb3371 100644
--- a/lxd/cluster/heartbeat_test.go
+++ b/lxd/cluster/heartbeat_test.go
@@ -142,9 +142,8 @@ func (f *heartbeatFixture) Grow() *cluster.Gateway {
 
        state, gateway, address := f.node()
        name := address
-
        nodes, err := cluster.Accept(
-               targetState, target, name, address, cluster.SchemaVersion, 
len(version.APIExtensions))
+               targetState, target, name, address, cluster.SchemaVersion, 
len(version.APIExtensions), 1)
        require.NoError(f.t, err)
 
        err = cluster.Join(state, gateway, target.Cert(), name, nodes)

From 92461624e87fe1dab890276a8015814209c69bec Mon Sep 17 00:00:00 2001
From: Dinah Baum <dinahbaum...@gmail.com>
Date: Thu, 5 Dec 2019 01:34:26 -0600
Subject: [PATCH 3/7] lxd/cluster: fix cluster.Accept() calls

Signed-off-by: Dinah Baum <dinahbaum...@gmail.com>
---
 lxd/cluster/membership_test.go | 8 +++-----
 1 file changed, 3 insertions(+), 5 deletions(-)

diff --git a/lxd/cluster/membership_test.go b/lxd/cluster/membership_test.go
index 5462f7fc3e..bc9c5bb3aa 100644
--- a/lxd/cluster/membership_test.go
+++ b/lxd/cluster/membership_test.go
@@ -203,8 +203,7 @@ func TestAccept_UnmetPreconditions(t *testing.T) {
                        defer gateway.Shutdown()
 
                        c.setup(&membershipFixtures{t: t, state: state})
-
-                       _, err := cluster.Accept(state, gateway, c.name, 
c.address, c.schema, c.api)
+                       _, err := cluster.Accept(state, gateway, c.name, 
c.address, c.schema, c.api, 1)
                        assert.EqualError(t, err, c.error)
                })
        }
@@ -222,9 +221,8 @@ func TestAccept(t *testing.T) {
        f := &membershipFixtures{t: t, state: state}
        f.RaftNode("1.2.3.4:666")
        f.ClusterNode("1.2.3.4:666")
-
        nodes, err := cluster.Accept(
-               state, gateway, "buzz", "5.6.7.8:666", cluster.SchemaVersion, 
len(version.APIExtensions))
+               state, gateway, "buzz", "5.6.7.8:666", cluster.SchemaVersion, 
len(version.APIExtensions), 1)
        assert.NoError(t, err)
        assert.Len(t, nodes, 2)
        assert.Equal(t, int64(1), nodes[0].ID)
@@ -306,7 +304,7 @@ func TestJoin(t *testing.T) {
 
        // Accept the joining node.
        raftNodes, err := cluster.Accept(
-               targetState, targetGateway, "rusp", address, 
cluster.SchemaVersion, len(version.APIExtensions))
+               targetState, targetGateway, "rusp", address, 
cluster.SchemaVersion, len(version.APIExtensions), 1)
        require.NoError(t, err)
 
        // Actually join the cluster.

From 728844f6cb6e7062e819bbcbea14e357a15d5aef Mon Sep 17 00:00:00 2001
From: Dinah Baum <dinahbaum...@gmail.com>
Date: Thu, 5 Dec 2019 01:34:54 -0600
Subject: [PATCH 4/7] lxd/cluster: lxd/cluster: Add Arch

Signed-off-by: Dinah Baum <dinahbaum...@gmail.com>
---
 lxd/cluster/membership.go | 16 ++++++----------
 1 file changed, 6 insertions(+), 10 deletions(-)

diff --git a/lxd/cluster/membership.go b/lxd/cluster/membership.go
index b572400553..b55c5d2e95 100644
--- a/lxd/cluster/membership.go
+++ b/lxd/cluster/membership.go
@@ -18,9 +18,9 @@ import (
        "github.com/lxc/lxd/shared/api"
        "github.com/lxc/lxd/shared/log15"
        "github.com/lxc/lxd/shared/logger"
-       "github.com/lxc/lxd/shared/osarch"
        "github.com/lxc/lxd/shared/version"
        "github.com/pkg/errors"
+       "github.com/lxc/lxd/shared/osarch"
 )
 
 // Bootstrap turns a non-clustered LXD instance into the first (and leader)
@@ -156,7 +156,7 @@ func Bootstrap(state *state.State, gateway *Gateway, name 
string) error {
 //
 // Return an updated list raft database nodes (possibly including the newly
 // accepted node).
-func Accept(state *state.State, gateway *Gateway, name, address string, 
schema, api int) ([]db.RaftNode, error) {
+func Accept(state *state.State, gateway *Gateway, name, address string, 
schema, api, arch int) ([]db.RaftNode, error) {
        // Check parameters
        if name == "" {
                return nil, fmt.Errorf("node name must not be empty")
@@ -173,13 +173,6 @@ func Accept(state *state.State, gateway *Gateway, name, 
address string, schema,
                        return err
                }
 
-               // TODO: when fixing #6380 this should be replaced with the
-               // actual architecture of the foreign node.
-               arch, err := osarch.ArchitectureGetLocalID()
-               if err != nil {
-                       return err
-               }
-
                // Add the new node
                id, err := tx.NodeAddWithArch(name, address, arch)
                if err != nil {
@@ -223,7 +216,6 @@ func Accept(state *state.State, gateway *Gateway, name, 
address string, schema,
                        return nil, errors.Wrap(err, "Failed to insert new node 
into raft_nodes")
                }
        }
-
        return nodes, nil
 }
 
@@ -818,6 +810,10 @@ func List(state *state.State) ([]api.ClusterMember, error) 
{
                result[i].URL = fmt.Sprintf("https://%s";, node.Address)
                result[i].Database = 
shared.StringInSlice(string(db.ClusterRoleDatabase), node.Roles)
                result[i].Roles = node.Roles
+               result[i].Arch, err = osarch.ArchitectureName(node.Arch)
+               if err != nil {
+                       return nil, err
+               }
                if node.IsOffline(offlineThreshold) {
                        result[i].Status = "Offline"
                        result[i].Message = fmt.Sprintf(

From a15b35a05e1eec6e95fa742dec32db9b92277a81 Mon Sep 17 00:00:00 2001
From: Dinah Baum <dinahbaum...@gmail.com>
Date: Thu, 5 Dec 2019 01:35:20 -0600
Subject: [PATCH 5/7] lxd/db: add Arch to NodeInfo

Signed-off-by: Dinah Baum <dinahbaum...@gmail.com>
---
 lxd/db/node.go | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/lxd/db/node.go b/lxd/db/node.go
index 7bbf423f3a..a4bd2c9bd9 100644
--- a/lxd/db/node.go
+++ b/lxd/db/node.go
@@ -37,6 +37,7 @@ type NodeInfo struct {
        APIExtensions int       // Number of API extensions of the LXD code 
running on the node
        Heartbeat     time.Time // Timestamp of the last heartbeat
        Roles         []string  // List of cluster roles
+       Arch          int       // Node architecture
 }
 
 // IsOffline returns true if the last successful heartbeat time of the node is
@@ -270,6 +271,7 @@ func (c *ClusterTx) nodes(pending bool, where string, args 
...interface{}) ([]No
                        &nodes[i].Schema,
                        &nodes[i].APIExtensions,
                        &nodes[i].Heartbeat,
+                       &nodes[i].Arch,
                }
        }
        if pending {
@@ -279,7 +281,7 @@ func (c *ClusterTx) nodes(pending bool, where string, args 
...interface{}) ([]No
        }
 
        // Get the node entries
-       sql = "SELECT id, name, address, description, schema, api_extensions, 
heartbeat FROM nodes WHERE pending=?"
+       sql = "SELECT id, name, address, description, schema, api_extensions, 
heartbeat, arch FROM nodes WHERE pending=?"
        if where != "" {
                sql += fmt.Sprintf("AND %s ", where)
        }
@@ -580,6 +582,7 @@ func (c *ClusterTx) NodeOfflineThreshold() (time.Duration, 
error) {
 // the least number of containers (either already created or being created with
 // an operation).
 func (c *ClusterTx) NodeWithLeastContainers() (string, error) {
+       fmt.Println("NodeWithLeastContainers")
        threshold, err := c.NodeOfflineThreshold()
        if err != nil {
                return "", errors.Wrap(err, "failed to get offline threshold")

From a874b95e1da78193d02181451a1859939a14b006 Mon Sep 17 00:00:00 2001
From: Dinah Baum <dinahbaum...@gmail.com>
Date: Thu, 5 Dec 2019 01:37:28 -0600
Subject: [PATCH 6/7]  shared/api: Add Arch

Signed-off-by: Dinah Baum <dinahbaum...@gmail.com>
---
 shared/api/cluster.go | 1 +
 1 file changed, 1 insertion(+)

diff --git a/shared/api/cluster.go b/shared/api/cluster.go
index c773929c8d..ed86786f2d 100644
--- a/shared/api/cluster.go
+++ b/shared/api/cluster.go
@@ -60,4 +60,5 @@ type ClusterMember struct {
 
        // API extension: clustering_roles
        Roles []string `json:"roles" yaml:"roles"`
+       Arch    string `json:"arch" yaml:"arch"`
 }

From 5bb4dbe117696ca83a4f6fd58a003ca18a1f9149 Mon Sep 17 00:00:00 2001
From: Dinah Baum <dinahbaum...@gmail.com>
Date: Thu, 5 Dec 2019 01:41:09 -0600
Subject: [PATCH 7/7] lxd: AcceptMember sets a node's architecture

Signed-off-by: Dinah Baum <dinahbaum...@gmail.com>
---
 lxd/api_cluster.go | 30 ++++++++++++++----------------
 1 file changed, 14 insertions(+), 16 deletions(-)

diff --git a/lxd/api_cluster.go b/lxd/api_cluster.go
index 209fb08ed4..4c8075ad3c 100644
--- a/lxd/api_cluster.go
+++ b/lxd/api_cluster.go
@@ -27,6 +27,7 @@ import (
        "github.com/lxc/lxd/shared"
        "github.com/lxc/lxd/shared/api"
        "github.com/lxc/lxd/shared/logger"
+       "github.com/lxc/lxd/shared/osarch"
        "github.com/lxc/lxd/shared/version"
 )
 
@@ -608,11 +609,10 @@ func clusterPutJoin(d *Daemon, req api.ClusterPut) 
response.Response {
                // Add the cluster flag from the agent
                version.UserAgentFeatures([]string{"cluster"})
 
-               client, err = cluster.Connect(req.ClusterAddress, 
d.endpoints.NetworkCert(), true)
+               client, err = cluster.Connect(req.ClusterAddress, 
d.endpoints.NetworkCert(), false)
                if err != nil {
                        return err
                }
-
                err = clusterRebalance(client)
                if err != nil {
                        return err
@@ -807,7 +807,10 @@ func clusterAcceptMember(
        client lxd.InstanceServer,
        name, address string, schema, apiExt int,
        pools []api.StoragePool, networks []api.Network) 
(*internalClusterPostAcceptResponse, error) {
-
+       var arch, err = osarch.ArchitectureGetLocalID()
+       if err != nil {
+               return nil, err
+       }
        req := internalClusterPostAcceptRequest{
                Name:         name,
                Address:      address,
@@ -815,6 +818,7 @@ func clusterAcceptMember(
                API:          apiExt,
                StoragePools: pools,
                Networks:     networks,
+               Arch:         arch,
        }
        info := &internalClusterPostAcceptResponse{}
        resp, _, err := client.RawQuery("POST", "/internal/cluster/accept", 
req, "")
@@ -923,12 +927,10 @@ func clusterNodeDelete(d *Daemon, r *http.Request) 
response.Response {
                if err != nil {
                        return response.SmartError(err)
                }
-
                networks, err := d.cluster.Networks()
                if err != nil {
                        return response.SmartError(err)
                }
-
                for _, name := range networks {
                        err := client.DeleteNetwork(name)
                        if err != nil {
@@ -941,7 +943,6 @@ func clusterNodeDelete(d *Daemon, r *http.Request) 
response.Response {
                if err != nil && err != db.ErrNoSuchObject {
                        return response.SmartError(err)
                }
-
                for _, name := range pools {
                        err := client.DeleteStoragePool(name)
                        if err != nil {
@@ -965,11 +966,10 @@ func clusterNodeDelete(d *Daemon, r *http.Request) 
response.Response {
        if force != 1 {
                // Try to gracefully reset the database on the node.
                cert := d.endpoints.NetworkCert()
-               client, err := cluster.Connect(address, cert, true)
+               client, err := cluster.Connect(address, cert, false)
                if err != nil {
                        return response.SmartError(err)
                }
-
                put := api.ClusterPut{}
                put.Enabled = false
                _, err = client.UpdateCluster(put, "")
@@ -987,19 +987,17 @@ func tryClusterRebalance(d *Daemon) error {
        leader, err := d.gateway.LeaderAddress()
        if err != nil {
                // This is not a fatal error, so let's just log it.
-               return errors.Wrap(err, "Failed to get current leader member")
+               return errors.Wrap(err, "failed to get current leader member")
        }
        cert := d.endpoints.NetworkCert()
        client, err := cluster.Connect(leader, cert, true)
        if err != nil {
-               return errors.Wrap(err, "Failed to connect to leader member")
+               return errors.Wrap(err, "failed to connect to leader member")
        }
-
        _, _, err = client.RawQuery("POST", "/internal/cluster/rebalance", nil, 
"")
        if err != nil {
-               return errors.Wrap(err, "Request to rebalance cluster failed")
+               return errors.Wrap(err, "request to rebalance cluster failed")
        }
-
        return nil
 }
 
@@ -1048,7 +1046,7 @@ func internalClusterPostAccept(d *Daemon, r 
*http.Request) response.Response {
                return response.SmartError(err)
        }
 
-       nodes, err := cluster.Accept(d.State(), d.gateway, req.Name, 
req.Address, req.Schema, req.API)
+       nodes, err := cluster.Accept(d.State(), d.gateway, req.Name, 
req.Address, req.Schema, req.API, req.Arch)
        if err != nil {
                return response.BadRequest(err)
        }
@@ -1071,6 +1069,7 @@ type internalClusterPostAcceptRequest struct {
        API          int               `json:"api" yaml:"api"`
        StoragePools []api.StoragePool `json:"storage_pools" 
yaml:"storage_pools"`
        Networks     []api.Network     `json:"networks" yaml:"networks"`
+       Arch         int               `json:"arch" yaml:"arch"`
 }
 
 // A Response for the /internal/cluster/accept endpoint.
@@ -1162,11 +1161,10 @@ func internalClusterPostRebalance(d *Daemon, r 
*http.Request) response.Response
        }
 
        cert := d.endpoints.NetworkCert()
-       client, err := cluster.Connect(address, cert, true)
+       client, err := cluster.Connect(address, cert, false)
        if err != nil {
                return response.SmartError(err)
        }
-
        _, _, err = client.RawQuery("POST", "/internal/cluster/promote", post, 
"")
        if err != nil {
                return response.SmartError(err)
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to