Multiregion job registration

Integration points for multiregion jobs to be registered in the enterprise
version of Nomad:
* hook in `Job.Register` for enterprise to send job to peer regions
* remove monitoring from `nomad job run` and `nomad job stop` for multiregion jobs
This commit is contained in:
Tim Gross
2020-06-15 16:18:14 -04:00
parent e620ff7f0f
commit 02209b1371
11 changed files with 85 additions and 11 deletions

View File

@@ -146,16 +146,20 @@ func (s *HTTPServer) jobPlan(resp http.ResponseWriter, req *http.Request,
return nil, CodedError(400, "Job ID does not match")
}
var region *string
// Region in http request query param takes precedence over region in job hcl config
if args.WriteRequest.Region != "" {
args.Job.Region = helper.StringToPtr(args.WriteRequest.Region)
region = helper.StringToPtr(args.WriteRequest.Region)
}
// If 'global' region is specified or if no region is given,
// default to region of the node you're submitting to
if args.Job.Region == nil || *args.Job.Region == "" || *args.Job.Region == api.GlobalRegion {
args.Job.Region = &s.agent.config.Region
if region == nil || args.Job.Region == nil ||
*args.Job.Region == "" || *args.Job.Region == api.GlobalRegion {
region = &s.agent.config.Region
}
args.Job.Region = regionForJob(args.Job, region)
sJob := ApiJobToStructJob(args.Job)
planReq := structs.JobPlanRequest{
@@ -163,7 +167,7 @@ func (s *HTTPServer) jobPlan(resp http.ResponseWriter, req *http.Request,
Diff: args.Diff,
PolicyOverride: args.PolicyOverride,
WriteRequest: structs.WriteRequest{
Region: sJob.Region,
Region: *region,
},
}
// parseWriteRequest overrides Namespace, Region and AuthToken
@@ -395,17 +399,27 @@ func (s *HTTPServer) jobUpdate(resp http.ResponseWriter, req *http.Request,
if jobName != "" && *args.Job.ID != jobName {
return nil, CodedError(400, "Job ID does not match name")
}
if args.Job.Multiregion != nil && args.Job.Region != nil {
region := *args.Job.Region
if !(region == "global" || region == "") {
return nil, CodedError(400, "Job can't have both multiregion and region blocks")
}
}
var region *string
// Region in http request query param takes precedence over region in job hcl config
if args.WriteRequest.Region != "" {
args.Job.Region = helper.StringToPtr(args.WriteRequest.Region)
region = helper.StringToPtr(args.WriteRequest.Region)
}
// If 'global' region is specified or if no region is given,
// default to region of the node you're submitting to
if args.Job.Region == nil || *args.Job.Region == "" || *args.Job.Region == api.GlobalRegion {
args.Job.Region = &s.agent.config.Region
if region == nil || args.Job.Region == nil ||
*args.Job.Region == "" || *args.Job.Region == api.GlobalRegion {
region = &s.agent.config.Region
}
args.Job.Region = regionForJob(args.Job, region)
sJob := ApiJobToStructJob(args.Job)
regReq := structs.JobRegisterRequest{
@@ -415,7 +429,7 @@ func (s *HTTPServer) jobUpdate(resp http.ResponseWriter, req *http.Request,
PolicyOverride: args.PolicyOverride,
PreserveCounts: args.PreserveCounts,
WriteRequest: structs.WriteRequest{
Region: sJob.Region,
Region: *region,
AuthToken: args.WriteRequest.SecretID,
},
}

View File

@@ -0,0 +1,11 @@
// +build !ent
package agent
import (
"github.com/hashicorp/nomad/api"
)
func regionForJob(job *api.Job, requestRegion *string) *string {
return requestRegion
}

View File

@@ -191,6 +191,7 @@ func (c *JobRunCommand) Run(args []string) int {
// Check if the job is periodic or is a parameterized job
periodic := job.IsPeriodic()
paramjob := job.IsParameterized()
multiregion := job.IsMultiregion()
// Parse the Consul token
if consulToken == "" {
@@ -271,7 +272,7 @@ func (c *JobRunCommand) Run(args []string) int {
evalID := resp.EvalID
// Check if we should enter monitor mode
if detach || periodic || paramjob {
if detach || periodic || paramjob || multiregion {
c.Ui.Output("Job registration successful")
if periodic && !paramjob {
loc, err := job.Periodic.GetLocation()

View File

@@ -171,7 +171,7 @@ func (c *JobStopCommand) Run(args []string) int {
return 0
}
if detach {
if detach || job.IsMultiregion() {
c.Ui.Output(evalID)
return 0
}

View File

@@ -70,6 +70,7 @@ func testMultiRegionJob(jobID, region, datacenter string) *api.Job {
})
job := api.NewServiceJob(jobID, jobID, region, 1).AddDatacenter(datacenter).AddTaskGroup(group)
job.Region = nil
job.Multiregion = &api.Multiregion{
Regions: []*api.MultiregionRegion{
{