mirror of
https://github.com/coder/coder.git
synced 2025-07-13 21:36:50 +00:00
feat: use agent v2 API to fetch manifest (#11832)
Agent uses the v2 API to obtain the manifest, instead of the HTTP API.
This commit is contained in:
@ -97,6 +97,16 @@ func New(opts Options) *API {
|
||||
AgentFn: api.agent,
|
||||
Database: opts.Database,
|
||||
DerpMapFn: opts.DerpMapFn,
|
||||
WorkspaceIDFn: func(ctx context.Context, wa *database.WorkspaceAgent) (uuid.UUID, error) {
|
||||
if opts.WorkspaceID != uuid.Nil {
|
||||
return opts.WorkspaceID, nil
|
||||
}
|
||||
ws, err := opts.Database.GetWorkspaceByAgentID(ctx, wa.ID)
|
||||
if err != nil {
|
||||
return uuid.Nil, err
|
||||
}
|
||||
return ws.Workspace.ID, nil
|
||||
},
|
||||
}
|
||||
|
||||
api.ServiceBannerAPI = &ServiceBannerAPI{
|
||||
|
@ -23,6 +23,7 @@ import (
|
||||
"cdr.dev/slog/sloggers/slogtest"
|
||||
"github.com/coder/coder/v2/agent"
|
||||
"github.com/coder/coder/v2/agent/agenttest"
|
||||
agentproto "github.com/coder/coder/v2/agent/proto"
|
||||
"github.com/coder/coder/v2/coderd"
|
||||
"github.com/coder/coder/v2/coderd/coderdtest"
|
||||
"github.com/coder/coder/v2/coderd/coderdtest/oidctest"
|
||||
@ -500,8 +501,7 @@ func TestWorkspaceAgentTailnetDirectDisabled(t *testing.T) {
|
||||
// Verify that the manifest has DisableDirectConnections set to true.
|
||||
agentClient := agentsdk.New(client.URL)
|
||||
agentClient.SetSessionToken(r.AgentToken)
|
||||
manifest, err := agentClient.Manifest(ctx)
|
||||
require.NoError(t, err)
|
||||
manifest := requireGetManifest(ctx, t, agentClient)
|
||||
require.True(t, manifest.DisableDirectConnections)
|
||||
|
||||
_ = agenttest.New(t, client.URL, r.AgentToken)
|
||||
@ -825,11 +825,10 @@ func TestWorkspaceAgentAppHealth(t *testing.T) {
|
||||
agentClient := agentsdk.New(client.URL)
|
||||
agentClient.SetSessionToken(r.AgentToken)
|
||||
|
||||
manifest, err := agentClient.Manifest(ctx)
|
||||
require.NoError(t, err)
|
||||
manifest := requireGetManifest(ctx, t, agentClient)
|
||||
require.EqualValues(t, codersdk.WorkspaceAppHealthDisabled, manifest.Apps[0].Health)
|
||||
require.EqualValues(t, codersdk.WorkspaceAppHealthInitializing, manifest.Apps[1].Health)
|
||||
err = agentClient.PostAppHealth(ctx, agentsdk.PostAppHealthsRequest{})
|
||||
err := agentClient.PostAppHealth(ctx, agentsdk.PostAppHealthsRequest{})
|
||||
require.Error(t, err)
|
||||
// empty
|
||||
err = agentClient.PostAppHealth(ctx, agentsdk.PostAppHealthsRequest{})
|
||||
@ -855,8 +854,7 @@ func TestWorkspaceAgentAppHealth(t *testing.T) {
|
||||
},
|
||||
})
|
||||
require.NoError(t, err)
|
||||
manifest, err = agentClient.Manifest(ctx)
|
||||
require.NoError(t, err)
|
||||
manifest = requireGetManifest(ctx, t, agentClient)
|
||||
require.EqualValues(t, codersdk.WorkspaceAppHealthHealthy, manifest.Apps[1].Health)
|
||||
// update to unhealthy
|
||||
err = agentClient.PostAppHealth(ctx, agentsdk.PostAppHealthsRequest{
|
||||
@ -865,8 +863,7 @@ func TestWorkspaceAgentAppHealth(t *testing.T) {
|
||||
},
|
||||
})
|
||||
require.NoError(t, err)
|
||||
manifest, err = agentClient.Manifest(ctx)
|
||||
require.NoError(t, err)
|
||||
manifest = requireGetManifest(ctx, t, agentClient)
|
||||
require.EqualValues(t, codersdk.WorkspaceAppHealthUnhealthy, manifest.Apps[1].Health)
|
||||
}
|
||||
|
||||
@ -1110,8 +1107,7 @@ func TestWorkspaceAgent_Metadata(t *testing.T) {
|
||||
|
||||
ctx := testutil.Context(t, testutil.WaitMedium)
|
||||
|
||||
manifest, err := agentClient.Manifest(ctx)
|
||||
require.NoError(t, err)
|
||||
manifest := requireGetManifest(ctx, t, agentClient)
|
||||
|
||||
// Verify manifest API response.
|
||||
require.Equal(t, workspace.ID, manifest.WorkspaceID)
|
||||
@ -1282,8 +1278,7 @@ func TestWorkspaceAgent_Metadata_CatchMemoryLeak(t *testing.T) {
|
||||
|
||||
ctx, cancel := context.WithCancel(testutil.Context(t, testutil.WaitSuperLong))
|
||||
|
||||
manifest, err := agentClient.Manifest(ctx)
|
||||
require.NoError(t, err)
|
||||
manifest := requireGetManifest(ctx, t, agentClient)
|
||||
|
||||
post := func(ctx context.Context, key, value string) error {
|
||||
return agentClient.PostMetadata(ctx, agentsdk.PostMetadataRequest{
|
||||
@ -1630,3 +1625,18 @@ func TestWorkspaceAgentExternalAuthListen(t *testing.T) {
|
||||
require.Equal(t, 1, validateCalls, "validate calls duplicated on same token")
|
||||
})
|
||||
}
|
||||
|
||||
func requireGetManifest(ctx context.Context, t testing.TB, client agent.Client) agentsdk.Manifest {
|
||||
conn, err := client.Listen(ctx)
|
||||
require.NoError(t, err)
|
||||
defer func() {
|
||||
cErr := conn.Close()
|
||||
require.NoError(t, cErr)
|
||||
}()
|
||||
aAPI := agentproto.NewDRPCAgentClient(conn)
|
||||
mp, err := aAPI.GetManifest(ctx, &agentproto.GetManifestRequest{})
|
||||
require.NoError(t, err)
|
||||
manifest, err := agentsdk.ManifestFromProto(mp)
|
||||
require.NoError(t, err)
|
||||
return manifest
|
||||
}
|
||||
|
@ -20,6 +20,7 @@ import (
|
||||
"cdr.dev/slog"
|
||||
"cdr.dev/slog/sloggers/slogtest"
|
||||
"github.com/coder/coder/v2/agent"
|
||||
agentproto "github.com/coder/coder/v2/agent/proto"
|
||||
"github.com/coder/coder/v2/coderd/coderdtest"
|
||||
"github.com/coder/coder/v2/coderd/workspaceapps"
|
||||
"github.com/coder/coder/v2/coderd/workspaceapps/appurl"
|
||||
@ -397,7 +398,10 @@ func createWorkspaceWithApps(t *testing.T, client *codersdk.Client, orgID uuid.U
|
||||
primaryAppHost, err := client.AppHost(appHostCtx)
|
||||
require.NoError(t, err)
|
||||
if primaryAppHost.Host != "" {
|
||||
manifest, err := agentClient.Manifest(appHostCtx)
|
||||
rpcConn, err := agentClient.Listen(appHostCtx)
|
||||
require.NoError(t, err)
|
||||
aAPI := agentproto.NewDRPCAgentClient(rpcConn)
|
||||
manifest, err := aAPI.GetManifest(appHostCtx, &agentproto.GetManifestRequest{})
|
||||
require.NoError(t, err)
|
||||
|
||||
appHost := appurl.ApplicationURL{
|
||||
@ -408,7 +412,9 @@ func createWorkspaceWithApps(t *testing.T, client *codersdk.Client, orgID uuid.U
|
||||
Username: me.Username,
|
||||
}
|
||||
proxyURL := "http://" + appHost.String() + strings.ReplaceAll(primaryAppHost.Host, "*", "")
|
||||
require.Equal(t, manifest.VSCodePortProxyURI, proxyURL)
|
||||
require.Equal(t, manifest.VsCodePortProxyUri, proxyURL)
|
||||
err = rpcConn.Close()
|
||||
require.NoError(t, err)
|
||||
}
|
||||
agentCloser := agent.New(agent.Options{
|
||||
Client: agentClient,
|
||||
|
Reference in New Issue
Block a user