{"record":{"id":"d6e1bb490fc3b438","repo":"kubernetes/kops","slug":"failed-to-extract-loadbalancer-pages-s","errorCode":null,"errorMessage":"failed to extract loadbalancer pages: %s","messagePattern":"failed to extract loadbalancer pages: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"upup/pkg/fi/cloudup/openstack/loadbalancer.go","lineNumber":278,"sourceCode":"// ListLBs will list load balancers\nfunc (c *openstackCloud) ListLBs(opt loadbalancers.ListOptsBuilder) (lbs []loadbalancers.LoadBalancer, err error) {\n\treturn listLBs(c, opt)\n}\n\nfunc listLBs(c OpenstackCloud, opt loadbalancers.ListOptsBuilder) (lbs []loadbalancers.LoadBalancer, err error) {\n\tif c.LoadBalancerClient() == nil {\n\t\t// skip error because cluster delete will otherwise fail\n\t\treturn lbs, nil\n\t}\n\n\tdone, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) {\n\t\tallPages, err := loadbalancers.List(c.LoadBalancerClient(), opt).AllPages(context.TODO())\n\t\tif err != nil {\n\t\t\treturn false, fmt.Errorf(\"failed to list loadbalancers: %s\", err)\n\t\t}\n\t\tlbs, err = loadbalancers.ExtractLoadBalancers(allPages)\n\t\tif err != nil {\n\t\t\treturn false, fmt.Errorf(\"failed to extract loadbalancer pages: %s\", 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 lbs, err\n\t}\n\treturn lbs, nil\n}\n\nfunc (c *openstackCloud) GetLBStats(loadbalancerID string) (stats *loadbalancers.Stats, err error) {\n\treturn getLBStats(c, loadbalancerID)\n}\n\nfunc getLBStats(c OpenstackCloud, loadbalancerID string) (stats *loadbalancers.Stats, err error) {\n\tif c.LoadBalancerClient() == nil {","sourceCodeStart":260,"sourceCodeEnd":296,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/upup/pkg/fi/cloudup/openstack/loadbalancer.go#L260-L296","documentation":"This error is wrapped by the openstackCloud loadbalancer listing helper after `loadbalancers.ExtractLoadBalancers(allPages)` fails inside a RetryWithBackoff block. Listing succeeded at the HTTP level, but the returned pagination pages could not be decoded into []LoadBalancer structs. It almost always indicates an unexpected response body from the Octavia API rather than a caller mistake.","triggerScenarios":"Calling GetLoadbalancers (which runs loadbalancers.List(...).AllPages then ExtractLoadBalancers) when the Octavia/Neutron-LBaaS endpoint returns pages whose JSON schema does not match the gophercloud loadbalancers structs, e.g. a proxy or a different LBaaS version answering the request.","commonSituations":"Pointing kOps at an OpenStack deployment where the load-balancer endpoint is served by Neutron LBaaS v2 instead of Octavia; a misconfigured service catalog entry routing to a non-Octavia service; an intermediary returning an HTML error page with HTTP 200.","solutions":["Inspect the wrapped err (%s) to see the JSON unmarshal failure and confirm which field failed to decode.","Verify the load-balancer service endpoint in the OpenStack catalog is Octavia (`openstack service list`) and matches the installed gophercloud SDK version.","Retry with a newer kOps/gophercloud version that supports the Octavia API microversion deployed in your cloud.","If the endpoint is Neutron LBaaS, migrate to Octavia or disable the loadbalancer feature in the cluster config."],"exampleFix":"// before\nallPages, err := loadbalancers.List(c.LoadBalancerClient(), opt).AllPages(context.TODO())\nlbs, err = loadbalancers.ExtractLoadBalancers(allPages)\n// after: log the underlying decode error to identify the schema mismatch\nif err != nil {\n\tklog.V(2).Infof(\"extract loadbalancers failed: %v\", err)\n\treturn false, fmt.Errorf(\"failed to extract loadbalancer pages: %s\", err)\n}","handlingStrategy":"try-catch","validationCode":"if client == nil || endpointURL == nil {\n\treturn fmt.Errorf(\"no load-balancer endpoint in catalog; cannot list loadbalancers\")\n}","typeGuard":"func hasLBClient(c kops_cloud.OpenstackCloud) bool {\n\treturn c.LoadBalancerClient() != nil\n}","tryCatchPattern":"done, err := tryListLBs(cloud)\nif err != nil {\n\tif strings.Contains(err.Error(), \"failed to extract loadbalancer pages\") {\n\t\tklog.Warningf(\"Octavia response schema mismatch: %v — check SDK/cloud version\", err)\n\t\treturn nil, ErrOctaviaIncompatible\n\t}\n\treturn nil, err\n}","preventionTips":["Verify the load-balancer endpoint is Octavia (not Neutron LBaaS) before using kOps LB features.","Pin a gophercloud/kOps version matching your cloud's Octavia API microversion.","Test `openstack loadbalancer list` with the same credentials before cluster operations."],"tags":["openstack","octavia","api-response","pagination"],"backgroundTag":"api-response-decode-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"}