{"record":{"id":"54600d5e402caa39","repo":"kubernetes/kops","slug":"failed-to-extract-members-v","errorCode":null,"errorMessage":"failed to extract members: %v","messagePattern":"failed to extract members: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"upup/pkg/fi/cloudup/openstack/loadbalancer.go","lineNumber":472,"sourceCode":"}\n\nfunc (c *openstackCloud) ListPoolMembers(poolID string, opts v2pools.ListMembersOpts) (memberList []v2pools.Member, err error) {\n\treturn listPoolMembers(c, poolID, opts)\n}\n\nfunc listPoolMembers(c OpenstackCloud, poolID string, opts v2pools.ListMembersOpts) (memberList []v2pools.Member, err error) {\n\tif c.LoadBalancerClient() == nil {\n\t\treturn memberList, fmt.Errorf(\"loadbalancer support not available in this deployment\")\n\t}\n\n\tdone, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) {\n\t\tmemberPage, err := v2pools.ListMembers(c.LoadBalancerClient(), poolID, opts).AllPages(context.TODO())\n\t\tif err != nil {\n\t\t\treturn false, fmt.Errorf(\"failed to list members: %v\", err)\n\t\t}\n\t\tmemberList, err = v2pools.ExtractMembers(memberPage)\n\t\tif err != nil {\n\t\t\treturn false, fmt.Errorf(\"failed to extract members: %v\", err)\n\t\t}\n\t\treturn true, nil\n\t})\n\tif !done {\n\t\tif err == nil {\n\t\t\terr = wait.ErrWaitTimeout\n\t\t}\n\t\treturn memberList, err\n\t}\n\treturn memberList, nil\n}\n\nfunc (c *openstackCloud) ListPools(opts v2pools.ListOpts) (poolList []v2pools.Pool, err error) {\n\treturn listPools(c, opts)\n}\n\nfunc listPools(c OpenstackCloud, opts v2pools.ListOpts) (poolList []v2pools.Pool, err error) {\n\tif c.LoadBalancerClient() == nil {","sourceCodeStart":454,"sourceCodeEnd":490,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/upup/pkg/fi/cloudup/openstack/loadbalancer.go#L454-L490","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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"],"exampleFix":"null","handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"memberList, err := listPoolMembers(c, poolID, opts)\nif err != nil {\n\tif strings.Contains(err.Error(), \"failed to extract members\") {\n\t\t// raw payload mismatch; log body / retry after backoff\n\t\treturn fmt.Errorf(\"octavia returned unexpected member payload: %w\", err)\n\t}\n\treturn err\n}","preventionTips":["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"],"tags":["openstack","octavia","json","unmarshal"],"backgroundTag":"json-unmarshal-failed","analyzedSha":"4c8573c808a73d578c5eadc86d410646ea0b0d73","analyzedAt":"2026-09-05T04:13:19.212Z","contentChangedAt":"2026-09-05T04:13:19.212Z","schemaVersion":2},"datasetVersion":"2026-09-12T07:17:12.445Z"}