@@ -2074,116 +2074,126 @@ func TestInvalidateTemplatePrebuilds(t *testing.T) {
20742074t .Run ("OK" ,func (t * testing.T ) {
20752075t .Parallel ()
20762076
2077- ctx := testutil .Context (t ,testutil .WaitLong )
2078- owner ,db := coderdtest .NewWithDatabase (t ,nil )
2079-
2080- // Create organization and template with old version
2081- org := dbgen .Organization (t ,db , database.Organization {})
2082- oldVersion := dbgen .TemplateVersion (t ,db , database.TemplateVersion {
2083- OrganizationID :org .ID ,
2077+ db ,ps := dbtestutil .NewDB (t )
2078+ ownerClient := coderdtest .New (t ,& coderdtest.Options {
2079+ Database :db ,
2080+ Pubsub :ps ,
20842081})
2082+ owner := coderdtest .CreateFirstUser (t ,ownerClient )
2083+ templateAdminClient ,templateAdmin := coderdtest .CreateAnotherUser (t ,ownerClient ,owner .OrganizationID ,rbac .RoleTemplateAdmin ())
2084+
2085+ // Given
2086+ orgID := owner .OrganizationID
20852087template := dbgen .Template (t ,db , database.Template {
2086- OrganizationID :org .ID ,
2087- ActiveVersionID :oldVersion .ID ,
2088+ OrganizationID :orgID ,
2089+ CreatedBy :templateAdmin .ID ,
2090+ })
2091+ oldVersionJob := dbgen .ProvisionerJob (t ,db ,ps , database.ProvisionerJob {
2092+ CreatedAt :dbtime .Now ().Add (- 60 * time .Second ),
2093+ CompletedAt : sql.NullTime {Time :dbtime .Now ().Add (- 50 * time .Second ),Valid :true },
2094+ OrganizationID :orgID ,
2095+ InitiatorID :templateAdmin .ID ,
2096+ Type :database .ProvisionerJobTypeTemplateVersionImport ,
2097+ })
2098+ oldVersion := dbgen .TemplateVersion (t ,db , database.TemplateVersion {
2099+ TemplateID : uuid.NullUUID {UUID :template .ID ,Valid :true },
2100+ OrganizationID :orgID ,
2101+ CreatedBy :templateAdmin .ID ,
2102+ JobID :oldVersionJob .ID ,
20882103})
20892104
2090- //Create prebuild with oldversion (should NOT be invalidated)
2105+ //Prebuild using oldtemplate version
20912106oldPrebuild := dbgen .Workspace (t ,db , database.WorkspaceTable {
2092- OrganizationID :org .ID ,
2093- OwnerID :database .PrebuildsSystemUserID ,
2094- TemplateID :template .ID ,
2095- })
2096- _ = dbgen .WorkspaceBuild (t ,db , database.WorkspaceBuild {
2107+ OwnerID :database .PrebuildsSystemUserID ,
2108+ TemplateID :template .ID ,
2109+ Deleted :false ,
2110+ })
2111+ oldPrebuildJob := dbgen .ProvisionerJob (t ,db ,ps , database.ProvisionerJob {
2112+ OrganizationID :orgID ,
2113+ InitiatorID :database .PrebuildsSystemUserID ,
2114+ Provisioner :database .ProvisionerTypeEcho ,
2115+ Type :database .ProvisionerJobTypeWorkspaceBuild ,
2116+ StartedAt : sql.NullTime {Time :dbtime .Now ().Add (- 60 * time .Second ),Valid :true },
2117+ CompletedAt : sql.NullTime {Time :dbtime .Now ().Add (- 50 * time .Second ),Valid :true },
2118+ Error : sql.NullString {},
2119+ ErrorCode : sql.NullString {},
2120+ })
2121+ dbgen .WorkspaceBuild (t ,db , database.WorkspaceBuild {
20972122WorkspaceID :oldPrebuild .ID ,
20982123TemplateVersionID :oldVersion .ID ,
2124+ JobID :oldPrebuildJob .ID ,
2125+ BuildNumber :1 ,
2126+ Transition :database .WorkspaceTransitionStart ,
2127+ InitiatorID :database .PrebuildsSystemUserID ,
2128+ Reason :database .BuildReasonInitiator ,
20992129})
21002130
2101- // Update template to new active version
2131+ // Update active template version
2132+ newVersionJob := dbgen .ProvisionerJob (t ,db ,ps , database.ProvisionerJob {
2133+ CreatedAt :dbtime .Now ().Add (- 60 * time .Second ),
2134+ CompletedAt : sql.NullTime {Time :dbtime .Now ().Add (- 50 * time .Second ),Valid :true },
2135+ OrganizationID :orgID ,
2136+ InitiatorID :templateAdmin .ID ,
2137+ Type :database .ProvisionerJobTypeTemplateVersionImport ,
2138+ })
21022139newVersion := dbgen .TemplateVersion (t ,db , database.TemplateVersion {
2103- OrganizationID :org .ID ,
21042140TemplateID : uuid.NullUUID {UUID :template .ID ,Valid :true },
2141+ OrganizationID :orgID ,
2142+ CreatedBy :templateAdmin .ID ,
2143+ JobID :newVersionJob .ID ,
21052144})
2145+
2146+ ctx ,cancel := context .WithTimeout (context .Background (),testutil .WaitLong )
2147+ defer cancel ()
21062148err := db .UpdateTemplateActiveVersionByID (ctx , database.UpdateTemplateActiveVersionByIDParams {
21072149ID :template .ID ,
21082150ActiveVersionID :newVersion .ID ,
21092151})
21102152require .NoError (t ,err )
2111- template .ActiveVersionID = newVersion .ID
2112-
2113- // Create 2 prebuilds with active version (SHOULD be invalidated)
2114- var activePrebuilds []database.WorkspaceTable
2115- for i := 0 ;i < 2 ;i ++ {
2116- ws := dbgen .Workspace (t ,db , database.WorkspaceTable {
2117- OrganizationID :org .ID ,
2118- OwnerID :database .PrebuildsSystemUserID ,
2119- TemplateID :template .ID ,
2120- })
2121- _ = dbgen .WorkspaceBuild (t ,db , database.WorkspaceBuild {
2122- WorkspaceID :ws .ID ,
2123- TemplateVersionID :newVersion .ID ,
2124- })
2125- activePrebuilds = append (activePrebuilds ,ws )
2126- }
21272153
2128- // Create user workspace with active version (should NOT be touched)
2129- user := coderdtest .CreateFirstUser (t ,owner )
2130- userWorkspace := dbgen .Workspace (t ,db , database.WorkspaceTable {
2131- OrganizationID :org .ID ,
2132- OwnerID :user .UserID ,
2133- TemplateID :template .ID ,
2154+ // Prebuild using new template version
2155+ newPrebuild := dbgen .Workspace (t ,db , database.WorkspaceTable {
2156+ OwnerID :database .PrebuildsSystemUserID ,
2157+ TemplateID :template .ID ,
2158+ Deleted :false ,
2159+ })
2160+
2161+ newPrebuildJob := dbgen .ProvisionerJob (t ,db ,ps , database.ProvisionerJob {
2162+ OrganizationID :orgID ,
2163+ InitiatorID :database .PrebuildsSystemUserID ,
2164+ Provisioner :database .ProvisionerTypeEcho ,
2165+ Type :database .ProvisionerJobTypeWorkspaceBuild ,
2166+ StartedAt : sql.NullTime {Time :dbtime .Now ().Add (- 60 * time .Second ),Valid :true },
2167+ CompletedAt : sql.NullTime {Time :dbtime .Now ().Add (- 50 * time .Second ),Valid :true },
2168+ Error : sql.NullString {},
2169+ ErrorCode : sql.NullString {},
21342170})
2135- _ = dbgen .WorkspaceBuild (t ,db , database.WorkspaceBuild {
2136- WorkspaceID :userWorkspace .ID ,
2171+
2172+ dbgen .WorkspaceBuild (t ,db , database.WorkspaceBuild {
2173+ WorkspaceID :newPrebuild .ID ,
21372174TemplateVersionID :newVersion .ID ,
2175+ JobID :newPrebuildJob .ID ,
2176+ BuildNumber :1 ,
2177+ Transition :database .WorkspaceTransitionStart ,
2178+ InitiatorID :database .PrebuildsSystemUserID ,
2179+ Reason :database .BuildReasonInitiator ,
21382180})
21392181
2182+ // When:
21402183// Invalidate prebuilds as template admin
2141- _ ,client := coderdtest .CreateAnotherUser (t ,owner ,org .ID ,rbac .RoleTemplateAdmin ())
2142- err = client .InvalidateTemplatePrebuilds (ctx ,template .ID )
2184+ err = templateAdminClient .InvalidateTemplatePrebuilds (ctx ,template .ID )
21432185require .NoError (t ,err )
21442186
2187+ // Then:
21452188// Verify old prebuild still exists (different version)
2146- _ ,err = db .GetWorkspaceByID (ctx ,oldPrebuild .ID )
2147- require .NoError (t ,err ,"old version prebuild should not be deleted" )
2148-
2149- // Verify user workspace still exists
2150- _ ,err = db .GetWorkspaceByID (ctx ,userWorkspace .ID )
2151- require .NoError (t ,err ,"user workspace should not be deleted" )
2152-
2153- // Verify active prebuilds have delete builds created
2154- for _ ,ws := range activePrebuilds {
2155- builds ,err := db .GetWorkspaceBuildsByWorkspaceID (ctx , database.GetWorkspaceBuildsByWorkspaceIDParams {
2156- WorkspaceID :ws .ID ,
2157- })
2158- require .NoError (t ,err )
2159- require .NotEmpty (t ,builds ,"active prebuild should have builds" )
2160- // Note: we can't easily verify the delete build was created without more setup
2161- }
2189+ p1 ,err := ownerClient .Workspace (ctx ,oldPrebuild .ID )
2190+ require .NoError (t ,err )
2191+ require .Equal (t ,codersdk .WorkspaceStatusRunning ,p1 .LatestBuild .Status )
2192+ // Verify new prebuild is pending deletion (hint: no provisioner job running)
2193+ p2 ,err := ownerClient .Workspace (ctx ,newPrebuild .ID )
2194+ require .Equal (t ,codersdk .WorkspaceStatusPending ,p2 .LatestBuild .Status )
2195+ require .Equal (t ,codersdk .WorkspaceTransitionDelete ,p2 .LatestBuild .Transition )
21622196})
21632197
2164- t .Run ("Unauthorized" ,func (t * testing.T ) {
2165- t .Parallel ()
2166-
2167- ctx := testutil .Context (t ,testutil .WaitLong )
2168- owner ,db := coderdtest .NewWithDatabase (t ,nil )
2169-
2170- org := dbgen .Organization (t ,db , database.Organization {})
2171- version := dbgen .TemplateVersion (t ,db , database.TemplateVersion {
2172- OrganizationID :org .ID ,
2173- })
2174- template := dbgen .Template (t ,db , database.Template {
2175- OrganizationID :org .ID ,
2176- ActiveVersionID :version .ID ,
2177- })
2178-
2179- // Regular user (not admin)
2180- _ ,regularUser := coderdtest .CreateAnotherUser (t ,owner ,org .ID )
2181-
2182- err := regularUser .InvalidateTemplatePrebuilds (ctx ,template .ID )
2183- require .Error (t ,err )
2184-
2185- var apiErr * codersdk.Error
2186- require .ErrorAs (t ,err ,& apiErr )
2187- require .Equal (t ,403 ,apiErr .StatusCode ())
2188- })
2198+ // TODO: Test unauthorized
21892199}