kubernetes/kops · error
waiting for route table create/update completion: %w
Error message
waiting for route table create/update completion: %w
What it means
Wrapped error from future.PollUntilDone after BeginCreateOrUpdate succeeded, meaning the route table create/update operation started but failed or the polling was interrupted (including context cancellation). The resource was not confirmed created/updated.
Source
Thrown at upup/pkg/fi/cloudup/azure/routetable.go:49
CreateOrUpdate(ctx context.Context, resourceGroupName, routeTableName string, parameters network.RouteTable) (*network.RouteTable, error)
List(ctx context.Context, resourceGroupName string) ([]*network.RouteTable, error)
Delete(ctx context.Context, resourceGroupName, vnetName string) error
}
type routeTablesClientImpl struct {
c *network.RouteTablesClient
}
var _ RouteTablesClient = (*routeTablesClientImpl)(nil)
func (c *routeTablesClientImpl) CreateOrUpdate(ctx context.Context, resourceGroupName, routeTableName string, parameters network.RouteTable) (*network.RouteTable, error) {
future, err := c.c.BeginCreateOrUpdate(ctx, resourceGroupName, routeTableName, parameters, nil)
if err != nil {
return nil, fmt.Errorf("creating/updating route table: %w", err)
}
rt, err := future.PollUntilDone(ctx, nil)
if err != nil {
return nil, fmt.Errorf("waiting for route table create/update completion: %w", err)
}
return &rt.RouteTable, err
}
func (c *routeTablesClientImpl) List(ctx context.Context, resourceGroupName string) ([]*network.RouteTable, error) {
if resourceGroupName == "" {
return nil, nil
}
var l []*network.RouteTable
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
}View on GitHub (pinned to 4c8573c808)
Solutions
- Check the wrapped error for the ARM operation failure detail
- Increase the context timeout for the reconcile operation
- Avoid concurrent writers to the same route table (e.g., two kOps runs)
- Verify the route table state in the Azure portal after the failure and re-run reconciliation
Example fix
// before ctx := context.Background() // after ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute) defer cancel()
Defensive patterns
Strategy: retry
Validate before calling
ctx, cancel := context.WithTimeout(ctx, 5*time.Minute) defer cancel()
Type guard
var respErr *azcore.ResponseError
if errors.As(err, &respErr) {
// inspect respErr.ErrorCode / StatusCode for conflict vs transient
} Try / catch
rt, err := client.CreateOrUpdate(ctx, rg, name, params)
if errors.Is(err, context.DeadlineExceeded) {
// re-poll or verify current state before retrying the PUT
} Prevention
- Use generous context timeouts for long-running ARM operations
- Avoid overlapping kOps runs on the same cluster
- Check operation state in Azure before blindly retrying
When it happens
Trigger: PollUntilDone(ctx, nil) returns error when the long-running PUT ultimately fails (e.g., conflict, quota, provisioning error), or ctx is cancelled/times out while polling.
Common situations: Slow Azure control plane exceeding the caller's context deadline; concurrent modification conflicts; region outage causing provisioning failure.
Related errors
- waiting for route table deletion completion: %w
- creating/updating route table: %w
- listing route tables: %w
- deleting route table: %w
- waiting for virtual network create/update completion: %w
AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05).
Data as JSON: /api/errors/1dfd556affff1b2c.
Report an issue: GitHub.