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
- Check the wrapped error's HTTP status: 403 implies grant Microsoft.Network/routeTables/delete
- Confirm the route table name/resource group are correct; if already gone, treat as success
- Disassociate subnets or remove locks if the deletion is blocked by dependencies
- 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
- Treat NotFound on delete as success (idempotent teardown)
- Grant Microsoft.Network/routeTables/delete to the identity
- Remove subnet associations and locks before deleting
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
- creating/updating route table: %w
- waiting for route table create/update completion: %w
- listing route tables: %w
- waiting for route table deletion completion: %w
- deleting virtual network: %w
AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05).
Data as JSON: /api/errors/0b4921baaf3a55ba.
Report an issue: GitHub.