{"record":{"id":"c2d9d086a692f324","repo":"kubernetes/kops","slug":"error-deleting-akamai-linode-instance-s-s-w","errorCode":null,"errorMessage":"error deleting Akamai (Linode) instance %s(%s): %w","messagePattern":"error deleting Akamai \\(Linode\\) instance (.+?)\\((.+?)\\): %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/resources/linode/resources.go","lineNumber":341,"sourceCode":"\t\treturn fmt.Errorf(\"error deleting Akamai (Linode) subnet %s(%s): %w\", tracker.Name, tracker.ID, err)\n\t}\n\n\treturn nil\n}\n\n// deleteInstance deletes an Akamai (Linode) instance.\nfunc deleteInstance(cloud fi.Cloud, tracker *resources.Resource) error {\n\tc := cloud.(cloudlinode.LinodeCloud)\n\tinstanceID, err := parseTrackerIntID(tracker)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif err := c.Client().DeleteInstance(context.Background(), instanceID); 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) instance %s(%s): %w\", tracker.Name, tracker.ID, err)\n\t}\n\n\treturn nil\n}\n\n// deleteVolume deletes an Akamai (Linode) block storage volume.\nfunc deleteVolume(cloud fi.Cloud, tracker *resources.Resource) error {\n\tc := cloud.(cloudlinode.LinodeCloud)\n\tvolumeID, err := parseTrackerIntID(tracker)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif err := c.Client().DeleteVolume(context.Background(), volumeID); 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) volume %s(%s): %w\", tracker.Name, tracker.ID, err)","sourceCodeStart":323,"sourceCodeEnd":359,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/pkg/resources/linode/resources.go#L323-L359","documentation":"deleteInstance deletes a Linode compute instance belonging to the cluster. Failures other than not-found (treated as success) are wrapped with the instance name and ID. This aborts cleanup of that instance.","triggerScenarios":"c.Client().DeleteInstance(ctx, instanceID) fails: token lacks write scopes, instance has protected resources (e.g., attached volumes with deletion protection), network error, or rate limit during bulk deletion.","commonSituations":"Shutting down an instance with attached block storage volumes first is required; read-only token during delete; API rate limiting when deleting many instances; instance already being deleted by another process (may surface as conflict).","solutions":["Retry 'kops delete cluster'; not-found instances are skipped","Detach and delete attached volumes before the instance","Use a full read/write API token","Check for Linode API 429s and back off","Manually delete the Linode from Cloud Manager if the API keeps refusing, then re-run kops delete"],"exampleFix":null,"handlingStrategy":"retry","validationCode":"inst, err := c.Client().GetInstance(ctx, instanceID)\n// if err is nil, detach volumes / confirm instance state before DeleteInstance","typeGuard":"func isNotFound(err error) bool { return linodego.IsNotFound(err) }","tryCatchPattern":"if err := c.Client().DeleteInstance(ctx, instanceID); 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) instance %s(%s): %w\", tracker.Name, tracker.ID, err)\n}","preventionTips":["Detach/delete block storage volumes before deleting instances","Use write-scoped tokens for deletion","Back off on 429s during bulk teardown","Re-run kops delete to converge; missing instances are tolerated"],"tags":["linode","akamai","instance","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-12T12:17:11.808Z"}