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

  1. Log/curl the raw Octavia /v2/lbaas/pools/<id>/members response to inspect the actual payload
  2. Upgrade gophercloud to a version compatible with your Octavia release
  3. Fix intermediary proxies/LBs that rewrite API responses (HTML error pages, HTML injection)
  4. 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

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


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