kubernetes/kops · error
failed to extract members: %v
Error message
failed to extract members: %v
What it means
Wraps a failure from v2pools.ExtractMembers in listPoolMembers. The Octavia API returned pages that could not be unmarshaled into []v2pools.Member — usually malformed or unexpected JSON from the server or an incompatible gophercloud schema.
Source
Thrown at upup/pkg/fi/cloudup/openstack/loadbalancer.go:472
}
func (c *openstackCloud) ListPoolMembers(poolID string, opts v2pools.ListMembersOpts) (memberList []v2pools.Member, err error) {
return listPoolMembers(c, poolID, opts)
}
func listPoolMembers(c OpenstackCloud, poolID string, opts v2pools.ListMembersOpts) (memberList []v2pools.Member, err error) {
if c.LoadBalancerClient() == nil {
return memberList, fmt.Errorf("loadbalancer support not available in this deployment")
}
done, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) {
memberPage, err := v2pools.ListMembers(c.LoadBalancerClient(), poolID, opts).AllPages(context.TODO())
if err != nil {
return false, fmt.Errorf("failed to list members: %v", err)
}
memberList, err = v2pools.ExtractMembers(memberPage)
if err != nil {
return false, fmt.Errorf("failed to extract members: %v", err)
}
return true, nil
})
if !done {
if err == nil {
err = wait.ErrWaitTimeout
}
return memberList, err
}
return memberList, nil
}
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 {View on GitHub (pinned to 4c8573c808)
Solutions
- Log/curl the raw Octavia /v2/lbaas/pools/<id>/members response to inspect the actual payload
- Upgrade gophercloud to a version compatible with your Octavia release
- Fix intermediary proxies/LBs that rewrite API responses (HTML error pages, HTML injection)
- Retry — if it was a transient gateway response, the vfs.RetryWithBackoff may already have absorbed it; otherwise fix the server side
Example fix
null
Defensive patterns
Strategy: retry
Try / catch
memberList, err := listPoolMembers(c, poolID, opts)
if err != nil {
if strings.Contains(err.Error(), "failed to extract members") {
// raw payload mismatch; log body / retry after backoff
return fmt.Errorf("octavia returned unexpected member payload: %w", err)
}
return err
} Prevention
- Keep gophercloud versions in sync with your Octavia release
- Avoid proxies that rewrite API response bodies
- Alert on repeated extraction failures to catch schema drift early
When it happens
Trigger: v2pools.ExtractMembers(memberPage) fails after a successful AllPages call: response body is not valid JSON, the page contains an error payload the paging code ignored, or an Octavia version returns fields in an unexpected shape.
Common situations: Proxy/middleware returning HTML error pages with HTTP 200; Octavia microversion producing JSON the pinned gophercloud version can't decode; a load balancer stuck in ERROR state returning partial payloads.
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 pools: %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/54600d5e402caa39.
Report an issue: GitHub.