10f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li#!/usr/bin/python
20f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li
30f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li#pylint: disable=missing-docstring
40f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li
50f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Liimport unittest
60f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li
70f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Liimport common
80f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Lifrom autotest_lib.frontend import setup_django_environment
90f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Lifrom autotest_lib.frontend.afe import models
100f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Lifrom autotest_lib.scheduler import monitor_db_unittest
110f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li
120f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li_DEBUG = False
130f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li
140f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li
150f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Liclass OnlyIfNeededTest(monitor_db_unittest.DispatcherSchedulingTest):
160f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li
170f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li    def _setup_test_only_if_needed_labels(self):
180f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li        # apply only_if_needed label3 to host1
190f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li        models.Host.smart_get('host1').labels.add(self.label3)
200f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li        return self._create_job_simple([1], use_metahost=True)
210f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li
220f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li
230f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li    def test_only_if_needed_labels_avoids_host(self):
240f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li        job = self._setup_test_only_if_needed_labels()
250f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li        # if the job doesn't depend on label3, there should be no scheduling
260f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li        self._run_scheduler()
270f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li        self._check_for_extra_schedulings()
280f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li
290f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li
300f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li    def test_only_if_needed_labels_schedules(self):
310f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li        job = self._setup_test_only_if_needed_labels()
320f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li        job.dependency_labels.add(self.label3)
330f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li        self._run_scheduler()
340f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li        self._assert_job_scheduled_on(1, 1)
350f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li        self._check_for_extra_schedulings()
360f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li
370f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li
380f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li    def test_only_if_needed_labels_via_metahost(self):
390f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li        job = self._setup_test_only_if_needed_labels()
400f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li        job.dependency_labels.add(self.label3)
410f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li        # should also work if the metahost is the only_if_needed label
420f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li        self._do_query('DELETE FROM afe_jobs_dependency_labels')
430f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li        self._create_job(metahosts=[3])
440f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li        self._run_scheduler()
450f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li        self._assert_job_scheduled_on(2, 1)
460f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li        self._check_for_extra_schedulings()
470f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li
480f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li
490f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li    def test_metahosts_obey_blocks(self):
500f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li        """
510f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li        Metahosts can't get scheduled on hosts already scheduled for
520f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li        that job.
530f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li        """
540f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li        self._create_job(metahosts=[1], hosts=[1])
550f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li        # make the nonmetahost entry complete, so the metahost can try
560f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li        # to get scheduled
570f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li        self._update_hqe(set='complete = 1', where='host_id=1')
580f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li        self._run_scheduler()
590f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li        self._check_for_extra_schedulings()
600f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li
610f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li
620f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Liif __name__ == '__main__':
630f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li    unittest.main()
640f261debdbba7664ef7b0eacbac0e7daba89eebdAllen Li
65