@@ -10,8 +10,10 @@ import (
10
10
"github.com/coder/coder/v2/coderd/coderdtest"
11
11
"github.com/coder/coder/v2/coderd/rbac"
12
12
"github.com/coder/coder/v2/codersdk"
13
+ "github.com/coder/coder/v2/codersdk/wsjson"
13
14
"github.com/coder/coder/v2/provisioner/echo"
14
15
"github.com/coder/coder/v2/provisioner/terraform"
16
+ provProto "github.com/coder/coder/v2/provisionerd/proto"
15
17
"github.com/coder/coder/v2/provisionersdk/proto"
16
18
"github.com/coder/coder/v2/testutil"
17
19
"github.com/coder/websocket"
@@ -135,45 +137,26 @@ func TestDynamicParametersOwnerSSHPublicKey(t *testing.T) {
135
137
require .Equal (t , sshKey .PublicKey , preview .Parameters [0 ].Value .Value .AsString ())
136
138
}
137
139
138
- func TestDynamicParametersWithTerraformModules (t * testing.T ) {
140
+ func TestDynamicParametersWithTerraformValues (t * testing.T ) {
139
141
t .Parallel ()
140
142
141
- t .Run ("OK" , func (t * testing.T ) {
142
- cfg := coderdtest .DeploymentValues (t )
143
- cfg .Experiments = []string {string (codersdk .ExperimentDynamicParameters )}
144
- ownerClient , _ , api := coderdtest .NewWithAPI (t , & coderdtest.Options {IncludeProvisionerDaemon : true , DeploymentValues : cfg })
145
- defer func () {
146
- require .Equal (t , 0 , api .FileCache .Count (), "file cache released all files" )
147
- }()
148
- owner := coderdtest .CreateFirstUser (t , ownerClient )
149
- templateAdmin , templateAdminUser := coderdtest .CreateAnotherUser (t , ownerClient , owner .OrganizationID , rbac .RoleTemplateAdmin ())
150
-
143
+ t .Run ("OK_Modules" , func (t * testing.T ) {
151
144
dynamicParametersTerraformSource , err := os .ReadFile ("testdata/parameters/modules/main.tf" )
152
145
require .NoError (t , err )
146
+
153
147
modulesArchive , err := terraform .GetModulesArchive (os .DirFS ("testdata/parameters/modules" ))
154
148
require .NoError (t , err )
155
149
156
- files := echo .WithExtraFiles (map [string ][]byte {
157
- "main.tf" : dynamicParametersTerraformSource ,
150
+ setup := setupDynamicParamsTest (t , setupDynamicParamsTestParams {
151
+ provisionerDaemonVersion : provProto .CurrentVersion .String (),
152
+ mainTF : dynamicParametersTerraformSource ,
153
+ modulesArchive : modulesArchive ,
154
+ plan : nil ,
155
+ static : nil ,
158
156
})
159
- files .ProvisionPlan = []* proto.Response {{
160
- Type : & proto.Response_Plan {
161
- Plan : & proto.PlanComplete {
162
- Plan : []byte ("{}" ),
163
- ModuleFiles : modulesArchive ,
164
- },
165
- },
166
- }}
167
-
168
- version := coderdtest .CreateTemplateVersion (t , templateAdmin , owner .OrganizationID , files )
169
- coderdtest .AwaitTemplateVersionJobCompleted (t , templateAdmin , version .ID )
170
- _ = coderdtest .CreateTemplate (t , templateAdmin , owner .OrganizationID , version .ID )
171
157
172
158
ctx := testutil .Context (t , testutil .WaitShort )
173
- stream , err := templateAdmin .TemplateVersionDynamicParameters (ctx , templateAdminUser .ID , version .ID )
174
- require .NoError (t , err )
175
- defer stream .Close (websocket .StatusGoingAway )
176
-
159
+ stream := setup .stream
177
160
previews := stream .Chan ()
178
161
179
162
// Should see the output of the module represented
@@ -187,115 +170,118 @@ func TestDynamicParametersWithTerraformModules(t *testing.T) {
187
170
require .Equal (t , "CL" , preview .Parameters [0 ].Value .AsString ())
188
171
})
189
172
173
+ // OldProvisioners use the static parameters in the dynamic param flow
190
174
t .Run ("OldProvisioner" , func (t * testing.T ) {
191
- cfg := coderdtest .DeploymentValues (t )
192
- cfg .Experiments = []string {string (codersdk .ExperimentDynamicParameters )}
193
- ownerClient , _ , api := coderdtest .NewWithAPI (t , & coderdtest.Options {
194
- ProvisionerDaemonVersion : "1.4" , // Old provisioner daemon
195
- IncludeProvisionerDaemon : true ,
196
- DeploymentValues : cfg ,
197
- })
198
- defer func () {
199
- require .Equal (t , 0 , api .FileCache .Count (), "file cache released all files" )
200
- }()
201
-
202
- owner := coderdtest .CreateFirstUser (t , ownerClient )
203
- templateAdmin , templateAdminUser := coderdtest .CreateAnotherUser (t , ownerClient , owner .OrganizationID , rbac .RoleTemplateAdmin ())
204
-
205
- dynamicParametersTerraformSource , err := os .ReadFile ("testdata/parameters/modules/main.tf" )
206
- require .NoError (t , err )
207
-
208
- files := echo .WithExtraFiles (map [string ][]byte {
209
- "main.tf" : dynamicParametersTerraformSource ,
210
- })
211
- files .ProvisionPlan = []* proto.Response {{
212
- Type : & proto.Response_Plan {
213
- Plan : & proto.PlanComplete {
214
- Plan : []byte ("{}" ),
215
- ModuleFiles : nil ,
216
- Parameters : []* proto.RichParameter {
175
+ setup := setupDynamicParamsTest (t , setupDynamicParamsTestParams {
176
+ provisionerDaemonVersion : "1.4" ,
177
+ mainTF : nil ,
178
+ modulesArchive : nil ,
179
+ plan : nil ,
180
+ static : []* proto.RichParameter {
181
+ {
182
+ Name : "jetbrains_ide" ,
183
+ Type : "string" ,
184
+ DefaultValue : "PS" ,
185
+ Icon : "" ,
186
+ Options : []* proto.RichParameterOption {
217
187
{
218
- Name : "jetbrains_ide" ,
219
- Type : "string" ,
220
- DefaultValue : "CL" ,
221
- Icon : "" ,
222
- Options : []* proto.RichParameterOption {
223
- {
224
- Name : "Clion" ,
225
- Description : "" ,
226
- Value : "CL" ,
227
- Icon : "" ,
228
- },
229
- {
230
- Name : "Golang" ,
231
- Description : "" ,
232
- Value : "GO" ,
233
- Icon : "" ,
234
- },
235
- },
236
- ValidationRegex : "[CG][LO]" ,
237
- ValidationError : "Regex check" ,
188
+ Name : "PHPStorm" ,
189
+ Description : "" ,
190
+ Value : "PS" ,
191
+ Icon : "" ,
192
+ },
193
+ {
194
+ Name : "Golang" ,
195
+ Description : "" ,
196
+ Value : "GO" ,
197
+ Icon : "" ,
238
198
},
239
199
},
200
+ ValidationRegex : "[PG][SO]" ,
201
+ ValidationError : "Regex check" ,
240
202
},
241
203
},
242
- }}
243
-
244
- version := coderdtest .CreateTemplateVersion (t , templateAdmin , owner .OrganizationID , files )
245
- coderdtest .AwaitTemplateVersionJobCompleted (t , templateAdmin , version .ID )
246
- _ = coderdtest .CreateTemplate (t , templateAdmin , owner .OrganizationID , version .ID )
204
+ })
247
205
248
206
ctx := testutil .Context (t , testutil .WaitShort )
249
- stream , err := templateAdmin .TemplateVersionDynamicParameters (ctx , templateAdminUser .ID , version .ID )
250
- require .NoError (t , err )
251
- defer stream .Close (websocket .StatusGoingAway )
252
-
207
+ stream := setup .stream
253
208
previews := stream .Chan ()
254
209
255
- // Should see the output of the module represented
210
+ // Assert the initial state
256
211
preview := testutil .RequireReceive (ctx , t , previews )
257
- require . Equal ( t , - 1 , preview .ID )
258
- require .Empty (t , preview . Diagnostics )
259
-
212
+ diagCount := len ( preview .Diagnostics )
213
+ require .Equal (t , 1 , diagCount )
214
+ require . Contains ( t , preview . Diagnostics [ 0 ]. Summary , "classic creation flow" )
260
215
require .Len (t , preview .Parameters , 1 )
261
216
require .Equal (t , "jetbrains_ide" , preview .Parameters [0 ].Name )
262
217
require .True (t , preview .Parameters [0 ].Value .Valid ())
263
- require .Equal (t , "CL" , preview .Parameters [0 ].Value .AsString ())
264
- })
218
+ require .Equal (t , "PS" , preview .Parameters [0 ].Value .AsString ())
219
+
220
+ // Test some inputs
221
+ for _ , exp := range []string {"PS" , "GO" , "Invalid" } {
222
+ err := stream .Send (codersdk.DynamicParametersRequest {
223
+ ID : 1 ,
224
+ Inputs : map [string ]string {
225
+ "jetbrains_ide" : exp ,
226
+ },
227
+ })
228
+ require .NoError (t , err )
229
+
230
+ preview := testutil .RequireReceive (ctx , t , previews )
231
+ diagCount := len (preview .Diagnostics )
232
+ require .Equal (t , 1 , diagCount )
233
+ require .Contains (t , preview .Diagnostics [0 ].Summary , "classic creation flow" )
234
+
235
+ require .Len (t , preview .Parameters , 1 )
236
+ if exp == "Invalid" { // Try an invalid option
237
+ require .Len (t , preview .Parameters [0 ].Diagnostics , 1 )
238
+ } else {
239
+ require .Len (t , preview .Parameters [0 ].Diagnostics , 0 )
240
+ }
241
+ require .Equal (t , "jetbrains_ide" , preview .Parameters [0 ].Name )
242
+ require .True (t , preview .Parameters [0 ].Value .Valid ())
243
+ require .Equal (t , exp , preview .Parameters [0 ].Value .AsString ())
244
+ }
265
245
246
+ })
266
247
}
267
248
268
- type dynamicParamsTestSetupParams struct {
249
+ type setupDynamicParamsTestParams struct {
250
+ provisionerDaemonVersion string
251
+ mainTF []byte
252
+ modulesArchive []byte
253
+ plan []byte
254
+
255
+ static []* proto.RichParameter
269
256
}
270
257
271
258
type dynamicParamsTest struct {
272
259
client * codersdk.Client
273
260
api * coderd.API
261
+ stream * wsjson.Stream [codersdk.DynamicParametersResponse , codersdk.DynamicParametersRequest ]
274
262
}
275
263
276
- func dynamicParamsTestSetup (t * testing.T ) dynamicParamsTest {
264
+ func setupDynamicParamsTest (t * testing.T , args setupDynamicParamsTestParams ) dynamicParamsTest {
277
265
cfg := coderdtest .DeploymentValues (t )
278
266
cfg .Experiments = []string {string (codersdk .ExperimentDynamicParameters )}
279
- ownerClient , _ , api := coderdtest .NewWithAPI (t , & coderdtest.Options {IncludeProvisionerDaemon : true , DeploymentValues : cfg })
280
- defer func () {
281
- require .Equal (t , 0 , api .FileCache .Count (), "file cache released all files" )
282
- }()
267
+ ownerClient , _ , api := coderdtest .NewWithAPI (t , & coderdtest.Options {
268
+ IncludeProvisionerDaemon : true ,
269
+ ProvisionerDaemonVersion : args .provisionerDaemonVersion ,
270
+ DeploymentValues : cfg ,
271
+ })
272
+
283
273
owner := coderdtest .CreateFirstUser (t , ownerClient )
284
274
templateAdmin , templateAdminUser := coderdtest .CreateAnotherUser (t , ownerClient , owner .OrganizationID , rbac .RoleTemplateAdmin ())
285
275
286
- dynamicParametersTerraformSource , err := os .ReadFile ("testdata/parameters/modules/main.tf" )
287
- require .NoError (t , err )
288
- modulesArchive , err := terraform .GetModulesArchive (os .DirFS ("testdata/parameters/modules" ))
289
- require .NoError (t , err )
290
-
291
276
files := echo .WithExtraFiles (map [string ][]byte {
292
- "main.tf" : dynamicParametersTerraformSource ,
277
+ "main.tf" : args . mainTF ,
293
278
})
294
279
files .ProvisionPlan = []* proto.Response {{
295
280
Type : & proto.Response_Plan {
296
281
Plan : & proto.PlanComplete {
297
- Plan : []byte ("{}" ),
298
- ModuleFiles : modulesArchive ,
282
+ Plan : args .plan ,
283
+ ModuleFiles : args .modulesArchive ,
284
+ Parameters : args .static ,
299
285
},
300
286
},
301
287
}}
@@ -307,22 +293,18 @@ func dynamicParamsTestSetup(t *testing.T) dynamicParamsTest {
307
293
ctx := testutil .Context (t , testutil .WaitShort )
308
294
stream , err := templateAdmin .TemplateVersionDynamicParameters (ctx , templateAdminUser .ID , version .ID )
309
295
require .NoError (t , err )
310
- defer stream .Close (websocket .StatusGoingAway )
311
296
312
- previews := stream .Chan ()
313
-
314
- // Should see the output of the module represented
315
- preview := testutil .RequireReceive (ctx , t , previews )
316
- require .Equal (t , - 1 , preview .ID )
317
- require .Empty (t , preview .Diagnostics )
318
-
319
- require .Len (t , preview .Parameters , 1 )
320
- require .Equal (t , "jetbrains_ide" , preview .Parameters [0 ].Name )
321
- require .True (t , preview .Parameters [0 ].Value .Valid ())
322
- require .Equal (t , "CL" , preview .Parameters [0 ].Value .AsString ())
297
+ t .Cleanup (func () {
298
+ _ = stream .Close (websocket .StatusGoingAway )
299
+ // Cache should always have 0 files when the only stream is closed
300
+ require .Eventually (t , func () bool {
301
+ return api .FileCache .Count () == 0
302
+ }, testutil .WaitShort / 5 , testutil .IntervalMedium )
303
+ })
323
304
324
305
return dynamicParamsTest {
325
306
client : ownerClient ,
307
+ stream : stream ,
326
308
api : api ,
327
309
}
328
310
}
0 commit comments