Skip to content

Commit f848adb

Browse files
Add command to force delete a Runner resource class
1 parent e15f916 commit f848adb

File tree

6 files changed

+41
-10
lines changed

6 files changed

+41
-10
lines changed

api/runner/runner.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,13 @@ func (r *Runner) GetResourceClassesByNamespace(namespace string) ([]ResourceClas
8282
return resp.Items, err
8383
}
8484

85-
func (r *Runner) DeleteResourceClass(id string) error {
86-
req, err := r.rc.NewRequest("DELETE", &url.URL{Path: "runner/resource/" + url.PathEscape(id)}, nil)
85+
func (r *Runner) DeleteResourceClass(id string, force bool) error {
86+
path := "runner/resource/" + url.PathEscape(id)
87+
if force {
88+
path = fmt.Sprintf("runner/resource/%s/force", url.PathEscape(id))
89+
}
90+
91+
req, err := r.rc.NewRequest("DELETE", &url.URL{Path: path}, nil)
8792
if err != nil {
8893
return err
8994
}

api/runner/runner_test.go

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ func TestRunner_DeleteResourceClass(t *testing.T) {
150150
defer cleanup()
151151

152152
t.Run("Check resource-class is deleted", func(t *testing.T) {
153-
err := runner.DeleteResourceClass("51628548-4627-4813-9f9b-8cc9637ac879")
153+
err := runner.DeleteResourceClass("51628548-4627-4813-9f9b-8cc9637ac879", false)
154154
assert.NilError(t, err)
155155
})
156156

@@ -167,13 +167,32 @@ func TestRunner_DeleteResourceClass(t *testing.T) {
167167
})
168168
}
169169

170+
func TestRunner_DeleteResourceClass_Force(t *testing.T) {
171+
fix := fixture{}
172+
runner, cleanup := fix.Run(http.StatusOK, ``)
173+
defer cleanup()
174+
175+
err := runner.DeleteResourceClass("5a1ef22d-444b-45db-8e98-21d7c42fb80b", true)
176+
assert.NilError(t, err)
177+
178+
assert.Check(t, cmp.Equal(fix.URL(), url.URL{Path: "/api/v2/runner/resource/5a1ef22d-444b-45db-8e98-21d7c42fb80b/force"}))
179+
assert.Check(t, cmp.Equal(fix.method, "DELETE"))
180+
assert.Check(t, cmp.DeepEqual(fix.Header(), http.Header{
181+
"Accept-Encoding": {"gzip"},
182+
"Accept-Type": {"application/json"},
183+
"Circle-Token": {"fake-token"},
184+
"User-Agent": {version.UserAgent()},
185+
}))
186+
assert.Check(t, cmp.Equal(fix.Body(), ``))
187+
}
188+
170189
func TestRunner_DeleteResourceClass_PathEscaping(t *testing.T) {
171190
fix := fixture{}
172191
runner, cleanup := fix.Run(http.StatusOK, ``)
173192
defer cleanup()
174193

175194
t.Run("Check resource-class is deleted", func(t *testing.T) {
176-
err := runner.DeleteResourceClass("escape~,/;?~noescape~$&+:=@")
195+
err := runner.DeleteResourceClass("escape~,/;?~noescape~$&+:=@", false)
177196
assert.NilError(t, err)
178197
})
179198

cmd/runner/resource_class.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@ func newResourceClassCommand(o *runnerOpts, preRunE validator) *cobra.Command {
4747
"Generate a default token")
4848
cmd.AddCommand(createCmd)
4949

50-
cmd.AddCommand(&cobra.Command{
50+
forceDelete := false
51+
deleteCmd := &cobra.Command{
5152
Use: "delete <resource-class>",
5253
Short: "Delete a resource-class",
5354
Aliases: []string{"rm"},
@@ -58,9 +59,12 @@ func newResourceClassCommand(o *runnerOpts, preRunE validator) *cobra.Command {
5859
if err != nil {
5960
return err
6061
}
61-
return o.r.DeleteResourceClass(rc.ID)
62+
return o.r.DeleteResourceClass(rc.ID, forceDelete)
6263
},
63-
})
64+
}
65+
deleteCmd.PersistentFlags().BoolVarP(&forceDelete, "force", "f", false,
66+
"Delete resource-class and any associated tokens")
67+
cmd.AddCommand(deleteCmd)
6468

6569
cmd.AddCommand(&cobra.Command{
6670
Use: "list <namespace>",

cmd/runner/resource_class_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ func (r *runnerMock) GetResourceClassesByNamespace(namespace string) ([]runner.R
120120
return rcs, nil
121121
}
122122

123-
func (r *runnerMock) DeleteResourceClass(id string) error {
123+
func (r *runnerMock) DeleteResourceClass(id string, force bool) error {
124124
for i, rc := range r.resourceClasses {
125125
if rc.ID == id {
126126
r.resourceClasses = append(r.resourceClasses[:i], r.resourceClasses[i+1:]...)

cmd/runner/runner.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ type running interface {
4242
GetResourceClassByName(resourceClass string) (rc *runner.ResourceClass, err error)
4343
GetNamespaceByResourceClass(resourceClass string) (ns string, err error)
4444
GetResourceClassesByNamespace(namespace string) ([]runner.ResourceClass, error)
45-
DeleteResourceClass(id string) error
45+
DeleteResourceClass(id string, force bool) error
4646
CreateToken(resourceClass, nickname string) (token *runner.Token, err error)
4747
GetRunnerTokensByResourceClass(resourceClass string) ([]runner.Token, error)
4848
DeleteToken(id string) error
Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
Usage:
2-
runner resource-class delete <resource-class>
2+
runner resource-class delete <resource-class> [flags]
33

44
Aliases:
55
delete, rm
6+
7+
Flags:
8+
-f, --force Delete resource-class and any associated tokens

0 commit comments

Comments
 (0)