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 }