From 702fdf2fc1acc32b5ccd9e0830e574c42770ab5d Mon Sep 17 00:00:00 2001 From: Zhou ShaoYu Date: Tue, 5 Feb 2013 14:42:53 +0800 Subject: 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 --- nova/compute/api.py | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) (limited to 'nova/compute') 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, -- cgit