diff --git a/cli/ping.go b/cli/ping.go
index 19191b92916bb..f75ed42d26362 100644
--- a/cli/ping.go
+++ b/cli/ping.go
@@ -21,13 +21,14 @@ import (
"github.com/coder/pretty"
+ "github.com/coder/serpent"
+
"github.com/coder/coder/v2/cli/cliui"
"github.com/coder/coder/v2/cli/cliutil"
"github.com/coder/coder/v2/coderd/util/ptr"
"github.com/coder/coder/v2/codersdk"
"github.com/coder/coder/v2/codersdk/healthsdk"
"github.com/coder/coder/v2/codersdk/workspacesdk"
- "github.com/coder/serpent"
)
type pingSummary struct {
@@ -86,6 +87,8 @@ func (r *RootCmd) ping() *serpent.Command {
pingNum int64
pingTimeout time.Duration
pingWait time.Duration
+ pingTimeLocal bool
+ pingTimeUTC bool
appearanceConfig codersdk.AppearanceConfig
)
@@ -217,6 +220,10 @@ func (r *RootCmd) ping() *serpent.Command {
ctx, cancel := context.WithTimeout(ctx, pingTimeout)
dur, p2p, pong, err = conn.Ping(ctx)
+ pongTime := time.Now()
+ if pingTimeUTC {
+ pongTime = pongTime.UTC()
+ }
cancel()
results.addResult(pong)
if err != nil {
@@ -268,7 +275,13 @@ func (r *RootCmd) ping() *serpent.Command {
)
}
- _, _ = fmt.Fprintf(inv.Stdout, "pong from %s %s in %s\n",
+ var displayTime string
+ if pingTimeLocal || pingTimeUTC {
+ displayTime = pretty.Sprintf(cliui.DefaultStyles.DateTimeStamp, "[%s] ", pongTime.Format(time.RFC3339))
+ }
+
+ _, _ = fmt.Fprintf(inv.Stdout, "%spong from %s %s in %s\n",
+ displayTime,
pretty.Sprint(cliui.DefaultStyles.Keyword, workspaceName),
via,
pretty.Sprint(cliui.DefaultStyles.DateTimeStamp, dur.String()),
@@ -321,6 +334,16 @@ func (r *RootCmd) ping() *serpent.Command {
Description: "Specifies the number of pings to perform. By default, pings will continue until interrupted.",
Value: serpent.Int64Of(&pingNum),
},
+ {
+ Flag: "time",
+ Description: "Show the response time of each pong in local time.",
+ Value: serpent.BoolOf(&pingTimeLocal),
+ },
+ {
+ Flag: "utc",
+ Description: "Show the response time of each pong in UTC (implies --time).",
+ Value: serpent.BoolOf(&pingTimeUTC),
+ },
}
return cmd
}
diff --git a/cli/ping_test.go b/cli/ping_test.go
index bc0bb7c0e423a..ffdcee07f07de 100644
--- a/cli/ping_test.go
+++ b/cli/ping_test.go
@@ -69,4 +69,60 @@ func TestPing(t *testing.T) {
cancel()
<-cmdDone
})
+
+ t.Run("1PingWithTime", func(t *testing.T) {
+ t.Parallel()
+
+ tests := []struct {
+ name string
+ utc bool
+ }{
+ {name: "LocalTime"}, // --time renders the pong response time.
+ {name: "UTC", utc: true}, // --utc implies --time, so we expect it to also contain the pong time.
+ }
+
+ for _, tc := range tests {
+ t.Run(tc.name, func(t *testing.T) {
+ t.Parallel()
+
+ client, workspace, agentToken := setupWorkspaceForAgent(t)
+ args := []string{"ping", "-n", "1", workspace.Name, "--time"}
+ if tc.utc {
+ args = append(args, "--utc")
+ }
+
+ inv, root := clitest.New(t, args...)
+ clitest.SetupConfig(t, client, root)
+ pty := ptytest.New(t)
+ inv.Stdin = pty.Input()
+ inv.Stderr = pty.Output()
+ inv.Stdout = pty.Output()
+
+ _ = agenttest.New(t, client.URL, agentToken)
+ _ = coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID)
+
+ ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
+ defer cancel()
+
+ cmdDone := tGo(t, func() {
+ err := inv.WithContext(ctx).Run()
+ assert.NoError(t, err)
+ })
+
+ // RFC3339 is the format used to render the pong times.
+ rfc3339 := `\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?`
+
+ // Validate that dates are rendered as specified.
+ if tc.utc {
+ rfc3339 += `Z`
+ } else {
+ rfc3339 += `(?:Z|[+-]\d{2}:\d{2})`
+ }
+
+ pty.ExpectRegexMatch(`\[` + rfc3339 + `\] pong from ` + workspace.Name)
+ cancel()
+ <-cmdDone
+ })
+ }
+ })
}
diff --git a/cli/testdata/coder_ping_--help.golden b/cli/testdata/coder_ping_--help.golden
index 4955e889c3651..e2e2c11e55214 100644
--- a/cli/testdata/coder_ping_--help.golden
+++ b/cli/testdata/coder_ping_--help.golden
@@ -10,9 +10,15 @@ OPTIONS:
Specifies the number of pings to perform. By default, pings will
continue until interrupted.
+ --time bool
+ Show the response time of each pong in local time.
+
-t, --timeout duration (default: 5s)
Specifies how long to wait for a ping to complete.
+ --utc bool
+ Show the response time of each pong in UTC (implies --time).
+
--wait duration (default: 1s)
Specifies how long to wait between pings.
diff --git a/docs/reference/cli/ping.md b/docs/reference/cli/ping.md
index 8fbc1eaf36e8e..829f131818901 100644
--- a/docs/reference/cli/ping.md
+++ b/docs/reference/cli/ping.md
@@ -36,3 +36,19 @@ Specifies how long to wait for a ping to complete.
| Type | int
|
Specifies the number of pings to perform. By default, pings will continue until interrupted.
+
+### --time
+
+| | |
+|------|-------------------|
+| Type | bool
|
+
+Show the response time of each pong in local time.
+
+### --utc
+
+| | |
+|------|-------------------|
+| Type | bool
|
+
+Show the response time of each pong in UTC (implies --time).
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: