wesher/cluster/state.go

64 lines
1.4 KiB
Go
Raw Normal View History

2020-05-07 12:26:55 +02:00
package cluster
import (
"encoding/json"
"fmt"
2020-05-07 12:26:55 +02:00
"io/ioutil"
"os"
"path"
"github.com/costela/wesher/common"
"github.com/sirupsen/logrus"
)
// State keeps track of information needed to rejoin the cluster
type state struct {
2020-05-07 12:26:55 +02:00
ClusterKey []byte
Nodes []common.Node
}
var statePathTemplate = "/var/lib/wesher/%s.json"
const deprecatedStatePath = "/var/lib/wesher/state.json"
2020-05-07 12:26:55 +02:00
func (s *state) save(clusterName string) error {
statePath := fmt.Sprintf(statePathTemplate, clusterName)
2020-05-07 12:26:55 +02:00
if err := os.MkdirAll(path.Dir(statePath), 0700); err != nil {
return err
}
2020-05-10 16:59:51 +02:00
stateOut, err := json.MarshalIndent(s, "", " ")
2020-05-07 12:26:55 +02:00
if err != nil {
return err
}
return ioutil.WriteFile(statePath, stateOut, 0600)
}
func loadState(cs *state, clusterName string) {
statePath := fmt.Sprintf(statePathTemplate, clusterName)
2020-05-07 12:26:55 +02:00
content, err := ioutil.ReadFile(statePath)
if err != nil {
// try the deprecated pre 0.3 state path, it will later
// be saved to the proper path
if os.IsNotExist(err) {
content, err = ioutil.ReadFile(deprecatedStatePath)
}
if err != nil {
if !os.IsNotExist(err) {
logrus.Warnf("could not open state in %s: %s", statePath, err)
}
return
2020-05-07 12:26:55 +02:00
}
}
// avoid partially unmarshalled content by using a temp var
csTmp := &state{}
2020-05-07 12:26:55 +02:00
if err := json.Unmarshal(content, csTmp); err != nil {
logrus.Warnf("could not decode state: %s", err)
} else {
*cs = *csTmp
}
}