mirror of
https://github.com/coder/coder.git
synced 2025-07-03 16:13:58 +00:00
chore: add archive column to template versions (#10178)
* chore: add archive column to template versions
This commit is contained in:
@ -494,6 +494,165 @@ func TestUserChangeLoginType(t *testing.T) {
|
||||
require.Equal(t, bobExpPass, bob.HashedPassword, "hashed password should not change")
|
||||
}
|
||||
|
||||
type tvArgs struct {
|
||||
Status database.ProvisionerJobStatus
|
||||
// CreateWorkspace is true if we should create a workspace for the template version
|
||||
CreateWorkspace bool
|
||||
WorkspaceTransition database.WorkspaceTransition
|
||||
}
|
||||
|
||||
// createTemplateVersion is a helper function to create a version with its dependencies.
|
||||
func createTemplateVersion(t testing.TB, db database.Store, tpl database.Template, args tvArgs) database.TemplateVersion {
|
||||
t.Helper()
|
||||
version := dbgen.TemplateVersion(t, db, database.TemplateVersion{
|
||||
TemplateID: uuid.NullUUID{
|
||||
UUID: tpl.ID,
|
||||
Valid: true,
|
||||
},
|
||||
OrganizationID: tpl.OrganizationID,
|
||||
CreatedAt: dbtime.Now(),
|
||||
UpdatedAt: dbtime.Now(),
|
||||
CreatedBy: tpl.CreatedBy,
|
||||
})
|
||||
|
||||
earlier := sql.NullTime{
|
||||
Time: dbtime.Now().Add(time.Second * -30),
|
||||
Valid: true,
|
||||
}
|
||||
now := sql.NullTime{
|
||||
Time: dbtime.Now(),
|
||||
Valid: true,
|
||||
}
|
||||
j := database.ProvisionerJob{
|
||||
ID: version.JobID,
|
||||
CreatedAt: earlier.Time,
|
||||
UpdatedAt: earlier.Time,
|
||||
Error: sql.NullString{},
|
||||
OrganizationID: tpl.OrganizationID,
|
||||
InitiatorID: tpl.CreatedBy,
|
||||
Type: database.ProvisionerJobTypeTemplateVersionImport,
|
||||
}
|
||||
|
||||
switch args.Status {
|
||||
case database.ProvisionerJobStatusRunning:
|
||||
j.StartedAt = earlier
|
||||
case database.ProvisionerJobStatusPending:
|
||||
case database.ProvisionerJobStatusFailed:
|
||||
j.StartedAt = earlier
|
||||
j.CompletedAt = now
|
||||
j.Error = sql.NullString{
|
||||
String: "failed",
|
||||
Valid: true,
|
||||
}
|
||||
j.ErrorCode = sql.NullString{
|
||||
String: "failed",
|
||||
Valid: true,
|
||||
}
|
||||
case database.ProvisionerJobStatusSucceeded:
|
||||
j.StartedAt = earlier
|
||||
j.CompletedAt = now
|
||||
default:
|
||||
t.Fatalf("invalid status: %s", args.Status)
|
||||
}
|
||||
|
||||
dbgen.ProvisionerJob(t, db, nil, j)
|
||||
if args.CreateWorkspace {
|
||||
wrk := dbgen.Workspace(t, db, database.Workspace{
|
||||
CreatedAt: time.Time{},
|
||||
UpdatedAt: time.Time{},
|
||||
OwnerID: tpl.CreatedBy,
|
||||
OrganizationID: tpl.OrganizationID,
|
||||
TemplateID: tpl.ID,
|
||||
})
|
||||
trans := database.WorkspaceTransitionStart
|
||||
if args.WorkspaceTransition != "" {
|
||||
trans = args.WorkspaceTransition
|
||||
}
|
||||
buildJob := dbgen.ProvisionerJob(t, db, nil, database.ProvisionerJob{
|
||||
Type: database.ProvisionerJobTypeWorkspaceBuild,
|
||||
CompletedAt: now,
|
||||
InitiatorID: tpl.CreatedBy,
|
||||
OrganizationID: tpl.OrganizationID,
|
||||
})
|
||||
dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{
|
||||
WorkspaceID: wrk.ID,
|
||||
TemplateVersionID: version.ID,
|
||||
BuildNumber: 1,
|
||||
Transition: trans,
|
||||
InitiatorID: tpl.CreatedBy,
|
||||
JobID: buildJob.ID,
|
||||
})
|
||||
}
|
||||
return version
|
||||
}
|
||||
|
||||
func TestArchiveVersions(t *testing.T) {
|
||||
t.Parallel()
|
||||
if testing.Short() {
|
||||
t.SkipNow()
|
||||
}
|
||||
|
||||
t.Run("ArchiveFailedVersions", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
sqlDB := testSQLDB(t)
|
||||
err := migrations.Up(sqlDB)
|
||||
require.NoError(t, err)
|
||||
db := database.New(sqlDB)
|
||||
ctx := context.Background()
|
||||
|
||||
org := dbgen.Organization(t, db, database.Organization{})
|
||||
user := dbgen.User(t, db, database.User{})
|
||||
tpl := dbgen.Template(t, db, database.Template{
|
||||
OrganizationID: org.ID,
|
||||
CreatedBy: user.ID,
|
||||
})
|
||||
// Create some versions
|
||||
failed := createTemplateVersion(t, db, tpl, tvArgs{
|
||||
Status: database.ProvisionerJobStatusFailed,
|
||||
CreateWorkspace: false,
|
||||
})
|
||||
unused := createTemplateVersion(t, db, tpl, tvArgs{
|
||||
Status: database.ProvisionerJobStatusSucceeded,
|
||||
CreateWorkspace: false,
|
||||
})
|
||||
createTemplateVersion(t, db, tpl, tvArgs{
|
||||
Status: database.ProvisionerJobStatusSucceeded,
|
||||
CreateWorkspace: true,
|
||||
})
|
||||
deleted := createTemplateVersion(t, db, tpl, tvArgs{
|
||||
Status: database.ProvisionerJobStatusSucceeded,
|
||||
CreateWorkspace: true,
|
||||
WorkspaceTransition: database.WorkspaceTransitionDelete,
|
||||
})
|
||||
|
||||
// Now archive failed versions
|
||||
archived, err := db.ArchiveUnusedTemplateVersions(ctx, database.ArchiveUnusedTemplateVersionsParams{
|
||||
UpdatedAt: dbtime.Now(),
|
||||
TemplateID: tpl.ID,
|
||||
// All versions
|
||||
TemplateVersionID: uuid.Nil,
|
||||
JobStatus: database.NullProvisionerJobStatus{
|
||||
ProvisionerJobStatus: database.ProvisionerJobStatusFailed,
|
||||
Valid: true,
|
||||
},
|
||||
})
|
||||
require.NoError(t, err, "archive failed versions")
|
||||
require.Len(t, archived, 1, "should only archive one version")
|
||||
require.Equal(t, failed.ID, archived[0], "should archive failed version")
|
||||
|
||||
// Archive all unused versions
|
||||
archived, err = db.ArchiveUnusedTemplateVersions(ctx, database.ArchiveUnusedTemplateVersionsParams{
|
||||
UpdatedAt: dbtime.Now(),
|
||||
TemplateID: tpl.ID,
|
||||
// All versions
|
||||
TemplateVersionID: uuid.Nil,
|
||||
})
|
||||
require.NoError(t, err, "archive failed versions")
|
||||
require.Len(t, archived, 2)
|
||||
require.ElementsMatch(t, []uuid.UUID{deleted.ID, unused.ID}, archived, "should archive unused versions")
|
||||
})
|
||||
}
|
||||
|
||||
func requireUsersMatch(t testing.TB, expected []database.User, found []database.GetUsersRow, msg string) {
|
||||
t.Helper()
|
||||
require.ElementsMatch(t, expected, database.ConvertUserRows(found), msg)
|
||||
|
Reference in New Issue
Block a user