Skip to content

Commit 8704afd

Browse files
committed
Match dbfake to postgres
1 parent a4ba58d commit 8704afd

File tree

3 files changed

+65
-36
lines changed

3 files changed

+65
-36
lines changed

coderd/database/dbfake/databasefake.go

Lines changed: 57 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1194,76 +1194,91 @@ func (q *fakeQuerier) GetAuthorizedWorkspaces(ctx context.Context, arg database.
11941194
return nil, xerrors.Errorf("get provisioner job: %w", err)
11951195
}
11961196

1197+
// How this works is you need to 'continue' if the status does
1198+
// not match. I do 'if/else' so I can just match the postgres logic.
11971199
switch database.WorkspaceStatus(arg.Status) {
11981200
case database.WorkspaceStatusPending:
1199-
if !job.StartedAt.Valid {
1201+
if isNull(job.StartedAt) {
1202+
} else {
12001203
continue
12011204
}
12021205

12031206
case database.WorkspaceStatusStarting:
1204-
if !job.StartedAt.Valid &&
1205-
!job.CanceledAt.Valid &&
1206-
job.CompletedAt.Valid &&
1207-
time.Since(job.UpdatedAt) > 30*time.Second ||
1208-
build.Transition != database.WorkspaceTransitionStart {
1207+
if isNotNull(job.StartedAt) &&
1208+
isNull(job.CanceledAt) &&
1209+
isNull(job.CompletedAt) &&
1210+
time.Since(job.UpdatedAt) < 30*time.Second &&
1211+
build.Transition == database.WorkspaceTransitionStart {
1212+
} else {
12091213
continue
12101214
}
12111215

12121216
case database.WorkspaceStatusRunning:
1213-
if !job.CompletedAt.Valid &&
1214-
job.CanceledAt.Valid &&
1215-
job.Error.Valid ||
1216-
build.Transition != database.WorkspaceTransitionStart {
1217+
if isNotNull(job.CompletedAt) &&
1218+
isNull(job.CanceledAt) &&
1219+
isNull(job.Error) &&
1220+
build.Transition == database.WorkspaceTransitionStart {
1221+
} else {
12171222
continue
12181223
}
12191224

12201225
case database.WorkspaceStatusStopping:
1221-
if !job.StartedAt.Valid &&
1222-
!job.CanceledAt.Valid &&
1223-
job.CompletedAt.Valid &&
1224-
time.Since(job.UpdatedAt) > 30*time.Second ||
1225-
build.Transition != database.WorkspaceTransitionStop {
1226+
if isNotNull(job.StartedAt) &&
1227+
isNull(job.CanceledAt) &&
1228+
isNull(job.CompletedAt) &&
1229+
time.Since(job.UpdatedAt) < 30*time.Second &&
1230+
build.Transition == database.WorkspaceTransitionStop {
1231+
} else {
12261232
continue
12271233
}
12281234

12291235
case database.WorkspaceStatusStopped:
1230-
if !job.CompletedAt.Valid &&
1231-
job.CanceledAt.Valid &&
1232-
job.Error.Valid ||
1233-
build.Transition != database.WorkspaceTransitionStop {
1236+
if isNotNull(job.CompletedAt) &&
1237+
isNull(job.CanceledAt) &&
1238+
isNull(job.Error) &&
1239+
build.Transition == database.WorkspaceTransitionStop {
1240+
} else {
12341241
continue
12351242
}
12361243

12371244
case database.WorkspaceStatusFailed:
1238-
if (!job.CanceledAt.Valid && !job.Error.Valid) ||
1239-
(!job.CompletedAt.Valid && !job.Error.Valid) {
1245+
if (isNotNull(job.CanceledAt) && isNotNull(job.Error)) ||
1246+
(isNotNull(job.CompletedAt) && isNotNull(job.Error)) {
1247+
} else {
12401248
continue
12411249
}
12421250

12431251
case database.WorkspaceStatusCanceling:
1244-
if !job.CanceledAt.Valid && job.CompletedAt.Valid {
1252+
if isNotNull(job.CanceledAt) &&
1253+
isNull(job.CompletedAt) {
1254+
} else {
12451255
continue
12461256
}
12471257

12481258
case database.WorkspaceStatusCanceled:
1249-
if !job.CanceledAt.Valid && !job.CompletedAt.Valid {
1259+
if isNotNull(job.CanceledAt) &&
1260+
isNotNull(job.CompletedAt) {
1261+
} else {
12501262
continue
12511263
}
12521264

12531265
case database.WorkspaceStatusDeleted:
1254-
if !job.StartedAt.Valid &&
1255-
job.CanceledAt.Valid &&
1256-
!job.CompletedAt.Valid &&
1257-
time.Since(job.UpdatedAt) > 30*time.Second ||
1258-
build.Transition != database.WorkspaceTransitionDelete {
1266+
if isNotNull(job.StartedAt) &&
1267+
isNull(job.CanceledAt) &&
1268+
isNotNull(job.CompletedAt) &&
1269+
time.Since(job.UpdatedAt) < 30*time.Second &&
1270+
build.Transition == database.WorkspaceTransitionDelete &&
1271+
isNull(job.Error) {
1272+
} else {
12591273
continue
12601274
}
12611275

12621276
case database.WorkspaceStatusDeleting:
1263-
if !job.CompletedAt.Valid &&
1264-
job.CanceledAt.Valid &&
1265-
job.Error.Valid &&
1266-
build.Transition != database.WorkspaceTransitionDelete {
1277+
if isNull(job.CompletedAt) &&
1278+
isNull(job.CanceledAt) &&
1279+
isNull(job.Error) &&
1280+
build.Transition == database.WorkspaceTransitionDelete {
1281+
} else {
12671282
continue
12681283
}
12691284

@@ -5331,3 +5346,13 @@ func (q *fakeQuerier) UpdateWorkspaceProxyDeleted(_ context.Context, arg databas
53315346
}
53325347
return sql.ErrNoRows
53335348
}
5349+
5350+
// isNull is only used in dbfake, so reflect is ok. Use this to make the logic
5351+
// look more similar to the postgres.
5352+
func isNull(v interface{}) bool {
5353+
return !isNotNull(v)
5354+
}
5355+
5356+
func isNotNull(v interface{}) bool {
5357+
return reflect.ValueOf(v).FieldByName("Valid").Bool()
5358+
}

coderd/database/queries.sql.go

Lines changed: 4 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/queries/workspaces.sql

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -157,10 +157,12 @@ WHERE
157157
latest_build.canceled_at IS NULL AND
158158
latest_build.completed_at IS NOT NULL AND
159159
latest_build.updated_at - INTERVAL '30 seconds' < NOW() AND
160-
latest_build.transition = 'delete'::workspace_transition
160+
latest_build.transition = 'delete'::workspace_transition AND
161+
-- If the error field is null, the status is 'failed'
162+
latest_build.error IS NULL
161163

162164
WHEN @status = 'deleting' THEN
163-
latest_build.completed_at IS NOT NULL AND
165+
latest_build.completed_at IS NULL AND
164166
latest_build.canceled_at IS NULL AND
165167
latest_build.error IS NULL AND
166168
latest_build.transition = 'delete'::workspace_transition

0 commit comments

Comments
 (0)