From 06fa2a9e26c98067b3b82790f2c3788696a1a778 Mon Sep 17 00:00:00 2001 From: VGU Date: Sun, 13 Dec 2020 18:56:20 +0100 Subject: [PATCH 1/5] Add test_openstack_client_config_generation_with_project_region_name test --- .../plugins/openstack/files/file_reference | 1 + awx/main/tests/unit/test_tasks.py | 46 +++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/awx/main/tests/data/inventory/plugins/openstack/files/file_reference b/awx/main/tests/data/inventory/plugins/openstack/files/file_reference index c578942ca1..601878072d 100644 --- a/awx/main/tests/data/inventory/plugins/openstack/files/file_reference +++ b/awx/main/tests/data/inventory/plugins/openstack/files/file_reference @@ -9,3 +9,4 @@ clouds: username: fooo private: true verify: false + region_name: fooo diff --git a/awx/main/tests/unit/test_tasks.py b/awx/main/tests/unit/test_tasks.py index f94c70c739..37759a1f36 100644 --- a/awx/main/tests/unit/test_tasks.py +++ b/awx/main/tests/unit/test_tasks.py @@ -246,6 +246,52 @@ def test_openstack_client_config_generation_with_project_domain_name(mocker, sou } +@pytest.mark.parametrize("source,expected", [ + (None, True), (False, False), (True, True) +]) +def test_openstack_client_config_generation_with_project_region_name(mocker, source, expected, private_data_dir): + update = tasks.RunInventoryUpdate() + credential_type = CredentialType.defaults['openstack']() + inputs = { + 'host': 'https://keystone.openstack.example.org', + 'username': 'demo', + 'password': 'secrete', + 'project': 'demo-project', + 'domain': 'my-demo-domain', + 'project_domain_name': 'project-domain', + 'project_region_name': 'region-name', + } + if source is not None: + inputs['verify_ssl'] = source + credential = Credential(pk=1, credential_type=credential_type, inputs=inputs) + + inventory_update = mocker.Mock(**{ + 'source': 'openstack', + 'source_vars_dict': {}, + 'get_cloud_credential': mocker.Mock(return_value=credential), + 'get_extra_credentials': lambda x: [], + 'ansible_virtualenv_path': '/venv/foo' + }) + cloud_config = update.build_private_data(inventory_update, private_data_dir) + cloud_credential = yaml.safe_load( + cloud_config.get('credentials')[credential] + ) + assert cloud_credential['clouds'] == { + 'devstack': { + 'auth': { + 'auth_url': 'https://keystone.openstack.example.org', + 'password': 'secrete', + 'project_name': 'demo-project', + 'username': 'demo', + 'domain_name': 'my-demo-domain', + 'project_domain_name': 'project-domain', + }, + 'verify': expected, + 'private': True, + 'region_name': 'region-name', + } + } + @pytest.mark.parametrize("source,expected", [ (False, False), (True, True) ]) From bfb00aecbe18d7b3aeadcda03dd28ff8223fdf50 Mon Sep 17 00:00:00 2001 From: VGU Date: Sun, 13 Dec 2020 18:57:13 +0100 Subject: [PATCH 2/5] Add project_region_name input --- awx/main/models/credential/__init__.py | 5 +++++ awx/main/models/credential/injectors.py | 18 +++++++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/awx/main/models/credential/__init__.py b/awx/main/models/credential/__init__.py index 66db962430..e8a2884083 100644 --- a/awx/main/models/credential/__init__.py +++ b/awx/main/models/credential/__init__.py @@ -819,6 +819,11 @@ ManagedCredentialType( 'It is only needed for Keystone v3 authentication ' 'URLs. Refer to Ansible Tower documentation for ' 'common scenarios.') + }, { + 'id': 'region', + 'label': ugettext_noop('Region Name'), + 'type': 'string', + 'help_text': ugettext_noop('For some cloud providers, like OVH, region must be specified'), }, { 'id': 'verify_ssl', 'label': ugettext_noop('Verify SSL'), diff --git a/awx/main/models/credential/injectors.py b/awx/main/models/credential/injectors.py index 75d1f17bfe..d7f64b70a9 100644 --- a/awx/main/models/credential/injectors.py +++ b/awx/main/models/credential/injectors.py @@ -82,14 +82,30 @@ def _openstack_data(cred): if cred.has_input('domain'): openstack_auth['domain_name'] = cred.get_input('domain', default='') verify_state = cred.get_input('verify_ssl', default=True) + +# if cred.has_input('project_region_name'): +# openstack_data = { +# 'clouds': { +# 'devstack': { +# 'auth': openstack_auth, +# 'verify': verify_state, +# 'region_name': cred.get_input('project_region_name', default='') +# }, +# }, +# } +# else: openstack_data = { 'clouds': { 'devstack': { 'auth': openstack_auth, - 'verify': verify_state, + 'verify': verify_state }, }, } + + if cred.has_input('project_region_name'): + openstack_data['clouds']['devstack']['region_name'] = cred.get_input('project_region_name', default='') + return openstack_data From e35f1afd57e51f50315ed4b67fa1154cbab6c08b Mon Sep 17 00:00:00 2001 From: VGU Date: Sun, 13 Dec 2020 19:05:29 +0100 Subject: [PATCH 3/5] Fix lint --- awx/main/models/credential/injectors.py | 11 ----------- awx/main/tests/unit/test_tasks.py | 1 + 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/awx/main/models/credential/injectors.py b/awx/main/models/credential/injectors.py index d7f64b70a9..73cd018393 100644 --- a/awx/main/models/credential/injectors.py +++ b/awx/main/models/credential/injectors.py @@ -83,17 +83,6 @@ def _openstack_data(cred): openstack_auth['domain_name'] = cred.get_input('domain', default='') verify_state = cred.get_input('verify_ssl', default=True) -# if cred.has_input('project_region_name'): -# openstack_data = { -# 'clouds': { -# 'devstack': { -# 'auth': openstack_auth, -# 'verify': verify_state, -# 'region_name': cred.get_input('project_region_name', default='') -# }, -# }, -# } -# else: openstack_data = { 'clouds': { 'devstack': { diff --git a/awx/main/tests/unit/test_tasks.py b/awx/main/tests/unit/test_tasks.py index 37759a1f36..0a530bef51 100644 --- a/awx/main/tests/unit/test_tasks.py +++ b/awx/main/tests/unit/test_tasks.py @@ -292,6 +292,7 @@ def test_openstack_client_config_generation_with_project_region_name(mocker, sou } } + @pytest.mark.parametrize("source,expected", [ (False, False), (True, True) ]) From 8153d60a5ff86b5bfc62d4cd461dc554add9a68a Mon Sep 17 00:00:00 2001 From: VGU Date: Sun, 13 Dec 2020 20:15:12 +0100 Subject: [PATCH 4/5] Rollback to origin file --- awx/main/models/credential/injectors.py | 2 +- .../tests/data/inventory/plugins/openstack/files/file_reference | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/awx/main/models/credential/injectors.py b/awx/main/models/credential/injectors.py index 73cd018393..ef30b91945 100644 --- a/awx/main/models/credential/injectors.py +++ b/awx/main/models/credential/injectors.py @@ -87,7 +87,7 @@ def _openstack_data(cred): 'clouds': { 'devstack': { 'auth': openstack_auth, - 'verify': verify_state + 'verify': verify_state, }, }, } diff --git a/awx/main/tests/data/inventory/plugins/openstack/files/file_reference b/awx/main/tests/data/inventory/plugins/openstack/files/file_reference index 601878072d..c578942ca1 100644 --- a/awx/main/tests/data/inventory/plugins/openstack/files/file_reference +++ b/awx/main/tests/data/inventory/plugins/openstack/files/file_reference @@ -9,4 +9,3 @@ clouds: username: fooo private: true verify: false - region_name: fooo From 14f2803ea7b8b82e63ea377c7bf3ac3584034d21 Mon Sep 17 00:00:00 2001 From: VGU Date: Sun, 13 Dec 2020 20:20:47 +0100 Subject: [PATCH 5/5] Add 'Region Name' label for openstack credential --- awx/locale/django.pot | 9 +++++++++ awx/locale/en-us/LC_MESSAGES/django.po | 9 +++++++++ awx/locale/fr/LC_MESSAGES/django.po | 10 ++++++++++ .../Credential/shared/data.credentialTypes.json | 5 +++++ 4 files changed, 33 insertions(+) diff --git a/awx/locale/django.pot b/awx/locale/django.pot index 3d2cf41999..e5fbe05390 100644 --- a/awx/locale/django.pot +++ b/awx/locale/django.pot @@ -3354,6 +3354,15 @@ msgid "" "common scenarios." msgstr "" +#: awx/main/models/credential/__init__.py:824 +msgid "Region Name" +msgstr "" + +#: awx/main/models/credential/__init__.py:826 +msgid "" +"For some cloud providers, like OVH, region must be specified." +msgstr "" + #: awx/main/models/credential/__init__.py:824 #: awx/main/models/credential/__init__.py:1131 #: awx/main/models/credential/__init__.py:1166 diff --git a/awx/locale/en-us/LC_MESSAGES/django.po b/awx/locale/en-us/LC_MESSAGES/django.po index 3d2cf41999..e5fbe05390 100644 --- a/awx/locale/en-us/LC_MESSAGES/django.po +++ b/awx/locale/en-us/LC_MESSAGES/django.po @@ -3354,6 +3354,15 @@ msgid "" "common scenarios." msgstr "" +#: awx/main/models/credential/__init__.py:824 +msgid "Region Name" +msgstr "" + +#: awx/main/models/credential/__init__.py:826 +msgid "" +"For some cloud providers, like OVH, region must be specified." +msgstr "" + #: awx/main/models/credential/__init__.py:824 #: awx/main/models/credential/__init__.py:1131 #: awx/main/models/credential/__init__.py:1166 diff --git a/awx/locale/fr/LC_MESSAGES/django.po b/awx/locale/fr/LC_MESSAGES/django.po index 62c2ba7292..bcb54c548b 100644 --- a/awx/locale/fr/LC_MESSAGES/django.po +++ b/awx/locale/fr/LC_MESSAGES/django.po @@ -3294,6 +3294,16 @@ msgid "" "common scenarios." msgstr "Les domaines OpenStack définissent les limites administratives. Ils sont nécessaires uniquement pour les URL d’authentification Keystone v3. Voir la documentation Ansible Tower pour les scénarios courants." +#: awx/main/models/credential/__init__.py:824 +msgid "Region Name" +msgstr "Nom de la region" + +#: awx/main/models/credential/__init__.py:826 +msgid "" +"For some cloud providers, like OVH, region must be specified." +msgstr "" +"Chez certains fournisseurs, comme OVH, vous devez spécifier le nom de la région" + #: awx/main/models/credential/__init__.py:812 #: awx/main/models/credential/__init__.py:1110 #: awx/main/models/credential/__init__.py:1144 diff --git a/awx/ui_next/src/screens/Credential/shared/data.credentialTypes.json b/awx/ui_next/src/screens/Credential/shared/data.credentialTypes.json index b7b3189951..6281f15024 100644 --- a/awx/ui_next/src/screens/Credential/shared/data.credentialTypes.json +++ b/awx/ui_next/src/screens/Credential/shared/data.credentialTypes.json @@ -275,6 +275,11 @@ "type": "string", "help_text": "OpenStack domains define administrative boundaries. It is only needed for Keystone v3 authentication URLs. Refer to Ansible Tower documentation for common scenarios." }, + { + "id": "project_region_name", + "label": "Region Name", + "type": "string" + }, { "id": "verify_ssl", "label": "Verify SSL",