Skip to content

Commit 7a6de99

Browse files
committed
add to agent proto/manifest
1 parent f742cd1 commit 7a6de99

File tree

5 files changed

+102
-9
lines changed

5 files changed

+102
-9
lines changed

agent/proto/agent.proto

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,13 @@ message Manifest {
9595
repeated WorkspaceAgentScript scripts = 10;
9696
repeated WorkspaceApp apps = 11;
9797
repeated WorkspaceAgentMetadata.Description metadata = 12;
98+
repeated WorkspaceAgentDevcontainer devcontainers = 17;
99+
}
100+
101+
message WorkspaceAgentDevcontainer {
102+
bytes id = 1;
103+
string workspace_folder = 2;
104+
string config_path = 3;
98105
}
99106

100107
message GetManifestRequest {}

coderd/agentapi/manifest.go

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package agentapi
33
import (
44
"context"
55
"database/sql"
6+
"errors"
67
"net/url"
78
"strings"
89
"time"
@@ -42,11 +43,12 @@ func (a *ManifestAPI) GetManifest(ctx context.Context, _ *agentproto.GetManifest
4243
return nil, err
4344
}
4445
var (
45-
dbApps []database.WorkspaceApp
46-
scripts []database.WorkspaceAgentScript
47-
metadata []database.WorkspaceAgentMetadatum
48-
workspace database.Workspace
49-
owner database.User
46+
dbApps []database.WorkspaceApp
47+
scripts []database.WorkspaceAgentScript
48+
metadata []database.WorkspaceAgentMetadatum
49+
workspace database.Workspace
50+
owner database.User
51+
devcontainers []database.WorkspaceAgentDevcontainer
5052
)
5153

5254
var eg errgroup.Group
@@ -80,6 +82,13 @@ func (a *ManifestAPI) GetManifest(ctx context.Context, _ *agentproto.GetManifest
8082
}
8183
return err
8284
})
85+
eg.Go(func() (err error) {
86+
devcontainers, err = a.Database.GetWorkspaceAgentDevcontainersByWorkspaceAgentID(ctx, workspaceAgent.ID)
87+
if err != nil && !errors.Is(err, sql.ErrNoRows) {
88+
return err
89+
}
90+
return nil
91+
})
8392
err = eg.Wait()
8493
if err != nil {
8594
return nil, xerrors.Errorf("fetching workspace agent data: %w", err)
@@ -125,10 +134,11 @@ func (a *ManifestAPI) GetManifest(ctx context.Context, _ *agentproto.GetManifest
125134
DisableDirectConnections: a.DisableDirectConnections,
126135
DerpForceWebsockets: a.DerpForceWebSockets,
127136

128-
DerpMap: tailnet.DERPMapToProto(a.DerpMapFn()),
129-
Scripts: dbAgentScriptsToProto(scripts),
130-
Apps: apps,
131-
Metadata: dbAgentMetadataToProtoDescription(metadata),
137+
DerpMap: tailnet.DERPMapToProto(a.DerpMapFn()),
138+
Scripts: dbAgentScriptsToProto(scripts),
139+
Apps: apps,
140+
Metadata: dbAgentMetadataToProtoDescription(metadata),
141+
Devcontainers: dbAgentDevcontainersToProto(devcontainers),
132142
}, nil
133143
}
134144

@@ -228,3 +238,15 @@ func dbAppToProto(dbApp database.WorkspaceApp, agent database.WorkspaceAgent, ow
228238
Hidden: dbApp.Hidden,
229239
}, nil
230240
}
241+
242+
func dbAgentDevcontainersToProto(devcontainers []database.WorkspaceAgentDevcontainer) []*agentproto.WorkspaceAgentDevcontainer {
243+
ret := make([]*agentproto.WorkspaceAgentDevcontainer, len(devcontainers))
244+
for i, dc := range devcontainers {
245+
ret[i] = &agentproto.WorkspaceAgentDevcontainer{
246+
Id: dc.ID[:],
247+
WorkspaceFolder: dc.WorkspaceFolder,
248+
ConfigPath: dc.ConfigPath,
249+
}
250+
}
251+
return ret
252+
}

coderd/database/queries/workspaceagentdevcontainers.sql

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,13 @@ SELECT
88
unnest(@workspace_folder::text[]) AS workspace_folder,
99
unnest(@config_path::text[]) AS config_path
1010
RETURNING workspace_agent_devcontainers.*;
11+
12+
-- name: GetWorkspaceAgentDevcontainersByWorkspaceAgentID :many
13+
SELECT
14+
*
15+
FROM
16+
workspace_agent_devcontainers
17+
WHERE
18+
workspace_agent_id = $1
19+
ORDER BY
20+
created_at, id;

codersdk/agentsdk/convert.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ func ManifestFromProto(manifest *proto.Manifest) (Manifest, error) {
3131
if err != nil {
3232
return Manifest{}, xerrors.Errorf("error converting workspace ID: %w", err)
3333
}
34+
devcontainers, err := DevcontainersFromProto(manifest.Devcontainers)
35+
if err != nil {
36+
return Manifest{}, xerrors.Errorf("error converting workspace agent devcontainers: %w", err)
37+
}
3438
return Manifest{
3539
AgentID: agentID,
3640
AgentName: manifest.AgentName,
@@ -48,6 +52,7 @@ func ManifestFromProto(manifest *proto.Manifest) (Manifest, error) {
4852
MOTDFile: manifest.MotdPath,
4953
DisableDirectConnections: manifest.DisableDirectConnections,
5054
Metadata: MetadataDescriptionsFromProto(manifest.Metadata),
55+
Devcontainers: devcontainers,
5156
}, nil
5257
}
5358

@@ -73,6 +78,7 @@ func ProtoFromManifest(manifest Manifest) (*proto.Manifest, error) {
7378
Scripts: ProtoFromScripts(manifest.Scripts),
7479
Apps: apps,
7580
Metadata: ProtoFromMetadataDescriptions(manifest.Metadata),
81+
Devcontainers: ProtoFromDevcontainers(manifest.Devcontainers),
7682
}, nil
7783
}
7884

@@ -424,3 +430,43 @@ func ProtoFromConnectionType(typ ConnectionType) (proto.Connection_Type, error)
424430
return 0, xerrors.Errorf("unknown connection type %q", typ)
425431
}
426432
}
433+
434+
func DevcontainersFromProto(pdcs []*proto.WorkspaceAgentDevcontainer) ([]codersdk.WorkspaceAgentDevcontainer, error) {
435+
ret := make([]codersdk.WorkspaceAgentDevcontainer, len(pdcs))
436+
for i, pdc := range pdcs {
437+
dc, err := DevcontainerFromProto(pdc)
438+
if err != nil {
439+
return nil, xerrors.Errorf("parse devcontainer %v: %w", i, err)
440+
}
441+
ret[i] = dc
442+
}
443+
return ret, nil
444+
}
445+
446+
func DevcontainerFromProto(pdc *proto.WorkspaceAgentDevcontainer) (codersdk.WorkspaceAgentDevcontainer, error) {
447+
id, err := uuid.FromBytes(pdc.Id)
448+
if err != nil {
449+
return codersdk.WorkspaceAgentDevcontainer{}, xerrors.Errorf("parse id: %w", err)
450+
}
451+
return codersdk.WorkspaceAgentDevcontainer{
452+
ID: id,
453+
WorkspaceFolder: pdc.WorkspaceFolder,
454+
ConfigPath: pdc.ConfigPath,
455+
}, nil
456+
}
457+
458+
func ProtoFromDevcontainers(dcs []codersdk.WorkspaceAgentDevcontainer) []*proto.WorkspaceAgentDevcontainer {
459+
ret := make([]*proto.WorkspaceAgentDevcontainer, len(dcs))
460+
for i, dc := range dcs {
461+
ret[i] = ProtoFromDevcontainer(dc)
462+
}
463+
return ret
464+
}
465+
466+
func ProtoFromDevcontainer(dc codersdk.WorkspaceAgentDevcontainer) *proto.WorkspaceAgentDevcontainer {
467+
return &proto.WorkspaceAgentDevcontainer{
468+
Id: dc.ID[:],
469+
WorkspaceFolder: dc.WorkspaceFolder,
470+
ConfigPath: dc.ConfigPath,
471+
}
472+
}

codersdk/agentsdk/convert_test.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,13 @@ func TestManifest(t *testing.T) {
130130
DisplayName: "bar",
131131
},
132132
},
133+
Devcontainers: []codersdk.WorkspaceAgentDevcontainer{
134+
{
135+
ID: uuid.New(),
136+
WorkspaceFolder: "/home/coder/coder",
137+
ConfigPath: "/home/coder/coder/.devcontainer/devcontainer.json",
138+
},
139+
},
133140
}
134141
p, err := agentsdk.ProtoFromManifest(manifest)
135142
require.NoError(t, err)
@@ -152,6 +159,7 @@ func TestManifest(t *testing.T) {
152159
require.Equal(t, manifest.DisableDirectConnections, back.DisableDirectConnections)
153160
require.Equal(t, manifest.Metadata, back.Metadata)
154161
require.Equal(t, manifest.Scripts, back.Scripts)
162+
require.Equal(t, manifest.Devcontainers, back.Devcontainers)
155163
}
156164

157165
func TestSubsystems(t *testing.T) {

0 commit comments

Comments
 (0)