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')
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')
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))
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) )
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)
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)