Skip to content

Commit a900d3b

Browse files
committed
Add list endpoint
1 parent 98f5b4e commit a900d3b

File tree

16 files changed

+345
-1
lines changed

16 files changed

+345
-1
lines changed

coderd/apidoc/docs.go

Lines changed: 58 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/apidoc/swagger.json

Lines changed: 54 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/coderd.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -960,6 +960,7 @@ func New(options *Options) *API {
960960
r.Put("/autoupdates", api.putWorkspaceAutoupdates)
961961
r.Get("/resolve-autostart", api.resolveAutostart)
962962
r.Post("/port-share", api.postWorkspaceAgentPortShare)
963+
r.Get("/port-shares", api.getWorkspaceAgentPortShares)
963964
})
964965
})
965966
r.Route("/workspacebuilds/{workspacebuild}", func(r chi.Router) {

coderd/database/dbauthz/dbauthz.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2542,6 +2542,20 @@ func (q *querier) InsertWorkspaceResourceMetadata(ctx context.Context, arg datab
25422542
return q.db.InsertWorkspaceResourceMetadata(ctx, arg)
25432543
}
25442544

2545+
func (q *querier) ListWorkspaceAgentPortShares(ctx context.Context, workspaceID uuid.UUID) ([]database.WorkspaceAgentPortShare, error) {
2546+
workspace, err := q.GetWorkspaceByID(ctx, workspaceID)
2547+
if err != nil {
2548+
return nil, err
2549+
}
2550+
2551+
// listing port shares is more akin to reading the workspace.
2552+
if err := q.authorizeContext(ctx, rbac.ActionRead, workspace); err != nil {
2553+
return nil, err
2554+
}
2555+
2556+
return q.db.ListWorkspaceAgentPortShares(ctx, workspaceID)
2557+
}
2558+
25452559
func (q *querier) RegisterWorkspaceProxy(ctx context.Context, arg database.RegisterWorkspaceProxyParams) (database.WorkspaceProxy, error) {
25462560
fetch := func(ctx context.Context, arg database.RegisterWorkspaceProxyParams) (database.WorkspaceProxy, error) {
25472561
return q.db.GetWorkspaceProxyByID(ctx, arg.ID)

coderd/database/dbauthz/dbauthz_test.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -891,7 +891,8 @@ func (s *MethodTestSuite) TestTemplate() {
891891
s.Run("UpdateTemplateMetaByID", s.Subtest(func(db database.Store, check *expects) {
892892
t1 := dbgen.Template(s.T(), db, database.Template{})
893893
check.Args(database.UpdateTemplateMetaByIDParams{
894-
ID: t1.ID,
894+
ID: t1.ID,
895+
MaxPortSharingLevel: "owner",
895896
}).Asserts(t1, rbac.ActionUpdate)
896897
}))
897898
s.Run("UpdateTemplateVersionByID", s.Subtest(func(db database.Store, check *expects) {
@@ -1626,6 +1627,12 @@ func (s *MethodTestSuite) TestWorkspacePortSharing() {
16261627
Port: ps.Port,
16271628
}).Asserts(ws, rbac.ActionRead).Returns(ps)
16281629
}))
1630+
s.Run("ListWorkspaceAgentPortShares", s.Subtest(func(db database.Store, check *expects) {
1631+
u := dbgen.User(s.T(), db, database.User{})
1632+
ws := dbgen.Workspace(s.T(), db, database.Workspace{OwnerID: u.ID})
1633+
ps := dbgen.WorkspaceAgentPortShare(s.T(), db, database.WorkspaceAgentPortShare{WorkspaceID: ws.ID})
1634+
check.Args(ws.ID).Asserts(ws, rbac.ActionRead).Returns([]database.WorkspaceAgentPortShare{ps})
1635+
}))
16291636
s.Run("UpdateWorkspaceAgentPortShare", s.Subtest(func(db database.Store, check *expects) {
16301637
u := dbgen.User(s.T(), db, database.User{})
16311638
ws := dbgen.Workspace(s.T(), db, database.Workspace{OwnerID: u.ID})

coderd/database/dbmem/dbmem.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6066,6 +6066,20 @@ func (q *FakeQuerier) InsertWorkspaceResourceMetadata(_ context.Context, arg dat
60666066
return metadata, nil
60676067
}
60686068

6069+
func (q *FakeQuerier) ListWorkspaceAgentPortShares(_ context.Context, workspaceID uuid.UUID) ([]database.WorkspaceAgentPortShare, error) {
6070+
q.mutex.Lock()
6071+
defer q.mutex.Unlock()
6072+
6073+
shares := []database.WorkspaceAgentPortShare{}
6074+
for _, share := range q.workspaceAgentPortShares {
6075+
if share.WorkspaceID == workspaceID {
6076+
shares = append(shares, share)
6077+
}
6078+
}
6079+
6080+
return shares, nil
6081+
}
6082+
60696083
func (q *FakeQuerier) RegisterWorkspaceProxy(_ context.Context, arg database.RegisterWorkspaceProxyParams) (database.WorkspaceProxy, error) {
60706084
q.mutex.Lock()
60716085
defer q.mutex.Unlock()

coderd/database/dbmetrics/dbmetrics.go

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/dbmock/dbmock.go

Lines changed: 15 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/querier.go

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/queries.sql.go

Lines changed: 32 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/queries/workspaceagentportshare.sql

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ INSERT INTO workspace_agent_port_share (workspace_id, agent_name, port, share_le
44
-- name: GetWorkspaceAgentPortShare :one
55
SELECT * FROM workspace_agent_port_share WHERE workspace_id = $1 AND agent_name = $2 AND port = $3;
66

7+
-- name: ListWorkspaceAgentPortShares :many
8+
SELECT * FROM workspace_agent_port_share WHERE workspace_id = $1;
9+
710
-- name: UpdateWorkspaceAgentPortShare :exec
811
UPDATE workspace_agent_port_share SET share_level = $1 WHERE workspace_id = $2 AND agent_name = $3 AND port = $4;
912

coderd/workspaceportshare.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,3 +109,40 @@ func (api *API) postWorkspaceAgentPortShare(rw http.ResponseWriter, r *http.Requ
109109

110110
rw.WriteHeader(http.StatusOK)
111111
}
112+
113+
// @Summary Get workspace agent port shares
114+
// @ID get-workspace-agent-port-shares
115+
// @Security CoderSessionToken
116+
// @Produce json
117+
// @Tags PortSharing
118+
// @Param workspace path string true "Workspace ID" format(uuid)
119+
// @Success 200 {object} codersdk.WorkspaceAgentPortShares
120+
// @Router /workspaces/{workspace}/port-share [get]
121+
//
122+
//nolint:revive // this is not a getter
123+
func (api *API) getWorkspaceAgentPortShares(rw http.ResponseWriter, r *http.Request) {
124+
ctx := r.Context()
125+
workspace := httpmw.WorkspaceParam(r)
126+
127+
shares, err := api.Database.ListWorkspaceAgentPortShares(ctx, workspace.ID)
128+
if err != nil {
129+
httpapi.InternalServerError(rw, err)
130+
return
131+
}
132+
133+
httpapi.Write(ctx, rw, http.StatusOK, codersdk.WorkspaceAgentPortShares{
134+
Shares: convertPortShares(shares),
135+
})
136+
}
137+
138+
func convertPortShares(shares []database.WorkspaceAgentPortShare) []codersdk.WorkspaceAgentPortShare {
139+
var converted []codersdk.WorkspaceAgentPortShare
140+
for _, share := range shares {
141+
converted = append(converted, codersdk.WorkspaceAgentPortShare{
142+
AgentName: share.AgentName,
143+
Port: share.Port,
144+
ShareLevel: codersdk.WorkspaceAgentPortShareLevel(share.ShareLevel),
145+
})
146+
}
147+
return converted
148+
}

codersdk/workspaceportshare.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,14 @@ type (
2121
Port int32 `json:"port"`
2222
ShareLevel WorkspaceAgentPortShareLevel `json:"share_level"`
2323
}
24+
WorkspaceAgentPortShares struct {
25+
Shares []WorkspaceAgentPortShare `json:"shares"`
26+
}
27+
WorkspaceAgentPortShare struct {
28+
AgentName string `json:"agent_name"`
29+
Port int32 `json:"port"`
30+
ShareLevel WorkspaceAgentPortShareLevel `json:"share_level"`
31+
}
2432
)
2533

2634
func (l WorkspaceAgentPortShareLevel) ValidMaxLevel() bool {

0 commit comments

Comments
 (0)