kubernetes/kops · error
failed to convert droplet ID to int: %s
Error message
failed to convert droplet ID to int: %s
What it means
deleteDroplet parses the resource tracker's t.ID string as an integer droplet ID via strconv.Atoi; failure is wrapped here. DO droplet IDs are numeric, so a non-numeric ID means the tracker was built with wrong data.
Source
Thrown at pkg/resources/digitalocean/resources.go:258
var blocks []string
for _, dropletID := range lb.DropletIDs {
blocks = append(blocks, "droplet:"+strconv.Itoa(dropletID))
}
resourceTracker.Blocks = blocks
resourceTrackers = append(resourceTrackers, resourceTracker)
}
}
return resourceTrackers, nil
}
func deleteDroplet(cloud fi.Cloud, t *resources.Resource) error {
c := cloud.(do.DOCloud)
dropletID, err := strconv.Atoi(t.ID)
if err != nil {
return fmt.Errorf("failed to convert droplet ID to int: %s", err)
}
_, err = c.DropletsService().Delete(context.TODO(), dropletID)
if err != nil {
return fmt.Errorf("failed to delete droplet: %d, err: %s", dropletID, err)
}
return nil
}
func deleteVPC(cloud fi.Cloud, t *resources.Resource) error {
c := cloud.(do.DOCloud)
_, err := c.VPCsService().Delete(context.TODO(), t.ID)
if err != nil {
return fmt.Errorf("failed to delete VPC %s (ID %s): %s", t.Name, t.ID, err)
}
return nilView on GitHub (pinned to 4c8573c808)
Solutions
- Inspect the Resource ID in the source state; it must be the numeric DO droplet ID
- Re-fetch state from the cluster spec rather than hand-edited manifests
- Report/fix the code path that set a non-numeric ID
- Delete the droplet manually via doctl compute droplet delete <id> if kOps state is unrecoverable
Example fix
// before t.ID = "web-1" // slug, not numeric // after t.ID = "31644451" // numeric DO droplet ID
Defensive patterns
Strategy: validation
Validate before calling
if n, err := strconv.Atoi(t.ID); err != nil || n <= 0 {
return fmt.Errorf("droplet ID %q is not a valid numeric DO droplet ID", t.ID)
} Type guard
func isNumericID(id string) bool {
_, err := strconv.Atoi(id)
return err == nil
} Try / catch
dropletID, err := strconv.Atoi(t.ID)
if err != nil {
return fmt.Errorf("failed to convert droplet ID to int: %w", err)
} Prevention
- Never hand-edit kops state files that hold resource IDs
- Store raw numeric DO IDs in resource trackers, not names/slugs
- Validate state after import/migration
When it happens
Trigger: t.ID is not a valid base-10 integer, e.g. empty string, a resource whose ID field was populated with a name/slug instead of a DO numeric ID.
Common situations: Corrupted or hand-edited cluster state/manifest; a bug populating Resource.ID for droplets; running kops against state referencing non-DO resources.
Related errors
- failed to convert provider ID number %q: %s
- failed to convert ssh key ID %q to int: %s
- DIGITALOCEAN_ACCESS_TOKEN is required
- DIGITALOCEAN_ACCESS_TOKEN is required
- deleting droplets is not supported yet
AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05).
Data as JSON: /api/errors/e46c0af627506e76.
Report an issue: GitHub.