diff --git a/doc/v3/api_samples/consoles/consoles-list-get-resp.json b/doc/v3/api_samples/consoles/consoles-list-get-resp.json index af8ea95a6d00..ce323861b5de 100644 --- a/doc/v3/api_samples/consoles/consoles-list-get-resp.json +++ b/doc/v3/api_samples/consoles/consoles-list-get-resp.json @@ -1,8 +1,10 @@ { "consoles": [ { - "console_type": "fake", - "id": 1 + "console": { + "console_type": "fake", + "id": 1 + } } ] } \ No newline at end of file diff --git a/nova/api/openstack/compute/plugins/v3/consoles.py b/nova/api/openstack/compute/plugins/v3/consoles.py index 6af7f35f8d34..b18c90614daa 100644 --- a/nova/api/openstack/compute/plugins/v3/consoles.py +++ b/nova/api/openstack/compute/plugins/v3/consoles.py @@ -26,7 +26,7 @@ def _translate_keys(cons): pool = cons['pool'] info = {'id': cons['id'], 'console_type': pool['console_type']} - return info + return dict(console=info) def _translate_detail_keys(cons): @@ -47,19 +47,18 @@ class ConsolesController(object): def __init__(self): self.console_api = console_api.API() - @extensions.expected_errors(404) + @extensions.expected_errors(()) def index(self, req, server_id): """Returns a list of consoles for this instance.""" - try: - consoles = self.console_api.get_consoles( + consoles = self.console_api.get_consoles( req.environ['nova.context'], server_id) - except exception.InstanceNotFound as e: - raise exc.HTTPNotFound(explanation=e.format_message()) return dict(consoles=[_translate_keys(console) for console in consoles]) + # NOTE(gmann): Here should be 201 instead of 200 by v2.1 + # +microversions because the console has been created + # completely when returning a response. @extensions.expected_errors(404) - @wsgi.response(201) def create(self, req, server_id, body): """Creates a new console.""" try: diff --git a/nova/tests/unit/api/openstack/compute/plugins/v3/test_consoles.py b/nova/tests/unit/api/openstack/compute/plugins/v3/test_consoles.py deleted file mode 100644 index d3ba83dcbc16..000000000000 --- a/nova/tests/unit/api/openstack/compute/plugins/v3/test_consoles.py +++ /dev/null @@ -1,270 +0,0 @@ -# Copyright 2010-2011 OpenStack Foundation -# Copyright 2011 Piston Cloud Computing, Inc. -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import datetime -import uuid as stdlib_uuid - -from oslo.utils import timeutils -import webob - -from nova.api.openstack.compute.plugins.v3 import consoles -from nova.compute import vm_states -from nova import console -from nova import db -from nova import exception -from nova import test -from nova.tests.unit.api.openstack import fakes -from nova.tests.unit import matchers - - -FAKE_UUID = 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa' - - -class FakeInstanceDB(object): - - def __init__(self): - self.instances_by_id = {} - self.ids_by_uuid = {} - self.max_id = 0 - - def return_server_by_id(self, context, id): - if id not in self.instances_by_id: - self._add_server(id=id) - return dict(self.instances_by_id[id]) - - def return_server_by_uuid(self, context, uuid): - if uuid not in self.ids_by_uuid: - self._add_server(uuid=uuid) - return dict(self.instances_by_id[self.ids_by_uuid[uuid]]) - - def _add_server(self, id=None, uuid=None): - if id is None: - id = self.max_id + 1 - if uuid is None: - uuid = str(stdlib_uuid.uuid4()) - instance = stub_instance(id, uuid=uuid) - self.instances_by_id[id] = instance - self.ids_by_uuid[uuid] = id - if id > self.max_id: - self.max_id = id - - -def stub_instance(id, user_id='fake', project_id='fake', host=None, - vm_state=None, task_state=None, - reservation_id="", uuid=FAKE_UUID, image_ref="10", - flavor_id="1", name=None, key_name='', - access_ipv4=None, access_ipv6=None, progress=0): - - if host is not None: - host = str(host) - - if key_name: - key_data = 'FAKE' - else: - key_data = '' - - # ReservationID isn't sent back, hack it in there. - server_name = name or "server%s" % id - if reservation_id != "": - server_name = "reservation_%s" % (reservation_id, ) - - instance = { - "id": int(id), - "created_at": datetime.datetime(2010, 10, 10, 12, 0, 0), - "updated_at": datetime.datetime(2010, 11, 11, 11, 0, 0), - "admin_password": "", - "user_id": user_id, - "project_id": project_id, - "image_ref": image_ref, - "kernel_id": "", - "ramdisk_id": "", - "launch_index": 0, - "key_name": key_name, - "key_data": key_data, - "vm_state": vm_state or vm_states.BUILDING, - "task_state": task_state, - "memory_mb": 0, - "vcpus": 0, - "root_gb": 0, - "hostname": "", - "host": host, - "instance_type": {}, - "user_data": "", - "reservation_id": reservation_id, - "mac_address": "", - "scheduled_at": timeutils.utcnow(), - "launched_at": timeutils.utcnow(), - "terminated_at": timeutils.utcnow(), - "availability_zone": "", - "display_name": server_name, - "display_description": "", - "locked": False, - "metadata": [], - "access_ip_v4": access_ipv4, - "access_ip_v6": access_ipv6, - "uuid": uuid, - "progress": progress} - - return instance - - -class ConsolesControllerTest(test.NoDBTestCase): - def setUp(self): - super(ConsolesControllerTest, self).setUp() - self.flags(verbose=True) - self.instance_db = FakeInstanceDB() - self.stubs.Set(db, 'instance_get', - self.instance_db.return_server_by_id) - self.stubs.Set(db, 'instance_get_by_uuid', - self.instance_db.return_server_by_uuid) - self.uuid = str(stdlib_uuid.uuid4()) - self.url = '/v3/fake/servers/%s/consoles' % self.uuid - self.controller = consoles.ConsolesController() - - def test_create_console(self): - def fake_create_console(cons_self, context, instance_id): - self.assertEqual(instance_id, self.uuid) - return {} - self.stubs.Set(console.api.API, 'create_console', fake_create_console) - - req = fakes.HTTPRequestV3.blank(self.url) - self.controller.create(req, self.uuid, None) - self.assertEqual(self.controller.create.wsgi_code, 201) - - def test_create_console_unknown_instance(self): - def fake_create_console(cons_self, context, instance_id): - raise exception.InstanceNotFound(instance_id=instance_id) - self.stubs.Set(console.api.API, 'create_console', fake_create_console) - - req = fakes.HTTPRequestV3.blank(self.url) - self.assertRaises(webob.exc.HTTPNotFound, self.controller.create, - req, self.uuid, None) - - def test_show_console(self): - def fake_get_console(cons_self, context, instance_id, console_id): - self.assertEqual(instance_id, self.uuid) - self.assertEqual(console_id, 20) - pool = dict(console_type='fake_type', - public_hostname='fake_hostname') - return dict(id=console_id, password='fake_password', - port='fake_port', pool=pool, instance_name='inst-0001') - - expected = {'console': {'id': 20, - 'port': 'fake_port', - 'host': 'fake_hostname', - 'password': 'fake_password', - 'instance_name': 'inst-0001', - 'console_type': 'fake_type'}} - - self.stubs.Set(console.api.API, 'get_console', fake_get_console) - - req = fakes.HTTPRequestV3.blank(self.url + '/20') - res_dict = self.controller.show(req, self.uuid, '20') - self.assertThat(res_dict, matchers.DictMatches(expected)) - - def test_show_console_unknown_console(self): - def fake_get_console(cons_self, context, instance_id, console_id): - raise exception.ConsoleNotFound(console_id=console_id) - - self.stubs.Set(console.api.API, 'get_console', fake_get_console) - - req = fakes.HTTPRequestV3.blank(self.url + '/20') - self.assertRaises(webob.exc.HTTPNotFound, self.controller.show, - req, self.uuid, '20') - - def test_show_console_unknown_instance(self): - def fake_get_console(cons_self, context, instance_id, console_id): - raise exception.ConsoleNotFoundForInstance( - instance_uuid=instance_id) - - self.stubs.Set(console.api.API, 'get_console', fake_get_console) - - req = fakes.HTTPRequestV3.blank(self.url + '/20') - self.assertRaises(webob.exc.HTTPNotFound, self.controller.show, - req, self.uuid, '20') - - def test_list_consoles(self): - def fake_get_consoles(cons_self, context, instance_id): - self.assertEqual(instance_id, self.uuid) - - pool1 = dict(console_type='fake_type', - public_hostname='fake_hostname') - cons1 = dict(id=10, password='fake_password', - port='fake_port', pool=pool1) - pool2 = dict(console_type='fake_type2', - public_hostname='fake_hostname2') - cons2 = dict(id=11, password='fake_password2', - port='fake_port2', pool=pool2) - return [cons1, cons2] - - expected = {'consoles': - [{'id': 10, 'console_type': 'fake_type'}, - {'id': 11, 'console_type': 'fake_type2'}]} - - self.stubs.Set(console.api.API, 'get_consoles', fake_get_consoles) - - req = fakes.HTTPRequestV3.blank(self.url) - res_dict = self.controller.index(req, self.uuid) - self.assertThat(res_dict, matchers.DictMatches(expected)) - - def test_list_consoles_unknown_instance(self): - def fake_get_consoles(cons_self, context, instance_id): - raise exception.InstanceNotFound(instance_id=instance_id) - self.stubs.Set(console.api.API, 'get_consoles', fake_get_consoles) - - req = fakes.HTTPRequestV3.blank(self.url) - self.assertRaises(webob.exc.HTTPNotFound, self.controller.index, - req, self.uuid) - - def test_delete_console(self): - def fake_get_console(cons_self, context, instance_id, console_id): - self.assertEqual(instance_id, self.uuid) - self.assertEqual(console_id, 20) - pool = dict(console_type='fake_type', - public_hostname='fake_hostname') - return dict(id=console_id, password='fake_password', - port='fake_port', pool=pool) - - def fake_delete_console(cons_self, context, instance_id, console_id): - self.assertEqual(instance_id, self.uuid) - self.assertEqual(console_id, 20) - - self.stubs.Set(console.api.API, 'get_console', fake_get_console) - self.stubs.Set(console.api.API, 'delete_console', fake_delete_console) - - req = fakes.HTTPRequestV3.blank(self.url + '/20') - self.controller.delete(req, self.uuid, '20') - - def test_delete_console_unknown_console(self): - def fake_delete_console(cons_self, context, instance_id, console_id): - raise exception.ConsoleNotFound(console_id=console_id) - - self.stubs.Set(console.api.API, 'delete_console', fake_delete_console) - - req = fakes.HTTPRequestV3.blank(self.url + '/20') - self.assertRaises(webob.exc.HTTPNotFound, self.controller.delete, - req, self.uuid, '20') - - def test_delete_console_unknown_instance(self): - def fake_delete_console(cons_self, context, instance_id, console_id): - raise exception.ConsoleNotFoundForInstance( - instance_uuid=instance_id) - - self.stubs.Set(console.api.API, 'delete_console', fake_delete_console) - - req = fakes.HTTPRequestV3.blank(self.url + '/20') - self.assertRaises(webob.exc.HTTPNotFound, self.controller.delete, - req, self.uuid, '20') diff --git a/nova/tests/unit/api/openstack/compute/test_consoles.py b/nova/tests/unit/api/openstack/compute/test_consoles.py index c951046ae0cd..4c18afe388c1 100644 --- a/nova/tests/unit/api/openstack/compute/test_consoles.py +++ b/nova/tests/unit/api/openstack/compute/test_consoles.py @@ -21,7 +21,8 @@ from lxml import etree from oslo.utils import timeutils import webob -from nova.api.openstack.compute import consoles +from nova.api.openstack.compute import consoles as consoles_v2 +from nova.api.openstack.compute.plugins.v3 import consoles as consoles_v21 from nova.compute import vm_states from nova import console from nova import db @@ -122,9 +123,9 @@ def stub_instance(id, user_id='fake', project_id='fake', host=None, return instance -class ConsolesControllerTest(test.NoDBTestCase): +class ConsolesControllerTestV21(test.NoDBTestCase): def setUp(self): - super(ConsolesControllerTest, self).setUp() + super(ConsolesControllerTestV21, self).setUp() self.flags(verbose=True) self.instance_db = FakeInstanceDB() self.stubs.Set(db, 'instance_get', @@ -133,7 +134,10 @@ class ConsolesControllerTest(test.NoDBTestCase): self.instance_db.return_server_by_uuid) self.uuid = str(stdlib_uuid.uuid4()) self.url = '/v2/fake/servers/%s/consoles' % self.uuid - self.controller = consoles.Controller() + self._set_up_controller() + + def _set_up_controller(self): + self.controller = consoles_v21.ConsolesController() def test_create_console(self): def fake_create_console(cons_self, context, instance_id): @@ -187,7 +191,8 @@ class ConsolesControllerTest(test.NoDBTestCase): def test_show_console_unknown_instance(self): def fake_get_console(cons_self, context, instance_id, console_id): - raise exception.InstanceNotFound(instance_id=instance_id) + raise exception.ConsoleNotFoundForInstance( + instance_uuid=instance_id) self.stubs.Set(console.api.API, 'get_console', fake_get_console) @@ -250,7 +255,8 @@ class ConsolesControllerTest(test.NoDBTestCase): def test_delete_console_unknown_instance(self): def fake_delete_console(cons_self, context, instance_id, console_id): - raise exception.InstanceNotFound(instance_id=instance_id) + raise exception.ConsoleNotFoundForInstance( + instance_uuid=instance_id) self.stubs.Set(console.api.API, 'delete_console', fake_delete_console) @@ -259,6 +265,11 @@ class ConsolesControllerTest(test.NoDBTestCase): req, self.uuid, '20') +class ConsolesControllerTestV2(ConsolesControllerTestV21): + def _set_up_controller(self): + self.controller = consoles_v2.Controller() + + class TestConsolesXMLSerializer(test.NoDBTestCase): def test_show(self): fixture = {'console': {'id': 20, @@ -267,7 +278,7 @@ class TestConsolesXMLSerializer(test.NoDBTestCase): 'host': 'fake_hostname', 'console_type': 'fake_type'}} - output = consoles.ConsoleTemplate().serialize(fixture) + output = consoles_v2.ConsoleTemplate().serialize(fixture) res_tree = etree.XML(output) self.assertEqual(res_tree.tag, 'console') @@ -283,7 +294,7 @@ class TestConsolesXMLSerializer(test.NoDBTestCase): {'console': {'id': 11, 'console_type': 'fake_type2'}}]} - output = consoles.ConsolesTemplate().serialize(fixture) + output = consoles_v2.ConsolesTemplate().serialize(fixture) res_tree = etree.XML(output) self.assertEqual(res_tree.tag, 'consoles') diff --git a/nova/tests/unit/integrated/v3/api_samples/consoles/consoles-list-get-resp.json.tpl b/nova/tests/unit/integrated/v3/api_samples/consoles/consoles-list-get-resp.json.tpl index 9d908ad12399..ce323861b5de 100644 --- a/nova/tests/unit/integrated/v3/api_samples/consoles/consoles-list-get-resp.json.tpl +++ b/nova/tests/unit/integrated/v3/api_samples/consoles/consoles-list-get-resp.json.tpl @@ -1 +1,10 @@ -{"consoles": [{"console_type": "fake", "id": 1}]} \ No newline at end of file +{ + "consoles": [ + { + "console": { + "console_type": "fake", + "id": 1 + } + } + ] +} \ No newline at end of file diff --git a/nova/tests/unit/integrated/v3/test_consoles.py b/nova/tests/unit/integrated/v3/test_consoles.py index 7a889aa4cfe6..8deb91ef967c 100644 --- a/nova/tests/unit/integrated/v3/test_consoles.py +++ b/nova/tests/unit/integrated/v3/test_consoles.py @@ -29,7 +29,7 @@ class ConsolesSamplesJsonTest(test_servers.ServersSampleBase): def _create_consoles(self, server_uuid): response = self._do_post('servers/%s/consoles' % server_uuid, 'consoles-create-req', {}) - self.assertEqual(response.status_code, 201) + self.assertEqual(response.status_code, 200) def test_create_consoles(self): uuid = self._post_server()