diff --git a/tools/functional-tester/etcd-tester/failure.go b/tools/functional-tester/etcd-tester/failure.go index dbfa5560c..fc8aebe39 100644 --- a/tools/functional-tester/etcd-tester/failure.go +++ b/tools/functional-tester/etcd-tester/failure.go @@ -14,6 +14,8 @@ package main +import "math/rand" + type failure interface { // Inject injeccts the failure into the testing cluster at the given // round. When calling the function, the cluster should be in health. @@ -28,3 +30,71 @@ type failure interface { type description string func (d description) Desc() string { return string(d) } + +type failureKillAll struct { + description +} + +func newFailureKillAll() *failureKillAll { + return &failureKillAll{ + description: "kill all members", + } +} + +func (f *failureKillAll) Inject(c *cluster, round int) error { + for _, a := range c.Agents { + if err := a.Stop(); err != nil { + return err + } + } + return nil +} + +func (f *failureKillAll) Recover(c *cluster, round int) error { + for _, a := range c.Agents { + if _, err := a.Restart(); err != nil { + return err + } + } + return c.WaitHealth() +} + +type failureKillMajority struct { + description +} + +func newFailureKillMajority() *failureKillMajority { + return &failureKillMajority{ + description: "kill majority of the cluster", + } +} + +func (f *failureKillMajority) Inject(c *cluster, round int) error { + for i := range getToKillMap(c.Size, round) { + if err := c.Agents[i].Stop(); err != nil { + return err + } + } + return nil +} + +func (f *failureKillMajority) Recover(c *cluster, round int) error { + for i := range getToKillMap(c.Size, round) { + if _, err := c.Agents[i].Restart(); err != nil { + return err + } + } + return c.WaitHealth() +} + +func getToKillMap(size int, seed int) map[int]bool { + m := make(map[int]bool) + r := rand.New(rand.NewSource(int64(seed))) + majority := size/2 + 1 + for { + m[r.Intn(size)] = true + if len(m) >= majority { + return m + } + } +} diff --git a/tools/functional-tester/etcd-tester/failure_killall.go b/tools/functional-tester/etcd-tester/failure_killall.go deleted file mode 100644 index 9a9cbb7d8..000000000 --- a/tools/functional-tester/etcd-tester/failure_killall.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2015 CoreOS, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package main - -type failureKillAll struct { - description -} - -func newFailureKillAll() *failureKillAll { - return &failureKillAll{ - description: "kill all members", - } -} - -func (f *failureKillAll) Inject(c *cluster, round int) error { - for _, a := range c.Agents { - if err := a.Stop(); err != nil { - return err - } - } - return nil -} - -func (f *failureKillAll) Recover(c *cluster, round int) error { - for _, a := range c.Agents { - if _, err := a.Restart(); err != nil { - return err - } - } - return c.WaitHealth() -} diff --git a/tools/functional-tester/etcd-tester/failure_killmaj.go b/tools/functional-tester/etcd-tester/failure_killmaj.go deleted file mode 100644 index 8ccd566e9..000000000 --- a/tools/functional-tester/etcd-tester/failure_killmaj.go +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright 2015 CoreOS, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package main - -import "math/rand" - -type failureKillMajority struct { - description -} - -func newFailureKillMajority() *failureKillMajority { - return &failureKillMajority{ - description: "kill majority of the cluster", - } -} - -func (f *failureKillMajority) Inject(c *cluster, round int) error { - for i := range getToKillMap(c.Size, round) { - if err := c.Agents[i].Stop(); err != nil { - return err - } - } - return nil -} - -func (f *failureKillMajority) Recover(c *cluster, round int) error { - for i := range getToKillMap(c.Size, round) { - if _, err := c.Agents[i].Restart(); err != nil { - return err - } - } - return c.WaitHealth() -} - -func getToKillMap(size int, seed int) map[int]bool { - m := make(map[int]bool) - r := rand.New(rand.NewSource(int64(seed))) - majority := size/2 + 1 - for { - m[r.Intn(size)] = true - if len(m) >= majority { - return m - } - } -} diff --git a/tools/functional-tester/etcd-tester/failure_no.go b/tools/functional-tester/etcd-tester/failure_no.go deleted file mode 100644 index 999880f4d..000000000 --- a/tools/functional-tester/etcd-tester/failure_no.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2015 CoreOS, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package main - -type failureBase struct { - description -} - -func newFailureBase() *failureBase { - return &failureBase{ - description: "do nothing", - } -} - -func (f *failureBase) Inject(c *cluster, round int) error { return nil } - -func (f *failureBase) Recover(c *cluster, round int) error { return nil } diff --git a/tools/functional-tester/etcd-tester/main.go b/tools/functional-tester/etcd-tester/main.go index 6360c6b87..d0d4c2b0d 100644 --- a/tools/functional-tester/etcd-tester/main.go +++ b/tools/functional-tester/etcd-tester/main.go @@ -44,7 +44,7 @@ func main() { } t := &tester{ - failures: []failure{newFailureBase(), newFailureKillAll(), newFailureKillMajority()}, + failures: []failure{newFailureKillAll(), newFailureKillMajority()}, cluster: c, limit: *limit, }