Skip to content

Commit 1e8a9c0

Browse files
authored
chore: remove legacy wsconncache (#11816)
Fixes #8218 Removes `wsconncache` and related "is legacy?" functions and API calls that were used by it. The only leftover is that Agents still use the legacy IP, so that back level clients or workspace proxies can dial them correctly. We should eventually remove this: #11819
1 parent 13e24f2 commit 1e8a9c0

24 files changed

+36
-1238
lines changed

.vscode/settings.json

-1
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,6 @@
170170
"workspaceapps",
171171
"workspacebuilds",
172172
"workspacename",
173-
"wsconncache",
174173
"wsjson",
175174
"xerrors",
176175
"xlarge",

coderd/apidoc/docs.go

-49
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/apidoc/swagger.json

-45
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/coderd.go

-2
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@ import (
6565
"github.com/coder/coder/v2/coderd/updatecheck"
6666
"github.com/coder/coder/v2/coderd/util/slice"
6767
"github.com/coder/coder/v2/coderd/workspaceapps"
68-
"github.com/coder/coder/v2/coderd/wsconncache"
6968
"github.com/coder/coder/v2/codersdk"
7069
"github.com/coder/coder/v2/codersdk/drpc"
7170
"github.com/coder/coder/v2/provisionerd/proto"
@@ -481,7 +480,6 @@ func New(options *Options) *API {
481480
func(context.Context) (tailnet.MultiAgentConn, error) {
482481
return (*api.TailnetCoordinator.Load()).ServeMultiAgent(uuid.New()), nil
483482
},
484-
wsconncache.New(api._dialWorkspaceAgentTailnet, 0),
485483
api.TracerProvider,
486484
)
487485
if err != nil {

coderd/tailnet.go

+13-30
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import (
2222
"cdr.dev/slog"
2323
"github.com/coder/coder/v2/coderd/tracing"
2424
"github.com/coder/coder/v2/coderd/workspaceapps"
25-
"github.com/coder/coder/v2/coderd/wsconncache"
2625
"github.com/coder/coder/v2/codersdk"
2726
"github.com/coder/coder/v2/site"
2827
"github.com/coder/coder/v2/tailnet"
@@ -41,16 +40,14 @@ func init() {
4140

4241
var _ workspaceapps.AgentProvider = (*ServerTailnet)(nil)
4342

44-
// NewServerTailnet creates a new tailnet intended for use by coderd. It
45-
// automatically falls back to wsconncache if a legacy agent is encountered.
43+
// NewServerTailnet creates a new tailnet intended for use by coderd.
4644
func NewServerTailnet(
4745
ctx context.Context,
4846
logger slog.Logger,
4947
derpServer *derp.Server,
5048
derpMapFn func() *tailcfg.DERPMap,
5149
derpForceWebSockets bool,
5250
getMultiAgent func(context.Context) (tailnet.MultiAgentConn, error),
53-
cache *wsconncache.Cache,
5451
traceProvider trace.TracerProvider,
5552
) (*ServerTailnet, error) {
5653
logger = logger.Named("servertailnet")
@@ -97,7 +94,6 @@ func NewServerTailnet(
9794
conn: conn,
9895
coordinatee: conn,
9996
getMultiAgent: getMultiAgent,
100-
cache: cache,
10197
agentConnectionTimes: map[uuid.UUID]time.Time{},
10298
agentTickets: map[uuid.UUID]map[uuid.UUID]struct{}{},
10399
transport: tailnetTransport.Clone(),
@@ -299,7 +295,6 @@ type ServerTailnet struct {
299295

300296
getMultiAgent func(context.Context) (tailnet.MultiAgentConn, error)
301297
agentConn atomic.Pointer[tailnet.MultiAgentConn]
302-
cache *wsconncache.Cache
303298
nodesMu sync.Mutex
304299
// agentConnectionTimes is a map of agent tailnetNodes the server wants to
305300
// keep a connection to. It contains the last time the agent was connected
@@ -311,7 +306,7 @@ type ServerTailnet struct {
311306
transport *http.Transport
312307
}
313308

314-
func (s *ServerTailnet) ReverseProxy(targetURL, dashboardURL *url.URL, agentID uuid.UUID) (_ *httputil.ReverseProxy, release func(), _ error) {
309+
func (s *ServerTailnet) ReverseProxy(targetURL, dashboardURL *url.URL, agentID uuid.UUID) *httputil.ReverseProxy {
315310
proxy := httputil.NewSingleHostReverseProxy(targetURL)
316311
proxy.ErrorHandler = func(w http.ResponseWriter, r *http.Request, err error) {
317312
site.RenderStaticErrorPage(w, r, site.ErrorPageData{
@@ -325,7 +320,7 @@ func (s *ServerTailnet) ReverseProxy(targetURL, dashboardURL *url.URL, agentID u
325320
proxy.Director = s.director(agentID, proxy.Director)
326321
proxy.Transport = s.transport
327322

328-
return proxy, func() {}, nil
323+
return proxy
329324
}
330325

331326
type agentIDKey struct{}
@@ -387,28 +382,17 @@ func (s *ServerTailnet) AgentConn(ctx context.Context, agentID uuid.UUID) (*code
387382
ret func()
388383
)
389384

390-
if s.getAgentConn().AgentIsLegacy(agentID) {
391-
s.logger.Debug(s.ctx, "acquiring legacy agent", slog.F("agent_id", agentID))
392-
cconn, release, err := s.cache.Acquire(agentID)
393-
if err != nil {
394-
return nil, nil, xerrors.Errorf("acquire legacy agent conn: %w", err)
395-
}
396-
397-
conn = cconn.WorkspaceAgentConn
398-
ret = release
399-
} else {
400-
s.logger.Debug(s.ctx, "acquiring agent", slog.F("agent_id", agentID))
401-
err := s.ensureAgent(agentID)
402-
if err != nil {
403-
return nil, nil, xerrors.Errorf("ensure agent: %w", err)
404-
}
405-
ret = s.acquireTicket(agentID)
406-
407-
conn = codersdk.NewWorkspaceAgentConn(s.conn, codersdk.WorkspaceAgentConnOptions{
408-
AgentID: agentID,
409-
CloseFunc: func() error { return codersdk.ErrSkipClose },
410-
})
385+
s.logger.Debug(s.ctx, "acquiring agent", slog.F("agent_id", agentID))
386+
err := s.ensureAgent(agentID)
387+
if err != nil {
388+
return nil, nil, xerrors.Errorf("ensure agent: %w", err)
411389
}
390+
ret = s.acquireTicket(agentID)
391+
392+
conn = codersdk.NewWorkspaceAgentConn(s.conn, codersdk.WorkspaceAgentConnOptions{
393+
AgentID: agentID,
394+
CloseFunc: func() error { return codersdk.ErrSkipClose },
395+
})
412396

413397
// Since we now have an open conn, be careful to close it if we error
414398
// without returning it to the user.
@@ -458,7 +442,6 @@ func (c *netConnCloser) Close() error {
458442

459443
func (s *ServerTailnet) Close() error {
460444
s.cancel()
461-
_ = s.cache.Close()
462445
_ = s.conn.Close()
463446
s.transport.CloseIdleConnections()
464447
<-s.derpMapUpdaterClosed

coderd/tailnet_test.go

+2-86
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import (
2121
"github.com/coder/coder/v2/agent"
2222
"github.com/coder/coder/v2/agent/agenttest"
2323
"github.com/coder/coder/v2/coderd"
24-
"github.com/coder/coder/v2/coderd/wsconncache"
2524
"github.com/coder/coder/v2/codersdk"
2625
"github.com/coder/coder/v2/codersdk/agentsdk"
2726
"github.com/coder/coder/v2/tailnet"
@@ -45,24 +44,6 @@ func TestServerTailnet_AgentConn_OK(t *testing.T) {
4544
assert.True(t, conn.AwaitReachable(ctx))
4645
}
4746

48-
func TestServerTailnet_AgentConn_Legacy(t *testing.T) {
49-
t.Parallel()
50-
51-
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitMedium)
52-
defer cancel()
53-
54-
// Force a connection through wsconncache using the legacy hardcoded ip.
55-
agentID, _, serverTailnet := setupAgent(t, []netip.Prefix{
56-
netip.PrefixFrom(codersdk.WorkspaceAgentIP, 128),
57-
})
58-
59-
conn, release, err := serverTailnet.AgentConn(ctx, agentID)
60-
require.NoError(t, err)
61-
defer release()
62-
63-
assert.True(t, conn.AwaitReachable(ctx))
64-
}
65-
6647
func TestServerTailnet_ReverseProxy(t *testing.T) {
6748
t.Parallel()
6849

@@ -77,9 +58,7 @@ func TestServerTailnet_ReverseProxy(t *testing.T) {
7758
u, err := url.Parse(fmt.Sprintf("http://127.0.0.1:%d", codersdk.WorkspaceAgentHTTPAPIServerPort))
7859
require.NoError(t, err)
7960

80-
rp, release, err := serverTailnet.ReverseProxy(u, u, agentID)
81-
require.NoError(t, err)
82-
defer release()
61+
rp := serverTailnet.ReverseProxy(u, u, agentID)
8362

8463
rw := httptest.NewRecorder()
8564
req := httptest.NewRequest(
@@ -113,9 +92,7 @@ func TestServerTailnet_ReverseProxy(t *testing.T) {
11392
uri, err := url.Parse(s.URL)
11493
require.NoError(t, err)
11594

116-
rp, release, err := serverTailnet.ReverseProxy(uri, uri, agentID)
117-
require.NoError(t, err)
118-
defer release()
95+
rp := serverTailnet.ReverseProxy(uri, uri, agentID)
11996

12097
rw := httptest.NewRecorder()
12198
req := httptest.NewRequest(
@@ -130,38 +107,6 @@ func TestServerTailnet_ReverseProxy(t *testing.T) {
130107

131108
assert.Equal(t, expectedResponseCode, res.StatusCode)
132109
})
133-
134-
t.Run("Legacy", func(t *testing.T) {
135-
t.Parallel()
136-
137-
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
138-
defer cancel()
139-
140-
// Force a connection through wsconncache using the legacy hardcoded ip.
141-
agentID, _, serverTailnet := setupAgent(t, []netip.Prefix{
142-
netip.PrefixFrom(codersdk.WorkspaceAgentIP, 128),
143-
})
144-
145-
u, err := url.Parse(fmt.Sprintf("http://127.0.0.1:%d", codersdk.WorkspaceAgentHTTPAPIServerPort))
146-
require.NoError(t, err)
147-
148-
rp, release, err := serverTailnet.ReverseProxy(u, u, agentID)
149-
require.NoError(t, err)
150-
defer release()
151-
152-
rw := httptest.NewRecorder()
153-
req := httptest.NewRequest(
154-
http.MethodGet,
155-
u.String(),
156-
nil,
157-
).WithContext(ctx)
158-
159-
rp.ServeHTTP(rw, req)
160-
res := rw.Result()
161-
defer res.Body.Close()
162-
163-
assert.Equal(t, http.StatusOK, res.StatusCode)
164-
})
165110
}
166111

167112
func setupAgent(t *testing.T, agentAddresses []netip.Prefix) (uuid.UUID, agent.Agent, *coderd.ServerTailnet) {
@@ -197,42 +142,13 @@ func setupAgent(t *testing.T, agentAddresses []netip.Prefix) (uuid.UUID, agent.A
197142
return coord.Node(manifest.AgentID) != nil
198143
}, testutil.WaitShort, testutil.IntervalFast)
199144

200-
cache := wsconncache.New(func(id uuid.UUID) (*codersdk.WorkspaceAgentConn, error) {
201-
conn, err := tailnet.NewConn(&tailnet.Options{
202-
Addresses: []netip.Prefix{netip.PrefixFrom(tailnet.IP(), 128)},
203-
DERPMap: manifest.DERPMap,
204-
Logger: logger.Named("client"),
205-
})
206-
require.NoError(t, err)
207-
t.Cleanup(func() {
208-
_ = conn.Close()
209-
})
210-
clientID := uuid.New()
211-
testCtx, testCtxCancel := context.WithCancel(context.Background())
212-
t.Cleanup(testCtxCancel)
213-
coordination := tailnet.NewInMemoryCoordination(
214-
testCtx, logger,
215-
clientID, manifest.AgentID,
216-
coord, conn,
217-
)
218-
t.Cleanup(func() {
219-
_ = coordination.Close()
220-
})
221-
return codersdk.NewWorkspaceAgentConn(conn, codersdk.WorkspaceAgentConnOptions{
222-
AgentID: manifest.AgentID,
223-
AgentIP: codersdk.WorkspaceAgentIP,
224-
CloseFunc: func() error { return codersdk.ErrSkipClose },
225-
}), nil
226-
}, 0)
227-
228145
serverTailnet, err := coderd.NewServerTailnet(
229146
context.Background(),
230147
logger,
231148
derpServer,
232149
func() *tailcfg.DERPMap { return manifest.DERPMap },
233150
false,
234151
func(context.Context) (tailnet.MultiAgentConn, error) { return coord.ServeMultiAgent(uuid.New()), nil },
235-
cache,
236152
trace.NewNoopTracerProvider(),
237153
)
238154
require.NoError(t, err)

0 commit comments

Comments
 (0)