package serf import ( "net" "github.com/hashicorp/memberlist" ) type MergeDelegate interface { NotifyMerge([]*Member) error } type mergeDelegate struct { serf *Serf } func (m *mergeDelegate) NotifyMerge(nodes []*memberlist.Node) error { members := make([]*Member, len(nodes)) for idx, n := range nodes { members[idx] = m.nodeToMember(n) } return m.serf.config.Merge.NotifyMerge(members) } func (m *mergeDelegate) NotifyAlive(peer *memberlist.Node) error { member := m.nodeToMember(peer) return m.serf.config.Merge.NotifyMerge([]*Member{member}) } func (m *mergeDelegate) nodeToMember(n *memberlist.Node) *Member { status := StatusNone if n.State == memberlist.StateLeft { status = StatusLeft } return &Member{ Name: n.Name, Addr: net.IP(n.Addr), Port: n.Port, Tags: m.serf.decodeTags(n.Meta), Status: status, ProtocolMin: n.PMin, ProtocolMax: n.PMax, ProtocolCur: n.PCur, DelegateMin: n.DMin, DelegateMax: n.DMax, DelegateCur: n.DCur, } }