{"record":{"id":"8f4e24d6b003f845","repo":"kubernetes/kops","slug":"error-extracting-servers-from-pages-v","errorCode":null,"errorMessage":"error extracting servers from pages: %v","messagePattern":"error extracting servers from pages: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"upup/pkg/fi/cloudup/openstack/instance.go","lineNumber":357,"sourceCode":"\t}\n}\n\nfunc (c *openstackCloud) ListInstances(opt servers.ListOptsBuilder) ([]servers.Server, error) {\n\treturn listInstances(c, opt)\n}\n\nfunc listInstances(c OpenstackCloud, opt servers.ListOptsBuilder) ([]servers.Server, error) {\n\tvar instances []servers.Server\n\n\tdone, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) {\n\t\tallPages, err := servers.List(c.ComputeClient(), opt).AllPages(context.TODO())\n\t\tif err != nil {\n\t\t\treturn false, fmt.Errorf(\"error listing servers %v: %v\", opt, err)\n\t\t}\n\n\t\tss, err := servers.ExtractServers(allPages)\n\t\tif err != nil {\n\t\t\treturn false, fmt.Errorf(\"error extracting servers from pages: %v\", err)\n\t\t}\n\t\tinstances = ss\n\t\treturn true, nil\n\t})\n\tif err != nil {\n\t\treturn instances, err\n\t} else if done {\n\t\treturn instances, nil\n\t} else {\n\t\treturn instances, wait.ErrWaitTimeout\n\t}\n}\n\nfunc (c *openstackCloud) GetFlavor(name string) (*flavors.Flavor, error) {\n\treturn getFlavor(c, name)\n}\n\nfunc getFlavor(c OpenstackCloud, name string) (*flavors.Flavor, error) {","sourceCodeStart":339,"sourceCodeEnd":375,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/upup/pkg/fi/cloudup/openstack/instance.go#L339-L375","documentation":"This error occurs when servers.ExtractServers fails to decode the pages returned by the Nova list-servers API into []servers.Server. It means the API responded, but the response body could not be parsed/extracted by gophercloud.","triggerScenarios":"servers.ExtractServers returns an error: malformed or unexpected JSON from a proxy/middleware between kops and Nova, a non-standard Nova response shape, or an intercepted error page (e.g. HTML from a load balancer in front of the API).","commonSituations":"An API proxy/gateway returning HTML error pages with 200 status; mismatched gophercloud/openstack SDK versions producing incompatible response structs; a custom OpenStack distribution with non-standard server response fields.","solutions":["Log the raw response from the compute endpoint to see what body is actually being returned","Check for proxies/gateways in front of the OpenStack API that may inject HTML error pages","Upgrade/downgrade gophercloud to match your OpenStack release's response schema","Retry; if transient middleware errors, the retry backoff may mask it — capture the raw body on failure"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"ss, err := listInstances(cloud, opts)\nif err != nil && strings.Contains(err.Error(), \"error extracting servers\") {\n    // parse failure: capture raw response and retry once\n    log.Printf(\"non-JSON response from compute API; retrying\")\n    ss, err = listInstances(cloud, opts)\n}","preventionTips":["Ensure no proxy between the client and Nova rewrites/HTML-wraps responses","Keep gophercloud SDK version aligned with your OpenStack release","Pin API microversions if your distribution customizes response shapes","Alert on non-JSON bodies from the compute endpoint"],"tags":["openstack","gophercloud","response-parsing","servers"],"backgroundTag":"api-response-parse-failed","analyzedSha":"4c8573c808a73d578c5eadc86d410646ea0b0d73","analyzedAt":"2026-09-05T04:13:19.212Z","contentChangedAt":"2026-09-05T04:13:19.212Z","schemaVersion":2},"datasetVersion":"2026-09-12T12:17:11.808Z"}