1ed2afea4ca6e23a82d20d1f2ee1067d0c25a8cc2showard#!/usr/bin/python 2b28def33556c59638a885cdc5710c9594c8fcd76Richard Barnette# pylint: disable=missing-docstring 3ed2afea4ca6e23a82d20d1f2ee1067d0c25a8cc2showard 4ed2afea4ca6e23a82d20d1f2ee1067d0c25a8cc2showardimport unittest 5b28def33556c59638a885cdc5710c9594c8fcd76Richard Barnette 6ed2afea4ca6e23a82d20d1f2ee1067d0c25a8cc2showardimport common 7ed2afea4ca6e23a82d20d1f2ee1067d0c25a8cc2showardfrom autotest_lib.frontend import setup_django_environment 8ed2afea4ca6e23a82d20d1f2ee1067d0c25a8cc2showardfrom autotest_lib.frontend.afe import frontend_test_utils 92d3884ade80ee5a8e2316ddc0996e7a1a12d58daPrathmesh Prabhufrom autotest_lib.frontend.afe import models, model_logic 10ed2afea4ca6e23a82d20d1f2ee1067d0c25a8cc2showard 11a5288b4bb2b09aafe914d0b7d5aab79a7e433eafshoward 12a5288b4bb2b09aafe914d0b7d5aab79a7e433eafshowardclass AclGroupTest(unittest.TestCase, 13a5288b4bb2b09aafe914d0b7d5aab79a7e433eafshoward frontend_test_utils.FrontendTestMixin): 14a5288b4bb2b09aafe914d0b7d5aab79a7e433eafshoward def setUp(self): 15a5288b4bb2b09aafe914d0b7d5aab79a7e433eafshoward self._frontend_common_setup() 16a5288b4bb2b09aafe914d0b7d5aab79a7e433eafshoward 17a5288b4bb2b09aafe914d0b7d5aab79a7e433eafshoward 18a5288b4bb2b09aafe914d0b7d5aab79a7e433eafshoward def tearDown(self): 19a5288b4bb2b09aafe914d0b7d5aab79a7e433eafshoward self._frontend_common_teardown() 20a5288b4bb2b09aafe914d0b7d5aab79a7e433eafshoward 21a5288b4bb2b09aafe914d0b7d5aab79a7e433eafshoward 22a5288b4bb2b09aafe914d0b7d5aab79a7e433eafshoward def _check_acls(self, host, acl_name_list): 23a5288b4bb2b09aafe914d0b7d5aab79a7e433eafshoward actual_acl_names = [acl_group.name for acl_group 24a5288b4bb2b09aafe914d0b7d5aab79a7e433eafshoward in host.aclgroup_set.all()] 25a5288b4bb2b09aafe914d0b7d5aab79a7e433eafshoward self.assertEquals(set(actual_acl_names), set(acl_name_list)) 26a5288b4bb2b09aafe914d0b7d5aab79a7e433eafshoward 27a5288b4bb2b09aafe914d0b7d5aab79a7e433eafshoward 28a5288b4bb2b09aafe914d0b7d5aab79a7e433eafshoward def test_on_host_membership_change(self): 29a5288b4bb2b09aafe914d0b7d5aab79a7e433eafshoward host1, host2 = self.hosts[1:3] 30a5288b4bb2b09aafe914d0b7d5aab79a7e433eafshoward everyone_acl = models.AclGroup.objects.get(name='Everyone') 31a5288b4bb2b09aafe914d0b7d5aab79a7e433eafshoward 32a5288b4bb2b09aafe914d0b7d5aab79a7e433eafshoward host1.aclgroup_set.clear() 33a5288b4bb2b09aafe914d0b7d5aab79a7e433eafshoward self._check_acls(host1, []) 34a5288b4bb2b09aafe914d0b7d5aab79a7e433eafshoward host2.aclgroup_set.add(everyone_acl) 35a5288b4bb2b09aafe914d0b7d5aab79a7e433eafshoward self._check_acls(host2, ['Everyone', 'my_acl']) 36a5288b4bb2b09aafe914d0b7d5aab79a7e433eafshoward 37a5288b4bb2b09aafe914d0b7d5aab79a7e433eafshoward models.AclGroup.on_host_membership_change() 38a5288b4bb2b09aafe914d0b7d5aab79a7e433eafshoward 39a5288b4bb2b09aafe914d0b7d5aab79a7e433eafshoward self._check_acls(host1, ['Everyone']) 40a5288b4bb2b09aafe914d0b7d5aab79a7e433eafshoward self._check_acls(host2, ['my_acl']) 41a5288b4bb2b09aafe914d0b7d5aab79a7e433eafshoward 42a5288b4bb2b09aafe914d0b7d5aab79a7e433eafshoward 43afd97de523a8c8c4e6657fa2db6214fda68d8086showardclass HostTest(unittest.TestCase, 44afd97de523a8c8c4e6657fa2db6214fda68d8086showard frontend_test_utils.FrontendTestMixin): 45afd97de523a8c8c4e6657fa2db6214fda68d8086showard def setUp(self): 46afd97de523a8c8c4e6657fa2db6214fda68d8086showard self._frontend_common_setup() 47afd97de523a8c8c4e6657fa2db6214fda68d8086showard 48afd97de523a8c8c4e6657fa2db6214fda68d8086showard 49afd97de523a8c8c4e6657fa2db6214fda68d8086showard def tearDown(self): 50afd97de523a8c8c4e6657fa2db6214fda68d8086showard self._frontend_common_teardown() 51afd97de523a8c8c4e6657fa2db6214fda68d8086showard 52afd97de523a8c8c4e6657fa2db6214fda68d8086showard 53afd97de523a8c8c4e6657fa2db6214fda68d8086showard def test_add_host_previous_one_time_host(self): 54afd97de523a8c8c4e6657fa2db6214fda68d8086showard # ensure that when adding a host which was previously used as a one-time 55afd97de523a8c8c4e6657fa2db6214fda68d8086showard # host, the status isn't reset, since this can interfere with the 56afd97de523a8c8c4e6657fa2db6214fda68d8086showard # scheduler. 57afd97de523a8c8c4e6657fa2db6214fda68d8086showard host = models.Host.create_one_time_host('othost') 58afd97de523a8c8c4e6657fa2db6214fda68d8086showard self.assertEquals(host.invalid, True) 59afd97de523a8c8c4e6657fa2db6214fda68d8086showard self.assertEquals(host.status, models.Host.Status.READY) 60afd97de523a8c8c4e6657fa2db6214fda68d8086showard 61afd97de523a8c8c4e6657fa2db6214fda68d8086showard host.status = models.Host.Status.RUNNING 62afd97de523a8c8c4e6657fa2db6214fda68d8086showard host.save() 63afd97de523a8c8c4e6657fa2db6214fda68d8086showard 64afd97de523a8c8c4e6657fa2db6214fda68d8086showard host2 = models.Host.add_object(hostname='othost') 65afd97de523a8c8c4e6657fa2db6214fda68d8086showard self.assertEquals(host2.id, host.id) 66afd97de523a8c8c4e6657fa2db6214fda68d8086showard self.assertEquals(host2.status, models.Host.Status.RUNNING) 67afd97de523a8c8c4e6657fa2db6214fda68d8086showard 68afd97de523a8c8c4e6657fa2db6214fda68d8086showard 69b5b8b4f981036971c619b26956c8847140eabd35Dan Shi def test_check_board_labels_allowed(self): 7040e182b10320d3a8596a7a4eb87d2ec6b981bc71Shuqian Zhao host = models.Host.create_one_time_host('othost') 7140e182b10320d3a8596a7a4eb87d2ec6b981bc71Shuqian Zhao # First check with host with no board label. 72b5b8b4f981036971c619b26956c8847140eabd35Dan Shi self.assertEqual(host.check_board_labels_allowed([host]), None) 7340e182b10320d3a8596a7a4eb87d2ec6b981bc71Shuqian Zhao 7440e182b10320d3a8596a7a4eb87d2ec6b981bc71Shuqian Zhao # Second check with host with board label 7540e182b10320d3a8596a7a4eb87d2ec6b981bc71Shuqian Zhao label = models.Label.add_object(name='board:test') 7640e182b10320d3a8596a7a4eb87d2ec6b981bc71Shuqian Zhao label.host_set.add(host) 7740e182b10320d3a8596a7a4eb87d2ec6b981bc71Shuqian Zhao self.assertRaises(model_logic.ValidationError, 78b5b8b4f981036971c619b26956c8847140eabd35Dan Shi host.check_board_labels_allowed, [host], 79b5b8b4f981036971c619b26956c8847140eabd35Dan Shi ['board:new_board']) 8040e182b10320d3a8596a7a4eb87d2ec6b981bc71Shuqian Zhao 8140e182b10320d3a8596a7a4eb87d2ec6b981bc71Shuqian Zhao 82ed2afea4ca6e23a82d20d1f2ee1067d0c25a8cc2showardclass SpecialTaskUnittest(unittest.TestCase, 83ed2afea4ca6e23a82d20d1f2ee1067d0c25a8cc2showard frontend_test_utils.FrontendTestMixin): 84ed2afea4ca6e23a82d20d1f2ee1067d0c25a8cc2showard def setUp(self): 85ed2afea4ca6e23a82d20d1f2ee1067d0c25a8cc2showard self._frontend_common_setup() 86ed2afea4ca6e23a82d20d1f2ee1067d0c25a8cc2showard 87ed2afea4ca6e23a82d20d1f2ee1067d0c25a8cc2showard 88ed2afea4ca6e23a82d20d1f2ee1067d0c25a8cc2showard def tearDown(self): 89ed2afea4ca6e23a82d20d1f2ee1067d0c25a8cc2showard self._frontend_common_teardown() 90ed2afea4ca6e23a82d20d1f2ee1067d0c25a8cc2showard 91ed2afea4ca6e23a82d20d1f2ee1067d0c25a8cc2showard 92c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard def _create_task(self): 93c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard return models.SpecialTask.objects.create( 9476fcf19ec42d5c7580d2e7891e4610e5fe725286jamesren host=self.hosts[0], task=models.SpecialTask.Task.VERIFY, 9576fcf19ec42d5c7580d2e7891e4610e5fe725286jamesren requested_by=models.User.current_user()) 96ed2afea4ca6e23a82d20d1f2ee1067d0c25a8cc2showard 97c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard 98c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard def test_execution_path(self): 99c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard task = self._create_task() 100ed2afea4ca6e23a82d20d1f2ee1067d0c25a8cc2showard self.assertEquals(task.execution_path(), 'hosts/host1/1-verify') 101ed2afea4ca6e23a82d20d1f2ee1067d0c25a8cc2showard 102ed2afea4ca6e23a82d20d1f2ee1067d0c25a8cc2showard 103c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard def test_status(self): 104c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard task = self._create_task() 105c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard self.assertEquals(task.status, 'Queued') 106c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard 107c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard task.update_object(is_active=True) 108c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard self.assertEquals(task.status, 'Running') 109c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard 110e60e44ece1445d97977a77cb79f0896989b869d7showard task.update_object(is_active=False, is_complete=True, success=True) 111c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard self.assertEquals(task.status, 'Completed') 112c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard 113e60e44ece1445d97977a77cb79f0896989b869d7showard task.update_object(success=False) 114e60e44ece1445d97977a77cb79f0896989b869d7showard self.assertEquals(task.status, 'Failed') 115e60e44ece1445d97977a77cb79f0896989b869d7showard 116c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard 11797446887819594f1e2a329dcff289ee8e934b626showard def test_activate(self): 11897446887819594f1e2a329dcff289ee8e934b626showard task = self._create_task() 11997446887819594f1e2a329dcff289ee8e934b626showard task.activate() 12097446887819594f1e2a329dcff289ee8e934b626showard self.assertTrue(task.is_active) 12197446887819594f1e2a329dcff289ee8e934b626showard self.assertFalse(task.is_complete) 12297446887819594f1e2a329dcff289ee8e934b626showard 12397446887819594f1e2a329dcff289ee8e934b626showard 12497446887819594f1e2a329dcff289ee8e934b626showard def test_finish(self): 12597446887819594f1e2a329dcff289ee8e934b626showard task = self._create_task() 12697446887819594f1e2a329dcff289ee8e934b626showard task.activate() 127e60e44ece1445d97977a77cb79f0896989b869d7showard task.finish(True) 12897446887819594f1e2a329dcff289ee8e934b626showard self.assertFalse(task.is_active) 12997446887819594f1e2a329dcff289ee8e934b626showard self.assertTrue(task.is_complete) 130e60e44ece1445d97977a77cb79f0896989b869d7showard self.assertTrue(task.success) 13197446887819594f1e2a329dcff289ee8e934b626showard 13297446887819594f1e2a329dcff289ee8e934b626showard 1339bb960b90d5102cce1c8a15314900035c6c4e69ashoward def test_requested_by_from_queue_entry(self): 1349bb960b90d5102cce1c8a15314900035c6c4e69ashoward job = self._create_job(hosts=[0]) 1359bb960b90d5102cce1c8a15314900035c6c4e69ashoward task = models.SpecialTask.objects.create( 1369bb960b90d5102cce1c8a15314900035c6c4e69ashoward host=self.hosts[0], task=models.SpecialTask.Task.VERIFY, 1379bb960b90d5102cce1c8a15314900035c6c4e69ashoward queue_entry=job.hostqueueentry_set.all()[0]) 138fd8b89f0117366c9aeaad9b600a43238a84b4ab9showard self.assertEquals(task.requested_by.login, 'autotest_system') 1399bb960b90d5102cce1c8a15314900035c6c4e69ashoward 1409bb960b90d5102cce1c8a15314900035c6c4e69ashoward 141d11956572cb7a5c8e9c588c9a6b4a0892de00384showardclass HostQueueEntryUnittest(unittest.TestCase, 142d11956572cb7a5c8e9c588c9a6b4a0892de00384showard frontend_test_utils.FrontendTestMixin): 143d11956572cb7a5c8e9c588c9a6b4a0892de00384showard def setUp(self): 144d11956572cb7a5c8e9c588c9a6b4a0892de00384showard self._frontend_common_setup() 145d11956572cb7a5c8e9c588c9a6b4a0892de00384showard 146d11956572cb7a5c8e9c588c9a6b4a0892de00384showard 147d11956572cb7a5c8e9c588c9a6b4a0892de00384showard def tearDown(self): 148d11956572cb7a5c8e9c588c9a6b4a0892de00384showard self._frontend_common_teardown() 149d11956572cb7a5c8e9c588c9a6b4a0892de00384showard 150d11956572cb7a5c8e9c588c9a6b4a0892de00384showard 151d11956572cb7a5c8e9c588c9a6b4a0892de00384showard def test_execution_path(self): 152d11956572cb7a5c8e9c588c9a6b4a0892de00384showard entry = self._create_job(hosts=[1]).hostqueueentry_set.all()[0] 153d11956572cb7a5c8e9c588c9a6b4a0892de00384showard entry.execution_subdir = 'subdir' 154d11956572cb7a5c8e9c588c9a6b4a0892de00384showard entry.save() 155d11956572cb7a5c8e9c588c9a6b4a0892de00384showard 156fd8b89f0117366c9aeaad9b600a43238a84b4ab9showard self.assertEquals(entry.execution_path(), '1-autotest_system/subdir') 157d11956572cb7a5c8e9c588c9a6b4a0892de00384showard 158d11956572cb7a5c8e9c588c9a6b4a0892de00384showard 159e36562323bec14d14b7c583db94788a725514ff2jamesrenclass ModelWithInvalidTest(unittest.TestCase, 160e36562323bec14d14b7c583db94788a725514ff2jamesren frontend_test_utils.FrontendTestMixin): 161e36562323bec14d14b7c583db94788a725514ff2jamesren def setUp(self): 162e36562323bec14d14b7c583db94788a725514ff2jamesren self._frontend_common_setup() 163e36562323bec14d14b7c583db94788a725514ff2jamesren 164e36562323bec14d14b7c583db94788a725514ff2jamesren 165e36562323bec14d14b7c583db94788a725514ff2jamesren def tearDown(self): 166e36562323bec14d14b7c583db94788a725514ff2jamesren self._frontend_common_teardown() 167e36562323bec14d14b7c583db94788a725514ff2jamesren 168e36562323bec14d14b7c583db94788a725514ff2jamesren 169e36562323bec14d14b7c583db94788a725514ff2jamesren def test_model_with_invalid_delete(self): 170e36562323bec14d14b7c583db94788a725514ff2jamesren self.assertFalse(self.hosts[0].invalid) 171e36562323bec14d14b7c583db94788a725514ff2jamesren self.hosts[0].delete() 172e36562323bec14d14b7c583db94788a725514ff2jamesren self.assertTrue(self.hosts[0].invalid) 173e36562323bec14d14b7c583db94788a725514ff2jamesren self.assertTrue(models.Host.objects.get(id=self.hosts[0].id)) 174e36562323bec14d14b7c583db94788a725514ff2jamesren 175e36562323bec14d14b7c583db94788a725514ff2jamesren 176e36562323bec14d14b7c583db94788a725514ff2jamesren def test_model_with_invalid_delete_queryset(self): 177e36562323bec14d14b7c583db94788a725514ff2jamesren for host in self.hosts: 178e36562323bec14d14b7c583db94788a725514ff2jamesren self.assertFalse(host.invalid) 179e36562323bec14d14b7c583db94788a725514ff2jamesren 180e36562323bec14d14b7c583db94788a725514ff2jamesren hosts = models.Host.objects.all() 181e36562323bec14d14b7c583db94788a725514ff2jamesren hosts.delete() 182e36562323bec14d14b7c583db94788a725514ff2jamesren self.assertEqual(hosts.count(), len(self.hosts)) 183e36562323bec14d14b7c583db94788a725514ff2jamesren 184e36562323bec14d14b7c583db94788a725514ff2jamesren for host in hosts: 185e36562323bec14d14b7c583db94788a725514ff2jamesren self.assertTrue(host.invalid) 186e36562323bec14d14b7c583db94788a725514ff2jamesren 187e36562323bec14d14b7c583db94788a725514ff2jamesren 188e36562323bec14d14b7c583db94788a725514ff2jamesren def test_cloned_queryset_delete(self): 189e36562323bec14d14b7c583db94788a725514ff2jamesren """ 190e36562323bec14d14b7c583db94788a725514ff2jamesren Make sure that a cloned queryset maintains the custom delete() 191e36562323bec14d14b7c583db94788a725514ff2jamesren """ 192e36562323bec14d14b7c583db94788a725514ff2jamesren to_delete = ('host1', 'host2') 193e36562323bec14d14b7c583db94788a725514ff2jamesren 194e36562323bec14d14b7c583db94788a725514ff2jamesren for host in self.hosts: 195e36562323bec14d14b7c583db94788a725514ff2jamesren self.assertFalse(host.invalid) 196e36562323bec14d14b7c583db94788a725514ff2jamesren 197e36562323bec14d14b7c583db94788a725514ff2jamesren hosts = models.Host.objects.all().filter(hostname__in=to_delete) 198e36562323bec14d14b7c583db94788a725514ff2jamesren hosts.delete() 199e36562323bec14d14b7c583db94788a725514ff2jamesren all_hosts = models.Host.objects.all() 200e36562323bec14d14b7c583db94788a725514ff2jamesren self.assertEqual(all_hosts.count(), len(self.hosts)) 201e36562323bec14d14b7c583db94788a725514ff2jamesren 202e36562323bec14d14b7c583db94788a725514ff2jamesren for host in all_hosts: 203e36562323bec14d14b7c583db94788a725514ff2jamesren if host.hostname in to_delete: 204e36562323bec14d14b7c583db94788a725514ff2jamesren self.assertTrue( 205e36562323bec14d14b7c583db94788a725514ff2jamesren host.invalid, 206e36562323bec14d14b7c583db94788a725514ff2jamesren '%s.invalid expected to be True' % host.hostname) 207e36562323bec14d14b7c583db94788a725514ff2jamesren else: 208e36562323bec14d14b7c583db94788a725514ff2jamesren self.assertFalse( 209e36562323bec14d14b7c583db94788a725514ff2jamesren host.invalid, 210e36562323bec14d14b7c583db94788a725514ff2jamesren '%s.invalid expected to be False' % host.hostname) 211e36562323bec14d14b7c583db94788a725514ff2jamesren 212e36562323bec14d14b7c583db94788a725514ff2jamesren 213e36562323bec14d14b7c583db94788a725514ff2jamesren def test_normal_delete(self): 214e36562323bec14d14b7c583db94788a725514ff2jamesren job = self._create_job(hosts=[1]) 215e36562323bec14d14b7c583db94788a725514ff2jamesren self.assertEqual(1, models.Job.objects.all().count()) 216e36562323bec14d14b7c583db94788a725514ff2jamesren 217e36562323bec14d14b7c583db94788a725514ff2jamesren job.delete() 218e36562323bec14d14b7c583db94788a725514ff2jamesren self.assertEqual(0, models.Job.objects.all().count()) 219e36562323bec14d14b7c583db94788a725514ff2jamesren 220e36562323bec14d14b7c583db94788a725514ff2jamesren 221e36562323bec14d14b7c583db94788a725514ff2jamesren def test_normal_delete_queryset(self): 222e36562323bec14d14b7c583db94788a725514ff2jamesren self._create_job(hosts=[1]) 223e36562323bec14d14b7c583db94788a725514ff2jamesren self._create_job(hosts=[2]) 224e36562323bec14d14b7c583db94788a725514ff2jamesren 225e36562323bec14d14b7c583db94788a725514ff2jamesren self.assertEqual(2, models.Job.objects.all().count()) 226e36562323bec14d14b7c583db94788a725514ff2jamesren 227e36562323bec14d14b7c583db94788a725514ff2jamesren models.Job.objects.all().delete() 228e36562323bec14d14b7c583db94788a725514ff2jamesren self.assertEqual(0, models.Job.objects.all().count()) 229e36562323bec14d14b7c583db94788a725514ff2jamesren 230e36562323bec14d14b7c583db94788a725514ff2jamesren 2313bb7c8095d7c66d955462673dd3df5565c1b4a96Jakob Juelichclass SerializationTest(unittest.TestCase, 2323bb7c8095d7c66d955462673dd3df5565c1b4a96Jakob Juelich frontend_test_utils.FrontendTestMixin): 2333bb7c8095d7c66d955462673dd3df5565c1b4a96Jakob Juelich def setUp(self): 234f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich self._frontend_common_setup(fill_data=False) 2353bb7c8095d7c66d955462673dd3df5565c1b4a96Jakob Juelich 2363bb7c8095d7c66d955462673dd3df5565c1b4a96Jakob Juelich 2373bb7c8095d7c66d955462673dd3df5565c1b4a96Jakob Juelich def tearDown(self): 2383bb7c8095d7c66d955462673dd3df5565c1b4a96Jakob Juelich self._frontend_common_teardown() 2393bb7c8095d7c66d955462673dd3df5565c1b4a96Jakob Juelich 2403bb7c8095d7c66d955462673dd3df5565c1b4a96Jakob Juelich 241f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich def _get_example_response(self): 242f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich return {'hosts': [{'aclgroup_set': [{'description': '', 243f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'id': 1, 244f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'name': 'Everyone', 245f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'users': [{ 246f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'access_level': 100, 247f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'id': 1, 248f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'login': 'autotest_system', 249f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'reboot_after': 0, 250f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'reboot_before': 1, 251f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'show_experimental': False}]}], 252f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'dirty': True, 253f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'hostattribute_set': [], 254f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'hostname': '100.107.2.163', 255f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'id': 2, 256f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'invalid': False, 257f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'labels': [{'id': 7, 258f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'invalid': False, 259f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'kernel_config': '', 260f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'name': 'power:battery', 261f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'only_if_needed': False, 262f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'platform': False}, 263f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich {'id': 9, 264f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'invalid': False, 265f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'kernel_config': '', 266f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'name': 'hw_video_acc_h264', 267f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'only_if_needed': False, 268f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'platform': False}, 269f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich {'id': 10, 270f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'invalid': False, 271f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'kernel_config': '', 272f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'name': 'hw_video_acc_enc_h264', 273f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'only_if_needed': False, 274f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'platform': False}, 275f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich {'id': 11, 276f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'invalid': False, 277f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'kernel_config': '', 278f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'name': 'webcam', 279f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'only_if_needed': False, 280f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'platform': False}, 281f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich {'id': 12, 282f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'invalid': False, 283f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'kernel_config': '', 284f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'name': 'touchpad', 285f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'only_if_needed': False, 286f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'platform': False}, 287f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich {'id': 13, 288f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'invalid': False, 289f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'kernel_config': '', 290f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'name': 'spring', 291f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'only_if_needed': False, 292f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'platform': False}, 293f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich {'id': 14, 294f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'invalid': False, 295f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'kernel_config': '', 296f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'name': 'board:daisy', 297f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'only_if_needed': False, 298f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'platform': True}, 299f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich {'id': 15, 300f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'invalid': False, 301f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'kernel_config': '', 302f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'name': 'board_freq_mem:daisy_1.7GHz', 303f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'only_if_needed': False, 304f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'platform': False}, 305f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich {'id': 16, 306f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'invalid': False, 307f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'kernel_config': '', 308f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'name': 'bluetooth', 309f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'only_if_needed': False, 310f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'platform': False}, 311f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich {'id': 17, 312f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'invalid': False, 313f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'kernel_config': '', 314f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'name': 'gpu_family:mali', 315f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'only_if_needed': False, 316f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'platform': False}, 317f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich {'id': 19, 318f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'invalid': False, 319f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'kernel_config': '', 320f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'name': 'ec:cros', 321f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'only_if_needed': False, 322f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'platform': False}, 323f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich {'id': 20, 324f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'invalid': False, 325f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'kernel_config': '', 326f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'name': 'storage:mmc', 327f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'only_if_needed': False, 328f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'platform': False}, 329f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich {'id': 21, 330f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'invalid': False, 331f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'kernel_config': '', 332f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'name': 'hw_video_acc_vp8', 333f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'only_if_needed': False, 334f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'platform': False}, 335f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich {'id': 22, 336f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'invalid': False, 337f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'kernel_config': '', 338f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'name': 'video_glitch_detection', 339f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'only_if_needed': False, 340f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'platform': False}, 341f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich {'id': 23, 342f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'invalid': False, 343f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'kernel_config': '', 344f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'name': 'pool:suites', 345f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'only_if_needed': False, 346f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'platform': False}, 347f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich {'id': 25, 348f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'invalid': False, 349f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'kernel_config': '', 350f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'name': 'daisy-board-name', 351f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'only_if_needed': False, 352f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'platform': False}], 353f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'leased': False, 3546818633834ad52c3de153235639ea9299a6e9a6dMatthew Sartori 'lock_reason': '', 355f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'lock_time': None, 356f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'locked': False, 357f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'protection': 0, 358f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'shard': {'hostname': '1', 'id': 1}, 3592d3884ade80ee5a8e2316ddc0996e7a1a12d58daPrathmesh Prabhu 'status': 'Ready', 3602d3884ade80ee5a8e2316ddc0996e7a1a12d58daPrathmesh Prabhu 'synch_id': None}], 361f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'jobs': [{'control_file': 'some control file\n\n\n', 362f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'control_type': 2, 363f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'created_on': '2014-09-04T13:09:35', 364f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'dependency_labels': [{'id': 14, 365f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'invalid': False, 366f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'kernel_config': '', 367f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'name': 'board:daisy', 368f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'only_if_needed': False, 369f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'platform': True}, 370f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich {'id': 23, 371f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'invalid': False, 372f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'kernel_config': '', 373f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'name': 'pool:suites', 374f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'only_if_needed': False, 375f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'platform': False}, 376f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich {'id': 25, 377f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'invalid': False, 378f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'kernel_config': '', 379f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'name': 'daisy-board-name', 380f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'only_if_needed': False, 381f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'platform': False}], 382f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'email_list': '', 383f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'hostqueueentry_set': [{'aborted': False, 384f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'active': False, 385f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'complete': False, 386f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'deleted': False, 387f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'execution_subdir': '', 388f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'finished_on': None, 389f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'id': 5, 390f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'meta_host': { 391f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'id': 14, 392f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'invalid': False, 393f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'kernel_config': '', 394f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'name': 'board:daisy', 395f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'only_if_needed': False, 396f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'platform': True}, 3978c98ac10beaa08bfb975c412b0b3bda23178763aPrashanth Balasubramanian 'host_id': None, 398f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'started_on': None, 399f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'status': 'Queued'}], 400f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'id': 5, 401f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'jobkeyval_set': [{'id': 10, 402ff36159d40fc7e7b5124f4950b6a18103aebd922Fang Deng 'job_id': 5, 403f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'key': 'suite', 404f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'value': 'dummy'}, 405f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich {'id': 11, 406ff36159d40fc7e7b5124f4950b6a18103aebd922Fang Deng 'job_id': 5, 407f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'key': 'build', 408f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'value': 'daisy-release'}, 409f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich {'id': 12, 410ff36159d40fc7e7b5124f4950b6a18103aebd922Fang Deng 'job_id': 5, 411f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'key': 'experimental', 412f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'value': 'False'}], 413f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'max_runtime_hrs': 72, 414f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'max_runtime_mins': 1440, 415f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'name': 'daisy-experimental', 416f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'owner': 'autotest', 417f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'parse_failed_repair': True, 418f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'priority': 40, 419f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'reboot_after': 0, 420f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'reboot_before': 1, 421f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'run_reset': True, 422f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'run_verify': False, 423f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'shard': {'hostname': '1', 'id': 1}, 424f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'synch_count': 1, 425f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'test_retry': 0, 426f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'timeout': 24, 427c9e1714424621786322d0e6ea48ac167bf35ce16Dan Shi 'timeout_mins': 1440, 428c9e1714424621786322d0e6ea48ac167bf35ce16Dan Shi 'require_ssp': None}, 429f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich {'control_file': 'some control file\n\n\n', 430f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'control_type': 2, 431f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'created_on': '2014-09-04T13:09:35', 432f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'dependency_labels': [{'id': 14, 433f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'invalid': False, 434f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'kernel_config': '', 435f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'name': 'board:daisy', 436f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'only_if_needed': False, 437f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'platform': True}, 438f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich {'id': 23, 439f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'invalid': False, 440f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'kernel_config': '', 441f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'name': 'pool:suites', 442f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'only_if_needed': False, 443f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'platform': False}, 444f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich {'id': 25, 445f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'invalid': False, 446f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'kernel_config': '', 447f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'name': 'daisy-board-name', 448f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'only_if_needed': False, 449f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'platform': False}], 450f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'email_list': '', 451f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'hostqueueentry_set': [{'aborted': False, 452f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'active': False, 453f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'complete': False, 454f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'deleted': False, 455f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'execution_subdir': '', 456f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'finished_on': None, 457f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'id': 7, 458f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'meta_host': { 459f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'id': 14, 460f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'invalid': False, 461f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'kernel_config': '', 462f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'name': 'board:daisy', 463f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'only_if_needed': False, 464f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'platform': True}, 4658c98ac10beaa08bfb975c412b0b3bda23178763aPrashanth Balasubramanian 'host_id': None, 466f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'started_on': None, 467f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'status': 'Queued'}], 468f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'id': 7, 469f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'jobkeyval_set': [{'id': 16, 470ff36159d40fc7e7b5124f4950b6a18103aebd922Fang Deng 'job_id': 7, 471f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'key': 'suite', 472f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'value': 'dummy'}, 473f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich {'id': 17, 474ff36159d40fc7e7b5124f4950b6a18103aebd922Fang Deng 'job_id': 7, 475f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'key': 'build', 476f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'value': 'daisy-release'}, 477f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich {'id': 18, 478ff36159d40fc7e7b5124f4950b6a18103aebd922Fang Deng 'job_id': 7, 479f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'key': 'experimental', 480f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'value': 'False'}], 481f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'max_runtime_hrs': 72, 482f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'max_runtime_mins': 1440, 483f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'name': 'daisy-experimental', 484f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'owner': 'autotest', 485f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'parse_failed_repair': True, 486f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'priority': 40, 487f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'reboot_after': 0, 488f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'reboot_before': 1, 489f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'run_reset': True, 490f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'run_verify': False, 491f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'shard': {'hostname': '1', 'id': 1}, 492f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'synch_count': 1, 493f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'test_retry': 0, 494f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'timeout': 24, 495c9e1714424621786322d0e6ea48ac167bf35ce16Dan Shi 'timeout_mins': 1440, 496c9e1714424621786322d0e6ea48ac167bf35ce16Dan Shi 'require_ssp': None}]} 497f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 498f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 499f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich def test_response(self): 500f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich heartbeat_response = self._get_example_response() 501f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich hosts_serialized = heartbeat_response['hosts'] 502f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich jobs_serialized = heartbeat_response['jobs'] 503f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 504f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich # Persisting is automatically done inside deserialize 505f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich hosts = [models.Host.deserialize(host) for host in hosts_serialized] 506f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich jobs = [models.Job.deserialize(job) for job in jobs_serialized] 507f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 508f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich generated_heartbeat_response = { 509f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'hosts': [host.serialize() for host in hosts], 510f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich 'jobs': [job.serialize() for job in jobs] 511f88fa938050d0e2b662a2b32ef7e931e01a4d8feJakob Juelich } 512ff36159d40fc7e7b5124f4950b6a18103aebd922Fang Deng example_response = self._get_example_response() 513ff36159d40fc7e7b5124f4950b6a18103aebd922Fang Deng # For attribute-like objects, we don't care about its id. 514ff36159d40fc7e7b5124f4950b6a18103aebd922Fang Deng for r in [generated_heartbeat_response, example_response]: 515ff36159d40fc7e7b5124f4950b6a18103aebd922Fang Deng for job in r['jobs']: 516ff36159d40fc7e7b5124f4950b6a18103aebd922Fang Deng for keyval in job['jobkeyval_set']: 517ff36159d40fc7e7b5124f4950b6a18103aebd922Fang Deng keyval.pop('id') 518ff36159d40fc7e7b5124f4950b6a18103aebd922Fang Deng for host in r['hosts']: 519ff36159d40fc7e7b5124f4950b6a18103aebd922Fang Deng for attribute in host['hostattribute_set']: 520ff36159d40fc7e7b5124f4950b6a18103aebd922Fang Deng keyval.pop('id') 521ff36159d40fc7e7b5124f4950b6a18103aebd922Fang Deng self.assertEqual(generated_heartbeat_response, example_response) 5223bb7c8095d7c66d955462673dd3df5565c1b4a96Jakob Juelich 5233bb7c8095d7c66d955462673dd3df5565c1b4a96Jakob Juelich 524116ff0fc2674082fe475afd64ce4dec998ed71b7Jakob Juelich def test_update(self): 525116ff0fc2674082fe475afd64ce4dec998ed71b7Jakob Juelich job = self._create_job(hosts=[1]) 526116ff0fc2674082fe475afd64ce4dec998ed71b7Jakob Juelich serialized = job.serialize(include_dependencies=False) 527116ff0fc2674082fe475afd64ce4dec998ed71b7Jakob Juelich serialized['owner'] = 'some_other_owner' 528116ff0fc2674082fe475afd64ce4dec998ed71b7Jakob Juelich 529116ff0fc2674082fe475afd64ce4dec998ed71b7Jakob Juelich job.update_from_serialized(serialized) 530116ff0fc2674082fe475afd64ce4dec998ed71b7Jakob Juelich self.assertEqual(job.owner, 'some_other_owner') 531116ff0fc2674082fe475afd64ce4dec998ed71b7Jakob Juelich 532116ff0fc2674082fe475afd64ce4dec998ed71b7Jakob Juelich serialized = job.serialize() 533116ff0fc2674082fe475afd64ce4dec998ed71b7Jakob Juelich self.assertRaises( 534116ff0fc2674082fe475afd64ce4dec998ed71b7Jakob Juelich ValueError, 535116ff0fc2674082fe475afd64ce4dec998ed71b7Jakob Juelich job.update_from_serialized, serialized) 536116ff0fc2674082fe475afd64ce4dec998ed71b7Jakob Juelich 537116ff0fc2674082fe475afd64ce4dec998ed71b7Jakob Juelich 538f865d33cc3b0584f10b2f6f4de414a6d7f9e3000Jakob Juelich def test_sync_aborted(self): 539f865d33cc3b0584f10b2f6f4de414a6d7f9e3000Jakob Juelich job = self._create_job(hosts=[1]) 540f865d33cc3b0584f10b2f6f4de414a6d7f9e3000Jakob Juelich serialized = job.serialize() 541f865d33cc3b0584f10b2f6f4de414a6d7f9e3000Jakob Juelich 542f865d33cc3b0584f10b2f6f4de414a6d7f9e3000Jakob Juelich serialized['hostqueueentry_set'][0]['aborted'] = True 543f865d33cc3b0584f10b2f6f4de414a6d7f9e3000Jakob Juelich serialized['hostqueueentry_set'][0]['status'] = 'Running' 544f865d33cc3b0584f10b2f6f4de414a6d7f9e3000Jakob Juelich 545f865d33cc3b0584f10b2f6f4de414a6d7f9e3000Jakob Juelich models.Job.deserialize(serialized) 546f865d33cc3b0584f10b2f6f4de414a6d7f9e3000Jakob Juelich 547f865d33cc3b0584f10b2f6f4de414a6d7f9e3000Jakob Juelich job = models.Job.objects.get(pk=job.id) 548f865d33cc3b0584f10b2f6f4de414a6d7f9e3000Jakob Juelich self.assertTrue(job.hostqueueentry_set.all()[0].aborted) 549f865d33cc3b0584f10b2f6f4de414a6d7f9e3000Jakob Juelich self.assertEqual(job.hostqueueentry_set.all()[0].status, 'Queued') 550116ff0fc2674082fe475afd64ce4dec998ed71b7Jakob Juelich 551116ff0fc2674082fe475afd64ce4dec998ed71b7Jakob Juelich 552ed2afea4ca6e23a82d20d1f2ee1067d0c25a8cc2showardif __name__ == '__main__': 553ed2afea4ca6e23a82d20d1f2ee1067d0c25a8cc2showard unittest.main() 554