示例#1
0
    def test_pickup_from_job_store(self, method):
        method.side_effect = self.target_method

        self.override_config('pickup_job_after', 1, 'scheduler')

        # 1. Create a scheduled job in Job Store.
        execute_at = datetime.datetime.utcnow() + datetime.timedelta(seconds=1)

        db_api.create_scheduled_job({
            'run_after': 1,
            'func_name': TARGET_METHOD_PATH,
            'func_args': {'name': 'task', 'id': '321'},
            'execute_at': execute_at,
            'captured_at': None,
            'auth_ctx': {}
        })

        self.assertTrue(len(db_api.get_scheduled_jobs()) > 0)

        self._unlock_target_method()
        self._wait_target_method_end()

        # 2. Wait till Scheduler picks up the job and processes it.
        self._await(lambda: not db_api.get_scheduled_jobs())

        method.assert_called_once_with(name='task', id='321')
示例#2
0
    def test_pickup_from_job_store(self, method):
        # Delegate from the module function to the method of the test class.
        method.side_effect = self.target_method

        self.override_config('pickup_job_after', 1, 'scheduler')

        # 1. Create a scheduled job in Job Store.
        execute_at = datetime.datetime.utcnow() + datetime.timedelta(seconds=1)

        db_api.create_scheduled_job({
            'run_after': 1,
            'func_name': TARGET_METHOD_PATH,
            'func_args': {
                'name': 'task',
                'id': '321'
            },
            'execute_at': execute_at,
            'captured_at': None,
            'auth_ctx': {}
        })

        self.assertEqual(1, len(db_api.get_scheduled_jobs()))

        self._unlock_target_method()
        self._wait_target_method_end()

        # 2. Wait till Scheduler picks up the job and processes it.
        self._await(lambda: not db_api.get_scheduled_jobs())

        method.assert_called_once_with(name='task', id='321')
示例#3
0
    def test_recapture_job(self, method):
        # Delegate from the module function to the method of the test class.
        method.side_effect = self.target_method

        self.override_config('pickup_job_after', 1, 'scheduler')
        self.override_config('captured_job_timeout', 3, 'scheduler')

        # 1. Create a scheduled job in Job Store marked as captured in one
        #    second in the future. It can be captured again only after 3
        #    seconds after that according to the config option.
        captured_at = datetime.datetime.utcnow() + datetime.timedelta(
            seconds=1)

        before_ts = datetime.datetime.utcnow()

        db_api.create_scheduled_job({
            'run_after': 1,
            'func_name': TARGET_METHOD_PATH,
            'func_args': {
                'name': 'task',
                'id': '321'
            },
            'execute_at': datetime.datetime.utcnow(),
            'captured_at': captured_at,
            'auth_ctx': {}
        })

        self.assertEqual(1, len(db_api.get_scheduled_jobs()))

        self._unlock_target_method()
        self._wait_target_method_end()

        # 2. Wait till Scheduler picks up the job and processes it.
        self._await(lambda: not db_api.get_scheduled_jobs())

        method.assert_called_once_with(name='task', id='321')

        # At least 3 seconds should have passed.
        self.assertTrue(datetime.datetime.utcnow() -
                        before_ts >= datetime.timedelta(seconds=3))
示例#4
0
    def test_recapture_job(self, method):
        method.side_effect = self.target_method

        self.override_config('pickup_job_after', 1, 'scheduler')
        self.override_config('captured_job_timeout', 3, 'scheduler')

        # 1. Create a scheduled job in Job Store marked as captured in one
        #    second in the future. It can be captured again only after 3
        #    seconds after that according to the config option.
        captured_at = datetime.datetime.utcnow() + datetime.timedelta(
            seconds=1
        )

        before_ts = datetime.datetime.utcnow()

        db_api.create_scheduled_job({
            'run_after': 1,
            'func_name': TARGET_METHOD_PATH,
            'func_args': {'name': 'task', 'id': '321'},
            'execute_at': datetime.datetime.utcnow(),
            'captured_at': captured_at,
            'auth_ctx': {}
        })

        self.assertTrue(len(db_api.get_scheduled_jobs()) > 0)

        self._unlock_target_method()
        self._wait_target_method_end()

        # 2. Wait till Scheduler picks up the job and processes it.
        self._await(lambda: not db_api.get_scheduled_jobs())

        method.assert_called_once_with(name='task', id='321')

        # At least 3 seconds should have passed.
        self.assertTrue(
            datetime.datetime.utcnow() - before_ts >=
            datetime.timedelta(seconds=3)
        )
示例#5
0
    def _persist_job(job):
        ctx_serializer = context.RpcContextSerializer()

        ctx = (
            ctx_serializer.serialize_context(context.ctx())
            if context.has_ctx() else {}
        )

        execute_at = (utils.utc_now_sec() +
                      datetime.timedelta(seconds=job.run_after))

        args = job.func_args
        arg_serializers = job.func_arg_serializers

        if arg_serializers:
            for arg_name, serializer_path in arg_serializers.items():
                if arg_name not in args:
                    raise exc.MistralException(
                        "Serializable function argument %s"
                        " not found in func_args=%s"
                        % (arg_name, args))
                try:
                    serializer = importutils.import_class(serializer_path)()
                except ImportError as e:
                    raise ImportError(
                        "Cannot import class %s: %s" % (serializer_path, e)
                    )

                args[arg_name] = serializer.serialize(args[arg_name])

        values = {
            'run_after': job.run_after,
            'target_factory_func_name': job.target_factory_func_name,
            'func_name': job.func_name,
            'func_args': args,
            'func_arg_serializers': arg_serializers,
            'auth_ctx': ctx,
            'execute_at': execute_at,
            'captured_at': None,
            'key': job.key
        }

        return db_api.create_scheduled_job(values)
示例#6
0
    def _persist_job(cls, job):
        ctx_serializer = context.RpcContextSerializer()

        ctx = (
            ctx_serializer.serialize_context(context.ctx())
            if context.has_ctx() else {}
        )

        execute_at = (utils.utc_now_sec() +
                      datetime.timedelta(seconds=job.run_after))

        args = job.func_args
        arg_serializers = job.func_arg_serializers

        if arg_serializers:
            for arg_name, serializer_path in arg_serializers.items():
                if arg_name not in args:
                    raise exc.MistralException(
                        "Serializable function argument %s"
                        " not found in func_args=%s"
                        % (arg_name, args))
                try:
                    serializer = importutils.import_class(serializer_path)()
                except ImportError as e:
                    raise ImportError(
                        "Cannot import class %s: %s" % (serializer_path, e)
                    )

                args[arg_name] = serializer.serialize(args[arg_name])

        values = {
            'run_after': job.run_after,
            'target_factory_func_name': job.target_factory_func_name,
            'func_name': job.func_name,
            'func_args': args,
            'func_arg_serializers': arg_serializers,
            'auth_ctx': ctx,
            'execute_at': execute_at,
            'captured_at': None
        }

        return db_api.create_scheduled_job(values)