diff --git a/api/jobs.go b/api/jobs.go index ed67f7f17..aa4871f11 100644 --- a/api/jobs.go +++ b/api/jobs.go @@ -495,7 +495,7 @@ type JobValidateResponse struct { } // JobUpdateRequest is used to update a job -type JobUpdateRequest struct { +type JobRegisterRequest struct { Job *Job // If EnforceIndex is set then the job will only be registered if the passed // JobModifyIndex matches the current Jobs index. If the index is zero, the @@ -526,6 +526,7 @@ type deregisterJobResponse struct { type JobPlanRequest struct { Job *Job Diff bool + WriteRequest } type JobPlanResponse struct { diff --git a/command/agent/job_endpoint.go b/command/agent/job_endpoint.go index b26852c64..dc295c74c 100644 --- a/command/agent/job_endpoint.go +++ b/command/agent/job_endpoint.go @@ -93,20 +93,31 @@ func (s *HTTPServer) jobPlan(resp http.ResponseWriter, req *http.Request, return nil, CodedError(405, ErrInvalidMethod) } - var args structs.JobPlanRequest + var args api.JobPlanRequest if err := decodeBody(req, &args); err != nil { return nil, CodedError(400, err.Error()) } if args.Job == nil { return nil, CodedError(400, "Job must be specified") } - if jobName != "" && args.Job.ID != jobName { + if args.Job.ID == nil { + return nil, CodedError(400, "Job must have a valid ID") + } + if jobName != "" && *args.Job.ID != jobName { return nil, CodedError(400, "Job ID does not match") } s.parseRegion(req, &args.Region) + sJob := apiJobToStructJob(args.Job) + planReq := structs.JobPlanRequest{ + Job: sJob, + Diff: args.Diff, + WriteRequest: structs.WriteRequest{ + Region: args.WriteRequest.Region, + }, + } var out structs.JobPlanResponse - if err := s.agent.RPC("Job.Plan", &args, &out); err != nil { + if err := s.agent.RPC("Job.Plan", &planReq, &out); err != nil { return nil, err } setIndex(resp, out.Index) @@ -274,20 +285,34 @@ func (s *HTTPServer) jobQuery(resp http.ResponseWriter, req *http.Request, func (s *HTTPServer) jobUpdate(resp http.ResponseWriter, req *http.Request, jobName string) (interface{}, error) { - var args structs.JobRegisterRequest + var args api.JobRegisterRequest if err := decodeBody(req, &args); err != nil { return nil, CodedError(400, err.Error()) } if args.Job == nil { return nil, CodedError(400, "Job must be specified") } - if jobName != "" && args.Job.ID != jobName { - return nil, CodedError(400, "Job ID does not match") + + if args.Job.ID == nil { + return nil, CodedError(400, "Job ID hasn't been provided") + } + if jobName != "" && *args.Job.ID != jobName { + return nil, CodedError(400, "Job ID does not match name") } s.parseRegion(req, &args.Region) + sJob := apiJobToStructJob(args.Job) + + regReq := structs.JobRegisterRequest{ + Job: sJob, + EnforceIndex: args.EnforceIndex, + JobModifyIndex: args.JobModifyIndex, + WriteRequest: structs.WriteRequest{ + Region: args.WriteRequest.Region, + }, + } var out structs.JobRegisterResponse - if err := s.agent.RPC("Job.Register", &args, &out); err != nil { + if err := s.agent.RPC("Job.Register", ®Req, &out); err != nil { return nil, err } setIndex(resp, out.Index)