@@ -23,6 +23,8 @@ import (
23
23
"github.com/coder/coder/v2/coderd/coderdtest/oidctest"
24
24
"github.com/coder/coder/v2/coderd/database"
25
25
"github.com/coder/coder/v2/coderd/database/dbauthz"
26
+ "github.com/coder/coder/v2/coderd/database/dbgen"
27
+ "github.com/coder/coder/v2/coderd/database/dbtestutil"
26
28
"github.com/coder/coder/v2/coderd/database/dbtime"
27
29
"github.com/coder/coder/v2/coderd/externalauth"
28
30
"github.com/coder/coder/v2/coderd/rbac"
@@ -1181,188 +1183,188 @@ func TestPostWorkspaceBuild(t *testing.T) {
1181
1183
})
1182
1184
}
1183
1185
1184
- // func TestWorkspaceBuildTimings(t *testing.T) {
1185
- // // t.Parallel()
1186
-
1187
- // // Setup the test environment with a template and version
1188
- // db, pubsub := dbtestutil.NewDB(t)
1189
- // client := coderdtest.New(t, &coderdtest.Options{
1190
- // Database: db,
1191
- // Pubsub: pubsub,
1192
- // })
1193
- // owner := coderdtest.CreateFirstUser(t, client)
1194
- // file := dbgen.File(t, db, database.File{
1195
- // CreatedBy: owner.UserID,
1196
- // })
1197
- // versionJob := dbgen.ProvisionerJob(t, db, pubsub, database.ProvisionerJob{
1198
- // OrganizationID: owner.OrganizationID,
1199
- // InitiatorID: owner.UserID,
1200
- // FileID: file.ID,
1201
- // Tags: database.StringMap{
1202
- // "custom": "true",
1203
- // },
1204
- // })
1205
- // version := dbgen.TemplateVersion(t, db, database.TemplateVersion{
1206
- // OrganizationID: owner.OrganizationID,
1207
- // JobID: versionJob.ID,
1208
- // CreatedBy: owner.UserID,
1209
- // })
1210
- // template := dbgen.Template(t, db, database.Template{
1211
- // OrganizationID: owner.OrganizationID,
1212
- // ActiveVersionID: version.ID,
1213
- // CreatedBy: owner.UserID,
1214
- // })
1215
- // ws := dbgen.Workspace(t, db, database.Workspace{
1216
- // OwnerID: owner.UserID,
1217
- // OrganizationID: owner.OrganizationID,
1218
- // TemplateID: template.ID,
1219
- // })
1220
-
1221
- // // Create a build to attach timings
1222
- // var buildNumber int32
1223
- // makeBuild := func() database.WorkspaceBuild {
1224
- // buildNumber++
1225
- // jobID := uuid.New()
1226
- // job := dbgen.ProvisionerJob(t, db, pubsub, database.ProvisionerJob{
1227
- // ID: jobID,
1228
- // OrganizationID: owner.OrganizationID,
1229
- // Tags: database.StringMap{jobID.String(): "true"},
1230
- // })
1231
- // return dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{
1232
- // WorkspaceID: ws.ID,
1233
- // TemplateVersionID: version.ID,
1234
- // InitiatorID: owner.UserID,
1235
- // JobID: job.ID,
1236
- // BuildNumber: buildNumber,
1237
- // })
1238
- // }
1239
-
1240
- // t.Run("NonExistentBuild", func(t *testing.T) {
1241
- // t.Parallel()
1242
-
1243
- // // When: fetching an inexistent build
1244
- // buildID := uuid.New()
1245
- // ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
1246
- // t.Cleanup(cancel)
1247
- // _, err := client.WorkspaceBuildTimings(ctx, buildID)
1248
-
1249
- // // Then: expect a not found error
1250
- // require.Error(t, err)
1251
- // require.Contains(t, err.Error(), "not found")
1252
- // })
1253
-
1254
- // t.Run("EmptyTimings", func(t *testing.T) {
1255
- // t.Parallel()
1256
-
1257
- // // When: fetching timings for a build with no timings
1258
- // build := makeBuild()
1259
- // ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
1260
- // t.Cleanup(cancel)
1261
- // res, err := client.WorkspaceBuildTimings(ctx, build.ID)
1262
-
1263
- // // Then: return a response with empty timings
1264
- // require.NoError(t, err)
1265
- // require.Empty(t, res.ProvisionerTimings)
1266
- // require.Empty(t, res.AgentScriptTimings)
1267
- // })
1268
-
1269
- // t.Run("ProvisionerTimings", func(t *testing.T) {
1270
- // t.Parallel()
1271
-
1272
- // // When: fetching timings for a build with provisioner timings
1273
- // build := makeBuild()
1274
- // provisionerTimings := dbgen.ProvisionerJobTimings(t, db, build, 5)
1275
-
1276
- // // Then: return a response with the expected timings
1277
- // ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
1278
- // t.Cleanup(cancel)
1279
- // res, err := client.WorkspaceBuildTimings(ctx, build.ID)
1280
- // require.NoError(t, err)
1281
- // require.Len(t, res.ProvisionerTimings, 5)
1282
-
1283
- // for i := range res.ProvisionerTimings {
1284
- // timingRes := res.ProvisionerTimings[i]
1285
- // genTiming := provisionerTimings[i]
1286
- // require.Equal(t, genTiming.Resource, timingRes.Resource)
1287
- // require.Equal(t, genTiming.Action, timingRes.Action)
1288
- // require.Equal(t, string(genTiming.Stage), timingRes.Stage)
1289
- // require.Equal(t, genTiming.JobID.String(), timingRes.JobID.String())
1290
- // require.Equal(t, genTiming.Source, timingRes.Source)
1291
- // require.Equal(t, genTiming.StartedAt.UnixMilli(), timingRes.StartedAt.UnixMilli())
1292
- // require.Equal(t, genTiming.EndedAt.UnixMilli(), timingRes.EndedAt.UnixMilli())
1293
- // }
1294
- // })
1295
-
1296
- // t.Run("AgentScriptTimings", func(t *testing.T) {
1297
- // t.Parallel()
1298
-
1299
- // // When: fetching timings for a build with agent script timings
1300
- // build := makeBuild()
1301
- // resource := dbgen.WorkspaceResource(t, db, database.WorkspaceResource{
1302
- // JobID: build.JobID,
1303
- // })
1304
- // agent := dbgen.WorkspaceAgent(t, db, database.WorkspaceAgent{
1305
- // ResourceID: resource.ID,
1306
- // })
1307
- // script := dbgen.WorkspaceAgentScript(t, db, database.WorkspaceAgentScript{
1308
- // WorkspaceAgentID: agent.ID,
1309
- // })
1310
- // agentScriptTimings := dbgen.WorkspaceAgentScriptTimings(t, db, script, 5)
1311
-
1312
- // // Then: return a response with the expected timings
1313
- // ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
1314
- // t.Cleanup(cancel)
1315
- // res, err := client.WorkspaceBuildTimings(ctx, build.ID)
1316
- // require.NoError(t, err)
1317
- // require.Len(t, res.AgentScriptTimings, 5)
1318
-
1319
- // for i := range res.AgentScriptTimings {
1320
- // timingRes := res.AgentScriptTimings[i]
1321
- // genTiming := agentScriptTimings[i]
1322
- // require.Equal(t, genTiming.ExitCode, timingRes.ExitCode)
1323
- // require.Equal(t, string(genTiming.Status), timingRes.Status)
1324
- // require.Equal(t, string(genTiming.Stage), timingRes.Stage)
1325
- // require.Equal(t, genTiming.StartedAt.UnixMilli(), timingRes.StartedAt.UnixMilli())
1326
- // require.Equal(t, genTiming.EndedAt.UnixMilli(), timingRes.EndedAt.UnixMilli())
1327
- // }
1328
- // })
1329
-
1330
- // t.Run("NoAgentScripts", func(t *testing.T) {
1331
- // t.Parallel()
1332
-
1333
- // // When: fetching timings for a build with no agent scripts
1334
- // build := makeBuild()
1335
- // resource := dbgen.WorkspaceResource(t, db, database.WorkspaceResource{
1336
- // JobID: build.JobID,
1337
- // })
1338
- // dbgen.WorkspaceAgent(t, db, database.WorkspaceAgent{
1339
- // ResourceID: resource.ID,
1340
- // })
1341
-
1342
- // // Then: return a response with empty agent script timings
1343
- // ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
1344
- // t.Cleanup(cancel)
1345
- // res, err := client.WorkspaceBuildTimings(ctx, build.ID)
1346
- // require.NoError(t, err)
1347
- // require.Empty(t, res.AgentScriptTimings)
1348
- // })
1349
-
1350
- // // Some workspaces might not have agents. It is improbable, but possible.
1351
- // t.Run("NoAgents", func(t *testing.T) {
1352
- // t.Parallel()
1353
-
1354
- // // When: fetching timings for a build with no agents
1355
- // build := makeBuild()
1356
- // dbgen.WorkspaceResource(t, db, database.WorkspaceResource{
1357
- // JobID: build.JobID,
1358
- // })
1359
-
1360
- // // Then: return a response with empty agent script timings
1361
- // // trigger build
1362
- // ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
1363
- // t.Cleanup(cancel)
1364
- // res, err := client.WorkspaceBuildTimings(ctx, build.ID)
1365
- // require.NoError(t, err)
1366
- // require.Empty(t, res.AgentScriptTimings)
1367
- // })
1368
- // }
1186
+ func TestWorkspaceBuildTimings (t * testing.T ) {
1187
+ // t.Parallel()
1188
+
1189
+ // Setup the test environment with a template and version
1190
+ db , pubsub := dbtestutil .NewDB (t )
1191
+ client := coderdtest .New (t , & coderdtest.Options {
1192
+ Database : db ,
1193
+ Pubsub : pubsub ,
1194
+ })
1195
+ owner := coderdtest .CreateFirstUser (t , client )
1196
+ file := dbgen .File (t , db , database.File {
1197
+ CreatedBy : owner .UserID ,
1198
+ })
1199
+ versionJob := dbgen .ProvisionerJob (t , db , pubsub , database.ProvisionerJob {
1200
+ OrganizationID : owner .OrganizationID ,
1201
+ InitiatorID : owner .UserID ,
1202
+ FileID : file .ID ,
1203
+ Tags : database.StringMap {
1204
+ "custom" : "true" ,
1205
+ },
1206
+ })
1207
+ version := dbgen .TemplateVersion (t , db , database.TemplateVersion {
1208
+ OrganizationID : owner .OrganizationID ,
1209
+ JobID : versionJob .ID ,
1210
+ CreatedBy : owner .UserID ,
1211
+ })
1212
+ template := dbgen .Template (t , db , database.Template {
1213
+ OrganizationID : owner .OrganizationID ,
1214
+ ActiveVersionID : version .ID ,
1215
+ CreatedBy : owner .UserID ,
1216
+ })
1217
+ ws := dbgen .Workspace (t , db , database.Workspace {
1218
+ OwnerID : owner .UserID ,
1219
+ OrganizationID : owner .OrganizationID ,
1220
+ TemplateID : template .ID ,
1221
+ })
1222
+
1223
+ // Create a build to attach timings
1224
+ var buildNumber int32
1225
+ makeBuild := func () database.WorkspaceBuild {
1226
+ buildNumber ++
1227
+ jobID := uuid .New ()
1228
+ job := dbgen .ProvisionerJob (t , db , pubsub , database.ProvisionerJob {
1229
+ ID : jobID ,
1230
+ OrganizationID : owner .OrganizationID ,
1231
+ Tags : database.StringMap {jobID .String (): "true" },
1232
+ })
1233
+ return dbgen .WorkspaceBuild (t , db , database.WorkspaceBuild {
1234
+ WorkspaceID : ws .ID ,
1235
+ TemplateVersionID : version .ID ,
1236
+ InitiatorID : owner .UserID ,
1237
+ JobID : job .ID ,
1238
+ BuildNumber : buildNumber ,
1239
+ })
1240
+ }
1241
+
1242
+ t .Run ("NonExistentBuild" , func (t * testing.T ) {
1243
+ // t.Parallel()
1244
+
1245
+ // When: fetching an inexistent build
1246
+ buildID := uuid .New ()
1247
+ ctx , cancel := context .WithTimeout (context .Background (), testutil .WaitLong )
1248
+ t .Cleanup (cancel )
1249
+ _ , err := client .WorkspaceBuildTimings (ctx , buildID )
1250
+
1251
+ // Then: expect a not found error
1252
+ require .Error (t , err )
1253
+ require .Contains (t , err .Error (), "not found" )
1254
+ })
1255
+
1256
+ t .Run ("EmptyTimings" , func (t * testing.T ) {
1257
+ // t.Parallel()
1258
+
1259
+ // When: fetching timings for a build with no timings
1260
+ build := makeBuild ()
1261
+ ctx , cancel := context .WithTimeout (context .Background (), testutil .WaitLong )
1262
+ t .Cleanup (cancel )
1263
+ res , err := client .WorkspaceBuildTimings (ctx , build .ID )
1264
+
1265
+ // Then: return a response with empty timings
1266
+ require .NoError (t , err )
1267
+ require .Empty (t , res .ProvisionerTimings )
1268
+ require .Empty (t , res .AgentScriptTimings )
1269
+ })
1270
+
1271
+ t .Run ("ProvisionerTimings" , func (t * testing.T ) {
1272
+ // t.Parallel()
1273
+
1274
+ // When: fetching timings for a build with provisioner timings
1275
+ build := makeBuild ()
1276
+ provisionerTimings := dbgen .ProvisionerJobTimings (t , db , build , 5 )
1277
+
1278
+ // Then: return a response with the expected timings
1279
+ ctx , cancel := context .WithTimeout (context .Background (), testutil .WaitLong )
1280
+ t .Cleanup (cancel )
1281
+ res , err := client .WorkspaceBuildTimings (ctx , build .ID )
1282
+ require .NoError (t , err )
1283
+ require .Len (t , res .ProvisionerTimings , 5 )
1284
+
1285
+ for i := range res .ProvisionerTimings {
1286
+ timingRes := res .ProvisionerTimings [i ]
1287
+ genTiming := provisionerTimings [i ]
1288
+ require .Equal (t , genTiming .Resource , timingRes .Resource )
1289
+ require .Equal (t , genTiming .Action , timingRes .Action )
1290
+ require .Equal (t , string (genTiming .Stage ), timingRes .Stage )
1291
+ require .Equal (t , genTiming .JobID .String (), timingRes .JobID .String ())
1292
+ require .Equal (t , genTiming .Source , timingRes .Source )
1293
+ require .Equal (t , genTiming .StartedAt .UnixMilli (), timingRes .StartedAt .UnixMilli ())
1294
+ require .Equal (t , genTiming .EndedAt .UnixMilli (), timingRes .EndedAt .UnixMilli ())
1295
+ }
1296
+ })
1297
+
1298
+ t .Run ("AgentScriptTimings" , func (t * testing.T ) {
1299
+ // t.Parallel()
1300
+
1301
+ // When: fetching timings for a build with agent script timings
1302
+ build := makeBuild ()
1303
+ resource := dbgen .WorkspaceResource (t , db , database.WorkspaceResource {
1304
+ JobID : build .JobID ,
1305
+ })
1306
+ agent := dbgen .WorkspaceAgent (t , db , database.WorkspaceAgent {
1307
+ ResourceID : resource .ID ,
1308
+ })
1309
+ script := dbgen .WorkspaceAgentScript (t , db , database.WorkspaceAgentScript {
1310
+ WorkspaceAgentID : agent .ID ,
1311
+ })
1312
+ agentScriptTimings := dbgen .WorkspaceAgentScriptTimings (t , db , script , 5 )
1313
+
1314
+ // Then: return a response with the expected timings
1315
+ ctx , cancel := context .WithTimeout (context .Background (), testutil .WaitLong )
1316
+ t .Cleanup (cancel )
1317
+ res , err := client .WorkspaceBuildTimings (ctx , build .ID )
1318
+ require .NoError (t , err )
1319
+ require .Len (t , res .AgentScriptTimings , 5 )
1320
+
1321
+ for i := range res .AgentScriptTimings {
1322
+ timingRes := res .AgentScriptTimings [i ]
1323
+ genTiming := agentScriptTimings [i ]
1324
+ require .Equal (t , genTiming .ExitCode , timingRes .ExitCode )
1325
+ require .Equal (t , string (genTiming .Status ), timingRes .Status )
1326
+ require .Equal (t , string (genTiming .Stage ), timingRes .Stage )
1327
+ require .Equal (t , genTiming .StartedAt .UnixMilli (), timingRes .StartedAt .UnixMilli ())
1328
+ require .Equal (t , genTiming .EndedAt .UnixMilli (), timingRes .EndedAt .UnixMilli ())
1329
+ }
1330
+ })
1331
+
1332
+ t .Run ("NoAgentScripts" , func (t * testing.T ) {
1333
+ // t.Parallel()
1334
+
1335
+ // When: fetching timings for a build with no agent scripts
1336
+ build := makeBuild ()
1337
+ resource := dbgen .WorkspaceResource (t , db , database.WorkspaceResource {
1338
+ JobID : build .JobID ,
1339
+ })
1340
+ dbgen .WorkspaceAgent (t , db , database.WorkspaceAgent {
1341
+ ResourceID : resource .ID ,
1342
+ })
1343
+
1344
+ // Then: return a response with empty agent script timings
1345
+ ctx , cancel := context .WithTimeout (context .Background (), testutil .WaitLong )
1346
+ t .Cleanup (cancel )
1347
+ res , err := client .WorkspaceBuildTimings (ctx , build .ID )
1348
+ require .NoError (t , err )
1349
+ require .Empty (t , res .AgentScriptTimings )
1350
+ })
1351
+
1352
+ // Some workspaces might not have agents. It is improbable, but possible.
1353
+ t .Run ("NoAgents" , func (t * testing.T ) {
1354
+ // t.Parallel()
1355
+
1356
+ // When: fetching timings for a build with no agents
1357
+ build := makeBuild ()
1358
+ dbgen .WorkspaceResource (t , db , database.WorkspaceResource {
1359
+ JobID : build .JobID ,
1360
+ })
1361
+
1362
+ // Then: return a response with empty agent script timings
1363
+ // trigger build
1364
+ ctx , cancel := context .WithTimeout (context .Background (), testutil .WaitLong )
1365
+ t .Cleanup (cancel )
1366
+ res , err := client .WorkspaceBuildTimings (ctx , build .ID )
1367
+ require .NoError (t , err )
1368
+ require .Empty (t , res .AgentScriptTimings )
1369
+ })
1370
+ }
0 commit comments