Skip to content

Commit b83a15e

Browse files
committed
Move cmd commands, allow archiuve deleted
1 parent a9ff9d6 commit b83a15e

File tree

7 files changed

+53
-18
lines changed

7 files changed

+53
-18
lines changed

cli/templates.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ func (r *RootCmd) templates() *clibase.Cmd {
4444
r.templateDelete(),
4545
r.templatePull(),
4646
r.archiveTemplateVersions(),
47-
r.archiveTemplateVersion(),
4847
},
4948
}
5049

cli/templateversionarchive.go

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ func (r *RootCmd) archiveTemplateVersion() *clibase.Cmd {
1919

2020
client := new(codersdk.Client)
2121
cmd := &clibase.Cmd{
22-
Use: "archive-version <template-name> [template-version-names...] ",
22+
Use: "archive <template-name> [template-version-names...] ",
2323
Short: "Archive or unarchive a template version(s).",
2424
Middleware: clibase.Chain(
2525
r.InitClient(client),
@@ -68,17 +68,31 @@ func (r *RootCmd) archiveTemplateVersion() *clibase.Cmd {
6868
if unarchive {
6969
verb = "unarchived"
7070
}
71+
failed := 0
7172
for _, version := range versions {
73+
if version.Archived == !unarchive.Value() {
74+
_, _ = fmt.Fprintln(
75+
inv.Stdout, fmt.Sprintf("Version "+pretty.Sprint(cliui.DefaultStyles.Keyword, version.Name)+" already "+verb),
76+
)
77+
continue
78+
}
79+
7280
err := client.SetArchiveTemplateVersion(ctx, version.ID, !unarchive.Value())
7381
if err != nil {
74-
return xerrors.Errorf("set archive to %t template versions for %q: %w", !unarchive, template.Name, err)
82+
failed++
83+
_, _ = fmt.Fprintln(inv.Stderr, fmt.Sprintf("Failed to archive template version %q: %s", version.Name,
84+
pretty.Sprint(cliui.DefaultStyles.Error, err.Error())))
85+
continue
7586
}
7687

7788
_, _ = fmt.Fprintln(
7889
inv.Stdout, fmt.Sprintf("Version "+pretty.Sprint(cliui.DefaultStyles.Keyword, version.Name)+" "+verb+" at "+cliui.Timestamp(time.Now())),
7990
)
8091
}
8192

93+
if failed > 0 {
94+
return xerrors.Errorf("failed on %d template versions", failed)
95+
}
8296
return nil
8397
},
8498
}
@@ -90,7 +104,7 @@ func (r *RootCmd) archiveTemplateVersions() *clibase.Cmd {
90104
var all clibase.Bool
91105
client := new(codersdk.Client)
92106
cmd := &clibase.Cmd{
93-
Use: "archive-template [template-name...] ",
107+
Use: "archive [template-name...] ",
94108
Short: "Archive unused failed template versions from a given template(s)",
95109
Middleware: clibase.Chain(
96110
r.InitClient(client),
@@ -146,14 +160,18 @@ func (r *RootCmd) archiveTemplateVersions() *clibase.Cmd {
146160
return err
147161
}
148162

163+
failed := 0
149164
for _, template := range templates {
150165
resp, err := client.ArchiveTemplateVersions(ctx, template.ID, all.Value())
151166
if err != nil {
152-
return xerrors.Errorf("archive template versions for %q: %w", template.Name, err)
167+
_, _ = fmt.Fprintln(inv.Stderr, fmt.Sprintf("Failed to archive template versions for %q: %s", template.Name,
168+
pretty.Sprint(cliui.DefaultStyles.Error, err.Error())))
169+
failed++
170+
continue
153171
}
154172

155173
_, _ = fmt.Fprintln(
156-
inv.Stdout, fmt.Sprintf("Archive %s versions from "+pretty.Sprint(cliui.DefaultStyles.Keyword, template.Name)+" at "+cliui.Timestamp(time.Now()), len(resp.ArchivedIDs)),
174+
inv.Stdout, fmt.Sprintf("Archived %d versions from "+pretty.Sprint(cliui.DefaultStyles.Keyword, template.Name)+" at "+cliui.Timestamp(time.Now()), len(resp.ArchivedIDs)),
157175
)
158176

159177
if ok, _ := inv.ParsedFlags().GetBool("verbose"); err == nil && ok {
@@ -167,6 +185,9 @@ func (r *RootCmd) archiveTemplateVersions() *clibase.Cmd {
167185
}
168186
}
169187

188+
if failed > 0 {
189+
return xerrors.Errorf("failed on %d templates", failed)
190+
}
170191
return nil
171192
},
172193
}

cli/templateversions.go

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import (
55
"strings"
66
"time"
77

8+
"github.com/coder/pretty"
9+
810
"github.com/google/uuid"
911
"golang.org/x/xerrors"
1012

@@ -29,6 +31,7 @@ func (r *RootCmd) templateVersions() *clibase.Cmd {
2931
},
3032
Children: []*clibase.Cmd{
3133
r.templateVersionsList(),
34+
r.archiveTemplateVersion(),
3235
},
3336
}
3437

@@ -42,13 +45,23 @@ func (r *RootCmd) templateVersionsList() *clibase.Cmd {
4245
)
4346
client := new(codersdk.Client)
4447

48+
var includeArchived clibase.Bool
49+
4550
cmd := &clibase.Cmd{
4651
Use: "list <template>",
4752
Middleware: clibase.Chain(
4853
clibase.RequireNArgs(1),
4954
r.InitClient(client),
5055
),
5156
Short: "List all the versions of the specified template",
57+
Options: clibase.OptionSet{
58+
{
59+
Name: "include-archived",
60+
Description: "Include archived versions in the result list.",
61+
Flag: "include-archived",
62+
Value: &includeArchived,
63+
},
64+
},
5265
Handler: func(inv *clibase.Invocation) error {
5366
organization, err := CurrentOrganization(inv, client)
5467
if err != nil {
@@ -59,7 +72,8 @@ func (r *RootCmd) templateVersionsList() *clibase.Cmd {
5972
return xerrors.Errorf("get template by name: %w", err)
6073
}
6174
req := codersdk.TemplateVersionsByTemplateRequest{
62-
TemplateID: template.ID,
75+
TemplateID: template.ID,
76+
IncludeArchived: includeArchived.Value(),
6377
}
6478

6579
versions, err := client.TemplateVersionsByTemplate(inv.Context(), req)
@@ -92,6 +106,7 @@ type templateVersionRow struct {
92106
CreatedBy string `json:"-" table:"created by"`
93107
Status string `json:"-" table:"status"`
94108
Active string `json:"-" table:"active"`
109+
Archived string `json:"-" table:"archived"`
95110
}
96111

97112
// templateVersionsToRows converts a list of template versions to a list of rows
@@ -104,13 +119,19 @@ func templateVersionsToRows(activeVersionID uuid.UUID, templateVersions ...coder
104119
activeStatus = cliui.Keyword("Active")
105120
}
106121

122+
archivedStatus := ""
123+
if templateVersion.Archived {
124+
archivedStatus = pretty.Sprint(cliui.DefaultStyles.Warn, "Archived")
125+
}
126+
107127
rows[i] = templateVersionRow{
108128
TemplateVersion: templateVersion,
109129
Name: templateVersion.Name,
110130
CreatedAt: templateVersion.CreatedAt,
111131
CreatedBy: templateVersion.CreatedBy.Username,
112132
Status: strings.Title(string(templateVersion.Job.Status)),
113133
Active: activeStatus,
134+
Archived: archivedStatus,
114135
}
115136
}
116137

coderd/database/querier.go

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

coderd/database/queries.sql.go

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

coderd/database/queries/templateversions.sql

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -204,10 +204,8 @@ FROM
204204
ORDER BY workspace_id, build_number DESC
205205
) AS used_versions
206206
WHERE
207-
-- TODO: This is an issue for "deleted workspaces", since a deleted workspace
208-
-- has a build with the transition "delete". This will prevent that template
209-
-- version from ever being archived. We need a method to archive deleted workspaces.
210-
-- used_versions.transition != 'delete',
207+
used_versions.transition != 'delete'
208+
AND
211209
scoped_template_versions.id = used_versions.template_version_id
212210
)
213211
-- Also never archive the active template version

coderd/templateversions.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1148,7 +1148,7 @@ func (api *API) setArchiveTemplateVersion(archive bool) func(rw http.ResponseWri
11481148
err = archiveError
11491149
} else {
11501150
if len(archived) == 0 {
1151-
err = sql.ErrNoRows
1151+
err = xerrors.New("Unable to archive specified version, the version is likely in use by a workspace or currently set to the active version")
11521152
}
11531153
}
11541154
} else {

0 commit comments

Comments
 (0)