blob: c87bad6fa727f928f284c1b742d0ab6275656d52 [file] [log] [blame]
showard1a5a4082009-07-28 20:01:37 +00001#!/usr/bin/python
showardb6d16622009-05-26 19:35:29 +00002
3import datetime, unittest
4import common
5from autotest_lib.frontend import setup_django_environment
6from autotest_lib.frontend.afe import frontend_test_utils
7from django.db import connection
8from autotest_lib.frontend.afe import models, rpc_interface, frontend_test_utils
showardcafd16e2009-05-29 18:37:49 +00009from autotest_lib.frontend.afe import model_logic
showardb6d16622009-05-26 19:35:29 +000010
11
12_hqe_status = models.HostQueueEntry.Status
13
14
15class RpcInterfaceTest(unittest.TestCase,
16 frontend_test_utils.FrontendTestMixin):
17 def setUp(self):
18 self._frontend_common_setup()
19
20
21 def tearDown(self):
22 self._frontend_common_teardown()
23
24
showarda5288b42009-07-28 20:06:08 +000025 def test_validation(self):
26 # non-number for a numeric field
27 self.assertRaises(model_logic.ValidationError,
28 rpc_interface.add_atomic_group, name='foo',
29 max_number_of_machines='bar')
30 # omit a required field
31 self.assertRaises(model_logic.ValidationError, rpc_interface.add_label,
32 name=None)
33 # violate uniqueness constraint
34 self.assertRaises(model_logic.ValidationError, rpc_interface.add_host,
35 hostname='host1')
36
37
showardcafd16e2009-05-29 18:37:49 +000038 def test_multiple_platforms(self):
39 platform2 = models.Label.objects.create(name='platform2', platform=True)
40 self.assertRaises(model_logic.ValidationError,
41 rpc_interface. label_add_hosts, 'platform2',
42 ['host1', 'host2'])
43 self.assertRaises(model_logic.ValidationError,
44 rpc_interface.host_add_labels, 'host1', ['platform2'])
45 # make sure the platform didn't get added
46 platforms = rpc_interface.get_labels(
47 host__hostname__in=['host1', 'host2'], platform=True)
48 self.assertEquals(len(platforms), 1)
49 self.assertEquals(platforms[0]['name'], 'myplatform')
50
51
showarda5288b42009-07-28 20:06:08 +000052 def _check_hostnames(self, hosts, expected_hostnames):
53 self.assertEquals(set(host['hostname'] for host in hosts),
54 set(expected_hostnames))
55
56
57 def test_get_hosts(self):
58 hosts = rpc_interface.get_hosts()
59 self._check_hostnames(hosts, [host.hostname for host in self.hosts])
60
61 hosts = rpc_interface.get_hosts(hostname='host1')
62 self._check_hostnames(hosts, ['host1'])
63
64
65 def test_get_hosts_multiple_labels(self):
66 hosts = rpc_interface.get_hosts(
67 multiple_labels=['myplatform', 'label1'])
68 self._check_hostnames(hosts, ['host1'])
69
70
71 def test_get_hosts_exclude_only_if_needed(self):
72 self.hosts[0].labels.add(self.label3)
73
74 hosts = rpc_interface.get_hosts(hostname__in=['host1', 'host2'],
75 exclude_only_if_needed_labels=True)
76 self._check_hostnames(hosts, ['host2'])
77
78
showard87cc38f2009-08-20 23:37:04 +000079 def test_get_hosts_exclude_atomic_group_hosts(self):
80 hosts = rpc_interface.get_hosts(
81 exclude_atomic_group_hosts=True,
82 hostname__in=['host4', 'host5', 'host6'])
83 self._check_hostnames(hosts, ['host4'])
84
85
86 def test_get_hosts_exclude_both(self):
87 self.hosts[0].labels.add(self.label3)
88
89 hosts = rpc_interface.get_hosts(
90 hostname__in=['host1', 'host2', 'host5'],
91 exclude_only_if_needed_labels=True,
92 exclude_atomic_group_hosts=True)
93 self._check_hostnames(hosts, ['host2'])
94
95
showardb6d16622009-05-26 19:35:29 +000096 def test_get_jobs_summary(self):
showardc0ac3a72009-07-08 21:14:45 +000097 job = self._create_job(hosts=xrange(1, 4))
showardb6d16622009-05-26 19:35:29 +000098 entries = list(job.hostqueueentry_set.all())
99 entries[1].status = _hqe_status.FAILED
100 entries[1].save()
101 entries[2].status = _hqe_status.FAILED
102 entries[2].aborted = True
103 entries[2].save()
104
105 job_summaries = rpc_interface.get_jobs_summary(id=job.id)
106 self.assertEquals(len(job_summaries), 1)
107 summary = job_summaries[0]
108 self.assertEquals(summary['status_counts'], {'Queued': 1,
109 'Failed': 2})
110
111
showarda5288b42009-07-28 20:06:08 +0000112 def _create_job_helper(self, **kwargs):
113 return rpc_interface.create_job('test', 'Medium', 'control file',
114 'Server', **kwargs)
115
116
showard2924b0a2009-06-18 23:16:15 +0000117 def test_one_time_hosts(self):
showarda5288b42009-07-28 20:06:08 +0000118 job = self._create_job_helper(one_time_hosts=['testhost'])
showard2924b0a2009-06-18 23:16:15 +0000119 host = models.Host.objects.get(hostname='testhost')
120 self.assertEquals(host.invalid, True)
121 self.assertEquals(host.labels.count(), 0)
122 self.assertEquals(host.aclgroup_set.count(), 0)
123
124
showard1a5a4082009-07-28 20:01:37 +0000125 def _setup_special_tasks(self):
showardc0ac3a72009-07-08 21:14:45 +0000126 host = self.hosts[0]
127
128 job1 = self._create_job(hosts=[1])
129 job2 = self._create_job(hosts=[1])
130
131 entry1 = job1.hostqueueentry_set.all()[0]
132 entry1.update_object(started_on=datetime.datetime(2009, 1, 2),
133 execution_subdir='1-myuser/host1')
134 entry2 = job2.hostqueueentry_set.all()[0]
135 entry2.update_object(started_on=datetime.datetime(2009, 1, 3),
136 execution_subdir='2-myuser/host1')
137
showard1a5a4082009-07-28 20:01:37 +0000138 self.task1 = models.SpecialTask.objects.create(
showardc0ac3a72009-07-08 21:14:45 +0000139 host=host, task=models.SpecialTask.Task.VERIFY,
140 time_started=datetime.datetime(2009, 1, 1), # ran before job 1
141 is_complete=True)
showard1a5a4082009-07-28 20:01:37 +0000142 self.task2 = models.SpecialTask.objects.create(
showardc0ac3a72009-07-08 21:14:45 +0000143 host=host, task=models.SpecialTask.Task.VERIFY,
144 queue_entry=entry2, # ran with job 2
145 is_active=True)
showard1a5a4082009-07-28 20:01:37 +0000146 self.task3 = models.SpecialTask.objects.create(
showardc0ac3a72009-07-08 21:14:45 +0000147 host=host, task=models.SpecialTask.Task.VERIFY) # not yet run
148
showard1a5a4082009-07-28 20:01:37 +0000149
150 def test_get_special_tasks(self):
151 self._setup_special_tasks()
152 tasks = rpc_interface.get_special_tasks(host__hostname='host1',
153 queue_entry__isnull=True)
154 self.assertEquals(len(tasks), 2)
155 self.assertEquals(tasks[0]['task'], models.SpecialTask.Task.VERIFY)
156 self.assertEquals(tasks[0]['is_active'], False)
157 self.assertEquals(tasks[0]['is_complete'], True)
158
159
160 def test_get_latest_special_task(self):
161 # a particular usage of get_special_tasks()
162 self._setup_special_tasks()
163 self.task2.time_started = datetime.datetime(2009, 1, 2)
164 self.task2.save()
165
166 tasks = rpc_interface.get_special_tasks(
167 host__hostname='host1', task=models.SpecialTask.Task.VERIFY,
168 time_started__isnull=False, sort_by=['-time_started'],
169 query_limit=1)
170 self.assertEquals(len(tasks), 1)
171 self.assertEquals(tasks[0]['id'], 2)
172
173
174 def _common_entry_check(self, entry_dict):
175 self.assertEquals(entry_dict['host']['hostname'], 'host1')
176 self.assertEquals(entry_dict['job']['id'], 2)
177
178
179 def test_get_host_queue_entries_and_special_tasks(self):
180 self._setup_special_tasks()
181
showardc0ac3a72009-07-08 21:14:45 +0000182 entries_and_tasks = (
183 rpc_interface.get_host_queue_entries_and_special_tasks('host1'))
184
185 paths = [entry['execution_path'] for entry in entries_and_tasks]
186 self.assertEquals(paths, ['hosts/host1/3-verify',
187 '2-myuser/host1',
188 'hosts/host1/2-verify',
189 '1-myuser/host1',
190 'hosts/host1/1-verify'])
191
192 verify2 = entries_and_tasks[2]
193 self._common_entry_check(verify2)
194 self.assertEquals(verify2['type'], 'Verify')
195 self.assertEquals(verify2['status'], 'Running')
196 self.assertEquals(verify2['execution_path'], 'hosts/host1/2-verify')
197
198 entry2 = entries_and_tasks[1]
199 self._common_entry_check(entry2)
200 self.assertEquals(entry2['type'], 'Job')
201 self.assertEquals(entry2['status'], 'Queued')
202 self.assertEquals(entry2['started_on'], '2009-01-03 00:00:00')
203
204
showarda5288b42009-07-28 20:06:08 +0000205 def _create_job_helper(self, **kwargs):
206 return rpc_interface.create_job('test', 'Medium', 'control file',
207 'Server', **kwargs)
208
209
showardb6d16622009-05-26 19:35:29 +0000210if __name__ == '__main__':
211 unittest.main()