mirror of
https://github.com/kemko/nomad.git
synced 2026-01-03 17:05:43 +03:00
nomad: job deregister creates an evaluation
This commit is contained in:
@@ -79,7 +79,7 @@ func (j *Job) Register(args *structs.JobRegisterRequest, reply *structs.JobRegis
|
||||
}
|
||||
|
||||
// Deregister is used to remove a job the cluster.
|
||||
func (j *Job) Deregister(args *structs.JobDeregisterRequest, reply *structs.GenericResponse) error {
|
||||
func (j *Job) Deregister(args *structs.JobDeregisterRequest, reply *structs.JobDeregisterResponse) error {
|
||||
if done, err := j.srv.forward("Job.Deregister", args, args, reply); done {
|
||||
return err
|
||||
}
|
||||
@@ -92,8 +92,36 @@ func (j *Job) Deregister(args *structs.JobDeregisterRequest, reply *structs.Gene
|
||||
return err
|
||||
}
|
||||
|
||||
// Set the reply index
|
||||
reply.Index = index
|
||||
// Create a new evaluation
|
||||
// XXX: The job priority / type is strange for this, since it's not a high
|
||||
// priority even if the job was. The scheduler itself also doesn't matter,
|
||||
// since all should be able to handle deregistration in the same way.
|
||||
eval := &structs.Evaluation{
|
||||
ID: generateUUID(),
|
||||
Priority: structs.JobDefaultPriority,
|
||||
Type: structs.JobTypeService,
|
||||
TriggeredBy: structs.EvalTriggerJobDeregister,
|
||||
JobID: args.JobID,
|
||||
JobModifyIndex: index,
|
||||
Status: structs.EvalStatusPending,
|
||||
}
|
||||
update := &structs.EvalUpdateRequest{
|
||||
Eval: eval,
|
||||
WriteRequest: structs.WriteRequest{Region: args.Region},
|
||||
}
|
||||
|
||||
// Commit this evaluation via Raft
|
||||
_, evalIndex, err := j.srv.raftApply(structs.EvalUpdateRequestType, update)
|
||||
if err != nil {
|
||||
j.srv.logger.Printf("[ERR] nomad.job: Eval create failed: %v", err)
|
||||
return err
|
||||
}
|
||||
|
||||
// Setup the reply
|
||||
reply.EvalID = eval.ID
|
||||
reply.EvalCreateIndex = evalIndex
|
||||
reply.JobModifyIndex = index
|
||||
reply.Index = evalIndex
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
@@ -178,7 +178,7 @@ func TestJobEndpoint_Deregister(t *testing.T) {
|
||||
JobID: job.ID,
|
||||
WriteRequest: structs.WriteRequest{Region: "region1"},
|
||||
}
|
||||
var resp2 structs.GenericResponse
|
||||
var resp2 structs.JobDeregisterResponse
|
||||
if err := msgpackrpc.CallWithCodec(codec, "Job.Deregister", dereg, &resp2); err != nil {
|
||||
t.Fatalf("err: %v", err)
|
||||
}
|
||||
@@ -195,6 +195,34 @@ func TestJobEndpoint_Deregister(t *testing.T) {
|
||||
if out != nil {
|
||||
t.Fatalf("unexpected job")
|
||||
}
|
||||
|
||||
// Lookup the evaluation
|
||||
eval, err := state.GetEvalByID(resp2.EvalID)
|
||||
if err != nil {
|
||||
t.Fatalf("err: %v", err)
|
||||
}
|
||||
if eval == nil {
|
||||
t.Fatalf("expected eval")
|
||||
}
|
||||
if eval.CreateIndex != resp2.EvalCreateIndex {
|
||||
t.Fatalf("index mis-match")
|
||||
}
|
||||
|
||||
if eval.Priority != structs.JobDefaultPriority {
|
||||
t.Fatalf("bad: %#v", eval)
|
||||
}
|
||||
if eval.Type != structs.JobTypeService {
|
||||
t.Fatalf("bad: %#v", eval)
|
||||
}
|
||||
if eval.TriggeredBy != structs.EvalTriggerJobDeregister {
|
||||
t.Fatalf("bad: %#v", eval)
|
||||
}
|
||||
if eval.JobID != job.ID {
|
||||
t.Fatalf("bad: %#v", eval)
|
||||
}
|
||||
if eval.JobModifyIndex != resp2.JobModifyIndex {
|
||||
t.Fatalf("bad: %#v", eval)
|
||||
}
|
||||
}
|
||||
|
||||
func TestJobEndpoint_GetJob(t *testing.T) {
|
||||
|
||||
@@ -218,6 +218,14 @@ type JobRegisterResponse struct {
|
||||
QueryMeta
|
||||
}
|
||||
|
||||
// JobDeregisterResponse is used to respond to a job deregistration
|
||||
type JobDeregisterResponse struct {
|
||||
EvalID string
|
||||
EvalCreateIndex uint64
|
||||
JobModifyIndex uint64
|
||||
QueryMeta
|
||||
}
|
||||
|
||||
// SingleNodeResponse is used to return a single node
|
||||
type SingleNodeResponse struct {
|
||||
Node *Node
|
||||
@@ -615,7 +623,8 @@ const (
|
||||
)
|
||||
|
||||
const (
|
||||
EvalTriggerJobRegister = "job-register"
|
||||
EvalTriggerJobRegister = "job-register"
|
||||
EvalTriggerJobDeregister = "job-deregister"
|
||||
)
|
||||
|
||||
// Evaluation is used anytime we need to apply business logic as a result
|
||||
|
||||
Reference in New Issue
Block a user