kubernetes/kops · error
error deleting Akamai (Linode) subnet %s(%s): %w
Error message
error deleting Akamai (Linode) subnet %s(%s): %w
What it means
deleteSubnet removes a subnet from a Linode VPC via DeleteVPCSubnet. Failures other than not-found are wrapped with the subnet name and ID. Not-found is treated as success, so this signals a genuine API failure deleting the subnet.
Source
Thrown at pkg/resources/linode/resources.go:323
return fmt.Errorf("error deleting Akamai (Linode) VPC %s(%s): %w", tracker.Name, tracker.ID, err)
}
return nil
}
// deleteSubnet deletes an Akamai (Linode) VPC subnet.
func deleteSubnet(vpcID int, cloud fi.Cloud, tracker *resources.Resource) error {
c := cloud.(cloudlinode.LinodeCloud)
subnetID, err := parseTrackerIntID(tracker)
if err != nil {
return err
}
if err := c.Client().DeleteVPCSubnet(context.Background(), vpcID, subnetID); err != nil {
if linodego.IsNotFound(err) {
return nil
}
return fmt.Errorf("error deleting Akamai (Linode) subnet %s(%s): %w", tracker.Name, tracker.ID, err)
}
return nil
}
// deleteInstance deletes an Akamai (Linode) instance.
func deleteInstance(cloud fi.Cloud, tracker *resources.Resource) error {
c := cloud.(cloudlinode.LinodeCloud)
instanceID, err := parseTrackerIntID(tracker)
if err != nil {
return err
}
if err := c.Client().DeleteInstance(context.Background(), instanceID); err != nil {
if linodego.IsNotFound(err) {
return nil
}
return fmt.Errorf("error deleting Akamai (Linode) instance %s(%s): %w", tracker.Name, tracker.ID, err)View on GitHub (pinned to 4c8573c808)
Solutions
- Detach/delete all instances using the subnet before deleting it
- Retry 'kops delete cluster' — deletion is idempotent
- Use a token with write scopes
- Verify vpcID/subnetID still exist in Linode Cloud Manager
- Check the wrapped Linode API error for the status code
Defensive patterns
Strategy: retry
Validate before calling
// Confirm subnet exists and has no attached Linodes before deletion
subnets, _ := c.Client().ListVPCSubnets(ctx, vpcID, nil)
for _, s := range subnets { if s.ID == subnetID { /* exists */ } } Type guard
func isSubnetInUse(err error) bool { c := linodego.ErrCode(err); return c == 400 || c == 409 } Try / catch
if err := c.Client().DeleteVPCSubnet(ctx, vpcID, subnetID); err != nil {
if linodego.IsNotFound(err) { return nil }
if isSubnetInUse(err) { /* delete attached instances first */ }
return fmt.Errorf("error deleting Akamai (Linode) subnet %s(%s): %w", tracker.Name, tracker.ID, err)
} Prevention
- Delete all instances using the subnet before the subnet itself
- Rely on kops' dependency-ordered cleanup
- Retry after partial failures
- Verify IDs against Cloud Manager when errors persist
When it happens
Trigger: c.Client().DeleteVPCSubnet(ctx, vpcID, subnetID) fails: token lacks write scopes, subnet still in use by compute instances, invalid vpcID/subnetID, network error, or rate limit.
Common situations: Subnets with attached Linodes cannot be deleted; interrupted previous delete left partial state; read-only token; concurrent operators modifying the VPC.
Related errors
- error listing Akamai (Linode) VPC subnets for VPC %s(%d): %w
- error deleting Akamai (Linode) VPC %s(%s): %w
- Subnet.VPC is required
- Subnet.VPC.ID is required
- error listing Akamai (Linode) VPC Subnets: %w
AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05).
Data as JSON: /api/errors/748c1545d481029e.
Report an issue: GitHub.