HyperV: Remove RDP console connection information API

The RDP console was only available for HyperV driver, therefore its
connection information via API ``os-console-auth-tokens`` will now return
HTTP ``400 (BadRequest)`` error.

Starting from 2.31 microversion, this API return connection info
for all other console type.

Change-Id: I94e590eb4cbe3b2d8eff7fe881f7b98af8979be2
This commit is contained in:
Ghanshyam Mann 2024-02-07 12:18:05 -08:00 committed by Ghanshyam
parent 260dbd9761
commit 3e47439a68
10 changed files with 47 additions and 56 deletions

View File

@ -64,9 +64,9 @@ Show Console Connection Information
Given the console authentication token for a server, shows the related
connection information.
This method used to be available only for the ``rdp-html5`` console type before
microversion 2.31. Starting from microversion 2.31 it's available for all
console types.
Nova HyperV driver has been removed therefore requests for RDP console connection
information will always return an http 400 error. Starting from microversion 2.31
it's available for all other console types.
Normal response codes: 200
@ -94,5 +94,5 @@ Response
**Example Show Console Authentication Token**
.. literalinclude:: ../../doc/api_samples/os-console-auth-tokens/get-console-connect-info-get-resp.json
.. literalinclude:: ../../doc/api_samples/os-console-auth-tokens/v2.31/get-console-connect-info-get-resp.json
:language: javascript

View File

@ -1,5 +0,0 @@
{
"os-getRDPConsole": {
"type": "rdp-html5"
}
}

View File

@ -27,7 +27,7 @@ CONF = nova.conf.CONF
class ConsoleAuthTokensController(wsgi.Controller):
def _show(self, req, id, rdp_only):
def _show(self, req, id):
"""Checks a console auth token and returns the related connect info."""
context = req.environ['nova.context']
context.can(cat_policies.BASE_POLICY_NAME)
@ -55,13 +55,6 @@ class ConsoleAuthTokensController(wsgi.Controller):
if not connect_info:
raise webob.exc.HTTPNotFound(explanation=_("Token not found"))
console_type = connect_info.console_type
if rdp_only and console_type != "rdp-html5":
raise webob.exc.HTTPUnauthorized(
explanation=_("The requested console type details are not "
"accessible"))
return {'console': {
'instance_uuid': connect_info.instance_uuid,
'host': connect_info.host,
@ -72,9 +65,17 @@ class ConsoleAuthTokensController(wsgi.Controller):
@wsgi.Controller.api_version("2.1", "2.30")
@wsgi.expected_errors((400, 401, 404))
def show(self, req, id):
return self._show(req, id, True)
"""Until microversion 2.30, this API was available only for the
rdp-html5 console type which has been removed along with the HyperV
driver in the Nova 29.0.0 (Caracal) release. As this method is for
microversion <=2.30, it will return an http 400 error. Starting
from 2.31 microversion, this API works for all the supported
console types that are handled by the separate show method
defined below.
"""
raise webob.exc.HTTPBadRequest()
@wsgi.Controller.api_version("2.31") # noqa
@wsgi.expected_errors((400, 404))
def show(self, req, id): # noqa
return self._show(req, id, False)
return self._show(req, id)

View File

@ -1,5 +0,0 @@
{
"os-getRDPConsole": {
"type": "rdp-html5"
}
}

View File

@ -0,0 +1,6 @@
{
"remote_console": {
"protocol": "serial",
"type": "serial"
}
}

View File

@ -22,20 +22,22 @@ from nova.tests.functional.api_sample_tests import test_servers
class ConsoleAuthTokensSampleJsonTests(test_servers.ServersSampleBase):
ADMIN_API = True
sample_dir = "os-console-auth-tokens"
microversion = '2.31'
scenarios = [('v2_31', {'api_major_version': 'v2.1'})]
def _get_console_url(self, data):
return jsonutils.loads(data)["console"]["url"]
return jsonutils.loads(data)["remote_console"]["url"]
def _get_console_token(self, uuid):
response = self._do_post('servers/%s/action' % uuid,
'get-rdp-console-post-req',
{'action': 'os-getRDPConsole'})
body = {'protocol': 'serial', 'type': 'serial'}
response = self._do_post('servers/%s/remote-consoles' % uuid,
'create-serial-console-req', body)
url = self._get_console_url(response.content)
return re.match('.+?token=([^&]+)', url).groups()[0]
def test_get_console_connect_info(self):
self.flags(enabled=True, group='rdp')
self.flags(enabled=True, group='serial_console')
uuid = self._post_server()
token = self._get_console_token(uuid)

View File

@ -49,33 +49,11 @@ class ConsoleAuthTokensExtensionTestV21(test.NoDBTestCase):
self.req = fakes.HTTPRequest.blank('', use_admin_context=True)
self.context = self.req.environ['nova.context']
@mock.patch('nova.objects.ConsoleAuthToken.validate',
return_value=objects.ConsoleAuthToken(
instance_uuid=fakes.FAKE_UUID, host='fake_host',
port='1234', internal_access_path='fake_access_path',
console_type='rdp-html5', token=fakes.FAKE_UUID))
@mock.patch.object(objects.ConsoleAuthToken, 'validate')
def test_get_console_connect_info(self, mock_validate):
output = self.controller.show(self.req, fakes.FAKE_UUID)
self.assertEqual(self._EXPECTED_OUTPUT_DB, output)
mock_validate.assert_called_once_with(self.context, fakes.FAKE_UUID)
@mock.patch('nova.objects.ConsoleAuthToken.validate',
side_effect=exception.InvalidToken(token='***'))
def test_get_console_connect_info_token_not_found(self, mock_validate):
self.assertRaises(webob.exc.HTTPNotFound,
self.assertRaises(webob.exc.HTTPBadRequest,
self.controller.show, self.req, fakes.FAKE_UUID)
mock_validate.assert_called_once_with(self.context, fakes.FAKE_UUID)
@mock.patch('nova.objects.ConsoleAuthToken.validate',
return_value=objects.ConsoleAuthToken(
instance_uuid=fakes.FAKE_UUID, host='fake_host',
port='1234', internal_access_path='fake_access_path',
console_type='unauthorized_console_type',
token=fakes.FAKE_UUID))
def test_get_console_connect_info_nonrdp_console_type(self, mock_validate):
self.assertRaises(webob.exc.HTTPUnauthorized,
self.controller.show, self.req, fakes.FAKE_UUID)
mock_validate.assert_called_once_with(self.context, fakes.FAKE_UUID)
mock_validate.assert_not_called()
class ConsoleAuthTokensExtensionTestV231(ConsoleAuthTokensExtensionTestV21):
@ -91,7 +69,14 @@ class ConsoleAuthTokensExtensionTestV231(ConsoleAuthTokensExtensionTestV21):
port='1234', internal_access_path='fake_access_path',
console_type='webmks',
token=fakes.FAKE_UUID))
def test_get_console_connect_info_nonrdp_console_type(self, mock_validate):
def test_get_console_connect_info(self, mock_validate):
output = self.controller.show(self.req, fakes.FAKE_UUID)
self.assertEqual(self._EXPECTED_OUTPUT_DB, output)
mock_validate.assert_called_once_with(self.context, fakes.FAKE_UUID)
@mock.patch('nova.objects.ConsoleAuthToken.validate',
side_effect=exception.InvalidToken(token='***'))
def test_get_console_connect_info_token_not_found(self, mock_validate):
self.assertRaises(webob.exc.HTTPNotFound,
self.controller.show, self.req, fakes.FAKE_UUID)
mock_validate.assert_called_once_with(self.context, fakes.FAKE_UUID)

View File

@ -5,7 +5,14 @@ upgrade:
Nova 27.2.0 (Antelope) release. This driver was untested and has no
maintainers. In addition, it has a dependency on the OpenStack Winstacker
project that also has been retired.
- |
The RDP console was only available for the HyperV driver, therefore its
connection information via below API ``os-console-auth-tokens`` will now
return HTTP ``400 (BadRequest)`` error:
* Show Console Connection Information:
GET /os-console-auth-tokens/{console_token}
The following config options which only apply for the ``HyperV`` virt
driver also been removed: