Support using server uuids when accessing consoles.
This adds support to the nova/console/api.py for instance_ids being uuids. Additionally, it updates the openstack console controller to get around some int() casts and modifies testing to exercise the server-uuid path. Change-Id: I0641f2c4857d0d1e07abc7d70880590741769b9a
This commit is contained in:
parent
5e9e3873e5
commit
fa74f5c59d
@ -54,7 +54,7 @@ class Controller(object):
|
||||
"""Returns a list of consoles for this instance"""
|
||||
consoles = self.console_api.get_consoles(
|
||||
req.environ['nova.context'],
|
||||
int(server_id))
|
||||
server_id)
|
||||
return dict(consoles=[_translate_keys(console)
|
||||
for console in consoles])
|
||||
|
||||
@ -62,14 +62,14 @@ class Controller(object):
|
||||
"""Creates a new console"""
|
||||
self.console_api.create_console(
|
||||
req.environ['nova.context'],
|
||||
int(server_id))
|
||||
server_id)
|
||||
|
||||
def show(self, req, server_id, id):
|
||||
"""Shows in-depth information on a specific console"""
|
||||
try:
|
||||
console = self.console_api.get_console(
|
||||
req.environ['nova.context'],
|
||||
int(server_id),
|
||||
server_id,
|
||||
int(id))
|
||||
except exception.NotFound:
|
||||
raise exc.HTTPNotFound()
|
||||
@ -83,7 +83,7 @@ class Controller(object):
|
||||
"""Deletes a console"""
|
||||
try:
|
||||
self.console_api.delete_console(req.environ['nova.context'],
|
||||
int(server_id),
|
||||
server_id,
|
||||
int(id))
|
||||
except exception.NotFound:
|
||||
raise exc.HTTPNotFound()
|
||||
|
@ -17,10 +17,11 @@
|
||||
|
||||
"""Handles ConsoleProxy API requests."""
|
||||
|
||||
from nova.db import base
|
||||
from nova import exception
|
||||
from nova import flags
|
||||
from nova import rpc
|
||||
from nova.db import base
|
||||
from nova import utils
|
||||
|
||||
|
||||
FLAGS = flags.FLAGS
|
||||
@ -33,12 +34,15 @@ class API(base.Base):
|
||||
super(API, self).__init__(**kwargs)
|
||||
|
||||
def get_consoles(self, context, instance_id):
|
||||
instance_id = self._translate_uuid_if_necessary(context, instance_id)
|
||||
return self.db.console_get_all_by_instance(context, instance_id)
|
||||
|
||||
def get_console(self, context, instance_id, console_id):
|
||||
instance_id = self._translate_uuid_if_necessary(context, instance_id)
|
||||
return self.db.console_get(context, console_id, instance_id)
|
||||
|
||||
def delete_console(self, context, instance_id, console_id):
|
||||
instance_id = self._translate_uuid_if_necessary(context, instance_id)
|
||||
console = self.db.console_get(context,
|
||||
console_id,
|
||||
instance_id)
|
||||
@ -51,16 +55,16 @@ class API(base.Base):
|
||||
'args': {'console_id': console['id']}})
|
||||
|
||||
def create_console(self, context, instance_id):
|
||||
instance = self.db.instance_get(context, instance_id)
|
||||
#NOTE(mdragon): If we wanted to return this the console info
|
||||
# here, as we would need to do a call.
|
||||
# They can just do an index later to fetch
|
||||
# console info. I am not sure which is better
|
||||
# here.
|
||||
instance = self._get_instance(context, instance_id)
|
||||
rpc.cast(context,
|
||||
self._get_console_topic(context, instance['host']),
|
||||
{'method': 'add_console',
|
||||
'args': {'instance_id': instance_id}})
|
||||
'args': {'instance_id': instance['id']}})
|
||||
|
||||
def _get_console_topic(self, context, instance_host):
|
||||
topic = self.db.queue_get_for(context,
|
||||
@ -68,3 +72,16 @@ class API(base.Base):
|
||||
instance_host)
|
||||
return rpc.call(context, topic, {'method': 'get_console_topic',
|
||||
'args': {'fake': 1}})
|
||||
|
||||
def _translate_uuid_if_necessary(self, context, instance_id):
|
||||
if utils.is_uuid_like(instance_id):
|
||||
instance = self.db.instance_get_by_uuid(context, instance_id)
|
||||
instance_id = instance['id']
|
||||
return instance_id
|
||||
|
||||
def _get_instance(self, context, instance_id):
|
||||
if utils.is_uuid_like(instance_id):
|
||||
instance = self.db.instance_get_by_uuid(context, instance_id)
|
||||
else:
|
||||
instance = self.db.instance_get(context, instance_id)
|
||||
return instance
|
||||
|
@ -38,9 +38,33 @@ FLAGS = flags.FLAGS
|
||||
FAKE_UUID = 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa'
|
||||
|
||||
|
||||
def return_server_by_id(context, id):
|
||||
print "GOT HERE"
|
||||
return stub_instance(id)
|
||||
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[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(utils.gen_uuid())
|
||||
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,
|
||||
@ -64,7 +88,6 @@ def stub_instance(id, user_id='fake', project_id='fake', host=None,
|
||||
|
||||
instance = {
|
||||
"id": int(id),
|
||||
"uuid": FAKE_UUID,
|
||||
"created_at": datetime.datetime(2010, 10, 10, 12, 0, 0),
|
||||
"updated_at": datetime.datetime(2010, 11, 11, 11, 0, 0),
|
||||
"admin_pass": "",
|
||||
@ -107,23 +130,28 @@ class ConsolesTest(test.TestCase):
|
||||
def setUp(self):
|
||||
super(ConsolesTest, self).setUp()
|
||||
self.flags(verbose=True)
|
||||
self.stubs.Set(db, 'instance_get', return_server_by_id)
|
||||
self.webreq = common.webob_factory('/v1.1/fake/servers')
|
||||
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(utils.gen_uuid())
|
||||
self.url = '/v1.1/fake/servers/%s/consoles' % self.uuid
|
||||
|
||||
def test_create_console(self):
|
||||
def fake_create_console(cons_self, context, instance_id):
|
||||
self.assertTrue(instance_id, 10)
|
||||
self.assertTrue(instance_id, '10')
|
||||
return {}
|
||||
self.stubs.Set(console.API, 'create_console', fake_create_console)
|
||||
|
||||
req = webob.Request.blank('/v1.1/fake/servers/10/consoles')
|
||||
req = webob.Request.blank(self.url)
|
||||
req.method = "POST"
|
||||
res = req.get_response(fakes.wsgi_app())
|
||||
self.assertEqual(res.status_int, 200)
|
||||
|
||||
def test_show_console(self):
|
||||
def fake_get_console(cons_self, context, instance_id, console_id):
|
||||
self.assertEqual(instance_id, 10)
|
||||
self.assertEqual(instance_id, self.uuid)
|
||||
self.assertEqual(console_id, 20)
|
||||
pool = dict(console_type='fake_type',
|
||||
public_hostname='fake_hostname')
|
||||
@ -138,7 +166,7 @@ class ConsolesTest(test.TestCase):
|
||||
|
||||
self.stubs.Set(console.API, 'get_console', fake_get_console)
|
||||
|
||||
req = webob.Request.blank('/v1.1/fake/servers/10/consoles/20')
|
||||
req = webob.Request.blank(self.url + '/20')
|
||||
res = req.get_response(fakes.wsgi_app())
|
||||
self.assertEqual(res.status_int, 200)
|
||||
res_dict = json.loads(res.body)
|
||||
@ -146,7 +174,7 @@ class ConsolesTest(test.TestCase):
|
||||
|
||||
def test_show_console_xml(self):
|
||||
def fake_get_console(cons_self, context, instance_id, console_id):
|
||||
self.assertEqual(instance_id, 10)
|
||||
self.assertEqual(instance_id, self.uuid)
|
||||
self.assertEqual(console_id, 20)
|
||||
pool = dict(console_type='fake_type',
|
||||
public_hostname='fake_hostname')
|
||||
@ -155,7 +183,7 @@ class ConsolesTest(test.TestCase):
|
||||
|
||||
self.stubs.Set(console.API, 'get_console', fake_get_console)
|
||||
|
||||
req = webob.Request.blank('/v1.1/fake/servers/10/consoles/20.xml')
|
||||
req = webob.Request.blank(self.url + '/20.xml')
|
||||
res = req.get_response(fakes.wsgi_app())
|
||||
self.assertEqual(res.status_int, 200)
|
||||
|
||||
@ -174,7 +202,7 @@ class ConsolesTest(test.TestCase):
|
||||
|
||||
self.stubs.Set(console.API, 'get_console', fake_get_console)
|
||||
|
||||
req = webob.Request.blank('/v1.1/fake/servers/10/consoles/20')
|
||||
req = webob.Request.blank(self.url + '/20')
|
||||
res = req.get_response(fakes.wsgi_app())
|
||||
self.assertEqual(res.status_int, 404)
|
||||
|
||||
@ -184,13 +212,13 @@ class ConsolesTest(test.TestCase):
|
||||
|
||||
self.stubs.Set(console.API, 'get_console', fake_get_console)
|
||||
|
||||
req = webob.Request.blank('/v1.1/fake/servers/10/consoles/20')
|
||||
req = webob.Request.blank(self.url + '/20')
|
||||
res = req.get_response(fakes.wsgi_app())
|
||||
self.assertEqual(res.status_int, 404)
|
||||
|
||||
def test_list_consoles(self):
|
||||
def fake_get_consoles(cons_self, context, instance_id):
|
||||
self.assertEqual(instance_id, 10)
|
||||
self.assertEqual(instance_id, self.uuid)
|
||||
|
||||
pool1 = dict(console_type='fake_type',
|
||||
public_hostname='fake_hostname')
|
||||
@ -208,7 +236,7 @@ class ConsolesTest(test.TestCase):
|
||||
|
||||
self.stubs.Set(console.API, 'get_consoles', fake_get_consoles)
|
||||
|
||||
req = webob.Request.blank('/v1.1/fake/servers/10/consoles')
|
||||
req = webob.Request.blank(self.url)
|
||||
res = req.get_response(fakes.wsgi_app())
|
||||
self.assertEqual(res.status_int, 200)
|
||||
res_dict = json.loads(res.body)
|
||||
@ -216,7 +244,7 @@ class ConsolesTest(test.TestCase):
|
||||
|
||||
def test_list_consoles_xml(self):
|
||||
def fake_get_consoles(cons_self, context, instance_id):
|
||||
self.assertEqual(instance_id, 10)
|
||||
self.assertEqual(instance_id, self.uuid)
|
||||
|
||||
pool1 = dict(console_type='fake_type',
|
||||
public_hostname='fake_hostname')
|
||||
@ -234,7 +262,7 @@ class ConsolesTest(test.TestCase):
|
||||
|
||||
self.stubs.Set(console.API, 'get_consoles', fake_get_consoles)
|
||||
|
||||
req = webob.Request.blank('/v1.1/fake/servers/10/consoles.xml')
|
||||
req = webob.Request.blank(self.url + '.xml')
|
||||
res = req.get_response(fakes.wsgi_app())
|
||||
self.assertEqual(res.status_int, 200)
|
||||
|
||||
@ -256,7 +284,7 @@ class ConsolesTest(test.TestCase):
|
||||
|
||||
def test_delete_console(self):
|
||||
def fake_get_console(cons_self, context, instance_id, console_id):
|
||||
self.assertEqual(instance_id, 10)
|
||||
self.assertEqual(instance_id, self.uuid)
|
||||
self.assertEqual(console_id, 20)
|
||||
pool = dict(console_type='fake_type',
|
||||
public_hostname='fake_hostname')
|
||||
@ -264,13 +292,13 @@ class ConsolesTest(test.TestCase):
|
||||
port='fake_port', pool=pool)
|
||||
|
||||
def fake_delete_console(cons_self, context, instance_id, console_id):
|
||||
self.assertEqual(instance_id, 10)
|
||||
self.assertEqual(instance_id, self.uuid)
|
||||
self.assertEqual(console_id, 20)
|
||||
|
||||
self.stubs.Set(console.API, 'get_console', fake_get_console)
|
||||
self.stubs.Set(console.API, 'delete_console', fake_delete_console)
|
||||
|
||||
req = webob.Request.blank('/v1.1/fake/servers/10/consoles/20')
|
||||
req = webob.Request.blank(self.url + '/20')
|
||||
req.method = "DELETE"
|
||||
res = req.get_response(fakes.wsgi_app())
|
||||
self.assertEqual(res.status_int, 202)
|
||||
@ -281,7 +309,7 @@ class ConsolesTest(test.TestCase):
|
||||
|
||||
self.stubs.Set(console.API, 'delete_console', fake_delete_console)
|
||||
|
||||
req = webob.Request.blank('/v1.1/fake/servers/10/consoles/20')
|
||||
req = webob.Request.blank(self.url + '/20')
|
||||
req.method = "DELETE"
|
||||
res = req.get_response(fakes.wsgi_app())
|
||||
self.assertEqual(res.status_int, 404)
|
||||
@ -292,7 +320,7 @@ class ConsolesTest(test.TestCase):
|
||||
|
||||
self.stubs.Set(console.API, 'delete_console', fake_delete_console)
|
||||
|
||||
req = webob.Request.blank('/v1.1/fake/servers/10/consoles/20')
|
||||
req = webob.Request.blank(self.url + '/20')
|
||||
req.method = "DELETE"
|
||||
res = req.get_response(fakes.wsgi_app())
|
||||
self.assertEqual(res.status_int, 404)
|
||||
|
Loading…
Reference in New Issue
Block a user