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 --- .../compute/contrib/test_console_output.py | 16 +++++++++++++ .../compute/contrib/test_server_start_stop.py | 21 +++++++++++++++++ nova/tests/compute/test_compute.py | 27 ++++++++++++++++++++++ 3 files changed, 64 insertions(+) (limited to 'nova/tests') diff --git a/nova/tests/api/openstack/compute/contrib/test_console_output.py b/nova/tests/api/openstack/compute/contrib/test_console_output.py index d3f80b655..14b61abb7 100644 --- a/nova/tests/api/openstack/compute/contrib/test_console_output.py +++ b/nova/tests/api/openstack/compute/contrib/test_console_output.py @@ -35,6 +35,10 @@ def fake_get_console_output(self, _context, _instance, tail_length): return '\n'.join(fixture) +def fake_get_console_output_not_ready(self, _context, _instance, tail_length): + raise exception.InstanceNotReady(instance_id=_instance["uuid"]) + + def fake_get(self, context, instance_uuid): return {'uuid': instance_uuid} @@ -133,3 +137,15 @@ class ConsoleOutputExtensionTest(test.TestCase): res = req.get_response(self.app) self.assertEqual(res.status_int, 400) + + def test_get_console_output_not_ready(self): + self.stubs.Set(compute_api.API, 'get_console_output', + fake_get_console_output_not_ready) + body = {'os-getConsoleOutput': {'length': 3}} + req = webob.Request.blank('/v2/fake/servers/1/action') + req.method = "POST" + req.body = jsonutils.dumps(body) + req.headers["content-type"] = "application/json" + + res = req.get_response(self.app) + self.assertEqual(res.status_int, 409) diff --git a/nova/tests/api/openstack/compute/contrib/test_server_start_stop.py b/nova/tests/api/openstack/compute/contrib/test_server_start_stop.py index 554379e74..eb708a574 100644 --- a/nova/tests/api/openstack/compute/contrib/test_server_start_stop.py +++ b/nova/tests/api/openstack/compute/contrib/test_server_start_stop.py @@ -17,6 +17,7 @@ import webob from nova.api.openstack.compute.contrib import server_start_stop from nova.compute import api as compute_api +from nova import exception from nova import test from nova.tests.api.openstack import fakes @@ -25,6 +26,10 @@ def fake_compute_api_get(self, context, instance_id): return {'id': 1, 'uuid': instance_id} +def fake_start_stop_not_ready(self, context, instance): + raise exception.InstanceNotReady(instance_id=instance["uuid"]) + + class ServerStartStopTest(test.TestCase): def setUp(self): @@ -41,6 +46,14 @@ class ServerStartStopTest(test.TestCase): body = dict(start="") self.controller._start_server(req, 'test_inst', body) + def test_start_not_ready(self): + self.stubs.Set(compute_api.API, 'get', fake_compute_api_get) + self.stubs.Set(compute_api.API, 'start', fake_start_stop_not_ready) + req = fakes.HTTPRequest.blank('/v2/fake/servers/test_inst/action') + body = dict(start="") + self.assertRaises(webob.exc.HTTPConflict, + self.controller._start_server, req, 'test_inst', body) + def test_stop(self): self.stubs.Set(compute_api.API, 'get', fake_compute_api_get) self.mox.StubOutWithMock(compute_api.API, 'stop') @@ -51,6 +64,14 @@ class ServerStartStopTest(test.TestCase): body = dict(stop="") self.controller._stop_server(req, 'test_inst', body) + def test_stop_not_ready(self): + self.stubs.Set(compute_api.API, 'get', fake_compute_api_get) + self.stubs.Set(compute_api.API, 'stop', fake_start_stop_not_ready) + req = fakes.HTTPRequest.blank('/v2/fake/servers/test_inst/action') + body = dict(start="") + self.assertRaises(webob.exc.HTTPConflict, + self.controller._stop_server, req, 'test_inst', body) + def test_start_with_bogus_id(self): req = fakes.HTTPRequest.blank('/v2/fake/servers/test_inst/action') body = dict(start="") diff --git a/nova/tests/compute/test_compute.py b/nova/tests/compute/test_compute.py index 8b38b51f2..d70114313 100644 --- a/nova/tests/compute/test_compute.py +++ b/nova/tests/compute/test_compute.py @@ -3783,6 +3783,15 @@ class ComputeAPITestCase(BaseTestCase): db.instance_destroy(self.context, instance['uuid']) + def test_start_no_host(self): + instance = self._create_fake_instance(params={'host': ''}) + + self.assertRaises(exception.InstanceNotReady, + self.compute_api.start, + self.context, instance) + + db.instance_destroy(self.context, instance['uuid']) + def test_stop(self): instance = jsonutils.to_primitive(self._create_fake_instance()) instance_uuid = instance['uuid'] @@ -3798,6 +3807,15 @@ class ComputeAPITestCase(BaseTestCase): db.instance_destroy(self.context, instance['uuid']) + def test_stop_no_host(self): + instance = self._create_fake_instance(params={'host': ''}) + + self.assertRaises(exception.InstanceNotReady, + self.compute_api.stop, + self.context, instance) + + db.instance_destroy(self.context, instance['uuid']) + def test_start_shutdown(self): def check_state(instance_uuid, power_state_, vm_state_, task_state_): instance = db.instance_get_by_uuid(self.context, instance_uuid) @@ -5636,6 +5654,15 @@ class ComputeAPITestCase(BaseTestCase): fake_instance, tail_length=fake_tail_length) self.assertEqual(output, fake_console_output) + def test_console_output_no_host(self): + instance = self._create_fake_instance(params={'host': ''}) + + self.assertRaises(exception.InstanceNotReady, + self.compute_api.get_console_output, + self.context, instance) + + db.instance_destroy(self.context, instance['uuid']) + def test_attach_volume(self): # Ensure instance can be soft rebooted. -- cgit