member.go 974 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. package etcdserver
  2. import (
  3. "crypto/sha1"
  4. "encoding/binary"
  5. "fmt"
  6. "path"
  7. "strconv"
  8. "time"
  9. "github.com/coreos/etcd/pkg/types"
  10. )
  11. const machineKVPrefix = "/_etcd/machines/"
  12. type Member struct {
  13. ID int64
  14. Name string
  15. // TODO(philips): ensure these are URLs
  16. PeerURLs []string
  17. ClientURLs []string
  18. }
  19. // newMember creates a Member without an ID and generates one based on the
  20. // name, peer URLs. This is used for bootstrapping.
  21. func newMember(name string, peerURLs types.URLs, now *time.Time) *Member {
  22. m := &Member{Name: name, PeerURLs: peerURLs.StringSlice()}
  23. b := []byte(m.Name)
  24. for _, p := range m.PeerURLs {
  25. b = append(b, []byte(p)...)
  26. }
  27. if now != nil {
  28. b = append(b, []byte(fmt.Sprintf("%d", now.Unix()))...)
  29. }
  30. hash := sha1.Sum(b)
  31. m.ID = int64(binary.BigEndian.Uint64(hash[:8]))
  32. if m.ID < 0 {
  33. m.ID = m.ID * -1
  34. }
  35. return m
  36. }
  37. func (m Member) storeKey() string {
  38. return path.Join(machineKVPrefix, strconv.FormatUint(uint64(m.ID), 16))
  39. }