hashicorp/nomad · error

group name in allocation is not present in job

Error message

group name in allocation is not present in job

What it means

After checking task names, `verifiedTasks` calls alloc.Job.LookupTaskGroup(alloc.TaskGroup) and throws "group name in allocation is not present in job" if the job spec embedded in the allocation has no task group matching the allocation's TaskGroup. This indicates the allocation's job data is inconsistent — the task group referenced does not exist in the job definition stored with the allocation.

Source

Thrown at client/client.go:3069

		),
	}
	c.nomadService = nsd.NewServiceRegistrationHandler(c.logger, &cfg)
}

// verifiedTasks asserts each task in taskNames actually exists in the given alloc,
// otherwise an error is returned.
func verifiedTasks(logger hclog.Logger, alloc *structs.Allocation, taskNames []string) ([]string, error) {
	if alloc == nil {
		return nil, fmt.Errorf("nil allocation")
	}

	if len(taskNames) == 0 {
		return nil, fmt.Errorf("missing task names")
	}

	group := alloc.Job.LookupTaskGroup(alloc.TaskGroup)
	if group == nil {
		return nil, fmt.Errorf("group name in allocation is not present in job")
	}

	verifiedTasks := make([]string, 0, len(taskNames))

	// confirm the requested task names actually exist in the allocation
	for _, taskName := range taskNames {
		if !taskIsPresent(taskName, group.Tasks) {
			logger.Error("task not found in the allocation", "task_name", taskName)
			return nil, fmt.Errorf("task %q not found in allocation", taskName)
		}
		verifiedTasks = append(verifiedTasks, taskName)
	}

	return verifiedTasks, nil
}

func taskIsPresent(taskName string, tasks []*structs.Task) bool {
	for _, task := range tasks {

View on GitHub (pinned to 482b49bf1a)

Solutions

  1. Ensure the allocation passed to the API includes a complete, matching Job specification
  2. Re-fetch the allocation from the Nomad server so alloc.Job and alloc.TaskGroup are consistent
  3. If building allocations in code, set TaskGroup to a group name that exists in the Job you attach

Example fix

// before
alloc.TaskGroup = "web-v2"
alloc.Job = oldJobSnapshot // no "web-v2" group
verified, err := verifiedTasks(logger, alloc, tasks)
// after
alloc.TaskGroup = "web"
alloc.Job = currentJob // contains the referenced group
verified, err := verifiedTasks(logger, alloc, tasks)
Defensive patterns

Strategy: validation

Validate before calling

group := alloc.Job.LookupTaskGroup(alloc.TaskGroup)
if group == nil {
    return fmt.Errorf("task group %q missing from job %q", alloc.TaskGroup, alloc.Job.ID)
}

Type guard

func jobHasAllocGroup(alloc *structs.Allocation) bool {
    return alloc != nil && alloc.Job != nil &&
        alloc.Job.LookupTaskGroup(alloc.TaskGroup) != nil
}

Try / catch

if err := op(alloc); err != nil {
    if strings.Contains(err.Error(), "not present in job") {
        alloc, err = reFetchAllocation(alloc.ID) // refresh job data
    }
}

Prevention

When it happens

Trigger: Passing an allocation whose embedded Job is nil-truncated, pruned, or from a different/older job version so LookupTaskGroup returns nil; constructing an Allocation struct manually with a mismatched TaskGroup and Job.

Common situations: Client-side APIs given an allocation fetched with field filtering that dropped the Job; custom tooling that hand-builds structs.Allocation; job spec changes where an old allocation references a since-renamed task group.

Related errors


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