kubernetes/kops · error
failed to list volumes: %w
Error message
failed to list volumes: %w
What it means
Returned by listVolumes when GetVolumes(clusterName) fails during Hetzner cluster discovery. kops lists volumes to identify cluster-attached volumes for deletion; an API failure aborts discovery. The real cause (auth, quota, outage) is wrapped with %w inside this message.
Source
Thrown at pkg/resources/hetzner/resources.go:201
}
for _, firewall := range server.PublicNet.Firewalls {
resourceTracker.Blocks = append(resourceTracker.Blocks, fmt.Sprintf("%s:%d", resourceTypeFirewall, firewall.Firewall.ID))
}
resourceTrackers = append(resourceTrackers, resourceTracker)
}
return resourceTrackers, nil
}
func listVolumes(cloud fi.Cloud, clusterName string) ([]*resources.Resource, error) {
c := cloud.(hetzner.HetznerCloud)
var resourceTrackers []*resources.Resource
volumes, err := c.GetVolumes(clusterName)
if err != nil {
return nil, fmt.Errorf("failed to list volumes: %w", err)
}
for _, volume := range volumes {
resourceTracker := &resources.Resource{
Name: volume.Name,
ID: strconv.FormatInt(volume.ID, 10),
Type: resourceTypeVolume,
Deleter: deleteVolume,
Obj: volume,
}
if volume.Server != nil {
resourceTracker.Blocked = append(resourceTracker.Blocked, fmt.Sprintf("%s:%d", resourceTypeServer, volume.Server.ID))
}
resourceTrackers = append(resourceTrackers, resourceTracker)
}
View on GitHub (pinned to 4c8573c808)
Solutions
- Check credentials with curl -H "Authorization: Bearer $HCLOUD_TOKEN" https://api.hetzner.cloud/v1/volumes.
- For 429 responses, wait for the rate-limit window and retry.
- Confirm the token's project actually hosts the cluster's volumes.
- Retry after confirming no Hetzner outage on status.hetzner.com.
Defensive patterns
Strategy: retry
Validate before calling
resp, err := hc.Get("https://api.hetzner.cloud/v1/volumes")
if err != nil || resp.StatusCode != 200 {
return fmt.Errorf("volumes API precheck failed; verify HCLOUD_TOKEN")
} Type guard
var hErr hcloud.Error
if errors.As(err, &hErr) && hErr.Code == hcloud.ErrorCodeUnauthorized {
// token problem, do not retry
} Try / catch
volumes, err := c.GetVolumes(clusterName)
if err != nil {
var hErr hcloud.Error
if errors.As(err, &hErr) && hErr.Code == hcloud.ErrorCodeRateLimitExceeded {
time.Sleep(backoff)
volumes, err = c.GetVolumes(clusterName)
}
} Prevention
- Verify the token has volumes read permission in the correct project.
- Serialize API-heavy cleanup pipelines to avoid 429s.
- Check Hetzner status before large delete operations.
- Cache discovery results to minimize repeated list calls.
When it happens
Trigger: Hetzner volumes.list API call fails: authentication error, rate limit, API outage, or network failure to api.hetzner.cloud.
Common situations: Same project-token mismatch as other Hetzner lists; token under-scoped (no volumes read); bursts of API calls in CI cleanup pipelines hitting rate limits; Hetzner maintenance.
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 servers: %w
AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05).
Data as JSON: /api/errors/05bf547515ce9cf4.
Report an issue: GitHub.