kubernetes/kops · error

failed to extract pools: %v

Error message

failed to extract pools: %v

What it means

The Octavia pool list call succeeded, but decoding pool objects from the paginated response failed, indicating a malformed or version-mismatched response body.

Source

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

}

func (c *openstackCloud) ListPools(opts v2pools.ListOpts) (poolList []v2pools.Pool, err error) {
	return listPools(c, opts)
}

func listPools(c OpenstackCloud, opts v2pools.ListOpts) (poolList []v2pools.Pool, err error) {
	if c.LoadBalancerClient() == nil {
		return poolList, fmt.Errorf("loadbalancer support not available in this deployment")
	}

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

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 {

View on GitHub (pinned to 4c8573c808)

Example fix

null
Defensive patterns

Strategy: retry

Try / catch

pools, err := listPools(c, opts)
if err != nil {
	if strings.Contains(err.Error(), "failed to extract pools") {
		return fmt.Errorf("octavia pool schema mismatch: %w", err)
	}
	return err
}

Prevention

When it happens

Trigger: v2pools.ExtractPools(poolPage) fails after successful paging: non-JSON body (proxy error page), unexpected field types from an Octavia version mismatch, or truncated response.

Common situations: Old gophercloud pinned against newer Octavia microversions; corporate proxy mangling responses; Octavia returning an error body with 200 status from a broken middleware chain.

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/5927c9f097d92835. Report an issue: GitHub.