diff options
| author | Zhou ShaoYu <hzzhoushaoyu@corp.netease.com> | 2013-02-05 14:42:53 +0800 |
|---|---|---|
| committer | Zhou ShaoYu <hzzhoushaoyu@corp.netease.com> | 2013-02-05 15:48:10 +0800 |
| commit | 702fdf2fc1acc32b5ccd9e0830e574c42770ab5d (patch) | |
| tree | 28abec1117b15e2b206fd403ef40585358b63cfc /nova/compute | |
| parent | 81da7771aaa6eec79f6b3fd91ce315cd5c5b7e7a (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.py | 26 |
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, |
