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