Ejemplo n.º 1
0
  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))
Ejemplo n.º 2
0
    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)
Ejemplo n.º 3
0
    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")
Ejemplo n.º 4
0
  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))
Ejemplo n.º 5
0
    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)
Ejemplo n.º 6
0
 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
Ejemplo n.º 7
0
 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
Ejemplo n.º 8
0
  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
Ejemplo n.º 9
0
    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))
Ejemplo n.º 10
0
    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))
Ejemplo n.º 11
0
  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])
Ejemplo n.º 12
0
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
Ejemplo n.º 13
0
    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")
Ejemplo n.º 14
0
  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)