From f3390a110f872b98476ddcc4321afa7b4e944c2d Mon Sep 17 00:00:00 2001 From: Adam Hopkins Date: Mon, 15 Mar 2021 00:10:37 +0200 Subject: [PATCH 1/4] Move tranitions to enum --- jumpstarter/states.py | 110 ++++++++++++++++++++++++++++++------------ 1 file changed, 78 insertions(+), 32 deletions(-) diff --git a/jumpstarter/states.py b/jumpstarter/states.py index 0befd7f..a972682 100644 --- a/jumpstarter/states.py +++ b/jumpstarter/states.py @@ -6,13 +6,14 @@ import anyio import transitions -from anyio.abc import Event +from anyio.abc import Event as EventType from transitions import EventData from transitions.core import _LOGGER, MachineError, listify from transitions.extensions import GraphMachine from transitions.extensions.asyncio import NestedAsyncTransition from transitions.extensions.nesting import NestedState + if TYPE_CHECKING: from jumpstarter.actors import Actor else: @@ -34,6 +35,34 @@ NestedState.separator = "↦" +class Transition(str, Enum): + def _generate_next_value_(name: str, *args) -> str: + name = name.replace("__", NestedState.separator) + return name.lower() + + RESTART = auto() + RESTARTING__STOPPING = auto() + RESTARTING__STARTING = auto() + REPORT_ERROR = auto() + START = auto() + STOP = auto() + PAUSE = auto() + RESUME = auto() + RECOVER = auto() + REPORT_WARNING = auto() + REPORT_PROBLEM = auto() + INITIALIZE = auto() + + +class Event(str, Enum): + def _generate_next_value_(name: str, *args) -> str: + name = name.replace("__", NestedState.separator) + return f"{name.lower()}_event" + + SHUTDOWN = auto() + BOOTUP = auto() + + # region Enums @@ -178,35 +207,41 @@ def __init__( ) self.add_transition( - "restart", + Transition.RESTART, restart_state.ignore, restart_state.restarting, - after="restart", + after=Transition.RESTART, conditions=self._can_restart, ) self.add_transition( - "restart", + Transition.RESTART, restart_state.restarting.value.stopping, restart_state.restarting.value.starting, - after="restart", + after=Transition.RESTART, ) self.add_transition( - "restart", restart_state.restarting.value.starting, restart_state.restarted + Transition.RESTART, + restart_state.restarting.value.starting, + restart_state.restarted, ) self.add_transition( - "restart", + Transition.RESTART, restart_state.restarted, restart_state.restarting, - after="restart", + after=Transition.RESTART, conditions=self._can_restart, ) - self.on_enter("restarting↦stopping", self._stop_and_wait_for_completion) - self.on_enter("restarting↦starting", self._start_and_wait_for_completion) + self.on_enter( + Transition.RESTARTING__STOPPING.value, self._stop_and_wait_for_completion + ) + self.on_enter( + Transition.RESTARTING__STARTING.value, self._start_and_wait_for_completion + ) async def _stop_and_wait_for_completion(self, event_data: EventData) -> None: - shutdown_event: Event = anyio.create_event() + shutdown_event: EventType = anyio.create_event() async with anyio.create_task_group() as task_group: await task_group.spawn( @@ -215,7 +250,7 @@ async def _stop_and_wait_for_completion(self, event_data: EventData) -> None: await task_group.spawn(shutdown_event.wait) async def _start_and_wait_for_completion(self, event_data: EventData) -> None: - bootup_event: Event = anyio.create_event() + bootup_event: EventType = anyio.create_event() async with anyio.create_task_group() as task_group: await task_group.spawn( @@ -296,26 +331,34 @@ def register_parallel_state_machine(self, machine: BaseStateMachine) -> None: # region Protected API def _create_crashed_transitions(self, actor_state): - self.add_transition("report_error", "*", actor_state.crashed) + self.add_transition(Transition.REPORT_ERROR, "*", actor_state.crashed) self.add_transition( - "stop", actor_state.crashed, actor_state.stopping, after="stop" + Transition.STOP, + actor_state.crashed, + actor_state.stopping, + after=Transition.STOP, ) self.add_transition( - "start", actor_state.crashed, actor_state.starting, after="start" + Transition.START, + actor_state.crashed, + actor_state.starting, + after=Transition.START, ) def _create_started_substates_transitions(self, actor_state): self.add_transition( - "pause", actor_state.started.value.running, actor_state.started.value.paused + Transition.PAUSE, + actor_state.started.value.running, + actor_state.started.value.paused, ) self.add_transition( - "resume", + Transition.RESUME, actor_state.started.value.paused, actor_state.started.value.running.value.healthy, ) self.add_transition( - "recover", + Transition.RECOVER, [ actor_state.started.value.running.value.degraded, actor_state.started.value.running.value.unhealthy, @@ -323,7 +366,7 @@ def _create_started_substates_transitions(self, actor_state): actor_state.started.value.running.value.healthy, ) self.add_transition( - "report_warning", + Transition.REPORT_WARNING, [ actor_state.started.value.running.value.healthy, actor_state.started.value.running.value.unhealthy, @@ -331,7 +374,7 @@ def _create_started_substates_transitions(self, actor_state): actor_state.started.value.running.value.degraded, ) self.add_transition( - "report_problem", + Transition.REPORT_PROBLEM, [ actor_state.started.value.running.value.degraded, actor_state.started.value.running.value.healthy, @@ -341,7 +384,10 @@ def _create_started_substates_transitions(self, actor_state): def _create_restart_transitions(self, actor_state): self.add_transition( - "start", actor_state.stopped, actor_state.starting, after="start" + Transition.START, + actor_state.stopped, + actor_state.starting, + after=Transition.START, ) def _create_shutdown_transitions(self, actor_state): @@ -353,19 +399,19 @@ def _create_shutdown_transitions(self, actor_state): actor_state.stopping.value.resources_released, actor_state.stopping.value.dependencies_stopped, ], - trigger="stop", + trigger=Transition.STOP, loop=False, - after="stop", + after=Transition.STOP, ) self.add_transition( - "stop", + Transition.STOP, actor_state.stopping.value.dependencies_stopped, actor_state.stopped, - after=partial(_maybe_set_event, event_name="shutdown_event"), + after=partial(_maybe_set_event, event_name=Event.SHUTDOWN), ) transition = self.get_transitions( - "stop", + Transition.STOP, actor_state.stopping.value.tasks_stopped, actor_state.stopping.value.resources_released, )[0] @@ -373,7 +419,7 @@ def _create_shutdown_transitions(self, actor_state): def _create_bootup_transitions(self, actor_state): self.add_transition( - "initialize", actor_state.initializing, actor_state.initialized + Transition.INITIALIZE, actor_state.initializing, actor_state.initialized ) self.add_ordered_transitions( @@ -385,15 +431,15 @@ def _create_bootup_transitions(self, actor_state): actor_state.starting.value.resources_acquired, actor_state.starting.value.tasks_started, ], - trigger="start", + trigger=Transition.START, loop=False, - after="start", + after=Transition.START, ) self.add_transition( - "start", + Transition.START, actor_state.starting.value.tasks_started, actor_state.started, - after=partial(_maybe_set_event, event_name="bootup_event"), + after=partial(_maybe_set_event, event_name=Event.BOOTUP), ) # endregion @@ -409,7 +455,7 @@ async def _release_resources(event_data: transitions.EventData) -> None: async def _maybe_set_event(event_data: EventData, event_name: str) -> None: kwargs = _merge_event_data_kwargs(event_data) try: - event: Event = kwargs[event_name] + event: EventType = kwargs[event_name] await event.set() except KeyError: pass From 4ceb452ed791637b034c65d1de1f2103b830ede6 Mon Sep 17 00:00:00 2001 From: "Restyled.io" Date: Sun, 14 Mar 2021 22:11:51 +0000 Subject: [PATCH 2/4] Fixed formatting (isort) --- jumpstarter/states.py | 1 - 1 file changed, 1 deletion(-) diff --git a/jumpstarter/states.py b/jumpstarter/states.py index a972682..9cc11a0 100644 --- a/jumpstarter/states.py +++ b/jumpstarter/states.py @@ -13,7 +13,6 @@ from transitions.extensions.asyncio import NestedAsyncTransition from transitions.extensions.nesting import NestedState - if TYPE_CHECKING: from jumpstarter.actors import Actor else: From 4bba3ac722a03c1ff891792b73f04b0536ebaea9 Mon Sep 17 00:00:00 2001 From: Adam Hopkins Date: Mon, 15 Mar 2021 00:15:06 +0200 Subject: [PATCH 3/4] reorder enums --- jumpstarter/states.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/jumpstarter/states.py b/jumpstarter/states.py index a972682..1e0cb79 100644 --- a/jumpstarter/states.py +++ b/jumpstarter/states.py @@ -40,18 +40,18 @@ def _generate_next_value_(name: str, *args) -> str: name = name.replace("__", NestedState.separator) return name.lower() + INITIALIZE = auto() + PAUSE = auto() + RECOVER = auto() + REPORT_ERROR = auto() + REPORT_PROBLEM = auto() + REPORT_WARNING = auto() RESTART = auto() - RESTARTING__STOPPING = auto() RESTARTING__STARTING = auto() - REPORT_ERROR = auto() + RESTARTING__STOPPING = auto() + RESUME = auto() START = auto() STOP = auto() - PAUSE = auto() - RESUME = auto() - RECOVER = auto() - REPORT_WARNING = auto() - REPORT_PROBLEM = auto() - INITIALIZE = auto() class Event(str, Enum): @@ -59,8 +59,8 @@ def _generate_next_value_(name: str, *args) -> str: name = name.replace("__", NestedState.separator) return f"{name.lower()}_event" - SHUTDOWN = auto() BOOTUP = auto() + SHUTDOWN = auto() # region Enums From 779b95a429c335220dda52b5dc834ceeaf220b11 Mon Sep 17 00:00:00 2001 From: Adam Hopkins Date: Mon, 15 Mar 2021 12:28:11 +0200 Subject: [PATCH 4/4] Make all enums lowercase --- jumpstarter/states.py | 90 +++++++++++++++++++++---------------------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/jumpstarter/states.py b/jumpstarter/states.py index 03eba4a..2244247 100644 --- a/jumpstarter/states.py +++ b/jumpstarter/states.py @@ -39,18 +39,18 @@ def _generate_next_value_(name: str, *args) -> str: name = name.replace("__", NestedState.separator) return name.lower() - INITIALIZE = auto() - PAUSE = auto() - RECOVER = auto() - REPORT_ERROR = auto() - REPORT_PROBLEM = auto() - REPORT_WARNING = auto() - RESTART = auto() - RESTARTING__STARTING = auto() - RESTARTING__STOPPING = auto() - RESUME = auto() - START = auto() - STOP = auto() + initialize = auto() + pause = auto() + recover = auto() + report_error = auto() + report_problem = auto() + report_warning = auto() + restart = auto() + restarting__starting = auto() + restarting__stopping = auto() + resume = auto() + start = auto() + stop = auto() class Event(str, Enum): @@ -58,8 +58,8 @@ def _generate_next_value_(name: str, *args) -> str: name = name.replace("__", NestedState.separator) return f"{name.lower()}_event" - BOOTUP = auto() - SHUTDOWN = auto() + bootup = auto() + shutdown = auto() # region Enums @@ -206,37 +206,37 @@ def __init__( ) self.add_transition( - Transition.RESTART, + Transition.restart, restart_state.ignore, restart_state.restarting, - after=Transition.RESTART, + after=Transition.restart, conditions=self._can_restart, ) self.add_transition( - Transition.RESTART, + Transition.restart, restart_state.restarting.value.stopping, restart_state.restarting.value.starting, - after=Transition.RESTART, + after=Transition.restart, ) self.add_transition( - Transition.RESTART, + Transition.restart, restart_state.restarting.value.starting, restart_state.restarted, ) self.add_transition( - Transition.RESTART, + Transition.restart, restart_state.restarted, restart_state.restarting, - after=Transition.RESTART, + after=Transition.restart, conditions=self._can_restart, ) self.on_enter( - Transition.RESTARTING__STOPPING.value, self._stop_and_wait_for_completion + Transition.restarting__stopping.value, self._stop_and_wait_for_completion ) self.on_enter( - Transition.RESTARTING__STARTING.value, self._start_and_wait_for_completion + Transition.restarting__starting.value, self._start_and_wait_for_completion ) async def _stop_and_wait_for_completion(self, event_data: EventData) -> None: @@ -330,34 +330,34 @@ def register_parallel_state_machine(self, machine: BaseStateMachine) -> None: # region Protected API def _create_crashed_transitions(self, actor_state): - self.add_transition(Transition.REPORT_ERROR, "*", actor_state.crashed) + self.add_transition(Transition.report_error, "*", actor_state.crashed) self.add_transition( - Transition.STOP, + Transition.stop, actor_state.crashed, actor_state.stopping, - after=Transition.STOP, + after=Transition.stop, ) self.add_transition( - Transition.START, + Transition.start, actor_state.crashed, actor_state.starting, - after=Transition.START, + after=Transition.start, ) def _create_started_substates_transitions(self, actor_state): self.add_transition( - Transition.PAUSE, + Transition.pause, actor_state.started.value.running, actor_state.started.value.paused, ) self.add_transition( - Transition.RESUME, + Transition.resume, actor_state.started.value.paused, actor_state.started.value.running.value.healthy, ) self.add_transition( - Transition.RECOVER, + Transition.recover, [ actor_state.started.value.running.value.degraded, actor_state.started.value.running.value.unhealthy, @@ -365,7 +365,7 @@ def _create_started_substates_transitions(self, actor_state): actor_state.started.value.running.value.healthy, ) self.add_transition( - Transition.REPORT_WARNING, + Transition.report_warning, [ actor_state.started.value.running.value.healthy, actor_state.started.value.running.value.unhealthy, @@ -373,7 +373,7 @@ def _create_started_substates_transitions(self, actor_state): actor_state.started.value.running.value.degraded, ) self.add_transition( - Transition.REPORT_PROBLEM, + Transition.report_problem, [ actor_state.started.value.running.value.degraded, actor_state.started.value.running.value.healthy, @@ -383,10 +383,10 @@ def _create_started_substates_transitions(self, actor_state): def _create_restart_transitions(self, actor_state): self.add_transition( - Transition.START, + Transition.start, actor_state.stopped, actor_state.starting, - after=Transition.START, + after=Transition.start, ) def _create_shutdown_transitions(self, actor_state): @@ -398,19 +398,19 @@ def _create_shutdown_transitions(self, actor_state): actor_state.stopping.value.resources_released, actor_state.stopping.value.dependencies_stopped, ], - trigger=Transition.STOP, + trigger=Transition.stop, loop=False, - after=Transition.STOP, + after=Transition.stop, ) self.add_transition( - Transition.STOP, + Transition.stop, actor_state.stopping.value.dependencies_stopped, actor_state.stopped, - after=partial(_maybe_set_event, event_name=Event.SHUTDOWN), + after=partial(_maybe_set_event, event_name=Event.shutdown), ) transition = self.get_transitions( - Transition.STOP, + Transition.stop, actor_state.stopping.value.tasks_stopped, actor_state.stopping.value.resources_released, )[0] @@ -418,7 +418,7 @@ def _create_shutdown_transitions(self, actor_state): def _create_bootup_transitions(self, actor_state): self.add_transition( - Transition.INITIALIZE, actor_state.initializing, actor_state.initialized + Transition.initialize, actor_state.initializing, actor_state.initialized ) self.add_ordered_transitions( @@ -430,15 +430,15 @@ def _create_bootup_transitions(self, actor_state): actor_state.starting.value.resources_acquired, actor_state.starting.value.tasks_started, ], - trigger=Transition.START, + trigger=Transition.start, loop=False, - after=Transition.START, + after=Transition.start, ) self.add_transition( - Transition.START, + Transition.start, actor_state.starting.value.tasks_started, actor_state.started, - after=partial(_maybe_set_event, event_name=Event.BOOTUP), + after=partial(_maybe_set_event, event_name=Event.bootup), ) # endregion