summaryrefslogtreecommitdiffstats
path: root/nova/compute
diff options
context:
space:
mode:
authorZhou ShaoYu <hzzhoushaoyu@corp.netease.com>2013-02-05 14:42:53 +0800
committerZhou ShaoYu <hzzhoushaoyu@corp.netease.com>2013-02-05 15:48:10 +0800
commit702fdf2fc1acc32b5ccd9e0830e574c42770ab5d (patch)
tree28abec1117b15e2b206fd403ef40585358b63cfc /nova/compute
parent81da7771aaa6eec79f6b3fd91ce315cd5c5b7e7a (diff)
Fix check instance host for instance action
When instance has no host, actions such as get_console_output, start_stop_instance cause HTTP 500 response. Here change to HTTPConflict when action called before host set. Fix LP# 1116012 Change-Id: I6153a03f449d9fad8d0d8fb7295bdea4d2b2c2b1
Diffstat (limited to 'nova/compute')
-rw-r--r--nova/compute/api.py26
1 files changed, 16 insertions, 10 deletions
diff --git a/nova/compute/api.py b/nova/compute/api.py
index 23024ba29..dca91ac2b 100644
--- a/nova/compute/api.py
+++ b/nova/compute/api.py
@@ -131,6 +131,15 @@ def check_instance_state(vm_state=None, task_state=(None,)):
return outer
+def check_instance_host(function):
+ @functools.wraps(function)
+ def wrapped(self, context, instance, *args, **kwargs):
+ if not instance['host']:
+ raise exception.InstanceNotReady(instance_id=instance['uuid'])
+ return function(self, context, instance, *args, **kwargs)
+ return wrapped
+
+
def check_instance_lock(function):
@functools.wraps(function)
def inner(self, context, instance, *args, **kwargs):
@@ -1213,6 +1222,7 @@ class API(base.Base):
@wrap_check_policy
@check_instance_lock
+ @check_instance_host
@check_instance_state(vm_state=[vm_states.ACTIVE, vm_states.RESCUED,
vm_states.ERROR, vm_states.STOPPED],
task_state=[None])
@@ -1231,6 +1241,7 @@ class API(base.Base):
@wrap_check_policy
@check_instance_lock
+ @check_instance_host
@check_instance_state(vm_state=[vm_states.STOPPED])
def start(self, context, instance):
"""Start an instance."""
@@ -2135,11 +2146,9 @@ class API(base.Base):
file_contents=file_contents)
@wrap_check_policy
+ @check_instance_host
def get_vnc_console(self, context, instance, console_type):
"""Get a url to an instance Console."""
- if not instance['host']:
- raise exception.InstanceNotReady(instance_id=instance['uuid'])
-
connect_info = self.compute_rpcapi.get_vnc_console(context,
instance=instance, console_type=console_type)
@@ -2149,20 +2158,17 @@ class API(base.Base):
return {'url': connect_info['access_url']}
+ @check_instance_host
def get_vnc_connect_info(self, context, instance, console_type):
"""Used in a child cell to get console info."""
- if not instance['host']:
- raise exception.InstanceNotReady(instance_id=instance['uuid'])
connect_info = self.compute_rpcapi.get_vnc_console(context,
instance=instance, console_type=console_type)
return connect_info
@wrap_check_policy
+ @check_instance_host
def get_spice_console(self, context, instance, console_type):
"""Get a url to an instance Console."""
- if not instance['host']:
- raise exception.InstanceNotReady(instance_id=instance['uuid'])
-
connect_info = self.compute_rpcapi.get_spice_console(context,
instance=instance, console_type=console_type)
@@ -2172,15 +2178,15 @@ class API(base.Base):
return {'url': connect_info['access_url']}
+ @check_instance_host
def get_spice_connect_info(self, context, instance, console_type):
"""Used in a child cell to get console info."""
- if not instance['host']:
- raise exception.InstanceNotReady(instance_id=instance['uuid'])
connect_info = self.compute_rpcapi.get_spice_console(context,
instance=instance, console_type=console_type)
return connect_info
@wrap_check_policy
+ @check_instance_host
def get_console_output(self, context, instance, tail_length=None):
"""Get console output for an instance."""
return self.compute_rpcapi.get_console_output(context,