kubernetes/kops · error

error listing Akamai (Linode) volumes: %w

Error message

error listing Akamai (Linode) volumes: %w

What it means

Volume.Find wraps any error from linodego's ListVolumes call with this message. It means the Linode API list volumes request failed while trying to find a matching volume by label. The underlying cause is preserved via %w.

Source

Thrown at upup/pkg/fi/cloudup/linodetasks/volume.go:61

func (v *Volume) CompareWithID() *string {
	return v.Name
}

func (v *Volume) Find(c *fi.CloudupContext) (*Volume, error) {
	cloud := c.T.Cloud.(linode.LinodeCloud)
	name := fi.ValueOf(v.Name)
	if name == "" {
		return nil, fmt.Errorf("Volume.Name is required")
	}
	label := truncate.TruncateString(linode.NormalizeLinodeLabel(name), truncate.TruncateStringOptions{MaxLength: 32})
	listOptions, err := linode.ListOptionsForLabel(label)
	if err != nil {
		return nil, err
	}

	volumes, err := cloud.Client().ListVolumes(c.Context(), listOptions)
	if err != nil {
		return nil, fmt.Errorf("error listing Akamai (Linode) volumes: %w", err)
	}

	if len(volumes) == 0 {
		return nil, nil
	}

	// Name is unique, so we should only have one match
	matched := volumes[0]

	actual := &Volume{
		ID:        new(matched.ID),
		Name:      new(name),
		Lifecycle: v.Lifecycle,
		Region:    new(matched.Region),
		SizeGB:    new(matched.Size),
		Tags:      matched.Tags,
	}
	v.ID = actual.ID

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Unwrap the error to read the Linode API status (401/403 -> fix token scopes; 429 -> back off and retry)
  2. Verify LINODE_TOKEN / API credentials are valid and have volumes:read access
  3. Retry the kops update if the cause is a transient 5xx or network error
  4. Check Linode status page for an ongoing API incident
Defensive patterns

Strategy: try-catch

Try / catch

_, err := kops.UpdateCluster(ctx, opts)
if err != nil && strings.Contains(err.Error(), "error listing Akamai (Linode) volumes") {
  var apiErr *linodego.Error
  if errors.As(err, &apiErr) && (apiErr.Code == 429 || apiErr.Code >= 500) {
    // retry with exponential backoff
  } else if errors.As(err, &apiErr) && (apiErr.Code == 401 || apiErr.Code == 403) {
    // refresh LINODE_TOKEN / fix scopes
  }
}

Prevention

When it happens

Trigger: cloud.Client().ListVolumes(c.Context(), listOptions) returns an error during Volume.Find, e.g. network failure, bad API token, or malformed label list options.

Common situations: Expired or scope-limited Linode API token; Linode API outage or rate limiting; network/proxy issues from the CI runner; ListOptionsForLabel produced options the API rejects.

Related errors


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