diff --git a/tools/functional-tester/etcd-tester/cluster.go b/tools/functional-tester/etcd-tester/cluster.go index 876d57e7c..6c04f9c14 100644 --- a/tools/functional-tester/etcd-tester/cluster.go +++ b/tools/functional-tester/etcd-tester/cluster.go @@ -16,6 +16,7 @@ package main import ( "fmt" + "log" "math/rand" "net" "strings" @@ -37,6 +38,10 @@ type cluster struct { ClientURLs []string } +type ClusterStatus struct { + AgentStatuses map[string]client.Status +} + // newCluster starts and returns a new cluster. The caller should call Terminate when finished, to shut it down. func newCluster(agentEndpoints []string, datadir string) (*cluster, error) { c := &cluster{ @@ -160,6 +165,24 @@ func (c *cluster) Terminate() { } } +func (c *cluster) Status() ClusterStatus { + cs := ClusterStatus{ + AgentStatuses: make(map[string]client.Status), + } + + for i, a := range c.Agents { + s, err := a.Status() + // TODO: add a.Desc() as a key of the map + desc := c.agentEndpoints[i] + if err != nil { + cs.AgentStatuses[desc] = client.Status{State: "unknown"} + log.Printf("etcd-tester: failed to get the status of agent [%s]", desc) + } + cs.AgentStatuses[desc] = s + } + return cs +} + // setHealthKey sets health key on all given urls. func setHealthKey(us []string) error { for _, u := range us { diff --git a/tools/functional-tester/etcd-tester/tester.go b/tools/functional-tester/etcd-tester/tester.go index 03bbdb8cb..fd27b6102 100644 --- a/tools/functional-tester/etcd-tester/tester.go +++ b/tools/functional-tester/etcd-tester/tester.go @@ -31,6 +31,7 @@ type tester struct { func (tt *tester) runLoop() { tt.status.Since = time.Now() tt.status.RoundLimit = tt.limit + tt.status.cluster = tt.cluster for _, f := range tt.failures { tt.status.Failures = append(tt.status.Failures, f.Desc()) } @@ -85,8 +86,10 @@ type Status struct { Failures []string RoundLimit int - mu sync.Mutex // guards Round and Case - // TODO: add agent status + Cluster ClusterStatus + cluster *cluster + + mu sync.Mutex // guards Round and Case Round int Case int } @@ -94,8 +97,11 @@ type Status struct { // get gets a copy of status func (s *Status) get() Status { s.mu.Lock() - defer s.mu.Unlock() - return *s + got := *s + cluster := s.cluster + s.mu.Unlock() + got.Cluster = cluster.Status() + return got } func (s *Status) setRound(r int) {