@@ -370,6 +370,8 @@ func TestPrebuildReconciliation(t *testing.T) {
370
370
templateVersionID ,
371
371
)
372
372
373
+ setupTestDBPrebuildAntagonists (t , db , pubSub , org )
374
+
373
375
if ! templateVersionActive {
374
376
// Create a new template version and mark it as active
375
377
// This marks the template version that we care about as inactive
@@ -2116,6 +2118,115 @@ func setupTestDBWorkspaceAgent(t *testing.T, db database.Store, workspaceID uuid
2116
2118
return agent
2117
2119
}
2118
2120
2121
+ // setupTestDBAntagonists creates test antagonists that should not influence running prebuild workspace tests.
2122
+ // 1. A stopped prebuilt workspace (STOP then START transitions, owned by
2123
+ // prebuilds system user).
2124
+ // 2. A running regular workspace (not owned by the prebuilds system user).
2125
+ func setupTestDBPrebuildAntagonists (t * testing.T , db database.Store , ps pubsub.Pubsub , org database.Organization ) {
2126
+ t .Helper ()
2127
+
2128
+ templateAdmin := dbgen .User (t , db , database.User {RBACRoles : []string {codersdk .RoleTemplateAdmin }})
2129
+ _ = dbgen .OrganizationMember (t , db , database.OrganizationMember {
2130
+ OrganizationID : org .ID ,
2131
+ UserID : templateAdmin .ID ,
2132
+ })
2133
+ member := dbgen .User (t , db , database.User {})
2134
+ _ = dbgen .OrganizationMember (t , db , database.OrganizationMember {
2135
+ OrganizationID : org .ID ,
2136
+ UserID : member .ID ,
2137
+ })
2138
+ tpl := dbgen .Template (t , db , database.Template {
2139
+ OrganizationID : org .ID ,
2140
+ CreatedBy : templateAdmin .ID ,
2141
+ })
2142
+ tv := dbgen .TemplateVersion (t , db , database.TemplateVersion {
2143
+ TemplateID : uuid.NullUUID {UUID : tpl .ID , Valid : true },
2144
+ OrganizationID : org .ID ,
2145
+ CreatedBy : templateAdmin .ID ,
2146
+ })
2147
+
2148
+ // 1) Stopped prebuilt workspace (owned by prebuilds system user)
2149
+ stoppedPrebuild := dbgen .Workspace (t , db , database.WorkspaceTable {
2150
+ OwnerID : database .PrebuildsSystemUserID ,
2151
+ TemplateID : tpl .ID ,
2152
+ Name : "prebuild-antagonist-stopped" ,
2153
+ Deleted : false ,
2154
+ })
2155
+
2156
+ // STOP build (build number 2, most recent)
2157
+ stoppedJob2 := dbgen .ProvisionerJob (t , db , ps , database.ProvisionerJob {
2158
+ OrganizationID : org .ID ,
2159
+ InitiatorID : database .PrebuildsSystemUserID ,
2160
+ Provisioner : database .ProvisionerTypeEcho ,
2161
+ Type : database .ProvisionerJobTypeWorkspaceBuild ,
2162
+ StartedAt : sql.NullTime {Time : dbtime .Now ().Add (- 30 * time .Second ), Valid : true },
2163
+ CompletedAt : sql.NullTime {Time : dbtime .Now ().Add (- 20 * time .Second ), Valid : true },
2164
+ Error : sql.NullString {},
2165
+ ErrorCode : sql.NullString {},
2166
+ })
2167
+ dbgen .WorkspaceBuild (t , db , database.WorkspaceBuild {
2168
+ WorkspaceID : stoppedPrebuild .ID ,
2169
+ TemplateVersionID : tv .ID ,
2170
+ JobID : stoppedJob2 .ID ,
2171
+ BuildNumber : 2 ,
2172
+ Transition : database .WorkspaceTransitionStop ,
2173
+ InitiatorID : database .PrebuildsSystemUserID ,
2174
+ Reason : database .BuildReasonInitiator ,
2175
+ // Explicitly not using a preset here. This shouldn't normally be possible,
2176
+ // but without this the reconciler will try to create a new prebuild for
2177
+ // this preset, which will affect the tests.
2178
+ TemplateVersionPresetID : uuid.NullUUID {},
2179
+ })
2180
+
2181
+ // START build (build number 1, older)
2182
+ stoppedJob1 := dbgen .ProvisionerJob (t , db , ps , database.ProvisionerJob {
2183
+ OrganizationID : org .ID ,
2184
+ InitiatorID : database .PrebuildsSystemUserID ,
2185
+ Provisioner : database .ProvisionerTypeEcho ,
2186
+ Type : database .ProvisionerJobTypeWorkspaceBuild ,
2187
+ StartedAt : sql.NullTime {Time : dbtime .Now ().Add (- 60 * time .Second ), Valid : true },
2188
+ CompletedAt : sql.NullTime {Time : dbtime .Now ().Add (- 50 * time .Second ), Valid : true },
2189
+ Error : sql.NullString {},
2190
+ ErrorCode : sql.NullString {},
2191
+ })
2192
+ dbgen .WorkspaceBuild (t , db , database.WorkspaceBuild {
2193
+ WorkspaceID : stoppedPrebuild .ID ,
2194
+ TemplateVersionID : tv .ID ,
2195
+ JobID : stoppedJob1 .ID ,
2196
+ BuildNumber : 1 ,
2197
+ Transition : database .WorkspaceTransitionStart ,
2198
+ InitiatorID : database .PrebuildsSystemUserID ,
2199
+ Reason : database .BuildReasonInitiator ,
2200
+ })
2201
+
2202
+ // 2) Running regular workspace (not owned by prebuilds system user)
2203
+ regularWorkspace := dbgen .Workspace (t , db , database.WorkspaceTable {
2204
+ OwnerID : member .ID ,
2205
+ TemplateID : tpl .ID ,
2206
+ Name : "antagonist-regular-workspace" ,
2207
+ Deleted : false ,
2208
+ })
2209
+ regularJob := dbgen .ProvisionerJob (t , db , nil , database.ProvisionerJob {
2210
+ OrganizationID : org .ID ,
2211
+ InitiatorID : member .ID ,
2212
+ Provisioner : database .ProvisionerTypeEcho ,
2213
+ Type : database .ProvisionerJobTypeWorkspaceBuild ,
2214
+ StartedAt : sql.NullTime {Time : dbtime .Now ().Add (- 40 * time .Second ), Valid : true },
2215
+ CompletedAt : sql.NullTime {Time : dbtime .Now ().Add (- 30 * time .Second ), Valid : true },
2216
+ Error : sql.NullString {},
2217
+ ErrorCode : sql.NullString {},
2218
+ })
2219
+ dbgen .WorkspaceBuild (t , db , database.WorkspaceBuild {
2220
+ WorkspaceID : regularWorkspace .ID ,
2221
+ TemplateVersionID : tv .ID ,
2222
+ JobID : regularJob .ID ,
2223
+ BuildNumber : 1 ,
2224
+ Transition : database .WorkspaceTransitionStart ,
2225
+ InitiatorID : member .ID ,
2226
+ Reason : database .BuildReasonInitiator ,
2227
+ })
2228
+ }
2229
+
2119
2230
var allTransitions = []database.WorkspaceTransition {
2120
2231
database .WorkspaceTransitionStart ,
2121
2232
database .WorkspaceTransitionStop ,
0 commit comments