{"record":{"id":"5927c9f097d92835","repo":"kubernetes/kops","slug":"failed-to-extract-pools-v","errorCode":null,"errorMessage":"failed to extract pools: %v","messagePattern":"failed to extract pools: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"upup/pkg/fi/cloudup/openstack/loadbalancer.go","lineNumber":501,"sourceCode":"}\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 {\n\t\treturn poolList, fmt.Errorf(\"loadbalancer support not available in this deployment\")\n\t}\n\n\tdone, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) {\n\t\tpoolPage, err := v2pools.List(c.LoadBalancerClient(), opts).AllPages(context.TODO())\n\t\tif err != nil {\n\t\t\treturn false, fmt.Errorf(\"failed to list pools: %v\", err)\n\t\t}\n\t\tpoolList, err = v2pools.ExtractPools(poolPage)\n\t\tif err != nil {\n\t\t\treturn false, fmt.Errorf(\"failed to extract pools: %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 poolList, err\n\t}\n\treturn poolList, nil\n}\n\nfunc (c *openstackCloud) ListListeners(opts listeners.ListOpts) (listenerList []listeners.Listener, err error) {\n\treturn listListeners(c, opts)\n}\n\nfunc listListeners(c OpenstackCloud, opts listeners.ListOpts) (listenerList []listeners.Listener, err error) {\n\tif c.LoadBalancerClient() == nil {","sourceCodeStart":483,"sourceCodeEnd":519,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/upup/pkg/fi/cloudup/openstack/loadbalancer.go#L483-L519","documentation":"The Octavia pool list call succeeded, but decoding pool objects from the paginated response failed, indicating a malformed or version-mismatched response body.","triggerScenarios":"v2pools.ExtractPools(poolPage) fails after successful paging: non-JSON body (proxy error page), unexpected field types from an Octavia version mismatch, or truncated response.","commonSituations":"Old gophercloud pinned against newer Octavia microversions; corporate proxy mangling responses; Octavia returning an error body with 200 status from a broken middleware chain.","solutions":[],"exampleFix":"null","handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"pools, err := listPools(c, opts)\nif err != nil {\n\tif strings.Contains(err.Error(), \"failed to extract pools\") {\n\t\treturn fmt.Errorf(\"octavia pool schema mismatch: %w\", err)\n\t}\n\treturn err\n}","preventionTips":["Match gophercloud schema versions to deployed Octavia microversions","Test API decoding after every Octavia upgrade","Fix or bypass intermediaries that mangle JSON responses"],"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"}