def set_status(self, result, reason=None): """Set action status based on return value from execute.""" timestamp = wallclock() if result == self.RES_OK: status = self.SUCCEEDED ao.Action.mark_succeeded(self.context, self.id, timestamp) elif result == self.RES_ERROR: status = self.FAILED ao.Action.mark_failed(self.context, self.id, timestamp, reason or 'ERROR') elif result == self.RES_TIMEOUT: status = self.FAILED ao.Action.mark_failed(self.context, self.id, timestamp, reason or 'TIMEOUT') elif result == self.RES_CANCEL: status = self.CANCELLED ao.Action.mark_cancelled(self.context, self.id, timestamp) elif result == self.RES_LIFECYCLE_COMPLETE: status = self.SUCCEEDED ao.Action.mark_ready(self.context, self.id, timestamp) else: # result == self.RES_RETRY: retries = self.data.get('retries', 0) # Action failed at the moment, but can be retried # retries time is configurable if retries < cfg.CONF.lock_retry_times: status = self.READY retries += 1 self.data.update({'retries': retries}) ao.Action.abandon(self.context, self.id, {'data': self.data}) # sleep for a while eventlet.sleep(cfg.CONF.lock_retry_interval) dispatcher.start_action(self.id) else: status = self.RES_ERROR if not reason: reason = ('Exceeded maximum number of retries (%d)' '') % cfg.CONF.lock_retry_times ao.Action.mark_failed(self.context, self.id, timestamp, reason) if status == self.SUCCEEDED: EVENT.info(self, consts.PHASE_END, reason or 'SUCCEEDED') elif status == self.READY: EVENT.warning(self, consts.PHASE_ERROR, reason or 'RETRY') else: EVENT.error(self, consts.PHASE_ERROR, reason or 'ERROR') self.status = status self.status_reason = reason
def _execute(self): action_name = self.action.lower() method_name = action_name.replace('node', 'do') method = getattr(self, method_name, None) if method is None: reason = _('Unsupported action: %s') % self.action EVENT.error(self.context, self.node, self.action, 'Failed', reason) return self.RES_ERROR, reason return method()
def _execute(self): """Private function that finds out the handler and execute it.""" action_name = self.action.lower() method_name = action_name.replace('node', 'do') method = getattr(self, method_name, None) if method is None: reason = 'Unsupported action: %s' % self.action EVENT.error(self, consts.PHASE_ERROR, reason) return self.RES_ERROR, reason return method()
def _execute(self): """Private function that finds out the handler and execute it.""" action_name = self.action.lower() method_name = action_name.replace("node", "do") method = getattr(self, method_name, None) if method is None: reason = _("Unsupported action: %s") % self.action EVENT.error(self.context, self.node, self.action, "Failed", reason) return self.RES_ERROR, reason return method()
def _check_result(self, name): """Check policy check status and generate event. :param name: Name of policy checked :return: True if the policy checking can be continued, or False if the policy checking should be aborted. """ reason = self.data['reason'] if self.data['status'] == policy_mod.CHECK_OK: LOG.debug(self, 'check', reason) return True reason = _("Failed policy '%(name)s': %(reason)s.") % { 'name': name, 'reason': reason } EVENT.error(self, consts.PHASE_ERROR, reason) return False
def test_error(self, mock_dump): entity = mock.Mock(id='1234567890') entity.name = 'fake_obj' action = mock.Mock(entity=entity, action='ACTION_NAME') res = event.error(action, 'P1', 'R1', 'TS1') self.assertIsNone(res) mock_dump.assert_called_once_with(logging.ERROR, action, 'P1', 'R1', 'TS1')
def _execute(self, **kwargs): """Private method for action execution. This function search for the handler based on the action name for execution and it wraps the action execution with policy checks. :returns: A tuple containing the result and the corresponding reason. """ # do pre-action policy checking self.policy_check(self.entity.id, 'BEFORE') if self.data['status'] != policy_mod.CHECK_OK: reason = _('Policy check failure: %s') % self.data['reason'] EVENT.error(self, consts.PHASE_ERROR, reason) return self.RES_ERROR, reason result = self.RES_OK action_name = self.action.lower() method_name = action_name.replace('cluster', 'do') method = getattr(self, method_name, None) if method is None: reason = _('Unsupported action: %s.') % self.action EVENT.error(self, consts.PHASE_ERROR, reason) return self.RES_ERROR, reason result, reason = method() # do post-action policy checking if result == self.RES_OK: self.policy_check(self.entity.id, 'AFTER') if self.data['status'] != policy_mod.CHECK_OK: reason = _('Policy check failure: %s') % self.data['reason'] EVENT.error(self, consts.PHASE_ERROR, reason) return self.RES_ERROR, reason return result, reason
def _execute(self, **kwargs): # do pre-action policy checking self.policy_check(self.cluster.id, 'BEFORE') if self.data['status'] != policy_mod.CHECK_OK: reason = _('Policy check failure: %s') % self.data['reason'] EVENT.error(self.context, self.cluster, self.action, 'Failed', reason) return self.RES_ERROR, reason result = self.RES_OK action_name = self.action.lower() method_name = action_name.replace('cluster', 'do') method = getattr(self, method_name, None) if method is None: error = _('Unsupported action: %s.') % self.action EVENT.error(self.context, self.cluster, self.action, 'Failed', error) return self.RES_ERROR, error result, reason = method() # do post-action policy checking if result == self.RES_OK: self.policy_check(self.cluster.id, 'AFTER') if self.data['status'] != policy_mod.CHECK_OK: error = _('Policy check failure: %s') % self.data['reason'] EVENT.error(self.context, self.cluster, self.action, 'Failed', error) return self.RES_ERROR, error return result, reason
def set_status(self, result, reason=None): """Set action status based on return value from execute.""" timestamp = wallclock() if result == self.RES_OK: status = self.SUCCEEDED ao.Action.mark_succeeded(self.context, self.id, timestamp) elif result == self.RES_ERROR: status = self.FAILED ao.Action.mark_failed(self.context, self.id, timestamp, reason or 'ERROR') elif result == self.RES_TIMEOUT: status = self.FAILED ao.Action.mark_failed(self.context, self.id, timestamp, reason or 'TIMEOUT') elif result == self.RES_CANCEL: status = self.CANCELLED ao.Action.mark_cancelled(self.context, self.id, timestamp) else: # result == self.RES_RETRY: status = self.READY # Action failed at the moment, but can be retried # We abandon it and then notify other dispatchers to execute it ao.Action.abandon(self.context, self.id) dispatcher.start_action() if status == self.SUCCEEDED: EVENT.info(self, consts.PHASE_END, reason or 'SUCCEEDED') elif status == self.READY: EVENT.warning(self, consts.PHASE_ERROR, reason or 'RETRY') else: EVENT.error(self, consts.PHASE_ERROR, reason or 'ERROR') self.status = status self.status_reason = reason
def set_status(self, result, reason=None): """Set action status based on return value from execute.""" timestamp = wallclock() if result == self.RES_OK: status = self.SUCCEEDED db_api.action_mark_succeeded(self.context, self.id, timestamp) elif result == self.RES_ERROR: status = self.FAILED db_api.action_mark_failed(self.context, self.id, timestamp, reason=reason or 'ERROR') elif result == self.RES_TIMEOUT: status = self.FAILED db_api.action_mark_failed(self.context, self.id, timestamp, reason=reason or 'TIMEOUT') elif result == self.RES_CANCEL: status = self.CANCELLED db_api.action_mark_cancelled(self.context, self.id, timestamp) else: # result == self.RES_RETRY: status = self.READY # Action failed at the moment, but can be retried # We abandon it and then notify other dispatchers to execute it db_api.action_abandon(self.context, self.id) if status == self.SUCCEEDED: EVENT.info(self.context, self, self.action, status, reason) elif status == self.READY: EVENT.warning(self.context, self, self.action, status, reason) else: EVENT.error(self.context, self, self.action, status, reason) self.status = status self.status_reason = reason
def signal(self, cmd): '''Send a signal to the action.''' if cmd not in self.COMMANDS: return if cmd == self.SIG_CANCEL: expected_statuses = (self.INIT, self.WAITING, self.READY, self.RUNNING) elif cmd == self.SIG_SUSPEND: expected_statuses = (self.RUNNING) else: # SIG_RESUME expected_statuses = (self.SUSPENDED) if self.status not in expected_statuses: reason = _("Action (%(action)s) is in unexpected status " "(%(actual)s) while expected status should be one of " "(%(expected)s).") % dict(action=self.id, expected=expected_statuses, actual=self.status) EVENT.error(self.context, self, cmd, status_reason=reason) return # TODO(Yanyan Hu): use DB session here db_api.action_signal(self.context, self.id, cmd)
def _execute(self, **kwargs): """Private method for action execution. This function search for the handler based on the action name for execution and it wraps the action execution with policy checks. :returns: A tuple containing the result and the corresponding reason. """ # do pre-action policy checking self.policy_check(self.cluster.id, 'BEFORE') if self.data['status'] != policy_mod.CHECK_OK: reason = _('Policy check failure: %s') % self.data['reason'] EVENT.error(self.context, self.cluster, self.action, 'Failed', reason) return self.RES_ERROR, reason result = self.RES_OK action_name = self.action.lower() method_name = action_name.replace('cluster', 'do') method = getattr(self, method_name, None) if method is None: error = _('Unsupported action: %s.') % self.action EVENT.error(self.context, self.cluster, self.action, 'Failed', error) return self.RES_ERROR, error result, reason = method() # do post-action policy checking if result == self.RES_OK: self.policy_check(self.cluster.id, 'AFTER') if self.data['status'] != policy_mod.CHECK_OK: error = _('Policy check failure: %s') % self.data['reason'] EVENT.error(self.context, self.cluster, self.action, 'Failed', error) return self.RES_ERROR, error return result, reason