hashicorp/nomad · error

can't resume terminal deployment

Error message

can't resume terminal deployment

What it means

ErrDeploymentTerminalNoResume: returned by the deployment RPC when a resume is requested for a deployment that is already terminal (not active) — there is nothing left to resume.

Source

Thrown at nomad/structs/errors.go:82

	ErrNodeLacksRpc               = errors.New(errNodeLacksRpc)
	ErrMissingAllocID             = errors.New(errMissingAllocID)
	ErrIncompatibleFiltering      = errors.New(errIncompatibleFiltering)
	ErrMalformedChooseParameter   = errors.New(errMalformedChooseParameter)

	// ErrResultPaginatorCreation is returned by list RPC handlers when the
	// result paginator cannot be built, for example when the server cannot
	// evaluate a requested filter expression. api.ResultPaginatorErrorContent
	// duplicates its message so the CLI can match it without importing structs.
	// Keep the two in sync.
	ErrResultPaginatorCreation = errors.New(errResultPaginatorCreation)

	ErrUnknownNode = errors.New(ErrUnknownNodePrefix)

	ErrDeploymentTerminalNoCancel    = errors.New(errDeploymentTerminalNoCancel)
	ErrDeploymentTerminalNoFail      = errors.New(errDeploymentTerminalNoFail)
	ErrDeploymentTerminalNoPause     = errors.New(errDeploymentTerminalNoPause)
	ErrDeploymentTerminalNoPromote   = errors.New(errDeploymentTerminalNoPromote)
	ErrDeploymentTerminalNoResume    = errors.New(errDeploymentTerminalNoResume)
	ErrDeploymentTerminalNoUnblock   = errors.New(errDeploymentTerminalNoUnblock)
	ErrDeploymentTerminalNoRun       = errors.New(errDeploymentTerminalNoRun)
	ErrDeploymentTerminalNoSetHealth = errors.New(errDeploymentTerminalNoSetHealth)
	ErrDeploymentRunningNoUnblock    = errors.New(errDeploymentRunningNoUnblock)

	ErrCSIClientRPCIgnorable  = errors.New("CSI client error (ignorable)")
	ErrCSIClientRPCRetryable  = errors.New("CSI client error (retryable)")
	ErrCSIVolumeMaxClaims     = errors.New("volume max claims reached")
	ErrCSIVolumeUnschedulable = errors.New("volume is currently unschedulable")
	ErrCSIPluginInUse         = errors.New("plugin in use")
)

// IsErrNoLeader returns whether the error is due to there being no leader.
func IsErrNoLeader(err error) bool {
	return err != nil && strings.Contains(err.Error(), errNoLeader)
}

// IsErrNoRegionPath returns whether the error is due to there being no path to

View on GitHub (pinned to 482b49bf1a)

Solutions

  1. Verify the deployment is active (and paused) before resuming.
  2. If the deployment finished successfully while paused, no action is needed.
  3. If it failed, trigger a new deployment instead of resuming.

Example fix

// before
client.Deployments().Pause(deployID, false, "", nil)
// after
d, _ := client.Deployments().Info(deployID, nil)
if d.Status == "running" { client.Deployments().Pause(deployID, false, "", nil) }
Defensive patterns

Strategy: type-guard

Validate before calling

d, err := client.Deployments().Info(deployID, nil)
if err != nil { return err }
if d.Status != "running" { return nil } // nothing to resume

Type guard

func deploymentActive(d *api.Deployment) bool {
    return d.Status == "running" || d.Status == "pending"
}

Try / catch

err := client.Deployments().Pause(deployID, false, "", nil)
if err != nil && strings.Contains(err.Error(), "terminal deployment") {
    return checkDeploymentOutcome(deployID) // finished while paused
}

Prevention

When it happens

Trigger: Calling Deployment.Pause with Pause=false (resume) against a completed/failed/cancelled deployment, e.g. 'nomad deployment unblock/resume' on a stale ID.

Common situations: Operations runbooks resuming paused deployments after maintenance, but the deployment finished while paused or was cancelled.

Understand the failure class

Background: "Invalid state transition" errors: "status must be X, actually Y", "already rejected/charging/uninstalled", "cannot ... while running" — what they mean when a library rejects your call — this error's family across 31 libraries.

Related errors


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