| 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 inspect | 7 import inspect |
| 8 import logging | 8 import logging |
| 9 import os | 9 import os |
| 10 import random | 10 import random |
| (...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 262 bot_dimensions, 'localhost', 'abc', None) | 262 bot_dimensions, 'localhost', 'abc', None) |
| 263 self.assertEqual(request, actual_request) | 263 self.assertEqual(request, actual_request) |
| 264 self.assertEqual('localhost', run_result.bot_id) | 264 self.assertEqual('localhost', run_result.bot_id) |
| 265 self.assertEqual(None, task_to_run.TaskToRun.query().get().queue_number) | 265 self.assertEqual(None, task_to_run.TaskToRun.query().get().queue_number) |
| 266 # It's important to terminate the task with success. | 266 # It's important to terminate the task with success. |
| 267 self.assertEqual( | 267 self.assertEqual( |
| 268 task_result.State.COMPLETED, | 268 task_result.State.COMPLETED, |
| 269 task_scheduler.bot_update_task( | 269 task_scheduler.bot_update_task( |
| 270 run_result_key=run_result.key, | 270 run_result_key=run_result.key, |
| 271 bot_id='localhost', | 271 bot_id='localhost', |
| 272 cipd_pins=None, |
| 272 output='Foo1', | 273 output='Foo1', |
| 273 output_chunk_start=0, | 274 output_chunk_start=0, |
| 274 exit_code=0, | 275 exit_code=0, |
| 275 duration=0.1, | 276 duration=0.1, |
| 276 hard_timeout=False, | 277 hard_timeout=False, |
| 277 io_timeout=False, | 278 io_timeout=False, |
| 278 cost_usd=0.1, | 279 cost_usd=0.1, |
| 279 outputs_ref=None, | 280 outputs_ref=None, |
| 280 performance_stats=None)) | 281 performance_stats=None)) |
| 281 return unicode(run_result.task_id) | 282 return unicode(run_result.task_id) |
| (...skipping 18 matching lines...) Expand all Loading... |
| 300 self.assertEqual(None, task_to_run.TaskToRun.query().get().queue_number) | 301 self.assertEqual(None, task_to_run.TaskToRun.query().get().queue_number) |
| 301 actual_request_2, run_result_2 = task_scheduler.bot_reap_task( | 302 actual_request_2, run_result_2 = task_scheduler.bot_reap_task( |
| 302 bot_dimensions, 'localhost', 'abc', None) | 303 bot_dimensions, 'localhost', 'abc', None) |
| 303 self.assertEqual(None, actual_request_2) | 304 self.assertEqual(None, actual_request_2) |
| 304 result_summary_duped, run_results_duped = get_results(request.key) | 305 result_summary_duped, run_results_duped = get_results(request.key) |
| 305 expected = { | 306 expected = { |
| 306 'abandoned_ts': None, | 307 'abandoned_ts': None, |
| 307 'bot_dimensions': bot_dimensions, | 308 'bot_dimensions': bot_dimensions, |
| 308 'bot_id': u'localhost', | 309 'bot_id': u'localhost', |
| 309 'bot_version': u'abc', | 310 'bot_version': u'abc', |
| 311 'cipd_pins': None, |
| 310 'children_task_ids': [], | 312 'children_task_ids': [], |
| 311 'completed_ts': now or self.now, | 313 'completed_ts': now or self.now, |
| 312 'costs_usd': [], | 314 'costs_usd': [], |
| 313 'cost_saved_usd': 0.1, | 315 'cost_saved_usd': 0.1, |
| 314 'created_ts': new_ts, | 316 'created_ts': new_ts, |
| 315 'deduped_from': deduped_from, | 317 'deduped_from': deduped_from, |
| 316 'duration': 0.1, | 318 'duration': 0.1, |
| 317 'exit_code': 0, | 319 'exit_code': 0, |
| 318 'failure': False, | 320 'failure': False, |
| 319 'id': task_id, | 321 'id': task_id, |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 460 bot_dimensions, 'localhost', 'abc', None) | 462 bot_dimensions, 'localhost', 'abc', None) |
| 461 self.assertEqual(request, actual_request) | 463 self.assertEqual(request, actual_request) |
| 462 self.assertEqual('localhost', run_result.bot_id) | 464 self.assertEqual('localhost', run_result.bot_id) |
| 463 self.assertEqual(None, task_to_run.TaskToRun.query().get().queue_number) | 465 self.assertEqual(None, task_to_run.TaskToRun.query().get().queue_number) |
| 464 # It's important to terminate the task with success. | 466 # It's important to terminate the task with success. |
| 465 self.assertEqual( | 467 self.assertEqual( |
| 466 task_result.State.COMPLETED, | 468 task_result.State.COMPLETED, |
| 467 task_scheduler.bot_update_task( | 469 task_scheduler.bot_update_task( |
| 468 run_result_key=run_result.key, | 470 run_result_key=run_result.key, |
| 469 bot_id='localhost', | 471 bot_id='localhost', |
| 472 cipd_pins=None, |
| 470 output='Foo1', | 473 output='Foo1', |
| 471 output_chunk_start=0, | 474 output_chunk_start=0, |
| 472 exit_code=0, | 475 exit_code=0, |
| 473 duration=0.1, | 476 duration=0.1, |
| 474 hard_timeout=False, | 477 hard_timeout=False, |
| 475 io_timeout=False, | 478 io_timeout=False, |
| 476 cost_usd=0.1, | 479 cost_usd=0.1, |
| 477 outputs_ref=None, | 480 outputs_ref=None, |
| 478 performance_stats=None)) | 481 performance_stats=None)) |
| 479 | 482 |
| (...skipping 28 matching lines...) Expand all Loading... |
| 508 _result_summary = task_scheduler.schedule_request(request) | 511 _result_summary = task_scheduler.schedule_request(request) |
| 509 | 512 |
| 510 # The TaskRequest was enqueued, the TaskResultSummary was created but no | 513 # The TaskRequest was enqueued, the TaskResultSummary was created but no |
| 511 # TaskRunResult exist yet since the task was not scheduled on any bot. | 514 # TaskRunResult exist yet since the task was not scheduled on any bot. |
| 512 result_summary, run_results = get_results(request.key) | 515 result_summary, run_results = get_results(request.key) |
| 513 expected = { | 516 expected = { |
| 514 'abandoned_ts': None, | 517 'abandoned_ts': None, |
| 515 'bot_dimensions': None, | 518 'bot_dimensions': None, |
| 516 'bot_id': None, | 519 'bot_id': None, |
| 517 'bot_version': None, | 520 'bot_version': None, |
| 521 'cipd_pins': None, |
| 518 'children_task_ids': [], | 522 'children_task_ids': [], |
| 519 'completed_ts': None, | 523 'completed_ts': None, |
| 520 'costs_usd': [], | 524 'costs_usd': [], |
| 521 'cost_saved_usd': None, | 525 'cost_saved_usd': None, |
| 522 'created_ts': created_ts, | 526 'created_ts': created_ts, |
| 523 'deduped_from': None, | 527 'deduped_from': None, |
| 524 'duration': None, | 528 'duration': None, |
| 525 'exit_code': None, | 529 'exit_code': None, |
| 526 'failure': False, | 530 'failure': False, |
| 527 'id': '1d69b9f088008810', | 531 'id': '1d69b9f088008810', |
| (...skipping 25 matching lines...) Expand all Loading... |
| 553 reaped_request, run_result = task_scheduler.bot_reap_task( | 557 reaped_request, run_result = task_scheduler.bot_reap_task( |
| 554 bot_dimensions, 'localhost', 'abc', None) | 558 bot_dimensions, 'localhost', 'abc', None) |
| 555 self.assertEqual(request, reaped_request) | 559 self.assertEqual(request, reaped_request) |
| 556 self.assertTrue(run_result) | 560 self.assertTrue(run_result) |
| 557 result_summary, run_results = get_results(request.key) | 561 result_summary, run_results = get_results(request.key) |
| 558 expected = { | 562 expected = { |
| 559 'abandoned_ts': None, | 563 'abandoned_ts': None, |
| 560 'bot_dimensions': bot_dimensions, | 564 'bot_dimensions': bot_dimensions, |
| 561 'bot_id': u'localhost', | 565 'bot_id': u'localhost', |
| 562 'bot_version': u'abc', | 566 'bot_version': u'abc', |
| 567 'cipd_pins': None, |
| 563 'children_task_ids': [], | 568 'children_task_ids': [], |
| 564 'completed_ts': None, | 569 'completed_ts': None, |
| 565 'costs_usd': [0.], | 570 'costs_usd': [0.], |
| 566 'cost_saved_usd': None, | 571 'cost_saved_usd': None, |
| 567 'created_ts': created_ts, # Time the TaskRequest was created. | 572 'created_ts': created_ts, # Time the TaskRequest was created. |
| 568 'deduped_from': None, | 573 'deduped_from': None, |
| 569 'duration': None, | 574 'duration': None, |
| 570 'exit_code': None, | 575 'exit_code': None, |
| 571 'failure': False, | 576 'failure': False, |
| 572 'id': '1d69b9f088008810', | 577 'id': '1d69b9f088008810', |
| (...skipping 15 matching lines...) Expand all Loading... |
| 588 'try_number': 1, | 593 'try_number': 1, |
| 589 'user': u'Jesus', | 594 'user': u'Jesus', |
| 590 } | 595 } |
| 591 self.assertEqual(expected, result_summary.to_dict()) | 596 self.assertEqual(expected, result_summary.to_dict()) |
| 592 expected = [ | 597 expected = [ |
| 593 { | 598 { |
| 594 'abandoned_ts': None, | 599 'abandoned_ts': None, |
| 595 'bot_dimensions': bot_dimensions, | 600 'bot_dimensions': bot_dimensions, |
| 596 'bot_id': u'localhost', | 601 'bot_id': u'localhost', |
| 597 'bot_version': u'abc', | 602 'bot_version': u'abc', |
| 603 'cipd_pins': None, |
| 598 'children_task_ids': [], | 604 'children_task_ids': [], |
| 599 'completed_ts': None, | 605 'completed_ts': None, |
| 600 'cost_usd': 0., | 606 'cost_usd': 0., |
| 601 'duration': None, | 607 'duration': None, |
| 602 'exit_code': None, | 608 'exit_code': None, |
| 603 'failure': False, | 609 'failure': False, |
| 604 'id': '1d69b9f088008811', | 610 'id': '1d69b9f088008811', |
| 605 'internal_failure': False, | 611 'internal_failure': False, |
| 606 'modified_ts': reaped_ts, | 612 'modified_ts': reaped_ts, |
| 607 'outputs_ref': None, | 613 'outputs_ref': None, |
| (...skipping 20 matching lines...) Expand all Loading... |
| 628 items_hot='bb'), | 634 items_hot='bb'), |
| 629 isolated_upload=task_result.OperationStats( | 635 isolated_upload=task_result.OperationStats( |
| 630 duration=0.1, | 636 duration=0.1, |
| 631 items_cold='aa', | 637 items_cold='aa', |
| 632 items_hot='bb')) | 638 items_hot='bb')) |
| 633 self.assertEqual( | 639 self.assertEqual( |
| 634 task_result.State.COMPLETED, | 640 task_result.State.COMPLETED, |
| 635 task_scheduler.bot_update_task( | 641 task_scheduler.bot_update_task( |
| 636 run_result_key=run_result.key, | 642 run_result_key=run_result.key, |
| 637 bot_id='localhost', | 643 bot_id='localhost', |
| 644 cipd_pins=None, |
| 638 output='Foo1', | 645 output='Foo1', |
| 639 output_chunk_start=0, | 646 output_chunk_start=0, |
| 640 exit_code=0, | 647 exit_code=0, |
| 641 duration=3., | 648 duration=3., |
| 642 hard_timeout=False, | 649 hard_timeout=False, |
| 643 io_timeout=False, | 650 io_timeout=False, |
| 644 cost_usd=0.1, | 651 cost_usd=0.1, |
| 645 outputs_ref=outputs_ref, | 652 outputs_ref=outputs_ref, |
| 646 performance_stats=performance_stats)) | 653 performance_stats=performance_stats)) |
| 647 # Simulate an unexpected retry, e.g. the response of the previous RPC never | 654 # Simulate an unexpected retry, e.g. the response of the previous RPC never |
| 648 # got the the client even if it succeedded. | 655 # got the the client even if it succeedded. |
| 649 self.assertEqual( | 656 self.assertEqual( |
| 650 task_result.State.COMPLETED, | 657 task_result.State.COMPLETED, |
| 651 task_scheduler.bot_update_task( | 658 task_scheduler.bot_update_task( |
| 652 run_result_key=run_result.key, | 659 run_result_key=run_result.key, |
| 653 bot_id='localhost', | 660 bot_id='localhost', |
| 661 cipd_pins=None, |
| 654 output='Foo1', | 662 output='Foo1', |
| 655 output_chunk_start=0, | 663 output_chunk_start=0, |
| 656 exit_code=0, | 664 exit_code=0, |
| 657 duration=3., | 665 duration=3., |
| 658 hard_timeout=False, | 666 hard_timeout=False, |
| 659 io_timeout=False, | 667 io_timeout=False, |
| 660 cost_usd=0.1, | 668 cost_usd=0.1, |
| 661 outputs_ref=outputs_ref, | 669 outputs_ref=outputs_ref, |
| 662 performance_stats=performance_stats)) | 670 performance_stats=performance_stats)) |
| 663 result_summary, run_results = get_results(request.key) | 671 result_summary, run_results = get_results(request.key) |
| 664 expected = { | 672 expected = { |
| 665 'abandoned_ts': None, | 673 'abandoned_ts': None, |
| 666 'bot_dimensions': bot_dimensions, | 674 'bot_dimensions': bot_dimensions, |
| 667 'bot_id': u'localhost', | 675 'bot_id': u'localhost', |
| 668 'bot_version': u'abc', | 676 'bot_version': u'abc', |
| 677 'cipd_pins': None, |
| 669 'children_task_ids': [], | 678 'children_task_ids': [], |
| 670 'completed_ts': done_ts, | 679 'completed_ts': done_ts, |
| 671 'costs_usd': [0.1], | 680 'costs_usd': [0.1], |
| 672 'cost_saved_usd': None, | 681 'cost_saved_usd': None, |
| 673 'created_ts': created_ts, | 682 'created_ts': created_ts, |
| 674 'deduped_from': None, | 683 'deduped_from': None, |
| 675 'duration': 3.0, | 684 'duration': 3.0, |
| 676 'exit_code': 0, | 685 'exit_code': 0, |
| 677 'failure': False, | 686 'failure': False, |
| 678 'id': '1d69b9f088008810', | 687 'id': '1d69b9f088008810', |
| (...skipping 19 matching lines...) Expand all Loading... |
| 698 'try_number': 1, | 707 'try_number': 1, |
| 699 'user': u'Jesus', | 708 'user': u'Jesus', |
| 700 } | 709 } |
| 701 self.assertEqual(expected, result_summary.to_dict()) | 710 self.assertEqual(expected, result_summary.to_dict()) |
| 702 expected = [ | 711 expected = [ |
| 703 { | 712 { |
| 704 'abandoned_ts': None, | 713 'abandoned_ts': None, |
| 705 'bot_dimensions': bot_dimensions, | 714 'bot_dimensions': bot_dimensions, |
| 706 'bot_id': u'localhost', | 715 'bot_id': u'localhost', |
| 707 'bot_version': u'abc', | 716 'bot_version': u'abc', |
| 717 'cipd_pins': None, |
| 708 'children_task_ids': [], | 718 'children_task_ids': [], |
| 709 'completed_ts': done_ts, | 719 'completed_ts': done_ts, |
| 710 'cost_usd': 0.1, | 720 'cost_usd': 0.1, |
| 711 'duration': 3.0, | 721 'duration': 3.0, |
| 712 'exit_code': 0, | 722 'exit_code': 0, |
| 713 'failure': False, | 723 'failure': False, |
| 714 'id': '1d69b9f088008811', | 724 'id': '1d69b9f088008811', |
| 715 'internal_failure': False, | 725 'internal_failure': False, |
| 716 'modified_ts': done_ts, | 726 'modified_ts': done_ts, |
| 717 'outputs_ref': { | 727 'outputs_ref': { |
| (...skipping 19 matching lines...) Expand all Loading... |
| 737 _result_summary = task_scheduler.schedule_request(request) | 747 _result_summary = task_scheduler.schedule_request(request) |
| 738 bot_dimensions = {'OS': 'Windows-3.1.1', u'pool': u'default'} | 748 bot_dimensions = {'OS': 'Windows-3.1.1', u'pool': u'default'} |
| 739 reaped_request, run_result = task_scheduler.bot_reap_task( | 749 reaped_request, run_result = task_scheduler.bot_reap_task( |
| 740 bot_dimensions, 'localhost', 'abc', None) | 750 bot_dimensions, 'localhost', 'abc', None) |
| 741 self.assertEqual(request, reaped_request) | 751 self.assertEqual(request, reaped_request) |
| 742 self.assertEqual( | 752 self.assertEqual( |
| 743 task_result.State.COMPLETED, | 753 task_result.State.COMPLETED, |
| 744 task_scheduler.bot_update_task( | 754 task_scheduler.bot_update_task( |
| 745 run_result_key=run_result.key, | 755 run_result_key=run_result.key, |
| 746 bot_id='localhost', | 756 bot_id='localhost', |
| 757 cipd_pins=None, |
| 747 output='Foo1', | 758 output='Foo1', |
| 748 output_chunk_start=0, | 759 output_chunk_start=0, |
| 749 exit_code=1, | 760 exit_code=1, |
| 750 duration=0.1, | 761 duration=0.1, |
| 751 hard_timeout=False, | 762 hard_timeout=False, |
| 752 io_timeout=False, | 763 io_timeout=False, |
| 753 cost_usd=0.1, | 764 cost_usd=0.1, |
| 754 outputs_ref=None, | 765 outputs_ref=None, |
| 755 performance_stats=None)) | 766 performance_stats=None)) |
| 756 result_summary, run_results = get_results(request.key) | 767 result_summary, run_results = get_results(request.key) |
| 757 | 768 |
| 758 expected = { | 769 expected = { |
| 759 'abandoned_ts': None, | 770 'abandoned_ts': None, |
| 760 'bot_dimensions': bot_dimensions, | 771 'bot_dimensions': bot_dimensions, |
| 761 'bot_id': u'localhost', | 772 'bot_id': u'localhost', |
| 762 'bot_version': u'abc', | 773 'bot_version': u'abc', |
| 774 'cipd_pins': None, |
| 763 'children_task_ids': [], | 775 'children_task_ids': [], |
| 764 'completed_ts': self.now, | 776 'completed_ts': self.now, |
| 765 'costs_usd': [0.1], | 777 'costs_usd': [0.1], |
| 766 'cost_saved_usd': None, | 778 'cost_saved_usd': None, |
| 767 'created_ts': self.now, | 779 'created_ts': self.now, |
| 768 'deduped_from': None, | 780 'deduped_from': None, |
| 769 'duration': 0.1, | 781 'duration': 0.1, |
| 770 'exit_code': 1, | 782 'exit_code': 1, |
| 771 'failure': True, | 783 'failure': True, |
| 772 'id': '1d69b9f088008810', | 784 'id': '1d69b9f088008810', |
| (...skipping 16 matching lines...) Expand all Loading... |
| 789 'user': u'Jesus', | 801 'user': u'Jesus', |
| 790 } | 802 } |
| 791 self.assertEqual(expected, result_summary.to_dict()) | 803 self.assertEqual(expected, result_summary.to_dict()) |
| 792 | 804 |
| 793 expected = [ | 805 expected = [ |
| 794 { | 806 { |
| 795 'abandoned_ts': None, | 807 'abandoned_ts': None, |
| 796 'bot_dimensions': bot_dimensions, | 808 'bot_dimensions': bot_dimensions, |
| 797 'bot_id': u'localhost', | 809 'bot_id': u'localhost', |
| 798 'bot_version': u'abc', | 810 'bot_version': u'abc', |
| 811 'cipd_pins': None, |
| 799 'children_task_ids': [], | 812 'children_task_ids': [], |
| 800 'completed_ts': self.now, | 813 'completed_ts': self.now, |
| 801 'cost_usd': 0.1, | 814 'cost_usd': 0.1, |
| 802 'duration': 0.1, | 815 'duration': 0.1, |
| 803 'exit_code': 1, | 816 'exit_code': 1, |
| 804 'failure': True, | 817 'failure': True, |
| 805 'id': '1d69b9f088008811', | 818 'id': '1d69b9f088008811', |
| 806 'internal_failure': False, | 819 'internal_failure': False, |
| 807 'modified_ts': self.now, | 820 'modified_ts': self.now, |
| 808 'outputs_ref': None, | 821 'outputs_ref': None, |
| (...skipping 14 matching lines...) Expand all Loading... |
| 823 task_request.init_new_request(request, True) | 836 task_request.init_new_request(request, True) |
| 824 self.assertTrue(task_scheduler.schedule_request(request)) | 837 self.assertTrue(task_scheduler.schedule_request(request)) |
| 825 | 838 |
| 826 def test_bot_update_task(self): | 839 def test_bot_update_task(self): |
| 827 run_result = _quick_reap() | 840 run_result = _quick_reap() |
| 828 self.assertEqual( | 841 self.assertEqual( |
| 829 task_result.State.RUNNING, | 842 task_result.State.RUNNING, |
| 830 task_scheduler.bot_update_task( | 843 task_scheduler.bot_update_task( |
| 831 run_result_key=run_result.key, | 844 run_result_key=run_result.key, |
| 832 bot_id='localhost', | 845 bot_id='localhost', |
| 846 cipd_pins=None, |
| 833 output='hi', | 847 output='hi', |
| 834 output_chunk_start=0, | 848 output_chunk_start=0, |
| 835 exit_code=None, | 849 exit_code=None, |
| 836 duration=None, | 850 duration=None, |
| 837 hard_timeout=False, | 851 hard_timeout=False, |
| 838 io_timeout=False, | 852 io_timeout=False, |
| 839 cost_usd=0.1, | 853 cost_usd=0.1, |
| 840 outputs_ref=None, | 854 outputs_ref=None, |
| 841 performance_stats=None)) | 855 performance_stats=None)) |
| 842 self.assertEqual( | 856 self.assertEqual( |
| 843 task_result.State.COMPLETED, | 857 task_result.State.COMPLETED, |
| 844 task_scheduler.bot_update_task( | 858 task_scheduler.bot_update_task( |
| 845 run_result_key=run_result.key, | 859 run_result_key=run_result.key, |
| 846 bot_id='localhost', | 860 bot_id='localhost', |
| 861 cipd_pins=None, |
| 847 output='hey', | 862 output='hey', |
| 848 output_chunk_start=2, | 863 output_chunk_start=2, |
| 849 exit_code=0, | 864 exit_code=0, |
| 850 duration=0.1, | 865 duration=0.1, |
| 851 hard_timeout=False, | 866 hard_timeout=False, |
| 852 io_timeout=False, | 867 io_timeout=False, |
| 853 cost_usd=0.1, | 868 cost_usd=0.1, |
| 854 outputs_ref=None, | 869 outputs_ref=None, |
| 855 performance_stats=None)) | 870 performance_stats=None)) |
| 856 self.assertEqual('hihey', run_result.key.get().get_output()) | 871 self.assertEqual('hihey', run_result.key.get().get_output()) |
| 857 | 872 |
| 858 def test_bot_update_task_new_overwrite(self): | 873 def test_bot_update_task_new_overwrite(self): |
| 859 run_result = _quick_reap() | 874 run_result = _quick_reap() |
| 860 self.assertEqual( | 875 self.assertEqual( |
| 861 task_result.State.RUNNING, | 876 task_result.State.RUNNING, |
| 862 task_scheduler.bot_update_task( | 877 task_scheduler.bot_update_task( |
| 863 run_result_key=run_result.key, | 878 run_result_key=run_result.key, |
| 864 bot_id='localhost', | 879 bot_id='localhost', |
| 880 cipd_pins=None, |
| 865 output='hi', | 881 output='hi', |
| 866 output_chunk_start=0, | 882 output_chunk_start=0, |
| 867 exit_code=None, | 883 exit_code=None, |
| 868 duration=None, | 884 duration=None, |
| 869 hard_timeout=False, | 885 hard_timeout=False, |
| 870 io_timeout=False, | 886 io_timeout=False, |
| 871 cost_usd=0.1, | 887 cost_usd=0.1, |
| 872 outputs_ref=None, | 888 outputs_ref=None, |
| 873 performance_stats=None)) | 889 performance_stats=None)) |
| 874 self.assertEqual( | 890 self.assertEqual( |
| 875 task_result.State.RUNNING, | 891 task_result.State.RUNNING, |
| 876 task_scheduler.bot_update_task( | 892 task_scheduler.bot_update_task( |
| 877 run_result_key=run_result.key, | 893 run_result_key=run_result.key, |
| 878 bot_id='localhost', | 894 bot_id='localhost', |
| 895 cipd_pins=None, |
| 879 output='hey', | 896 output='hey', |
| 880 output_chunk_start=1, | 897 output_chunk_start=1, |
| 881 exit_code=None, | 898 exit_code=None, |
| 882 duration=None, | 899 duration=None, |
| 883 hard_timeout=False, | 900 hard_timeout=False, |
| 884 io_timeout=False, | 901 io_timeout=False, |
| 885 cost_usd=0.1, | 902 cost_usd=0.1, |
| 886 outputs_ref=None, | 903 outputs_ref=None, |
| 887 performance_stats=None)) | 904 performance_stats=None)) |
| 888 self.assertEqual('hhey', run_result.key.get().get_output()) | 905 self.assertEqual('hhey', run_result.key.get().get_output()) |
| 889 | 906 |
| 890 def test_bot_update_exception(self): | 907 def test_bot_update_exception(self): |
| 891 run_result = _quick_reap() | 908 run_result = _quick_reap() |
| 892 def r(*_): | 909 def r(*_): |
| 893 raise datastore_utils.CommitError('Sorry!') | 910 raise datastore_utils.CommitError('Sorry!') |
| 894 | 911 |
| 895 self.mock(ndb, 'put_multi', r) | 912 self.mock(ndb, 'put_multi', r) |
| 896 self.assertEqual( | 913 self.assertEqual( |
| 897 None, | 914 None, |
| 898 task_scheduler.bot_update_task( | 915 task_scheduler.bot_update_task( |
| 899 run_result_key=run_result.key, | 916 run_result_key=run_result.key, |
| 900 bot_id='localhost', | 917 bot_id='localhost', |
| 918 cipd_pins=None, |
| 901 output='hi', | 919 output='hi', |
| 902 output_chunk_start=0, | 920 output_chunk_start=0, |
| 903 exit_code=0, | 921 exit_code=0, |
| 904 duration=0.1, | 922 duration=0.1, |
| 905 hard_timeout=False, | 923 hard_timeout=False, |
| 906 io_timeout=False, | 924 io_timeout=False, |
| 907 cost_usd=0.1, | 925 cost_usd=0.1, |
| 908 outputs_ref=None, | 926 outputs_ref=None, |
| 909 performance_stats=None)) | 927 performance_stats=None)) |
| 910 | 928 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 926 bot_dimensions, 'localhost', 'abc', None) | 944 bot_dimensions, 'localhost', 'abc', None) |
| 927 self.assertEqual('localhost', run_result.bot_id) | 945 self.assertEqual('localhost', run_result.bot_id) |
| 928 | 946 |
| 929 # Attempt to terminate the task with success, but make PubSub call fail. | 947 # Attempt to terminate the task with success, but make PubSub call fail. |
| 930 self.mock_pub_sub(publish_successful=False) | 948 self.mock_pub_sub(publish_successful=False) |
| 931 self.assertEqual( | 949 self.assertEqual( |
| 932 None, | 950 None, |
| 933 task_scheduler.bot_update_task( | 951 task_scheduler.bot_update_task( |
| 934 run_result_key=run_result.key, | 952 run_result_key=run_result.key, |
| 935 bot_id='localhost', | 953 bot_id='localhost', |
| 954 cipd_pins=None, |
| 936 output='Foo1', | 955 output='Foo1', |
| 937 output_chunk_start=0, | 956 output_chunk_start=0, |
| 938 exit_code=0, | 957 exit_code=0, |
| 939 duration=0.1, | 958 duration=0.1, |
| 940 hard_timeout=False, | 959 hard_timeout=False, |
| 941 io_timeout=False, | 960 io_timeout=False, |
| 942 cost_usd=0.1, | 961 cost_usd=0.1, |
| 943 outputs_ref=None, | 962 outputs_ref=None, |
| 944 performance_stats=None)) | 963 performance_stats=None)) |
| 945 | 964 |
| 946 # Bot retries bot_update, now PubSub works and notification is sent. | 965 # Bot retries bot_update, now PubSub works and notification is sent. |
| 947 pub_sub_calls = self.mock_pub_sub(publish_successful=True) | 966 pub_sub_calls = self.mock_pub_sub(publish_successful=True) |
| 948 self.assertEqual( | 967 self.assertEqual( |
| 949 task_result.State.COMPLETED, | 968 task_result.State.COMPLETED, |
| 950 task_scheduler.bot_update_task( | 969 task_scheduler.bot_update_task( |
| 951 run_result_key=run_result.key, | 970 run_result_key=run_result.key, |
| 952 bot_id='localhost', | 971 bot_id='localhost', |
| 972 cipd_pins=None, |
| 953 output='Foo1', | 973 output='Foo1', |
| 954 output_chunk_start=0, | 974 output_chunk_start=0, |
| 955 exit_code=0, | 975 exit_code=0, |
| 956 duration=0.1, | 976 duration=0.1, |
| 957 hard_timeout=False, | 977 hard_timeout=False, |
| 958 io_timeout=False, | 978 io_timeout=False, |
| 959 cost_usd=0.1, | 979 cost_usd=0.1, |
| 960 outputs_ref=None, | 980 outputs_ref=None, |
| 961 performance_stats=None)) | 981 performance_stats=None)) |
| 962 self.assertEqual(1, len(pub_sub_calls)) # notification is sent | 982 self.assertEqual(1, len(pub_sub_calls)) # notification is sent |
| 963 | 983 |
| 964 def _bot_update_timeouts(self, hard, io): | 984 def _bot_update_timeouts(self, hard, io): |
| 965 self.mock(random, 'getrandbits', lambda _: 0x88) | 985 self.mock(random, 'getrandbits', lambda _: 0x88) |
| 966 request = _gen_request( | 986 request = _gen_request( |
| 967 properties={ | 987 properties={ |
| 968 'dimensions': {u'OS': u'Windows-3.1.1', u'pool': u'default'}, | 988 'dimensions': {u'OS': u'Windows-3.1.1', u'pool': u'default'}, |
| 969 }) | 989 }) |
| 970 task_request.init_new_request(request, True) | 990 task_request.init_new_request(request, True) |
| 971 result_summary = task_scheduler.schedule_request(request) | 991 result_summary = task_scheduler.schedule_request(request) |
| 972 bot_dimensions = {'OS': 'Windows-3.1.1', u'pool': u'default'} | 992 bot_dimensions = {'OS': 'Windows-3.1.1', u'pool': u'default'} |
| 973 reaped_request, run_result = task_scheduler.bot_reap_task( | 993 reaped_request, run_result = task_scheduler.bot_reap_task( |
| 974 bot_dimensions, 'localhost', 'abc', None) | 994 bot_dimensions, 'localhost', 'abc', None) |
| 975 self.assertEqual( | 995 self.assertEqual( |
| 976 task_result.State.TIMED_OUT, | 996 task_result.State.TIMED_OUT, |
| 977 task_scheduler.bot_update_task( | 997 task_scheduler.bot_update_task( |
| 978 run_result_key=run_result.key, | 998 run_result_key=run_result.key, |
| 979 bot_id='localhost', | 999 bot_id='localhost', |
| 1000 cipd_pins=None, |
| 980 output='hi', | 1001 output='hi', |
| 981 output_chunk_start=0, | 1002 output_chunk_start=0, |
| 982 exit_code=0, | 1003 exit_code=0, |
| 983 duration=0.1, | 1004 duration=0.1, |
| 984 hard_timeout=hard, | 1005 hard_timeout=hard, |
| 985 io_timeout=io, | 1006 io_timeout=io, |
| 986 cost_usd=0.1, | 1007 cost_usd=0.1, |
| 987 outputs_ref=None, | 1008 outputs_ref=None, |
| 988 performance_stats=None)) | 1009 performance_stats=None)) |
| 989 expected = { | 1010 expected = { |
| 990 'abandoned_ts': None, | 1011 'abandoned_ts': None, |
| 991 'bot_dimensions': bot_dimensions, | 1012 'bot_dimensions': bot_dimensions, |
| 992 'bot_id': u'localhost', | 1013 'bot_id': u'localhost', |
| 993 'bot_version': u'abc', | 1014 'bot_version': u'abc', |
| 1015 'cipd_pins': None, |
| 994 'children_task_ids': [], | 1016 'children_task_ids': [], |
| 995 'completed_ts': self.now, | 1017 'completed_ts': self.now, |
| 996 'costs_usd': [0.1], | 1018 'costs_usd': [0.1], |
| 997 'cost_saved_usd': None, | 1019 'cost_saved_usd': None, |
| 998 'created_ts': self.now, | 1020 'created_ts': self.now, |
| 999 'deduped_from': None, | 1021 'deduped_from': None, |
| 1000 'duration': 0.1, | 1022 'duration': 0.1, |
| 1001 'exit_code': 0, | 1023 'exit_code': 0, |
| 1002 'failure': True, | 1024 'failure': True, |
| 1003 'id': '1d69b9f088008810', | 1025 'id': '1d69b9f088008810', |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1019 'try_number': 1, | 1041 'try_number': 1, |
| 1020 'user': u'Jesus', | 1042 'user': u'Jesus', |
| 1021 } | 1043 } |
| 1022 self.assertEqual(expected, result_summary.key.get().to_dict()) | 1044 self.assertEqual(expected, result_summary.key.get().to_dict()) |
| 1023 | 1045 |
| 1024 expected = { | 1046 expected = { |
| 1025 'abandoned_ts': None, | 1047 'abandoned_ts': None, |
| 1026 'bot_dimensions': bot_dimensions, | 1048 'bot_dimensions': bot_dimensions, |
| 1027 'bot_id': u'localhost', | 1049 'bot_id': u'localhost', |
| 1028 'bot_version': u'abc', | 1050 'bot_version': u'abc', |
| 1051 'cipd_pins': None, |
| 1029 'children_task_ids': [], | 1052 'children_task_ids': [], |
| 1030 'completed_ts': self.now, | 1053 'completed_ts': self.now, |
| 1031 'cost_usd': 0.1, | 1054 'cost_usd': 0.1, |
| 1032 'duration': 0.1, | 1055 'duration': 0.1, |
| 1033 'exit_code': 0, | 1056 'exit_code': 0, |
| 1034 'failure': True, | 1057 'failure': True, |
| 1035 'id': '1d69b9f088008811', | 1058 'id': '1d69b9f088008811', |
| 1036 'internal_failure': False, | 1059 'internal_failure': False, |
| 1037 'modified_ts': self.now, | 1060 'modified_ts': self.now, |
| 1038 'outputs_ref': None, | 1061 'outputs_ref': None, |
| (...skipping 22 matching lines...) Expand all Loading... |
| 1061 reaped_request, run_result = task_scheduler.bot_reap_task( | 1084 reaped_request, run_result = task_scheduler.bot_reap_task( |
| 1062 {'OS': 'Windows-3.1.1', u'pool': u'default'}, 'localhost', 'abc', None) | 1085 {'OS': 'Windows-3.1.1', u'pool': u'default'}, 'localhost', 'abc', None) |
| 1063 | 1086 |
| 1064 self.assertEqual( | 1087 self.assertEqual( |
| 1065 None, task_scheduler.bot_kill_task(run_result.key, 'localhost')) | 1088 None, task_scheduler.bot_kill_task(run_result.key, 'localhost')) |
| 1066 expected = { | 1089 expected = { |
| 1067 'abandoned_ts': self.now, | 1090 'abandoned_ts': self.now, |
| 1068 'bot_dimensions': dimensions, | 1091 'bot_dimensions': dimensions, |
| 1069 'bot_id': u'localhost', | 1092 'bot_id': u'localhost', |
| 1070 'bot_version': u'abc', | 1093 'bot_version': u'abc', |
| 1094 'cipd_pins': None, |
| 1071 'children_task_ids': [], | 1095 'children_task_ids': [], |
| 1072 'completed_ts': None, | 1096 'completed_ts': None, |
| 1073 'costs_usd': [0.], | 1097 'costs_usd': [0.], |
| 1074 'cost_saved_usd': None, | 1098 'cost_saved_usd': None, |
| 1075 'created_ts': self.now, | 1099 'created_ts': self.now, |
| 1076 'deduped_from': None, | 1100 'deduped_from': None, |
| 1077 'duration': None, | 1101 'duration': None, |
| 1078 'exit_code': None, | 1102 'exit_code': None, |
| 1079 'failure': False, | 1103 'failure': False, |
| 1080 'id': '1d69b9f088008810', | 1104 'id': '1d69b9f088008810', |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1095 ], | 1119 ], |
| 1096 'try_number': 1, | 1120 'try_number': 1, |
| 1097 'user': u'Jesus', | 1121 'user': u'Jesus', |
| 1098 } | 1122 } |
| 1099 self.assertEqual(expected, result_summary.key.get().to_dict()) | 1123 self.assertEqual(expected, result_summary.key.get().to_dict()) |
| 1100 expected = { | 1124 expected = { |
| 1101 'abandoned_ts': self.now, | 1125 'abandoned_ts': self.now, |
| 1102 'bot_dimensions': dimensions, | 1126 'bot_dimensions': dimensions, |
| 1103 'bot_id': u'localhost', | 1127 'bot_id': u'localhost', |
| 1104 'bot_version': u'abc', | 1128 'bot_version': u'abc', |
| 1129 'cipd_pins': None, |
| 1105 'children_task_ids': [], | 1130 'children_task_ids': [], |
| 1106 'completed_ts': None, | 1131 'completed_ts': None, |
| 1107 'cost_usd': 0., | 1132 'cost_usd': 0., |
| 1108 'duration': None, | 1133 'duration': None, |
| 1109 'exit_code': None, | 1134 'exit_code': None, |
| 1110 'failure': False, | 1135 'failure': False, |
| 1111 'id': '1d69b9f088008811', | 1136 'id': '1d69b9f088008811', |
| 1112 'internal_failure': True, | 1137 'internal_failure': True, |
| 1113 'modified_ts': self.now, | 1138 'modified_ts': self.now, |
| 1114 'outputs_ref': None, | 1139 'outputs_ref': None, |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1183 abandoned_ts = self.mock_now(self.now, request.expiration_secs+1) | 1208 abandoned_ts = self.mock_now(self.now, request.expiration_secs+1) |
| 1184 self.assertEqual( | 1209 self.assertEqual( |
| 1185 ['1d69b9f088008810'], | 1210 ['1d69b9f088008810'], |
| 1186 task_scheduler.cron_abort_expired_task_to_run('f.local')) | 1211 task_scheduler.cron_abort_expired_task_to_run('f.local')) |
| 1187 self.assertEqual([], task_result.TaskRunResult.query().fetch()) | 1212 self.assertEqual([], task_result.TaskRunResult.query().fetch()) |
| 1188 expected = { | 1213 expected = { |
| 1189 'abandoned_ts': abandoned_ts, | 1214 'abandoned_ts': abandoned_ts, |
| 1190 'bot_dimensions': None, | 1215 'bot_dimensions': None, |
| 1191 'bot_id': None, | 1216 'bot_id': None, |
| 1192 'bot_version': None, | 1217 'bot_version': None, |
| 1218 'cipd_pins': None, |
| 1193 'children_task_ids': [], | 1219 'children_task_ids': [], |
| 1194 'completed_ts': None, | 1220 'completed_ts': None, |
| 1195 'costs_usd': [], | 1221 'costs_usd': [], |
| 1196 'cost_saved_usd': None, | 1222 'cost_saved_usd': None, |
| 1197 'created_ts': self.now, | 1223 'created_ts': self.now, |
| 1198 'deduped_from': None, | 1224 'deduped_from': None, |
| 1199 'duration': None, | 1225 'duration': None, |
| 1200 'exit_code': None, | 1226 'exit_code': None, |
| 1201 'failure': False, | 1227 'failure': False, |
| 1202 'id': '1d69b9f088008810', | 1228 'id': '1d69b9f088008810', |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1256 abandoned_ts = self.mock_now(self.now, request.expiration_secs+1) | 1282 abandoned_ts = self.mock_now(self.now, request.expiration_secs+1) |
| 1257 self.assertEqual( | 1283 self.assertEqual( |
| 1258 ['1d69b9f088008810'], | 1284 ['1d69b9f088008810'], |
| 1259 task_scheduler.cron_abort_expired_task_to_run('f.local')) | 1285 task_scheduler.cron_abort_expired_task_to_run('f.local')) |
| 1260 self.assertEqual(1, len(task_result.TaskRunResult.query().fetch())) | 1286 self.assertEqual(1, len(task_result.TaskRunResult.query().fetch())) |
| 1261 expected = { | 1287 expected = { |
| 1262 'abandoned_ts': abandoned_ts, | 1288 'abandoned_ts': abandoned_ts, |
| 1263 'bot_dimensions': bot_dimensions, | 1289 'bot_dimensions': bot_dimensions, |
| 1264 'bot_id': u'localhost', | 1290 'bot_id': u'localhost', |
| 1265 'bot_version': u'abc', | 1291 'bot_version': u'abc', |
| 1292 'cipd_pins': None, |
| 1266 'children_task_ids': [], | 1293 'children_task_ids': [], |
| 1267 'completed_ts': None, | 1294 'completed_ts': None, |
| 1268 'costs_usd': [0.], | 1295 'costs_usd': [0.], |
| 1269 'cost_saved_usd': None, | 1296 'cost_saved_usd': None, |
| 1270 'created_ts': self.now, | 1297 'created_ts': self.now, |
| 1271 'deduped_from': None, | 1298 'deduped_from': None, |
| 1272 'duration': None, | 1299 'duration': None, |
| 1273 'exit_code': None, | 1300 'exit_code': None, |
| 1274 'failure': False, | 1301 'failure': False, |
| 1275 'id': '1d69b9f088008810', | 1302 'id': '1d69b9f088008810', |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1323 self.assertEqual(task_result.State.RUNNING, run_result.state) | 1350 self.assertEqual(task_result.State.RUNNING, run_result.state) |
| 1324 now_1 = self.mock_now(self.now + task_result.BOT_PING_TOLERANCE, 1) | 1351 now_1 = self.mock_now(self.now + task_result.BOT_PING_TOLERANCE, 1) |
| 1325 self.assertEqual(([], 1, 0), task_scheduler.cron_handle_bot_died('f.local')) | 1352 self.assertEqual(([], 1, 0), task_scheduler.cron_handle_bot_died('f.local')) |
| 1326 | 1353 |
| 1327 # Refresh and compare: | 1354 # Refresh and compare: |
| 1328 expected = { | 1355 expected = { |
| 1329 'abandoned_ts': now_1, | 1356 'abandoned_ts': now_1, |
| 1330 'bot_dimensions': bot_dimensions, | 1357 'bot_dimensions': bot_dimensions, |
| 1331 'bot_id': u'localhost', | 1358 'bot_id': u'localhost', |
| 1332 'bot_version': u'abc', | 1359 'bot_version': u'abc', |
| 1360 'cipd_pins': None, |
| 1333 'children_task_ids': [], | 1361 'children_task_ids': [], |
| 1334 'completed_ts': None, | 1362 'completed_ts': None, |
| 1335 'cost_usd': 0., | 1363 'cost_usd': 0., |
| 1336 'duration': None, | 1364 'duration': None, |
| 1337 'exit_code': None, | 1365 'exit_code': None, |
| 1338 'failure': False, | 1366 'failure': False, |
| 1339 'id': '1d69b9f088008811', | 1367 'id': '1d69b9f088008811', |
| 1340 'internal_failure': True, | 1368 'internal_failure': True, |
| 1341 'modified_ts': now_1, | 1369 'modified_ts': now_1, |
| 1342 'outputs_ref': None, | 1370 'outputs_ref': None, |
| 1343 'server_versions': [u'v1a'], | 1371 'server_versions': [u'v1a'], |
| 1344 'started_ts': self.now, | 1372 'started_ts': self.now, |
| 1345 'state': task_result.State.BOT_DIED, | 1373 'state': task_result.State.BOT_DIED, |
| 1346 'try_number': 1, | 1374 'try_number': 1, |
| 1347 } | 1375 } |
| 1348 self.assertEqual(expected, run_result.key.get().to_dict()) | 1376 self.assertEqual(expected, run_result.key.get().to_dict()) |
| 1349 expected = { | 1377 expected = { |
| 1350 'abandoned_ts': None, | 1378 'abandoned_ts': None, |
| 1351 'bot_dimensions': bot_dimensions, | 1379 'bot_dimensions': bot_dimensions, |
| 1352 'bot_id': u'localhost', | 1380 'bot_id': u'localhost', |
| 1353 'bot_version': u'abc', | 1381 'bot_version': u'abc', |
| 1382 'cipd_pins': None, |
| 1354 'children_task_ids': [], | 1383 'children_task_ids': [], |
| 1355 'completed_ts': None, | 1384 'completed_ts': None, |
| 1356 'costs_usd': [0.], | 1385 'costs_usd': [0.], |
| 1357 'cost_saved_usd': None, | 1386 'cost_saved_usd': None, |
| 1358 'created_ts': self.now, | 1387 'created_ts': self.now, |
| 1359 'deduped_from': None, | 1388 'deduped_from': None, |
| 1360 'duration': None, | 1389 'duration': None, |
| 1361 'exit_code': None, | 1390 'exit_code': None, |
| 1362 'failure': False, | 1391 'failure': False, |
| 1363 'id': '1d69b9f088008810', | 1392 'id': '1d69b9f088008810', |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1388 now_2 = self.mock_now(self.now + task_result.BOT_PING_TOLERANCE, 2) | 1417 now_2 = self.mock_now(self.now + task_result.BOT_PING_TOLERANCE, 2) |
| 1389 _request, run_result = task_scheduler.bot_reap_task( | 1418 _request, run_result = task_scheduler.bot_reap_task( |
| 1390 bot_dimensions, 'localhost-second', 'abc', None) | 1419 bot_dimensions, 'localhost-second', 'abc', None) |
| 1391 logging.info('%s', [t.to_dict() for t in task_to_run.TaskToRun.query()]) | 1420 logging.info('%s', [t.to_dict() for t in task_to_run.TaskToRun.query()]) |
| 1392 self.assertEqual(2, run_result.try_number) | 1421 self.assertEqual(2, run_result.try_number) |
| 1393 self.assertEqual( | 1422 self.assertEqual( |
| 1394 task_result.State.COMPLETED, | 1423 task_result.State.COMPLETED, |
| 1395 task_scheduler.bot_update_task( | 1424 task_scheduler.bot_update_task( |
| 1396 run_result_key=run_result.key, | 1425 run_result_key=run_result.key, |
| 1397 bot_id='localhost-second', | 1426 bot_id='localhost-second', |
| 1427 cipd_pins=None, |
| 1398 output='Foo1', | 1428 output='Foo1', |
| 1399 output_chunk_start=0, | 1429 output_chunk_start=0, |
| 1400 exit_code=0, | 1430 exit_code=0, |
| 1401 duration=0.1, | 1431 duration=0.1, |
| 1402 hard_timeout=False, | 1432 hard_timeout=False, |
| 1403 io_timeout=False, | 1433 io_timeout=False, |
| 1404 cost_usd=0.1, | 1434 cost_usd=0.1, |
| 1405 outputs_ref=None, | 1435 outputs_ref=None, |
| 1406 performance_stats=None)) | 1436 performance_stats=None)) |
| 1407 expected = { | 1437 expected = { |
| 1408 'abandoned_ts': None, | 1438 'abandoned_ts': None, |
| 1409 'bot_dimensions': bot_dimensions, | 1439 'bot_dimensions': bot_dimensions, |
| 1410 'bot_id': u'localhost-second', | 1440 'bot_id': u'localhost-second', |
| 1411 'bot_version': u'abc', | 1441 'bot_version': u'abc', |
| 1442 'cipd_pins': None, |
| 1412 'children_task_ids': [], | 1443 'children_task_ids': [], |
| 1413 'completed_ts': now_2, | 1444 'completed_ts': now_2, |
| 1414 'costs_usd': [0., 0.1], | 1445 'costs_usd': [0., 0.1], |
| 1415 'cost_saved_usd': None, | 1446 'cost_saved_usd': None, |
| 1416 'created_ts': self.now, | 1447 'created_ts': self.now, |
| 1417 'deduped_from': None, | 1448 'deduped_from': None, |
| 1418 'duration': 0.1, | 1449 'duration': 0.1, |
| 1419 'exit_code': 0, | 1450 'exit_code': 0, |
| 1420 'failure': False, | 1451 'failure': False, |
| 1421 'id': '1d69b9f088008810', | 1452 'id': '1d69b9f088008810', |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1467 self.assertEqual(task_result.State.RUNNING, run_result.state) | 1498 self.assertEqual(task_result.State.RUNNING, run_result.state) |
| 1468 now_1 = self.mock_now(self.now + task_result.BOT_PING_TOLERANCE, 1) | 1499 now_1 = self.mock_now(self.now + task_result.BOT_PING_TOLERANCE, 1) |
| 1469 self.assertEqual(([], 1, 0), task_scheduler.cron_handle_bot_died('f.local')) | 1500 self.assertEqual(([], 1, 0), task_scheduler.cron_handle_bot_died('f.local')) |
| 1470 | 1501 |
| 1471 # Refresh and compare: | 1502 # Refresh and compare: |
| 1472 expected = { | 1503 expected = { |
| 1473 'abandoned_ts': now_1, | 1504 'abandoned_ts': now_1, |
| 1474 'bot_dimensions': bot_dimensions, | 1505 'bot_dimensions': bot_dimensions, |
| 1475 'bot_id': u'localhost', | 1506 'bot_id': u'localhost', |
| 1476 'bot_version': u'abc', | 1507 'bot_version': u'abc', |
| 1508 'cipd_pins': None, |
| 1477 'children_task_ids': [], | 1509 'children_task_ids': [], |
| 1478 'completed_ts': None, | 1510 'completed_ts': None, |
| 1479 'cost_usd': 0., | 1511 'cost_usd': 0., |
| 1480 'duration': None, | 1512 'duration': None, |
| 1481 'exit_code': None, | 1513 'exit_code': None, |
| 1482 'failure': False, | 1514 'failure': False, |
| 1483 'id': '1d69b9f088008811', | 1515 'id': '1d69b9f088008811', |
| 1484 'internal_failure': True, | 1516 'internal_failure': True, |
| 1485 'modified_ts': now_1, | 1517 'modified_ts': now_1, |
| 1486 'outputs_ref': None, | 1518 'outputs_ref': None, |
| 1487 'server_versions': [u'v1a'], | 1519 'server_versions': [u'v1a'], |
| 1488 'started_ts': self.now, | 1520 'started_ts': self.now, |
| 1489 'state': task_result.State.BOT_DIED, | 1521 'state': task_result.State.BOT_DIED, |
| 1490 'try_number': 1, | 1522 'try_number': 1, |
| 1491 } | 1523 } |
| 1492 self.assertEqual(expected, run_result.key.get().to_dict()) | 1524 self.assertEqual(expected, run_result.key.get().to_dict()) |
| 1493 expected = { | 1525 expected = { |
| 1494 'abandoned_ts': None, | 1526 'abandoned_ts': None, |
| 1495 'bot_dimensions': bot_dimensions, | 1527 'bot_dimensions': bot_dimensions, |
| 1496 'bot_id': u'localhost', | 1528 'bot_id': u'localhost', |
| 1497 'bot_version': u'abc', | 1529 'bot_version': u'abc', |
| 1530 'cipd_pins': None, |
| 1498 'children_task_ids': [], | 1531 'children_task_ids': [], |
| 1499 'completed_ts': None, | 1532 'completed_ts': None, |
| 1500 'costs_usd': [0.], | 1533 'costs_usd': [0.], |
| 1501 'cost_saved_usd': None, | 1534 'cost_saved_usd': None, |
| 1502 'created_ts': self.now, | 1535 'created_ts': self.now, |
| 1503 'deduped_from': None, | 1536 'deduped_from': None, |
| 1504 'duration': None, | 1537 'duration': None, |
| 1505 'exit_code': None, | 1538 'exit_code': None, |
| 1506 'failure': False, | 1539 'failure': False, |
| 1507 'id': '1d69b9f088008810', | 1540 'id': '1d69b9f088008810', |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1564 now_2 = self.mock_now(self.now + 2 * task_result.BOT_PING_TOLERANCE, 3) | 1597 now_2 = self.mock_now(self.now + 2 * task_result.BOT_PING_TOLERANCE, 3) |
| 1565 self.assertEqual( | 1598 self.assertEqual( |
| 1566 (['1d69b9f088008812'], 0, 0), | 1599 (['1d69b9f088008812'], 0, 0), |
| 1567 task_scheduler.cron_handle_bot_died('f.local')) | 1600 task_scheduler.cron_handle_bot_died('f.local')) |
| 1568 self.assertEqual(([], 0, 0), task_scheduler.cron_handle_bot_died('f.local')) | 1601 self.assertEqual(([], 0, 0), task_scheduler.cron_handle_bot_died('f.local')) |
| 1569 expected = { | 1602 expected = { |
| 1570 'abandoned_ts': now_2, | 1603 'abandoned_ts': now_2, |
| 1571 'bot_dimensions': bot_dimensions, | 1604 'bot_dimensions': bot_dimensions, |
| 1572 'bot_id': u'localhost-second', | 1605 'bot_id': u'localhost-second', |
| 1573 'bot_version': u'abc', | 1606 'bot_version': u'abc', |
| 1607 'cipd_pins': None, |
| 1574 'children_task_ids': [], | 1608 'children_task_ids': [], |
| 1575 'completed_ts': None, | 1609 'completed_ts': None, |
| 1576 'costs_usd': [0., 0.], | 1610 'costs_usd': [0., 0.], |
| 1577 'cost_saved_usd': None, | 1611 'cost_saved_usd': None, |
| 1578 'created_ts': self.now, | 1612 'created_ts': self.now, |
| 1579 'deduped_from': None, | 1613 'deduped_from': None, |
| 1580 'duration': None, | 1614 'duration': None, |
| 1581 'exit_code': None, | 1615 'exit_code': None, |
| 1582 'failure': False, | 1616 'failure': False, |
| 1583 'id': '1d69b9f088008810', | 1617 'id': '1d69b9f088008810', |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1627 (['1d69b9f088008811'], 0, 0), | 1661 (['1d69b9f088008811'], 0, 0), |
| 1628 task_scheduler.cron_handle_bot_died('f.local')) | 1662 task_scheduler.cron_handle_bot_died('f.local')) |
| 1629 | 1663 |
| 1630 | 1664 |
| 1631 if __name__ == '__main__': | 1665 if __name__ == '__main__': |
| 1632 if '-v' in sys.argv: | 1666 if '-v' in sys.argv: |
| 1633 unittest.TestCase.maxDiff = None | 1667 unittest.TestCase.maxDiff = None |
| 1634 logging.basicConfig( | 1668 logging.basicConfig( |
| 1635 level=logging.DEBUG if '-v' in sys.argv else logging.CRITICAL) | 1669 level=logging.DEBUG if '-v' in sys.argv else logging.CRITICAL) |
| 1636 unittest.main() | 1670 unittest.main() |
| OLD | NEW |