From 39e2f6faf4f8062394bc61ccd0a833e7c8b76917 Mon Sep 17 00:00:00 2001 From: yoerg Date: Wed, 20 Jan 2021 12:05:11 +0100 Subject: [PATCH] Support retrieving admin_username from OpenStack metadata Allows giving an instance an individual cloud username, e.g. for license servers, while still retrieving SSH public keys for that user from OpenStack. Change-Id: I078380ef8f74b30105fd44378045df8b1260acbc --- .../metadata/services/baseopenstackservice.py | 3 +++ .../services/test_baseopenstackservice.py | 21 +++++++++++++++++++ doc/source/services.rst | 2 ++ 3 files changed, 26 insertions(+) diff --git a/cloudbaseinit/metadata/services/baseopenstackservice.py b/cloudbaseinit/metadata/services/baseopenstackservice.py index efcb7d20..6e7d40fd 100644 --- a/cloudbaseinit/metadata/services/baseopenstackservice.py +++ b/cloudbaseinit/metadata/services/baseopenstackservice.py @@ -249,6 +249,9 @@ class BaseOpenStackService(base.BaseMetadataService): services=services ) + def get_admin_username(self): + return self._get_meta_data().get('meta', {}).get('admin_username') + def get_admin_password(self): meta_data = self._get_meta_data() meta = meta_data.get('meta') diff --git a/cloudbaseinit/tests/metadata/services/test_baseopenstackservice.py b/cloudbaseinit/tests/metadata/services/test_baseopenstackservice.py index 419ebf98..ef9397e2 100644 --- a/cloudbaseinit/tests/metadata/services/test_baseopenstackservice.py +++ b/cloudbaseinit/tests/metadata/services/test_baseopenstackservice.py @@ -124,6 +124,27 @@ class TestBaseOpenStackService(unittest.TestCase): self.assertEqual(sorted(list(set(public_keys))), sorted(response)) + @mock.patch(MODPATH + + ".BaseOpenStackService._get_meta_data") + def _test_get_admin_username(self, mock_get_meta_data, meta_data): + mock_get_meta_data.return_value = meta_data + response = self._service.get_admin_username() + mock_get_meta_data.assert_called_once_with() + if meta_data and 'admin_username' in meta_data.get('meta'): + self.assertEqual(meta_data.get('meta')['admin_username'], response) + else: + self.assertIsNone(response) + + def test_get_admin_username_in_meta(self): + self._test_get_admin_username( + meta_data={'meta': {'admin_username': 'fake user'}}) + + def test_get_admin_username_no_username_in_meta(self): + self._test_get_admin_username(meta_data={'meta': {}}) + + def test_get_admin_username_no_meta_data(self): + self._test_get_admin_username(meta_data={}) + @mock.patch(MODPATH + ".BaseOpenStackService._get_meta_data") def _test_get_admin_password(self, mock_get_meta_data, meta_data): diff --git a/doc/source/services.rst b/doc/source/services.rst index ff1b392e..a38b6438 100644 --- a/doc/source/services.rst +++ b/doc/source/services.rst @@ -49,6 +49,7 @@ Capabilities: * public keys * `WinRM `_ authentication certificates * static network configuration + * admin user name * admin user password * post admin user password (only once) * user data @@ -101,6 +102,7 @@ Capabilities: * public keys * authentication certificates * static network configuration + * admin user name * admin user password * user data