mirror of
https://github.com/kemko/nomad.git
synced 2026-01-06 10:25:42 +03:00
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:
@@ -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,
|
||||
},
|
||||
}
|
||||
|
||||
11
command/agent/job_endpoint_oss.go
Normal file
11
command/agent/job_endpoint_oss.go
Normal 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
|
||||
}
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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{
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user