Skip to content

Commit

Permalink
Merge pull request #6519 from mitake/functional-tester
Browse files Browse the repository at this point in the history
functional-tester: decoupling functionalities of etcd-tester
  • Loading branch information
gyuho committed Sep 29, 2016
2 parents 868617e + 7d48855 commit dac6e70
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 18 deletions.
5 changes: 5 additions & 0 deletions tools/functional-tester/etcd-tester/failure.go
Original file line number Diff line number Diff line change
Expand Up @@ -172,3 +172,8 @@ func killMap(size int, seed int) map[int]bool {
}
}
}

type failureNop failureByFunc

func (f *failureNop) Inject(c *cluster, round int) error { return nil }
func (f *failureNop) Recover(c *cluster, round int) error { return nil }
6 changes: 6 additions & 0 deletions tools/functional-tester/etcd-tester/failure_agent.go
Original file line number Diff line number Diff line change
Expand Up @@ -139,3 +139,9 @@ func newFailureSlowNetworkAll() failure {
recoverMember: recoverLatency,
}
}

func newFailureNop() failure {
return &failureNop{
description: "no failure",
}
}
67 changes: 49 additions & 18 deletions tools/functional-tester/etcd-tester/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ func main() {
consistencyCheck := flag.Bool("consistency-check", true, "true to check consistency (revision, hash)")
isV2Only := flag.Bool("v2-only", false, "'true' to run V2 only tester.")
stresserType := flag.String("stresser", "default", "specify stresser (\"default\" or \"nop\").")
failureTypes := flag.String("failures", "default,failpoints", "specify failures (concat of \"default\" and \"failpoints\").")
flag.Parse()

eps := strings.Split(*endpointStr, ",")
Expand Down Expand Up @@ -83,27 +84,19 @@ func main() {
}
defer c.Terminate()

failures := []failure{
newFailureKillAll(),
newFailureKillMajority(),
newFailureKillOne(),
newFailureKillLeader(),
newFailureKillOneForLongTime(),
newFailureKillLeaderForLongTime(),
newFailureIsolate(),
newFailureIsolateAll(),
newFailureSlowNetworkOneMember(),
newFailureSlowNetworkLeader(),
newFailureSlowNetworkAll(),
}

// ensure cluster is fully booted to know failpoints are available
c.WaitHealth()
fpFailures, fperr := failpointFailures(c)
if len(fpFailures) == 0 {
plog.Infof("no failpoints found (%v)", fperr)

var failures []failure

if failureTypes != nil && *failureTypes != "" {
failures = makeFailures(*failureTypes, c)
}

if len(failures) == 0 {
plog.Infof("no failures\n")
failures = append(failures, newFailureNop())
}
failures = append(failures, fpFailures...)

schedule := failures
if schedCases != nil && *schedCases != "" {
Expand Down Expand Up @@ -160,3 +153,41 @@ func portsFromArg(arg string, n, defaultPort int) []int {
}
return ret
}

func makeFailures(types string, c *cluster) []failure {
var failures []failure

fails := strings.Split(types, ",")
for i := range fails {
switch fails[i] {
case "default":
defaultFailures := []failure{
newFailureKillAll(),
newFailureKillMajority(),
newFailureKillOne(),
newFailureKillLeader(),
newFailureKillOneForLongTime(),
newFailureKillLeaderForLongTime(),
newFailureIsolate(),
newFailureIsolateAll(),
newFailureSlowNetworkOneMember(),
newFailureSlowNetworkLeader(),
newFailureSlowNetworkAll(),
}
failures = append(failures, defaultFailures...)

case "failpoints":
fpFailures, fperr := failpointFailures(c)
if len(fpFailures) == 0 {
plog.Infof("no failpoints found (%v)", fperr)
}
failures = append(failures, fpFailures...)

default:
plog.Errorf("unknown failure: %s\n", fails[i])
os.Exit(1)
}
}

return failures
}

0 comments on commit dac6e70

Please sign in to comment.