Skip to content

Commit

Permalink
Merge pull request #981 from hashicorp/f-eval-force
Browse files Browse the repository at this point in the history
Deregister creates an eval for a job even if it doesn't exist
  • Loading branch information
dadgar committed Mar 25, 2016
2 parents b253416 + 3698bca commit 9e7d0d9
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 6 deletions.
5 changes: 3 additions & 2 deletions api/jobs_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -266,8 +266,9 @@ func TestJobs_Deregister(t *testing.T) {
assertWriteMeta(t, wm)

// Attempting delete on non-existing job returns an error
if _, _, err = jobs.Deregister("nope", nil); err == nil {
t.Fatalf("expected error deregistering job")
if _, _, err = jobs.Deregister("nope", nil); err != nil {
t.Fatalf("unexpected error deregistering job: %v", err)

}

// Deleting an existing job works
Expand Down
5 changes: 1 addition & 4 deletions nomad/job_endpoint.go
Original file line number Diff line number Diff line change
Expand Up @@ -164,9 +164,6 @@ func (j *Job) Deregister(args *structs.JobDeregisterRequest, reply *structs.JobD
if err != nil {
return err
}
if job == nil {
return fmt.Errorf("job not found")
}

// Commit this update via Raft
_, index, err := j.srv.raftApply(structs.JobDeregisterRequestType, args)
Expand All @@ -179,7 +176,7 @@ func (j *Job) Deregister(args *structs.JobDeregisterRequest, reply *structs.JobD
reply.JobModifyIndex = index

// If the job is periodic, we don't create an eval.
if job.IsPeriodic() {
if job != nil && job.IsPeriodic() {
return nil
}

Expand Down
55 changes: 55 additions & 0 deletions nomad/job_endpoint_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -401,6 +401,61 @@ func TestJobEndpoint_Deregister(t *testing.T) {
}
}

func TestJobEndpoint_Deregister_NonExistent(t *testing.T) {
s1 := testServer(t, func(c *Config) {
c.NumSchedulers = 0 // Prevent automatic dequeue
})
defer s1.Shutdown()
codec := rpcClient(t, s1)
testutil.WaitForLeader(t, s1.RPC)

// Deregister
jobID := "foo"
dereg := &structs.JobDeregisterRequest{
JobID: jobID,
WriteRequest: structs.WriteRequest{Region: "global"},
}
var resp2 structs.JobDeregisterResponse
if err := msgpackrpc.CallWithCodec(codec, "Job.Deregister", dereg, &resp2); err != nil {
t.Fatalf("err: %v", err)
}
if resp2.JobModifyIndex == 0 {
t.Fatalf("bad index: %d", resp2.Index)
}

// Lookup the evaluation
state := s1.fsm.State()
eval, err := state.EvalByID(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 != jobID {
t.Fatalf("bad: %#v", eval)
}
if eval.JobModifyIndex != resp2.JobModifyIndex {
t.Fatalf("bad: %#v", eval)
}
if eval.Status != structs.EvalStatusPending {
t.Fatalf("bad: %#v", eval)
}
}

func TestJobEndpoint_Deregister_Periodic(t *testing.T) {
s1 := testServer(t, func(c *Config) {
c.NumSchedulers = 0 // Prevent automatic dequeue
Expand Down

0 comments on commit 9e7d0d9

Please sign in to comment.