8000 better fetching · coder/coder@a95ea8d · GitHub
[go: up one dir, main page]

Skip to content

Commit a95ea8d

Browse files
committed
better fetching
1 parent 7a85b3f commit a95ea8d

File tree

1 file changed

+109
-71
lines changed

1 file changed

+109
-71
lines changed

coderd/parameters.go

Lines changed: 109 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ import (
1616
"github.com/coder/preview"
1717
previewtypes "github.com/coder/preview/types"
1818
"github.com/coder/websocket"
19+
"github.com/google/uuid"
20+
"golang.org/x/sync/errgroup"
1921
"golang.org/x/xerrors"
2022
)
2123

@@ -33,64 +35,44 @@ func (api *API) templateVersionDynamicParameters(rw http.ResponseWriter, r *http
3335
user := httpmw.UserParam(r)
3436
templateVersion := httpmw.TemplateVersionParam(r)
3537

36-
key, err := api.Database.GetGitSSHKey(ctx, user.ID)
37-
if err != nil {
38-
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
39-
Message: "Internal error fetching SSH key.",
40-
Detail: err.Error(),
41-
})
38+
// Check that the job has completed successfully
39+
job, err := api.Database.GetProvisionerJobByID(ctx, templateVersion.JobID)
40+
if httpapi.Is404Error(err) {
41+
httpapi.ResourceNotFound(rw)
4242
return
4343
}
44-
45-
groups, err := api.Database.GetGroups(ctx, database.GetGroupsParams{
46-
OrganizationID: templateVersion.OrganizationID,
47-
HasMemberID: user.ID,
48-
})
4944
if err != nil {
5045
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
51-
Message: "Internal error fetching SSH key.",
46+
Message: "Internal error fetching provisioner job.",
5247
Detail: err.Error(),
5348
})
5449
return
5550
}
56-
groupNames := make([]string, 0, len(groups))
57-
for _, it := range groups {
58-
groupNames = append(groupNames, it.Group.Name)
59-
}
60-
61-
orgRoles, err := api.Database.GetOrganizationMemberRoles(ctx, database.GetOrganizationMemberRolesParams{
62-
OrganizationID: templateVersion.OrganizationID,
63-
UserID: user.ID,
64-
})
65-
ownerRoles := make([]previewtypes.WorkspaceOwnerRBACRole, 0, len(user.RBACRoles)+len(orgRoles))
66-
for _, it := range user.RBACRoles {
67-
ownerRoles = append(ownerRoles, previewtypes.WorkspaceOwnerRBACRole{
68-
Name: it,
69-
})
70-
}
71-
for _, it := range orgRoles {
72-
ownerRoles = append(ownerRoles, previewtypes.WorkspaceOwnerRBACRole{
73-
Name: it,
74-
OrgID: templateVersion.OrganizationID,
51+
if !job.CompletedAt.Valid {
52+
httpapi.Write(ctx, rw, http.StatusTooEarly, codersdk.Response{
53+
Message: "Template version job has not finished",
7554
})
76-
}
77-
78-
// Check that the job has completed successfully
79-
job, err := api.Database.GetProvisionerJobByID(ctx, templateVersion.JobID)
80-
if httpapi.Is404Error(err) {
81-
httpapi.ResourceNotFound(rw)
8255
return
8356
}
57+
58+
// nolint:gocritic // We need to fetch the templates files for the Terraform
59+
// evaluator, and the user likely does not have permission.
60+
fileCtx := dbauthz.AsProvisionerd(ctx)
61+
fileID, err := api.Database.GetFileIDByTemplateVersionID(fileCtx, templateVersion.ID)
8462
if err != nil {
8563
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
86-
Message: "Internal error fetching provisioner job.",
64+
Message: "Internal error finding template version Terraform.",
8765
Detail: err.Error(),
8866
})
8967
return
9068
}
91-
if !job.CompletedAt.Valid {
92-
httpapi.Write(ctx, rw, http.StatusTooEarly, codersdk.Response{
93-
Message: "Template version job has not finished",
69+
70+
fs, err := api.FileCache.Acquire(fileCtx, fileID)
71+
defer api.FileCache.Release(fileID)
72+
if err != nil {
73+
httpapi.Write(ctx, rw, http.StatusNotFound, codersdk.Response{
74+
Message: "Internal error fetching template version Terraform.",
75+
Detail: err.Error(),
9476
})
9577
return
9678
}
@@ -110,41 +92,19 @@ func (api *API) templateVersionDynamicParameters(rw http.ResponseWriter, r *http
11092
return
11193
}
11294

113-
input := preview.Input{
114-
PlanJSON: plan,
115-
ParameterValues: map[string]string{},
116-
Owner: previewtypes.WorkspaceOwner{
117-
ID: user.ID,
118-
Name: user.Username,
119-
FullName: user.Name,
120-
Email: user.Email,
121-
LoginType: string(user.LoginType),
122-
RBACRoles: ownerRoles,
123-
SSHPublicKey: key.PublicKey,
124-
Groups: groupNames,
125-
},
126-
}
127-
128-
// nolint:gocritic // We need to fetch the templates files for the Terraform
129-
// evaluator, and the user likely does not have permission.
130-
fileCtx := dbauthz.AsProvisionerd(ctx)
131-
fileID, err := api.Database.GetFileIDByTemplateVersionID(fileCtx, templateVersion.ID)
95+
owner, err := api.getWorkspaceOwnerData(ctx, user, templateVersion.OrganizationID)
13296
if err != nil {
13397
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
134-
Message: "Internal error finding template version Terraform.",
98+
Message: "Internal error fetching workspace owner.",
13599
Detail: err.Error(),
136100
})
137101
return
138102
}
139103

140-
fs, err := api.FileCache.Acquire(fileCtx, fileID)
141-
defer api.FileCache.Release(fileID)
142-
if err != nil {
143-
httpapi.Write(ctx, rw, http.StatusNotFound, codersdk.Response{
144-
Message: "Internal error fetching template version Terraform.",
145-
Detail: err.Error(),
146-
})
147-
return
104+
input := preview.Input{
105+
PlanJSON: plan,
106+
ParameterValues: map[string]string{},
107+
Owner: owner,
148108
}
149109

150110
conn, err := websocket.Accept(rw, r, nil)
@@ -155,8 +115,12 @@ func (api *API) templateVersionDynamicParameters(rw http.ResponseWriter, r *http
155115
})
156116
return
157117
}
158-
159-
stream := wsjson.NewStream[codersdk.DynamicParametersRequest, codersdk.DynamicParametersResponse](conn, websocket.MessageText, websocket.MessageText, api.Logger)
118+
stream := wsjson.NewStream[codersdk.DynamicParametersRequest, codersdk.DynamicParametersResponse](
119+
conn,
120+
websocket.MessageText,
121+
websocket.MessageText,
122+
api.Logger,
123+
)
160124

161125
// Send an initial form state, computed without any user input.
162126
result, diagnostics := preview.Preview(ctx, input, fs)
@@ -203,3 +167,77 @@ func (api *API) templateVersionDynamicParameters(rw http.ResponseWriter, r *http
203167
}
204168
}
205169
}
170+
171+
func (api *API) getWorkspaceOwnerData(
172+
ctx context.Context,
173+
user database.User,
174+
organizationID uuid.UUID,
175+
) (previewtypes.WorkspaceOwner, error) {
176+
var g errgroup.Group
177+
178+
var ownerRoles []previewtypes.WorkspaceOwnerRBACRole
179+
g.Go(func() error {
180+
orgRoles, err := api.Database.GetOrganizationMemberRoles(ctx, database.GetOrganizationMemberRolesParams{
181+
OrganizationID: organizationID,
182+
UserID: user.ID,
183+
})
184+
if err != nil {
185+
return err
186+
}
187+
ownerRoles = make([]previewtypes.WorkspaceOwnerRBACRole, 0, len(user.RBACRoles)+len(orgRoles))
188+
for _, it := range user.RBACRoles {
189+
ownerRoles = append(ownerRoles, previewtypes.WorkspaceOwnerRBACRole{
190+
Name: it,
191+
})
192+
}
193+
for _, it := range orgRoles {
194+
ownerRoles = append(ownerRoles, previewtypes.WorkspaceOwnerRBACRole{
195+
Name: it,
196+
OrgID: organizationID,
197+
})
198+
}
199+
return nil
200+
})
201+
202+
var publicKey string
203+
g.Go(func() error {
204+
key, err := api.Database.GetGitSSHKey(ctx, user.ID)
205+
if err != nil {
206+
return err
207+
}
208+
publicKey = key.PublicKey
209+
return nil
210+
})
211+
212+
var groupNames []string
213+
g.Go(func() error {
214+
groups, err := api.Database.GetGroups(ctx, database.GetGroupsParams{
215+
OrganizationID: organizationID,
216+
HasMemberID: user.ID,
217+
})
218+
if err != nil {
219+
return err
220+
}
221+
groupNames = make([]string, 0, len(groups))
222+
for _, it := range groups {
223+
groupNames = append(groupNames, it.Group.Name)
224+
}
225+
return nil
226+
})
227+
228+
err := g.Wait()
229+
if err != nil {
230+
return previewtypes.WorkspaceOwner{}, err
231+
}
232+
233+
return previewtypes.WorkspaceOwner{
234+
ID: user.ID,
235+
Name: user.Username,
236+
FullName: user.Name,
237+
Email: user.Email,
238+
LoginType: string(user.LoginType),
239+
RBACRoles: ownerRoles,
240+
SSHPublicKey: publicKey,
241+
Groups: groupNames,
242+
}, nil
243+
}

0 commit comments

Comments
 (0)
0