Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(879)

Side by Side Diff: appengine/swarming/handlers_bot_test.py

Issue 2689483004: swarming: Add server-side implementation for supplemental bot_config (Closed)
Patch Set: Rebased Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « appengine/swarming/handlers_bot.py ('k') | appengine/swarming/server/bot_groups_config.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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()
OLDNEW
« no previous file with comments | « appengine/swarming/handlers_bot.py ('k') | appengine/swarming/server/bot_groups_config.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698