{"record":{"id":"5b7adddd42e24d48","repo":"k3s-io/k3s","slug":"missing-argument-token-delete-is-missing-token","errorCode":null,"errorMessage":"missing argument; 'token delete' is missing token","messagePattern":"missing argument; 'token delete' is missing token","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/cli/token/token.go","lineNumber":105,"sourceCode":"\tif err != nil {\n\t\treturn err\n\t}\n\n\tfmt.Println(token)\n\treturn nil\n}\n\nfunc Delete(app *cli.Context) error {\n\tif err := cmds.InitLogging(); err != nil {\n\t\treturn err\n\t}\n\treturn deleteToken(app, &cmds.TokenConfig)\n}\n\nfunc deleteToken(app *cli.Context, cfg *cmds.Token) error {\n\targs := app.Args()\n\tif args.Len() < 1 {\n\t\treturn errors.New(\"missing argument; 'token delete' is missing token\")\n\t}\n\n\tcfg.Kubeconfig = util.GetKubeConfigPath(cfg.Kubeconfig)\n\tclient, err := util.GetClientSet(cfg.Kubeconfig)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tfor _, token := range args.Slice() {\n\t\tif !bootstraputil.IsValidBootstrapTokenID(token) {\n\t\t\tbts, err := kubeadm.NewBootstrapTokenString(token)\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"given token didn't match pattern %q or %q\", bootstrapapi.BootstrapTokenIDPattern, bootstrapapi.BootstrapTokenPattern)\n\t\t\t}\n\t\t\ttoken = bts.ID\n\t\t}\n\t\tsecretName := bootstraputil.BootstrapTokenSecretName(token)\n\t\tif err := client.CoreV1().Secrets(metav1.NamespaceSystem).Delete(app.Context, secretName, metav1.DeleteOptions{}); err != nil {","sourceCodeStart":87,"sourceCodeEnd":123,"githubUrl":"https://github.com/k3s-io/k3s/blob/6ba341e396edc16b8dcae978a7c5e3ac7ee5606e/pkg/cli/token/token.go#L87-L123","documentation":"`k3s token delete` requires at least one bootstrap token (full token or token ID) as a positional argument. The check runs before any kubeconfig or API work, so the command never reaches the cluster with zero args.","triggerScenarios":"Running `k3s token delete` with no arguments; wrapping scripts that pass an unset variable (e.g. `k3s token delete \"$TOKEN_ID\"` where TOKEN_ID is empty and unquoted expansion drops the arg).","commonSituations":"Shell scripts deleting expired tokens where the variable is empty; CI jobs parameterized by token ID that received no value.","solutions":["List then delete: `k3s token list` followed by `k3s token delete <token-id>` (e.g. `k3s token delete abcdef.0123456789abcdef`)","Quote and default-check variables in scripts: `[ -n \"$TOKEN_ID\" ] || exit 1` before invoking","Use `k3s token delete --help` to confirm the expected positional format"],"exampleFix":"# before\nk3s token delete\n\n# after\nk3s token delete abcdef.0123456789abcdef","handlingStrategy":"validation","validationCode":"#!/bin/sh\n# wrap token deletion\n[ \"$#\" -ge 1 ] || { echo \"usage: $0 <token-id>...\"; exit 1; }\nexec k3s token delete \"$@\"","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Check positional args in wrapper scripts before exec'ing k3s","Use `k3s token list` output piped (never hand-typed) into delete","Set `set -u` in shell wrappers so unset vars fail loudly"],"tags":["cli","token","usage"],"backgroundTag":null,"analyzedSha":"6ba341e396edc16b8dcae978a7c5e3ac7ee5606e","analyzedAt":"2026-08-15T16:27:54.286Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}