Ejemplo n.º 1
0
def test_store_cron_job_message_to_disk():
    tmp_dir = mkdtemp()
    ser = path.join(tmp_dir, 'cluster_jobs.json')

    loop = asyncio.new_event_loop()
    asyncio.set_event_loop(loop)

    storage = Storage(path_prefix=tmp_dir)

    processor = Processor(12345,
                          storage,
                          cron=CronTab(tab="""* * * * * command"""))

    message = CronItem(command="echo 'hello world'")
    message.append_log("test log message")

    for packet in UdpSerializer.dump(message):
        processor.queue.put_nowait(packet)

    loop.run_until_complete(asyncio.gather(processor.process()))

    loop.run_until_complete(asyncio.gather(storage.save()))

    assert processor.queue.qsize() == 0
    assert len(storage.cluster_jobs) == 1
    assert message == storage.cluster_jobs[0]
    assert exists(ser)

    loop.close()

    shutil.rmtree(tmp_dir)
Ejemplo n.º 2
0
def test_rebalancing():
    n1 = 'node1'
    n2 = 'node2'
    storage = Storage()
    storage.cluster_status = [Status(n1, 0), Status(n2, 0)]
    cj1 = CronItem(command="echo 'hello world 1'")
    cj2 = CronItem(command="echo 'hello world 2'")
    storage.cluster_jobs.append(cj1)
    storage.cluster_jobs.append(cj2)
    scheduler = Scheduler(storage, 60)
    assert not scheduler.check_cluster_state()
    scheduler.re_balance()
    assert scheduler.check_cluster_state()
Ejemplo n.º 3
0
def test_cron_with_message_larger_then_max():
    cj = CronItem(command=''.join(
        random.choice(string.ascii_uppercase + string.digits)
        for _ in range(6000)))
    packets = list(UdpSerializer.dump(cj))
    assert len(packets) > 1
    assert cj == UdpSerializer.load(packets)
Ejemplo n.º 4
0
 def new(self, command='', comment='', user=None):
     """
     Create a new cron with a command and comment.
     :return: the new CronItem object.
     """
     if not user and self.user is False:
         raise ValueError("User is required for system crontabs.")
     item = CronItem(command, comment, user=user, cron=self)
     self.append(item)
     return item
Ejemplo n.º 5
0
Archivo: site.py Proyecto: witlox/dcron
    async def import_data(self, request):
        data = await request.post()

        if 'payload' not in data:
            return web.Response(status=500, text='no payload found')

        self.logger.debug("received import request {0}".format(
            data['payload']))

        try:
            imports = json.loads(data['payload'])
            for line in imports:
                if 'pattern' in line and 'command' in line and 'enabled' in line:
                    cron_item = CronItem(command=line['command'])
                    cron_item.set_all(line['pattern'])
                    cron_item.enable(line['enabled'])
                    self.logger.debug(
                        "received new job from import {0}, broadcasting it.".
                        format(cron_item))
                    broadcast(self.udp_port,
                              UdpSerializer.dump(cron_item, self.hash_key))
                else:
                    self.logger.error(
                        "import element invalid: {0}".format(line))
            return web.HTTPOk()
        except ValueError as e:
            self.logger.error(e)
            return web.HTTPClientError(text='invalid json received')
Ejemplo n.º 6
0
 def __setattr__(self, name, value):
     """
     Catch setting crons and lines directly
     """
     if name == 'lines' and value:
         for line in value:
             self.append(CronItem.from_line(line, cron=self),
                         line,
                         read=True)
     elif name == 'crons' and value:
         raise AttributeError("You can NOT set crons attribute directly")
     else:
         super(CronTab, self).__setattr__(name, value)
Ejemplo n.º 7
0
Archivo: site.py Proyecto: witlox/dcron
    def generate_cron_item(self, data, removable=False):

        cron_item = CronItem(command=data['command'])
        if self.user:
            cron_item.user = self.user
        else:
            cron_item.user = '******'
        cron_item.remove = removable

        pattern = '{0} {1} {2} {3} {4}'.format(data['minute'], data['hour'],
                                               data['dom'], data['month'],
                                               data['dow'])

        self.logger.debug("adding pattern {0} to job".format(pattern))

        cron_item.set_all(pattern)

        return cron_item
Ejemplo n.º 8
0
def test_save_load():
    loop = asyncio.new_event_loop()
    asyncio.set_event_loop(loop)

    tmp_dir = mkdtemp()
    storage = Storage(path_prefix=tmp_dir)

    cron = crontab.CronTab()
    item = CronItem(command="echo 'hello world'", cron=cron)
    item.set_all("2 1 * * *")
    item.append_log("test log message")

    storage.cluster_jobs.append(item)
    assert 1 == len(storage.cluster_jobs)

    loop.run_until_complete(storage.save())

    storage = Storage(path_prefix=tmp_dir)
    assert 1 == len(storage.cluster_jobs)
    shutil.rmtree(tmp_dir)
Ejemplo n.º 9
0
def test_cron_job_message_dumps_loads():
    cj = CronItem(command="echo 'hello world'")
    packets = list(UdpSerializer.dump(cj))
    assert cj == UdpSerializer.load(packets)
Ejemplo n.º 10
0
 def object_hook(obj):
     if '_type' not in obj:
         return obj
     if obj['_type'] == 'CronItem':
         cron = json.loads(obj['cron'], cls=CronDecoder)
         user = json.loads(obj['user'])
         cron_item = CronItem(command=obj['command'], user=user, cron=cron)
         cron_item.enable(obj['enabled'])
         cron_item.comment = obj['comment']
         cron_item.assigned_to = obj['assigned_to']
         cron_item.pid = obj['pid']
         cron_item._log = obj['log']
         if obj['last_run'] != '':
             cron_item.last_run = parser.parse(obj['last_run'])
         cron_item.set_all(obj['parts'])
         return cron_item
     elif obj['_type'] == 'CronTab':
         return CronTab(user=obj['user'],
                        tab=obj['tab'],
                        tabfile=obj['tabfile'],
                        log=obj['log'])
     elif obj['_type'] == 'status':
         status = Status()
         status.system_load = obj['load']
         status.state = obj['state']
         status.ip = obj['ip']
         status.time = obj['time']
         return status
     return obj