github.com/jmitchell/nomad@v0.1.3-0.20151007230021-7ab84c2862d8/nomad/state/state_store_test.go (about)

     1  package state
     2  
     3  import (
     4  	"os"
     5  	"reflect"
     6  	"sort"
     7  	"testing"
     8  
     9  	"github.com/hashicorp/nomad/nomad/mock"
    10  	"github.com/hashicorp/nomad/nomad/structs"
    11  )
    12  
    13  func testStateStore(t *testing.T) *StateStore {
    14  	state, err := NewStateStore(os.Stderr)
    15  	if err != nil {
    16  		t.Fatalf("err: %v", err)
    17  	}
    18  	if state == nil {
    19  		t.Fatalf("missing state")
    20  	}
    21  	return state
    22  }
    23  
    24  func TestStateStore_UpsertNode_Node(t *testing.T) {
    25  	state := testStateStore(t)
    26  	node := mock.Node()
    27  
    28  	err := state.UpsertNode(1000, node)
    29  	if err != nil {
    30  		t.Fatalf("err: %v", err)
    31  	}
    32  
    33  	out, err := state.NodeByID(node.ID)
    34  	if err != nil {
    35  		t.Fatalf("err: %v", err)
    36  	}
    37  
    38  	if !reflect.DeepEqual(node, out) {
    39  		t.Fatalf("bad: %#v %#v", node, out)
    40  	}
    41  
    42  	index, err := state.Index("nodes")
    43  	if err != nil {
    44  		t.Fatalf("err: %v", err)
    45  	}
    46  	if index != 1000 {
    47  		t.Fatalf("bad: %d", index)
    48  	}
    49  }
    50  
    51  func TestStateStore_DeleteNode_Node(t *testing.T) {
    52  	state := testStateStore(t)
    53  	node := mock.Node()
    54  
    55  	err := state.UpsertNode(1000, node)
    56  	if err != nil {
    57  		t.Fatalf("err: %v", err)
    58  	}
    59  
    60  	err = state.DeleteNode(1001, node.ID)
    61  	if err != nil {
    62  		t.Fatalf("err: %v", err)
    63  	}
    64  
    65  	out, err := state.NodeByID(node.ID)
    66  	if err != nil {
    67  		t.Fatalf("err: %v", err)
    68  	}
    69  
    70  	if out != nil {
    71  		t.Fatalf("bad: %#v %#v", node, out)
    72  	}
    73  
    74  	index, err := state.Index("nodes")
    75  	if err != nil {
    76  		t.Fatalf("err: %v", err)
    77  	}
    78  	if index != 1001 {
    79  		t.Fatalf("bad: %d", index)
    80  	}
    81  }
    82  
    83  func TestStateStore_UpdateNodeStatus_Node(t *testing.T) {
    84  	state := testStateStore(t)
    85  	node := mock.Node()
    86  
    87  	err := state.UpsertNode(1000, node)
    88  	if err != nil {
    89  		t.Fatalf("err: %v", err)
    90  	}
    91  
    92  	err = state.UpdateNodeStatus(1001, node.ID, structs.NodeStatusReady)
    93  	if err != nil {
    94  		t.Fatalf("err: %v", err)
    95  	}
    96  
    97  	out, err := state.NodeByID(node.ID)
    98  	if err != nil {
    99  		t.Fatalf("err: %v", err)
   100  	}
   101  
   102  	if out.Status != structs.NodeStatusReady {
   103  		t.Fatalf("bad: %#v", out)
   104  	}
   105  	if out.ModifyIndex != 1001 {
   106  		t.Fatalf("bad: %#v", out)
   107  	}
   108  
   109  	index, err := state.Index("nodes")
   110  	if err != nil {
   111  		t.Fatalf("err: %v", err)
   112  	}
   113  	if index != 1001 {
   114  		t.Fatalf("bad: %d", index)
   115  	}
   116  }
   117  
   118  func TestStateStore_UpdateNodeDrain_Node(t *testing.T) {
   119  	state := testStateStore(t)
   120  	node := mock.Node()
   121  
   122  	err := state.UpsertNode(1000, node)
   123  	if err != nil {
   124  		t.Fatalf("err: %v", err)
   125  	}
   126  
   127  	err = state.UpdateNodeDrain(1001, node.ID, true)
   128  	if err != nil {
   129  		t.Fatalf("err: %v", err)
   130  	}
   131  
   132  	out, err := state.NodeByID(node.ID)
   133  	if err != nil {
   134  		t.Fatalf("err: %v", err)
   135  	}
   136  
   137  	if !out.Drain {
   138  		t.Fatalf("bad: %#v", out)
   139  	}
   140  	if out.ModifyIndex != 1001 {
   141  		t.Fatalf("bad: %#v", out)
   142  	}
   143  
   144  	index, err := state.Index("nodes")
   145  	if err != nil {
   146  		t.Fatalf("err: %v", err)
   147  	}
   148  	if index != 1001 {
   149  		t.Fatalf("bad: %d", index)
   150  	}
   151  }
   152  
   153  func TestStateStore_Nodes(t *testing.T) {
   154  	state := testStateStore(t)
   155  	var nodes []*structs.Node
   156  
   157  	for i := 0; i < 10; i++ {
   158  		node := mock.Node()
   159  		nodes = append(nodes, node)
   160  
   161  		err := state.UpsertNode(1000+uint64(i), node)
   162  		if err != nil {
   163  			t.Fatalf("err: %v", err)
   164  		}
   165  	}
   166  
   167  	iter, err := state.Nodes()
   168  	if err != nil {
   169  		t.Fatalf("err: %v", err)
   170  	}
   171  
   172  	var out []*structs.Node
   173  	for {
   174  		raw := iter.Next()
   175  		if raw == nil {
   176  			break
   177  		}
   178  		out = append(out, raw.(*structs.Node))
   179  	}
   180  
   181  	sort.Sort(NodeIDSort(nodes))
   182  	sort.Sort(NodeIDSort(out))
   183  
   184  	if !reflect.DeepEqual(nodes, out) {
   185  		t.Fatalf("bad: %#v %#v", nodes, out)
   186  	}
   187  }
   188  
   189  func TestStateStore_RestoreNode(t *testing.T) {
   190  	state := testStateStore(t)
   191  
   192  	restore, err := state.Restore()
   193  	if err != nil {
   194  		t.Fatalf("err: %v", err)
   195  	}
   196  
   197  	node := mock.Node()
   198  	err = restore.NodeRestore(node)
   199  	if err != nil {
   200  		t.Fatalf("err: %v", err)
   201  	}
   202  
   203  	restore.Commit()
   204  
   205  	out, err := state.NodeByID(node.ID)
   206  	if err != nil {
   207  		t.Fatalf("err: %v", err)
   208  	}
   209  
   210  	if !reflect.DeepEqual(out, node) {
   211  		t.Fatalf("Bad: %#v %#v", out, node)
   212  	}
   213  }
   214  
   215  func TestStateStore_UpsertJob_Job(t *testing.T) {
   216  	state := testStateStore(t)
   217  	job := mock.Job()
   218  
   219  	err := state.UpsertJob(1000, job)
   220  	if err != nil {
   221  		t.Fatalf("err: %v", err)
   222  	}
   223  
   224  	out, err := state.JobByID(job.ID)
   225  	if err != nil {
   226  		t.Fatalf("err: %v", err)
   227  	}
   228  
   229  	if !reflect.DeepEqual(job, out) {
   230  		t.Fatalf("bad: %#v %#v", job, out)
   231  	}
   232  
   233  	index, err := state.Index("jobs")
   234  	if err != nil {
   235  		t.Fatalf("err: %v", err)
   236  	}
   237  	if index != 1000 {
   238  		t.Fatalf("bad: %d", index)
   239  	}
   240  }
   241  
   242  func TestStateStore_UpdateUpsertJob_Job(t *testing.T) {
   243  	state := testStateStore(t)
   244  	job := mock.Job()
   245  
   246  	err := state.UpsertJob(1000, job)
   247  	if err != nil {
   248  		t.Fatalf("err: %v", err)
   249  	}
   250  
   251  	job2 := mock.Job()
   252  	job2.ID = job.ID
   253  	err = state.UpsertJob(1001, job2)
   254  	if err != nil {
   255  		t.Fatalf("err: %v", err)
   256  	}
   257  
   258  	out, err := state.JobByID(job.ID)
   259  	if err != nil {
   260  		t.Fatalf("err: %v", err)
   261  	}
   262  
   263  	if !reflect.DeepEqual(job2, out) {
   264  		t.Fatalf("bad: %#v %#v", job2, out)
   265  	}
   266  
   267  	if out.CreateIndex != 1000 {
   268  		t.Fatalf("bad: %#v", out)
   269  	}
   270  	if out.ModifyIndex != 1001 {
   271  		t.Fatalf("bad: %#v", out)
   272  	}
   273  
   274  	index, err := state.Index("jobs")
   275  	if err != nil {
   276  		t.Fatalf("err: %v", err)
   277  	}
   278  	if index != 1001 {
   279  		t.Fatalf("bad: %d", index)
   280  	}
   281  }
   282  
   283  func TestStateStore_DeleteJob_Job(t *testing.T) {
   284  	state := testStateStore(t)
   285  	job := mock.Job()
   286  
   287  	err := state.UpsertJob(1000, job)
   288  	if err != nil {
   289  		t.Fatalf("err: %v", err)
   290  	}
   291  
   292  	err = state.DeleteJob(1001, job.ID)
   293  	if err != nil {
   294  		t.Fatalf("err: %v", err)
   295  	}
   296  
   297  	out, err := state.JobByID(job.ID)
   298  	if err != nil {
   299  		t.Fatalf("err: %v", err)
   300  	}
   301  
   302  	if out != nil {
   303  		t.Fatalf("bad: %#v %#v", job, out)
   304  	}
   305  
   306  	index, err := state.Index("jobs")
   307  	if err != nil {
   308  		t.Fatalf("err: %v", err)
   309  	}
   310  	if index != 1001 {
   311  		t.Fatalf("bad: %d", index)
   312  	}
   313  }
   314  
   315  func TestStateStore_Jobs(t *testing.T) {
   316  	state := testStateStore(t)
   317  	var jobs []*structs.Job
   318  
   319  	for i := 0; i < 10; i++ {
   320  		job := mock.Job()
   321  		jobs = append(jobs, job)
   322  
   323  		err := state.UpsertJob(1000+uint64(i), job)
   324  		if err != nil {
   325  			t.Fatalf("err: %v", err)
   326  		}
   327  	}
   328  
   329  	iter, err := state.Jobs()
   330  	if err != nil {
   331  		t.Fatalf("err: %v", err)
   332  	}
   333  
   334  	var out []*structs.Job
   335  	for {
   336  		raw := iter.Next()
   337  		if raw == nil {
   338  			break
   339  		}
   340  		out = append(out, raw.(*structs.Job))
   341  	}
   342  
   343  	sort.Sort(JobIDSort(jobs))
   344  	sort.Sort(JobIDSort(out))
   345  
   346  	if !reflect.DeepEqual(jobs, out) {
   347  		t.Fatalf("bad: %#v %#v", jobs, out)
   348  	}
   349  }
   350  
   351  func TestStateStore_RestoreJob(t *testing.T) {
   352  	state := testStateStore(t)
   353  
   354  	restore, err := state.Restore()
   355  	if err != nil {
   356  		t.Fatalf("err: %v", err)
   357  	}
   358  
   359  	job := mock.Job()
   360  	err = restore.JobRestore(job)
   361  	if err != nil {
   362  		t.Fatalf("err: %v", err)
   363  	}
   364  
   365  	restore.Commit()
   366  
   367  	out, err := state.JobByID(job.ID)
   368  	if err != nil {
   369  		t.Fatalf("err: %v", err)
   370  	}
   371  
   372  	if !reflect.DeepEqual(out, job) {
   373  		t.Fatalf("Bad: %#v %#v", out, job)
   374  	}
   375  }
   376  
   377  func TestStateStore_Indexes(t *testing.T) {
   378  	state := testStateStore(t)
   379  	node := mock.Node()
   380  
   381  	err := state.UpsertNode(1000, node)
   382  	if err != nil {
   383  		t.Fatalf("err: %v", err)
   384  	}
   385  
   386  	iter, err := state.Indexes()
   387  	if err != nil {
   388  		t.Fatalf("err: %v", err)
   389  	}
   390  
   391  	var out []*IndexEntry
   392  	for {
   393  		raw := iter.Next()
   394  		if raw == nil {
   395  			break
   396  		}
   397  		out = append(out, raw.(*IndexEntry))
   398  	}
   399  
   400  	expect := []*IndexEntry{
   401  		&IndexEntry{"nodes", 1000},
   402  	}
   403  
   404  	if !reflect.DeepEqual(expect, out) {
   405  		t.Fatalf("bad: %#v %#v", expect, out)
   406  	}
   407  }
   408  
   409  func TestStateStore_RestoreIndex(t *testing.T) {
   410  	state := testStateStore(t)
   411  
   412  	restore, err := state.Restore()
   413  	if err != nil {
   414  		t.Fatalf("err: %v", err)
   415  	}
   416  
   417  	index := &IndexEntry{"jobs", 1000}
   418  	err = restore.IndexRestore(index)
   419  	if err != nil {
   420  		t.Fatalf("err: %v", err)
   421  	}
   422  
   423  	restore.Commit()
   424  
   425  	out, err := state.Index("jobs")
   426  	if err != nil {
   427  		t.Fatalf("err: %v", err)
   428  	}
   429  
   430  	if out != 1000 {
   431  		t.Fatalf("Bad: %#v %#v", out, 1000)
   432  	}
   433  }
   434  
   435  func TestStateStore_UpsertEvals_Eval(t *testing.T) {
   436  	state := testStateStore(t)
   437  	eval := mock.Eval()
   438  
   439  	err := state.UpsertEvals(1000, []*structs.Evaluation{eval})
   440  	if err != nil {
   441  		t.Fatalf("err: %v", err)
   442  	}
   443  
   444  	out, err := state.EvalByID(eval.ID)
   445  	if err != nil {
   446  		t.Fatalf("err: %v", err)
   447  	}
   448  
   449  	if !reflect.DeepEqual(eval, out) {
   450  		t.Fatalf("bad: %#v %#v", eval, out)
   451  	}
   452  
   453  	index, err := state.Index("evals")
   454  	if err != nil {
   455  		t.Fatalf("err: %v", err)
   456  	}
   457  	if index != 1000 {
   458  		t.Fatalf("bad: %d", index)
   459  	}
   460  }
   461  
   462  func TestStateStore_Update_UpsertEvals_Eval(t *testing.T) {
   463  	state := testStateStore(t)
   464  	eval := mock.Eval()
   465  
   466  	err := state.UpsertEvals(1000, []*structs.Evaluation{eval})
   467  	if err != nil {
   468  		t.Fatalf("err: %v", err)
   469  	}
   470  
   471  	eval2 := mock.Eval()
   472  	eval2.ID = eval.ID
   473  	err = state.UpsertEvals(1001, []*structs.Evaluation{eval2})
   474  	if err != nil {
   475  		t.Fatalf("err: %v", err)
   476  	}
   477  
   478  	out, err := state.EvalByID(eval.ID)
   479  	if err != nil {
   480  		t.Fatalf("err: %v", err)
   481  	}
   482  
   483  	if !reflect.DeepEqual(eval2, out) {
   484  		t.Fatalf("bad: %#v %#v", eval2, out)
   485  	}
   486  
   487  	if out.CreateIndex != 1000 {
   488  		t.Fatalf("bad: %#v", out)
   489  	}
   490  	if out.ModifyIndex != 1001 {
   491  		t.Fatalf("bad: %#v", out)
   492  	}
   493  
   494  	index, err := state.Index("evals")
   495  	if err != nil {
   496  		t.Fatalf("err: %v", err)
   497  	}
   498  	if index != 1001 {
   499  		t.Fatalf("bad: %d", index)
   500  	}
   501  }
   502  
   503  func TestStateStore_DeleteEval_Eval(t *testing.T) {
   504  	state := testStateStore(t)
   505  	eval := mock.Eval()
   506  	eval2 := mock.Eval()
   507  	alloc := mock.Alloc()
   508  	alloc2 := mock.Alloc()
   509  
   510  	err := state.UpsertEvals(1000, []*structs.Evaluation{eval, eval2})
   511  	if err != nil {
   512  		t.Fatalf("err: %v", err)
   513  	}
   514  
   515  	err = state.UpsertAllocs(1001, []*structs.Allocation{alloc, alloc2})
   516  	if err != nil {
   517  		t.Fatalf("err: %v", err)
   518  	}
   519  
   520  	notify1 := make(chan struct{}, 1)
   521  	state.WatchAllocs(alloc.NodeID, notify1)
   522  
   523  	err = state.DeleteEval(1002, []string{eval.ID, eval2.ID}, []string{alloc.ID, alloc2.ID})
   524  	if err != nil {
   525  		t.Fatalf("err: %v", err)
   526  	}
   527  
   528  	out, err := state.EvalByID(eval.ID)
   529  	if err != nil {
   530  		t.Fatalf("err: %v", err)
   531  	}
   532  
   533  	if out != nil {
   534  		t.Fatalf("bad: %#v %#v", eval, out)
   535  	}
   536  
   537  	out, err = state.EvalByID(eval2.ID)
   538  	if err != nil {
   539  		t.Fatalf("err: %v", err)
   540  	}
   541  
   542  	if out != nil {
   543  		t.Fatalf("bad: %#v %#v", eval, out)
   544  	}
   545  
   546  	outA, err := state.AllocByID(alloc.ID)
   547  	if err != nil {
   548  		t.Fatalf("err: %v", err)
   549  	}
   550  
   551  	if out != nil {
   552  		t.Fatalf("bad: %#v %#v", alloc, outA)
   553  	}
   554  
   555  	outA, err = state.AllocByID(alloc2.ID)
   556  	if err != nil {
   557  		t.Fatalf("err: %v", err)
   558  	}
   559  
   560  	if out != nil {
   561  		t.Fatalf("bad: %#v %#v", alloc, outA)
   562  	}
   563  
   564  	index, err := state.Index("evals")
   565  	if err != nil {
   566  		t.Fatalf("err: %v", err)
   567  	}
   568  	if index != 1002 {
   569  		t.Fatalf("bad: %d", index)
   570  	}
   571  
   572  	index, err = state.Index("allocs")
   573  	if err != nil {
   574  		t.Fatalf("err: %v", err)
   575  	}
   576  	if index != 1002 {
   577  		t.Fatalf("bad: %d", index)
   578  	}
   579  
   580  	select {
   581  	case <-notify1:
   582  	default:
   583  		t.Fatalf("should be notified")
   584  	}
   585  }
   586  
   587  func TestStateStore_EvalsByJob(t *testing.T) {
   588  	state := testStateStore(t)
   589  
   590  	eval1 := mock.Eval()
   591  	eval2 := mock.Eval()
   592  	eval2.JobID = eval1.JobID
   593  	eval3 := mock.Eval()
   594  	evals := []*structs.Evaluation{eval1, eval2}
   595  
   596  	err := state.UpsertEvals(1000, evals)
   597  	if err != nil {
   598  		t.Fatalf("err: %v", err)
   599  	}
   600  	err = state.UpsertEvals(1001, []*structs.Evaluation{eval3})
   601  	if err != nil {
   602  		t.Fatalf("err: %v", err)
   603  	}
   604  
   605  	out, err := state.EvalsByJob(eval1.JobID)
   606  	if err != nil {
   607  		t.Fatalf("err: %v", err)
   608  	}
   609  
   610  	sort.Sort(EvalIDSort(evals))
   611  	sort.Sort(EvalIDSort(out))
   612  
   613  	if !reflect.DeepEqual(evals, out) {
   614  		t.Fatalf("bad: %#v %#v", evals, out)
   615  	}
   616  }
   617  
   618  func TestStateStore_Evals(t *testing.T) {
   619  	state := testStateStore(t)
   620  	var evals []*structs.Evaluation
   621  
   622  	for i := 0; i < 10; i++ {
   623  		eval := mock.Eval()
   624  		evals = append(evals, eval)
   625  
   626  		err := state.UpsertEvals(1000+uint64(i), []*structs.Evaluation{eval})
   627  		if err != nil {
   628  			t.Fatalf("err: %v", err)
   629  		}
   630  	}
   631  
   632  	iter, err := state.Evals()
   633  	if err != nil {
   634  		t.Fatalf("err: %v", err)
   635  	}
   636  
   637  	var out []*structs.Evaluation
   638  	for {
   639  		raw := iter.Next()
   640  		if raw == nil {
   641  			break
   642  		}
   643  		out = append(out, raw.(*structs.Evaluation))
   644  	}
   645  
   646  	sort.Sort(EvalIDSort(evals))
   647  	sort.Sort(EvalIDSort(out))
   648  
   649  	if !reflect.DeepEqual(evals, out) {
   650  		t.Fatalf("bad: %#v %#v", evals, out)
   651  	}
   652  }
   653  
   654  func TestStateStore_RestoreEval(t *testing.T) {
   655  	state := testStateStore(t)
   656  
   657  	restore, err := state.Restore()
   658  	if err != nil {
   659  		t.Fatalf("err: %v", err)
   660  	}
   661  
   662  	job := mock.Eval()
   663  	err = restore.EvalRestore(job)
   664  	if err != nil {
   665  		t.Fatalf("err: %v", err)
   666  	}
   667  
   668  	restore.Commit()
   669  
   670  	out, err := state.EvalByID(job.ID)
   671  	if err != nil {
   672  		t.Fatalf("err: %v", err)
   673  	}
   674  
   675  	if !reflect.DeepEqual(out, job) {
   676  		t.Fatalf("Bad: %#v %#v", out, job)
   677  	}
   678  }
   679  
   680  func TestStateStore_UpdateAllocFromClient(t *testing.T) {
   681  	state := testStateStore(t)
   682  
   683  	alloc := mock.Alloc()
   684  	err := state.UpsertAllocs(1000, []*structs.Allocation{alloc})
   685  	if err != nil {
   686  		t.Fatalf("err: %v", err)
   687  	}
   688  
   689  	update := new(structs.Allocation)
   690  	*update = *alloc
   691  	update.ClientStatus = structs.AllocClientStatusFailed
   692  
   693  	err = state.UpdateAllocFromClient(1001, update)
   694  	if err != nil {
   695  		t.Fatalf("err: %v", err)
   696  	}
   697  
   698  	out, err := state.AllocByID(alloc.ID)
   699  	if err != nil {
   700  		t.Fatalf("err: %v", err)
   701  	}
   702  
   703  	update.ModifyIndex = 1001
   704  	if !reflect.DeepEqual(update, out) {
   705  		t.Fatalf("bad: %#v %#v", update, out)
   706  	}
   707  
   708  	index, err := state.Index("allocs")
   709  	if err != nil {
   710  		t.Fatalf("err: %v", err)
   711  	}
   712  	if index != 1001 {
   713  		t.Fatalf("bad: %d", index)
   714  	}
   715  }
   716  
   717  func TestStateStore_UpsertAlloc_Alloc(t *testing.T) {
   718  	state := testStateStore(t)
   719  
   720  	alloc := mock.Alloc()
   721  	err := state.UpsertAllocs(1000, []*structs.Allocation{alloc})
   722  	if err != nil {
   723  		t.Fatalf("err: %v", err)
   724  	}
   725  
   726  	out, err := state.AllocByID(alloc.ID)
   727  	if err != nil {
   728  		t.Fatalf("err: %v", err)
   729  	}
   730  
   731  	if !reflect.DeepEqual(alloc, out) {
   732  		t.Fatalf("bad: %#v %#v", alloc, out)
   733  	}
   734  
   735  	index, err := state.Index("allocs")
   736  	if err != nil {
   737  		t.Fatalf("err: %v", err)
   738  	}
   739  	if index != 1000 {
   740  		t.Fatalf("bad: %d", index)
   741  	}
   742  }
   743  
   744  func TestStateStore_WatchAllocs(t *testing.T) {
   745  	state := testStateStore(t)
   746  
   747  	notify1 := make(chan struct{}, 1)
   748  	notify2 := make(chan struct{}, 1)
   749  	state.WatchAllocs("foo", notify1)
   750  	state.WatchAllocs("foo", notify2)
   751  	state.StopWatchAllocs("foo", notify2)
   752  
   753  	alloc := mock.Alloc()
   754  	alloc.NodeID = "foo"
   755  	err := state.UpsertAllocs(1000, []*structs.Allocation{alloc})
   756  	if err != nil {
   757  		t.Fatalf("err: %v", err)
   758  	}
   759  
   760  	select {
   761  	case <-notify1:
   762  	default:
   763  		t.Fatalf("should be notified")
   764  	}
   765  
   766  	select {
   767  	case <-notify2:
   768  		t.Fatalf("should not be notified")
   769  	default:
   770  	}
   771  }
   772  
   773  func TestStateStore_UpdateAlloc_Alloc(t *testing.T) {
   774  	state := testStateStore(t)
   775  	alloc := mock.Alloc()
   776  
   777  	err := state.UpsertAllocs(1000, []*structs.Allocation{alloc})
   778  	if err != nil {
   779  		t.Fatalf("err: %v", err)
   780  	}
   781  
   782  	alloc2 := mock.Alloc()
   783  	alloc2.ID = alloc.ID
   784  	alloc2.NodeID = alloc.NodeID + ".new"
   785  	err = state.UpsertAllocs(1001, []*structs.Allocation{alloc2})
   786  	if err != nil {
   787  		t.Fatalf("err: %v", err)
   788  	}
   789  
   790  	out, err := state.AllocByID(alloc.ID)
   791  	if err != nil {
   792  		t.Fatalf("err: %v", err)
   793  	}
   794  
   795  	if !reflect.DeepEqual(alloc2, out) {
   796  		t.Fatalf("bad: %#v %#v", alloc2, out)
   797  	}
   798  
   799  	if out.CreateIndex != 1000 {
   800  		t.Fatalf("bad: %#v", out)
   801  	}
   802  	if out.ModifyIndex != 1001 {
   803  		t.Fatalf("bad: %#v", out)
   804  	}
   805  
   806  	index, err := state.Index("allocs")
   807  	if err != nil {
   808  		t.Fatalf("err: %v", err)
   809  	}
   810  	if index != 1001 {
   811  		t.Fatalf("bad: %d", index)
   812  	}
   813  }
   814  
   815  func TestStateStore_EvictAlloc_Alloc(t *testing.T) {
   816  	state := testStateStore(t)
   817  	alloc := mock.Alloc()
   818  
   819  	err := state.UpsertAllocs(1000, []*structs.Allocation{alloc})
   820  	if err != nil {
   821  		t.Fatalf("err: %v", err)
   822  	}
   823  
   824  	alloc2 := new(structs.Allocation)
   825  	*alloc2 = *alloc
   826  	alloc2.DesiredStatus = structs.AllocDesiredStatusEvict
   827  	err = state.UpsertAllocs(1001, []*structs.Allocation{alloc2})
   828  	if err != nil {
   829  		t.Fatalf("err: %v", err)
   830  	}
   831  
   832  	out, err := state.AllocByID(alloc.ID)
   833  	if err != nil {
   834  		t.Fatalf("err: %v", err)
   835  	}
   836  
   837  	if out.DesiredStatus != structs.AllocDesiredStatusEvict {
   838  		t.Fatalf("bad: %#v %#v", alloc, out)
   839  	}
   840  
   841  	index, err := state.Index("allocs")
   842  	if err != nil {
   843  		t.Fatalf("err: %v", err)
   844  	}
   845  	if index != 1001 {
   846  		t.Fatalf("bad: %d", index)
   847  	}
   848  }
   849  
   850  func TestStateStore_AllocsByNode(t *testing.T) {
   851  	state := testStateStore(t)
   852  	var allocs []*structs.Allocation
   853  
   854  	for i := 0; i < 10; i++ {
   855  		alloc := mock.Alloc()
   856  		alloc.NodeID = "foo"
   857  		allocs = append(allocs, alloc)
   858  	}
   859  
   860  	err := state.UpsertAllocs(1000, allocs)
   861  	if err != nil {
   862  		t.Fatalf("err: %v", err)
   863  	}
   864  
   865  	out, err := state.AllocsByNode("foo")
   866  	if err != nil {
   867  		t.Fatalf("err: %v", err)
   868  	}
   869  
   870  	sort.Sort(AllocIDSort(allocs))
   871  	sort.Sort(AllocIDSort(out))
   872  
   873  	if !reflect.DeepEqual(allocs, out) {
   874  		t.Fatalf("bad: %#v %#v", allocs, out)
   875  	}
   876  }
   877  
   878  func TestStateStore_AllocsByJob(t *testing.T) {
   879  	state := testStateStore(t)
   880  	var allocs []*structs.Allocation
   881  
   882  	for i := 0; i < 10; i++ {
   883  		alloc := mock.Alloc()
   884  		alloc.JobID = "foo"
   885  		allocs = append(allocs, alloc)
   886  	}
   887  
   888  	err := state.UpsertAllocs(1000, allocs)
   889  	if err != nil {
   890  		t.Fatalf("err: %v", err)
   891  	}
   892  
   893  	out, err := state.AllocsByJob("foo")
   894  	if err != nil {
   895  		t.Fatalf("err: %v", err)
   896  	}
   897  
   898  	sort.Sort(AllocIDSort(allocs))
   899  	sort.Sort(AllocIDSort(out))
   900  
   901  	if !reflect.DeepEqual(allocs, out) {
   902  		t.Fatalf("bad: %#v %#v", allocs, out)
   903  	}
   904  }
   905  
   906  func TestStateStore_Allocs(t *testing.T) {
   907  	state := testStateStore(t)
   908  	var allocs []*structs.Allocation
   909  
   910  	for i := 0; i < 10; i++ {
   911  		alloc := mock.Alloc()
   912  		allocs = append(allocs, alloc)
   913  	}
   914  
   915  	err := state.UpsertAllocs(1000, allocs)
   916  	if err != nil {
   917  		t.Fatalf("err: %v", err)
   918  	}
   919  
   920  	iter, err := state.Allocs()
   921  	if err != nil {
   922  		t.Fatalf("err: %v", err)
   923  	}
   924  
   925  	var out []*structs.Allocation
   926  	for {
   927  		raw := iter.Next()
   928  		if raw == nil {
   929  			break
   930  		}
   931  		out = append(out, raw.(*structs.Allocation))
   932  	}
   933  
   934  	sort.Sort(AllocIDSort(allocs))
   935  	sort.Sort(AllocIDSort(out))
   936  
   937  	if !reflect.DeepEqual(allocs, out) {
   938  		t.Fatalf("bad: %#v %#v", allocs, out)
   939  	}
   940  }
   941  
   942  func TestStateStore_RestoreAlloc(t *testing.T) {
   943  	state := testStateStore(t)
   944  
   945  	restore, err := state.Restore()
   946  	if err != nil {
   947  		t.Fatalf("err: %v", err)
   948  	}
   949  
   950  	alloc := mock.Alloc()
   951  	err = restore.AllocRestore(alloc)
   952  	if err != nil {
   953  		t.Fatalf("err: %v", err)
   954  	}
   955  
   956  	restore.Commit()
   957  
   958  	out, err := state.AllocByID(alloc.ID)
   959  	if err != nil {
   960  		t.Fatalf("err: %v", err)
   961  	}
   962  
   963  	if !reflect.DeepEqual(out, alloc) {
   964  		t.Fatalf("Bad: %#v %#v", out, alloc)
   965  	}
   966  }
   967  
   968  // NodeIDSort is used to sort nodes by ID
   969  type NodeIDSort []*structs.Node
   970  
   971  func (n NodeIDSort) Len() int {
   972  	return len(n)
   973  }
   974  
   975  func (n NodeIDSort) Less(i, j int) bool {
   976  	return n[i].ID < n[j].ID
   977  }
   978  
   979  func (n NodeIDSort) Swap(i, j int) {
   980  	n[i], n[j] = n[j], n[i]
   981  }
   982  
   983  // JobIDis used to sort jobs by id
   984  type JobIDSort []*structs.Job
   985  
   986  func (n JobIDSort) Len() int {
   987  	return len(n)
   988  }
   989  
   990  func (n JobIDSort) Less(i, j int) bool {
   991  	return n[i].ID < n[j].ID
   992  }
   993  
   994  func (n JobIDSort) Swap(i, j int) {
   995  	n[i], n[j] = n[j], n[i]
   996  }
   997  
   998  // EvalIDis used to sort evals by id
   999  type EvalIDSort []*structs.Evaluation
  1000  
  1001  func (n EvalIDSort) Len() int {
  1002  	return len(n)
  1003  }
  1004  
  1005  func (n EvalIDSort) Less(i, j int) bool {
  1006  	return n[i].ID < n[j].ID
  1007  }
  1008  
  1009  func (n EvalIDSort) Swap(i, j int) {
  1010  	n[i], n[j] = n[j], n[i]
  1011  }
  1012  
  1013  // AllocIDsort used to sort allocations by id
  1014  type AllocIDSort []*structs.Allocation
  1015  
  1016  func (n AllocIDSort) Len() int {
  1017  	return len(n)
  1018  }
  1019  
  1020  func (n AllocIDSort) Less(i, j int) bool {
  1021  	return n[i].ID < n[j].ID
  1022  }
  1023  
  1024  func (n AllocIDSort) Swap(i, j int) {
  1025  	n[i], n[j] = n[j], n[i]
  1026  }