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

  1. Detach/delete all instances using the subnet before deleting it
  2. Retry 'kops delete cluster' — deletion is idempotent
  3. Use a token with write scopes
  4. Verify vpcID/subnetID still exist in Linode Cloud Manager
  5. 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

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


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