Browse Source

Merge pull request #8775 from marcovc/master

etcdctl/v3: add lease keep-alive --once flag
Xiang Li 8 years ago
parent
commit
d75a6a39f5
2 changed files with 49 additions and 2 deletions
  1. 32 0
      e2e/ctl_v3_lease_test.go
  2. 17 2
      etcdctl/ctlv3/command/lease_command.go

+ 32 - 0
e2e/ctl_v3_lease_test.go

@@ -24,6 +24,7 @@ import (
 func TestCtlV3LeaseGrantTimeToLive(t *testing.T) { testCtl(t, leaseTestGrantTimeToLive) }
 func TestCtlV3LeaseGrantLeases(t *testing.T)     { testCtl(t, leaseTestGrantLeasesList) }
 func TestCtlV3LeaseKeepAlive(t *testing.T)       { testCtl(t, leaseTestKeepAlive) }
+func TestCtlV3LeaseKeepAliveOnce(t *testing.T)   { testCtl(t, leaseTestKeepAliveOnce) }
 func TestCtlV3LeaseRevoke(t *testing.T)          { testCtl(t, leaseTestRevoke) }
 
 func leaseTestGrantTimeToLive(cx ctlCtx) {
@@ -89,6 +90,23 @@ func leaseTestKeepAlive(cx ctlCtx) {
 	}
 }
 
+func leaseTestKeepAliveOnce(cx ctlCtx) {
+	// put with TTL 10 seconds and keep-alive once
+	leaseID, err := ctlV3LeaseGrant(cx, 10)
+	if err != nil {
+		cx.t.Fatalf("leaseTestKeepAlive: ctlV3LeaseGrant error (%v)", err)
+	}
+	if err := ctlV3Put(cx, "key", "val", leaseID); err != nil {
+		cx.t.Fatalf("leaseTestKeepAlive: ctlV3Put error (%v)", err)
+	}
+	if err := ctlV3LeaseKeepAliveOnce(cx, leaseID); err != nil {
+		cx.t.Fatalf("leaseTestKeepAlive: ctlV3LeaseKeepAliveOnce error (%v)", err)
+	}
+	if err := ctlV3Get(cx, []string{"key"}, kv{"key", "val"}); err != nil {
+		cx.t.Fatalf("leaseTestKeepAlive: ctlV3Get error (%v)", err)
+	}
+}
+
 func leaseTestRevoke(cx ctlCtx) {
 	// put with TTL 10 seconds and revoke
 	leaseID, err := ctlV3LeaseGrant(cx, 10)
@@ -143,6 +161,20 @@ func ctlV3LeaseKeepAlive(cx ctlCtx, leaseID string) error {
 	return proc.Stop()
 }
 
+func ctlV3LeaseKeepAliveOnce(cx ctlCtx, leaseID string) error {
+	cmdArgs := append(cx.PrefixArgs(), "lease", "keep-alive", "--once", leaseID)
+
+	proc, err := spawnCmd(cmdArgs)
+	if err != nil {
+		return err
+	}
+
+	if _, err = proc.Expect(fmt.Sprintf("lease %s keepalived with TTL(", leaseID)); err != nil {
+		return err
+	}
+	return proc.Stop()
+}
+
 func ctlV3LeaseRevoke(cx ctlCtx, leaseID string) error {
 	cmdArgs := append(cx.PrefixArgs(), "lease", "revoke", leaseID)
 	return spawnWithExpect(cmdArgs, fmt.Sprintf("lease %s revoked", leaseID))

+ 17 - 2
etcdctl/ctlv3/command/lease_command.go

@@ -150,15 +150,21 @@ func leaseListCommandFunc(cmd *cobra.Command, args []string) {
 	display.Leases(*resp)
 }
 
+var (
+	leaseKeepAliveOnce bool
+)
+
 // NewLeaseKeepAliveCommand returns the cobra command for "lease keep-alive".
 func NewLeaseKeepAliveCommand() *cobra.Command {
 	lc := &cobra.Command{
-		Use:   "keep-alive <leaseID>",
+		Use:   "keep-alive [options] <leaseID>",
 		Short: "Keeps leases alive (renew)",
 
 		Run: leaseKeepAliveCommandFunc,
 	}
 
+	lc.Flags().BoolVar(&leaseKeepAliveOnce, "once", false, "Resets the keep-alive time to its original value and exits immediately")
+
 	return lc
 }
 
@@ -169,11 +175,20 @@ func leaseKeepAliveCommandFunc(cmd *cobra.Command, args []string) {
 	}
 
 	id := leaseFromArgs(args[0])
+
+	if leaseKeepAliveOnce {
+		respc, kerr := mustClientFromCmd(cmd).KeepAliveOnce(context.TODO(), id)
+		if kerr != nil {
+			ExitWithError(ExitBadConnection, kerr)
+		}
+		display.KeepAlive(*respc)
+		return
+	}
+
 	respc, kerr := mustClientFromCmd(cmd).KeepAlive(context.TODO(), id)
 	if kerr != nil {
 		ExitWithError(ExitBadConnection, kerr)
 	}
-
 	for resp := range respc {
 		display.KeepAlive(*resp)
 	}