kubernetes/kops · error

waiting for route table deletion completion: %w

Error message

waiting for route table deletion completion: %w

What it means

Wrapped error from future.PollUntilDone while waiting for a route table DELETE to complete. The delete operation started but finished with failure or the polling context was cancelled before completion.

Source

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

		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. Read the wrapped error for the ARM delete failure reason
  2. Remove any resource locks or subnet associations blocking deletion
  3. Increase the polling context timeout
  4. Verify deletion state in the portal; re-run delete if it is stuck
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) {
	// Conflict/InUseErrorCode indicates association still present
}

Try / catch

err := client.Delete(ctx, rg, name)
if err != nil {
	var respErr *azcore.ResponseError
	if errors.As(err, &respErr) && (respErr.StatusCode == 429 || respErr.StatusCode >= 500) {
		return retryWithBackoff(ctx, func() error { return client.Delete(ctx, rg, name) })
	}
	return err
}

Prevention

When it happens

Trigger: PollUntilDone(ctx, nil) returns error when the ARM DELETE operation reports failure (e.g., resource locked, association conflict) or ctx is cancelled/timed out during polling.

Common situations: Route table still associated with subnets in another operation's scope; Azure ResourceManager locks on the resource group; short context deadline against slow deletes.

Related errors


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