kubernetes/kops · error

deleting route table: %w

Error message

deleting route table: %w

What it means

Wrapped error from BeginDelete when initiating deletion of an Azure route table. The DELETE request to ARM was rejected before polling started. Used by kOps when tearing down or replacing cluster route tables.

Source

Thrown at upup/pkg/fi/cloudup/azure/routetable.go:78

	pager := c.c.NewListPager(resourceGroupName, nil)
	for pager.More() {
		resp, err := pager.NextPage(ctx)
		if err != nil {
			var respErr *azcore.ResponseError
			if errors.As(err, &respErr) && respErr.ErrorCode == "ResourceGroupNotFound" {
				return nil, nil
			}
			return nil, fmt.Errorf("listing route tables: %w", err)
		}
		l = append(l, resp.Value...)
	}
	return l, nil
}

func (c *routeTablesClientImpl) Delete(ctx context.Context, resourceGroupName, vnetName string) error {
	future, err := c.c.BeginDelete(ctx, resourceGroupName, vnetName, nil)
	if err != nil {
		return fmt.Errorf("deleting route table: %w", err)
	}
	if _, err := future.PollUntilDone(ctx, nil); err != nil {
		return fmt.Errorf("waiting for route table deletion completion: %w", err)
	}
	return nil
}

func newRouteTablesClientImpl(subscriptionID string, cred *azidentity.DefaultAzureCredential) (*routeTablesClientImpl, error) {
	c, err := network.NewRouteTablesClient(subscriptionID, cred, nil)
	if err != nil {
		return nil, fmt.Errorf("creating route tables client: %w", err)
	}
	return &routeTablesClientImpl{
		c: c,
	}, nil
}

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Check the wrapped error's HTTP status: 403 implies grant Microsoft.Network/routeTables/delete
  2. Confirm the route table name/resource group are correct; if already gone, treat as success
  3. Disassociate subnets or remove locks if the deletion is blocked by dependencies
  4. Retry on transient 429/5xx
Defensive patterns

Strategy: type-guard

Validate before calling

if _, err := rtClient.Get(ctx, resourceGroupName, name, nil); err != nil {
	var respErr *azcore.ResponseError
	if errors.As(err, &respErr) && respErr.ErrorCode == "NotFound" {
		return nil // nothing to delete
	}
}

Type guard

func isNotFound(err error) bool {
	var respErr *azcore.ResponseError
	return errors.As(err, &respErr) && respErr.StatusCode == http.StatusNotFound
}

Try / catch

err := client.Delete(ctx, rg, name)
if isNotFound(err) {
	return nil // already deleted
}

Prevention

When it happens

Trigger: c.c.BeginDelete(ctx, resourceGroupName, vnetName, nil) errors immediately: route table not found in some SDK states it surfaces here, 403 missing Microsoft.Network/routeTables/delete permission, or invalid resource group.

Common situations: Identity lacks delete permissions; route table already deleted (name mismatch); resource group misconfigured; dependency locks (NIC/subnet association) preventing deletion.

Related errors


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