@@ -16,6 +16,8 @@ import (
16
16
"github.com/coder/preview"
17
17
previewtypes "github.com/coder/preview/types"
18
18
"github.com/coder/websocket"
19
+ "github.com/google/uuid"
20
+ "golang.org/x/sync/errgroup"
19
21
"golang.org/x/xerrors"
20
22
)
21
23
@@ -33,64 +35,44 @@ func (api *API) templateVersionDynamicParameters(rw http.ResponseWriter, r *http
33
35
user := httpmw .UserParam (r )
34
36
templateVersion := httpmw .TemplateVersionParam (r )
35
37
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 )
42
42
return
43
43
}
44
-
45
- groups , err := api .Database .GetGroups (ctx , database.GetGroupsParams {
46
- OrganizationID : templateVersion .OrganizationID ,
47
- HasMemberID : user .ID ,
48
- })
49
44
if err != nil {
50
45
httpapi .Write (ctx , rw , http .StatusInternalServerError , codersdk.Response {
51
- Message : "Internal error fetching SSH key ." ,
46
+ Message : "Internal error fetching provisioner job ." ,
52
47
Detail : err .Error (),
53
48
})
54
49
return
55
50
}
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" ,
75
54
})
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 )
82
55
return
83
56
}
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 )
84
62
if err != nil {
85
63
httpapi .Write (ctx , rw , http .StatusInternalServerError , codersdk.Response {
86
- Message : "Internal error fetching provisioner job ." ,
64
+ Message : "Internal error finding template version Terraform ." ,
87
65
Detail : err .Error (),
88
66
})
89
67
return
90
68
}
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 (),
94
76
})
95
77
return
96
78
}
@@ -110,41 +92,19 @@ func (api *API) templateVersionDynamicParameters(rw http.ResponseWriter, r *http
110
92
return
111
93
}
112
94
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 )
132
96
if err != nil {
133
97
httpapi .Write (ctx , rw , http .StatusInternalServerError , codersdk.Response {
134
- Message : "Internal error finding template version Terraform ." ,
98
+ Message : "Internal error fetching workspace owner ." ,
135
99
Detail : err .Error (),
136
100
})
137
101
return
138
102
}
139
103
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 ,
148
108
}
149
109
150
110
conn , err := websocket .Accept (rw , r , nil )
@@ -155,8 +115,12 @@ func (api *API) templateVersionDynamicParameters(rw http.ResponseWriter, r *http
155
115
})
156
116
return
157
117
}
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
+ )
160
124
161
125
// Send an initial form state, computed without any user input.
162
126
result , diagnostics := preview .Preview (ctx , input , fs )
@@ -203,3 +167,77 @@ func (api *API) templateVersionDynamicParameters(rw http.ResponseWriter, r *http
203
167
}
204
168
}
205
169
}
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