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
- Confirm API access: curl -H "Authorization: Bearer $HCLOUD_TOKEN" https://api.hetzner.cloud/v1/servers.
- On rate limit errors, honor X-Ratelimit-Reset and space out API calls before re-running.
- Replace an expired/revoked token with a new one from the Hetzner Cloud Console.
- 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
- Avoid parallel kops cleanup jobs sharing one token.
- Refresh HCLOUD_TOKEN after team rotations.
- Confirm outbound HTTPS to api.hetzner.cloud from CI runners.
- Retry 5xx with exponential backoff; abort-fast on 401.
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
- failed to list ssh keys: %w
- failed to list networks: %w
- failed to list firewalls: %w
- failed to list load balancers: %w
- failed to list volumes: %w
AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05).
Data as JSON: /api/errors/4706e9f51d564b3b.
Report an issue: GitHub.