hashicorp/nomad · warning
IOPS has been deprecated as of Nomad 0.9.0. Please remove IO
Error message
IOPS has been deprecated as of Nomad 0.9.0. Please remove IOPS from resource block.
What it means
A warning (not fatal) produced by Task.Warnings() in nomad/structs when a task's resources block still sets the legacy `iops` field. Nomad deprecated task-level IOPS in 0.9.0 and surfaces this to inform users to remove the field. The job still submits; this is surfaced via the API's Warnings header/field.
Source
Thrown at nomad/structs/structs.go:8629
// Keep order deterministic
sort.Strings(names)
joined := strings.Join(names, ", ")
err := fmt.Errorf("port label %q referenced by services %v does not exist", servicePort, joined)
mErr.Errors = append(mErr.Errors, err)
}
}
// Ensure address mode is valid
return mErr.ErrorOrNil()
}
func (t *Task) Warnings() error {
var mErr multierror.Error
// Validate the resources
if t.Resources != nil && t.Resources.IOPS != 0 {
mErr.Errors = append(mErr.Errors, fmt.Errorf("IOPS has been deprecated as of Nomad 0.9.0. Please remove IOPS from resource block."))
}
if t.Resources != nil && len(t.Resources.Networks) != 0 {
mErr.Errors = append(mErr.Errors, fmt.Errorf("task network resources have been deprecated as of Nomad 0.12.0. Please configure networking via group network block."))
}
for idx, tmpl := range t.Templates {
if err := tmpl.Warnings(); err != nil {
err = multierror.Prefix(err, fmt.Sprintf("Template[%d]", idx))
mErr = *multierror.Append(&mErr, err)
}
}
// Validate task-level services.
for _, s := range t.Services {
if err := s.Warnings(); err != nil {
err = multierror.Prefix(err, fmt.Sprintf("Service %q:", s.Name))
mErr = *multierror.Append(&mErr, err)View on GitHub (pinned to 482b49bf1a)
Solutions
- Delete the `iops` field from the task's resources block.
- Re-validate the job with `nomad job validate` to confirm the warning is gone.
- Update any templating/modules that regenerate the job spec to omit iops.
Example fix
// before
resources {
cpu = 500
memory = 256
iops = 100
}
// after
resources {
cpu = 500
memory = 256
} Defensive patterns
Strategy: validation
Validate before calling
// Strip deprecated iops before submitting
clean := func(t *TaskResource) *TaskResource { t.IOPS = 0; return t } Prevention
- Grep job repos for `iops` and remove it once.
- Pin job templates to a modern Nomad version's examples.
- Treat submission Warnings header as actionable in your deploy pipeline.
When it happens
Trigger: Submitting a job whose task resources stanza contains a non-zero `iops` value, e.g. resources { cpu = 500, memory = 256, iops = 100 }. Evaluated on every job validation/submission where Resources.IOPS != 0.
Common situations: Old jobs written before Nomad 0.9.0 being redeployed; copy-pasted legacy HCL; Terraform/modules generated from ancient Nomad examples.
Related errors
- task network resources have been deprecated as of Nomad 0.12
- Task can only ask for 'cpu' or 'cores' resource, not both.
- Task can't ask for disk resources, they have to be specified
- Multiple service providers used: task group services must us
- MaxClientDisconnect is deprecated and ignored in favor of Di
AI-assisted analysis of hashicorp/nomad@482b49bf1a (2026-09-04).
Data as JSON: /api/errors/3df5d7be872fae0d.
Report an issue: GitHub.