mirror of
https://github.com/0x1d/rcond.git
synced 2025-12-14 18:25:21 +01:00
56 lines
1.4 KiB
Go
56 lines
1.4 KiB
Go
package cluster
|
|
|
|
import (
|
|
"log"
|
|
|
|
"github.com/0x1d/rcond/pkg/config"
|
|
"github.com/hashicorp/serf/serf"
|
|
)
|
|
|
|
type Agent struct {
|
|
Serf *serf.Serf
|
|
}
|
|
|
|
func NewAgent(clusterConfig *config.ClusterConfig) (*Agent, error) {
|
|
config := serf.DefaultConfig()
|
|
config.NodeName = clusterConfig.NodeName
|
|
config.ProtocolVersion = serf.ProtocolVersionMax
|
|
config.MemberlistConfig.SecretKey = []byte(clusterConfig.SecretKey)
|
|
config.MemberlistConfig.AdvertiseAddr = clusterConfig.AdvertiseAddr
|
|
config.MemberlistConfig.AdvertisePort = clusterConfig.AdvertisePort
|
|
config.MemberlistConfig.BindAddr = clusterConfig.BindAddr
|
|
config.MemberlistConfig.BindPort = clusterConfig.BindPort
|
|
|
|
serf, err := serf.Create(config)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &Agent{Serf: serf}, nil
|
|
}
|
|
|
|
func (a *Agent) Members() ([]serf.Member, error) {
|
|
log.Printf("Getting members of the cluster")
|
|
return a.Serf.Members(), nil
|
|
}
|
|
|
|
func (a *Agent) Join(addrs []string, ignoreOld bool) (int, error) {
|
|
log.Printf("Joining nodes in the cluster: %v", addrs)
|
|
n, err := a.Serf.Join(addrs, ignoreOld)
|
|
if err != nil {
|
|
log.Printf("Failed to join nodes in the cluster: %v", err)
|
|
return 0, err
|
|
}
|
|
log.Printf("Joined %d nodes in the cluster", n)
|
|
return n, nil
|
|
}
|
|
|
|
func (a *Agent) Leave() error {
|
|
return a.Serf.Leave()
|
|
}
|
|
|
|
func (a *Agent) Shutdown() error {
|
|
log.Printf("Shutting down cluster agent")
|
|
return a.Serf.Shutdown()
|
|
}
|