feat(cli): support deleting tokens by id (#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.
This commit is contained in:
Ethan
2025-02-12 18:18:17 +11:00
committed by GitHub
parent 25d256e7e0
commit 5ec385b36b
4 changed files with 45 additions and 5 deletions
+1 -1
View File
@@ -1,7 +1,7 @@
coder v0.0.0-devel
USAGE:
coder tokens remove <name>
coder tokens remove <name|id|token>
Delete a token
+8 -2
View File
@@ -3,6 +3,7 @@ package cli
import (
"fmt"
"os"
"strings"
"time"
"golang.org/x/exp/slices"
@@ -223,7 +224,7 @@ func (r *RootCmd) listTokens() *serpent.Command {
func (r *RootCmd) removeToken() *serpent.Command {
client := new(codersdk.Client)
cmd := &serpent.Command{
Use: "remove <name>",
Use: "remove <name|id|token>",
Aliases: []string{"delete"},
Short: "Delete a token",
Middleware: serpent.Chain(
@@ -233,7 +234,12 @@ func (r *RootCmd) removeToken() *serpent.Command {
Handler: func(inv *serpent.Invocation) error {
token, err := client.APIKeyByName(inv.Context(), codersdk.Me, inv.Args[0])
if err != nil {
return xerrors.Errorf("fetch api key by name %s: %w", inv.Args[0], err)
// If it's a token, we need to extract the ID
maybeID := strings.Split(inv.Args[0], "-")[0]
token, err = client.APIKeyByID(inv.Context(), codersdk.Me, maybeID)
if err != nil {
return xerrors.Errorf("fetch api key by name or id: %w", err)
}
}
err = client.DeleteAPIKey(inv.Context(), codersdk.Me, token.ID)
+35 -1
View File
@@ -93,7 +93,7 @@ func TestTokens(t *testing.T) {
require.Contains(t, res, secondTokenID)
// Test creating a token for third user from second user's (non-admin) session
inv, root = clitest.New(t, "tokens", "create", "--name", "token-two", "--user", thirdUser.ID.String())
inv, root = clitest.New(t, "tokens", "create", "--name", "failed-token", "--user", thirdUser.ID.String())
clitest.SetupConfig(t, secondUserClient, root)
buf = new(bytes.Buffer)
inv.Stdout = buf
@@ -113,6 +113,7 @@ func TestTokens(t *testing.T) {
require.Len(t, tokens, 1)
require.Equal(t, id, tokens[0].ID)
// Delete by name
inv, root = clitest.New(t, "tokens", "rm", "token-one")
clitest.SetupConfig(t, client, root)
buf = new(bytes.Buffer)
@@ -122,4 +123,37 @@ func TestTokens(t *testing.T) {
res = buf.String()
require.NotEmpty(t, res)
require.Contains(t, res, "deleted")
// Delete by ID
inv, root = clitest.New(t, "tokens", "rm", secondTokenID)
clitest.SetupConfig(t, client, root)
buf = new(bytes.Buffer)
inv.Stdout = buf
err = inv.WithContext(ctx).Run()
require.NoError(t, err)
res = buf.String()
require.NotEmpty(t, res)
require.Contains(t, res, "deleted")
// Create third token
inv, root = clitest.New(t, "tokens", "create", "--name", "token-three")
clitest.SetupConfig(t, client, root)
buf = new(bytes.Buffer)
inv.Stdout = buf
err = inv.WithContext(ctx).Run()
require.NoError(t, err)
res = buf.String()
require.NotEmpty(t, res)
fourthToken := res
// Delete by token
inv, root = clitest.New(t, "tokens", "rm", fourthToken)
clitest.SetupConfig(t, client, root)
buf = new(bytes.Buffer)
inv.Stdout = buf
err = inv.WithContext(ctx).Run()
require.NoError(t, err)
res = buf.String()
require.NotEmpty(t, res)
require.Contains(t, res, "deleted")
}
+1 -1
View File
@@ -11,5 +11,5 @@ Aliases:
## Usage
```console
coder tokens remove <name>
coder tokens remove <name|id|token>
```