def test_bad_load(capfd): with schedule_instance() as instance: fake_origin = _get_unloadable_schedule_origin() initial_datetime = pendulum.datetime( year=2019, month=2, day=27, hour=23, minute=59, second=59, ) with pendulum.test(initial_datetime): schedule_state = ScheduleState( fake_origin, ScheduleStatus.RUNNING, "0 0 * * *", pendulum.now("UTC").timestamp(), ) instance.add_schedule_state(schedule_state) initial_datetime = initial_datetime.add(seconds=1) with pendulum.test(initial_datetime): launch_scheduled_runs(instance, logger(), pendulum.now("UTC")) assert instance.get_runs_count() == 0 ticks = instance.get_schedule_ticks(fake_origin.get_id()) assert len(ticks) == 0 captured = capfd.readouterr() assert "Scheduler failed for also_doesnt_exist" in captured.out assert "doesnt_exist not found at module scope" in captured.out initial_datetime = initial_datetime.add(days=1) with pendulum.test(initial_datetime): launch_scheduled_runs(instance, logger(), pendulum.now("UTC")) assert instance.get_runs_count() == 0 ticks = instance.get_schedule_ticks(fake_origin.get_id()) assert len(ticks) == 0
def test_reconcile_schedule_without_start_time(): with TemporaryDirectory() as tempdir: instance = define_scheduler_instance(tempdir) external_repo = get_test_external_repo() external_schedule = external_repo.get_external_schedule( "no_config_pipeline_daily_schedule") legacy_schedule_state = ScheduleState( external_schedule.get_origin(), ScheduleStatus.RUNNING, external_schedule.cron_schedule, None, ) instance.add_schedule_state(legacy_schedule_state) instance.reconcile_scheduler_state(external_repository=external_repo) reconciled_schedule_state = instance.get_schedule_state( external_schedule.get_origin_id()) assert reconciled_schedule_state.status == ScheduleStatus.RUNNING assert reconciled_schedule_state.start_timestamp == get_timestamp_from_utc_datetime( get_current_datetime_in_utc())
def test_bad_schedules_mixed_with_good_schedule(external_repo_context, capfd): with instance_with_schedules(external_repo_context) as (instance, external_repo): good_schedule = external_repo.get_external_schedule("simple_schedule") bad_schedule = external_repo.get_external_schedule( "bad_should_execute_schedule_on_odd_days") good_origin = good_schedule.get_origin() bad_origin = bad_schedule.get_origin() unloadable_origin = _get_unloadable_schedule_origin() initial_datetime = pendulum.datetime( year=2019, month=2, day=27, hour=0, minute=0, second=0, ) with pendulum.test(initial_datetime): instance.start_schedule_and_update_storage_state(good_schedule) instance.start_schedule_and_update_storage_state(bad_schedule) unloadable_schedule_state = ScheduleState( unloadable_origin, ScheduleStatus.RUNNING, "0 0 * * *", pendulum.now("UTC").timestamp(), ) instance.add_schedule_state(unloadable_schedule_state) launch_scheduled_runs(instance, logger(), pendulum.now("UTC")) assert instance.get_runs_count() == 1 wait_for_all_runs_to_start(instance) validate_run_started( instance.get_runs()[0], execution_time=initial_datetime, partition_time=pendulum.datetime(2019, 2, 26), ) good_ticks = instance.get_schedule_ticks(good_origin.get_id()) assert len(good_ticks) == 1 validate_tick( good_ticks[0], good_schedule, initial_datetime, ScheduleTickStatus.SUCCESS, instance.get_runs()[0].run_id, ) bad_ticks = instance.get_schedule_ticks(bad_origin.get_id()) assert len(bad_ticks) == 1 assert bad_ticks[0].status == ScheduleTickStatus.FAILURE assert ("Error occurred during the execution of should_execute " "for schedule bad_should_execute_schedule" in bad_ticks[0].error.message) unloadable_ticks = instance.get_schedule_ticks( unloadable_origin.get_id()) assert len(unloadable_ticks) == 0 captured = capfd.readouterr() assert "Scheduler failed for also_doesnt_exist" in captured.out assert "doesnt_exist not found at module scope" in captured.out initial_datetime = initial_datetime.add(days=1) with pendulum.test(initial_datetime): new_now = pendulum.now("UTC") launch_scheduled_runs(instance, logger(), new_now) assert instance.get_runs_count() == 3 wait_for_all_runs_to_start(instance) good_schedule_runs = instance.get_runs( filters=PipelineRunsFilter.for_schedule(good_schedule)) assert len(good_schedule_runs) == 2 validate_run_started( good_schedule_runs[0], execution_time=new_now, partition_time=pendulum.datetime(2019, 2, 27), ) good_ticks = instance.get_schedule_ticks(good_origin.get_id()) assert len(good_ticks) == 2 validate_tick( good_ticks[0], good_schedule, new_now, ScheduleTickStatus.SUCCESS, good_schedule_runs[0].run_id, ) bad_schedule_runs = instance.get_runs( filters=PipelineRunsFilter.for_schedule(bad_schedule)) assert len(bad_schedule_runs) == 1 validate_run_started( bad_schedule_runs[0], execution_time=new_now, partition_time=pendulum.datetime(2019, 2, 27), ) bad_ticks = instance.get_schedule_ticks(bad_origin.get_id()) assert len(bad_ticks) == 2 validate_tick( bad_ticks[0], bad_schedule, new_now, ScheduleTickStatus.SUCCESS, bad_schedule_runs[0].run_id, ) unloadable_ticks = instance.get_schedule_ticks( unloadable_origin.get_id()) assert len(unloadable_ticks) == 0 captured = capfd.readouterr() assert "Scheduler failed for also_doesnt_exist" in captured.out assert "doesnt_exist not found at module scope" in captured.out
def test_bad_load(capfd): with schedule_instance() as instance: working_directory = os.path.dirname(__file__) recon_repo = ReconstructableRepository.for_file( __file__, "doesnt_exist", working_directory) schedule = recon_repo.get_reconstructable_schedule("also_doesnt_exist") fake_origin = schedule.get_origin() initial_datetime = datetime( year=2019, month=2, day=27, hour=23, minute=59, second=59, tzinfo=get_utc_timezone(), ) with freeze_time(initial_datetime) as frozen_datetime: schedule_state = ScheduleState( fake_origin, ScheduleStatus.RUNNING, "0 0 * * *", get_timestamp_from_utc_datetime(get_current_datetime_in_utc()), ) instance.add_schedule_state(schedule_state) frozen_datetime.tick(delta=timedelta(seconds=1)) launch_scheduled_runs(instance, get_default_scheduler_logger(), get_current_datetime_in_utc()) assert instance.get_runs_count() == 0 ticks = instance.get_schedule_ticks(fake_origin.get_id()) assert len(ticks) == 1 assert ticks[0].status == ScheduleTickStatus.FAILURE assert ticks[0].timestamp == get_timestamp_from_utc_datetime( get_current_datetime_in_utc()) assert "doesnt_exist not found at module scope in file" in ticks[ 0].error.message captured = capfd.readouterr() assert "Error launching scheduled run" in captured.out assert "doesnt_exist not found at module scope" in captured.out frozen_datetime.tick(delta=timedelta(days=1)) launch_scheduled_runs(instance, get_default_scheduler_logger(), get_current_datetime_in_utc()) assert instance.get_runs_count() == 0 ticks = instance.get_schedule_ticks(fake_origin.get_id()) assert len(ticks) == 2 assert ticks[0].status == ScheduleTickStatus.FAILURE assert ticks[0].timestamp == get_timestamp_from_utc_datetime( get_current_datetime_in_utc()) assert "doesnt_exist not found at module scope in file" in ticks[ 0].error.message captured = capfd.readouterr() assert "Error launching scheduled run" in captured.out assert "doesnt_exist not found at module scope" in captured.out