From 253dfc76ebca70f12aee7b39e916ee77e2b9f819 Mon Sep 17 00:00:00 2001 From: Michael Still Date: Sat, 22 Feb 2025 08:25:37 +1100 Subject: [PATCH] libvirt: direct SPICE console object changes This patch changes just the objects required for the implementation of SPICE direct consoles, as requested during review. See change I1e701cbabc0e2c435685e31465159eec09e3b1a0 for the related feature implementation. APIImpact Change-Id: I8ec513fd818362d2f041c679a84e900952af61a2 --- nova/objects/console_auth_token.py | 10 ++++++++-- .../api_sample_tests/test_console_auth_tokens.py | 1 + nova/tests/unit/fake_console_auth_token.py | 3 ++- nova/tests/unit/objects/test_console_auth_token.py | 13 +++++++++++++ nova/tests/unit/objects/test_objects.py | 2 +- 5 files changed, 25 insertions(+), 4 deletions(-) diff --git a/nova/objects/console_auth_token.py b/nova/objects/console_auth_token.py index 3be2f8f08241..a1a58422e888 100644 --- a/nova/objects/console_auth_token.py +++ b/nova/objects/console_auth_token.py @@ -41,13 +41,15 @@ class ConsoleAuthToken(base.NovaTimestampObject, base.NovaObject): # was deprecated. # Version 1.2: Add expires field. # This is to see token expire time. - VERSION = '1.2' + # Version 1.3: Added tls_port field. + VERSION = '1.3' fields = { 'id': fields.IntegerField(), 'console_type': fields.StringField(nullable=False), 'host': fields.StringField(nullable=False), 'port': fields.IntegerField(nullable=False), + 'tls_port': fields.IntegerField(nullable=True), 'internal_access_path': fields.StringField(nullable=True), 'instance_uuid': fields.UUIDField(nullable=False), 'access_url_base': fields.StringField(nullable=True), @@ -88,6 +90,10 @@ class ConsoleAuthToken(base.NovaTimestampObject, base.NovaObject): def obj_make_compatible(self, primitive, target_version): super().obj_make_compatible(primitive, target_version) target_version = versionutils.convert_version_to_tuple(target_version) + + if target_version < (1, 3) and 'tls_port' in primitive: + primitive.pop('tls_port', None) + if target_version < (1, 2) and 'expires' in primitive: primitive.pop('expires', None) @@ -98,7 +104,7 @@ class ConsoleAuthToken(base.NovaTimestampObject, base.NovaObject): # field is populated in the authorize method after the token # authorization is created in the database. for field in obj.fields: - setattr(obj, field, db_obj[field]) + setattr(obj, field, db_obj.get(field)) obj._context = context obj.obj_reset_changes() return obj diff --git a/nova/tests/functional/api_sample_tests/test_console_auth_tokens.py b/nova/tests/functional/api_sample_tests/test_console_auth_tokens.py index e9bb45866918..7c482fecc9b0 100644 --- a/nova/tests/functional/api_sample_tests/test_console_auth_tokens.py +++ b/nova/tests/functional/api_sample_tests/test_console_auth_tokens.py @@ -48,6 +48,7 @@ class ConsoleAuthTokensSampleJsonTests(test_servers.ServersSampleBase): subs["uuid"] = uuid subs["host"] = r"[\w\.\-]+" subs["port"] = "[0-9]+" + subs["tls_port"] = "[0-9]+" subs["internal_access_path"] = ".*" self._verify_response('get-console-connect-info-get-resp', subs, response, 200) diff --git a/nova/tests/unit/fake_console_auth_token.py b/nova/tests/unit/fake_console_auth_token.py index 5cb27e8dfa67..dd8ee82864ae 100644 --- a/nova/tests/unit/fake_console_auth_token.py +++ b/nova/tests/unit/fake_console_auth_token.py @@ -27,7 +27,8 @@ fake_token_dict = { 'token_hash': fake_token_hash, 'console_type': 'fake-type', 'host': 'fake-host', - 'port': 1000, + 'port': 5900, + 'tls_port': 5901, 'internal_access_path': 'fake-path', 'instance_uuid': fake_instance_uuid, 'expires': 100, diff --git a/nova/tests/unit/objects/test_console_auth_token.py b/nova/tests/unit/objects/test_console_auth_token.py index d7103d752cb3..021f7528e1a6 100644 --- a/nova/tests/unit/objects/test_console_auth_token.py +++ b/nova/tests/unit/objects/test_console_auth_token.py @@ -62,6 +62,7 @@ class _TestConsoleAuthToken(object): console_type=console_type, host=fakes.fake_token_dict['host'], port=fakes.fake_token_dict['port'], + tls_port=fakes.fake_token_dict['tls_port'], internal_access_path=fakes.fake_token_dict['internal_access_path'], instance_uuid=fakes.fake_token_dict['instance_uuid'], access_url_base=fakes.fake_token_dict['access_url_base'], @@ -143,6 +144,7 @@ class _TestConsoleAuthToken(object): console_type=fakes.fake_token_dict['console_type'], host=fakes.fake_token_dict['host'], port=fakes.fake_token_dict['port'], + tls_port=fakes.fake_token_dict['tls_port'], internal_access_path=fakes.fake_token_dict['internal_access_path'], instance_uuid=fakes.fake_token_dict['instance_uuid'], access_url_base=fakes.fake_token_dict['access_url_base'], @@ -162,6 +164,7 @@ class _TestConsoleAuthToken(object): console_type=fakes.fake_token_dict['console_type'], host=fakes.fake_token_dict['host'], port=fakes.fake_token_dict['port'], + tls_port=fakes.fake_token_dict['tls_port'], internal_access_path=fakes.fake_token_dict['internal_access_path'], instance_uuid=fakes.fake_token_dict['instance_uuid'], access_url_base=fakes.fake_token_dict['access_url_base'], @@ -190,6 +193,7 @@ class _TestConsoleAuthToken(object): console_type=fakes.fake_token_dict['console_type'], host=fakes.fake_token_dict['host'], port=fakes.fake_token_dict['port'], + tls_port=fakes.fake_token_dict['tls_port'], internal_access_path=fakes.fake_token_dict['internal_access_path'], instance_uuid=fakes.fake_token_dict['instance_uuid'], access_url_base=fakes.fake_token_dict['access_url_base'], @@ -218,6 +222,15 @@ class _TestConsoleAuthToken(object): mock_destroy.assert_called_once_with( self.context, 'fake-host') + def test_obj_make_compatible_tls_port(self): + """Test that checks if we pop tls_port.""" + obj = token_obj.ConsoleAuthToken(tls_port=5901) + primitive = obj.obj_to_primitive() + self.assertIn('tls_port', primitive['nova_object.data']) + + primitive = obj.obj_to_primitive('1.2') + self.assertNotIn('tls_port', primitive['nova_object.data']) + class TestConsoleAuthToken(test_objects._LocalTest, _TestConsoleAuthToken): diff --git a/nova/tests/unit/objects/test_objects.py b/nova/tests/unit/objects/test_objects.py index 7a12cec521f1..e11156b9ef18 100644 --- a/nova/tests/unit/objects/test_objects.py +++ b/nova/tests/unit/objects/test_objects.py @@ -1087,7 +1087,7 @@ object_data = { 'CellMappingList': '1.1-496ef79bb2ab41041fff8bcb57996352', 'ComputeNode': '1.19-af6bd29a6c3b225da436a0d8487096f2', 'ComputeNodeList': '1.17-52f3b0962b1c86b98590144463ebb192', - 'ConsoleAuthToken': '1.2-a4677c3576ad91eb02068a5cb9d38eaa', + 'ConsoleAuthToken': '1.3-64803f4ab6b1bf92af587bbf21793390', 'CpuDiagnostics': '1.0-d256f2e442d1b837735fd17dfe8e3d47', 'Destination': '1.4-3b440d29459e2c98987ad5b25ad1cb2c', 'DeviceBus': '1.0-77509ea1ea0dd750d5864b9bd87d3f9d',