{"record":{"id":"efeb3e510f5c57cb","repo":"kubernetes/kops","slug":"error-deleting-akamai-linode-volume-s-s-w","errorCode":null,"errorMessage":"error deleting Akamai (Linode) volume %s(%s): %w","messagePattern":"error deleting Akamai \\(Linode\\) volume (.+?)\\((.+?)\\): %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/resources/linode/resources.go","lineNumber":359,"sourceCode":"\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)\n\t}\n\n\treturn nil\n}\n","sourceCodeStart":341,"sourceCodeEnd":364,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/pkg/resources/linode/resources.go#L341-L364","documentation":"deleteVolume deletes a Linode block storage volume. Failures other than not-found (treated as success) are wrapped with the volume name and ID. It means the Linode API refused or failed the volume deletion.","triggerScenarios":"c.Client().DeleteVolume(ctx, volumeID) fails: volume still attached to a running Linode, token lacks write scopes, network error, or rate limit.","commonSituations":"PV-backed volumes still attached to nodes at delete time; read-only API token; rate limiting during large cluster teardown; region-wide storage API issues.","solutions":["Ensure the volume is detached (instances deleted/unmounted) before deleting","Retry the delete — it is idempotent","Use an API token with write access","Check the wrapped error status for 'volume is attached' style messages","Delete the volume manually from Linode Cloud Manager as a last resort, then re-run kops delete"],"exampleFix":null,"handlingStrategy":"retry","validationCode":"vol, err := c.Client().GetVolume(ctx, volumeID)\n// if err == nil && vol.LinodeID != nil -> volume attached; detach before delete","typeGuard":"func isVolumeAttached(vol *linodego.Volume) bool { return vol != nil && vol.LinodeID != nil }","tryCatchPattern":"if err := c.Client().DeleteVolume(ctx, volumeID); err != nil {\n\tif linodego.IsNotFound(err) { return nil }\n\tif isAttachedMsg(err) { /* detach volume, then retry */ }\n\treturn fmt.Errorf(\"error deleting Akamai (Linode) volume %s(%s): %w\", tracker.Name, tracker.ID, err)\n}","preventionTips":["Ensure instances holding PVs are deleted or volumes detached first","Check volume attachment state before deletion","Use write-scoped API tokens","Retry kops delete after transient storage API errors"],"tags":["linode","akamai","volume","block-storage","delete"],"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"}