From dca5874d4402ca5660d8a8bc2b63dbdda473727a Mon Sep 17 00:00:00 2001 From: nic-chen Date: Sat, 19 Mar 2022 00:46:42 +0800 Subject: [PATCH 1/7] tests: Migrate key value Get to common framework --- tests/common/alarm_test.go | 93 +++++++++++++++++++++++++++++++ tests/framework/config/cluster.go | 7 ++- tests/framework/e2e/etcdctl.go | 6 ++ tests/framework/integration.go | 9 +++ tests/framework/interface.go | 2 +- 5 files changed, 113 insertions(+), 4 deletions(-) create mode 100644 tests/common/alarm_test.go diff --git a/tests/common/alarm_test.go b/tests/common/alarm_test.go new file mode 100644 index 000000000..1d5708663 --- /dev/null +++ b/tests/common/alarm_test.go @@ -0,0 +1,93 @@ +// Copyright 2022 The etcd Authors +// +// 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 common + +import ( + "os" + "strings" + "testing" + "time" + + "go.etcd.io/etcd/tests/v3/framework/config" +) + +func TestAlarm(t *testing.T) { + testRunner.BeforeTest(t) + + clus := testRunner.NewCluster(t, config.ClusterConfig{ClusterSize: 3, QuotaBackendBytes: int64(13 * os.Getpagesize())}) + defer clus.Close() + + // test small put still works + smallbuf := strings.Repeat("a", 64) + if err := clus.Client().Put("1st_test", smallbuf); err != nil { + t.Fatalf("alarmTest: put kv error (%v)", err) + } + + // write some chunks to fill up the database + buf := strings.Repeat("b", os.Getpagesize()) + for { + if err := clus.Client().Put("2nd_test", buf); err != nil { + if !strings.Contains(err.Error(), "etcdserver: mvcc: database space exceeded") { + t.Fatal(err) + } + break + } + } + + // quota alarm should now be on + _, err := clus.Client().Alarm("list") + if err != nil { + t.Fatalf("alarmTest: Alarm error (%v)", err) + } + + // endpoint should not healthy + if err := clus.Client().Health(); err == nil { + t.Fatalf("endpoint should not healthy") + } + + // check that Put is rejected when alarm is on + if err := clus.Client().Put("3rd_test", smallbuf); err != nil { + if !strings.Contains(err.Error(), "etcdserver: mvcc: database space exceeded") { + t.Fatal(err) + } + } + + // get latest revision to compact + sresp, err := clus.Client().Status() + if err != nil { + t.Fatalf("get endpoint status error: %v", err) + } + + // make some space + _, err = clus.Client().Compact(sresp[0].Header.Revision, config.CompactOption{Physical: true, Timeout: 10 * time.Second}) + if err != nil { + t.Fatalf("alarmTest: Compact error (%v)", err) + } + + if err = clus.Client().Defragment(config.DefragOption{Timeout: 10 * time.Second}); err != nil { + t.Fatalf("alarmTest: defrag error (%v)", err) + } + + // turn off alarm + _, err = clus.Client().Alarm("disarm") + if err != nil { + t.Fatalf("alarmTest: Alarm error (%v)", err) + } + + // put one more key below quota + if err := clus.Client().Put("4th_test", smallbuf); err != nil { + t.Fatal(err) + } +} diff --git a/tests/framework/config/cluster.go b/tests/framework/config/cluster.go index c9deab294..f18c6e5c4 100644 --- a/tests/framework/config/cluster.go +++ b/tests/framework/config/cluster.go @@ -23,7 +23,8 @@ const ( ) type ClusterConfig struct { - ClusterSize int - PeerTLS TLSConfig - ClientTLS TLSConfig + ClusterSize int + PeerTLS TLSConfig + ClientTLS TLSConfig + QuotaBackendBytes int64 } diff --git a/tests/framework/e2e/etcdctl.go b/tests/framework/e2e/etcdctl.go index f11bdcead..3f0fb87a7 100644 --- a/tests/framework/e2e/etcdctl.go +++ b/tests/framework/e2e/etcdctl.go @@ -241,7 +241,13 @@ func (ctl *EtcdctlV3) Health() error { lines[i] = "is healthy" } return SpawnWithExpects(args, map[string]string{}, lines...) +} +func (ctl *EtcdctlV3) Alarm(cmd string) (*clientv3.AlarmResponse, error) { + args := ctl.cmdArgs() + args = append(args, "alarm", cmd) + + return nil, SpawnWithExpect(args, "alarm:NOSPACE") } func (ctl *EtcdctlV3) Defragment(o config.DefragOption) error { diff --git a/tests/framework/integration.go b/tests/framework/integration.go index 94c1925b7..e674de785 100644 --- a/tests/framework/integration.go +++ b/tests/framework/integration.go @@ -45,6 +45,7 @@ func (e integrationRunner) NewCluster(t testing.TB, cfg config.ClusterConfig) Cl var integrationCfg integration.ClusterConfig integrationCfg.Size = cfg.ClusterSize integrationCfg.ClientTLS, err = tlsInfo(t, cfg.ClientTLS) + integrationCfg.QuotaBackendBytes = cfg.QuotaBackendBytes if err != nil { t.Fatalf("ClientTLS: %s", err) } @@ -159,6 +160,14 @@ func (c integrationClient) Compact(rev int64, o config.CompactOption) (*clientv3 return c.Client.Compact(ctx, rev, clientOpts...) } +func (c integrationClient) Alarm(cmd string) (*clientv3.AlarmResponse, error) { + ctx := context.Background() + if cmd == "list" { + return c.Client.AlarmList(ctx) + } + return c.Client.AlarmDisarm(ctx, nil) +} + func (c integrationClient) Status() ([]*clientv3.StatusResponse, error) { endpoints := c.Client.Endpoints() var resp []*clientv3.StatusResponse diff --git a/tests/framework/interface.go b/tests/framework/interface.go index db4b3b980..9b1b424f6 100644 --- a/tests/framework/interface.go +++ b/tests/framework/interface.go @@ -37,9 +37,9 @@ type Client interface { Get(key string, opts config.GetOptions) (*clientv3.GetResponse, error) Delete(key string, opts config.DeleteOptions) (*clientv3.DeleteResponse, error) Compact(rev int64, opts config.CompactOption) (*clientv3.CompactResponse, error) - Status() ([]*clientv3.StatusResponse, error) HashKV(rev int64) ([]*clientv3.HashKVResponse, error) Health() error Defragment(opts config.DefragOption) error + Alarm(cmd string) (*clientv3.AlarmResponse, error) } From 3e657bdc5035c35e5c0c46ef1ca8598a828993a4 Mon Sep 17 00:00:00 2001 From: nic-chen Date: Sat, 19 Mar 2022 00:51:29 +0800 Subject: [PATCH 2/7] tests: Migrate key value Get to common framework --- tests/common/alarm_test.go | 105 +++++++++++++++++++------------------ 1 file changed, 53 insertions(+), 52 deletions(-) diff --git a/tests/common/alarm_test.go b/tests/common/alarm_test.go index 1d5708663..9312703bb 100644 --- a/tests/common/alarm_test.go +++ b/tests/common/alarm_test.go @@ -21,73 +21,74 @@ import ( "time" "go.etcd.io/etcd/tests/v3/framework/config" + "go.etcd.io/etcd/tests/v3/framework/testutils" ) func TestAlarm(t *testing.T) { testRunner.BeforeTest(t) - clus := testRunner.NewCluster(t, config.ClusterConfig{ClusterSize: 3, QuotaBackendBytes: int64(13 * os.Getpagesize())}) defer clus.Close() + testutils.ExecuteWithTimeout(t, 10*time.Second, func() { + // test small put still works + smallbuf := strings.Repeat("a", 64) + if err := clus.Client().Put("1st_test", smallbuf); err != nil { + t.Fatalf("alarmTest: put kv error (%v)", err) + } - // test small put still works - smallbuf := strings.Repeat("a", 64) - if err := clus.Client().Put("1st_test", smallbuf); err != nil { - t.Fatalf("alarmTest: put kv error (%v)", err) - } + // write some chunks to fill up the database + buf := strings.Repeat("b", os.Getpagesize()) + for { + if err := clus.Client().Put("2nd_test", buf); err != nil { + if !strings.Contains(err.Error(), "etcdserver: mvcc: database space exceeded") { + t.Fatal(err) + } + break + } + } - // write some chunks to fill up the database - buf := strings.Repeat("b", os.Getpagesize()) - for { - if err := clus.Client().Put("2nd_test", buf); err != nil { + // quota alarm should now be on + _, err := clus.Client().Alarm("list") + if err != nil { + t.Fatalf("alarmTest: Alarm error (%v)", err) + } + + // endpoint should not healthy + if err := clus.Client().Health(); err == nil { + t.Fatalf("endpoint should not healthy") + } + + // check that Put is rejected when alarm is on + if err := clus.Client().Put("3rd_test", smallbuf); err != nil { if !strings.Contains(err.Error(), "etcdserver: mvcc: database space exceeded") { t.Fatal(err) } - break } - } - // quota alarm should now be on - _, err := clus.Client().Alarm("list") - if err != nil { - t.Fatalf("alarmTest: Alarm error (%v)", err) - } + // get latest revision to compact + sresp, err := clus.Client().Status() + if err != nil { + t.Fatalf("get endpoint status error: %v", err) + } - // endpoint should not healthy - if err := clus.Client().Health(); err == nil { - t.Fatalf("endpoint should not healthy") - } + // make some space + _, err = clus.Client().Compact(sresp[0].Header.Revision, config.CompactOption{Physical: true, Timeout: 10 * time.Second}) + if err != nil { + t.Fatalf("alarmTest: Compact error (%v)", err) + } - // check that Put is rejected when alarm is on - if err := clus.Client().Put("3rd_test", smallbuf); err != nil { - if !strings.Contains(err.Error(), "etcdserver: mvcc: database space exceeded") { + if err = clus.Client().Defragment(config.DefragOption{Timeout: 10 * time.Second}); err != nil { + t.Fatalf("alarmTest: defrag error (%v)", err) + } + + // turn off alarm + _, err = clus.Client().Alarm("disarm") + if err != nil { + t.Fatalf("alarmTest: Alarm error (%v)", err) + } + + // put one more key below quota + if err := clus.Client().Put("4th_test", smallbuf); err != nil { t.Fatal(err) } - } - - // get latest revision to compact - sresp, err := clus.Client().Status() - if err != nil { - t.Fatalf("get endpoint status error: %v", err) - } - - // make some space - _, err = clus.Client().Compact(sresp[0].Header.Revision, config.CompactOption{Physical: true, Timeout: 10 * time.Second}) - if err != nil { - t.Fatalf("alarmTest: Compact error (%v)", err) - } - - if err = clus.Client().Defragment(config.DefragOption{Timeout: 10 * time.Second}); err != nil { - t.Fatalf("alarmTest: defrag error (%v)", err) - } - - // turn off alarm - _, err = clus.Client().Alarm("disarm") - if err != nil { - t.Fatalf("alarmTest: Alarm error (%v)", err) - } - - // put one more key below quota - if err := clus.Client().Put("4th_test", smallbuf); err != nil { - t.Fatal(err) - } + }) } From e9fa171665662860be9a951959dad1a533f02d13 Mon Sep 17 00:00:00 2001 From: nic-chen Date: Sat, 19 Mar 2022 16:31:19 +0800 Subject: [PATCH 3/7] fix test fail --- tests/common/alarm_test.go | 9 ++++++++- tests/e2e/ctl_v3_test.go | 4 ---- tests/framework/e2e.go | 5 +++-- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/tests/common/alarm_test.go b/tests/common/alarm_test.go index 9312703bb..e96e99fc6 100644 --- a/tests/common/alarm_test.go +++ b/tests/common/alarm_test.go @@ -69,9 +69,16 @@ func TestAlarm(t *testing.T) { if err != nil { t.Fatalf("get endpoint status error: %v", err) } + var rvs int64 + for _, resp := range sresp { + if resp != nil && resp.Header != nil { + rvs = resp.Header.Revision + break + } + } // make some space - _, err = clus.Client().Compact(sresp[0].Header.Revision, config.CompactOption{Physical: true, Timeout: 10 * time.Second}) + _, err = clus.Client().Compact(rvs, config.CompactOption{Physical: true, Timeout: 10 * time.Second}) if err != nil { t.Fatalf("alarmTest: Compact error (%v)", err) } diff --git a/tests/e2e/ctl_v3_test.go b/tests/e2e/ctl_v3_test.go index fc544603d..ee309cdeb 100644 --- a/tests/e2e/ctl_v3_test.go +++ b/tests/e2e/ctl_v3_test.go @@ -181,10 +181,6 @@ func withQuota(b int64) ctlOption { return func(cx *ctlCtx) { cx.quotaBackendBytes = b } } -func withCompactPhysical() ctlOption { - return func(cx *ctlCtx) { cx.compactPhysical = true } -} - func withInitialCorruptCheck() ctlOption { return func(cx *ctlCtx) { cx.initialCorruptCheck = true } } diff --git a/tests/framework/e2e.go b/tests/framework/e2e.go index d0e799163..8e068e3a8 100644 --- a/tests/framework/e2e.go +++ b/tests/framework/e2e.go @@ -40,8 +40,9 @@ func (e e2eRunner) BeforeTest(t testing.TB) { func (e e2eRunner) NewCluster(t testing.TB, cfg config.ClusterConfig) Cluster { e2eConfig := e2e.EtcdProcessClusterConfig{ - InitialToken: "new", - ClusterSize: cfg.ClusterSize, + InitialToken: "new", + ClusterSize: cfg.ClusterSize, + QuotaBackendBytes: cfg.QuotaBackendBytes, } switch cfg.ClientTLS { case config.NoTLS: From 527edd39a6d7805efcc21da92664a42b9df7267a Mon Sep 17 00:00:00 2001 From: nic-chen Date: Sun, 20 Mar 2022 01:40:53 +0800 Subject: [PATCH 4/7] fix alarm test --- tests/common/alarm_test.go | 20 +++++++++++--------- tests/framework/e2e/etcdctl.go | 17 +++++++++++++---- tests/framework/integration.go | 4 ++-- tests/framework/interface.go | 2 +- 4 files changed, 27 insertions(+), 16 deletions(-) diff --git a/tests/common/alarm_test.go b/tests/common/alarm_test.go index 1188bab36..4bf12f994 100644 --- a/tests/common/alarm_test.go +++ b/tests/common/alarm_test.go @@ -20,6 +20,7 @@ import ( "testing" "time" + clientv3 "go.etcd.io/etcd/client/v3" "go.etcd.io/etcd/tests/v3/framework/config" "go.etcd.io/etcd/tests/v3/framework/testutils" ) @@ -47,16 +48,11 @@ func TestAlarm(t *testing.T) { } // quota alarm should now be on - _, err := clus.Client().Alarm("list") + alarmResp, err := clus.Client().Alarm("list", nil) if err != nil { t.Fatalf("alarmTest: Alarm error (%v)", err) } - // endpoint should not healthy - if err := clus.Client().Health(); err == nil { - t.Fatalf("endpoint should not healthy") - } - // check that Put is rejected when alarm is on if err := clus.Client().Put("3rd_test", smallbuf, config.PutOptions{}); err != nil { if !strings.Contains(err.Error(), "etcdserver: mvcc: database space exceeded") { @@ -88,9 +84,15 @@ func TestAlarm(t *testing.T) { } // turn off alarm - _, err = clus.Client().Alarm("disarm") - if err != nil { - t.Fatalf("alarmTest: Alarm error (%v)", err) + for _, alarm := range alarmResp.Alarms { + m := &clientv3.AlarmMember{ + MemberID: alarm.MemberID, + Alarm: alarm.Alarm, + } + _, err = clus.Client().Alarm("disarm", m) + if err != nil { + t.Fatalf("alarmTest: Alarm error (%v)", err) + } } // put one more key below quota diff --git a/tests/framework/e2e/etcdctl.go b/tests/framework/e2e/etcdctl.go index ee2ceacac..25ea0eaf1 100644 --- a/tests/framework/e2e/etcdctl.go +++ b/tests/framework/e2e/etcdctl.go @@ -344,9 +344,18 @@ func (ctl *EtcdctlV3) LeaseRevoke(id clientv3.LeaseID) (*clientv3.LeaseRevokeRes return &resp, err } -func (ctl *EtcdctlV3) Alarm(cmd string) (*clientv3.AlarmResponse, error) { +func (ctl *EtcdctlV3) Alarm(cmd string, _ *clientv3.AlarmMember) (*clientv3.AlarmResponse, error) { args := ctl.cmdArgs() - args = append(args, "alarm", cmd) - - return nil, SpawnWithExpect(args, "alarm:NOSPACE") + args = append(args, "alarm", cmd, "-w", "json") + ep, err := SpawnCmd(args, nil) + if err != nil { + return nil, err + } + var resp clientv3.AlarmResponse + line, err := ep.Expect("alarm") + if err != nil { + return nil, err + } + err = json.Unmarshal([]byte(line), &resp) + return &resp, err } diff --git a/tests/framework/integration.go b/tests/framework/integration.go index b7403d81d..4ce431ff9 100644 --- a/tests/framework/integration.go +++ b/tests/framework/integration.go @@ -164,12 +164,12 @@ func (c integrationClient) Compact(rev int64, o config.CompactOption) (*clientv3 return c.Client.Compact(ctx, rev, clientOpts...) } -func (c integrationClient) Alarm(cmd string) (*clientv3.AlarmResponse, error) { +func (c integrationClient) Alarm(cmd string, member *clientv3.AlarmMember) (*clientv3.AlarmResponse, error) { ctx := context.Background() if cmd == "list" { return c.Client.AlarmList(ctx) } - return c.Client.AlarmDisarm(ctx, nil) + return c.Client.AlarmDisarm(ctx, member) } func (c integrationClient) Status() ([]*clientv3.StatusResponse, error) { diff --git a/tests/framework/interface.go b/tests/framework/interface.go index f925682df..2864a22c6 100644 --- a/tests/framework/interface.go +++ b/tests/framework/interface.go @@ -41,7 +41,7 @@ type Client interface { HashKV(rev int64) ([]*clientv3.HashKVResponse, error) Health() error Defragment(opts config.DefragOption) error - Alarm(cmd string) (*clientv3.AlarmResponse, error) + Alarm(cmd string, member *clientv3.AlarmMember) (*clientv3.AlarmResponse, error) Grant(ttl int64) (*clientv3.LeaseGrantResponse, error) TimeToLive(id clientv3.LeaseID, opts config.LeaseOption) (*clientv3.LeaseTimeToLiveResponse, error) LeaseList() (*clientv3.LeaseLeasesResponse, error) From bb7856090a8f3d08bfbb2c85c859de880fe0dd0f Mon Sep 17 00:00:00 2001 From: nic-chen Date: Sun, 20 Mar 2022 02:01:30 +0800 Subject: [PATCH 5/7] fix: set cluster size to 1 to avoid unstable --- tests/common/alarm_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/common/alarm_test.go b/tests/common/alarm_test.go index 4bf12f994..bb66fd727 100644 --- a/tests/common/alarm_test.go +++ b/tests/common/alarm_test.go @@ -27,7 +27,7 @@ import ( func TestAlarm(t *testing.T) { testRunner.BeforeTest(t) - clus := testRunner.NewCluster(t, config.ClusterConfig{ClusterSize: 3, QuotaBackendBytes: int64(13 * os.Getpagesize())}) + clus := testRunner.NewCluster(t, config.ClusterConfig{ClusterSize: 1, QuotaBackendBytes: int64(13 * os.Getpagesize())}) defer clus.Close() testutils.ExecuteWithTimeout(t, 10*time.Second, func() { // test small put still works From 89146aa157c91b774bade97a7c354a73820bc5e4 Mon Sep 17 00:00:00 2001 From: nic-chen Date: Sun, 20 Mar 2022 02:06:42 +0800 Subject: [PATCH 6/7] chore: delete useless file --- tests/e2e/ctl_v3_alarm_test.go | 106 --------------------------------- 1 file changed, 106 deletions(-) delete mode 100644 tests/e2e/ctl_v3_alarm_test.go diff --git a/tests/e2e/ctl_v3_alarm_test.go b/tests/e2e/ctl_v3_alarm_test.go deleted file mode 100644 index b99d3a6a3..000000000 --- a/tests/e2e/ctl_v3_alarm_test.go +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright 2016 The etcd Authors -// -// 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 e2e - -import ( - "context" - "os" - "strings" - "testing" - "time" - - clientv3 "go.etcd.io/etcd/client/v3" - "go.etcd.io/etcd/tests/v3/framework/e2e" -) - -func TestCtlV3Alarm(t *testing.T) { - // The boltdb minimum working set is six pages. - testCtl(t, alarmTest, withQuota(int64(13*os.Getpagesize()))) -} - -func alarmTest(cx ctlCtx) { - // test small put still works - smallbuf := strings.Repeat("a", 64) - if err := ctlV3Put(cx, "1st_test", smallbuf, ""); err != nil { - cx.t.Fatal(err) - } - - // write some chunks to fill up the database - buf := strings.Repeat("b", os.Getpagesize()) - for { - if err := ctlV3Put(cx, "2nd_test", buf, ""); err != nil { - if !strings.Contains(err.Error(), "etcdserver: mvcc: database space exceeded") { - cx.t.Fatal(err) - } - break - } - } - - // quota alarm should now be on - if err := ctlV3Alarm(cx, "list", "alarm:NOSPACE"); err != nil { - cx.t.Fatal(err) - } - - // '/health' handler should return 'false' - if err := e2e.CURLGet(cx.epc, e2e.CURLReq{Endpoint: "/health", Expected: `{"health":"false","reason":"ALARM NOSPACE"}`}); err != nil { - cx.t.Fatalf("failed get with curl (%v)", err) - } - - // check that Put is rejected when alarm is on - if err := ctlV3Put(cx, "3rd_test", smallbuf, ""); err != nil { - if !strings.Contains(err.Error(), "etcdserver: mvcc: database space exceeded") { - cx.t.Fatal(err) - } - } - - eps := cx.epc.EndpointsV3() - - // get latest revision to compact - cli, err := clientv3.New(clientv3.Config{ - Endpoints: eps, - DialTimeout: 3 * time.Second, - }) - if err != nil { - cx.t.Fatal(err) - } - defer cli.Close() - sresp, err := cli.Status(context.TODO(), eps[0]) - if err != nil { - cx.t.Fatal(err) - } - - // make some space - if err := ctlV3Compact(cx, sresp.Header.Revision, true); err != nil { - cx.t.Fatal(err) - } - if err := ctlV3OnlineDefrag(cx); err != nil { - cx.t.Fatal(err) - } - - // turn off alarm - if err := ctlV3Alarm(cx, "disarm", "alarm:NOSPACE"); err != nil { - cx.t.Fatal(err) - } - - // put one more key below quota - if err := ctlV3Put(cx, "4th_test", smallbuf, ""); err != nil { - cx.t.Fatal(err) - } -} - -func ctlV3Alarm(cx ctlCtx, cmd string, as ...string) error { - cmdArgs := append(cx.PrefixArgs(), "alarm", cmd) - return e2e.SpawnWithExpects(cmdArgs, cx.envMap, as...) -} From c6488a2c56acf3d59168a603ca568a369edb1eea Mon Sep 17 00:00:00 2001 From: nic-chen Date: Sun, 20 Mar 2022 10:09:27 +0800 Subject: [PATCH 7/7] fix review --- tests/common/alarm_test.go | 6 +++--- tests/framework/e2e/etcdctl.go | 20 ++++++++++++++++++-- tests/framework/integration.go | 12 ++++++------ tests/framework/interface.go | 3 ++- 4 files changed, 29 insertions(+), 12 deletions(-) diff --git a/tests/common/alarm_test.go b/tests/common/alarm_test.go index bb66fd727..9873743c2 100644 --- a/tests/common/alarm_test.go +++ b/tests/common/alarm_test.go @@ -48,7 +48,7 @@ func TestAlarm(t *testing.T) { } // quota alarm should now be on - alarmResp, err := clus.Client().Alarm("list", nil) + alarmResp, err := clus.Client().AlarmList() if err != nil { t.Fatalf("alarmTest: Alarm error (%v)", err) } @@ -85,11 +85,11 @@ func TestAlarm(t *testing.T) { // turn off alarm for _, alarm := range alarmResp.Alarms { - m := &clientv3.AlarmMember{ + alarmMember := &clientv3.AlarmMember{ MemberID: alarm.MemberID, Alarm: alarm.Alarm, } - _, err = clus.Client().Alarm("disarm", m) + _, err = clus.Client().AlarmDisarm(alarmMember) if err != nil { t.Fatalf("alarmTest: Alarm error (%v)", err) } diff --git a/tests/framework/e2e/etcdctl.go b/tests/framework/e2e/etcdctl.go index 25ea0eaf1..dd5f57e35 100644 --- a/tests/framework/e2e/etcdctl.go +++ b/tests/framework/e2e/etcdctl.go @@ -344,9 +344,25 @@ func (ctl *EtcdctlV3) LeaseRevoke(id clientv3.LeaseID) (*clientv3.LeaseRevokeRes return &resp, err } -func (ctl *EtcdctlV3) Alarm(cmd string, _ *clientv3.AlarmMember) (*clientv3.AlarmResponse, error) { +func (ctl *EtcdctlV3) AlarmList() (*clientv3.AlarmResponse, error) { args := ctl.cmdArgs() - args = append(args, "alarm", cmd, "-w", "json") + args = append(args, "alarm", "list", "-w", "json") + ep, err := SpawnCmd(args, nil) + if err != nil { + return nil, err + } + var resp clientv3.AlarmResponse + line, err := ep.Expect("alarm") + if err != nil { + return nil, err + } + err = json.Unmarshal([]byte(line), &resp) + return &resp, err +} + +func (ctl *EtcdctlV3) AlarmDisarm(_ *clientv3.AlarmMember) (*clientv3.AlarmResponse, error) { + args := ctl.cmdArgs() + args = append(args, "alarm", "disarm", "-w", "json") ep, err := SpawnCmd(args, nil) if err != nil { return nil, err diff --git a/tests/framework/integration.go b/tests/framework/integration.go index 4ce431ff9..f5867da46 100644 --- a/tests/framework/integration.go +++ b/tests/framework/integration.go @@ -164,12 +164,12 @@ func (c integrationClient) Compact(rev int64, o config.CompactOption) (*clientv3 return c.Client.Compact(ctx, rev, clientOpts...) } -func (c integrationClient) Alarm(cmd string, member *clientv3.AlarmMember) (*clientv3.AlarmResponse, error) { - ctx := context.Background() - if cmd == "list" { - return c.Client.AlarmList(ctx) - } - return c.Client.AlarmDisarm(ctx, member) +func (c integrationClient) AlarmList() (*clientv3.AlarmResponse, error) { + return c.Client.AlarmList(context.Background()) +} + +func (c integrationClient) AlarmDisarm(alarmMember *clientv3.AlarmMember) (*clientv3.AlarmResponse, error) { + return c.Client.AlarmDisarm(context.Background(), alarmMember) } func (c integrationClient) Status() ([]*clientv3.StatusResponse, error) { diff --git a/tests/framework/interface.go b/tests/framework/interface.go index 2864a22c6..8460483dd 100644 --- a/tests/framework/interface.go +++ b/tests/framework/interface.go @@ -41,7 +41,8 @@ type Client interface { HashKV(rev int64) ([]*clientv3.HashKVResponse, error) Health() error Defragment(opts config.DefragOption) error - Alarm(cmd string, member *clientv3.AlarmMember) (*clientv3.AlarmResponse, error) + AlarmList() (*clientv3.AlarmResponse, error) + AlarmDisarm(alarmMember *clientv3.AlarmMember) (*clientv3.AlarmResponse, error) Grant(ttl int64) (*clientv3.LeaseGrantResponse, error) TimeToLive(id clientv3.LeaseID, opts config.LeaseOption) (*clientv3.LeaseTimeToLiveResponse, error) LeaseList() (*clientv3.LeaseLeasesResponse, error)