kubernetes/kops · error

error extracting servers from pages: %v

Error message

error extracting servers from pages: %v

What it means

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.

Source

Thrown at upup/pkg/fi/cloudup/openstack/instance.go:357

	}
}

func (c *openstackCloud) ListInstances(opt servers.ListOptsBuilder) ([]servers.Server, error) {
	return listInstances(c, opt)
}

func listInstances(c OpenstackCloud, opt servers.ListOptsBuilder) ([]servers.Server, error) {
	var instances []servers.Server

	done, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) {
		allPages, err := servers.List(c.ComputeClient(), opt).AllPages(context.TODO())
		if err != nil {
			return false, fmt.Errorf("error listing servers %v: %v", opt, err)
		}

		ss, err := servers.ExtractServers(allPages)
		if err != nil {
			return false, fmt.Errorf("error extracting servers from pages: %v", err)
		}
		instances = ss
		return true, nil
	})
	if err != nil {
		return instances, err
	} else if done {
		return instances, nil
	} else {
		return instances, wait.ErrWaitTimeout
	}
}

func (c *openstackCloud) GetFlavor(name string) (*flavors.Flavor, error) {
	return getFlavor(c, name)
}

func getFlavor(c OpenstackCloud, name string) (*flavors.Flavor, error) {

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Log the raw response from the compute endpoint to see what body is actually being returned
  2. Check for proxies/gateways in front of the OpenStack API that may inject HTML error pages
  3. Upgrade/downgrade gophercloud to match your OpenStack release's response schema
  4. Retry; if transient middleware errors, the retry backoff may mask it — capture the raw body on failure
Defensive patterns

Strategy: retry

Try / catch

ss, err := listInstances(cloud, opts)
if err != nil && strings.Contains(err.Error(), "error extracting servers") {
    // parse failure: capture raw response and retry once
    log.Printf("non-JSON response from compute API; retrying")
    ss, err = listInstances(cloud, opts)
}

Prevention

When it happens

Trigger: 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).

Common situations: 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.

Related errors


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