Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 5ec385b

Browse files
feat(cli): support deleting tokens by id (coder#16341)
Since API keys can be created without a name, and we already perform the deletion by ID, it makes sense to be able to delete tokens with *just* the ID.
1 parent 25d256e commit 5ec385b

File tree

4 files changed

+45
-5
lines changed

4 files changed

+45
-5
lines changed

cli/testdata/coder_tokens_remove_--help.golden

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
coder v0.0.0-devel
22

33
USAGE:
4-
coder tokens remove <name>
4+
coder tokens remove <name|id|token>
55

66
Delete a token
77

cli/tokens.go

+8-2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package cli
33
import (
44
"fmt"
55
"os"
6+
"strings"
67
"time"
78

89
"golang.org/x/exp/slices"
@@ -223,7 +224,7 @@ func (r *RootCmd) listTokens() *serpent.Command {
223224
func (r *RootCmd) removeToken() *serpent.Command {
224225
client := new(codersdk.Client)
225226
cmd := &serpent.Command{
226-
Use: "remove <name>",
227+
Use: "remove <name|id|token>",
227228
Aliases: []string{"delete"},
228229
Short: "Delete a token",
229230
Middleware: serpent.Chain(
@@ -233,7 +234,12 @@ func (r *RootCmd) removeToken() *serpent.Command {
233234
Handler: func(inv *serpent.Invocation) error {
234235
token, err := client.APIKeyByName(inv.Context(), codersdk.Me, inv.Args[0])
235236
if err != nil {
236-
return xerrors.Errorf("fetch api key by name %s: %w", inv.Args[0], err)
237+
// If it's a token, we need to extract the ID
238+
maybeID := strings.Split(inv.Args[0], "-")[0]
239+
token, err = client.APIKeyByID(inv.Context(), codersdk.Me, maybeID)
240+
if err != nil {
241+
return xerrors.Errorf("fetch api key by name or id: %w", err)
242+
}
237243
}
238244

239245
err = client.DeleteAPIKey(inv.Context(), codersdk.Me, token.ID)

cli/tokens_test.go

+35-1
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ func TestTokens(t *testing.T) {
9393
require.Contains(t, res, secondTokenID)
9494

9595
// Test creating a token for third user from second user's (non-admin) session
96-
inv, root = clitest.New(t, "tokens", "create", "--name", "token-two", "--user", thirdUser.ID.String())
96+
inv, root = clitest.New(t, "tokens", "create", "--name", "failed-token", "--user", thirdUser.ID.String())
9797
clitest.SetupConfig(t, secondUserClient, root)
9898
buf = new(bytes.Buffer)
9999
inv.Stdout = buf
@@ -113,6 +113,7 @@ func TestTokens(t *testing.T) {
113113
require.Len(t, tokens, 1)
114114
require.Equal(t, id, tokens[0].ID)
115115

116+
// Delete by name
116117
inv, root = clitest.New(t, "tokens", "rm", "token-one")
117118
clitest.SetupConfig(t, client, root)
118119
buf = new(bytes.Buffer)
@@ -122,4 +123,37 @@ func TestTokens(t *testing.T) {
122123
res = buf.String()
123124
require.NotEmpty(t, res)
124125
require.Contains(t, res, "deleted")
126+
127+
// Delete by ID
128+
inv, root = clitest.New(t, "tokens", "rm", secondTokenID)
129+
clitest.SetupConfig(t, client, root)
130+
buf = new(bytes.Buffer)
131+
inv.Stdout = buf
132+
err = inv.WithContext(ctx).Run()
133+
require.NoError(t, err)
134+
res = buf.String()
135+
require.NotEmpty(t, res)
136+
require.Contains(t, res, "deleted")
137+
138+
// Create third token
139+
inv, root = clitest.New(t, "tokens", "create", "--name", "token-three")
140+
clitest.SetupConfig(t, client, root)
141+
buf = new(bytes.Buffer)
142+
inv.Stdout = buf
143+
err = inv.WithContext(ctx).Run()
144+
require.NoError(t, err)
145+
res = buf.String()
146+
require.NotEmpty(t, res)
147+
fourthToken := res
148+
149+
// Delete by token
150+
inv, root = clitest.New(t, "tokens", "rm", fourthToken)
151+
clitest.SetupConfig(t, client, root)
152+
buf = new(bytes.Buffer)
153+
inv.Stdout = buf
154+
err = inv.WithContext(ctx).Run()
155+
require.NoError(t, err)
156+
res = buf.String()
157+
require.NotEmpty(t, res)
158+
require.Contains(t, res, "deleted")
125159
}

docs/reference/cli/tokens_remove.md

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)