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',