def test_status(self):
        status = self.recipe.get_status()

        now_tz = utc_to_timezone(datetime.utcnow(), self.recipe.timezone)
        date_tz = str(now_tz.date())
        hour_tz = now_tz.hour

        self.assertEqual(status['date_tz'], date_tz)
        self.assertEqual(len(status['tasks']), 1 + 1 + 1 + 3 + 3 + 1)
        self.assertFalse(status['force'])

        # order two is hidden unless forced ( so it is skipped ) hour = [] excludes it from list
        self.assertEqual(status['tasks'][0]['hour'], 1)
        self.assertEqual(status['tasks'][0]['order'], 0)
        self.assertEqual(status['tasks'][1]['hour'], 1)
        self.assertEqual(status['tasks'][1]['order'], 4)
        self.assertEqual(status['tasks'][2]['hour'], 1)
        self.assertEqual(status['tasks'][2]['order'], 5)
        self.assertEqual(status['tasks'][3]['hour'], 3)
        self.assertEqual(status['tasks'][3]['order'], 1)
        self.assertEqual(status['tasks'][4]['hour'], 3)
        self.assertEqual(status['tasks'][4]['order'], 4)
        self.assertEqual(status['tasks'][5]['hour'], 3)
        self.assertEqual(status['tasks'][5]['order'], 5)
        self.assertEqual(status['tasks'][6]['hour'], 3)
        self.assertEqual(status['tasks'][6]['order'], 6)
        self.assertEqual(status['tasks'][7]['hour'], 23)
        self.assertEqual(status['tasks'][7]['order'], 3)
        self.assertEqual(status['tasks'][8]['hour'], 23)
        self.assertEqual(status['tasks'][8]['order'], 4)
        self.assertEqual(status['tasks'][9]['hour'], 23)
        self.assertEqual(status['tasks'][9]['order'], 5)
Beispiel #2
0
  def setUp(self):
    self.account = account_create()
    self.project = project_create()

    self.recipe = Recipe.objects.create(
      account = self.account,
      project = self.project,
      name = 'RECIPE_MANUAL',
      active = True,
      manual = True,
      week = [],
      hour = [],
      timezone = 'America/Los_Angeles',
      tasks = json.dumps([
        { "tag": "manual",
          "values": {},
          "sequence": 1
        },
      ]),
    )

    now_tz = utc_to_timezone(datetime.utcnow(), self.recipe.timezone)

    self.recipe_done = Recipe.objects.create(
      account = self.account,
      project = self.project,
      name = 'RECIPE_MANUAL',
      active = True,
      manual = True,
      week = [],
      hour = [],
      timezone = 'America/Los_Angeles',
      tasks = json.dumps([
        { "tag": "manual",
          "values": {},
          "sequence": 1
        },
      ]),
      job_done = True,
      job_status = json.dumps({
        "day":["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
        "date_tz": str(now_tz.date()),
        "force": True,
        "tasks": [
          {
            "instance": 1,
            "order": 0,
            "event": "JOB_END",
            "utc":str(datetime.utcnow()), 
            "script": "manual",
            "hour": 0,
            "stdout":"",
            "stderr": "",
            "done": True
          }
        ]
      }),
      worker_uid = 'TEST_WORKER',
      worker_utm = utc_milliseconds() - (JOB_LOOKBACK_MS * 10) # important for test ( jobs older than this get job_done flag reset )
    )
Beispiel #3
0
  def setUp(self):
    self.account = account_create()
    self.project = project_create()

    self.recipe = Recipe.objects.create(
      account = self.account,
      project = self.project,
      name = 'RECIPE_MANUAL',
      active = True,
      manual = True,
      week = [],
      hour = [],
      timezone = 'America/Los_Angeles',
      tasks = json.dumps([
        { "tag": "manual",
          "values": {},
          "sequence": 1
        },
      ]),
    )
    self.recipe.update()

    now_tz = utc_to_timezone(datetime.utcnow(), self.recipe.timezone)

    self.recipe_done = Recipe.objects.create(
      account = self.account,
      project = self.project,
      name = 'RECIPE_MANUAL',
      active = True,
      manual = True,
      week = [],
      hour = [],
      timezone = 'America/Los_Angeles',
      tasks = json.dumps([
        { "tag": "manual",
          "values": {},
          "sequence": 1
        },
      ]),
      job_status = json.dumps({
        "date_tz": str(now_tz.date()),
        "tasks": [
          {
            "instance": 1,
            "order": 0,
            "event": "JOB_END",
            "utc":str(datetime.utcnow()), 
            "script": "manual",
            "hour": 0,
            "stdout":"",
            "stderr": "",
            "done": True
          }
        ]
      }),
      worker_uid = 'TEST_WORKER',
      worker_utm = utc_milliseconds() - WORKER_LOOKBACK_EXPIRE
    )
    self.recipe_done.update()
Beispiel #4
0
  def setUp(self):
    self.account = account_create()
    self.project = project_create()

    now_tz = utc_to_timezone(datetime.utcnow(), 'America/Los_Angeles')

    self.job_done = Recipe.objects.create(
      account = self.account,
      project = self.project,
      name = 'RECIPE_DONE',
      active = True,
      week = json.dumps(['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']),
      hour = json.dumps([0]),
      timezone = 'America/Los_Angeles',
      tasks = json.dumps([
        { "tag": "hello", 
          "values": {"say_first":"Hi Once", "say_second":"Hi Twice", "sleep":0},
          "sequence": 1
        },
      ]),
      job_status = json.dumps({
        "day":["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
        "date_tz": str(now_tz.date()),
        "force": True,
        "tasks": [
          {
            "instance": 1,
            "order": 0,
            "event": "JOB_END",
            "utc":str(datetime.utcnow()),
            "script": "hello",
            "hour": now_tz.hour,
            "stdout":"",
            "stderr": "",
            "done": True
          }, {
            "instance": 2,
            "order": 0,
            "event": "JOB_END",
            "utc":str(datetime.utcnow()),
            "script": "hello",
            "hour": now_tz.hour,
            "stdout":"",
            "stderr": "",
            "done": True
          }
        ]
      }),

      job_done = False,
      worker_uid = "SAMPLE_WORKER",
      worker_utm = utc_milliseconds() - (JOB_LOOKBACK_MS * 2)
    )
    self.RECIPE_DONE = self.job_done.uid()
Beispiel #5
0
  def test_time(self):
    utc_now = datetime.utcnow().replace(second=0, microsecond=0)
    tz_now = datetime.now(tz=pytz.timezone(self.recipe.timezone)).replace(second=0, microsecond=0)

    utm = utc_milliseconds(utc_now)
    tz1 = utc_milliseconds_to_timezone(utm, self.recipe.timezone)
    tz2 = utc_to_timezone(utc_now, self.recipe.timezone)
    tz3 = timezone_to_utc(tz_now)

    self.assertEqual(tz1, tz2)
    self.assertEqual(tz3, utc_now)
    def test_all_hours(self):
        self.recipe.hour = json.dumps([])
        self.recipe.save()

        status = self.recipe.get_status()

        now_tz = utc_to_timezone(datetime.utcnow(), self.recipe.timezone)
        date_tz = str(now_tz.date())

        self.assertEqual(status['date_tz'], date_tz)
        self.assertEqual(len(status['tasks']), 1 + 1 + 1 + 0 + 3 + 1)
        self.assertFalse(status['force'])
Beispiel #7
0
  def setUp(self):
    self.account = account_create()
    self.project = project_create()

    now_tz = utc_to_timezone(datetime.utcnow(), 'America/Los_Angeles')

    self.recipe = Recipe.objects.create(
      account = self.account,
      project = self.project,
      name = 'RECIPE_NEW',
      active = True,
      week = json.dumps(['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']),
      hour = json.dumps([0]),
      timezone = 'America/Los_Angeles',
      tasks = json.dumps([
        { "tag": "hello",
          "values": { "sleep":10 }, # seconds
          "sequence": 1
        },
      ]),
      job_status = json.dumps({
        "date_tz":str(now_tz.date()),
        "tasks": [
          { 
            "instance": 1,
            "order": 0,
            "event": "JOB_END",
            "utc":str(datetime.utcnow() - timedelta(days=1)),
            "script": "hello",
            "hour": 0,
            "stdout":"",
            "stderr": "",
            "done": False
          },
          { 
            "instance": 2,
            "order": 0,
            "event": "JOB_END",
            "utc":str(datetime.utcnow() - timedelta(days=1)),
            "script": "hello",
            "hour": 0,
            "stdout":"",
            "stderr": "",
            "done": False
          }
        ]
      }),
      job_utm = test_job_utm()
    )

    self.workers = Workers('TEST_WORKER', 5, 60)
    def setUp(self):
        self.account = account_create()
        self.project = project_create()

        now_tz = utc_to_timezone(datetime.utcnow(), 'America/Los_Angeles')
        today_tz = now_tz.strftime('%a')
        yesterday_tz = (now_tz - timedelta(hours=24)).strftime('%a')
        tomorrow_tz = (now_tz + timedelta(hours=24)).strftime('%a')

        self.recipe_today = Recipe.objects.create(
            account=self.account,
            project=self.project,
            name='RECIPE_TODAY',
            active=True,
            week=json.dumps([today_tz]),
            hour=json.dumps([0]),
            timezone='America/Los_Angeles',
            tasks=json.dumps([
                {
                    "tag": "hello",
                    "values": {},
                    "sequence": 1
                },
            ]),
            worker_uid="OTHER_WORKER",
            worker_utm=utc_milliseconds() - (
                JOB_LOOKBACK_MS * 10
            )  # important for test ( jobs older than this get job_done flag reset )
        )

        self.recipe_not_today = Recipe.objects.create(
            account=self.account,
            project=self.project,
            name='RECIPE_NOT_TODAY',
            active=True,
            week=json.dumps([yesterday_tz, tomorrow_tz]),
            hour=json.dumps([0]),
            timezone='America/Los_Angeles',
            tasks=json.dumps([
                {
                    "tag": "hello",
                    "values": {},
                    "sequence": 1
                },
            ]),
            worker_uid="OTHER_WORKER",
            worker_utm=utc_milliseconds() - (
                JOB_LOOKBACK_MS * 10
            )  # important for test ( jobs older than this get job_done flag reset )
        )
Beispiel #9
0
  def test_all_hours(self):

    # reduce the hours so that fewer permutations are created
    self.recipe.hour = json.dumps([])
    self.recipe.save() 
    self.recipe.update()

    status = self.recipe.get_status()

    now_tz = utc_to_timezone(datetime.utcnow(), self.recipe.timezone)
    date_tz = str(now_tz.date())

    self.assertEqual(status['date_tz'], date_tz)
    self.assertEqual(len(status['tasks']), 1 + 1 + 1 + 0 + 3 + 1) 
Beispiel #10
0
  def test_status(self):
    # without force manual tasks do not pull
    status = self.recipe.get_status()

    now_tz = utc_to_timezone(datetime.utcnow(), self.recipe.timezone)
    date_tz = str(now_tz.date())
    hour_tz = now_tz.hour

    self.assertEqual(status['date_tz'], date_tz)
    self.assertEqual(len(status['tasks']), 0)

    # force a run now on a manual task
    self.recipe.force()
    status = self.recipe.get_status()
    self.assertEqual(len(status['tasks']), 1)
Beispiel #11
0
  def setUp(self):
    self.account = account_create()
    self.project = project_create()

    now_tz = utc_to_timezone(datetime.utcnow(), 'America/Los_Angeles')

    self.recipe = Recipe.objects.create(
      account = self.account,
      project = self.project,
      name = 'RECIPE_NEW',
      active = True,
      week = json.dumps(['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']),
      hour = json.dumps([0]),
      timezone = 'America/Los_Angeles',
      tasks = json.dumps([
        { "tag": "hello",
          "values": { "error":"Triggered the error mechanic on purpose."},
          "sequence": 1
        },
      ]),
      job_status = json.dumps({
        "date_tz":str(now_tz.date()),
        "tasks": [
          {
            "instance": 1,
            "order": 0,
            "event": "JOB_PENDING",
            "utc":str(datetime.utcnow()),
            "script": "hello",
            "hour": 0,
            "stdout":"",
            "stderr": "",
            "done": False
          }, {
            "instance": 2,
            "order": 2,
            "event": "JOB_PENDING",
            "utc":str(datetime.utcnow()),
            "script": "hello",
            "hour": 0,
            "stdout":"",
            "stderr": "",
            "done": False
          },
        ]
      }),
      job_utm = test_job_utm()
    )
Beispiel #12
0
  def test_forced(self):
    status = self.recipe.force()

    now_tz = utc_to_timezone(datetime.utcnow(), self.recipe.timezone)
    date_tz = str(now_tz.date())

    self.assertEqual(status['date_tz'], date_tz)
    self.assertEqual(len(status['tasks']), len(self.recipe.get_json()['tasks'])) 

    # includes all tasks in sequence including hours=[], normally #2 is skipped
    self.assertEqual(status['tasks'][0]['order'], 0)
    self.assertEqual(status['tasks'][1]['order'], 1)
    self.assertEqual(status['tasks'][2]['order'], 2)
    self.assertEqual(status['tasks'][3]['order'], 3)
    self.assertEqual(status['tasks'][4]['order'], 4)
    self.assertEqual(status['tasks'][5]['order'], 5)
    self.assertEqual(status['tasks'][6]['order'], 6)
    def test_hour_pulls(self):
        hour_tz = utc_to_timezone(datetime.utcnow(), self.recipe.timezone).hour

        if hour_tz == 23:
            print 'SKIPPING test_hour_pulls, need 1 spare hour for test.'
        else:
            task = self.recipe.get_task()
            while task != None:
                self.recipe.set_task(task['script'], task['instance'],
                                     task['hour'], 'JOB_END', 'Some output.',
                                     '')
                task = self.recipe.get_task()

            status = self.recipe.get_status()

            self.assertTrue(
                all([(task['done'] and task['hour'] <= hour_tz)
                     or (not task['done'] and task['hour'] > hour_tz)
                     for task in status['tasks']]))
Beispiel #14
0
  def setUp(self):
    self.account = account_create()
    self.project = project_create()

    now_tz = utc_to_timezone(datetime.utcnow(), 'America/Los_Angeles')
    status = {
      "date_tz":str(now_tz.date()),
      "tasks": [
        {
          "instance": 1,
          "order": 0,
          "event": "JOB_PENDING",
          "utc":str(datetime.utcnow()),
          "script": "hello",
          "hour": 0,
          "stdout":"",
          "stderr": "",
          "done": False
        }, {
          "instance": 2,
          "order": 2,
          "event": "JOB_PENDING",
          "utc":str(datetime.utcnow()),
          "script": "hello",
          "hour": 0,
          "stdout":"",
          "stderr": "",
          "done": False
        },
      ]
    }

    self.job_new = Recipe.objects.create(
      account = self.account,
      project = self.project,
      name = 'RECIPE_NEW',
      active = True,
      week = json.dumps(['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']),
      hour = json.dumps([0]),
      timezone = 'America/Los_Angeles',
      tasks = json.dumps([
        { "tag": "hello", 
          "values": {"say_first":"Hi Once", "say_second":"Hi Twice", "sleep":0},
          "sequence": 1
        },
      ]),
    )
    self.RECIPE_NEW = self.job_new.uid()

    self.job_queued = Recipe.objects.create(
      account = self.account,
      project = self.project,
      name = 'RECIPE_QUEUED',
      active = True,
      week = json.dumps(['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']),
      hour = json.dumps([0]),
      timezone = 'America/Los_Angeles',
      tasks = json.dumps([
        { "tag": "hello", 
          "values": {"say_first":"Hi Once", "say_second":"Hi Twice", "sleep":0},
          "sequence": 1
        },
      ]),
      job_status = json.dumps(status.copy()),
      job_utm = test_job_utm()
    )
    self.RECIPE_QUEUED = self.job_queued.uid()

    self.job_expired = Recipe.objects.create(
      account = self.account,
      project = self.project,
      name = 'RECIPE_EXPIRED',
      active = True,
      week = json.dumps(['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']),
      hour = json.dumps([0]),
      timezone = 'America/Los_Angeles',
      tasks = json.dumps([
        { "tag": "hello", 
          "values": {"say_first":"Hi Once", "say_second":"Hi Twice", "sleep":0},
          "sequence": 1
        },
      ]),
      job_status = json.dumps(status.copy()),
      job_utm = test_job_utm(),
      worker_uid = "SAMPLE_WORKER",
      worker_utm = utc_milliseconds() - WORKER_LOOKBACK_EXPIRE
    )
    self.RECIPE_EXPIRED = self.job_expired.uid()

    self.job_running = Recipe.objects.create(
      account = self.account,
      project = self.project,
      name = 'RECIPE_RUNNING',
      active = True,
      week = json.dumps(['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']),
      hour = json.dumps([0]),
      timezone = 'America/Los_Angeles',
      tasks = json.dumps([
        { "tag": "hello", 
          "values": {"say_first":"Hi Once", "say_second":"Hi Twice", "sleep":0},
          "sequence": 1
        }
      ]),
      job_status = json.dumps(status.copy()),
      job_utm = test_job_utm(),
      worker_uid = "OTHER_WORKER",
      worker_utm = utc_milliseconds()
    )
    self.RECIPE_RUNNING = self.job_running.uid()

    self.job_paused = Recipe.objects.create(
      account = self.account,
      project = self.project,
      name = 'RECIPE_PAUSED',
      active = False,
      week = json.dumps(['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']),
      hour = json.dumps([0]),
      timezone = 'America/Los_Angeles',
      tasks = json.dumps([
        { "tag": "hello", 
          "values": {"say_first":"Hi Once", "say_second":"Hi Twice", "sleep":0},
          "sequence": 1
        }
      ]),
      job_status = json.dumps(status.copy()),
      job_utm = test_job_utm(),
      worker_uid = "OTHER_WORKER",
      worker_utm = utc_milliseconds() - WORKER_LOOKBACK_EXPIRE
    )
    self.RECIPE_PAUSED = self.job_paused.uid()

    # paused so its not part of the normal flow ( unpause to use in test )
    self.job_error = Recipe.objects.create(
      account = self.account,
      project = self.project,
      name = 'RECIPE_ERROR',
      active = False,
      week = json.dumps(['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']),
      hour = json.dumps([0]),
      timezone = 'America/Los_Angeles',
      tasks = json.dumps([
        { "tag": "hello", 
          "values": {"say_first":"Hi Once", "say_second":"Hi Twice", "sleep":0, "errror":"An error is triggered."},
          "sequence": 1
        },
      ]),
      job_status = json.dumps(status.copy()),
      job_utm = test_job_utm(),
      worker_uid = "",
      worker_utm = 0
    )
    self.RECIPE_ERROR = self.job_error.uid()
Beispiel #15
0
  def setUp(self):
    self.account = account_create()
    self.project = project_create()
    
    now_tz = utc_to_timezone(datetime.utcnow(), 'America/Los_Angeles')
    today_tz = now_tz.strftime('%a')
    yesterday_tz = (now_tz - timedelta(days=1)).strftime('%a')
    tomorrow_tz = (now_tz + timedelta(days=1)).strftime('%a')

    self.recipe_today = Recipe.objects.create(
      account = self.account,
      project = self.project,
      name = 'RECIPE_TODAY',
      active = True,
      week = json.dumps([today_tz]),
      hour = json.dumps([0]),
      timezone = 'America/Los_Angeles',
      tasks = json.dumps([
        { "tag": "hello",
          "values": {},
          "sequence": 1
        },
      ]),
      job_status = json.dumps({
        "date_tz":str(now_tz.date()),
        "tasks": [
          { 
            "instance": 1,
            "order": 0,
            "event": "JOB_PENDING",
            "utc":str(datetime.utcnow()),
            "script": "hello",
            "hour": 0,
            "stdout":"",
            "stderr": "",
            "done": False
          },
          { 
            "instance": 2,
            "order": 0,
            "event": "JOB_PENDING",
            "utc":str(datetime.utcnow()),
            "script": "hello",
            "hour": 0,
            "stdout":"",
            "stderr": "",
            "done": False
          }
        ]
      }),
      worker_uid = "OTHER_WORKER",
      worker_utm = utc_milliseconds() - WORKER_LOOKBACK_EXPIRE,
      job_utm = test_job_utm()
    )

    self.recipe_not_today = Recipe.objects.create(
      account = self.account,
      project = self.project,
      name = 'RECIPE_NOT_TODAY',
      active = True,
      week = json.dumps([yesterday_tz, tomorrow_tz]),
      hour = json.dumps([0]),
      timezone = 'America/Los_Angeles',
      tasks = json.dumps([
        { "tag": "hello",
          "values": {}, 
          "sequence": 1
        },
      ]),
      job_status = json.dumps({
        "date_tz":str(now_tz.date() - timedelta(days=1)),
        "tasks": [
          {
            "instance": 1,
            "order": 0,
            "event": "JOB_END",
            "utc":str(datetime.utcnow() - timedelta(days=1)),
            "script": "hello",
            "hour": 0,
            "stdout":"",
            "stderr": "",
            "done": True
          },
          {
            "instance": 2,
            "order": 0,
            "event": "JOB_END",
            "utc":str(datetime.utcnow() - timedelta(days=1)),
            "script": "hello",
            "hour": 0,
            "stdout":"",
            "stderr": "",
            "done": True
          }
        ]
      }),
      worker_uid = "OTHER_WORKER",
      worker_utm = utc_milliseconds() - WORKER_LOOKBACK_EXPIRE,
      job_utm = test_job_utm(0, 1)
    )