]> git.proxmox.com Git - ceph.git/blame - ceph/src/pybind/mgr/mirroring/fs/dir_map/state_transition.py
update source to Ceph Pacific 16.2.2
[ceph.git] / ceph / src / pybind / mgr / mirroring / fs / dir_map / state_transition.py
CommitLineData
f67539c2
TL
1import logging
2from enum import Enum, unique
3from typing import Dict
4
5log = logging.getLogger(__name__)
6
7@unique
8class State(Enum):
9 UNASSOCIATED = 0
10 INITIALIZING = 1
11 ASSOCIATING = 2
12 ASSOCIATED = 3
13 SHUFFLING = 4
14 DISASSOCIATING = 5
15
16@unique
17class ActionType(Enum):
18 NONE = 0
19 MAP_UPDATE = 1
20 MAP_REMOVE = 2
21 ACQUIRE = 3
22 RELEASE = 4
23
24@unique
25class PolicyAction(Enum):
26 MAP = 0
27 UNMAP = 1
28 REMOVE = 2
29
30class 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
43class 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
55class 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
69StateTransition.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 }