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

  1. Delete the `iops` field from the task's resources block.
  2. Re-validate the job with `nomad job validate` to confirm the warning is gone.
  3. 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

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


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