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

  1. Check the wrapped error for the ARM operation failure detail
  2. Increase the context timeout for the reconcile operation
  3. Avoid concurrent writers to the same route table (e.g., two kOps runs)
  4. 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

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


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