From adc7a807df8c471b6c70ab5137db09e9694ba139 Mon Sep 17 00:00:00 2001 From: kaiyou Date: Fri, 15 May 2020 10:17:11 +0200 Subject: [PATCH] Expose ClusterName instead of Banner/StatePath --- cluster/cluster.go | 16 ++++++++-------- cluster/state.go | 15 ++++++--------- cluster/state_test.go | 6 +++--- config.go | 3 +-- main.go | 4 ++-- tests/e2e.sh | 4 ++-- 6 files changed, 22 insertions(+), 26 deletions(-) diff --git a/cluster/cluster.go b/cluster/cluster.go index 8258ce7..f7ca417 100644 --- a/cluster/cluster.go +++ b/cluster/cluster.go @@ -19,21 +19,21 @@ const KeyLen = 32 // Cluster represents a running cluster configuration type Cluster struct { + name string ml *memberlist.Memberlist mlConfig *memberlist.Config localNode *common.Node LocalName string - statePath string state *state events chan memberlist.NodeEvent } // New is used to create a new Cluster instance // The returned instance is ready to be updated with the local node settings then joined -func New(init bool, clusterKey []byte, bindAddr string, bindPort int, statePath string, useIPAsName bool) (*Cluster, error) { +func New(name string, init bool, clusterKey []byte, bindAddr string, bindPort int, useIPAsName bool) (*Cluster, error) { state := &state{} if !init { - loadState(state, statePath) + loadState(state, name) } clusterKey, err := computeClusterKey(state, clusterKey) @@ -57,14 +57,14 @@ func New(init bool, clusterKey []byte, bindAddr string, bindPort int, statePath } cluster := Cluster{ + name: name, ml: ml, mlConfig: mlConfig, LocalName: ml.LocalNode().Name, // The big channel buffer is a work-around for https://github.com/hashicorp/memberlist/issues/23 // More than this many simultaneous events will deadlock cluster.members() - events: make(chan memberlist.NodeEvent, 100), - state: state, - statePath: statePath, + events: make(chan memberlist.NodeEvent, 100), + state: state, } return &cluster, nil } @@ -96,7 +96,7 @@ func (c *Cluster) Join(addrs []string) error { // Leave saves the current state before leaving, then leaves the cluster func (c *Cluster) Leave() { - c.state.save(c.statePath) + c.state.save(c.name) c.ml.Leave(10 * time.Second) c.ml.Shutdown() //nolint: errcheck } @@ -146,7 +146,7 @@ func (c *Cluster) Members() <-chan []common.Node { } c.state.Nodes = nodes changes <- nodes - c.state.save(c.statePath) + c.state.save(c.name) } }() return changes diff --git a/cluster/state.go b/cluster/state.go index 1904b5a..66b54b3 100644 --- a/cluster/state.go +++ b/cluster/state.go @@ -2,6 +2,7 @@ package cluster import ( "encoding/json" + "fmt" "io/ioutil" "os" "path" @@ -16,12 +17,10 @@ type state struct { Nodes []common.Node } -const defaultStatePath = "/var/lib/wesher/state.json" +var defaultStatePath = "/var/lib/wesher/%s.json" -func (s *state) save(statePath string) error { - if statePath == "" { - statePath = defaultStatePath - } +func (s *state) save(clusterName string) error { + statePath := fmt.Sprintf(defaultStatePath, clusterName) if err := os.MkdirAll(path.Dir(statePath), 0700); err != nil { return err } @@ -34,10 +33,8 @@ func (s *state) save(statePath string) error { return ioutil.WriteFile(statePath, stateOut, 0600) } -func loadState(cs *state, statePath string) { - if statePath == "" { - statePath = defaultStatePath - } +func loadState(cs *state, clusterName string) { + statePath := fmt.Sprintf(defaultStatePath, clusterName) content, err := ioutil.ReadFile(statePath) if err != nil { if !os.IsNotExist(err) { diff --git a/cluster/state_test.go b/cluster/state_test.go index c5e0944..af422ce 100644 --- a/cluster/state_test.go +++ b/cluster/state_test.go @@ -9,7 +9,7 @@ import ( ) func Test_state_save_soad(t *testing.T) { - statePath := "/tmp/wesher.json" + defaultStatePath = "/tmp/%s.json" key := "abcdefghijklmnopqrstuvwxyzABCDEF" node := common.Node{ Name: "node", @@ -23,11 +23,11 @@ func Test_state_save_soad(t *testing.T) { }, } - if err := cluster.state.save(statePath); err != nil { + if err := cluster.state.save("test"); err != nil { t.Error(err) } loaded := &state{} - loadState(loaded, statePath) + loadState(loaded, "test") if !reflect.DeepEqual(cluster.state, loaded) { t.Errorf("cluster state save then reload mistmatch: %s / %s", cluster.state, loaded) diff --git a/config.go b/config.go index 6c290c6..48f4713 100644 --- a/config.go +++ b/config.go @@ -14,8 +14,7 @@ type config struct { ClusterKey []byte `id:"cluster-key" desc:"shared key for cluster membership; must be 32 bytes base64 encoded; will be generated if not provided"` Join []string `desc:"comma separated list of hostnames or IP addresses to existing cluster members; if not provided, will attempt resuming any known state or otherwise wait for further members."` Init bool `desc:"whether to explicitly (re)initialize the cluster; any known state from previous runs will be forgotten"` - Banner string `id:"banner" desc:"a string appended to /etc/hosts banner to discriminate between multiple running clusters"` - StatePath string `id:"state-path" desc:"path where the cluster state is stored; optional, depends on cluster name if not set"` + ClusterName string `id:"cluster-name" desc:"identifier for the wesher cluster; can be used to peer with multiple clusters" default:"default"` BindAddr string `id:"bind-addr" desc:"IP address to bind to for cluster membership traffic (cannot be used with --bind-iface)"` BindIface string `id:"bind-iface" desc:"Interface to bind to for cluster membership traffic (cannot be used with --bind-addr)"` ClusterPort int `id:"cluster-port" desc:"port used for membership gossip traffic (both TCP and UDP); must be the same across cluster" default:"7946"` diff --git a/main.go b/main.go index 84aaecb..e7b1ba1 100644 --- a/main.go +++ b/main.go @@ -35,7 +35,7 @@ func main() { logrus.SetLevel(logLevel) // Create the wireguard and cluster configuration - cluster, err := cluster.New(config.Init, config.ClusterKey, config.BindAddr, config.ClusterPort, config.StatePath, config.UseIPAsName) + cluster, err := cluster.New(config.ClusterName, config.Init, config.ClusterKey, config.BindAddr, config.ClusterPort, config.UseIPAsName) if err != nil { logrus.WithError(err).Fatal("could not create cluster") } @@ -46,7 +46,7 @@ func main() { // Prepare the /etc/hosts writer hostsFile := &etchosts.EtcHosts{ - Banner: "# ! managed automatically by wesher " + config.Banner, + Banner: "# ! managed automatically by wesher " + config.ClusterName, Logger: logrus.StandardLogger(), } diff --git a/tests/e2e.sh b/tests/e2e.sh index f66451f..1165b31 100755 --- a/tests/e2e.sh +++ b/tests/e2e.sh @@ -101,8 +101,8 @@ test_cluster_simultaneous_start() { } test_multiple_clusters_restart() { - cluster1='--cluster-port 7946 --wireguard-port 51820 --banner cluster1 --state-path /var/lib/wesher/cluster1.json --interface wgoverlay --overlay-net 10.10.0.0/16' - cluster2='--cluster-port 7947 --wireguard-port 51821 --banner cluster2 --state-path /var/lib/wesher/cluster2.json --interface wgoverlay2 --overlay-net 10.11.0.0/16' + cluster1='--cluster-port 7946 --wireguard-port 51820 --cluster-name cluster1 --interface wgoverlay --overlay-net 10.10.0.0/16' + cluster2='--cluster-port 7947 --wireguard-port 51821 --cluster-name cluster2 --interface wgoverlay2 --overlay-net 10.11.0.0/16' setup_wireguard='wireguard-go wgoverlay2 2>/dev/null >/dev/null' join_cluster2="nohup /app/wesher --cluster-key 'ILICZ3yBMCGAWNIq5Pn0bewBVimW3Q2yRVJ/Be+b1Uc=' --join test2-orig $cluster2 2>/dev/null &"