@@ -554,6 +554,75 @@ func TestInvalidPreset(t *testing.T) {
554
554
}
555
555
}
556
556
557
+ func TestDeletionOfPrebuiltWorkspaceWithInvalidPreset (t * testing.T ) {
558
+ t .Parallel ()
559
+
560
+ if ! dbtestutil .WillUsePostgres () {
561
+ t .Skip ("This test requires postgres" )
562
+ }
563
+
564
+ templateDeleted := false
565
+
566
+ clock := quartz .NewMock (t )
567
+ ctx := testutil .Context (t ,testutil .WaitShort )
568
+ cfg := codersdk.PrebuildsConfig {}
569
+ logger := slogtest .Make (
570
+ t ,& slogtest.Options {IgnoreErrors :true },
571
+ ).Leveled (slog .LevelDebug )
572
+ db ,pubSub := dbtestutil .NewDB (t )
573
+ controller := prebuilds .NewStoreReconciler (db ,pubSub ,cfg ,logger ,quartz .NewMock (t ),prometheus .NewRegistry ())
574
+
575
+ ownerID := uuid .New ()
576
+ dbgen .User (t ,db , database.User {
577
+ ID :ownerID ,
578
+ })
579
+ org ,template := setupTestDBTemplate (t ,db ,ownerID ,templateDeleted )
580
+ templateVersionID := setupTestDBTemplateVersion (ctx ,t ,clock ,db ,pubSub ,org .ID ,ownerID ,template .ID )
581
+ preset := setupTestDBPreset (t ,db ,templateVersionID ,1 ,uuid .New ().String ())
582
+ prebuiltWorkspace := setupTestDBPrebuild (
583
+ t ,
584
+ clock ,
585
+ db ,
586
+ pubSub ,
587
+ database .WorkspaceTransitionStart ,
588
+ database .ProvisionerJobStatusSucceeded ,
589
+ org .ID ,
590
+ preset ,
591
+ template .ID ,
592
+ templateVersionID ,
593
+ )
594
+
595
+ workspaces ,err := db .GetWorkspacesByTemplateID (ctx ,template .ID )
596
+ require .NoError (t ,err )
597
+ // make sure we have only one workspace
598
+ require .Equal (t ,1 ,len (workspaces ))
599
+
600
+ // Create a new template version and mark it as active.
601
+ // This marks the previous template version as inactive.
602
+ templateVersionID = setupTestDBTemplateVersion (ctx ,t ,clock ,db ,pubSub ,org .ID ,ownerID ,template .ID )
603
+ // Add required param, which is not set in preset.
604
+ // It means that creating of new prebuilt workspace will fail, but we should be able to clean up old prebuilt workspaces.
605
+ dbgen .TemplateVersionParameter (t ,db , database.TemplateVersionParameter {
606
+ TemplateVersionID :templateVersionID ,
607
+ Name :"required-param" ,
608
+ Description :"required param which isn't set in preset" ,
609
+ Type :"bool" ,
610
+ DefaultValue :"" ,
611
+ Required :true ,
612
+ })
613
+
614
+ // Old prebuilt workspace should be deleted.
615
+ require .NoError (t ,controller .ReconcileAll (ctx ))
616
+
617
+ builds ,err := db .GetWorkspaceBuildsByWorkspaceID (ctx , database.GetWorkspaceBuildsByWorkspaceIDParams {
618
+ WorkspaceID :prebuiltWorkspace .ID ,
619
+ })
620
+ require .NoError (t ,err )
621
+ // Make sure old prebuild workspace was deleted, despite it contains required parameter which isn't set in preset.
622
+ require .Equal (t ,2 ,len (builds ))
623
+ require .Equal (t ,database .WorkspaceTransitionDelete ,builds [0 ].Transition )
624
+ }
625
+
557
626
func TestRunLoop (t * testing.T ) {
558
627
t .Parallel ()
559
628