hashicorp/nomad · error

invalid capacity_max: %v

Error message

invalid capacity_max: %v

What it means

decodeHostVolume parses the optional `capacity_max` attribute with parseCapacityBytes and wraps any failure as `invalid capacity_max: %v`, setting RequestedCapacityMaxBytes on the HostVolume. Same byte-size grammar as `capacity`/`capacity_min`.

Source

Thrown at command/volume_create_host.go:252

	// Decode the rest
	err = mapstructure.WeakDecode(m, vol)
	if err != nil {
		return nil, err
	}

	capacity, err := parseCapacityBytes(list.Filter("capacity"))
	if err != nil {
		return nil, fmt.Errorf("invalid capacity: %v", err)
	}
	vol.CapacityBytes = capacity
	capacityMin, err := parseCapacityBytes(list.Filter("capacity_min"))
	if err != nil {
		return nil, fmt.Errorf("invalid capacity_min: %v", err)
	}
	vol.RequestedCapacityMinBytes = capacityMin
	capacityMax, err := parseCapacityBytes(list.Filter("capacity_max"))
	if err != nil {
		return nil, fmt.Errorf("invalid capacity_max: %v", err)
	}
	vol.RequestedCapacityMaxBytes = capacityMax

	if o := list.Filter("constraint"); len(o.Items) > 0 {
		if err := parseConstraints(&vol.Constraints, o); err != nil {
			return nil, fmt.Errorf("invalid constraint: %v", err)
		}
	}
	if o := list.Filter("capability"); len(o.Items) > 0 {
		if err := parseHostVolumeCapabilities(&vol.RequestedCapabilities, o); err != nil {
			return nil, fmt.Errorf("invalid capability: %v", err)
		}
	}

	return vol, nil
}

func parseHostVolumeCapabilities(result *[]*api.HostVolumeCapability, list *ast.ObjectList) error {

View on GitHub (pinned to 482b49bf1a)

Solutions

  1. Set a valid size string, e.g. `capacity_max = "20GiB"`
  2. Inspect the inner error after `invalid capacity_max:` for the exact reason
  3. Ensure capacity_max >= capacity_min
  4. Delete the attribute if a maximum is not needed

Example fix

// before
capacity_max = "20 giga"

// after
capacity_max = "20GB"
Defensive patterns

Strategy: validation

Validate before calling

func validCapacityMax(s string, min int64) error {
	v, err := units.RAMInBytes(s)
	if err != nil {
		return fmt.Errorf("capacity_max %q invalid: %v", s, err)
	}
	if min > 0 && v < min {
		return fmt.Errorf("capacity_max %d is below capacity_min %d", v, min)
	}
	return nil
}

Try / catch

if err != nil {
	return fmt.Errorf("capacity_max must be a byte size like 20GiB: %v", err)
}

Prevention

When it happens

Trigger: `nomad volume create` (host) with a spec containing `capacity_max` that cannot be parsed as a byte size (bad unit, negative value, empty string).

Common situations: Typos like "20giga", locale-formatted numbers, or values pasted with units Nomad doesn't recognize; also forgetting that capacity_max must still be a size, not a percentage.

Related errors


AI-assisted analysis of hashicorp/nomad@482b49bf1a (2026-09-04). Data as JSON: /api/errors/2d33e9bb70caeb06. Report an issue: GitHub.