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

  1. Delete the parent loadbalancer (or detach the listener) before/with the listener per Octavia dependency rules
  2. Inspect the wrapped error: 409 means state conflict — wait for the LB to leave PENDING_* state and retry
  3. Verify RBAC policy permits lbaas listener deletion for the project
  4. Check Octavia service logs/API status for 5xx and retry after recovery
  5. 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

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


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