1. /nova/api/openstack/compute/servers.py
def _stop_server(self, req, id, body):
"""Stop an instance."""
context = req.environ['nova.context']
instance = self._get_instance(context, id)
context.can(server_policies.SERVERS % 'stop',
target={'user_id': instance.user_id,
'project_id': instance.project_id})
try:
self.compute_api.stop(context, instance)
except (exception.InstanceNotReady, exception.InstanceIsLocked) as e:
raise webob.exc.HTTPConflict(explanation=e.format_message())
except exception.InstanceInvalidState as state_error:
common.raise_http_conflict_for_instance_invalid_state(state_error,
'stop', id)
主要调用的是compute_api.stop函数
异常消息是compute_api.stop函数装饰器中产生的异常
2. 、nova/compute/api.py文件中
@check_instance_lock
@check_instance_host()
@check_instance_state(vm_state=[vm_states.ACTIVE, vm_states.ERROR])
def stop(self, context, instance, do_cast=True, clean_shutdown=True):
"""Stop an instance."""
self.force_stop(context, instance, do_cast, clean_shutdown)
@check_instance_lock和@check_instance_host以及@check_instance_state是对实例状态的检测,检测出异常的话,就会抛出异常,在步骤1中就会对这个异常进行捕获