Use the StatePath to config when loading the state
This commit is contained in:
parent
a0882dad49
commit
31b8263e96
|
@ -23,16 +23,17 @@ type Cluster struct {
|
||||||
mlConfig *memberlist.Config
|
mlConfig *memberlist.Config
|
||||||
localNode *common.Node
|
localNode *common.Node
|
||||||
LocalName string
|
LocalName string
|
||||||
|
statePath string
|
||||||
state *state
|
state *state
|
||||||
events chan memberlist.NodeEvent
|
events chan memberlist.NodeEvent
|
||||||
}
|
}
|
||||||
|
|
||||||
// New is used to create a new Cluster instance
|
// New is used to create a new Cluster instance
|
||||||
// The returned instance is ready to be updated with the local node settings then joined
|
// 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, useIPAsName bool) (*Cluster, error) {
|
func New(init bool, clusterKey []byte, bindAddr string, bindPort int, statePath string, useIPAsName bool) (*Cluster, error) {
|
||||||
state := &state{}
|
state := &state{}
|
||||||
if !init {
|
if !init {
|
||||||
loadState(state)
|
loadState(state, statePath)
|
||||||
}
|
}
|
||||||
|
|
||||||
clusterKey, err := computeClusterKey(state, clusterKey)
|
clusterKey, err := computeClusterKey(state, clusterKey)
|
||||||
|
@ -61,8 +62,9 @@ func New(init bool, clusterKey []byte, bindAddr string, bindPort int, useIPAsNam
|
||||||
LocalName: ml.LocalNode().Name,
|
LocalName: ml.LocalNode().Name,
|
||||||
// The big channel buffer is a work-around for https://github.com/hashicorp/memberlist/issues/23
|
// 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()
|
// More than this many simultaneous events will deadlock cluster.members()
|
||||||
events: make(chan memberlist.NodeEvent, 100),
|
events: make(chan memberlist.NodeEvent, 100),
|
||||||
state: state,
|
state: state,
|
||||||
|
statePath: statePath,
|
||||||
}
|
}
|
||||||
return &cluster, nil
|
return &cluster, nil
|
||||||
}
|
}
|
||||||
|
@ -94,7 +96,7 @@ func (c *Cluster) Join(addrs []string) error {
|
||||||
|
|
||||||
// Leave saves the current state before leaving, then leaves the cluster
|
// Leave saves the current state before leaving, then leaves the cluster
|
||||||
func (c *Cluster) Leave() {
|
func (c *Cluster) Leave() {
|
||||||
c.state.save()
|
c.state.save(c.statePath)
|
||||||
c.ml.Leave(10 * time.Second)
|
c.ml.Leave(10 * time.Second)
|
||||||
c.ml.Shutdown() //nolint: errcheck
|
c.ml.Shutdown() //nolint: errcheck
|
||||||
}
|
}
|
||||||
|
@ -144,7 +146,7 @@ func (c *Cluster) Members() <-chan []common.Node {
|
||||||
}
|
}
|
||||||
c.state.Nodes = nodes
|
c.state.Nodes = nodes
|
||||||
changes <- nodes
|
changes <- nodes
|
||||||
c.state.save()
|
c.state.save(c.statePath)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
return changes
|
return changes
|
||||||
|
|
|
@ -16,10 +16,12 @@ type state struct {
|
||||||
Nodes []common.Node
|
Nodes []common.Node
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: this should be replaced by a configurable path later
|
const defaultStatePath = "/var/lib/wesher/state.json"
|
||||||
var statePath = "/var/lib/wesher/state.json"
|
|
||||||
|
|
||||||
func (s *state) save() error {
|
func (s *state) save(statePath string) error {
|
||||||
|
if statePath == "" {
|
||||||
|
statePath = defaultStatePath
|
||||||
|
}
|
||||||
if err := os.MkdirAll(path.Dir(statePath), 0700); err != nil {
|
if err := os.MkdirAll(path.Dir(statePath), 0700); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -32,7 +34,10 @@ func (s *state) save() error {
|
||||||
return ioutil.WriteFile(statePath, stateOut, 0600)
|
return ioutil.WriteFile(statePath, stateOut, 0600)
|
||||||
}
|
}
|
||||||
|
|
||||||
func loadState(cs *state) {
|
func loadState(cs *state, statePath string) {
|
||||||
|
if statePath == "" {
|
||||||
|
statePath = defaultStatePath
|
||||||
|
}
|
||||||
content, err := ioutil.ReadFile(statePath)
|
content, err := ioutil.ReadFile(statePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if !os.IsNotExist(err) {
|
if !os.IsNotExist(err) {
|
||||||
|
|
2
main.go
2
main.go
|
@ -35,7 +35,7 @@ func main() {
|
||||||
logrus.SetLevel(logLevel)
|
logrus.SetLevel(logLevel)
|
||||||
|
|
||||||
// Create the wireguard and cluster configuration
|
// Create the wireguard and cluster configuration
|
||||||
cluster, err := cluster.New(config.Init, config.ClusterKey, config.BindAddr, config.ClusterPort, config.UseIPAsName)
|
cluster, err := cluster.New(config.Init, config.ClusterKey, config.BindAddr, config.ClusterPort, config.StatePath, config.UseIPAsName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logrus.WithError(err).Fatal("could not create cluster")
|
logrus.WithError(err).Fatal("could not create cluster")
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue