浏览代码

*: add rev flag to get command

Gyu-Ho Lee 9 年之前
父节点
当前提交
60548b85c4
共有 3 个文件被更改,包括 40 次插入6 次删除
  1. 33 6
      e2e/ctl_v3_test.go
  2. 2 0
      etcdctl/READMEv3.md
  3. 5 0
      etcdctl/ctlv3/command/get_command.go

+ 33 - 6
e2e/ctl_v3_test.go

@@ -39,6 +39,7 @@ func TestCtlV3GetTimeout(t *testing.T)   { testCtl(t, getTest, withDialTimeout(0
 func TestCtlV3GetQuorum(t *testing.T)    { testCtl(t, getTest, withQuorum()) }
 func TestCtlV3GetQuorum(t *testing.T)    { testCtl(t, getTest, withQuorum()) }
 
 
 func TestCtlV3GetFormat(t *testing.T) { testCtl(t, getFormatTest) }
 func TestCtlV3GetFormat(t *testing.T) { testCtl(t, getFormatTest) }
+func TestCtlV3GetRev(t *testing.T)    { testCtl(t, getRevTest) }
 
 
 func TestCtlV3Del(t *testing.T)          { testCtl(t, delTest) }
 func TestCtlV3Del(t *testing.T)          { testCtl(t, delTest) }
 func TestCtlV3DelNoTLS(t *testing.T)     { testCtl(t, delTest, withCfg(configNoTLS)) }
 func TestCtlV3DelNoTLS(t *testing.T)     { testCtl(t, delTest, withCfg(configNoTLS)) }
@@ -185,6 +186,11 @@ func getTest(cx ctlCtx) {
 		kvs    = []kv{{"key1", "val1"}, {"key2", "val2"}, {"key3", "val3"}}
 		kvs    = []kv{{"key1", "val1"}, {"key2", "val2"}, {"key3", "val3"}}
 		revkvs = []kv{{"key3", "val3"}, {"key2", "val2"}, {"key1", "val1"}}
 		revkvs = []kv{{"key3", "val3"}, {"key2", "val2"}, {"key1", "val1"}}
 	)
 	)
+	for i := range kvs {
+		if err := ctlV3Put(cx, kvs[i].key, kvs[i].val, ""); err != nil {
+			cx.t.Fatalf("getTest #%d: ctlV3Put error (%v)", i, err)
+		}
+	}
 
 
 	tests := []struct {
 	tests := []struct {
 		args []string
 		args []string
@@ -199,12 +205,6 @@ func getTest(cx ctlCtx) {
 		{[]string{"key", "--prefix", "--order=DESCEND", "--sort-by=CREATE"}, revkvs},
 		{[]string{"key", "--prefix", "--order=DESCEND", "--sort-by=CREATE"}, revkvs},
 		{[]string{"key", "--prefix", "--order=DESCEND", "--sort-by=KEY"}, revkvs},
 		{[]string{"key", "--prefix", "--order=DESCEND", "--sort-by=KEY"}, revkvs},
 	}
 	}
-
-	for i := range kvs {
-		if err := ctlV3Put(cx, kvs[i].key, kvs[i].val, ""); err != nil {
-			cx.t.Fatalf("getTest #%d: ctlV3Put error (%v)", i, err)
-		}
-	}
 	for i, tt := range tests {
 	for i, tt := range tests {
 		if err := ctlV3Get(cx, tt.args, tt.wkv...); err != nil {
 		if err := ctlV3Get(cx, tt.args, tt.wkv...); err != nil {
 			if cx.dialTimeout > 0 && !isGRPCTimedout(err) {
 			if cx.dialTimeout > 0 && !isGRPCTimedout(err) {
@@ -239,6 +239,33 @@ func getFormatTest(cx ctlCtx) {
 	}
 	}
 }
 }
 
 
+func getRevTest(cx ctlCtx) {
+	var (
+		kvs = []kv{{"key", "val1"}, {"key", "val2"}, {"key", "val3"}}
+	)
+	for i := range kvs {
+		if err := ctlV3Put(cx, kvs[i].key, kvs[i].val, ""); err != nil {
+			cx.t.Fatalf("getRevTest #%d: ctlV3Put error (%v)", i, err)
+		}
+	}
+
+	tests := []struct {
+		args []string
+
+		wkv []kv
+	}{
+		{[]string{"key", "--rev", "2"}, kvs[:1]},
+		{[]string{"key", "--rev", "3"}, kvs[1:2]},
+		{[]string{"key", "--rev", "4"}, kvs[2:]},
+	}
+
+	for i, tt := range tests {
+		if err := ctlV3Get(cx, tt.args, tt.wkv...); err != nil {
+			cx.t.Errorf("getTest #%d: ctlV3Get error (%v)", i, err)
+		}
+	}
+}
+
 func delTest(cx ctlCtx) {
 func delTest(cx ctlCtx) {
 	tests := []struct {
 	tests := []struct {
 		puts []kv
 		puts []kv

+ 2 - 0
etcdctl/READMEv3.md

@@ -66,6 +66,8 @@ GET gets the key or a range of keys [key, range_end) if `range-end` is given.
 
 
 - sort-by -- sort target; CREATE, KEY, MODIFY, VALUE, or VERSION
 - sort-by -- sort target; CREATE, KEY, MODIFY, VALUE, or VERSION
 
 
+- rev -- specify the kv revision
+
 TODO: add consistency, from, prefix
 TODO: add consistency, from, prefix
 
 
 #### Return value
 #### Return value

+ 5 - 0
etcdctl/ctlv3/command/get_command.go

@@ -29,6 +29,7 @@ var (
 	getSortTarget  string
 	getSortTarget  string
 	getPrefix      bool
 	getPrefix      bool
 	getFromKey     bool
 	getFromKey     bool
+	getRev         int64
 )
 )
 
 
 // NewGetCommand returns the cobra command for "get".
 // NewGetCommand returns the cobra command for "get".
@@ -45,6 +46,7 @@ func NewGetCommand() *cobra.Command {
 	cmd.Flags().Int64Var(&getLimit, "limit", 0, "maximum number of results")
 	cmd.Flags().Int64Var(&getLimit, "limit", 0, "maximum number of results")
 	cmd.Flags().BoolVar(&getPrefix, "prefix", false, "get keys with matching prefix")
 	cmd.Flags().BoolVar(&getPrefix, "prefix", false, "get keys with matching prefix")
 	cmd.Flags().BoolVar(&getFromKey, "from-key", false, "get keys that are greater than or equal to the given key")
 	cmd.Flags().BoolVar(&getFromKey, "from-key", false, "get keys that are greater than or equal to the given key")
+	cmd.Flags().Int64Var(&getRev, "rev", 0, "specify the kv revision")
 	return cmd
 	return cmd
 }
 }
 
 
@@ -88,6 +90,9 @@ func getGetOp(cmd *cobra.Command, args []string) (string, []clientv3.OpOption) {
 	}
 	}
 
 
 	opts = append(opts, clientv3.WithLimit(getLimit))
 	opts = append(opts, clientv3.WithLimit(getLimit))
+	if getRev > 0 {
+		opts = append(opts, clientv3.WithRev(getRev))
+	}
 
 
 	sortByOrder := clientv3.SortNone
 	sortByOrder := clientv3.SortNone
 	sortOrder := strings.ToUpper(getSortOrder)
 	sortOrder := strings.ToUpper(getSortOrder)