@@ -5,20 +5,23 @@ import (
5
5
"fmt"
6
6
"time"
7
7
8
- "cdr.dev/slog"
9
- "github.com/coder/coder/cli/cliflag"
10
- "github.com/coder/coder/cli/cliui"
11
- "github.com/coder/coder/codersdk"
12
8
"github.com/jedib0t/go-pretty/v6/table"
13
9
"github.com/spf13/cobra"
14
10
"golang.org/x/xerrors"
15
11
tsspeedtest "tailscale.com/net/speedtest"
12
+
13
+ "cdr.dev/slog"
14
+ "github.com/coder/coder/agent"
15
+ "github.com/coder/coder/cli/cliflag"
16
+ "github.com/coder/coder/cli/cliui"
17
+ "github.com/coder/coder/codersdk"
16
18
)
17
19
18
20
func speedtest () * cobra.Command {
19
21
var (
20
- reverse bool
21
- timeStr string
22
+ direct bool
23
+ duration time.Duration
24
+ reverse bool
22
25
)
23
26
cmd := & cobra.Command {
24
27
Annotations : workspaceCommand ,
@@ -28,11 +31,6 @@ func speedtest() *cobra.Command {
28
31
ctx , cancel := context .WithCancel (cmd .Context ())
29
32
defer cancel ()
30
33
31
- dur , err := time .ParseDuration (timeStr )
32
- if err != nil {
33
- return err
34
- }
35
-
36
34
client , err := CreateClient (cmd )
37
35
if err != nil {
38
36
return xerrors .Errorf ("create codersdk client: %w" , err )
@@ -57,13 +55,38 @@ func speedtest() *cobra.Command {
57
55
return err
58
56
}
59
57
defer conn .Close ()
60
- _ , _ = conn .Ping ()
58
+ if direct {
59
+ ticker := time .NewTicker (time .Second )
60
+ defer ticker .Stop ()
61
+ for {
62
+ select {
63
+ case <- ctx .Done ():
64
+ return ctx .Err ()
65
+ case <- ticker .C :
66
+ }
67
+ dur , err := conn .Ping ()
68
+ if err != nil {
69
+ continue
70
+ }
71
+ tc , _ := conn .(* agent.TailnetConn )
72
+ status := tc .Status ()
73
+ if len (status .Peers ()) != 1 {
74
+ continue
75
+ }
76
+ peer := status .Peer [status .Peers ()[0 ]]
77
+ if peer .CurAddr == "" {
78
+ cmd .Printf ("Waiting for a direct connection... (%dms via %s)\n " , dur .Milliseconds (), peer .Relay )
79
+ continue
80
+ }
81
+ break
82
+ }
83
+ }
61
84
dir := tsspeedtest .Download
62
85
if reverse {
63
86
dir = tsspeedtest .Upload
64
87
}
65
- cmd .Printf ("Starting a %ds %s test...\n " , int (dur .Seconds ()), dir )
66
- results , err := conn .Speedtest (dir , dur )
88
+ cmd .Printf ("Starting a %ds %s test...\n " , int (duration .Seconds ()), dir )
89
+ results , err := conn .Speedtest (dir , duration )
67
90
if err != nil {
68
91
return err
69
92
}
@@ -83,9 +106,11 @@ func speedtest() *cobra.Command {
83
106
return err
84
107
},
85
108
}
109
+ cliflag .BoolVarP (cmd .Flags (), & direct , "direct" , "d" , "" , false ,
110
+ "Specifies whether to wait for a direct connection before testing speed." )
86
111
cliflag .BoolVarP (cmd .Flags (), & reverse , "reverse" , "r" , "" , false ,
87
112
"Specifies whether to run in reverse mode where the client receives and the server sends." )
88
- cliflag . StringVarP ( cmd .Flags (), & timeStr , "time" , "t" , "" , "5s" ,
113
+ cmd .Flags (). DurationVarP ( & duration , "time" , "t" , tsspeedtest . DefaultDuration ,
89
114
"Specifies the duration to monitor traffic." )
90
115
return cmd
91
116
}
0 commit comments