summaryrefslogtreecommitdiffstats
path: root/nova/compute
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2013-01-17 12:14:24 +0000
committerGerrit Code Review <review@openstack.org>2013-01-17 12:14:24 +0000
commit921b7c514fb79bd4b8a023f34d22df4efe5406ad (patch)
tree4cdb3c0036cb711fe86b2b3a1acf8e72629bd124 /nova/compute
parent9ae14c7570bb9dfc4bf1ab8f8127cae3c9eb2641 (diff)
parent518bdb5abaab6ae11e18bebaf4d279197f21522f (diff)
Merge "Expose a get_spice_console RPC API method"
Diffstat (limited to 'nova/compute')
-rw-r--r--nova/compute/api.py23
-rw-r--r--nova/compute/cells_api.py15
-rw-r--r--nova/compute/manager.py32
-rw-r--r--nova/compute/rpcapi.py8
4 files changed, 77 insertions, 1 deletions
diff --git a/nova/compute/api.py b/nova/compute/api.py
index 8ba6b97aa..c7ca0640d 100644
--- a/nova/compute/api.py
+++ b/nova/compute/api.py
@@ -2031,6 +2031,29 @@ class API(base.Base):
return connect_info
@wrap_check_policy
+ 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)
+
+ self.consoleauth_rpcapi.authorize_console(context,
+ connect_info['token'], console_type, connect_info['host'],
+ connect_info['port'], connect_info['internal_access_path'])
+
+ return {'url': connect_info['access_url']}
+
+ 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
def get_console_output(self, context, instance, tail_length=None):
"""Get console output for an instance."""
return self.compute_rpcapi.get_console_output(context,
diff --git a/nova/compute/cells_api.py b/nova/compute/cells_api.py
index d1d9a11d2..d5427a04b 100644
--- a/nova/compute/cells_api.py
+++ b/nova/compute/cells_api.py
@@ -439,6 +439,21 @@ class ComputeCellsAPI(compute_api.API):
connect_info['port'], connect_info['internal_access_path'])
return {'url': connect_info['access_url']}
+ @wrap_check_policy
+ @validate_cell
+ def get_spice_console(self, context, instance, console_type):
+ """Get a url to a SPICE Console."""
+ if not instance['host']:
+ raise exception.InstanceNotReady(instance_id=instance['uuid'])
+
+ connect_info = self._call_to_cells(context, instance,
+ 'get_spice_connect_info', console_type)
+
+ self.consoleauth_rpcapi.authorize_console(context,
+ connect_info['token'], console_type, connect_info['host'],
+ connect_info['port'], connect_info['internal_access_path'])
+ return {'url': connect_info['access_url']}
+
@validate_cell
def get_console_output(self, context, instance, *args, **kwargs):
"""Get console output for an an instance."""
diff --git a/nova/compute/manager.py b/nova/compute/manager.py
index 3bf8e61ef..0136f7659 100644
--- a/nova/compute/manager.py
+++ b/nova/compute/manager.py
@@ -293,7 +293,7 @@ class ComputeVirtAPI(virtapi.VirtAPI):
class ComputeManager(manager.SchedulerDependentManager):
"""Manages the running instances from creation to destruction."""
- RPC_API_VERSION = '2.23'
+ RPC_API_VERSION = '2.24'
def __init__(self, compute_driver=None, *args, **kwargs):
"""Load configuration options and connect to the hypervisor."""
@@ -2387,6 +2387,9 @@ class ComputeManager(manager.SchedulerDependentManager):
LOG.debug(_("Getting vnc console"), instance=instance)
token = str(uuid.uuid4())
+ if not CONF.vnc_enabled:
+ raise exception.ConsoleTypeInvalid(console_type=console_type)
+
if console_type == 'novnc':
# For essex, novncproxy_base_url must include the full path
# including the html file (like http://myhost/vnc_auto.html)
@@ -2404,6 +2407,33 @@ class ComputeManager(manager.SchedulerDependentManager):
return connect_info
+ @exception.wrap_exception(notifier=notifier, publisher_id=publisher_id())
+ @wrap_instance_fault
+ def get_spice_console(self, context, console_type, instance):
+ """Return connection information for a spice console."""
+ context = context.elevated()
+ LOG.debug(_("Getting spice console"), instance=instance)
+ token = str(uuid.uuid4())
+
+ if not CONF.spice.enabled:
+ raise exception.ConsoleTypeInvalid(console_type=console_type)
+
+ if console_type == 'spice-html5':
+ # For essex, spicehtml5proxy_base_url must include the full path
+ # including the html file (like http://myhost/spice_auto.html)
+ access_url = '%s?token=%s' % (CONF.spice.html5proxy_base_url,
+ token)
+ else:
+ raise exception.ConsoleTypeInvalid(console_type=console_type)
+
+ # Retrieve connect info from driver, and then decorate with our
+ # access info token
+ connect_info = self.driver.get_spice_console(instance)
+ connect_info['token'] = token
+ connect_info['access_url'] = access_url
+
+ return connect_info
+
def _attach_volume_boot(self, context, instance, volume, mountpoint):
"""Attach a volume to an instance at boot time. So actual attach
is done by instance creation"""
diff --git a/nova/compute/rpcapi.py b/nova/compute/rpcapi.py
index 3e7ed1cfd..525d1adc7 100644
--- a/nova/compute/rpcapi.py
+++ b/nova/compute/rpcapi.py
@@ -158,6 +158,7 @@ class ComputeAPI(nova.openstack.common.rpc.proxy.RpcProxy):
2.22 - Add recreate, on_shared_storage and host arguments to
rebuild_instance()
2.23 - Remove network_info from reboot_instance
+ 2.24 - Added get_spice_console method
'''
#
@@ -295,6 +296,13 @@ class ComputeAPI(nova.openstack.common.rpc.proxy.RpcProxy):
instance=instance_p, console_type=console_type),
topic=_compute_topic(self.topic, ctxt, None, instance))
+ def get_spice_console(self, ctxt, instance, console_type):
+ instance_p = jsonutils.to_primitive(instance)
+ return self.call(ctxt, self.make_msg('get_spice_console',
+ instance=instance_p, console_type=console_type),
+ topic=_compute_topic(self.topic, ctxt, None, instance),
+ version='2.24')
+
def host_maintenance_mode(self, ctxt, host_param, mode, host):
'''Set host maintenance mode