Skip to content

Commit fa025f4

Browse files
committed
fixup! wip: coder: agent: register version on agent
1 parent 9279214 commit fa025f4

File tree

4 files changed

+36
-21
lines changed

4 files changed

+36
-21
lines changed

cli/agent.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@ func workspaceAgent() *cobra.Command {
5454
}
5555
defer logWriter.Close()
5656
logger := slog.Make(sloghuman.Sink(cmd.ErrOrStderr()), sloghuman.Sink(logWriter)).Leveled(slog.LevelDebug)
57-
logger.Info(cmd.Context(), "coder agent version: "+buildinfo.Version())
5857

5958
isLinux := runtime.GOOS == "linux"
6059

@@ -75,7 +74,12 @@ func workspaceAgent() *cobra.Command {
7574
return nil
7675
}
7776

78-
logger.Info(cmd.Context(), "starting agent", slog.F("url", coderURL), slog.F("auth", auth))
77+
version := buildinfo.Version()
78+
logger.Info(cmd.Context(), "starting agent",
79+
slog.F("url", coderURL),
80+
slog.F("auth", auth),
81+
slog.F("version", version),
82+
)
7983
client := codersdk.New(coderURL)
8084

8185
if pprofEnabled {
@@ -174,6 +178,10 @@ func workspaceAgent() *cobra.Command {
174178
return xerrors.Errorf("add executable to $PATH: %w", err)
175179
}
176180

181+
if err := client.PostWorkspaceAgentVersion(cmd.Context(), version); err != nil {
182+
logger.Error(cmd.Context(), "post agent version: %w", slog.Error(err), slog.F("version", version))
183+
}
184+
177185
closer := agent.New(client.ListenWorkspaceAgent, &agent.Options{
178186
Logger: logger,
179187
EnvironmentVariables: map[string]string{

cli/agent_test.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"testing"
66

7+
"github.com/stretchr/testify/assert"
78
"github.com/stretchr/testify/require"
89

910
"github.com/coder/coder/cli/clitest"
@@ -59,6 +60,9 @@ func TestWorkspaceAgent(t *testing.T) {
5960
coderdtest.AwaitWorkspaceAgents(t, client, workspace.LatestBuild.ID)
6061
resources, err := client.WorkspaceResourcesByBuild(ctx, workspace.LatestBuild.ID)
6162
require.NoError(t, err)
63+
if assert.NotEmpty(t, resources) && assert.NotEmpty(t, resources[0].Agents) {
64+
assert.NotEmpty(t, resources[0].Agents[0].Version)
65+
}
6266
dialer, err := client.DialWorkspaceAgent(ctx, resources[0].Agents[0].ID, nil)
6367
require.NoError(t, err)
6468
defer dialer.Close()
@@ -114,6 +118,9 @@ func TestWorkspaceAgent(t *testing.T) {
114118
coderdtest.AwaitWorkspaceAgents(t, client, workspace.LatestBuild.ID)
115119
resources, err := client.WorkspaceResourcesByBuild(ctx, workspace.LatestBuild.ID)
116120
require.NoError(t, err)
121+
if assert.NotEmpty(t, resources) && assert.NotEmpty(t, resources[0].Agents) {
122+
assert.NotEmpty(t, resources[0].Agents[0].Version)
123+
}
117124
dialer, err := client.DialWorkspaceAgent(ctx, resources[0].Agents[0].ID, nil)
118125
require.NoError(t, err)
119126
defer dialer.Close()
@@ -169,6 +176,9 @@ func TestWorkspaceAgent(t *testing.T) {
169176
coderdtest.AwaitWorkspaceAgents(t, client, workspace.LatestBuild.ID)
170177
resources, err := client.WorkspaceResourcesByBuild(ctx, workspace.LatestBuild.ID)
171178
require.NoError(t, err)
179+
if assert.NotEmpty(t, resources) && assert.NotEmpty(t, resources[0].Agents) {
180+
assert.NotEmpty(t, resources[0].Agents[0].Version)
181+
}
172182
dialer, err := client.DialWorkspaceAgent(ctx, resources[0].Agents[0].ID, nil)
173183
require.NoError(t, err)
174184
defer dialer.Close()

coderd/workspaceagents.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,14 +165,16 @@ func (api *API) postWorkspaceAgentVersion(rw http.ResponseWriter, r *http.Reques
165165
}
166166

167167
var req codersdk.PostWorkspaceAgentVersionRequest
168-
if err := json.NewDecoder(r.Body).Decode(req); err != nil {
168+
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
169169
httpapi.Write(rw, http.StatusInternalServerError, codersdk.Response{
170170
Message: "Invalid request to set workspace agent version.",
171171
Detail: err.Error(),
172172
})
173173
return
174174
}
175175

176+
api.Logger.Info(r.Context(), "post workspace agent version", slog.F("agent_id", apiAgent.ID), slog.F("agent_version", req.Version))
177+
176178
if !semver.IsValid(req.Version) {
177179
httpapi.Write(rw, http.StatusBadRequest, codersdk.Response{
178180
Message: "Invalid workspace agent version provided.",
@@ -193,7 +195,6 @@ func (api *API) postWorkspaceAgentVersion(rw http.ResponseWriter, r *http.Reques
193195
}
194196

195197
httpapi.Write(rw, http.StatusOK, nil)
196-
return
197198
}
198199

199200
func (api *API) workspaceAgentListen(rw http.ResponseWriter, r *http.Request) {

codersdk/workspaceagents.go

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package codersdk
22

33
import (
4-
"bytes"
54
"context"
65
"encoding/json"
76
"fmt"
@@ -21,7 +20,6 @@ import (
2120
"cdr.dev/slog"
2221

2322
"github.com/coder/coder/agent"
24-
"github.com/coder/coder/buildinfo"
2523
"github.com/coder/coder/coderd/turnconn"
2624
"github.com/coder/coder/peer"
2725
"github.com/coder/coder/peer/peerwg"
@@ -247,21 +245,6 @@ func (c *Client) ListenWorkspaceAgent(ctx context.Context, logger slog.Logger) (
247245
return agent.Metadata{}, nil, xerrors.Errorf("listen peerbroker: %w", err)
248246
}
249247

250-
// Phone home and tell the mothership what version we're on.
251-
var agentVersionPayload bytes.Buffer
252-
if err := json.NewEncoder(&agentVersionPayload).Encode(&PostWorkspaceAgentVersionRequest{Version: buildinfo.Version()}); err != nil {
253-
// This should not be a fatal error, but also should not pass unnoticed.
254-
logger.Error(ctx, "unable to encode agent version", slog.Error(err))
255-
} else {
256-
res, err = c.Request(ctx, http.MethodPost, "/api/v2/workspaceagents/me/metadata", agentVersionPayload)
257-
if err != nil {
258-
// Again, don't crash and burn if we can't phone home, but don't keep stumm either.
259-
logger.Error(ctx, "unable to inform coderd of agent version", slog.Error(err))
260-
}
261-
// Discord the response
262-
_, _ = io.Copy(io.Discard, res.Body)
263-
_ = res.Body.Close()
264-
}
265248
// Fetch updated agent metadata
266249
res, err = c.Request(ctx, http.MethodGet, "/api/v2/workspaceagents/me/metadata", nil)
267250
if err != nil {
@@ -452,6 +435,19 @@ func (c *Client) WorkspaceAgent(ctx context.Context, id uuid.UUID) (WorkspaceAge
452435
return workspaceAgent, json.NewDecoder(res.Body).Decode(&workspaceAgent)
453436
}
454437

438+
func (c *Client) PostWorkspaceAgentVersion(ctx context.Context, version string) error {
439+
// Phone home and tell the mothership what version we're on.
440+
versionReq := PostWorkspaceAgentVersionRequest{Version: version}
441+
res, err := c.Request(ctx, http.MethodPost, "/api/v2/workspaceagents/me/version", versionReq)
442+
if err != nil {
443+
return readBodyAsError(res)
444+
}
445+
// Discord the response
446+
_, _ = io.Copy(io.Discard, res.Body)
447+
_ = res.Body.Close()
448+
return nil
449+
}
450+
455451
// WorkspaceAgentReconnectingPTY spawns a PTY that reconnects using the token provided.
456452
// It communicates using `agent.ReconnectingPTYRequest` marshaled as JSON.
457453
// Responses are PTY output that can be rendered.

0 commit comments

Comments
 (0)