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