{"record":{"id":"734e58c817b661e4","repo":"hashicorp/nomad","slug":"multiregion-jobs-are-unlicensed","errorCode":null,"errorMessage":"Multiregion jobs are unlicensed.","messagePattern":"Multiregion jobs are unlicensed\\.","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"nomad/structs/structs_ce.go","lineNumber":46,"sourceCode":"func (n *NamespaceVaultConfiguration) Validate() error {\n\tif n != nil {\n\t\treturn errors.New(\"Multi-Cluster Vault is unlicensed.\")\n\t}\n\treturn nil\n}\n\nfunc (n *NamespaceConsulConfiguration) Canonicalize() {}\n\nfunc (n *NamespaceConsulConfiguration) Validate() error {\n\tif n != nil {\n\t\treturn errors.New(\"Multi-Cluster Consul is unlicensed.\")\n\t}\n\treturn nil\n}\n\nfunc (m *Multiregion) Validate(jobType string, jobDatacenters []string) error {\n\tif m != nil {\n\t\treturn errors.New(\"Multiregion jobs are unlicensed.\")\n\t}\n\n\treturn nil\n}\n\nfunc (p *ScalingPolicy) validateType() multierror.Error {\n\tvar mErr multierror.Error\n\n\t// Check policy type and target\n\tswitch p.Type {\n\tcase ScalingPolicyTypeHorizontal:\n\t\ttargetErr := p.validateTargetHorizontal()\n\t\tmErr.Errors = append(mErr.Errors, targetErr.Errors...)\n\tdefault:\n\t\tmErr.Errors = append(mErr.Errors, fmt.Errorf(`scaling policy type \"%s\" is not valid`, p.Type))\n\t}\n\n\treturn mErr","sourceCodeStart":28,"sourceCodeEnd":64,"githubUrl":"https://github.com/hashicorp/nomad/blob/482b49bf1aec006f089bcfc7e632d8f6ac303e5e/nomad/structs/structs_ce.go#L28-L64","documentation":"Multiregion.Validate in the CE build returns \"Multiregion jobs are unlicensed.\" whenever a job carries a non-nil multiregion stanza. Multiregion deployments (running one job spec across multiple regions/federated clusters) are an Enterprise-only feature; the OSS binary rejects the stanza at job validation time.","triggerScenarios":"Submitting a job containing a top-level multiregion { ... } stanza (nomad job run / POST /v1/jobs) to a community-edition agent; job plan/validate endpoints also surface it.","commonSituations":"Copying an Enterprise example job file into an OSS cluster; automation generated for a multi-region Enterprise deployment being run against a dev OSS agent; license expired so agent downgraded behavior.","solutions":["Remove the multiregion stanza and submit the job to each region individually as a single-region job.","Upgrade to Nomad Enterprise and apply a license that includes multiregion deployments.","If the stanza is accidentally included by templates, strip it before submission (e.g. hcl2 jobs without multiregion)."],"exampleFix":"// before (HCL)\njob \"app\" {\n  multiregion { region \"global\" { datacenters = [\"dc1\"] } }\n}\n// after\njob \"app\" {\n  datacenters = [\"dc1\"]\n}","handlingStrategy":"validation","validationCode":"if job.Multiregion != nil {\n\treturn errors.New(\"multiregion jobs require Nomad Enterprise\")\n}","typeGuard":"func multiregionLicensed(j *structs.Job) bool { return j == nil || j.Multiregion == nil }","tryCatchPattern":"if err := job.Validate(); err != nil && strings.Contains(err.Error(), \"unlicensed\") {\n\tjob.Multiregion = nil // resubmit as a single-region job\n}","preventionTips":["Keep multiregion job files separate from OSS deployment pipelines","Run `nomad job validate` against the target cluster before `job run`","Split multiregion specs into per-region single-region jobs for OSS"],"tags":["nomad","licensing","enterprise","multiregion"],"backgroundTag":"feature-unlicensed","analyzedSha":"482b49bf1aec006f089bcfc7e632d8f6ac303e5e","analyzedAt":"2026-09-04T07:54:14.808Z","contentChangedAt":"2026-09-04T07:54:14.808Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}