| OLD | NEW |
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright 2014 The LUCI Authors. All rights reserved. | 2 # Copyright 2014 The LUCI Authors. All rights reserved. |
| 3 # Use of this source code is governed under the Apache License, Version 2.0 | 3 # Use of this source code is governed under the Apache License, Version 2.0 |
| 4 # that can be found in the LICENSE file. | 4 # that can be found in the LICENSE file. |
| 5 | 5 |
| 6 import datetime | 6 import datetime |
| 7 import logging | 7 import logging |
| 8 import os | 8 import os |
| 9 import random | 9 import random |
| 10 import sys | 10 import sys |
| (...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 265 bot_dimensions, 'localhost', 'abc', None) | 265 bot_dimensions, 'localhost', 'abc', None) |
| 266 self.assertEqual(request, actual_request) | 266 self.assertEqual(request, actual_request) |
| 267 self.assertEqual('localhost', run_result.bot_id) | 267 self.assertEqual('localhost', run_result.bot_id) |
| 268 self.assertEqual(None, task_to_run.TaskToRun.query().get().queue_number) | 268 self.assertEqual(None, task_to_run.TaskToRun.query().get().queue_number) |
| 269 # It's important to terminate the task with success. | 269 # It's important to terminate the task with success. |
| 270 self.assertEqual( | 270 self.assertEqual( |
| 271 task_result.State.COMPLETED, | 271 task_result.State.COMPLETED, |
| 272 task_scheduler.bot_update_task( | 272 task_scheduler.bot_update_task( |
| 273 run_result_key=run_result.key, | 273 run_result_key=run_result.key, |
| 274 bot_id='localhost', | 274 bot_id='localhost', |
| 275 cipd_pins=None, |
| 275 output='Foo1', | 276 output='Foo1', |
| 276 output_chunk_start=0, | 277 output_chunk_start=0, |
| 277 exit_code=0, | 278 exit_code=0, |
| 278 duration=0.1, | 279 duration=0.1, |
| 279 hard_timeout=False, | 280 hard_timeout=False, |
| 280 io_timeout=False, | 281 io_timeout=False, |
| 281 cost_usd=0.1, | 282 cost_usd=0.1, |
| 282 outputs_ref=None, | 283 outputs_ref=None, |
| 283 performance_stats=None)) | 284 performance_stats=None)) |
| 284 return unicode(run_result.task_id) | 285 return unicode(run_result.task_id) |
| (...skipping 18 matching lines...) Expand all Loading... |
| 303 self.assertEqual(None, task_to_run.TaskToRun.query().get().queue_number) | 304 self.assertEqual(None, task_to_run.TaskToRun.query().get().queue_number) |
| 304 actual_request_2, run_result_2 = task_scheduler.bot_reap_task( | 305 actual_request_2, run_result_2 = task_scheduler.bot_reap_task( |
| 305 bot_dimensions, 'localhost', 'abc', None) | 306 bot_dimensions, 'localhost', 'abc', None) |
| 306 self.assertEqual(None, actual_request_2) | 307 self.assertEqual(None, actual_request_2) |
| 307 result_summary_duped, run_results_duped = get_results(request.key) | 308 result_summary_duped, run_results_duped = get_results(request.key) |
| 308 expected = { | 309 expected = { |
| 309 'abandoned_ts': None, | 310 'abandoned_ts': None, |
| 310 'bot_dimensions': bot_dimensions, | 311 'bot_dimensions': bot_dimensions, |
| 311 'bot_id': u'localhost', | 312 'bot_id': u'localhost', |
| 312 'bot_version': u'abc', | 313 'bot_version': u'abc', |
| 314 'cipd_pins': None, |
| 313 'children_task_ids': [], | 315 'children_task_ids': [], |
| 314 'completed_ts': now or self.now, | 316 'completed_ts': now or self.now, |
| 315 'costs_usd': [], | 317 'costs_usd': [], |
| 316 'cost_saved_usd': 0.1, | 318 'cost_saved_usd': 0.1, |
| 317 'created_ts': new_ts, | 319 'created_ts': new_ts, |
| 318 'deduped_from': deduped_from, | 320 'deduped_from': deduped_from, |
| 319 'duration': 0.1, | 321 'duration': 0.1, |
| 320 'exit_code': 0, | 322 'exit_code': 0, |
| 321 'failure': False, | 323 'failure': False, |
| 322 'id': task_id, | 324 'id': task_id, |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 463 bot_dimensions, 'localhost', 'abc', None) | 465 bot_dimensions, 'localhost', 'abc', None) |
| 464 self.assertEqual(request, actual_request) | 466 self.assertEqual(request, actual_request) |
| 465 self.assertEqual('localhost', run_result.bot_id) | 467 self.assertEqual('localhost', run_result.bot_id) |
| 466 self.assertEqual(None, task_to_run.TaskToRun.query().get().queue_number) | 468 self.assertEqual(None, task_to_run.TaskToRun.query().get().queue_number) |
| 467 # It's important to terminate the task with success. | 469 # It's important to terminate the task with success. |
| 468 self.assertEqual( | 470 self.assertEqual( |
| 469 task_result.State.COMPLETED, | 471 task_result.State.COMPLETED, |
| 470 task_scheduler.bot_update_task( | 472 task_scheduler.bot_update_task( |
| 471 run_result_key=run_result.key, | 473 run_result_key=run_result.key, |
| 472 bot_id='localhost', | 474 bot_id='localhost', |
| 475 cipd_pins=None, |
| 473 output='Foo1', | 476 output='Foo1', |
| 474 output_chunk_start=0, | 477 output_chunk_start=0, |
| 475 exit_code=0, | 478 exit_code=0, |
| 476 duration=0.1, | 479 duration=0.1, |
| 477 hard_timeout=False, | 480 hard_timeout=False, |
| 478 io_timeout=False, | 481 io_timeout=False, |
| 479 cost_usd=0.1, | 482 cost_usd=0.1, |
| 480 outputs_ref=None, | 483 outputs_ref=None, |
| 481 performance_stats=None)) | 484 performance_stats=None)) |
| 482 | 485 |
| (...skipping 28 matching lines...) Expand all Loading... |
| 511 _result_summary = task_scheduler.schedule_request(request) | 514 _result_summary = task_scheduler.schedule_request(request) |
| 512 | 515 |
| 513 # The TaskRequest was enqueued, the TaskResultSummary was created but no | 516 # The TaskRequest was enqueued, the TaskResultSummary was created but no |
| 514 # TaskRunResult exist yet since the task was not scheduled on any bot. | 517 # TaskRunResult exist yet since the task was not scheduled on any bot. |
| 515 result_summary, run_results = get_results(request.key) | 518 result_summary, run_results = get_results(request.key) |
| 516 expected = { | 519 expected = { |
| 517 'abandoned_ts': None, | 520 'abandoned_ts': None, |
| 518 'bot_dimensions': None, | 521 'bot_dimensions': None, |
| 519 'bot_id': None, | 522 'bot_id': None, |
| 520 'bot_version': None, | 523 'bot_version': None, |
| 524 'cipd_pins': None, |
| 521 'children_task_ids': [], | 525 'children_task_ids': [], |
| 522 'completed_ts': None, | 526 'completed_ts': None, |
| 523 'costs_usd': [], | 527 'costs_usd': [], |
| 524 'cost_saved_usd': None, | 528 'cost_saved_usd': None, |
| 525 'created_ts': created_ts, | 529 'created_ts': created_ts, |
| 526 'deduped_from': None, | 530 'deduped_from': None, |
| 527 'duration': None, | 531 'duration': None, |
| 528 'exit_code': None, | 532 'exit_code': None, |
| 529 'failure': False, | 533 'failure': False, |
| 530 'id': '1d69b9f088008810', | 534 'id': '1d69b9f088008810', |
| (...skipping 25 matching lines...) Expand all Loading... |
| 556 reaped_request, run_result = task_scheduler.bot_reap_task( | 560 reaped_request, run_result = task_scheduler.bot_reap_task( |
| 557 bot_dimensions, 'localhost', 'abc', None) | 561 bot_dimensions, 'localhost', 'abc', None) |
| 558 self.assertEqual(request, reaped_request) | 562 self.assertEqual(request, reaped_request) |
| 559 self.assertTrue(run_result) | 563 self.assertTrue(run_result) |
| 560 result_summary, run_results = get_results(request.key) | 564 result_summary, run_results = get_results(request.key) |
| 561 expected = { | 565 expected = { |
| 562 'abandoned_ts': None, | 566 'abandoned_ts': None, |
| 563 'bot_dimensions': bot_dimensions, | 567 'bot_dimensions': bot_dimensions, |
| 564 'bot_id': u'localhost', | 568 'bot_id': u'localhost', |
| 565 'bot_version': u'abc', | 569 'bot_version': u'abc', |
| 570 'cipd_pins': None, |
| 566 'children_task_ids': [], | 571 'children_task_ids': [], |
| 567 'completed_ts': None, | 572 'completed_ts': None, |
| 568 'costs_usd': [0.], | 573 'costs_usd': [0.], |
| 569 'cost_saved_usd': None, | 574 'cost_saved_usd': None, |
| 570 'created_ts': created_ts, # Time the TaskRequest was created. | 575 'created_ts': created_ts, # Time the TaskRequest was created. |
| 571 'deduped_from': None, | 576 'deduped_from': None, |
| 572 'duration': None, | 577 'duration': None, |
| 573 'exit_code': None, | 578 'exit_code': None, |
| 574 'failure': False, | 579 'failure': False, |
| 575 'id': '1d69b9f088008810', | 580 'id': '1d69b9f088008810', |
| (...skipping 15 matching lines...) Expand all Loading... |
| 591 'try_number': 1, | 596 'try_number': 1, |
| 592 'user': u'Jesus', | 597 'user': u'Jesus', |
| 593 } | 598 } |
| 594 self.assertEqual(expected, result_summary.to_dict()) | 599 self.assertEqual(expected, result_summary.to_dict()) |
| 595 expected = [ | 600 expected = [ |
| 596 { | 601 { |
| 597 'abandoned_ts': None, | 602 'abandoned_ts': None, |
| 598 'bot_dimensions': bot_dimensions, | 603 'bot_dimensions': bot_dimensions, |
| 599 'bot_id': u'localhost', | 604 'bot_id': u'localhost', |
| 600 'bot_version': u'abc', | 605 'bot_version': u'abc', |
| 606 'cipd_pins': None, |
| 601 'children_task_ids': [], | 607 'children_task_ids': [], |
| 602 'completed_ts': None, | 608 'completed_ts': None, |
| 603 'cost_usd': 0., | 609 'cost_usd': 0., |
| 604 'duration': None, | 610 'duration': None, |
| 605 'exit_code': None, | 611 'exit_code': None, |
| 606 'failure': False, | 612 'failure': False, |
| 607 'id': '1d69b9f088008811', | 613 'id': '1d69b9f088008811', |
| 608 'internal_failure': False, | 614 'internal_failure': False, |
| 609 'modified_ts': reaped_ts, | 615 'modified_ts': reaped_ts, |
| 610 'outputs_ref': None, | 616 'outputs_ref': None, |
| (...skipping 20 matching lines...) Expand all Loading... |
| 631 items_hot='bb'), | 637 items_hot='bb'), |
| 632 isolated_upload=task_result.OperationStats( | 638 isolated_upload=task_result.OperationStats( |
| 633 duration=0.1, | 639 duration=0.1, |
| 634 items_cold='aa', | 640 items_cold='aa', |
| 635 items_hot='bb')) | 641 items_hot='bb')) |
| 636 self.assertEqual( | 642 self.assertEqual( |
| 637 task_result.State.COMPLETED, | 643 task_result.State.COMPLETED, |
| 638 task_scheduler.bot_update_task( | 644 task_scheduler.bot_update_task( |
| 639 run_result_key=run_result.key, | 645 run_result_key=run_result.key, |
| 640 bot_id='localhost', | 646 bot_id='localhost', |
| 647 cipd_pins=None, |
| 641 output='Foo1', | 648 output='Foo1', |
| 642 output_chunk_start=0, | 649 output_chunk_start=0, |
| 643 exit_code=0, | 650 exit_code=0, |
| 644 duration=3., | 651 duration=3., |
| 645 hard_timeout=False, | 652 hard_timeout=False, |
| 646 io_timeout=False, | 653 io_timeout=False, |
| 647 cost_usd=0.1, | 654 cost_usd=0.1, |
| 648 outputs_ref=outputs_ref, | 655 outputs_ref=outputs_ref, |
| 649 performance_stats=performance_stats)) | 656 performance_stats=performance_stats)) |
| 650 # Simulate an unexpected retry, e.g. the response of the previous RPC never | 657 # Simulate an unexpected retry, e.g. the response of the previous RPC never |
| 651 # got the the client even if it succeedded. | 658 # got the the client even if it succeedded. |
| 652 self.assertEqual( | 659 self.assertEqual( |
| 653 task_result.State.COMPLETED, | 660 task_result.State.COMPLETED, |
| 654 task_scheduler.bot_update_task( | 661 task_scheduler.bot_update_task( |
| 655 run_result_key=run_result.key, | 662 run_result_key=run_result.key, |
| 656 bot_id='localhost', | 663 bot_id='localhost', |
| 664 cipd_pins=None, |
| 657 output='Foo1', | 665 output='Foo1', |
| 658 output_chunk_start=0, | 666 output_chunk_start=0, |
| 659 exit_code=0, | 667 exit_code=0, |
| 660 duration=3., | 668 duration=3., |
| 661 hard_timeout=False, | 669 hard_timeout=False, |
| 662 io_timeout=False, | 670 io_timeout=False, |
| 663 cost_usd=0.1, | 671 cost_usd=0.1, |
| 664 outputs_ref=outputs_ref, | 672 outputs_ref=outputs_ref, |
| 665 performance_stats=performance_stats)) | 673 performance_stats=performance_stats)) |
| 666 result_summary, run_results = get_results(request.key) | 674 result_summary, run_results = get_results(request.key) |
| 667 expected = { | 675 expected = { |
| 668 'abandoned_ts': None, | 676 'abandoned_ts': None, |
| 669 'bot_dimensions': bot_dimensions, | 677 'bot_dimensions': bot_dimensions, |
| 670 'bot_id': u'localhost', | 678 'bot_id': u'localhost', |
| 671 'bot_version': u'abc', | 679 'bot_version': u'abc', |
| 680 'cipd_pins': None, |
| 672 'children_task_ids': [], | 681 'children_task_ids': [], |
| 673 'completed_ts': done_ts, | 682 'completed_ts': done_ts, |
| 674 'costs_usd': [0.1], | 683 'costs_usd': [0.1], |
| 675 'cost_saved_usd': None, | 684 'cost_saved_usd': None, |
| 676 'created_ts': created_ts, | 685 'created_ts': created_ts, |
| 677 'deduped_from': None, | 686 'deduped_from': None, |
| 678 'duration': 3.0, | 687 'duration': 3.0, |
| 679 'exit_code': 0, | 688 'exit_code': 0, |
| 680 'failure': False, | 689 'failure': False, |
| 681 'id': '1d69b9f088008810', | 690 'id': '1d69b9f088008810', |
| (...skipping 19 matching lines...) Expand all Loading... |
| 701 'try_number': 1, | 710 'try_number': 1, |
| 702 'user': u'Jesus', | 711 'user': u'Jesus', |
| 703 } | 712 } |
| 704 self.assertEqual(expected, result_summary.to_dict()) | 713 self.assertEqual(expected, result_summary.to_dict()) |
| 705 expected = [ | 714 expected = [ |
| 706 { | 715 { |
| 707 'abandoned_ts': None, | 716 'abandoned_ts': None, |
| 708 'bot_dimensions': bot_dimensions, | 717 'bot_dimensions': bot_dimensions, |
| 709 'bot_id': u'localhost', | 718 'bot_id': u'localhost', |
| 710 'bot_version': u'abc', | 719 'bot_version': u'abc', |
| 720 'cipd_pins': None, |
| 711 'children_task_ids': [], | 721 'children_task_ids': [], |
| 712 'completed_ts': done_ts, | 722 'completed_ts': done_ts, |
| 713 'cost_usd': 0.1, | 723 'cost_usd': 0.1, |
| 714 'duration': 3.0, | 724 'duration': 3.0, |
| 715 'exit_code': 0, | 725 'exit_code': 0, |
| 716 'failure': False, | 726 'failure': False, |
| 717 'id': '1d69b9f088008811', | 727 'id': '1d69b9f088008811', |
| 718 'internal_failure': False, | 728 'internal_failure': False, |
| 719 'modified_ts': done_ts, | 729 'modified_ts': done_ts, |
| 720 'outputs_ref': { | 730 'outputs_ref': { |
| (...skipping 19 matching lines...) Expand all Loading... |
| 740 _result_summary = task_scheduler.schedule_request(request) | 750 _result_summary = task_scheduler.schedule_request(request) |
| 741 bot_dimensions = {'OS': 'Windows-3.1.1', u'pool': u'default'} | 751 bot_dimensions = {'OS': 'Windows-3.1.1', u'pool': u'default'} |
| 742 reaped_request, run_result = task_scheduler.bot_reap_task( | 752 reaped_request, run_result = task_scheduler.bot_reap_task( |
| 743 bot_dimensions, 'localhost', 'abc', None) | 753 bot_dimensions, 'localhost', 'abc', None) |
| 744 self.assertEqual(request, reaped_request) | 754 self.assertEqual(request, reaped_request) |
| 745 self.assertEqual( | 755 self.assertEqual( |
| 746 task_result.State.COMPLETED, | 756 task_result.State.COMPLETED, |
| 747 task_scheduler.bot_update_task( | 757 task_scheduler.bot_update_task( |
| 748 run_result_key=run_result.key, | 758 run_result_key=run_result.key, |
| 749 bot_id='localhost', | 759 bot_id='localhost', |
| 760 cipd_pins=None, |
| 750 output='Foo1', | 761 output='Foo1', |
| 751 output_chunk_start=0, | 762 output_chunk_start=0, |
| 752 exit_code=1, | 763 exit_code=1, |
| 753 duration=0.1, | 764 duration=0.1, |
| 754 hard_timeout=False, | 765 hard_timeout=False, |
| 755 io_timeout=False, | 766 io_timeout=False, |
| 756 cost_usd=0.1, | 767 cost_usd=0.1, |
| 757 outputs_ref=None, | 768 outputs_ref=None, |
| 758 performance_stats=None)) | 769 performance_stats=None)) |
| 759 result_summary, run_results = get_results(request.key) | 770 result_summary, run_results = get_results(request.key) |
| 760 | 771 |
| 761 expected = { | 772 expected = { |
| 762 'abandoned_ts': None, | 773 'abandoned_ts': None, |
| 763 'bot_dimensions': bot_dimensions, | 774 'bot_dimensions': bot_dimensions, |
| 764 'bot_id': u'localhost', | 775 'bot_id': u'localhost', |
| 765 'bot_version': u'abc', | 776 'bot_version': u'abc', |
| 777 'cipd_pins': None, |
| 766 'children_task_ids': [], | 778 'children_task_ids': [], |
| 767 'completed_ts': self.now, | 779 'completed_ts': self.now, |
| 768 'costs_usd': [0.1], | 780 'costs_usd': [0.1], |
| 769 'cost_saved_usd': None, | 781 'cost_saved_usd': None, |
| 770 'created_ts': self.now, | 782 'created_ts': self.now, |
| 771 'deduped_from': None, | 783 'deduped_from': None, |
| 772 'duration': 0.1, | 784 'duration': 0.1, |
| 773 'exit_code': 1, | 785 'exit_code': 1, |
| 774 'failure': True, | 786 'failure': True, |
| 775 'id': '1d69b9f088008810', | 787 'id': '1d69b9f088008810', |
| (...skipping 16 matching lines...) Expand all Loading... |
| 792 'user': u'Jesus', | 804 'user': u'Jesus', |
| 793 } | 805 } |
| 794 self.assertEqual(expected, result_summary.to_dict()) | 806 self.assertEqual(expected, result_summary.to_dict()) |
| 795 | 807 |
| 796 expected = [ | 808 expected = [ |
| 797 { | 809 { |
| 798 'abandoned_ts': None, | 810 'abandoned_ts': None, |
| 799 'bot_dimensions': bot_dimensions, | 811 'bot_dimensions': bot_dimensions, |
| 800 'bot_id': u'localhost', | 812 'bot_id': u'localhost', |
| 801 'bot_version': u'abc', | 813 'bot_version': u'abc', |
| 814 'cipd_pins': None, |
| 802 'children_task_ids': [], | 815 'children_task_ids': [], |
| 803 'completed_ts': self.now, | 816 'completed_ts': self.now, |
| 804 'cost_usd': 0.1, | 817 'cost_usd': 0.1, |
| 805 'duration': 0.1, | 818 'duration': 0.1, |
| 806 'exit_code': 1, | 819 'exit_code': 1, |
| 807 'failure': True, | 820 'failure': True, |
| 808 'id': '1d69b9f088008811', | 821 'id': '1d69b9f088008811', |
| 809 'internal_failure': False, | 822 'internal_failure': False, |
| 810 'modified_ts': self.now, | 823 'modified_ts': self.now, |
| 811 'outputs_ref': None, | 824 'outputs_ref': None, |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 864 with self.assertRaises(auth.AuthorizationError): | 877 with self.assertRaises(auth.AuthorizationError): |
| 865 _quick_schedule({u'id': u'abc', u'pool': u'bad'}) | 878 _quick_schedule({u'id': u'abc', u'pool': u'bad'}) |
| 866 | 879 |
| 867 def test_bot_update_task(self): | 880 def test_bot_update_task(self): |
| 868 run_result = _quick_reap() | 881 run_result = _quick_reap() |
| 869 self.assertEqual( | 882 self.assertEqual( |
| 870 task_result.State.RUNNING, | 883 task_result.State.RUNNING, |
| 871 task_scheduler.bot_update_task( | 884 task_scheduler.bot_update_task( |
| 872 run_result_key=run_result.key, | 885 run_result_key=run_result.key, |
| 873 bot_id='localhost', | 886 bot_id='localhost', |
| 887 cipd_pins=None, |
| 874 output='hi', | 888 output='hi', |
| 875 output_chunk_start=0, | 889 output_chunk_start=0, |
| 876 exit_code=None, | 890 exit_code=None, |
| 877 duration=None, | 891 duration=None, |
| 878 hard_timeout=False, | 892 hard_timeout=False, |
| 879 io_timeout=False, | 893 io_timeout=False, |
| 880 cost_usd=0.1, | 894 cost_usd=0.1, |
| 881 outputs_ref=None, | 895 outputs_ref=None, |
| 882 performance_stats=None)) | 896 performance_stats=None)) |
| 883 self.assertEqual( | 897 self.assertEqual( |
| 884 task_result.State.COMPLETED, | 898 task_result.State.COMPLETED, |
| 885 task_scheduler.bot_update_task( | 899 task_scheduler.bot_update_task( |
| 886 run_result_key=run_result.key, | 900 run_result_key=run_result.key, |
| 887 bot_id='localhost', | 901 bot_id='localhost', |
| 902 cipd_pins=None, |
| 888 output='hey', | 903 output='hey', |
| 889 output_chunk_start=2, | 904 output_chunk_start=2, |
| 890 exit_code=0, | 905 exit_code=0, |
| 891 duration=0.1, | 906 duration=0.1, |
| 892 hard_timeout=False, | 907 hard_timeout=False, |
| 893 io_timeout=False, | 908 io_timeout=False, |
| 894 cost_usd=0.1, | 909 cost_usd=0.1, |
| 895 outputs_ref=None, | 910 outputs_ref=None, |
| 896 performance_stats=None)) | 911 performance_stats=None)) |
| 897 self.assertEqual('hihey', run_result.key.get().get_output()) | 912 self.assertEqual('hihey', run_result.key.get().get_output()) |
| 898 | 913 |
| 899 def test_bot_update_task_new_overwrite(self): | 914 def test_bot_update_task_new_overwrite(self): |
| 900 run_result = _quick_reap() | 915 run_result = _quick_reap() |
| 901 self.assertEqual( | 916 self.assertEqual( |
| 902 task_result.State.RUNNING, | 917 task_result.State.RUNNING, |
| 903 task_scheduler.bot_update_task( | 918 task_scheduler.bot_update_task( |
| 904 run_result_key=run_result.key, | 919 run_result_key=run_result.key, |
| 905 bot_id='localhost', | 920 bot_id='localhost', |
| 921 cipd_pins=None, |
| 906 output='hi', | 922 output='hi', |
| 907 output_chunk_start=0, | 923 output_chunk_start=0, |
| 908 exit_code=None, | 924 exit_code=None, |
| 909 duration=None, | 925 duration=None, |
| 910 hard_timeout=False, | 926 hard_timeout=False, |
| 911 io_timeout=False, | 927 io_timeout=False, |
| 912 cost_usd=0.1, | 928 cost_usd=0.1, |
| 913 outputs_ref=None, | 929 outputs_ref=None, |
| 914 performance_stats=None)) | 930 performance_stats=None)) |
| 915 self.assertEqual( | 931 self.assertEqual( |
| 916 task_result.State.RUNNING, | 932 task_result.State.RUNNING, |
| 917 task_scheduler.bot_update_task( | 933 task_scheduler.bot_update_task( |
| 918 run_result_key=run_result.key, | 934 run_result_key=run_result.key, |
| 919 bot_id='localhost', | 935 bot_id='localhost', |
| 936 cipd_pins=None, |
| 920 output='hey', | 937 output='hey', |
| 921 output_chunk_start=1, | 938 output_chunk_start=1, |
| 922 exit_code=None, | 939 exit_code=None, |
| 923 duration=None, | 940 duration=None, |
| 924 hard_timeout=False, | 941 hard_timeout=False, |
| 925 io_timeout=False, | 942 io_timeout=False, |
| 926 cost_usd=0.1, | 943 cost_usd=0.1, |
| 927 outputs_ref=None, | 944 outputs_ref=None, |
| 928 performance_stats=None)) | 945 performance_stats=None)) |
| 929 self.assertEqual('hhey', run_result.key.get().get_output()) | 946 self.assertEqual('hhey', run_result.key.get().get_output()) |
| 930 | 947 |
| 931 def test_bot_update_exception(self): | 948 def test_bot_update_exception(self): |
| 932 run_result = _quick_reap() | 949 run_result = _quick_reap() |
| 933 def r(*_): | 950 def r(*_): |
| 934 raise datastore_utils.CommitError('Sorry!') | 951 raise datastore_utils.CommitError('Sorry!') |
| 935 | 952 |
| 936 self.mock(ndb, 'put_multi', r) | 953 self.mock(ndb, 'put_multi', r) |
| 937 self.assertEqual( | 954 self.assertEqual( |
| 938 None, | 955 None, |
| 939 task_scheduler.bot_update_task( | 956 task_scheduler.bot_update_task( |
| 940 run_result_key=run_result.key, | 957 run_result_key=run_result.key, |
| 941 bot_id='localhost', | 958 bot_id='localhost', |
| 959 cipd_pins=None, |
| 942 output='hi', | 960 output='hi', |
| 943 output_chunk_start=0, | 961 output_chunk_start=0, |
| 944 exit_code=0, | 962 exit_code=0, |
| 945 duration=0.1, | 963 duration=0.1, |
| 946 hard_timeout=False, | 964 hard_timeout=False, |
| 947 io_timeout=False, | 965 io_timeout=False, |
| 948 cost_usd=0.1, | 966 cost_usd=0.1, |
| 949 outputs_ref=None, | 967 outputs_ref=None, |
| 950 performance_stats=None)) | 968 performance_stats=None)) |
| 951 | 969 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 967 bot_dimensions, 'localhost', 'abc', None) | 985 bot_dimensions, 'localhost', 'abc', None) |
| 968 self.assertEqual('localhost', run_result.bot_id) | 986 self.assertEqual('localhost', run_result.bot_id) |
| 969 | 987 |
| 970 # Attempt to terminate the task with success, but make PubSub call fail. | 988 # Attempt to terminate the task with success, but make PubSub call fail. |
| 971 self.mock_pub_sub(publish_successful=False) | 989 self.mock_pub_sub(publish_successful=False) |
| 972 self.assertEqual( | 990 self.assertEqual( |
| 973 None, | 991 None, |
| 974 task_scheduler.bot_update_task( | 992 task_scheduler.bot_update_task( |
| 975 run_result_key=run_result.key, | 993 run_result_key=run_result.key, |
| 976 bot_id='localhost', | 994 bot_id='localhost', |
| 995 cipd_pins=None, |
| 977 output='Foo1', | 996 output='Foo1', |
| 978 output_chunk_start=0, | 997 output_chunk_start=0, |
| 979 exit_code=0, | 998 exit_code=0, |
| 980 duration=0.1, | 999 duration=0.1, |
| 981 hard_timeout=False, | 1000 hard_timeout=False, |
| 982 io_timeout=False, | 1001 io_timeout=False, |
| 983 cost_usd=0.1, | 1002 cost_usd=0.1, |
| 984 outputs_ref=None, | 1003 outputs_ref=None, |
| 985 performance_stats=None)) | 1004 performance_stats=None)) |
| 986 | 1005 |
| 987 # Bot retries bot_update, now PubSub works and notification is sent. | 1006 # Bot retries bot_update, now PubSub works and notification is sent. |
| 988 pub_sub_calls = self.mock_pub_sub(publish_successful=True) | 1007 pub_sub_calls = self.mock_pub_sub(publish_successful=True) |
| 989 self.assertEqual( | 1008 self.assertEqual( |
| 990 task_result.State.COMPLETED, | 1009 task_result.State.COMPLETED, |
| 991 task_scheduler.bot_update_task( | 1010 task_scheduler.bot_update_task( |
| 992 run_result_key=run_result.key, | 1011 run_result_key=run_result.key, |
| 993 bot_id='localhost', | 1012 bot_id='localhost', |
| 1013 cipd_pins=None, |
| 994 output='Foo1', | 1014 output='Foo1', |
| 995 output_chunk_start=0, | 1015 output_chunk_start=0, |
| 996 exit_code=0, | 1016 exit_code=0, |
| 997 duration=0.1, | 1017 duration=0.1, |
| 998 hard_timeout=False, | 1018 hard_timeout=False, |
| 999 io_timeout=False, | 1019 io_timeout=False, |
| 1000 cost_usd=0.1, | 1020 cost_usd=0.1, |
| 1001 outputs_ref=None, | 1021 outputs_ref=None, |
| 1002 performance_stats=None)) | 1022 performance_stats=None)) |
| 1003 self.assertEqual(1, len(pub_sub_calls)) # notification is sent | 1023 self.assertEqual(1, len(pub_sub_calls)) # notification is sent |
| 1004 | 1024 |
| 1005 def _bot_update_timeouts(self, hard, io): | 1025 def _bot_update_timeouts(self, hard, io): |
| 1006 self.mock(random, 'getrandbits', lambda _: 0x88) | 1026 self.mock(random, 'getrandbits', lambda _: 0x88) |
| 1007 request = _gen_request( | 1027 request = _gen_request( |
| 1008 properties={ | 1028 properties={ |
| 1009 'dimensions': {u'OS': u'Windows-3.1.1', u'pool': u'default'}, | 1029 'dimensions': {u'OS': u'Windows-3.1.1', u'pool': u'default'}, |
| 1010 }) | 1030 }) |
| 1011 task_request.init_new_request(request, True) | 1031 task_request.init_new_request(request, True) |
| 1012 result_summary = task_scheduler.schedule_request(request) | 1032 result_summary = task_scheduler.schedule_request(request) |
| 1013 bot_dimensions = {'OS': 'Windows-3.1.1', u'pool': u'default'} | 1033 bot_dimensions = {'OS': 'Windows-3.1.1', u'pool': u'default'} |
| 1014 reaped_request, run_result = task_scheduler.bot_reap_task( | 1034 reaped_request, run_result = task_scheduler.bot_reap_task( |
| 1015 bot_dimensions, 'localhost', 'abc', None) | 1035 bot_dimensions, 'localhost', 'abc', None) |
| 1016 self.assertEqual( | 1036 self.assertEqual( |
| 1017 task_result.State.TIMED_OUT, | 1037 task_result.State.TIMED_OUT, |
| 1018 task_scheduler.bot_update_task( | 1038 task_scheduler.bot_update_task( |
| 1019 run_result_key=run_result.key, | 1039 run_result_key=run_result.key, |
| 1020 bot_id='localhost', | 1040 bot_id='localhost', |
| 1041 cipd_pins=None, |
| 1021 output='hi', | 1042 output='hi', |
| 1022 output_chunk_start=0, | 1043 output_chunk_start=0, |
| 1023 exit_code=0, | 1044 exit_code=0, |
| 1024 duration=0.1, | 1045 duration=0.1, |
| 1025 hard_timeout=hard, | 1046 hard_timeout=hard, |
| 1026 io_timeout=io, | 1047 io_timeout=io, |
| 1027 cost_usd=0.1, | 1048 cost_usd=0.1, |
| 1028 outputs_ref=None, | 1049 outputs_ref=None, |
| 1029 performance_stats=None)) | 1050 performance_stats=None)) |
| 1030 expected = { | 1051 expected = { |
| 1031 'abandoned_ts': None, | 1052 'abandoned_ts': None, |
| 1032 'bot_dimensions': bot_dimensions, | 1053 'bot_dimensions': bot_dimensions, |
| 1033 'bot_id': u'localhost', | 1054 'bot_id': u'localhost', |
| 1034 'bot_version': u'abc', | 1055 'bot_version': u'abc', |
| 1056 'cipd_pins': None, |
| 1035 'children_task_ids': [], | 1057 'children_task_ids': [], |
| 1036 'completed_ts': self.now, | 1058 'completed_ts': self.now, |
| 1037 'costs_usd': [0.1], | 1059 'costs_usd': [0.1], |
| 1038 'cost_saved_usd': None, | 1060 'cost_saved_usd': None, |
| 1039 'created_ts': self.now, | 1061 'created_ts': self.now, |
| 1040 'deduped_from': None, | 1062 'deduped_from': None, |
| 1041 'duration': 0.1, | 1063 'duration': 0.1, |
| 1042 'exit_code': 0, | 1064 'exit_code': 0, |
| 1043 'failure': True, | 1065 'failure': True, |
| 1044 'id': '1d69b9f088008810', | 1066 'id': '1d69b9f088008810', |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1060 'try_number': 1, | 1082 'try_number': 1, |
| 1061 'user': u'Jesus', | 1083 'user': u'Jesus', |
| 1062 } | 1084 } |
| 1063 self.assertEqual(expected, result_summary.key.get().to_dict()) | 1085 self.assertEqual(expected, result_summary.key.get().to_dict()) |
| 1064 | 1086 |
| 1065 expected = { | 1087 expected = { |
| 1066 'abandoned_ts': None, | 1088 'abandoned_ts': None, |
| 1067 'bot_dimensions': bot_dimensions, | 1089 'bot_dimensions': bot_dimensions, |
| 1068 'bot_id': u'localhost', | 1090 'bot_id': u'localhost', |
| 1069 'bot_version': u'abc', | 1091 'bot_version': u'abc', |
| 1092 'cipd_pins': None, |
| 1070 'children_task_ids': [], | 1093 'children_task_ids': [], |
| 1071 'completed_ts': self.now, | 1094 'completed_ts': self.now, |
| 1072 'cost_usd': 0.1, | 1095 'cost_usd': 0.1, |
| 1073 'duration': 0.1, | 1096 'duration': 0.1, |
| 1074 'exit_code': 0, | 1097 'exit_code': 0, |
| 1075 'failure': True, | 1098 'failure': True, |
| 1076 'id': '1d69b9f088008811', | 1099 'id': '1d69b9f088008811', |
| 1077 'internal_failure': False, | 1100 'internal_failure': False, |
| 1078 'modified_ts': self.now, | 1101 'modified_ts': self.now, |
| 1079 'outputs_ref': None, | 1102 'outputs_ref': None, |
| (...skipping 22 matching lines...) Expand all Loading... |
| 1102 reaped_request, run_result = task_scheduler.bot_reap_task( | 1125 reaped_request, run_result = task_scheduler.bot_reap_task( |
| 1103 {'OS': 'Windows-3.1.1', u'pool': u'default'}, 'localhost', 'abc', None) | 1126 {'OS': 'Windows-3.1.1', u'pool': u'default'}, 'localhost', 'abc', None) |
| 1104 | 1127 |
| 1105 self.assertEqual( | 1128 self.assertEqual( |
| 1106 None, task_scheduler.bot_kill_task(run_result.key, 'localhost')) | 1129 None, task_scheduler.bot_kill_task(run_result.key, 'localhost')) |
| 1107 expected = { | 1130 expected = { |
| 1108 'abandoned_ts': self.now, | 1131 'abandoned_ts': self.now, |
| 1109 'bot_dimensions': dimensions, | 1132 'bot_dimensions': dimensions, |
| 1110 'bot_id': u'localhost', | 1133 'bot_id': u'localhost', |
| 1111 'bot_version': u'abc', | 1134 'bot_version': u'abc', |
| 1135 'cipd_pins': None, |
| 1112 'children_task_ids': [], | 1136 'children_task_ids': [], |
| 1113 'completed_ts': None, | 1137 'completed_ts': None, |
| 1114 'costs_usd': [0.], | 1138 'costs_usd': [0.], |
| 1115 'cost_saved_usd': None, | 1139 'cost_saved_usd': None, |
| 1116 'created_ts': self.now, | 1140 'created_ts': self.now, |
| 1117 'deduped_from': None, | 1141 'deduped_from': None, |
| 1118 'duration': None, | 1142 'duration': None, |
| 1119 'exit_code': None, | 1143 'exit_code': None, |
| 1120 'failure': False, | 1144 'failure': False, |
| 1121 'id': '1d69b9f088008810', | 1145 'id': '1d69b9f088008810', |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1136 ], | 1160 ], |
| 1137 'try_number': 1, | 1161 'try_number': 1, |
| 1138 'user': u'Jesus', | 1162 'user': u'Jesus', |
| 1139 } | 1163 } |
| 1140 self.assertEqual(expected, result_summary.key.get().to_dict()) | 1164 self.assertEqual(expected, result_summary.key.get().to_dict()) |
| 1141 expected = { | 1165 expected = { |
| 1142 'abandoned_ts': self.now, | 1166 'abandoned_ts': self.now, |
| 1143 'bot_dimensions': dimensions, | 1167 'bot_dimensions': dimensions, |
| 1144 'bot_id': u'localhost', | 1168 'bot_id': u'localhost', |
| 1145 'bot_version': u'abc', | 1169 'bot_version': u'abc', |
| 1170 'cipd_pins': None, |
| 1146 'children_task_ids': [], | 1171 'children_task_ids': [], |
| 1147 'completed_ts': None, | 1172 'completed_ts': None, |
| 1148 'cost_usd': 0., | 1173 'cost_usd': 0., |
| 1149 'duration': None, | 1174 'duration': None, |
| 1150 'exit_code': None, | 1175 'exit_code': None, |
| 1151 'failure': False, | 1176 'failure': False, |
| 1152 'id': '1d69b9f088008811', | 1177 'id': '1d69b9f088008811', |
| 1153 'internal_failure': True, | 1178 'internal_failure': True, |
| 1154 'modified_ts': self.now, | 1179 'modified_ts': self.now, |
| 1155 'outputs_ref': None, | 1180 'outputs_ref': None, |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1224 abandoned_ts = self.mock_now(self.now, request.expiration_secs+1) | 1249 abandoned_ts = self.mock_now(self.now, request.expiration_secs+1) |
| 1225 self.assertEqual( | 1250 self.assertEqual( |
| 1226 ['1d69b9f088008810'], | 1251 ['1d69b9f088008810'], |
| 1227 task_scheduler.cron_abort_expired_task_to_run('f.local')) | 1252 task_scheduler.cron_abort_expired_task_to_run('f.local')) |
| 1228 self.assertEqual([], task_result.TaskRunResult.query().fetch()) | 1253 self.assertEqual([], task_result.TaskRunResult.query().fetch()) |
| 1229 expected = { | 1254 expected = { |
| 1230 'abandoned_ts': abandoned_ts, | 1255 'abandoned_ts': abandoned_ts, |
| 1231 'bot_dimensions': None, | 1256 'bot_dimensions': None, |
| 1232 'bot_id': None, | 1257 'bot_id': None, |
| 1233 'bot_version': None, | 1258 'bot_version': None, |
| 1259 'cipd_pins': None, |
| 1234 'children_task_ids': [], | 1260 'children_task_ids': [], |
| 1235 'completed_ts': None, | 1261 'completed_ts': None, |
| 1236 'costs_usd': [], | 1262 'costs_usd': [], |
| 1237 'cost_saved_usd': None, | 1263 'cost_saved_usd': None, |
| 1238 'created_ts': self.now, | 1264 'created_ts': self.now, |
| 1239 'deduped_from': None, | 1265 'deduped_from': None, |
| 1240 'duration': None, | 1266 'duration': None, |
| 1241 'exit_code': None, | 1267 'exit_code': None, |
| 1242 'failure': False, | 1268 'failure': False, |
| 1243 'id': '1d69b9f088008810', | 1269 'id': '1d69b9f088008810', |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1297 abandoned_ts = self.mock_now(self.now, request.expiration_secs+1) | 1323 abandoned_ts = self.mock_now(self.now, request.expiration_secs+1) |
| 1298 self.assertEqual( | 1324 self.assertEqual( |
| 1299 ['1d69b9f088008810'], | 1325 ['1d69b9f088008810'], |
| 1300 task_scheduler.cron_abort_expired_task_to_run('f.local')) | 1326 task_scheduler.cron_abort_expired_task_to_run('f.local')) |
| 1301 self.assertEqual(1, len(task_result.TaskRunResult.query().fetch())) | 1327 self.assertEqual(1, len(task_result.TaskRunResult.query().fetch())) |
| 1302 expected = { | 1328 expected = { |
| 1303 'abandoned_ts': abandoned_ts, | 1329 'abandoned_ts': abandoned_ts, |
| 1304 'bot_dimensions': bot_dimensions, | 1330 'bot_dimensions': bot_dimensions, |
| 1305 'bot_id': u'localhost', | 1331 'bot_id': u'localhost', |
| 1306 'bot_version': u'abc', | 1332 'bot_version': u'abc', |
| 1333 'cipd_pins': None, |
| 1307 'children_task_ids': [], | 1334 'children_task_ids': [], |
| 1308 'completed_ts': None, | 1335 'completed_ts': None, |
| 1309 'costs_usd': [0.], | 1336 'costs_usd': [0.], |
| 1310 'cost_saved_usd': None, | 1337 'cost_saved_usd': None, |
| 1311 'created_ts': self.now, | 1338 'created_ts': self.now, |
| 1312 'deduped_from': None, | 1339 'deduped_from': None, |
| 1313 'duration': None, | 1340 'duration': None, |
| 1314 'exit_code': None, | 1341 'exit_code': None, |
| 1315 'failure': False, | 1342 'failure': False, |
| 1316 'id': '1d69b9f088008810', | 1343 'id': '1d69b9f088008810', |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1364 self.assertEqual(task_result.State.RUNNING, run_result.state) | 1391 self.assertEqual(task_result.State.RUNNING, run_result.state) |
| 1365 now_1 = self.mock_now(self.now + task_result.BOT_PING_TOLERANCE, 1) | 1392 now_1 = self.mock_now(self.now + task_result.BOT_PING_TOLERANCE, 1) |
| 1366 self.assertEqual(([], 1, 0), task_scheduler.cron_handle_bot_died('f.local')) | 1393 self.assertEqual(([], 1, 0), task_scheduler.cron_handle_bot_died('f.local')) |
| 1367 | 1394 |
| 1368 # Refresh and compare: | 1395 # Refresh and compare: |
| 1369 expected = { | 1396 expected = { |
| 1370 'abandoned_ts': now_1, | 1397 'abandoned_ts': now_1, |
| 1371 'bot_dimensions': bot_dimensions, | 1398 'bot_dimensions': bot_dimensions, |
| 1372 'bot_id': u'localhost', | 1399 'bot_id': u'localhost', |
| 1373 'bot_version': u'abc', | 1400 'bot_version': u'abc', |
| 1401 'cipd_pins': None, |
| 1374 'children_task_ids': [], | 1402 'children_task_ids': [], |
| 1375 'completed_ts': None, | 1403 'completed_ts': None, |
| 1376 'cost_usd': 0., | 1404 'cost_usd': 0., |
| 1377 'duration': None, | 1405 'duration': None, |
| 1378 'exit_code': None, | 1406 'exit_code': None, |
| 1379 'failure': False, | 1407 'failure': False, |
| 1380 'id': '1d69b9f088008811', | 1408 'id': '1d69b9f088008811', |
| 1381 'internal_failure': True, | 1409 'internal_failure': True, |
| 1382 'modified_ts': now_1, | 1410 'modified_ts': now_1, |
| 1383 'outputs_ref': None, | 1411 'outputs_ref': None, |
| 1384 'server_versions': [u'v1a'], | 1412 'server_versions': [u'v1a'], |
| 1385 'started_ts': self.now, | 1413 'started_ts': self.now, |
| 1386 'state': task_result.State.BOT_DIED, | 1414 'state': task_result.State.BOT_DIED, |
| 1387 'try_number': 1, | 1415 'try_number': 1, |
| 1388 } | 1416 } |
| 1389 self.assertEqual(expected, run_result.key.get().to_dict()) | 1417 self.assertEqual(expected, run_result.key.get().to_dict()) |
| 1390 expected = { | 1418 expected = { |
| 1391 'abandoned_ts': None, | 1419 'abandoned_ts': None, |
| 1392 'bot_dimensions': bot_dimensions, | 1420 'bot_dimensions': bot_dimensions, |
| 1393 'bot_id': u'localhost', | 1421 'bot_id': u'localhost', |
| 1394 'bot_version': u'abc', | 1422 'bot_version': u'abc', |
| 1423 'cipd_pins': None, |
| 1395 'children_task_ids': [], | 1424 'children_task_ids': [], |
| 1396 'completed_ts': None, | 1425 'completed_ts': None, |
| 1397 'costs_usd': [0.], | 1426 'costs_usd': [0.], |
| 1398 'cost_saved_usd': None, | 1427 'cost_saved_usd': None, |
| 1399 'created_ts': self.now, | 1428 'created_ts': self.now, |
| 1400 'deduped_from': None, | 1429 'deduped_from': None, |
| 1401 'duration': None, | 1430 'duration': None, |
| 1402 'exit_code': None, | 1431 'exit_code': None, |
| 1403 'failure': False, | 1432 'failure': False, |
| 1404 'id': '1d69b9f088008810', | 1433 'id': '1d69b9f088008810', |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1429 now_2 = self.mock_now(self.now + task_result.BOT_PING_TOLERANCE, 2) | 1458 now_2 = self.mock_now(self.now + task_result.BOT_PING_TOLERANCE, 2) |
| 1430 _request, run_result = task_scheduler.bot_reap_task( | 1459 _request, run_result = task_scheduler.bot_reap_task( |
| 1431 bot_dimensions, 'localhost-second', 'abc', None) | 1460 bot_dimensions, 'localhost-second', 'abc', None) |
| 1432 logging.info('%s', [t.to_dict() for t in task_to_run.TaskToRun.query()]) | 1461 logging.info('%s', [t.to_dict() for t in task_to_run.TaskToRun.query()]) |
| 1433 self.assertEqual(2, run_result.try_number) | 1462 self.assertEqual(2, run_result.try_number) |
| 1434 self.assertEqual( | 1463 self.assertEqual( |
| 1435 task_result.State.COMPLETED, | 1464 task_result.State.COMPLETED, |
| 1436 task_scheduler.bot_update_task( | 1465 task_scheduler.bot_update_task( |
| 1437 run_result_key=run_result.key, | 1466 run_result_key=run_result.key, |
| 1438 bot_id='localhost-second', | 1467 bot_id='localhost-second', |
| 1468 cipd_pins=None, |
| 1439 output='Foo1', | 1469 output='Foo1', |
| 1440 output_chunk_start=0, | 1470 output_chunk_start=0, |
| 1441 exit_code=0, | 1471 exit_code=0, |
| 1442 duration=0.1, | 1472 duration=0.1, |
| 1443 hard_timeout=False, | 1473 hard_timeout=False, |
| 1444 io_timeout=False, | 1474 io_timeout=False, |
| 1445 cost_usd=0.1, | 1475 cost_usd=0.1, |
| 1446 outputs_ref=None, | 1476 outputs_ref=None, |
| 1447 performance_stats=None)) | 1477 performance_stats=None)) |
| 1448 expected = { | 1478 expected = { |
| 1449 'abandoned_ts': None, | 1479 'abandoned_ts': None, |
| 1450 'bot_dimensions': bot_dimensions, | 1480 'bot_dimensions': bot_dimensions, |
| 1451 'bot_id': u'localhost-second', | 1481 'bot_id': u'localhost-second', |
| 1452 'bot_version': u'abc', | 1482 'bot_version': u'abc', |
| 1483 'cipd_pins': None, |
| 1453 'children_task_ids': [], | 1484 'children_task_ids': [], |
| 1454 'completed_ts': now_2, | 1485 'completed_ts': now_2, |
| 1455 'costs_usd': [0., 0.1], | 1486 'costs_usd': [0., 0.1], |
| 1456 'cost_saved_usd': None, | 1487 'cost_saved_usd': None, |
| 1457 'created_ts': self.now, | 1488 'created_ts': self.now, |
| 1458 'deduped_from': None, | 1489 'deduped_from': None, |
| 1459 'duration': 0.1, | 1490 'duration': 0.1, |
| 1460 'exit_code': 0, | 1491 'exit_code': 0, |
| 1461 'failure': False, | 1492 'failure': False, |
| 1462 'id': '1d69b9f088008810', | 1493 'id': '1d69b9f088008810', |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1508 self.assertEqual(task_result.State.RUNNING, run_result.state) | 1539 self.assertEqual(task_result.State.RUNNING, run_result.state) |
| 1509 now_1 = self.mock_now(self.now + task_result.BOT_PING_TOLERANCE, 1) | 1540 now_1 = self.mock_now(self.now + task_result.BOT_PING_TOLERANCE, 1) |
| 1510 self.assertEqual(([], 1, 0), task_scheduler.cron_handle_bot_died('f.local')) | 1541 self.assertEqual(([], 1, 0), task_scheduler.cron_handle_bot_died('f.local')) |
| 1511 | 1542 |
| 1512 # Refresh and compare: | 1543 # Refresh and compare: |
| 1513 expected = { | 1544 expected = { |
| 1514 'abandoned_ts': now_1, | 1545 'abandoned_ts': now_1, |
| 1515 'bot_dimensions': bot_dimensions, | 1546 'bot_dimensions': bot_dimensions, |
| 1516 'bot_id': u'localhost', | 1547 'bot_id': u'localhost', |
| 1517 'bot_version': u'abc', | 1548 'bot_version': u'abc', |
| 1549 'cipd_pins': None, |
| 1518 'children_task_ids': [], | 1550 'children_task_ids': [], |
| 1519 'completed_ts': None, | 1551 'completed_ts': None, |
| 1520 'cost_usd': 0., | 1552 'cost_usd': 0., |
| 1521 'duration': None, | 1553 'duration': None, |
| 1522 'exit_code': None, | 1554 'exit_code': None, |
| 1523 'failure': False, | 1555 'failure': False, |
| 1524 'id': '1d69b9f088008811', | 1556 'id': '1d69b9f088008811', |
| 1525 'internal_failure': True, | 1557 'internal_failure': True, |
| 1526 'modified_ts': now_1, | 1558 'modified_ts': now_1, |
| 1527 'outputs_ref': None, | 1559 'outputs_ref': None, |
| 1528 'server_versions': [u'v1a'], | 1560 'server_versions': [u'v1a'], |
| 1529 'started_ts': self.now, | 1561 'started_ts': self.now, |
| 1530 'state': task_result.State.BOT_DIED, | 1562 'state': task_result.State.BOT_DIED, |
| 1531 'try_number': 1, | 1563 'try_number': 1, |
| 1532 } | 1564 } |
| 1533 self.assertEqual(expected, run_result.key.get().to_dict()) | 1565 self.assertEqual(expected, run_result.key.get().to_dict()) |
| 1534 expected = { | 1566 expected = { |
| 1535 'abandoned_ts': None, | 1567 'abandoned_ts': None, |
| 1536 'bot_dimensions': bot_dimensions, | 1568 'bot_dimensions': bot_dimensions, |
| 1537 'bot_id': u'localhost', | 1569 'bot_id': u'localhost', |
| 1538 'bot_version': u'abc', | 1570 'bot_version': u'abc', |
| 1571 'cipd_pins': None, |
| 1539 'children_task_ids': [], | 1572 'children_task_ids': [], |
| 1540 'completed_ts': None, | 1573 'completed_ts': None, |
| 1541 'costs_usd': [0.], | 1574 'costs_usd': [0.], |
| 1542 'cost_saved_usd': None, | 1575 'cost_saved_usd': None, |
| 1543 'created_ts': self.now, | 1576 'created_ts': self.now, |
| 1544 'deduped_from': None, | 1577 'deduped_from': None, |
| 1545 'duration': None, | 1578 'duration': None, |
| 1546 'exit_code': None, | 1579 'exit_code': None, |
| 1547 'failure': False, | 1580 'failure': False, |
| 1548 'id': '1d69b9f088008810', | 1581 'id': '1d69b9f088008810', |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1605 now_2 = self.mock_now(self.now + 2 * task_result.BOT_PING_TOLERANCE, 3) | 1638 now_2 = self.mock_now(self.now + 2 * task_result.BOT_PING_TOLERANCE, 3) |
| 1606 self.assertEqual( | 1639 self.assertEqual( |
| 1607 (['1d69b9f088008812'], 0, 0), | 1640 (['1d69b9f088008812'], 0, 0), |
| 1608 task_scheduler.cron_handle_bot_died('f.local')) | 1641 task_scheduler.cron_handle_bot_died('f.local')) |
| 1609 self.assertEqual(([], 0, 0), task_scheduler.cron_handle_bot_died('f.local')) | 1642 self.assertEqual(([], 0, 0), task_scheduler.cron_handle_bot_died('f.local')) |
| 1610 expected = { | 1643 expected = { |
| 1611 'abandoned_ts': now_2, | 1644 'abandoned_ts': now_2, |
| 1612 'bot_dimensions': bot_dimensions, | 1645 'bot_dimensions': bot_dimensions, |
| 1613 'bot_id': u'localhost-second', | 1646 'bot_id': u'localhost-second', |
| 1614 'bot_version': u'abc', | 1647 'bot_version': u'abc', |
| 1648 'cipd_pins': None, |
| 1615 'children_task_ids': [], | 1649 'children_task_ids': [], |
| 1616 'completed_ts': None, | 1650 'completed_ts': None, |
| 1617 'costs_usd': [0., 0.], | 1651 'costs_usd': [0., 0.], |
| 1618 'cost_saved_usd': None, | 1652 'cost_saved_usd': None, |
| 1619 'created_ts': self.now, | 1653 'created_ts': self.now, |
| 1620 'deduped_from': None, | 1654 'deduped_from': None, |
| 1621 'duration': None, | 1655 'duration': None, |
| 1622 'exit_code': None, | 1656 'exit_code': None, |
| 1623 'failure': False, | 1657 'failure': False, |
| 1624 'id': '1d69b9f088008810', | 1658 'id': '1d69b9f088008810', |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1668 (['1d69b9f088008811'], 0, 0), | 1702 (['1d69b9f088008811'], 0, 0), |
| 1669 task_scheduler.cron_handle_bot_died('f.local')) | 1703 task_scheduler.cron_handle_bot_died('f.local')) |
| 1670 | 1704 |
| 1671 | 1705 |
| 1672 if __name__ == '__main__': | 1706 if __name__ == '__main__': |
| 1673 if '-v' in sys.argv: | 1707 if '-v' in sys.argv: |
| 1674 unittest.TestCase.maxDiff = None | 1708 unittest.TestCase.maxDiff = None |
| 1675 logging.basicConfig( | 1709 logging.basicConfig( |
| 1676 level=logging.DEBUG if '-v' in sys.argv else logging.CRITICAL) | 1710 level=logging.DEBUG if '-v' in sys.argv else logging.CRITICAL) |
| 1677 unittest.main() | 1711 unittest.main() |
| OLD | NEW |