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 nil

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Inspect the Resource ID in the source state; it must be the numeric DO droplet ID
  2. Re-fetch state from the cluster spec rather than hand-edited manifests
  3. Report/fix the code path that set a non-numeric ID
  4. 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

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


AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05). Data as JSON: /api/errors/e46c0af627506e76. Report an issue: GitHub.