{"record":{"id":"97d88bb7893861df","repo":"kubernetes/kops","slug":"error-deleting-akamai-linode-ssh-key-s-s-w","errorCode":null,"errorMessage":"error deleting Akamai (Linode) SSH key %s(%s): %w","messagePattern":"error deleting Akamai \\(Linode\\) SSH key (.+?)\\((.+?)\\): %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/resources/linode/resources.go","lineNumber":287,"sourceCode":"\t\t}\n\t}\n\n\treturn resourceTrackers, nil\n}\n\n// deleteSSHKey deletes an Akamai (Linode) SSH key.\nfunc deleteSSHKey(cloud fi.Cloud, tracker *resources.Resource) error {\n\tc := cloud.(cloudlinode.LinodeCloud)\n\tkeyID, err := parseTrackerIntID(tracker)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif err := c.Client().DeleteSSHKey(context.Background(), keyID); err != nil {\n\t\tif linodego.IsNotFound(err) {\n\t\t\treturn nil\n\t\t}\n\t\treturn fmt.Errorf(\"error deleting Akamai (Linode) SSH key %s(%s): %w\", tracker.Name, tracker.ID, err)\n\t}\n\n\treturn nil\n}\n\n// deleteVPC deletes an Akamai (Linode) VPC.\nfunc deleteVPC(cloud fi.Cloud, tracker *resources.Resource) error {\n\tc := cloud.(cloudlinode.LinodeCloud)\n\tvpcID, err := parseTrackerIntID(tracker)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif err := c.Client().DeleteVPC(context.Background(), vpcID); err != nil {\n\t\tif linodego.IsNotFound(err) {\n\t\t\treturn nil\n\t\t}\n\t\treturn fmt.Errorf(\"error deleting Akamai (Linode) VPC %s(%s): %w\", tracker.Name, tracker.ID, err)","sourceCodeStart":269,"sourceCodeEnd":305,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/pkg/resources/linode/resources.go#L269-L305","documentation":"deleteSSHKey removes a cluster-generated SSH key from the Linode account. Non-'not found' failures from DeleteSSHKey are wrapped with the key name and ID. linodego.IsNotFound is treated as success (already deleted), so this error means a real API failure while deleting.","triggerScenarios":"c.Client().DeleteSSHKey(ctx, keyID) fails with 401/403 (insufficient token scopes — write access required), network error, 429 rate limit, or the key ID becoming invalid between listing and deletion.","commonSituations":"Read-only API token used for cluster deletion; corporate proxy blocking DELETE requests; rate limiting when deleting a large cluster with many resources; concurrent deletion by another operator.","solutions":["Use an API token with full read/write scopes for kops delete","Retry the delete; it is idempotent because not-found is tolerated","Check rate limits and back off before retrying","Confirm the key ID exists under account > SSH keys in Linode Cloud Manager","Inspect the wrapped Linode API error status"],"exampleFix":"// before\nif err := c.Client().DeleteSSHKey(context.Background(), keyID); err != nil {\n\tif linodego.IsNotFound(err) {\n\t\treturn nil\n\t}\n\treturn fmt.Errorf(\"error deleting Akamai (Linode) SSH key %s(%s): %w\", tracker.Name, tracker.ID, err)\n}\n// after\nif err := c.Client().DeleteSSHKey(context.Background(), keyID); err != nil {\n\tif linodego.IsNotFound(err) {\n\t\treturn nil\n\t}\n\tif linodego.ErrCode(err) == 429 {\n\t\t// retry after backoff\n\t}\n\treturn fmt.Errorf(\"error deleting Akamai (Linode) SSH key %s(%s): %w\", tracker.Name, tracker.ID, err)\n}","handlingStrategy":"retry","validationCode":"// Ensure token has write scopes before delete operations\ncurl -sS -H \"Authorization: Bearer $LINODE_TOKEN\" https://api.linode.com/v4/profile/grants | jq .global","typeGuard":"func isNotFound(err error) bool { return linodego.IsNotFound(err) }","tryCatchPattern":"if err := c.Client().DeleteSSHKey(ctx, keyID); err != nil {\n\tif linodego.IsNotFound(err) { return nil }\n\tif linodego.ErrCode(err) == 429 { /* backoff and retry */ }\n\treturn fmt.Errorf(\"error deleting Akamai (Linode) SSH key %s(%s): %w\", tracker.Name, tracker.ID, err)\n}","preventionTips":["Use full read/write tokens for kops delete","Treat 404 as success (kops already does)","Back off on rate limits","Don't share tokens with reduced scopes for cleanup jobs"],"tags":["linode","akamai","ssh-keys","delete","api-error"],"backgroundTag":"linode-api-request-failed","analyzedSha":"4c8573c808a73d578c5eadc86d410646ea0b0d73","analyzedAt":"2026-09-05T04:13:19.212Z","contentChangedAt":"2026-09-05T04:13:19.212Z","schemaVersion":2},"datasetVersion":"2026-09-12T07:17:12.445Z"}