Ver Fonte

tools/functional-tester/etcd-tester: report agent status

Xiang Li há 10 anos atrás
pai
commit
46ebb83b90

+ 23 - 0
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 {

+ 10 - 4
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) {