diff --git a/cloudbaseinit/metadata/services/nocloudservice.py b/cloudbaseinit/metadata/services/nocloudservice.py index 70190d01..78af542d 100644 --- a/cloudbaseinit/metadata/services/nocloudservice.py +++ b/cloudbaseinit/metadata/services/nocloudservice.py @@ -695,7 +695,13 @@ def get_public_keys(self): if isinstance(raw_ssh_keys, list): return raw_ssh_keys - return [raw_ssh_keys[key].get('openssh-key') for key in raw_ssh_keys] + keys = [] + for value in raw_ssh_keys.values(): + if isinstance(value, str): + keys.append(value) + else: + keys.append(value.get('openssh-key')) + return keys def get_network_details(self): debian_net_config = self._get_meta_data().get('network-interfaces') diff --git a/cloudbaseinit/tests/metadata/services/test_nocloudservice.py b/cloudbaseinit/tests/metadata/services/test_nocloudservice.py index d3266116..00a2d1c0 100644 --- a/cloudbaseinit/tests/metadata/services/test_nocloudservice.py +++ b/cloudbaseinit/tests/metadata/services/test_nocloudservice.py @@ -516,6 +516,19 @@ def test_get_public_keys_alt_fmt(self, mock_get_metadata): result = self._config_drive.get_public_keys() self.assertEqual(result, expected_result) + @mock.patch(MODULE_PATH + '.NoCloudConfigDriveService._get_meta_data') + def test_get_public_keys_dict_of_strings(self, mock_get_metadata): + fake_key0 = 'ssh-rsa AAAA0 user0@host' + fake_key1 = 'ssh-rsa AAAA1 user1@host' + mock_get_metadata.return_value = { + 'public-keys': { + 'key0': fake_key0, + 'key1': fake_key1, + } + } + result = sorted(self._config_drive.get_public_keys()) + self.assertEqual(result, sorted([fake_key0, fake_key1])) + @ddt.data(('', ('V2 network metadata is empty', None)), ('1', ('V2 network metadata is not a dictionary', None)), ('{}', ('V2 network metadata is empty', None)),