kubernetes/kops · error

failed to extract listeners: %v

Error message

failed to extract listeners: %v

What it means

Wraps a failure from listeners.ExtractListeners in listListeners. The listener-list response could not be decoded into []listeners.Listener — the JSON body deviates from the expected gophercloud schema.

Source

Thrown at upup/pkg/fi/cloudup/openstack/loadbalancer.go:530

}

func (c *openstackCloud) ListListeners(opts listeners.ListOpts) (listenerList []listeners.Listener, err error) {
	return listListeners(c, opts)
}

func listListeners(c OpenstackCloud, opts listeners.ListOpts) (listenerList []listeners.Listener, err error) {
	if c.LoadBalancerClient() == nil {
		return listenerList, fmt.Errorf("loadbalancer support not available in this deployment")
	}

	done, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) {
		listenerPage, err := listeners.List(c.LoadBalancerClient(), opts).AllPages(context.TODO())
		if err != nil {
			return false, fmt.Errorf("failed to list listeners: %v", err)
		}
		listenerList, err = listeners.ExtractListeners(listenerPage)
		if err != nil {
			return false, fmt.Errorf("failed to extract listeners: %v", err)
		}
		return true, nil
	})
	if !done {
		if err == nil {
			err = wait.ErrWaitTimeout
		}
		return listenerList, err
	}
	return listenerList, nil
}

func (c *openstackCloud) CreateListener(opts listeners.CreateOpts) (listener *listeners.Listener, err error) {
	return createListener(c, opts)
}

func createListener(c OpenstackCloud, opts listeners.CreateOpts) (listener *listeners.Listener, err error) {
	if c.LoadBalancerClient() == nil {

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Inspect the raw /v2/lbaas/listeners response body for the malformed portion
  2. Upgrade gophercloud (go get + make gomod) to a release matching your Octavia version
  3. Eliminate proxies/middleware that mutate the API response body
  4. Retry the operation if the response was transiently truncated

Example fix

null
Defensive patterns

Strategy: retry

Try / catch

ll, err := listListeners(c, opts)
if err != nil {
	if strings.Contains(err.Error(), "failed to extract listeners") {
		return fmt.Errorf("octavia listener payload undecodable: %w", err)
	}
	return err
}

Prevention

When it happens

Trigger: listeners.ExtractListeners(listenerPage) errors after paging succeeds: HTML/invalid JSON body from a proxy, unknown field types from a mismatched Octavia version, or an embedded error document within the page.

Common situations: Octavia microversion newer than the pinned gophercloud version; middleware rewriting responses; truncated chunked transfer from a broken LB in front of the API.

Understand the failure class

Background: "failed to unmarshal" / json.Unmarshal errors: why parsing a response into a Go struct fails and how to fix it — this error's family across 23 libraries.

Related errors


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