FAILED_STATE = 'failed'
FINAL_STATE = 'complete'
+ CANCEL_STATE = 'canceled'
OP_SM_SUBVOLUME = {
INIT_STATE_KEY : FINAL_STATE,
OP_SM_CLONE = {
INIT_STATE_KEY : 'pending',
- 'pending' : ('in-progress', FAILED_STATE),
- 'in-progress' : (FINAL_STATE, FAILED_STATE),
+ 'pending' : ('in-progress', (FAILED_STATE, CANCEL_STATE)),
+ 'in-progress' : (FINAL_STATE, (FAILED_STATE, CANCEL_STATE)),
} # type: Dict
STATE_MACHINES_TYPES = {
@staticmethod
def is_failed_state(state):
- return state == OpSm.FAILED_STATE
+ return state == OpSm.FAILED_STATE or state == OpSm.CANCEL_STATE
+
+ @staticmethod
+ def is_init_state(stm_type, state):
+ stm = OpSm.STATE_MACHINES_TYPES.get(stm_type, None)
+ if not stm:
+ raise OpSmException(-errno.ENOENT, "state machine type '{0}' not found".format(stm_type))
+ init_state = stm.get(OpSm.INIT_STATE_KEY, None)
+ return init_state == state
@staticmethod
def get_init_state(stm_type):
next_state = stm.get(current_state, None)
if not next_state:
raise OpSmException(-errno.EINVAL, "invalid current state '{0}'".format(current_state))
- return next_state[0] if ret == 0 else next_state[1]
+ if ret == 0:
+ return next_state[0]
+ elif ret == -errno.EINTR:
+ return next_state[1][1]
+ else:
+ return next_state[1][0]