| Index: appengine/swarming/server/task_scheduler_test.py
|
| diff --git a/appengine/swarming/server/task_scheduler_test.py b/appengine/swarming/server/task_scheduler_test.py
|
| index 17c2f11fa2e02692a6fe1ef1940a18073b3bd5d8..562cc38882616a5c7fb6b11042a8280154a3c6b0 100755
|
| --- a/appengine/swarming/server/task_scheduler_test.py
|
| +++ b/appengine/swarming/server/task_scheduler_test.py
|
| @@ -106,13 +106,12 @@ class TaskSchedulerApiTest(test_env_handlers.AppTestBase):
|
| """Creates a TaskRequest."""
|
| props = {
|
| 'command': [u'command1'],
|
| - 'dimensions': {u'pool': u'default'},
|
| + 'dimensions_flat': [u'pool:default'],
|
| 'env': {},
|
| 'execution_timeout_secs': 24*60*60,
|
| 'io_timeout_secs': None,
|
| }
|
| props.update(properties or {})
|
| - props['dimensions_dict'] = props.pop('dimensions')
|
| now = utils.utcnow()
|
| args = {
|
| 'created_ts': now,
|
| @@ -133,7 +132,8 @@ class TaskSchedulerApiTest(test_env_handlers.AppTestBase):
|
|
|
| nb_task is 1 if a GAE task queue rebuild-task-cache was enqueued.
|
| """
|
| - request = self._gen_request(properties={'dimensions': dims})
|
| + self.assertIsInstance(dims, list)
|
| + request = self._gen_request(properties={'dimensions_flat': dims})
|
| result_summary = task_scheduler.schedule_request(request, None)
|
| self.assertEqual(nb_task, self.execute_tasks())
|
| return result_summary
|
| @@ -150,7 +150,7 @@ class TaskSchedulerApiTest(test_env_handlers.AppTestBase):
|
|
|
| def _quick_reap(self, nb_task=1):
|
| """Reaps a task."""
|
| - self._quick_schedule({u'os': u'Windows-3.1.1', u'pool': u'default'})
|
| + self._quick_schedule([u'os:Windows-3.1.1', u'pool:default'])
|
| bot_dimensions = {
|
| u'id': [u'localhost'],
|
| u'os': [u'Windows-3.1.1'],
|
| @@ -174,7 +174,7 @@ class TaskSchedulerApiTest(test_env_handlers.AppTestBase):
|
| def test_bot_reap_task(self):
|
| request = self._gen_request(
|
| properties={
|
| - 'dimensions': {u'os': u'Windows-3.1.1', u'pool': u'default'},
|
| + 'dimensions_flat': [u'os:Windows-3.1.1', u'pool:default'],
|
| })
|
| task_request.init_new_request(request, True, None)
|
| _result_summary = task_scheduler.schedule_request(request, None)
|
| @@ -194,7 +194,7 @@ class TaskSchedulerApiTest(test_env_handlers.AppTestBase):
|
| def test_bot_reap_task_not_enough_time(self):
|
| request = self._gen_request(
|
| properties={
|
| - 'dimensions': {u'os': u'Windows-3.1.1', u'pool': u'default'},
|
| + 'dimensions_flat': [u'os:Windows-3.1.1', u'pool:default'],
|
| })
|
| task_request.init_new_request(request, True, None)
|
| _result_summary = task_scheduler.schedule_request(request, None)
|
| @@ -214,7 +214,7 @@ class TaskSchedulerApiTest(test_env_handlers.AppTestBase):
|
| def test_bot_reap_task_enough_time(self):
|
| request = self._gen_request(
|
| properties={
|
| - 'dimensions': {u'os': u'Windows-3.1.1', u'pool': u'default'},
|
| + 'dimensions_flat': [u'os:Windows-3.1.1', u'pool:default'],
|
| })
|
| task_request.init_new_request(request, True, None)
|
| _result_summary = task_scheduler.schedule_request(request, None)
|
| @@ -278,20 +278,18 @@ class TaskSchedulerApiTest(test_env_handlers.AppTestBase):
|
| 'topic': 'projects/abc/topics/def',
|
| }], calls)
|
|
|
| - def _task_ran_successfully(self, nb_task=1):
|
| + def _task_ran_successfully(self, dimensions_flat=None, nb_task=1):
|
| """Runs a task successfully and returns the task_id."""
|
| + dimensions_flat = dimensions_flat or [u'os:Windows-3.1.1', u'pool:default']
|
| request = self._gen_request(
|
| - properties={
|
| - 'dimensions': {u'os': u'Windows-3.1.1', u'pool': u'default'},
|
| - 'idempotent': True,
|
| - })
|
| + properties={'dimensions_flat': dimensions_flat, 'idempotent': True})
|
| task_request.init_new_request(request, True, None)
|
| _result_summary = task_scheduler.schedule_request(request, None)
|
| bot_dimensions = {
|
| u'foo': [u'bar'],
|
| u'id': [u'localhost'],
|
| u'os': [u'Windows', u'Windows-3.1.1'],
|
| - u'pool': [u'default'],
|
| + u'pool': [u'default', u'testing'],
|
| }
|
| self._register_bot(bot_dimensions, nb_task=nb_task)
|
| actual_request, _, run_result = task_scheduler.bot_reap_task(
|
| @@ -322,7 +320,7 @@ class TaskSchedulerApiTest(test_env_handlers.AppTestBase):
|
| name='yay',
|
| user='Raoul',
|
| properties={
|
| - 'dimensions': {u'os': u'Windows-3.1.1', u'pool': u'default'},
|
| + 'dimensions_flat': [u'os:Windows-3.1.1', u'pool:default'],
|
| 'idempotent': True,
|
| })
|
| task_request.init_new_request(request, True, None)
|
| @@ -331,7 +329,7 @@ class TaskSchedulerApiTest(test_env_handlers.AppTestBase):
|
| u'foo': [u'bar'],
|
| u'id': [u'localhost'],
|
| u'os': [u'Windows', u'Windows-3.1.1'],
|
| - u'pool': [u'default'],
|
| + u'pool': [u'default', u'testing'],
|
| }
|
| self.assertEqual(None, task_to_run.TaskToRun.query().get().queue_number)
|
| self._register_bot(bot_dimensions, nb_task=nb_task)
|
| @@ -380,6 +378,10 @@ class TaskSchedulerApiTest(test_env_handlers.AppTestBase):
|
| self.assertEqual(expected, result_summary_duped.to_dict())
|
| self.assertEqual([], run_results_duped)
|
|
|
| + def test_task_two_pools(self):
|
| + self._task_ran_successfully(
|
| + dimensions_flat=[u'pool:default', u'pool:testing'])
|
| +
|
| def test_task_idempotent(self):
|
| # First task is idempotent.
|
| task_id = self._task_ran_successfully()
|
| @@ -398,7 +400,7 @@ class TaskSchedulerApiTest(test_env_handlers.AppTestBase):
|
| name='yay',
|
| user='Raoul',
|
| properties={
|
| - 'dimensions': {u'os': u'Windows-3.1.1', u'pool': u'default'},
|
| + 'dimensions_flat': [u'os:Windows-3.1.1', u'pool:default'],
|
| 'idempotent': True,
|
| })
|
| task_request.init_new_request(request, True, None)
|
| @@ -422,7 +424,7 @@ class TaskSchedulerApiTest(test_env_handlers.AppTestBase):
|
| name='yay',
|
| user='Jesus',
|
| properties={
|
| - 'dimensions': {u'os': u'Windows-3.1.1', u'pool': u'default'},
|
| + 'dimensions_flat': [u'os:Windows-3.1.1', u'pool:default'],
|
| 'idempotent': True,
|
| })
|
| task_request.init_new_request(request, True, None)
|
| @@ -460,7 +462,7 @@ class TaskSchedulerApiTest(test_env_handlers.AppTestBase):
|
| request = self._gen_request(
|
| parent_task_id=parent_id,
|
| properties={
|
| - 'dimensions': {u'os': u'Windows-3.1.1', u'pool': u'default'},
|
| + 'dimensions_flat': [u'os:Windows-3.1.1', u'pool:default'],
|
| })
|
| task_request.init_new_request(request, True, None)
|
| result_summary = task_scheduler.schedule_request(request, None)
|
| @@ -478,7 +480,7 @@ class TaskSchedulerApiTest(test_env_handlers.AppTestBase):
|
| request = self._gen_request(
|
| properties={
|
| 'command': [],
|
| - 'dimensions': {u'os': u'Windows-3.1.1', u'pool': u'default'},
|
| + 'dimensions_flat': [u'os:Windows-3.1.1', u'pool:default'],
|
| 'inputs_ref': {
|
| 'isolated': '1' * 40,
|
| 'isolatedserver': 'http://localhost:1',
|
| @@ -520,7 +522,7 @@ class TaskSchedulerApiTest(test_env_handlers.AppTestBase):
|
| request = self._gen_request(
|
| parent_task_id=parent_id,
|
| properties={
|
| - 'dimensions':{u'os': u'Windows-3.1.1', u'pool': u'default'},
|
| + 'dimensions_flat': [u'os:Windows-3.1.1', u'pool:default'],
|
| })
|
| task_request.init_new_request(request, True, None)
|
| result_summary = task_scheduler.schedule_request(request, None)
|
| @@ -540,7 +542,7 @@ class TaskSchedulerApiTest(test_env_handlers.AppTestBase):
|
| self.mock_now(created_ts)
|
| request = self._gen_request(
|
| properties={
|
| - 'dimensions': {u'os': u'Windows-3.1.1', u'pool': u'default'},
|
| + 'dimensions_flat': [u'os:Windows-3.1.1', u'pool:default'],
|
| })
|
| task_request.init_new_request(request, True, None)
|
| _result_summary = task_scheduler.schedule_request(request, None)
|
| @@ -783,7 +785,7 @@ class TaskSchedulerApiTest(test_env_handlers.AppTestBase):
|
| def test_exit_code_failure(self):
|
| request = self._gen_request(
|
| properties={
|
| - 'dimensions': {u'os': u'Windows-3.1.1', u'pool': u'default'},
|
| + 'dimensions_flat': [u'os:Windows-3.1.1', u'pool:default'],
|
| })
|
| task_request.init_new_request(request, True, None)
|
| _result_summary = task_scheduler.schedule_request(request, None)
|
| @@ -878,7 +880,7 @@ class TaskSchedulerApiTest(test_env_handlers.AppTestBase):
|
| def test_schedule_request(self):
|
| # It is tested indirectly in the other functions.
|
| self.assertTrue(
|
| - self._quick_schedule({u'os': u'Windows-3.1.1', u'pool': u'default'}))
|
| + self._quick_schedule([u'os:Windows-3.1.1', u'pool:default']))
|
|
|
| def mock_dim_acls(self, mapping):
|
| self.mock(config, 'settings', lambda: config_pb2.SettingsCfg(
|
| @@ -890,22 +892,22 @@ class TaskSchedulerApiTest(test_env_handlers.AppTestBase):
|
|
|
| def test_schedule_request_forbidden_dim(self):
|
| self.mock_dim_acls({u'pool:bad': u'noone'})
|
| - self._quick_schedule({u'pool': u'good'})
|
| + self._quick_schedule([u'pool:good'])
|
| with self.assertRaises(auth.AuthorizationError):
|
| - self._quick_schedule({u'pool': u'bad'})
|
| + self._quick_schedule([u'pool:bad'])
|
|
|
| def test_schedule_request_forbidden_dim_via_star(self):
|
| self.mock_dim_acls({u'abc:*': u'noone'})
|
| - self._quick_schedule({u'pool': u'default'})
|
| + self._quick_schedule([u'pool:default'])
|
| with self.assertRaises(auth.AuthorizationError):
|
| - self._quick_schedule({u'pool': u'default', u'abc': u'blah'})
|
| + self._quick_schedule([u'abc:blah', u'pool:default'])
|
|
|
| def test_schedule_request_id_without_pool(self):
|
| self.mock_dim_acls({u'pool:good': u'mocked'})
|
| with self.assertRaises(auth.AuthorizationError):
|
| - self._quick_schedule({u'id': u'abc'})
|
| + self._quick_schedule([u'id:abc'])
|
| auth_testing.mock_is_admin(self)
|
| - self._quick_schedule({u'id': u'abc'}, nb_task=0)
|
| + self._quick_schedule([u'id:abc'], nb_task=0)
|
|
|
| def test_schedule_request_id_and_pool(self):
|
| self.mock_dim_acls({u'pool:good': u'mocked'})
|
| @@ -917,10 +919,10 @@ class TaskSchedulerApiTest(test_env_handlers.AppTestBase):
|
| return False
|
| self.mock(auth, 'is_group_member', mocked_is_group_member)
|
|
|
| - self._quick_schedule({u'id': u'abc', u'pool': u'unknown'}, nb_task=0)
|
| - self._quick_schedule({u'id': u'abc', u'pool': u'good'}, nb_task=0)
|
| + self._quick_schedule([u'id:abc', u'pool:unknown'], nb_task=0)
|
| + self._quick_schedule([u'id:abc', u'pool:good'], nb_task=0)
|
| with self.assertRaises(auth.AuthorizationError):
|
| - self._quick_schedule({u'id': u'abc', u'pool': u'bad'})
|
| + self._quick_schedule([u'id:abc', u'pool:bad'])
|
|
|
| def test_bot_update_task(self):
|
| run_result = self._quick_reap(nb_task=0)
|
| @@ -1016,7 +1018,7 @@ class TaskSchedulerApiTest(test_env_handlers.AppTestBase):
|
| pub_sub_calls = self.mock_pub_sub()
|
| request = self._gen_request(
|
| properties={
|
| - 'dimensions': {u'os': u'Windows-3.1.1', u'pool': u'default'},
|
| + 'dimensions_flat': [u'os:Windows-3.1.1', u'pool:default'],
|
| },
|
| pubsub_topic='projects/abc/topics/def')
|
| task_request.init_new_request(request, True, None)
|
| @@ -1074,7 +1076,7 @@ class TaskSchedulerApiTest(test_env_handlers.AppTestBase):
|
| def _bot_update_timeouts(self, hard, io):
|
| request = self._gen_request(
|
| properties={
|
| - 'dimensions': {u'os': u'Windows-3.1.1', u'pool': u'default'},
|
| + 'dimensions_flat': [u'os:Windows-3.1.1', u'pool:default'],
|
| })
|
| task_request.init_new_request(request, True, None)
|
| result_summary = task_scheduler.schedule_request(request, None)
|
| @@ -1169,9 +1171,8 @@ class TaskSchedulerApiTest(test_env_handlers.AppTestBase):
|
|
|
| def test_bot_kill_task(self):
|
| pub_sub_calls = self.mock_pub_sub()
|
| - dimensions = {u'os': u'Windows-3.1.1', u'pool': u'default'}
|
| request = self._gen_request(
|
| - properties={'dimensions': dimensions},
|
| + properties={'dimensions_flat': [u'os:Windows-3.1.1', u'pool:default']},
|
| pubsub_topic='projects/abc/topics/def')
|
| task_request.init_new_request(request, True, None)
|
| result_summary = task_scheduler.schedule_request(request, None)
|
| @@ -1251,9 +1252,7 @@ class TaskSchedulerApiTest(test_env_handlers.AppTestBase):
|
|
|
| def test_bot_kill_task_wrong_bot(self):
|
| request = self._gen_request(
|
| - properties={
|
| - 'dimensions': {u'os': u'Windows-3.1.1', u'pool': u'default'},
|
| - })
|
| + properties={'dimensions_flat': [u'os:Windows-3.1.1', u'pool:default']})
|
| task_request.init_new_request(request, True, None)
|
| result_summary = task_scheduler.schedule_request(request, None)
|
| bot_dimensions = {
|
| @@ -1272,9 +1271,7 @@ class TaskSchedulerApiTest(test_env_handlers.AppTestBase):
|
|
|
| def test_cancel_task(self):
|
| request = self._gen_request(
|
| - properties={
|
| - 'dimensions': {u'os': u'Windows-3.1.1', u'pool': u'default'},
|
| - },
|
| + properties={'dimensions_flat': [u'os:Windows-3.1.1', u'pool:default']},
|
| pubsub_topic='projects/abc/topics/def')
|
| pub_sub_calls = self.mock_pub_sub()
|
| task_request.init_new_request(request, True, None)
|
| @@ -1289,9 +1286,7 @@ class TaskSchedulerApiTest(test_env_handlers.AppTestBase):
|
|
|
| def test_cancel_task_running(self):
|
| request = self._gen_request(
|
| - properties={
|
| - 'dimensions': {u'os': u'Windows-3.1.1', u'pool': u'default'},
|
| - },
|
| + properties={'dimensions_flat': [u'os:Windows-3.1.1', u'pool:default']},
|
| pubsub_topic='projects/abc/topics/def')
|
| pub_sub_calls = self.mock_pub_sub()
|
| task_request.init_new_request(request, True, None)
|
| @@ -1314,10 +1309,8 @@ class TaskSchedulerApiTest(test_env_handlers.AppTestBase):
|
|
|
| def test_cron_abort_expired_task_to_run(self):
|
| request = self._gen_request(
|
| - properties={
|
| - 'dimensions': {u'os': u'Windows-3.1.1', u'pool': u'default'},
|
| - },
|
| - pubsub_topic='projects/abc/topics/def')
|
| + properties={'dimensions_flat': [u'os:Windows-3.1.1', u'pool:default']},
|
| + pubsub_topic='projects/abc/topics/def')
|
| task_request.init_new_request(request, True, None)
|
| pub_sub_calls = self.mock_pub_sub()
|
| result_summary = task_scheduler.schedule_request(request, None)
|
| @@ -1370,7 +1363,7 @@ class TaskSchedulerApiTest(test_env_handlers.AppTestBase):
|
| now = utils.utcnow()
|
| request = self._gen_request(
|
| properties={
|
| - 'dimensions': {u'os': u'Windows-3.1.1', u'pool': u'default'},
|
| + 'dimensions_flat': [u'os:Windows-3.1.1', u'pool:default'],
|
| 'idempotent': True,
|
| },
|
| created_ts=now,
|
| @@ -1452,7 +1445,7 @@ class TaskSchedulerApiTest(test_env_handlers.AppTestBase):
|
| now = utils.utcnow()
|
| request = self._gen_request(
|
| properties={
|
| - 'dimensions': {u'os': u'Windows-3.1.1', u'pool': u'default'},
|
| + 'dimensions_flat': [u'os:Windows-3.1.1', u'pool:default'],
|
| 'idempotent': True,
|
| },
|
| created_ts=now,
|
| @@ -1614,7 +1607,7 @@ class TaskSchedulerApiTest(test_env_handlers.AppTestBase):
|
| now = utils.utcnow()
|
| request = self._gen_request(
|
| properties={
|
| - 'dimensions': {u'os': u'Windows-3.1.1', u'pool': u'default'},
|
| + 'dimensions_flat': [u'os:Windows-3.1.1', u'pool:default'],
|
| 'idempotent': True,
|
| },
|
| created_ts=now,
|
| @@ -1708,7 +1701,7 @@ class TaskSchedulerApiTest(test_env_handlers.AppTestBase):
|
| now = utils.utcnow()
|
| request = self._gen_request(
|
| properties={
|
| - 'dimensions': {u'os': u'Windows-3.1.1', u'pool': u'default'},
|
| + 'dimensions_flat': [u'os:Windows-3.1.1', u'pool:default'],
|
| 'idempotent': True,
|
| },
|
| created_ts=now,
|
| @@ -1781,9 +1774,7 @@ class TaskSchedulerApiTest(test_env_handlers.AppTestBase):
|
| def test_cron_handle_bot_died_ignored_expired(self):
|
| now = utils.utcnow()
|
| request = self._gen_request(
|
| - properties={
|
| - 'dimensions': {u'os': u'Windows-3.1.1', u'pool': u'default'},
|
| - },
|
| + properties={'dimensions_flat': [u'os:Windows-3.1.1', u'pool:default']},
|
| created_ts=now,
|
| expiration_ts=now+datetime.timedelta(seconds=600))
|
| task_request.init_new_request(request, True, None)
|
|
|