kubernetes/kops · error

failed to list servers: %w

Error message

failed to list servers: %w

What it means

Returned by listServers when GetServers(clusterName) fails enumerating Hetzner servers during cluster resource discovery (delete path). Server listing is the core of discovery, so failure aborts the operation. The underlying hcloud SDK/API error is preserved via %w wrapping.

Source

Thrown at pkg/resources/hetzner/resources.go:172

			ID:      strconv.FormatInt(loadBalancer.ID, 10),
			Type:    resourceTypeLoadBalancer,
			Deleter: deleteLoadBalancer,
			Obj:     loadBalancer,
		}

		resourceTrackers = append(resourceTrackers, resourceTracker)
	}

	return resourceTrackers, nil
}

func listServers(cloud fi.Cloud, clusterName string) ([]*resources.Resource, error) {
	c := cloud.(hetzner.HetznerCloud)
	var resourceTrackers []*resources.Resource

	servers, err := c.GetServers(clusterName)
	if err != nil {
		return nil, fmt.Errorf("failed to list servers: %w", err)
	}

	for _, server := range servers {
		resourceTracker := &resources.Resource{
			Name:    server.Name,
			ID:      strconv.FormatInt(server.ID, 10),
			Type:    resourceTypeServer,
			Deleter: deleteServer,
			Dumper:  dumpServer,
			Obj:     server,
		}

		for _, firewall := range server.PublicNet.Firewalls {
			resourceTracker.Blocks = append(resourceTracker.Blocks, fmt.Sprintf("%s:%d", resourceTypeFirewall, firewall.Firewall.ID))
		}

		resourceTrackers = append(resourceTrackers, resourceTracker)
	}

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Confirm API access: curl -H "Authorization: Bearer $HCLOUD_TOKEN" https://api.hetzner.cloud/v1/servers.
  2. On rate limit errors, honor X-Ratelimit-Reset and space out API calls before re-running.
  3. Replace an expired/revoked token with a new one from the Hetzner Cloud Console.
  4. Retry after checking status.hetzner.com if the wrapped error is a 5xx.
Defensive patterns

Strategy: retry

Validate before calling

resp, err := hc.Get("https://api.hetzner.cloud/v1/servers")
if err != nil || resp.StatusCode != 200 {
    return fmt.Errorf("servers API precheck failed: token/network problem")
}

Type guard

var hErr hcloud.Error
if errors.As(err, &hErr) && (hErr.Code == hcloud.ErrorCodeUnauthorized || hErr.Code == hcloud.ErrorCodeRateLimitExceeded) {
    // handle auth vs throttling differently
}

Try / catch

servers, err := c.GetServers(clusterName)
var hErr hcloud.Error
if errors.As(err, &hErr) && hErr.Code == hcloud.ErrorCodeRateLimitExceeded {
    time.Sleep(time.Until(ratelimitReset))
    servers, err = c.GetServers(clusterName)
}

Prevention

When it happens

Trigger: Hetzner servers.list API call fails: invalid token, rate limiting, API 5xx outage, request timeout, or network egress blocked to api.hetzner.cloud.

Common situations: Automated cleanup scripts hammering the API trigger 429 rate_limit_exceeded; HCLOUD_TOKEN reset/revoked; Hetzner incident; running kops from a machine without outbound HTTPS access.

Related errors


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