def test_scheduler_change_set_adding_schedule(): schedule_1 = ScheduleDefinition('schedule_1', "*****", "pipeline_name", {}) schedule_2 = ScheduleDefinition('schedule_2', "*****", "pipeline_name", {}) schedule_3 = ScheduleDefinition('schedule_3', "*****", "pipeline_name", {}) schedule_4 = ScheduleDefinition('schedule_4', "*****", "pipeline_name", {}) modified_schedule_2 = ScheduleDefinition('schedule_2', "0****", "pipeline_name", {'new_key': "new_value"}) renamed_schedule_3 = ScheduleDefinition('renamed_schedule_3', "*****", "pipeline_name", {}) running_1 = Schedule("1", schedule_1.schedule_definition_data, ScheduleStatus.RUNNING, "", "") running_2 = Schedule("2", schedule_2.schedule_definition_data, ScheduleStatus.RUNNING, "", "") running_3 = Schedule("3", schedule_3.schedule_definition_data, ScheduleStatus.RUNNING, "", "") running_4 = Schedule("4", schedule_4.schedule_definition_data, ScheduleStatus.RUNNING, "", "") # Add initial schedules change_set_1 = get_schedule_change_set([], [schedule_1, schedule_2]) assert sorted(change_set_1) == sorted([('add', 'schedule_2', []), ('add', 'schedule_1', [])]) # Add more schedules change_set_2 = get_schedule_change_set( [running_1, running_2], [schedule_1, schedule_2, schedule_3, schedule_4]) assert sorted(change_set_2) == sorted([('add', 'schedule_3', []), ('add', 'schedule_4', [])]) # Modify schedule_2 change_set_3 = get_schedule_change_set( [running_1, running_2, running_3, running_4], [schedule_1, modified_schedule_2, schedule_3, schedule_4], ) assert change_set_3 == [('change', 'schedule_2', [('cron_schedule', ('*****', '0****'))])] # Delete schedules change_set_3 = get_schedule_change_set( [running_1, running_2, running_3, running_4], [schedule_3, schedule_4]) assert sorted(change_set_3) == sorted([('remove', 'schedule_1', []), ('remove', 'schedule_2', [])]) # Rename schedules change_set_4 = get_schedule_change_set( [running_1, running_2, running_3, running_4], [schedule_1, schedule_2, renamed_schedule_3, schedule_4], ) assert sorted(change_set_4) == sorted([('add', 'renamed_schedule_3', []), ('remove', 'schedule_3', [])])
def print_changes(repository, instance, print_fn=print, preview=False): debug_info = instance.scheduler_debug_info() errors = debug_info.errors changeset = get_schedule_change_set( instance.all_schedules(repository.name), repository.schedule_defs) if len(errors) == 0 and len(changeset) == 0: if preview: print_fn( click.style('No planned changes to schedules.', fg='magenta', bold=True)) print_fn('{num} schedules will remain unchanged'.format( num=len(repository.schedule_defs))) else: print_fn( click.style('No changes to schedules.', fg='magenta', bold=True)) print_fn('{num} schedules unchanged'.format( num=len(repository.schedule_defs))) return if len(errors): print_fn( click.style( 'Planned Error Fixes:' if preview else 'Errors Resolved:', fg='magenta', bold=True)) print_fn("\n".join(debug_info.errors)) if len(changeset): print_fn( click.style('Planned Schedule Changes:' if preview else 'Changes:', fg='magenta', bold=True)) for change in changeset: change_type, schedule_name, changes = change if change_type == "add": print_fn(click.style(' + %s (add)' % schedule_name, fg='green')) if change_type == "change": print_fn( click.style(' ~ %s (update)' % schedule_name, fg='yellow')) for change_name, diff in changes: if len(diff) == 2: old, new = diff print_fn( click.style('\t %s: ' % change_name, fg='yellow') + click.style(old, fg='red') + " => " + click.style(new, fg='green')) else: print_fn( click.style('\t %s: ' % change_name, fg='yellow') + click.style(diff, fg='green')) if change_type == "remove": print_fn(click.style(' - %s (delete)' % schedule_name, fg='red'))
def print_changes(external_repository, instance, print_fn=print, preview=False): debug_info = instance.scheduler_debug_info() errors = debug_info.errors external_schedules = external_repository.get_external_schedules() changeset = get_schedule_change_set( instance.all_stored_schedule_state(external_repository.get_origin_id()), external_schedules ) if len(errors) == 0 and len(changeset) == 0: if preview: print_fn(click.style("No planned changes to schedules.", fg="magenta", bold=True)) print_fn("{num} schedules will remain unchanged".format(num=len(external_schedules))) else: print_fn(click.style("No changes to schedules.", fg="magenta", bold=True)) print_fn("{num} schedules unchanged".format(num=len(external_schedules))) return if len(errors): print_fn( click.style( "Planned Error Fixes:" if preview else "Errors Resolved:", fg="magenta", bold=True ) ) print_fn("\n".join(debug_info.errors)) if len(changeset): print_fn( click.style( "Planned Schedule Changes:" if preview else "Changes:", fg="magenta", bold=True ) ) for change in changeset: change_type, schedule_name, schedule_origin_id, changes = change if change_type == "add": print_fn( click.style( " + {name} (add) [{id}]".format(name=schedule_name, id=schedule_origin_id), fg="green", ) ) if change_type == "change": print_fn( click.style( " ~ {name} (update) [{id}]".format(name=schedule_name, id=schedule_origin_id), fg="yellow", ) ) for change_name, diff in changes: if len(diff) == 2: old, new = diff print_fn( click.style("\t %s: " % change_name, fg="yellow") + click.style(old, fg="red") + " => " + click.style(new, fg="green") ) else: print_fn( click.style("\t %s: " % change_name, fg="yellow") + click.style(diff, fg="green") ) if change_type == "remove": print_fn( click.style( " - {name} (delete) [{id}]".format(name=schedule_name, id=schedule_origin_id), fg="red", ) )