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
- Match gophercloud schema versions to deployed Octavia microversions
- Test API decoding after every Octavia upgrade
- Fix or bypass intermediaries that mangle JSON responses
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
- failed to extract members: %v
- failed to extract listeners: %v
- failed to build load balancer client: %w
- cluster configured to use octavia, but router was not config
- error building lb client: %w
AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05).
Data as JSON: /api/errors/5927c9f097d92835.
Report an issue: GitHub.