def testSystemCronFlowsMayBeDisabledViaConfig(self): with test_lib.ConfigOverrider({ "Cron.disabled_system_jobs": ["DummySystemCronJob"] }): aff4_cronjobs.ScheduleSystemCronFlows(token=self.token) jobs = aff4_cronjobs.GetCronManager().ListJobs(token=self.token) self.assertIn("DummySystemCronJob", jobs) # This cron job should be disabled, because it's listed in # Cron.disabled_system_jobs config variable. job = aff4_cronjobs.GetCronManager().ReadJob( "DummySystemCronJob", token=self.token) self.assertTrue(job.Get(job.Schema.DISABLED)) # Now remove the cron job from the list and check that it gets disabled # after next ScheduleSystemCronFlows() call. with test_lib.ConfigOverrider({"Cron.disabled_system_jobs": []}): aff4_cronjobs.ScheduleSystemCronFlows(token=self.token) # System cron job should be enabled. job = aff4_cronjobs.GetCronManager().ReadJob( "DummySystemCronJob", token=self.token) self.assertFalse(job.Get(job.Schema.DISABLED))
def testLastRunStatusGetsUpdatedOnEveryRun(self): job_id = "OccasionallyFailingFakeCronJob" aff4_cronjobs.ScheduleSystemCronFlows(names=[job_id], token=self.token) cron_manager = aff4_cronjobs.GetCronManager() for fake_time in [0, 60]: with test_lib.FakeTime(fake_time): # This call should start a new cron job flow cron_manager.RunOnce(token=self.token) cron_job = cron_manager.ReadJob(job_id, token=self.token) cron_flow_urn = cron_job.Get(cron_job.Schema.CURRENT_FLOW_URN) print "&****" flow_test_lib.TestFlowHelper(cron_flow_urn, check_flow_errors=False, token=self.token) # This RunOnce call should determine that the flow has finished cron_manager.RunOnce(token=self.token) cron_job = cron_manager.ReadJob(job_id, token=self.token) statuses = list( cron_job.GetValuesForAttribute(cron_job.Schema.LAST_RUN_STATUS)) statuses = sorted(statuses, key=lambda x: x.age) self.assertEqual(len(statuses), 2) self.assertEqual(statuses[0].age, rdfvalue.RDFDatetime.FromSecondsSinceEpoch(0)) self.assertEqual(statuses[1].age, rdfvalue.RDFDatetime.FromSecondsSinceEpoch(60)) self.assertEqual(statuses[0].status, rdf_cronjobs.CronJobRunStatus.Status.OK) self.assertEqual(statuses[1].status, rdf_cronjobs.CronJobRunStatus.Status.ERROR)
def testEmailCronJobApprovalRequestLinkLeadsToACorrectPage(self): cronjobs.ScheduleSystemCronFlows( names=[cron_system.OSBreakDown.__name__], token=self.token) cronjobs.GetCronManager().DisableJob(job_id="OSBreakDown") self.RequestCronJobApproval("OSBreakDown", reason=self.APPROVAL_REASON, approver=self.GRANTOR_USERNAME, requestor=self.token.username) self.assertEqual(len(self.messages_sent), 1) message = self.messages_sent[0] self.assertIn(self.APPROVAL_REASON, message) self.assertIn(self.token.username, message) self.assertIn("OSBreakDown", message) # Extract link from the message text and open it. m = re.search(r"href='(.+?)'", message, re.MULTILINE) link = urlparse.urlparse(m.group(1)) self.Open(link.path + "?" + link.query + "#" + link.fragment) # Check that requestor's username and reason are correctly displayed. self.WaitUntil(self.IsTextPresent, self.token.username) self.WaitUntil(self.IsTextPresent, self.APPROVAL_REASON) # Check that host information is displayed. self.WaitUntil(self.IsTextPresent, cron_system.OSBreakDown.__name__) self.WaitUntil(self.IsTextPresent, "Periodicity")
def testSystemCronJobSetsStartTime(self): with test_lib.FakeTime(100): now = rdfvalue.RDFDatetime.Now() aff4_cronjobs.ScheduleSystemCronFlows( names=[ DummySystemCronJob.__name__, DummySystemCronJobStartNow.__name__ ], token=self.token) random_time = "DummySystemCronJob" no_random_time = "DummySystemCronJobStartNow" random_time_job = aff4_cronjobs.GetCronManager().ReadJob( random_time, token=self.token) no_random_time_job = aff4_cronjobs.GetCronManager().ReadJob( no_random_time, token=self.token) start_time_now = no_random_time_job.Get( no_random_time_job.Schema.CRON_ARGS).start_time self.assertEqual(start_time_now, now) random_start_time = random_time_job.Get( random_time_job.Schema.CRON_ARGS).start_time self.assertTrue( now < random_start_time < (now + DummySystemCronJob.frequency))
def testSystemCronJobsGetScheduledWhenDisabledListInvalid(self): with test_lib.ConfigOverrider( {"Cron.disabled_system_jobs": ["NonExistent"]}): with self.assertRaises(ValueError): aff4_cronjobs.ScheduleSystemCronFlows( names=[DummySystemCronJob.__name__], token=self.token) jobs = aff4_cronjobs.GetCronManager().ListJobs(token=self.token) self.assertIn("DummySystemCronJob", jobs)
def _ScheduleCronJob(self): if data_store.RelationalDBReadEnabled(category="cronjobs"): cron_job_id = unicode(cron_system.OSBreakDownCronJob.__name__) cronjobs.ScheduleSystemCronJobs(names=[cron_job_id]) else: cron_job_id = unicode(cron_system.OSBreakDown.__name__) aff4_cronjobs.ScheduleSystemCronFlows(names=[cron_job_id], token=self.token) aff4_cronjobs.GetCronManager().DisableJob(job_id=cron_job_id) return cron_job_id
def _ScheduleCronJob(self): if data_store.RelationalDBReadEnabled(): cron_job_id = compatibility.GetName(cron_system.OSBreakDownCronJob) cronjobs.ScheduleSystemCronJobs(names=[cron_job_id]) else: cron_job_id = compatibility.GetName(cron_system.OSBreakDown) aff4_cronjobs.ScheduleSystemCronFlows(names=[cron_job_id], token=self.token) aff4_cronjobs.GetCronManager().DisableJob(job_id=cron_job_id) return cron_job_id
def _CreateOSBreakDownCronJobApproval(self): if data_store.RelationalDBReadEnabled("cronjobs"): job_name = compatibility.GetName(cron_system.OSBreakDownCronJob) cronjobs.ScheduleSystemCronJobs(names=[job_name]) else: job_name = compatibility.GetName(cron_system.OSBreakDown) aff4_cronjobs.ScheduleSystemCronFlows(names=[job_name], token=self.token) aff4_cronjobs.GetCronManager().DisableJob(job_id=job_name) return job_name
def testSystemCronFlowsWithDisabledAttributeDoNotGetScheduled(self): aff4_cronjobs.ScheduleSystemCronFlows( names=[DummyDisabledSystemCronJob.__name__], token=self.token) jobs = aff4_cronjobs.GetCronManager().ListJobs(token=self.token) self.assertIn("DummyDisabledSystemCronJob", jobs) # System cron job should be enabled by default. job = aff4_cronjobs.GetCronManager().ReadJob( "DummyDisabledSystemCronJob", token=self.token) self.assertTrue(job.Get(job.Schema.DISABLED))
def testSystemCronFlowsGetScheduledAutomatically(self): aff4_cronjobs.ScheduleSystemCronFlows( names=[DummySystemCronJob.__name__], token=self.token) jobs = aff4_cronjobs.GetCronManager().ListJobs(token=self.token) self.assertIn("DummySystemCronJob", jobs) # System cron job should be enabled by default. job = aff4_cronjobs.GetCronManager().ReadJob("DummySystemCronJob", token=self.token) self.assertFalse(job.Get(job.Schema.DISABLED))
def testStatefulSystemCronFlowMaintainsState(self): DummyStatefulSystemCronJob.VALUES = [] # We need to have a cron job started to have a place to maintain # state. aff4_cronjobs.ScheduleSystemCronFlows( names=[DummyStatefulSystemCronJob.__name__], token=self.token) flow.StartFlow(flow_name="DummyStatefulSystemCronJob", token=self.token) flow.StartFlow(flow_name="DummyStatefulSystemCronJob", token=self.token) flow.StartFlow(flow_name="DummyStatefulSystemCronJob", token=self.token) self.assertListEqual(DummyStatefulSystemCronJob.VALUES, [0, 1, 2])
def _SetupAndRunVersionBreakDownCronjob(token=None): with test_lib.FakeTime(44): manager = aff4_cronjobs.GetCronManager() if data_store.RelationalDBReadEnabled(): cron_job_name = cron_system.GRRVersionBreakDownCronJob.__name__ cronjobs.ScheduleSystemCronJobs(names=[cron_job_name]) manager.RunOnce() manager._GetThreadPool().Join() else: cron_job_name = cron_system.GRRVersionBreakDown.__name__ aff4_cronjobs.ScheduleSystemCronFlows(names=[cron_job_name], token=token) manager.RunOnce(token=token) run_id = _GetRunId(cron_job_name, token=token) flow_test_lib.TestFlowHelper( rdfvalue.RDFURN("aff4:/cron/%s/%s" % (cron_job_name, run_id)), token=token) manager.RunOnce(token=token) return cron_job_name
def testEmailCronjobApprovalGrantNotificationLinkLeadsToCorrectPage(self): cronjobs.ScheduleSystemCronFlows( names=[cron_system.OSBreakDown.__name__], token=self.token) cronjobs.GetCronManager().DisableJob(job_id="OSBreakDown") self.RequestAndGrantCronJobApproval("OSBreakDown", reason=self.APPROVAL_REASON, approver=self.GRANTOR_USERNAME, requestor=self.token.username) # There should be 1 message for approval request and 1 message # for approval grant notification. self.assertEqual(len(self.messages_sent), 2) message = self.messages_sent[1] self.assertIn(self.APPROVAL_REASON, message) self.assertIn(self.GRANTOR_USERNAME, message) self.Open(self._ExtractLinkFromMessage(message)) self.WaitUntil(self.IsTextPresent, "OSBreakDown")
def testFailedFlowUpdatesStats(self): job_id = "FailingFakeCronJob" aff4_cronjobs.ScheduleSystemCronFlows(names=[job_id], token=self.token) prev_metric_value = stats.STATS.GetMetricValue( "cron_job_failure", fields=[job_id]) cron_manager = aff4_cronjobs.GetCronManager() cron_manager.RunOnce(token=self.token) cron_job = cron_manager.ReadJob(job_id, token=self.token) cron_flow_urn = cron_job.Get(cron_job.Schema.CURRENT_FLOW_URN) flow_test_lib.TestFlowHelper( cron_flow_urn, check_flow_errors=False, token=self.token) # This RunOnce call should determine that the flow has failed cron_manager.RunOnce(token=self.token) # Check that stats got updated current_metric_value = stats.STATS.GetMetricValue( "cron_job_failure", fields=[job_id]) self.assertEqual(current_metric_value - prev_metric_value, 1)