@@ -153,7 +153,7 @@ func TestProvisionerDaemon_PSK(t *testing.T) {
153
153
ctx , cancel := context .WithTimeout (inv .Context (), testutil .WaitLong )
154
154
defer cancel ()
155
155
err = inv .WithContext (ctx ).Run ()
156
- require .ErrorContains (t , err , "must provide a pre-shared key when not authenticated as a user" )
156
+ require .ErrorContains (t , err , "must provide a pre-shared key or provisioner key when not authenticated as a user" )
157
157
})
158
158
}
159
159
@@ -301,6 +301,165 @@ func TestProvisionerDaemon_SessionToken(t *testing.T) {
301
301
})
302
302
}
303
303
304
+ func TestProvisionerDaemon_ProvisionerKey (t * testing.T ) {
305
+ t .Parallel ()
306
+
307
+ t .Run ("OK" , func (t * testing.T ) {
308
+ t .Parallel ()
309
+
310
+ ctx , cancel := context .WithTimeout (context .Background (), testutil .WaitLong )
311
+ defer cancel ()
312
+ dv := coderdtest .DeploymentValues (t )
313
+ dv .Experiments .Append (string (codersdk .ExperimentMultiOrganization ))
314
+ client , user := coderdenttest .New (t , & coderdenttest.Options {
315
+ ProvisionerDaemonPSK : "provisionersftw" ,
316
+ LicenseOptions : & coderdenttest.LicenseOptions {
317
+ Features : license.Features {
318
+ codersdk .FeatureExternalProvisionerDaemons : 1 ,
319
+ codersdk .FeatureMultipleOrganizations : 1 ,
320
+ },
321
+ },
322
+ Options : & coderdtest.Options {
323
+ DeploymentValues : dv ,
324
+ },
325
+ })
326
+ // nolint:gocritic // test
327
+ res , err := client .CreateProvisionerKey (ctx , user .OrganizationID , codersdk.CreateProvisionerKeyRequest {
328
+ Name : "dont-TEST-me" ,
329
+ })
330
+ require .NoError (t , err )
331
+ inv , conf := newCLI (t , "provisionerd" , "start" , "--key" , res .Key , "--name=matt-daemon" )
332
+ err = conf .URL ().Write (client .URL .String ())
333
+ require .NoError (t , err )
334
+ pty := ptytest .New (t ).Attach (inv )
335
+ clitest .Start (t , inv )
336
+ pty .ExpectNoMatchBefore (ctx , "check entitlement" , "starting provisioner daemon" )
337
+ pty .ExpectMatchContext (ctx , "matt-daemon" )
338
+
339
+ var daemons []codersdk.ProvisionerDaemon
340
+ require .Eventually (t , func () bool {
341
+ daemons , err = client .OrganizationProvisionerDaemons (ctx , user .OrganizationID )
342
+ if err != nil {
343
+ return false
344
+ }
345
+ return len (daemons ) == 1
346
+ }, testutil .WaitShort , testutil .IntervalSlow )
347
+ require .Equal (t , "matt-daemon" , daemons [0 ].Name )
348
+ require .Equal (t , provisionersdk .ScopeOrganization , daemons [0 ].Tags [provisionersdk .TagScope ])
349
+ require .Equal (t , buildinfo .Version (), daemons [0 ].Version )
350
+ require .Equal (t , proto .CurrentVersion .String (), daemons [0 ].APIVersion )
351
+ })
352
+
353
+ t .Run ("NoPSK" , func (t * testing.T ) {
354
+ t .Parallel ()
355
+
356
+ ctx , cancel := context .WithTimeout (context .Background (), testutil .WaitLong )
357
+ defer cancel ()
358
+ dv := coderdtest .DeploymentValues (t )
359
+ dv .Experiments .Append (string (codersdk .ExperimentMultiOrganization ))
360
+ client , user := coderdenttest .New (t , & coderdenttest.Options {
361
+ ProvisionerDaemonPSK : "provisionersftw" ,
362
+ LicenseOptions : & coderdenttest.LicenseOptions {
363
+ Features : license.Features {
364
+ codersdk .FeatureExternalProvisionerDaemons : 1 ,
365
+ codersdk .FeatureMultipleOrganizations : 1 ,
366
+ },
367
+ },
368
+ Options : & coderdtest.Options {
369
+ DeploymentValues : dv ,
370
+ },
371
+ })
372
+ // nolint:gocritic // test
373
+ res , err := client .CreateProvisionerKey (ctx , user .OrganizationID , codersdk.CreateProvisionerKeyRequest {
374
+ Name : "dont-TEST-me" ,
375
+ })
376
+ require .NoError (t , err )
377
+ inv , conf := newCLI (t , "provisionerd" , "start" , "--psk" , "provisionersftw" , "--key" , res .Key , "--name=matt-daemon" )
378
+ err = conf .URL ().Write (client .URL .String ())
379
+ require .NoError (t , err )
380
+ err = inv .WithContext (ctx ).Run ()
381
+ require .ErrorContains (t , err , "cannot provide both provisioner key --key and pre-shared key --psk" )
382
+ })
383
+
384
+ t .Run ("NoTags" , func (t * testing.T ) {
385
+ t .Parallel ()
386
+
387
+ ctx , cancel := context .WithTimeout (context .Background (), testutil .WaitLong )
388
+ defer cancel ()
389
+ dv := coderdtest .DeploymentValues (t )
390
+ dv .Experiments .Append (string (codersdk .ExperimentMultiOrganization ))
391
+ client , user := coderdenttest .New (t , & coderdenttest.Options {
392
+ ProvisionerDaemonPSK : "provisionersftw" ,
393
+ LicenseOptions : & coderdenttest.LicenseOptions {
394
+ Features : license.Features {
395
+ codersdk .FeatureExternalProvisionerDaemons : 1 ,
396
+ codersdk .FeatureMultipleOrganizations : 1 ,
397
+ },
398
+ },
399
+ Options : & coderdtest.Options {
400
+ DeploymentValues : dv ,
401
+ },
402
+ })
403
+ // nolint:gocritic // test
404
+ res , err := client .CreateProvisionerKey (ctx , user .OrganizationID , codersdk.CreateProvisionerKeyRequest {
405
+ Name : "dont-TEST-me" ,
406
+ })
407
+ require .NoError (t , err )
408
+ inv , conf := newCLI (t , "provisionerd" , "start" , "--tag" , "mykey=yourvalue" , "--key" , res .Key , "--name=matt-daemon" )
409
+ err = conf .URL ().Write (client .URL .String ())
410
+ require .NoError (t , err )
411
+ err = inv .WithContext (ctx ).Run ()
412
+ require .ErrorContains (t , err , "cannot provide tags when using provisioner key" )
413
+ })
414
+
415
+ t .Run ("AnotherOrg" , func (t * testing.T ) {
416
+ t .Parallel ()
417
+
418
+ ctx , cancel := context .WithTimeout (context .Background (), testutil .WaitLong )
419
+ defer cancel ()
420
+ dv := coderdtest .DeploymentValues (t )
421
+ dv .Experiments .Append (string (codersdk .ExperimentMultiOrganization ))
422
+ client , _ := coderdenttest .New (t , & coderdenttest.Options {
423
+ ProvisionerDaemonPSK : "provisionersftw" ,
424
+ LicenseOptions : & coderdenttest.LicenseOptions {
425
+ Features : license.Features {
426
+ codersdk .FeatureExternalProvisionerDaemons : 1 ,
427
+ codersdk .FeatureMultipleOrganizations : 1 ,
428
+ },
429
+ },
430
+ Options : & coderdtest.Options {
431
+ DeploymentValues : dv ,
432
+ },
433
+ })
434
+ anotherOrg := coderdtest .CreateOrganization (t , client , coderdtest.CreateOrganizationOptions {})
435
+ // nolint:gocritic // test
436
+ res , err := client .CreateProvisionerKey (ctx , anotherOrg .ID , codersdk.CreateProvisionerKeyRequest {
437
+ Name : "dont-TEST-me" ,
438
+ })
439
+ require .NoError (t , err )
440
+ inv , conf := newCLI (t , "provisionerd" , "start" , "--org" , anotherOrg .ID .String (), "--key" , res .Key , "--name=matt-daemon" )
441
+ err = conf .URL ().Write (client .URL .String ())
442
+ require .NoError (t , err )
443
+ pty := ptytest .New (t ).Attach (inv )
444
+ clitest .Start (t , inv )
445
+ pty .ExpectNoMatchBefore (ctx , "check entitlement" , "starting provisioner daemon" )
446
+ pty .ExpectMatchContext (ctx , "matt-daemon" )
447
+
448
+ var daemons []codersdk.ProvisionerDaemon
449
+ require .Eventually (t , func () bool {
450
+ daemons , err = client .OrganizationProvisionerDaemons (ctx , anotherOrg .ID )
451
+ if err != nil {
452
+ return false
453
+ }
454
+ return len (daemons ) == 1
455
+ }, testutil .WaitShort , testutil .IntervalSlow )
456
+ require .Equal (t , "matt-daemon" , daemons [0 ].Name )
457
+ require .Equal (t , provisionersdk .ScopeOrganization , daemons [0 ].Tags [provisionersdk .TagScope ])
458
+ require .Equal (t , buildinfo .Version (), daemons [0 ].Version )
459
+ require .Equal (t , proto .CurrentVersion .String (), daemons [0 ].APIVersion )
460
+ })
461
+ }
462
+
304
463
//nolint:paralleltest,tparallel // Test uses a static port.
305
464
func TestProvisionerDaemon_PrometheusEnabled (t * testing.T ) {
306
465
// Ephemeral ports have a tendency to conflict and fail with `bind: address already in use` error.
0 commit comments