github.com/kardianos/nomad@v0.1.3-0.20151022182107-b13df73ee850/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  }