diff --git a/novaclient/tests/fixture_data/servers.py b/novaclient/tests/fixture_data/servers.py index 85be06868..c8f87bf60 100644 --- a/novaclient/tests/fixture_data/servers.py +++ b/novaclient/tests/fixture_data/servers.py @@ -457,6 +457,8 @@ class V1(Base): assert list(body[action]) == ['type'] elif action == 'os-getRDPConsole': assert list(body[action]) == ['type'] + elif action == 'os-getSerialConsole': + assert list(body[action]) == ['type'] elif action == 'os-migrateLive': assert set(body[action].keys()) == set(['host', 'block_migration', @@ -568,6 +570,7 @@ class V3(Base): 'get_console_output': ['length'], 'get_vnc_console': ['type'], 'get_spice_console': ['type'], + 'get_serial_console': ['type'], 'reset_state': ['state'], 'create_image': ['name', 'metadata'], 'migrate_live': ['host', 'block_migration', 'disk_over_commit'], diff --git a/novaclient/tests/v1_1/test_servers.py b/novaclient/tests/v1_1/test_servers.py index 42032031b..a8a3aeabd 100644 --- a/novaclient/tests/v1_1/test_servers.py +++ b/novaclient/tests/v1_1/test_servers.py @@ -548,6 +548,14 @@ class ServersTest(utils.FixturedTestCase): self.cs.servers.get_spice_console(s, 'fake') self.assert_called('POST', '/servers/1234/action') + def test_get_serial_console(self): + s = self.cs.servers.get(1234) + s.get_serial_console('fake') + self.assert_called('POST', '/servers/1234/action') + + self.cs.servers.get_serial_console(s, 'fake') + self.assert_called('POST', '/servers/1234/action') + def test_get_rdp_console(self): s = self.cs.servers.get(1234) s.get_rdp_console('fake') diff --git a/novaclient/v1_1/servers.py b/novaclient/v1_1/servers.py index d1ced5218..43b45ebb7 100644 --- a/novaclient/v1_1/servers.py +++ b/novaclient/v1_1/servers.py @@ -86,6 +86,14 @@ class Server(base.Resource): """ return self.manager.get_rdp_console(self, console_type) + def get_serial_console(self, console_type): + """ + Get serial console for a Server. + + :param console_type: Type of console ('serial') + """ + return self.manager.get_serial_console(self, console_type) + def get_password(self, private_key=None): """ Get password for a Server. @@ -675,6 +683,17 @@ class ServerManager(base.BootingManagerWithFind): return self._action('os-getRDPConsole', server, {'type': console_type})[1] + def get_serial_console(self, server, console_type): + """ + Get a serial console for an instance + + :param server: The :class:`Server` (or its ID) to add an IP to. + :param console_type: Type of serial console to get ('serial') + """ + + return self._action('os-getSerialConsole', server, + {'type': console_type})[1] + def get_password(self, server, private_key=None): """ Get password for an instance diff --git a/novaclient/v1_1/shell.py b/novaclient/v1_1/shell.py index 4f82b02c4..6a5a83742 100644 --- a/novaclient/v1_1/shell.py +++ b/novaclient/v1_1/shell.py @@ -2040,6 +2040,27 @@ def do_get_rdp_console(cs, args): utils.print_list([RDPConsole(data['console'])], ['Type', 'Url']) +@utils.arg('server', metavar='', help=_('Name or ID of server.')) +@utils.arg('--console_type', default='serial', + help=_('Type of serial console, default="serial".')) +def do_get_serial_console(cs, args): + """Get a serial console to a server.""" + if args.console_type not in ('serial',): + raise exceptions.CommandError( + _("Invalid parameter value for 'console_type', " + "currently supported 'serial'.")) + + server = _find_server(cs, args.server) + data = server.get_serial_console(args.console_type) + + class SerialConsole: + def __init__(self, console_dict): + self.type = console_dict['type'] + self.url = console_dict['url'] + + utils.print_list([SerialConsole(data['console'])], ['Type', 'Url']) + + @utils.arg('server', metavar='', help='Name or ID of server.') @utils.arg('private_key', metavar='',