kubernetes/kops · error
error deleting listener: %v
Error message
error deleting listener: %v
What it means
Inside deleteListener, listeners.Delete against the Octavia API is retried via vfs.RetryWithBackoff; any non-NotFound failure is wrapped as 'error deleting listener: %v'. 404 is treated as success (already gone); anything else — conflicts, auth, server errors — surfaces through this message after retries are exhausted.
Source
Thrown at upup/pkg/fi/cloudup/openstack/loadbalancer.go:164
return nil
} else {
return wait.ErrWaitTimeout
}
}
func (c *openstackCloud) DeleteListener(listenerID string) error {
return deleteListener(c, listenerID)
}
func deleteListener(c OpenstackCloud, listenerID string) error {
if c.LoadBalancerClient() == nil {
return fmt.Errorf("loadbalancer support not available in this deployment")
}
done, err := vfs.RetryWithBackoff(deleteBackoff, func() (bool, error) {
err := listeners.Delete(context.TODO(), c.LoadBalancerClient(), listenerID).ExtractErr()
if err != nil && !isNotFound(err) {
return false, fmt.Errorf("error deleting listener: %v", err)
}
if isNotFound(err) {
return true, nil
}
return false, nil
})
if err != nil {
return err
} else if done {
return nil
} else {
return wait.ErrWaitTimeout
}
}
func (c *openstackCloud) DeleteLB(lbID string, opts loadbalancers.DeleteOpts) error {
return deleteLB(c, lbID, opts)
}View on GitHub (pinned to 4c8573c808)
Solutions
- Delete the parent loadbalancer (or detach the listener) before/with the listener per Octavia dependency rules
- Inspect the wrapped error: 409 means state conflict — wait for the LB to leave PENDING_* state and retry
- Verify RBAC policy permits lbaas listener deletion for the project
- Check Octavia service logs/API status for 5xx and retry after recovery
- Fall back to CLI cleanup (openstack loadbalancer listener delete) if reconciliation keeps failing
Defensive patterns
Strategy: retry
Validate before calling
// detach/verify listener state before deleting
listener, err := cloud.GetListener(listenerID)
if err != nil && !isNotFound(err) { return err }
if isNotFound(err) { return nil } // already gone Try / catch
done, err := vfs.RetryWithBackoff(deleteBackoff, func() (bool, error) {
err := listeners.Delete(context.TODO(), client, listenerID).ExtractErr()
if isNotFound(err) { return true, nil }
if err != nil {
if strings.Contains(err.Error(), "409") || strings.Contains(err.Error(), "PENDING") {
return false, nil // wait for LB to leave pending state
}
return false, fmt.Errorf("error deleting listener: %v", err)
}
return true, nil
}) Prevention
- Delete the loadbalancer (cascade) before listeners when tearing down, or follow listener→pool ordering used by kOps
- Check the parent LB provisioning status is ACTIVE before deleting listeners
- Confirm RBAC allows listener deletion for the service project
When it happens
Trigger: Deleting a listener that is still attached to a loadbalancer with active default pool, an Octavia 409/403/500 response, or network timeouts during cluster teardown or service deletion.
Common situations: Out-of-order teardown where the loadbalancer was deleted first or still exists holding the listener; Octavia resource stuck in PENDING_UPDATE; RBAC denies listener deletion for the credentials in use.
Related errors
- error deleting loadbalancer: %v
- error creating loadbalancer: %v
- failed to list loadbalancers: %s
- failed to list members: %v
- failed to list pools: %v
AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05).
Data as JSON: /api/errors/dbb9a496a88eb0ed.
Report an issue: GitHub.