Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit974c570

Browse files
committed
chore: add DRPC tailnet & cli implementation
1 parentabc0ff9 commit974c570

File tree

14 files changed

+518
-71
lines changed

14 files changed

+518
-71
lines changed

‎cli/ping.go‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@ func (r *RootCmd) ping() *serpent.Command {
5858
_,_=fmt.Fprintln(inv.Stderr,"Direct connections disabled.")
5959
opts.BlockEndpoints=true
6060
}
61+
ifr.noNetworkTelemetry {
62+
opts.EnableTelemetry=true
63+
}
6164
conn,err:=workspacesdk.New(client).DialAgent(ctx,workspaceAgent.ID,opts)
6265
iferr!=nil {
6366
returnerr

‎cli/portforward.go‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,9 @@ func (r *RootCmd) portForward() *serpent.Command {
106106
_,_=fmt.Fprintln(inv.Stderr,"Direct connections disabled.")
107107
opts.BlockEndpoints=true
108108
}
109+
ifr.noNetworkTelemetry {
110+
opts.EnableTelemetry=true
111+
}
109112
conn,err:=workspacesdk.New(client).DialAgent(ctx,workspaceAgent.ID,opts)
110113
iferr!=nil {
111114
returnerr

‎cli/root.go‎

Lines changed: 41 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ var (
5252
)
5353

5454
const (
55+
<<<<<<<HEAD
5556
varURL="url"
5657
varToken="token"
5758
varAgentToken="agent-token"
@@ -65,6 +66,23 @@ const (
6566
varForceTty="force-tty"
6667
varVerbose="verbose"
6768
varDisableDirect="disable-direct-connections"
69+
=======
70+
varURL="url"
71+
varToken="token"
72+
varAgentToken="agent-token"
73+
varAgentTokenFile="agent-token-file"
74+
varAgentURL="agent-url"
75+
varHeader="header"
76+
varHeaderCommand="header-command"
77+
varNoOpen="no-open"
78+
varNoVersionCheck="no-version-warning"
79+
varNoFeatureWarning="no-feature-warning"
80+
varForceTty="force-tty"
81+
varVerbose="verbose"
82+
varOrganizationSelect="organization"
83+
varDisableDirect="disable-direct-connections"
84+
varDisableNetworkTelemetry="disable-network-telemetry"
85+
>>>>>>>365c3bc71 (chore:addDRPCtailnet&cliimplementation)
6886

6987
notLoggedInMessage="You are not logged in. Try logging in using 'coder login <url>'."
7088

@@ -435,6 +453,13 @@ func (r *RootCmd) Command(subcommands []*serpent.Command) (*serpent.Command, err
435453
Value:serpent.BoolOf(&r.disableDirect),
436454
Group:globalGroup,
437455
},
456+
{
457+
Flag:varDisableNetworkTelemetry,
458+
Env:"CODER_DISABLE_NETWORK_TELEMETRY",
459+
Description:"Disable network telemetry.",
460+
Value:serpent.BoolOf(&r.noNetworkTelemetry),
461+
Group:globalGroup,
462+
},
438463
{
439464
Flag:"debug-http",
440465
Description:"Debug codersdk HTTP requests.",
@@ -466,20 +491,22 @@ func (r *RootCmd) Command(subcommands []*serpent.Command) (*serpent.Command, err
466491

467492
// RootCmd contains parameters and helpers useful to all commands.
468493
typeRootCmdstruct {
469-
clientURL*url.URL
470-
tokenstring
471-
globalConfigstring
472-
header []string
473-
headerCommandstring
474-
agentTokenstring
475-
agentTokenFilestring
476-
agentURL*url.URL
477-
forceTTYbool
478-
noOpenbool
479-
verbosebool
480-
versionFlagbool
481-
disableDirectbool
482-
debugHTTPbool
494+
clientURL*url.URL
495+
tokenstring
496+
globalConfigstring
497+
header []string
498+
headerCommandstring
499+
agentTokenstring
500+
agentTokenFilestring
501+
agentURL*url.URL
502+
forceTTYbool
503+
noOpenbool
504+
verbosebool
505+
organizationSelectstring
506+
versionFlagbool
507+
disableDirectbool
508+
debugHTTPbool
509+
noNetworkTelemetrybool
483510

484511
noVersionCheckbool
485512
noFeatureWarningbool

‎cli/speedtest.go‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,9 @@ func (r *RootCmd) speedtest() *serpent.Command {
102102
_,_=fmt.Fprintln(inv.Stderr,"Direct connections disabled.")
103103
opts.BlockEndpoints=true
104104
}
105+
ifr.noNetworkTelemetry {
106+
opts.EnableTelemetry=true
107+
}
105108
ifpcapFile!="" {
106109
s:=capture.New()
107110
opts.CaptureHook=s.LogPacket

‎cli/ssh.go‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -243,8 +243,9 @@ func (r *RootCmd) ssh() *serpent.Command {
243243
}
244244
conn,err:=workspacesdk.New(client).
245245
DialAgent(ctx,workspaceAgent.ID,&workspacesdk.DialAgentOptions{
246-
Logger:logger,
247-
BlockEndpoints:r.disableDirect,
246+
Logger:logger,
247+
BlockEndpoints:r.disableDirect,
248+
EnableTelemetry:!r.noNetworkTelemetry,
248249
})
249250
iferr!=nil {
250251
returnxerrors.Errorf("dial agent: %w",err)

‎cli/testdata/coder_--help.golden‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,9 @@ variables or flags.
6666
--disable-direct-connections bool, $CODER_DISABLE_DIRECT_CONNECTIONS
6767
Disable direct (P2P) connections to workspaces.
6868

69+
--disable-network-telemetry bool, $CODER_DISABLE_NETWORK_TELEMETRY
70+
Disable network telemetry.
71+
6972
--global-config string, $CODER_CONFIG_DIR (default: ~/.config/coderv2)
7073
Path to the global `coder` config directory.
7174

‎codersdk/workspacesdk/connector.go‎

Lines changed: 50 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -58,32 +58,28 @@ type tailnetAPIConnector struct {
5858
coordinateURLstring
5959
dialOptions*websocket.DialOptions
6060
conntailnetConn
61+
customDialFnfunc() (proto.DRPCTailnetClient,error)
62+
63+
clientMu sync.RWMutex
64+
client proto.DRPCTailnetClient
6165

6266
connectedchanerror
6367
isFirstbool
6468
closedchanstruct{}
6569
}
6670

67-
// runTailnetAPIConnector creates and runs a tailnetAPIConnector
68-
funcrunTailnetAPIConnector(
69-
ctx context.Context,logger slog.Logger,
70-
agentID uuid.UUID,coordinateURLstring,dialOptions*websocket.DialOptions,
71-
conntailnetConn,
72-
)*tailnetAPIConnector {
73-
tac:=&tailnetAPIConnector{
71+
// Create a new tailnetAPIConnector without running it
72+
funcnewTailnetAPIConnector(ctx context.Context,logger slog.Logger,agentID uuid.UUID,coordinateURLstring,dialOptions*websocket.DialOptions)*tailnetAPIConnector {
73+
return&tailnetAPIConnector{
7474
ctx:ctx,
7575
logger:logger,
7676
agentID:agentID,
7777
coordinateURL:coordinateURL,
7878
dialOptions:dialOptions,
79-
conn:conn,
79+
conn:nil,
8080
connected:make(chanerror,1),
8181
closed:make(chanstruct{}),
8282
}
83-
tac.gracefulCtx,tac.cancelGracefulCtx=context.WithCancel(context.Background())
84-
gotac.manageGracefulTimeout()
85-
gotac.run()
86-
returntac
8783
}
8884

8985
// manageGracefulTimeout allows the gracefulContext to last 1 second longer than the main context
@@ -99,21 +95,27 @@ func (tac *tailnetAPIConnector) manageGracefulTimeout() {
9995
}
10096
}
10197

102-
func (tac*tailnetAPIConnector)run() {
103-
tac.isFirst=true
104-
deferclose(tac.closed)
105-
forretrier:=retry.New(50*time.Millisecond,10*time.Second);retrier.Wait(tac.ctx); {
106-
tailnetClient,err:=tac.dial()
107-
ifxerrors.Is(err,&codersdk.Error{}) {
108-
return
109-
}
110-
iferr!=nil {
111-
continue
98+
// Runs a tailnetAPIConnector using the provided connection
99+
func (tac*tailnetAPIConnector)runConnector(conntailnetConn) {
100+
tac.conn=conn
101+
tac.gracefulCtx,tac.cancelGracefulCtx=context.WithCancel(context.Background())
102+
gotac.manageGracefulTimeout()
103+
gofunc() {
104+
tac.isFirst=true
105+
deferclose(tac.closed)
106+
forretrier:=retry.New(50*time.Millisecond,10*time.Second);retrier.Wait(tac.ctx); {
107+
tailnetClient,err:=tac.dial()
108+
iferr!=nil {
109+
continue
110+
}
111+
tac.clientMu.Lock()
112+
tac.client=tailnetClient
113+
tac.clientMu.Unlock()
114+
tac.logger.Debug(tac.ctx,"obtained tailnet API v2+ client")
115+
tac.coordinateAndDERPMap(tailnetClient)
116+
tac.logger.Debug(tac.ctx,"tailnet API v2+ connection lost")
112117
}
113-
tac.logger.Debug(tac.ctx,"obtained tailnet API v2+ client")
114-
tac.coordinateAndDERPMap(tailnetClient)
115-
tac.logger.Debug(tac.ctx,"tailnet API v2+ connection lost")
116-
}
118+
}()
117119
}
118120

119121
varpermanentErrorStatuses= []int{
@@ -123,6 +125,10 @@ var permanentErrorStatuses = []int{
123125
}
124126

125127
func (tac*tailnetAPIConnector)dial() (proto.DRPCTailnetClient,error) {
128+
iftac.customDialFn!=nil {
129+
returntac.customDialFn()
130+
}
131+
126132
tac.logger.Debug(tac.ctx,"dialing Coder tailnet v2+ API")
127133
// nolint:bodyclose
128134
ws,res,err:=websocket.Dial(tac.ctx,tac.coordinateURL,tac.dialOptions)
@@ -194,7 +200,10 @@ func (tac *tailnetAPIConnector) coordinateAndDERPMap(client proto.DRPCTailnetCli
194200
// we do NOT want to gracefully disconnect on the coordinate() routine. So, we'll just
195201
// close the underlying connection. This will trigger a retry of the control plane in
196202
// run().
203+
tac.clientMu.Lock()
197204
client.DRPCConn().Close()
205+
tac.client=nil
206+
tac.clientMu.Unlock()
198207
// Note that derpMap() logs it own errors, we don't bother here.
199208
}
200209
}()
@@ -258,3 +267,18 @@ func (tac *tailnetAPIConnector) derpMap(client proto.DRPCTailnetClient) error {
258267
tac.conn.SetDERPMap(dm)
259268
}
260269
}
270+
271+
func (tac*tailnetAPIConnector)SendTelemetryEvent(event*proto.TelemetryEvent) {
272+
tac.clientMu.RLock()
273+
// We hold the lock for the entire telemetry request, but this would only block
274+
// a coordinate retry, and closing the connection.
275+
defertac.clientMu.RUnlock()
276+
iftac.client==nil {
277+
return
278+
}
279+
ctx,cancel:=context.WithTimeout(tac.ctx,5*time.Second)
280+
defercancel()
281+
_,_=tac.client.PostTelemetry(ctx,&proto.TelemetryRequest{
282+
Events: []*proto.TelemetryEvent{event},
283+
})
284+
}

‎codersdk/workspacesdk/connector_internal_test.go‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,8 @@ func TestTailnetAPIConnector_Disconnects(t *testing.T) {
7575

7676
fConn:=newFakeTailnetConn()
7777

78-
uut:=runTailnetAPIConnector(ctx,logger,agentID,svr.URL,&websocket.DialOptions{},fConn)
78+
uut:=newTailnetAPIConnector(ctx,logger,agentID,svr.URL,&websocket.DialOptions{})
79+
uut.runConnector(fConn)
7980

8081
call:=testutil.RequireRecvCtx(ctx,t,fCoord.CoordinateCalls)
8182
reqTun:=testutil.RequireRecvCtx(ctx,t,call.Reqs)

‎codersdk/workspacesdk/workspacesdk.go‎

Lines changed: 35 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,9 @@ type DialAgentOptions struct {
181181
// CaptureHook is a callback that captures Disco packets and packets sent
182182
// into the tailnet tunnel.
183183
CaptureHook capture.Callback
184+
// Whether the client will send network telemetry events
185+
// Enable instead of Disable so it's initialized to false
186+
EnableTelemetrybool
184187
}
185188

186189
func (c*Client)DialAgent(dialCtx context.Context,agentID uuid.UUID,options*DialAgentOptions) (agentConn*AgentConn,errerror) {
@@ -196,29 +199,6 @@ func (c *Client) DialAgent(dialCtx context.Context, agentID uuid.UUID, options *
196199
options.BlockEndpoints=true
197200
}
198201

199-
ip:=tailnet.IP()
200-
varheader http.Header
201-
ifheaderTransport,ok:=c.client.HTTPClient.Transport.(*codersdk.HeaderTransport);ok {
202-
header=headerTransport.Header
203-
}
204-
conn,err:=tailnet.NewConn(&tailnet.Options{
205-
Addresses: []netip.Prefix{netip.PrefixFrom(ip,128)},
206-
DERPMap:connInfo.DERPMap,
207-
DERPHeader:&header,
208-
DERPForceWebSockets:connInfo.DERPForceWebSockets,
209-
Logger:options.Logger,
210-
BlockEndpoints:c.client.DisableDirectConnections||options.BlockEndpoints,
211-
CaptureHook:options.CaptureHook,
212-
})
213-
iferr!=nil {
214-
returnnil,xerrors.Errorf("create tailnet: %w",err)
215-
}
216-
deferfunc() {
217-
iferr!=nil {
218-
_=conn.Close()
219-
}
220-
}()
221-
222202
headers:=make(http.Header)
223203
tokenHeader:=codersdk.SessionTokenHeader
224204
ifc.client.SessionTokenHeader!="" {
@@ -251,16 +231,43 @@ func (c *Client) DialAgent(dialCtx context.Context, agentID uuid.UUID, options *
251231
q.Add("version","2.0")
252232
coordinateURL.RawQuery=q.Encode()
253233

254-
connector:=runTailnetAPIConnector(ctx,options.Logger,
255-
agentID,coordinateURL.String(),
234+
connector:=newTailnetAPIConnector(ctx,options.Logger,agentID,coordinateURL.String(),
256235
&websocket.DialOptions{
257236
HTTPClient:c.client.HTTPClient,
258237
HTTPHeader:headers,
259238
// Need to disable compression to avoid a data-race.
260239
CompressionMode:websocket.CompressionDisabled,
261-
},
262-
conn,
263-
)
240+
})
241+
242+
ip:=tailnet.IP()
243+
varheader http.Header
244+
ifheaderTransport,ok:=c.client.HTTPClient.Transport.(*codersdk.HeaderTransport);ok {
245+
header=headerTransport.Header
246+
}
247+
vartelemetrySink tailnet.TelemetrySink
248+
ifoptions.EnableTelemetry {
249+
telemetrySink=connector
250+
}
251+
conn,err:=tailnet.NewConn(&tailnet.Options{
252+
Addresses: []netip.Prefix{netip.PrefixFrom(ip,128)},
253+
DERPMap:connInfo.DERPMap,
254+
DERPHeader:&header,
255+
DERPForceWebSockets:connInfo.DERPForceWebSockets,
256+
Logger:options.Logger,
257+
BlockEndpoints:c.client.DisableDirectConnections||options.BlockEndpoints,
258+
CaptureHook:options.CaptureHook,
259+
TelemetrySink:telemetrySink,
260+
})
261+
iferr!=nil {
262+
returnnil,xerrors.Errorf("create tailnet: %w",err)
263+
}
264+
deferfunc() {
265+
iferr!=nil {
266+
_=conn.Close()
267+
}
268+
}()
269+
connector.runConnector(conn)
270+
264271
options.Logger.Debug(ctx,"running tailnet API v2+ connector")
265272

266273
select {

‎docs/cli.md‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,15 @@ Enable verbose output.
149149

150150
Disable direct (P2P) connections to workspaces.
151151

152+
###--disable-network-telemetry
153+
154+
|||
155+
| -----------| ---------------------------------------------|
156+
| Type| <code>bool</code>|
157+
| Environment| <code>$CODER_DISABLE_NETWORK_TELEMETRY</code>|
158+
159+
Disable network telemetry.
160+
152161
###--global-config
153162

154163
|||

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp