]>
Commit | Line | Data |
---|---|---|
f67539c2 TL |
1 | import logging |
2 | from enum import Enum, unique | |
3 | from typing import Dict | |
4 | ||
5 | log = logging.getLogger(__name__) | |
6 | ||
7 | @unique | |
8 | class State(Enum): | |
9 | UNASSOCIATED = 0 | |
10 | INITIALIZING = 1 | |
11 | ASSOCIATING = 2 | |
12 | ASSOCIATED = 3 | |
13 | SHUFFLING = 4 | |
14 | DISASSOCIATING = 5 | |
15 | ||
16 | @unique | |
17 | class ActionType(Enum): | |
18 | NONE = 0 | |
19 | MAP_UPDATE = 1 | |
20 | MAP_REMOVE = 2 | |
21 | ACQUIRE = 3 | |
22 | RELEASE = 4 | |
23 | ||
24 | @unique | |
25 | class PolicyAction(Enum): | |
26 | MAP = 0 | |
27 | UNMAP = 1 | |
28 | REMOVE = 2 | |
29 | ||
30 | class TransitionKey: | |
31 | def __init__(self, state, action_type): | |
32 | self.transition_key = [state, action_type] | |
33 | ||
34 | def __hash__(self): | |
35 | return hash(tuple(self.transition_key)) | |
36 | ||
37 | def __eq__(self, other): | |
38 | return self.transition_key == other.transition_key | |
39 | ||
40 | def __neq__(self, other): | |
41 | return not(self == other) | |
42 | ||
43 | class Transition: | |
44 | def __init__(self, action_type, start_policy_action=None, | |
45 | finish_policy_action=None, final_state=None): | |
46 | self.action_type = action_type | |
47 | self.start_policy_action = start_policy_action | |
48 | self.finish_policy_action = finish_policy_action | |
49 | self.final_state = final_state | |
50 | ||
51 | def __str__(self): | |
52 | return "[action_type={0}, start_policy_action={1}, finish_policy_action={2}, final_state={3}".format( | |
53 | self.action_type, self.start_policy_action, self.finish_policy_action, self.final_state) | |
54 | ||
55 | class StateTransition: | |
56 | transition_table = {} # type: Dict[TransitionKey, Transition] | |
57 | ||
58 | @staticmethod | |
59 | def transit(state, action_type): | |
60 | try: | |
61 | return StateTransition.transition_table[TransitionKey(state, action_type)] | |
62 | except KeyError: | |
63 | raise Exception() | |
64 | ||
65 | @staticmethod | |
66 | def is_idle(state): | |
67 | return state in (State.UNASSOCIATED, State.ASSOCIATED) | |
68 | ||
69 | StateTransition.transition_table = { | |
70 | TransitionKey(State.INITIALIZING, ActionType.NONE) : Transition(ActionType.ACQUIRE), | |
71 | TransitionKey(State.INITIALIZING, ActionType.ACQUIRE) : Transition(ActionType.NONE, | |
72 | final_state=State.ASSOCIATED), | |
73 | ||
74 | TransitionKey(State.ASSOCIATING, ActionType.NONE) : Transition(ActionType.MAP_UPDATE, | |
75 | start_policy_action=PolicyAction.MAP), | |
76 | TransitionKey(State.ASSOCIATING, ActionType.MAP_UPDATE) : Transition(ActionType.ACQUIRE), | |
77 | TransitionKey(State.ASSOCIATING, ActionType.ACQUIRE) : Transition(ActionType.NONE, | |
78 | final_state=State.ASSOCIATED), | |
79 | ||
80 | TransitionKey(State.DISASSOCIATING, ActionType.NONE) : Transition(ActionType.RELEASE, | |
81 | finish_policy_action=PolicyAction.UNMAP), | |
82 | TransitionKey(State.DISASSOCIATING, ActionType.RELEASE) : Transition(ActionType.MAP_REMOVE, | |
83 | finish_policy_action=PolicyAction.REMOVE), | |
84 | TransitionKey(State.DISASSOCIATING, ActionType.MAP_REMOVE) : Transition(ActionType.NONE, | |
85 | final_state=State.UNASSOCIATED), | |
86 | ||
87 | TransitionKey(State.SHUFFLING, ActionType.NONE) : Transition(ActionType.RELEASE, | |
88 | finish_policy_action=PolicyAction.UNMAP), | |
89 | TransitionKey(State.SHUFFLING, ActionType.RELEASE) : Transition(ActionType.MAP_UPDATE, | |
90 | start_policy_action=PolicyAction.MAP), | |
91 | TransitionKey(State.SHUFFLING, ActionType.MAP_UPDATE) : Transition(ActionType.ACQUIRE), | |
92 | TransitionKey(State.SHUFFLING, ActionType.ACQUIRE) : Transition(ActionType.NONE, | |
93 | final_state=State.ASSOCIATED), | |
94 | } |