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

  1. Check credentials with curl -H "Authorization: Bearer $HCLOUD_TOKEN" https://api.hetzner.cloud/v1/volumes.
  2. For 429 responses, wait for the rate-limit window and retry.
  3. Confirm the token's project actually hosts the cluster's volumes.
  4. 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

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


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