From e89259ad9492eedc37921c2e8716d641b6538731 Mon Sep 17 00:00:00 2001 From: Mathias Fredriksson Date: Thu, 5 Oct 2023 09:15:13 +0000 Subject: [PATCH] feat(codersdk/agentsdk): use new agent metadata batch endpoint --- agent/agent.go | 11 +++++++++-- agent/agent_test.go | 4 ++-- agent/agenttest/client.go | 14 ++++++++------ coderd/workspaceagents_test.go | 14 ++++++++++---- coderd/wsconncache/wsconncache_test.go | 2 +- codersdk/agentsdk/agentsdk.go | 4 ++-- 6 files changed, 32 insertions(+), 17 deletions(-) diff --git a/agent/agent.go b/agent/agent.go index 68c82eea2d1b1..b4ddc6eb221f5 100644 --- a/agent/agent.go +++ b/agent/agent.go @@ -90,7 +90,7 @@ type Client interface { PostLifecycle(ctx context.Context, state agentsdk.PostLifecycleRequest) error PostAppHealth(ctx context.Context, req agentsdk.PostAppHealthsRequest) error PostStartup(ctx context.Context, req agentsdk.PostStartupRequest) error - PostMetadata(ctx context.Context, key string, req agentsdk.PostMetadataRequestDeprecated) error + PostMetadata(ctx context.Context, req agentsdk.PostMetadataRequest) error PatchLogs(ctx context.Context, req agentsdk.PatchLogs) error GetServiceBanner(ctx context.Context) (codersdk.ServiceBannerConfig, error) } @@ -380,7 +380,14 @@ func (a *agent) reportMetadataLoop(ctx context.Context) { flight := trySingleflight{m: map[string]struct{}{}} postMetadata := func(mr metadataResultAndKey) { - err := a.client.PostMetadata(ctx, mr.key, *mr.result) + err := a.client.PostMetadata(ctx, agentsdk.PostMetadataRequest{ + Metadata: []agentsdk.Metadata{ + { + Key: mr.key, + WorkspaceAgentMetadataResult: *mr.result, + }, + }, + }) if err != nil { a.logger.Error(ctx, "agent failed to report metadata", slog.Error(err)) } diff --git a/agent/agent_test.go b/agent/agent_test.go index 22734678ccb7e..aca521a82f9d2 100644 --- a/agent/agent_test.go +++ b/agent/agent_test.go @@ -1079,7 +1079,7 @@ func TestAgent_Metadata(t *testing.T) { opts.ReportMetadataInterval = 100 * time.Millisecond }) - var gotMd map[string]agentsdk.PostMetadataRequestDeprecated + var gotMd map[string]agentsdk.Metadata require.Eventually(t, func() bool { gotMd = client.GetMetadata() return len(gotMd) == 1 @@ -1112,7 +1112,7 @@ func TestAgent_Metadata(t *testing.T) { opts.ReportMetadataInterval = testutil.IntervalFast }) - var gotMd map[string]agentsdk.PostMetadataRequestDeprecated + var gotMd map[string]agentsdk.Metadata require.Eventually(t, func() bool { gotMd = client.GetMetadata() return len(gotMd) == 1 diff --git a/agent/agenttest/client.go b/agent/agenttest/client.go index ac2b447518f90..22933f4fd2aa7 100644 --- a/agent/agenttest/client.go +++ b/agent/agenttest/client.go @@ -45,7 +45,7 @@ type Client struct { logger slog.Logger agentID uuid.UUID manifest agentsdk.Manifest - metadata map[string]agentsdk.PostMetadataRequestDeprecated + metadata map[string]agentsdk.Metadata statsChan chan *agentsdk.Stats coordinator tailnet.Coordinator LastWorkspaceAgent func() @@ -136,20 +136,22 @@ func (c *Client) GetStartup() agentsdk.PostStartupRequest { return c.startup } -func (c *Client) GetMetadata() map[string]agentsdk.PostMetadataRequestDeprecated { +func (c *Client) GetMetadata() map[string]agentsdk.Metadata { c.mu.Lock() defer c.mu.Unlock() return maps.Clone(c.metadata) } -func (c *Client) PostMetadata(ctx context.Context, key string, req agentsdk.PostMetadataRequestDeprecated) error { +func (c *Client) PostMetadata(ctx context.Context, req agentsdk.PostMetadataRequest) error { c.mu.Lock() defer c.mu.Unlock() if c.metadata == nil { - c.metadata = make(map[string]agentsdk.PostMetadataRequestDeprecated) + c.metadata = make(map[string]agentsdk.Metadata) + } + for _, md := range req.Metadata { + c.metadata[md.Key] = md + c.logger.Debug(ctx, "post metadata", slog.F("key", md.Key), slog.F("md", md)) } - c.metadata[key] = req - c.logger.Debug(ctx, "post metadata", slog.F("key", key), slog.F("req", req)) return nil } diff --git a/coderd/workspaceagents_test.go b/coderd/workspaceagents_test.go index 05ab10cad475e..10028f91fa3f3 100644 --- a/coderd/workspaceagents_test.go +++ b/coderd/workspaceagents_test.go @@ -1217,8 +1217,15 @@ func TestWorkspaceAgent_Metadata(t *testing.T) { require.EqualValues(t, 3, manifest.Metadata[0].Timeout) post := func(key string, mr codersdk.WorkspaceAgentMetadataResult) { - err := agentClient.PostMetadata(ctx, key, mr) - require.NoError(t, err, "post metadata", t) + err := agentClient.PostMetadata(ctx, agentsdk.PostMetadataRequest{ + Metadata: []agentsdk.Metadata{ + { + Key: key, + WorkspaceAgentMetadataResult: mr, + }, + }, + }) + require.NoError(t, err, "post metadata: %s, %#v", key, mr) } workspace, err = client.Workspace(ctx, workspace.ID) @@ -1302,8 +1309,7 @@ func TestWorkspaceAgent_Metadata(t *testing.T) { require.NotEmpty(t, got.Result.Error) unknownKeyMetadata := wantMetadata1 - err = agentClient.PostMetadata(ctx, "unknown", unknownKeyMetadata) - require.NoError(t, err) + post("unknown", unknownKeyMetadata) } func TestWorkspaceAgent_Startup(t *testing.T) { diff --git a/coderd/wsconncache/wsconncache_test.go b/coderd/wsconncache/wsconncache_test.go index e429e90a38ecc..e37809ba61f6e 100644 --- a/coderd/wsconncache/wsconncache_test.go +++ b/coderd/wsconncache/wsconncache_test.go @@ -267,7 +267,7 @@ func (*client) PostAppHealth(_ context.Context, _ agentsdk.PostAppHealthsRequest return nil } -func (*client) PostMetadata(_ context.Context, _ string, _ agentsdk.PostMetadataRequestDeprecated) error { +func (*client) PostMetadata(_ context.Context, _ agentsdk.PostMetadataRequest) error { return nil } diff --git a/codersdk/agentsdk/agentsdk.go b/codersdk/agentsdk/agentsdk.go index 370f325ce28ae..59e4bc9d785b1 100644 --- a/codersdk/agentsdk/agentsdk.go +++ b/codersdk/agentsdk/agentsdk.go @@ -82,8 +82,8 @@ type PostMetadataRequest struct { // performance. type PostMetadataRequestDeprecated = codersdk.WorkspaceAgentMetadataResult -func (c *Client) PostMetadata(ctx context.Context, key string, req PostMetadataRequestDeprecated) error { - res, err := c.SDK.Request(ctx, http.MethodPost, "/api/v2/workspaceagents/me/metadata/"+key, req) +func (c *Client) PostMetadata(ctx context.Context, req PostMetadataRequest) error { + res, err := c.SDK.Request(ctx, http.MethodPost, "/api/v2/workspaceagents/me/metadata", req) if err != nil { return xerrors.Errorf("execute request: %w", err) }