Add support for serial console access

Enable instance serial console based on flags provided from
nova-cloud-controller charm.

This is only supported in OpenStack Juno or later, and replaces
the standard output to the nova console-log.

Change-Id: I147166d9b273964d34ba81724b0311f269b9fea0
Depends-On: I3bfcca88bd6147be337e6d770db7348170b914e6
This commit is contained in:
James Page 2016-09-15 12:02:35 +01:00
parent 6a7225cefb
commit cb9a195756
8 changed files with 74 additions and 1 deletions

View File

@ -281,6 +281,34 @@ class NovaComputeCephContext(context.CephContext):
return ctxt
class SerialConsoleContext(context.OSContextGenerator):
@property
def enable_serial_console(self):
for rid in relation_ids('cloud-compute'):
for unit in related_units(rid):
if bool(relation_get('enable_serial_console',
rid=rid, unit=unit)) is True:
return 'true'
return 'false'
@property
def serial_console_base_url(self):
for rid in relation_ids('cloud-compute'):
for unit in related_units(rid):
base_url = relation_get('serial_console_base_url',
rid=rid, unit=unit)
if base_url is not None:
return base_url
return 'ws://127.0.0.1:6083/'
def __call__(self):
return {
'enable_serial_console': self.enable_serial_console,
'serial_console_base_url': self.serial_console_base_url,
}
class CloudComputeContext(context.OSContextGenerator):
'''

View File

@ -108,6 +108,7 @@ from nova_compute_context import (
NovaAPIAppArmorContext,
NovaComputeAppArmorContext,
NovaNetworkAppArmorContext,
SerialConsoleContext,
)
CA_CERT_PATH = '/usr/local/share/ca-certificates/keystone_juju_ca_cert.crt'
@ -222,7 +223,8 @@ BASE_RESOURCE_MAP = {
DesignateContext(),
NovaComputeVirtContext(),
context.LogLevelContext(),
context.InternalEndpointContext()],
context.InternalEndpointContext(),
SerialConsoleContext()],
},
NOVA_API_AA_PROFILE_PATH: {
'services': ['nova-api'],

View File

@ -170,3 +170,5 @@ disk_cachemodes = {{ disk_cachemodes }}
{% include "parts/section-cinder" %}
{% include "parts/section-ephemeral" %}
{% include "parts/section-serial-console" %}

View File

@ -197,3 +197,5 @@ lock_path=/var/lock/nova
disable_libvirt_livesnapshot = False
{% include "parts/section-ephemeral" %}
{% include "parts/section-serial-console" %}

View File

@ -203,3 +203,5 @@ lock_path=/var/lock/nova
disable_libvirt_livesnapshot = False
{% include "parts/section-ephemeral" %}
{% include "parts/section-serial-console" %}

View File

@ -219,3 +219,5 @@ lock_path=/var/lock/nova
disable_libvirt_livesnapshot = False
{% include "parts/section-ephemeral" %}
{% include "parts/section-serial-console" %}

View File

@ -0,0 +1,4 @@
[serial_console]
enabled = {{ enable_serial_console }}
proxyclient_address = {{ console_listen_addr }}
base_url = {{ serial_console_base_url }}

View File

@ -404,3 +404,34 @@ class DesignateContextTests(CharmTestCase):
self.assertEqual(designatectxt(), {
'enable_designate': False,
})
class SerialConsoleContextTests(CharmTestCase):
def setUp(self):
super(SerialConsoleContextTests, self).setUp(context, TO_PATCH)
self.relation_get.side_effect = self.test_relation.get
self.config.side_effect = self.test_config.get
self.host_uuid = 'e46e530d-18ae-4a67-9ff0-e6e2ba7c60a7'
def test_serial_console_not_provided(self):
self.relation_ids.return_value = ['cloud-compute:0']
self.related_units.return_value = 'nova-cloud-controller/0'
self.assertEqual(
context.SerialConsoleContext()(),
{'enable_serial_console': 'false',
'serial_console_base_url': 'ws://127.0.0.1:6083/'}
)
def test_serial_console_provided(self):
self.relation_ids.return_value = ['cloud-compute:0']
self.related_units.return_value = 'nova-cloud-controller/0'
self.test_relation.set({
'enable_serial_console': 'true',
'serial_console_base_url': 'ws://10.10.10.1:6083/'
})
self.assertEqual(
context.SerialConsoleContext()(),
{'enable_serial_console': 'true',
'serial_console_base_url': 'ws://10.10.10.1:6083/'}
)