We never considered the handling of DO_NOT_VERIFY hosts in certain situations.  This adds handling of those cases to the scheduler and adds tests to the scheduler functional test.

Signed-off-by: Steve Howard <showard@google.com>


git-svn-id: http://test.kernel.org/svn/autotest/trunk@3885 592f7852-d20e-0410-864c-8624ca9c26a4
diff --git a/scheduler/monitor_db_functional_test.py b/scheduler/monitor_db_functional_test.py
index 2921d50..1008b37 100644
--- a/scheduler/monitor_db_functional_test.py
+++ b/scheduler/monitor_db_functional_test.py
@@ -2,7 +2,7 @@
 
 import logging, os, unittest
 import common
-from autotest_lib.client.common_lib import enum, global_config
+from autotest_lib.client.common_lib import enum, global_config, host_protections
 from autotest_lib.database import database_connection
 from autotest_lib.frontend import setup_django_environment
 from autotest_lib.frontend.afe import frontend_test_utils, models
@@ -312,6 +312,12 @@
         self.assertEquals(queue_entry.host.status, host_status)
 
 
+    def _check_host_status(self, host, status):
+        # update from DB
+        host = models.Host.objects.get(id=host.id)
+        self.assertEquals(host.status, status)
+
+
     def _run_pre_job_verify(self, queue_entry):
         self._run_dispatcher() # launches verify
         self._check_statuses(queue_entry, HqeStatus.VERIFYING,
@@ -395,13 +401,18 @@
         self.assertEquals(self.mock_drone_manager.running_pidfile_ids(), [])
 
 
-    def _run_post_job_cleanup_failure_up_to_repair(self):
+    def _setup_for_post_job_cleanup(self):
         self._initialize_test()
         job, queue_entry = self._make_job_and_queue_entry()
         job.reboot_after = models.RebootAfter.ALWAYS
         job.save()
+        return queue_entry
 
-        self._run_pre_job_verify(queue_entry)
+
+    def _run_post_job_cleanup_failure_up_to_repair(self, queue_entry,
+                                                   include_verify=True):
+        if include_verify:
+            self._run_pre_job_verify(queue_entry)
         self._run_dispatcher() # job
         self.mock_drone_manager.finish_process(_PidfileType.JOB)
         self._run_dispatcher() # parsing + cleanup
@@ -409,20 +420,22 @@
         self.mock_drone_manager.finish_process(_PidfileType.CLEANUP,
                                                exit_status=256)
         self._run_dispatcher() # repair, HQE unaffected
-        self._check_statuses(queue_entry, HqeStatus.COMPLETED,
-                             HostStatus.REPAIRING)
         return queue_entry
 
 
     def test_post_job_cleanup_failure(self):
-        queue_entry = self._run_post_job_cleanup_failure_up_to_repair()
+        queue_entry = self._setup_for_post_job_cleanup()
+        self._run_post_job_cleanup_failure_up_to_repair(queue_entry)
+        self._check_statuses(queue_entry, HqeStatus.COMPLETED,
+                             HostStatus.REPAIRING)
         self.mock_drone_manager.finish_process(_PidfileType.REPAIR)
         self._run_dispatcher()
         self._check_statuses(queue_entry, HqeStatus.COMPLETED, HostStatus.READY)
 
 
     def test_post_job_cleanup_failure_repair_failure(self):
-        queue_entry = self._run_post_job_cleanup_failure_up_to_repair()
+        queue_entry = self._setup_for_post_job_cleanup()
+        self._run_post_job_cleanup_failure_up_to_repair(queue_entry)
         self.mock_drone_manager.finish_process(_PidfileType.REPAIR,
                                                exit_status=256)
         self._run_dispatcher()
@@ -444,6 +457,95 @@
         self._run_dispatcher()
 
 
+    def _create_reverify_request(self):
+        host = self.hosts[0]
+        models.SpecialTask.objects.create(host=host,
+                                          task=models.SpecialTask.Task.VERIFY)
+        return host
+
+
+    def test_requested_reverify(self):
+        host = self._create_reverify_request()
+        self._run_dispatcher()
+        self._check_host_status(host, HostStatus.VERIFYING)
+        self.mock_drone_manager.finish_process(_PidfileType.VERIFY)
+        self._run_dispatcher()
+        self._check_host_status(host, HostStatus.READY)
+
+
+    def test_requested_reverify_failure(self):
+        host = self._create_reverify_request()
+        self._run_dispatcher()
+        self.mock_drone_manager.finish_process(_PidfileType.VERIFY,
+                                               exit_status=256)
+        self._run_dispatcher() # repair
+        self._check_host_status(host, HostStatus.REPAIRING)
+        self.mock_drone_manager.finish_process(_PidfileType.REPAIR)
+        self._run_dispatcher()
+        self._check_host_status(host, HostStatus.READY)
+
+
+    def _setup_for_do_not_verify(self):
+        self._initialize_test()
+        job, queue_entry = self._make_job_and_queue_entry()
+        queue_entry.host.protection = host_protections.Protection.DO_NOT_VERIFY
+        queue_entry.host.save()
+        return queue_entry
+
+
+    def test_do_not_verify_job(self):
+        queue_entry = self._setup_for_do_not_verify()
+        self._run_dispatcher() # runs job directly
+        self._finish_job(queue_entry)
+
+
+    def test_do_not_verify_job_with_cleanup(self):
+        queue_entry = self._setup_for_do_not_verify()
+        queue_entry.job.reboot_before = models.RebootBefore.ALWAYS
+        queue_entry.job.save()
+
+        self._run_dispatcher() # cleanup
+        self.mock_drone_manager.finish_process(_PidfileType.CLEANUP)
+        self._run_dispatcher() # job
+        self._finish_job(queue_entry)
+
+
+    def test_do_not_verify_pre_job_cleanup_failure(self):
+        queue_entry = self._setup_for_do_not_verify()
+        queue_entry.job.reboot_before = models.RebootBefore.ALWAYS
+        queue_entry.job.save()
+
+        self._run_dispatcher() # cleanup
+        self.mock_drone_manager.finish_process(_PidfileType.CLEANUP,
+                                               exit_status=256)
+        self._run_dispatcher() # failure ignored; job runs
+        self._finish_job(queue_entry)
+
+
+    def test_do_not_verify_post_job_cleanup_failure(self):
+        queue_entry = self._setup_for_do_not_verify()
+
+        self._run_post_job_cleanup_failure_up_to_repair(queue_entry,
+                                                        include_verify=False)
+        # failure ignored, host still set to Ready
+        self._check_statuses(queue_entry, HqeStatus.COMPLETED, HostStatus.READY)
+        self._run_dispatcher() # nothing else runs
+        self._assert_nothing_is_running()
+
+
+    def test_do_not_verify_requested_reverify_failure(self):
+        host = self._create_reverify_request()
+        host.protection = host_protections.Protection.DO_NOT_VERIFY
+        host.save()
+
+        self._run_dispatcher()
+        self.mock_drone_manager.finish_process(_PidfileType.VERIFY,
+                                               exit_status=256)
+        self._run_dispatcher()
+        self._check_host_status(host, HostStatus.READY) # ignore failure
+        self._assert_nothing_is_running()
+
+
     def test_job_abort_in_verify(self):
         self._initialize_test()
         job = self._create_job(hosts=[1])