github.com/huiliang/nomad@v0.2.1-0.20151124023127-7a8b664699ff/nomad/core_sched_test.go (about) 1 package nomad 2 3 import ( 4 "testing" 5 "time" 6 7 "github.com/hashicorp/nomad/nomad/mock" 8 "github.com/hashicorp/nomad/nomad/structs" 9 "github.com/hashicorp/nomad/testutil" 10 ) 11 12 func TestCoreScheduler_EvalGC(t *testing.T) { 13 s1 := testServer(t, nil) 14 defer s1.Shutdown() 15 testutil.WaitForLeader(t, s1.RPC) 16 17 // Insert "dead" eval 18 state := s1.fsm.State() 19 eval := mock.Eval() 20 eval.Status = structs.EvalStatusFailed 21 err := state.UpsertEvals(1000, []*structs.Evaluation{eval}) 22 if err != nil { 23 t.Fatalf("err: %v", err) 24 } 25 26 // Insert "dead" alloc 27 alloc := mock.Alloc() 28 alloc.EvalID = eval.ID 29 alloc.DesiredStatus = structs.AllocDesiredStatusFailed 30 err = state.UpsertAllocs(1001, []*structs.Allocation{alloc}) 31 if err != nil { 32 t.Fatalf("err: %v", err) 33 } 34 35 // Update the time tables to make this work 36 tt := s1.fsm.TimeTable() 37 tt.Witness(2000, time.Now().UTC().Add(-1*s1.config.EvalGCThreshold)) 38 39 // Create a core scheduler 40 snap, err := state.Snapshot() 41 if err != nil { 42 t.Fatalf("err: %v", err) 43 } 44 core := NewCoreScheduler(s1, snap) 45 46 // Attempt the GC 47 gc := s1.coreJobEval(structs.CoreJobEvalGC) 48 gc.ModifyIndex = 2000 49 err = core.Process(gc) 50 if err != nil { 51 t.Fatalf("err: %v", err) 52 } 53 54 // Should be gone 55 out, err := state.EvalByID(eval.ID) 56 if err != nil { 57 t.Fatalf("err: %v", err) 58 } 59 if out != nil { 60 t.Fatalf("bad: %v", out) 61 } 62 63 outA, err := state.AllocByID(alloc.ID) 64 if err != nil { 65 t.Fatalf("err: %v", err) 66 } 67 if outA != nil { 68 t.Fatalf("bad: %v", outA) 69 } 70 } 71 72 func TestCoreScheduler_NodeGC(t *testing.T) { 73 s1 := testServer(t, nil) 74 defer s1.Shutdown() 75 testutil.WaitForLeader(t, s1.RPC) 76 77 // Insert "dead" node 78 state := s1.fsm.State() 79 node := mock.Node() 80 node.Status = structs.NodeStatusDown 81 err := state.UpsertNode(1000, node) 82 if err != nil { 83 t.Fatalf("err: %v", err) 84 } 85 86 // Update the time tables to make this work 87 tt := s1.fsm.TimeTable() 88 tt.Witness(2000, time.Now().UTC().Add(-1*s1.config.NodeGCThreshold)) 89 90 // Create a core scheduler 91 snap, err := state.Snapshot() 92 if err != nil { 93 t.Fatalf("err: %v", err) 94 } 95 core := NewCoreScheduler(s1, snap) 96 97 // Attempt the GC 98 gc := s1.coreJobEval(structs.CoreJobNodeGC) 99 gc.ModifyIndex = 2000 100 err = core.Process(gc) 101 if err != nil { 102 t.Fatalf("err: %v", err) 103 } 104 105 // Should be gone 106 out, err := state.NodeByID(node.ID) 107 if err != nil { 108 t.Fatalf("err: %v", err) 109 } 110 if out != nil { 111 t.Fatalf("bad: %v", out) 112 } 113 }