Skip to content

Commit 02aa085

Browse files
committed
Rename to archive
1 parent 7f3d805 commit 02aa085

17 files changed

+283
-285
lines changed

cli/templates.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ func (r *RootCmd) templates() *clibase.Cmd {
4343
r.templateVersions(),
4444
r.templateDelete(),
4545
r.templatePull(),
46-
r.templatePrune(),
46+
r.archiveTemplateVersions(),
4747
},
4848
}
4949

cli/templateprune.go renamed to cli/templateversionarchive.go

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,31 +6,30 @@ import (
66
"strings"
77
"time"
88

9-
"golang.org/x/xerrors"
10-
119
"github.com/coder/pretty"
10+
"golang.org/x/xerrors"
1211

1312
"github.com/coder/coder/v2/cli/clibase"
1413
"github.com/coder/coder/v2/cli/cliui"
1514
"github.com/coder/coder/v2/codersdk"
1615
)
1716

18-
func (r *RootCmd) templatePrune() *clibase.Cmd {
17+
func (r *RootCmd) archiveTemplateVersions() *clibase.Cmd {
1918
var (
2019
all clibase.Bool
2120
)
2221
client := new(codersdk.Client)
2322
cmd := &clibase.Cmd{
24-
Use: "prune [name...]",
25-
Short: "Prune unused failed template versions from a given template(s)",
23+
Use: "archive [name...] ",
24+
Short: "Archive unused failed template versions from a given template(s)",
2625
Middleware: clibase.Chain(
2726
r.InitClient(client),
2827
),
2928
Options: clibase.OptionSet{
3029
cliui.SkipPromptOption(),
3130
clibase.Option{
3231
Name: "all",
33-
Description: "Include all unused template versions. By default, only failed template versions are pruned.",
32+
Description: "Include all unused template versions. By default, only failed template versions are archived.",
3433
Flag: "all",
3534
Value: &all,
3635
},
@@ -67,9 +66,9 @@ func (r *RootCmd) templatePrune() *clibase.Cmd {
6766
templateNames = append(templateNames, template.Name)
6867
}
6968

70-
// Confirm prune of the template.
69+
// Confirm archive of the template.
7170
_, err = cliui.Prompt(inv, cliui.PromptOptions{
72-
Text: fmt.Sprintf("Prune template versions of these templates: %s?", pretty.Sprint(cliui.DefaultStyles.Code, strings.Join(templateNames, ", "))),
71+
Text: fmt.Sprintf("Archive template versions of these templates: %s?", pretty.Sprint(cliui.DefaultStyles.Code, strings.Join(templateNames, ", "))),
7372
IsConfirm: true,
7473
Default: cliui.ConfirmNo,
7574
})
@@ -78,13 +77,13 @@ func (r *RootCmd) templatePrune() *clibase.Cmd {
7877
}
7978

8079
for _, template := range templates {
81-
resp, err := client.PruneTemplateVersions(ctx, template.ID, all.Value())
80+
resp, err := client.ArchiveTemplateVersions(ctx, template.ID, all.Value())
8281
if err != nil {
83-
return xerrors.Errorf("delete template %q: %w", template.Name, err)
82+
return xerrors.Errorf("archive template versions for %q: %w", template.Name, err)
8483
}
8584

8685
_, _ = fmt.Fprintln(
87-
inv.Stdout, fmt.Sprintf("Deleted %s versions from "+pretty.Sprint(cliui.DefaultStyles.Keyword, template.Name)+" at "+cliui.Timestamp(time.Now()), len(resp.DeletedIDs)),
86+
inv.Stdout, fmt.Sprintf("Archive %s versions from "+pretty.Sprint(cliui.DefaultStyles.Keyword, template.Name)+" at "+cliui.Timestamp(time.Now()), len(resp.ArchivedIDs)),
8887
)
8988

9089
if ok, _ := inv.ParsedFlags().GetBool("verbose"); err == nil && ok {

coderd/coderd.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -671,7 +671,7 @@ func New(options *Options) *API {
671671
r.Delete("/", api.deleteTemplate)
672672
r.Patch("/", api.patchTemplateMeta)
673673
r.Route("/versions", func(r chi.Router) {
674-
r.Delete("/prune", api.deletePruneTemplateVersions)
674+
r.Post("/archive", api.postArchiveTemplateVersions)
675675
r.Get("/", api.templateVersionsByTemplate)
676676
r.Patch("/", api.patchActiveTemplateVersion)
677677
r.Get("/{templateversionname}", api.templateVersionByName)

coderd/database/dbauthz/dbauthz.go

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -673,6 +673,17 @@ func (q *querier) AllUserIDs(ctx context.Context) ([]uuid.UUID, error) {
673673
return q.db.AllUserIDs(ctx)
674674
}
675675

676+
func (q *querier) ArchiveUnusedTemplateVersions(ctx context.Context, arg database.ArchiveUnusedTemplateVersionsParams) ([]uuid.UUID, error) {
677+
tpl, err := q.db.GetTemplateByID(ctx, arg.TemplateID)
678+
if err != nil {
679+
return nil, err
680+
}
681+
if err := q.authorizeContext(ctx, rbac.ActionUpdate, tpl); err != nil {
682+
return nil, err
683+
}
684+
return q.db.ArchiveUnusedTemplateVersions(ctx, arg)
685+
}
686+
676687
func (q *querier) CleanTailnetCoordinators(ctx context.Context) error {
677688
if err := q.authorizeContext(ctx, rbac.ActionDelete, rbac.ResourceTailnetCoordinator); err != nil {
678689
return err
@@ -2242,17 +2253,6 @@ func (q *querier) InsertWorkspaceResourceMetadata(ctx context.Context, arg datab
22422253
return q.db.InsertWorkspaceResourceMetadata(ctx, arg)
22432254
}
22442255

2245-
func (q *querier) PruneUnusedTemplateVersions(ctx context.Context, arg database.PruneUnusedTemplateVersionsParams) ([]uuid.UUID, error) {
2246-
tpl, err := q.db.GetTemplateByID(ctx, arg.TemplateID)
2247-
if err != nil {
2248-
return nil, err
2249-
}
2250-
if err := q.authorizeContext(ctx, rbac.ActionUpdate, tpl); err != nil {
2251-
return nil, err
2252-
}
2253-
return q.db.PruneUnusedTemplateVersions(ctx, arg)
2254-
}
2255-
22562256
func (q *querier) RegisterWorkspaceProxy(ctx context.Context, arg database.RegisterWorkspaceProxyParams) (database.WorkspaceProxy, error) {
22572257
fetch := func(ctx context.Context, arg database.RegisterWorkspaceProxyParams) (database.WorkspaceProxy, error) {
22582258
return q.db.GetWorkspaceProxyByID(ctx, arg.ID)

coderd/database/dbfake/dbfake.go

Lines changed: 67 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -845,6 +845,73 @@ func (q *FakeQuerier) AllUserIDs(_ context.Context) ([]uuid.UUID, error) {
845845
return userIDs, nil
846846
}
847847

848+
func (q *FakeQuerier) ArchiveUnusedTemplateVersions(_ context.Context, arg database.ArchiveUnusedTemplateVersionsParams) ([]uuid.UUID, error) {
849+
err := validateDatabaseType(arg)
850+
if err != nil {
851+
return nil, err
852+
}
853+
q.mutex.Lock()
854+
defer q.mutex.Unlock()
855+
type latestBuild struct {
856+
Number int32
857+
Version uuid.UUID
858+
}
859+
latest := make(map[uuid.UUID]latestBuild)
860+
861+
for _, b := range q.workspaceBuilds {
862+
v, ok := latest[b.WorkspaceID]
863+
if ok || b.BuildNumber < v.Number {
864+
// Not the latest
865+
continue
866+
}
867+
latest[b.WorkspaceID] = latestBuild{
868+
Number: b.BuildNumber,
869+
Version: b.TemplateVersionID,
870+
}
871+
}
872+
873+
usedVersions := make(map[uuid.UUID]bool)
874+
for _, l := range latest {
875+
usedVersions[l.Version] = true
876+
}
877+
for _, tpl := range q.templates {
878+
usedVersions[tpl.ActiveVersionID] = true
879+
}
880+
881+
var deleted []uuid.UUID
882+
for i, v := range q.templateVersions {
883+
if v.Archived {
884+
continue
885+
}
886+
887+
if _, ok := usedVersions[v.ID]; !ok {
888+
var job *database.ProvisionerJob
889+
for i, j := range q.provisionerJobs {
890+
if v.JobID == j.ID {
891+
job = &q.provisionerJobs[i]
892+
break
893+
}
894+
}
895+
896+
if arg.JobStatus.Valid {
897+
if job.JobStatus != arg.JobStatus.ProvisionerJobStatus {
898+
continue
899+
}
900+
}
901+
902+
if job.JobStatus == database.ProvisionerJobStatusRunning || job.JobStatus == database.ProvisionerJobStatusPending {
903+
continue
904+
}
905+
906+
v.Archived = true
907+
q.templateVersions[i] = v
908+
deleted = append(deleted, v.ID)
909+
}
910+
}
911+
912+
return deleted, nil
913+
}
914+
848915
func (*FakeQuerier) CleanTailnetCoordinators(_ context.Context) error {
849916
return ErrUnimplemented
850917
}
@@ -5199,73 +5266,6 @@ func (q *FakeQuerier) InsertWorkspaceResourceMetadata(_ context.Context, arg dat
51995266
return metadata, nil
52005267
}
52015268

5202-
func (q *FakeQuerier) PruneUnusedTemplateVersions(_ context.Context, arg database.PruneUnusedTemplateVersionsParams) ([]uuid.UUID, error) {
5203-
err := validateDatabaseType(arg)
5204-
if err != nil {
5205-
return nil, err
5206-
}
5207-
q.mutex.Lock()
5208-
defer q.mutex.Unlock()
5209-
type latestBuild struct {
5210-
Number int32
5211-
Version uuid.UUID
5212-
}
5213-
latest := make(map[uuid.UUID]latestBuild)
5214-
5215-
for _, b := range q.workspaceBuilds {
5216-
v, ok := latest[b.WorkspaceID]
5217-
if ok || b.BuildNumber < v.Number {
5218-
// Not the latest
5219-
continue
5220-
}
5221-
latest[b.WorkspaceID] = latestBuild{
5222-
Number: b.BuildNumber,
5223-
Version: b.TemplateVersionID,
5224-
}
5225-
}
5226-
5227-
usedVersions := make(map[uuid.UUID]bool)
5228-
for _, l := range latest {
5229-
usedVersions[l.Version] = true
5230-
}
5231-
for _, tpl := range q.templates {
5232-
usedVersions[tpl.ActiveVersionID] = true
5233-
}
5234-
5235-
var deleted []uuid.UUID
5236-
for i, v := range q.templateVersions {
5237-
if v.Deleted {
5238-
continue
5239-
}
5240-
5241-
if _, ok := usedVersions[v.ID]; !ok {
5242-
var job *database.ProvisionerJob
5243-
for _, j := range q.provisionerJobs {
5244-
if v.JobID == j.ID {
5245-
job = &j
5246-
break
5247-
}
5248-
}
5249-
5250-
if arg.JobStatus.Valid {
5251-
if job.JobStatus != arg.JobStatus.ProvisionerJobStatus {
5252-
continue
5253-
}
5254-
}
5255-
5256-
if job.JobStatus == database.ProvisionerJobStatusRunning || job.JobStatus == database.ProvisionerJobStatusPending {
5257-
continue
5258-
}
5259-
5260-
v.Deleted = true
5261-
q.templateVersions[i] = v
5262-
deleted = append(deleted, v.ID)
5263-
}
5264-
}
5265-
5266-
return deleted, nil
5267-
}
5268-
52695269
func (q *FakeQuerier) RegisterWorkspaceProxy(_ context.Context, arg database.RegisterWorkspaceProxyParams) (database.WorkspaceProxy, error) {
52705270
q.mutex.Lock()
52715271
defer q.mutex.Unlock()

coderd/database/dbmetrics/dbmetrics.go

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

coderd/database/dbmock/dbmock.go

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

coderd/database/dump.sql

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

coderd/database/migrations/000162_delete_template_versions.down.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ BEGIN;
44
DROP VIEW template_version_with_user;
55

66
ALTER TABLE template_versions
7-
DROP COLUMN deleted;
7+
DROP COLUMN archived;
88

99
-- Restore the old version of the template_version_with_user view.
1010
CREATE VIEW

coderd/database/migrations/000162_delete_template_versions.up.sql

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,9 @@ BEGIN;
33
-- The view will be rebuilt with the new column
44
DROP VIEW template_version_with_user;
55

6-
-- Hard deleting can cause reference issues with audit logs,
7-
-- so we only support soft deleting this resource at this time.
6+
-- Archived template versions are not visible or usable by default.
87
ALTER TABLE template_versions
9-
ADD COLUMN deleted BOOLEAN NOT NULL DEFAULT FALSE;
8+
ADD COLUMN archived BOOLEAN NOT NULL DEFAULT FALSE;
109

1110
-- Restore the old version of the template_version_with_user view.
1211
CREATE VIEW
@@ -18,8 +17,8 @@ SELECT
1817
coalesce(visible_users.username, '') AS created_by_username
1918
FROM
2019
template_versions
21-
LEFT JOIN
22-
visible_users
20+
LEFT JOIN
21+
visible_users
2322
ON
2423
template_versions.created_by = visible_users.id;
2524

coderd/database/models.go

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

0 commit comments

Comments
 (0)