| OLD | NEW |
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # coding: utf-8 | 2 # coding: utf-8 |
| 3 # Copyright 2015 The LUCI Authors. All rights reserved. | 3 # Copyright 2015 The LUCI Authors. All rights reserved. |
| 4 # Use of this source code is governed under the Apache License, Version 2.0 | 4 # Use of this source code is governed under the Apache License, Version 2.0 |
| 5 # that can be found in the LICENSE file. | 5 # that can be found in the LICENSE file. |
| 6 | 6 |
| 7 import base64 | 7 import base64 |
| 8 import datetime | 8 import datetime |
| 9 import logging | 9 import logging |
| 10 import os | 10 import os |
| (...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 217 u'cmd': u'update', | 217 u'cmd': u'update', |
| 218 u'version': old_version, | 218 u'version': old_version, |
| 219 } | 219 } |
| 220 self.assertEqual(expected, response) | 220 self.assertEqual(expected, response) |
| 221 | 221 |
| 222 def test_poll_bot_group_config_change(self): | 222 def test_poll_bot_group_config_change(self): |
| 223 params = self.do_handshake() | 223 params = self.do_handshake() |
| 224 params['state']['bot_group_cfg_version'] = 'badversion' | 224 params['state']['bot_group_cfg_version'] = 'badversion' |
| 225 response = self.post_json('/swarming/api/v1/bot/poll', params) | 225 response = self.post_json('/swarming/api/v1/bot/poll', params) |
| 226 expected = { | 226 expected = { |
| 227 u'cmd': u'restart', | 227 u'cmd': u'bot_restart', |
| 228 u'message': u'Restarting to pick up new bots.cfg config', | 228 u'message': u'Restarting to pick up new bots.cfg config', |
| 229 } | 229 } |
| 230 self.assertEqual(expected, response) | 230 self.assertEqual(expected, response) |
| 231 | 231 |
| 232 def test_poll_restart(self): | 232 def test_poll_restart(self): |
| 233 def mock_should_restart_bot(bot_id, state): | 233 def mock_should_restart_bot(bot_id, state): |
| 234 self.assertEqual('bot1', bot_id) | 234 self.assertEqual('bot1', bot_id) |
| 235 expected_state = { | 235 expected_state = { |
| 236 'bot_group_cfg_version': 'default', | 236 'bot_group_cfg_version': 'default', |
| 237 'running_time': 1234.0, | 237 'running_time': 1234.0, |
| 238 'sleep_streak': 0, | 238 'sleep_streak': 0, |
| 239 'started_ts': 1410990411.111, | 239 'started_ts': 1410990411.111, |
| 240 } | 240 } |
| 241 self.assertEqual(expected_state, state) | 241 self.assertEqual(expected_state, state) |
| 242 return True, 'Mocked restart message' | 242 return True, 'Mocked restart message' |
| 243 self.mock(bot_management, 'should_restart_bot', mock_should_restart_bot) | 243 self.mock(bot_management, 'should_restart_bot', mock_should_restart_bot) |
| 244 | 244 |
| 245 params = self.do_handshake() | 245 params = self.do_handshake() |
| 246 response = self.post_json('/swarming/api/v1/bot/poll', params) | 246 response = self.post_json('/swarming/api/v1/bot/poll', params) |
| 247 expected = { | 247 expected = { |
| 248 u'cmd': u'restart', | 248 u'cmd': u'host_reboot', |
| 249 u'message': 'Mocked restart message', | 249 u'message': u'Mocked restart message', |
| 250 } | 250 } |
| 251 self.assertEqual(expected, response) | 251 self.assertEqual(expected, response) |
| 252 | 252 |
| 253 def test_poll_task_raw(self): | 253 def test_poll_task_raw(self): |
| 254 # Successfully poll a task. | 254 # Successfully poll a task. |
| 255 self.mock(random, 'getrandbits', lambda _: 0x88) | 255 self.mock(random, 'getrandbits', lambda _: 0x88) |
| 256 now = datetime.datetime(2010, 1, 2, 3, 4, 5) | 256 now = datetime.datetime(2010, 1, 2, 3, 4, 5) |
| 257 self.mock_now(now) | 257 self.mock_now(now) |
| 258 str_now = unicode(now.strftime(DATETIME_FORMAT)) | 258 str_now = unicode(now.strftime(DATETIME_FORMAT)) |
| 259 # A bot polls, gets a task, updates it, completes it. | 259 # A bot polls, gets a task, updates it, completes it. |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 428 def test_poll_conflicting_dimensions(self): | 428 def test_poll_conflicting_dimensions(self): |
| 429 params = self.do_handshake() | 429 params = self.do_handshake() |
| 430 self.assertEqual(params['dimensions']['pool'], ['default']) | 430 self.assertEqual(params['dimensions']['pool'], ['default']) |
| 431 | 431 |
| 432 cfg = bot_groups_config.BotGroupConfig( | 432 cfg = bot_groups_config.BotGroupConfig( |
| 433 version='default', | 433 version='default', |
| 434 require_luci_machine_token=False, | 434 require_luci_machine_token=False, |
| 435 require_service_account=None, | 435 require_service_account=None, |
| 436 ip_whitelist=None, | 436 ip_whitelist=None, |
| 437 owners=None, | 437 owners=None, |
| 438 dimensions={u'pool': [u'server-side']}) | 438 dimensions={u'pool': [u'server-side']}, |
| 439 bot_config_script=None, |
| 440 bot_config_script_content=None) |
| 439 self.mock(bot_auth, 'validate_bot_id_and_fetch_config', | 441 self.mock(bot_auth, 'validate_bot_id_and_fetch_config', |
| 440 lambda *args, **kwargs: cfg) | 442 lambda *args, **kwargs: cfg) |
| 441 | 443 |
| 442 actions = [] | 444 actions = [] |
| 443 self.mock(stats, 'add_entry', lambda **kwargs: actions.append(kwargs)) | 445 self.mock(stats, 'add_entry', lambda **kwargs: actions.append(kwargs)) |
| 444 | 446 |
| 445 # Bot sends 'default' pool, but server config defined it as 'server-side'. | 447 # Bot sends 'default' pool, but server config defined it as 'server-side'. |
| 446 response = self.post_json('/swarming/api/v1/bot/poll', params) | 448 response = self.post_json('/swarming/api/v1/bot/poll', params) |
| 447 self.assertTrue(response.pop(u'duration')) | 449 self.assertTrue(response.pop(u'duration')) |
| 448 expected = { | 450 expected = { |
| 449 u'cmd': u'sleep', | 451 u'cmd': u'sleep', |
| 450 u'quarantined': False, | 452 u'quarantined': False, |
| 451 } | 453 } |
| 452 self.assertEqual(expected, response) | 454 self.assertEqual(expected, response) |
| 453 | 455 |
| 454 # 'server-side' was actually used. | 456 # 'server-side' was actually used. |
| 455 self.assertEqual([{ | 457 self.assertEqual([{ |
| 456 'action': 'bot_active', | 458 'action': 'bot_active', |
| 457 'bot_id': u'bot1', | 459 'bot_id': u'bot1', |
| 458 'dimensions': { | 460 'dimensions': { |
| 459 u'id': [u'bot1'], | 461 u'id': [u'bot1'], |
| 460 u'os': [u'Amiga'], | 462 u'os': [u'Amiga'], |
| 461 u'pool': [u'server-side'], | 463 u'pool': [u'server-side'], |
| 462 }, | 464 }, |
| 463 }], actions) | 465 }], actions) |
| 464 | 466 |
| 467 def test_poll_extra_bot_config(self): |
| 468 cfg = bot_groups_config.BotGroupConfig( |
| 469 version='default', |
| 470 require_luci_machine_token=False, |
| 471 require_service_account=None, |
| 472 ip_whitelist=None, |
| 473 owners=None, |
| 474 dimensions={}, |
| 475 bot_config_script='foo.py', |
| 476 bot_config_script_content='print "Hi";import sys; sys.exit(1)') |
| 477 self.mock(bot_auth, 'validate_bot_id_and_fetch_config', |
| 478 lambda *args, **kwargs: cfg) |
| 479 params = self.do_handshake() |
| 480 self.assertEqual( |
| 481 u'print "Hi";import sys; sys.exit(1)', params['bot_config']) |
| 482 |
| 465 def test_complete_task_isolated(self): | 483 def test_complete_task_isolated(self): |
| 466 # Successfully poll a task. | 484 # Successfully poll a task. |
| 467 self.mock(random, 'getrandbits', lambda _: 0x88) | 485 self.mock(random, 'getrandbits', lambda _: 0x88) |
| 468 now = datetime.datetime(2010, 1, 2, 3, 4, 5) | 486 now = datetime.datetime(2010, 1, 2, 3, 4, 5) |
| 469 self.mock_now(now) | 487 self.mock_now(now) |
| 470 str_now = unicode(now.strftime(DATETIME_FORMAT)) | 488 str_now = unicode(now.strftime(DATETIME_FORMAT)) |
| 471 # A bot polls, gets a task, updates it, completes it. | 489 # A bot polls, gets a task, updates it, completes it. |
| 472 params = self.do_handshake() | 490 params = self.do_handshake() |
| 473 # Enqueue a task. | 491 # Enqueue a task. |
| 474 _, task_id = self.client_create_task_isolated() | 492 _, task_id = self.client_create_task_isolated() |
| (...skipping 641 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1116 self.app.get('/bot_code?tok=%s' % tok, status=200) | 1134 self.app.get('/bot_code?tok=%s' % tok, status=200) |
| 1117 | 1135 |
| 1118 | 1136 |
| 1119 if __name__ == '__main__': | 1137 if __name__ == '__main__': |
| 1120 if '-v' in sys.argv: | 1138 if '-v' in sys.argv: |
| 1121 unittest.TestCase.maxDiff = None | 1139 unittest.TestCase.maxDiff = None |
| 1122 logging.basicConfig( | 1140 logging.basicConfig( |
| 1123 level=logging.DEBUG if '-v' in sys.argv else logging.CRITICAL, | 1141 level=logging.DEBUG if '-v' in sys.argv else logging.CRITICAL, |
| 1124 format='%(levelname)-7s %(filename)s:%(lineno)3d %(message)s') | 1142 format='%(levelname)-7s %(filename)s:%(lineno)3d %(message)s') |
| 1125 unittest.main() | 1143 unittest.main() |
| OLD | NEW |