예제 #1
0
def test__time_forward(sleep):
    with patch("zettarepl.scheduler.clock.datetime") as datetime_:
        clock = Clock()

        clock.now = datetime(2018, 8, 31, 13, 20, 50)

        datetime_.utcnow.return_value = datetime(2018, 8, 31, 13, 21, 1, 2)
        assert clock._tick() == datetime(2018, 8, 31, 13, 21, 1, 2)

        sleep.assert_not_called()
        assert clock.now == datetime(2018, 8, 31, 13, 21, 1, 2)
예제 #2
0
def test__sleep_max_10s(sleep):
    with patch("zettarepl.scheduler.clock.datetime") as datetime_:
        clock = Clock()

        clock.now = datetime(2018, 8, 31, 13, 20, 25)

        datetime_.utcnow.return_value = datetime(2018, 8, 31, 13, 20, 35)
        assert clock._tick() is None

        sleep.assert_called_once_with(10)
        assert clock.now == datetime(2018, 8, 31, 13, 20, 35)
예제 #3
0
def test__sleep_at_the_end_of_the_minute(sleep):
    with patch("zettarepl.scheduler.clock.datetime") as datetime_:
        clock = Clock()

        clock.now = datetime(2018, 8, 31, 13, 20, 45)

        datetime_.utcnow.return_value = datetime(2018, 8, 31, 13, 20, 55,
                                                 500000)
        assert clock._tick() is None

        sleep.assert_called_once_with(4.5)
        assert clock.now == datetime(2018, 8, 31, 13, 20, 55, 500000)
예제 #4
0
파일: zettarepl.py 프로젝트: MrYHM/freenas
    def __call__(self):
        if logging.getLevelName(self.debug_level) == logging.TRACE:
            # If we want TRACE then we want all debug from zettarepl
            debug_level = "DEBUG"
        elif logging.getLevelName(self.debug_level) == logging.DEBUG:
            # Regular development level. We don't need verbose debug from zettarepl
            debug_level = "INFO"
        else:
            debug_level = self.debug_level
        setup_logging("zettarepl", debug_level, self.log_handler)

        definition = Definition.from_data(self.definition)

        clock = Clock()
        tz_clock = TzClock(definition.timezone, clock.now)

        scheduler = Scheduler(clock, tz_clock)
        local_shell = LocalShell()

        self.zettarepl = Zettarepl(scheduler, local_shell)
        self.zettarepl.set_observer(self._observer)
        self.zettarepl.set_tasks(definition.tasks)

        start_daemon_thread(target=self._process_command_queue)

        while True:
            try:
                self.zettarepl.run()
            except Exception:
                logging.getLogger("zettarepl").error("Unhandled exception",
                                                     exc_info=True)
                time.sleep(10)
예제 #5
0
def create_zettarepl(definition, clock_args=None):
    clock_args = clock_args or []

    clock = Clock(*clock_args)
    tz_clock = TzClock(definition.timezone, clock.now)

    scheduler = Scheduler(clock, tz_clock)
    local_shell = LocalShell()

    return Zettarepl(scheduler, local_shell,
                     definition.max_parallel_replication_tasks)
예제 #6
0
def run(args):
    definition = load_definition(args.definition_path)

    clock = Clock(args.once)
    tz_clock = TzClock(definition.timezone, clock.now)

    scheduler = Scheduler(clock, tz_clock)
    local_shell = LocalShell()

    zettarepl = Zettarepl(scheduler, local_shell)
    zettarepl.set_tasks(definition.tasks)
    zettarepl.run()
예제 #7
0
    def __call__(self):
        setproctitle.setproctitle('middlewared (zettarepl)')
        osc.die_with_parent()
        if logging.getLevelName(self.debug_level) == logging.TRACE:
            # If we want TRACE then we want all debug from zettarepl
            default_level = logging.DEBUG
        elif logging.getLevelName(self.debug_level) == logging.DEBUG:
            # Regular development level. We don't need verbose debug from zettarepl
            default_level = logging.INFO
        else:
            default_level = logging.getLevelName(self.debug_level)
        setup_logging("", "DEBUG", self.log_handler)
        oqlh = ObserverQueueLoggingHandler(self.observer_queue)
        oqlh.setFormatter(
            logging.Formatter(
                '[%(asctime)s] %(levelname)-8s [%(threadName)s] [%(name)s] %(message)s',
                '%Y/%m/%d %H:%M:%S'))
        logging.getLogger("zettarepl").addHandler(oqlh)
        for handler in logging.getLogger("zettarepl").handlers:
            handler.addFilter(LongStringsFilter())
            handler.addFilter(ReplicationTaskLoggingLevelFilter(default_level))

        c = Client('ws+unix:///var/run/middlewared-internal.sock',
                   py_exceptions=True)
        c.subscribe(
            'core.reconfigure_logging',
            lambda *args, **kwargs: reconfigure_logging('zettarepl_file'))

        definition = Definition.from_data(self.definition,
                                          raise_on_error=False)
        self.observer_queue.put(DefinitionErrors(definition.errors))

        clock = Clock()
        tz_clock = TzClock(definition.timezone, clock.now)

        scheduler = Scheduler(clock, tz_clock)
        local_shell = LocalShell()

        self.zettarepl = Zettarepl(scheduler, local_shell)
        self.zettarepl.set_observer(self._observer)
        self.zettarepl.set_tasks(definition.tasks)

        start_daemon_thread(target=self._process_command_queue)

        while True:
            try:
                self.zettarepl.run()
            except Exception:
                logging.getLogger("zettarepl").error("Unhandled exception",
                                                     exc_info=True)
                time.sleep(10)
예제 #8
0
def run(args):
    try:
        definition = Definition.from_data(yaml.load(args.definition_path))
    except yaml.YAMLError as e:
        sys.stderr.write(f"Definition syntax error: {e!s}\n")
        sys.exit(1)
    except jsonschema.exceptions.ValidationError as e:
        sys.stderr.write(f"Definition validation error: {e!s}\n")
        sys.exit(1)
    except ValueError as e:
        sys.stderr.write(f"{e!s}\n")
        sys.exit(1)

    clock = Clock(args.once)
    tz_clock = TzClock(definition.timezone, clock.now)

    scheduler = Scheduler(clock, tz_clock)
    local_shell = LocalShell()

    zettarepl = Zettarepl(scheduler, local_shell)
    zettarepl.set_tasks(definition.tasks)
    zettarepl.run()