mirror of
https://github.com/ansible/awx.git
synced 2026-03-04 10:11:05 -03:30
Fix issue with some modules not honoring Controller API prefix (#16080)
* Fix issue where export module does not honor CONTROLLER_OPTIONAL_API_URLPATTERN_PREFIX * Add unit test and handle leading/trailing slashes * Reformat * Refactor for clarity * Remove unused import
This commit is contained in:
@@ -4,6 +4,7 @@ __metaclass__ = type
|
|||||||
|
|
||||||
from .controller_api import ControllerModule
|
from .controller_api import ControllerModule
|
||||||
from ansible.module_utils.basic import missing_required_lib
|
from ansible.module_utils.basic import missing_required_lib
|
||||||
|
from os import getenv
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from awxkit.api.client import Connection
|
from awxkit.api.client import Connection
|
||||||
@@ -42,7 +43,13 @@ class ControllerAWXKitModule(ControllerModule):
|
|||||||
if not self.apiV2Ref:
|
if not self.apiV2Ref:
|
||||||
if not self.authenticated:
|
if not self.authenticated:
|
||||||
self.authenticate()
|
self.authenticate()
|
||||||
v2_index = get_registered_page('/api/v2/')(self.connection).get()
|
prefix = getenv('CONTROLLER_OPTIONAL_API_URLPATTERN_PREFIX', '/api/')
|
||||||
|
if not prefix.startswith('/'):
|
||||||
|
prefix = f"/{prefix}"
|
||||||
|
if not prefix.endswith('/'):
|
||||||
|
prefix = f"{prefix}/"
|
||||||
|
v2_path = f"{prefix}v2/"
|
||||||
|
v2_index = get_registered_page(v2_path)(self.connection).get()
|
||||||
self.api_ref = ApiV2(connection=self.connection, **{'json': v2_index})
|
self.api_ref = ApiV2(connection=self.connection, **{'json': v2_index})
|
||||||
return self.api_ref
|
return self.api_ref
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,36 @@
|
|||||||
|
from __future__ import absolute_import, division, print_function
|
||||||
|
|
||||||
|
import os
|
||||||
|
from unittest import mock
|
||||||
|
|
||||||
|
__metaclass__ = type
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
|
||||||
|
def mock_get_registered_page(prefix):
|
||||||
|
return mock.Mock(return_value=mock.Mock(get=mock.Mock(return_value={'prefix': prefix})))
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
"env_prefix, controller_host, expected",
|
||||||
|
[
|
||||||
|
# without CONTROLLER_OPTIONAL_API_URLPATTERN_PREFIX env variable
|
||||||
|
[None, "https://localhost", "/api/v2/"],
|
||||||
|
# with CONTROLLER_OPTIONAL_API_URLPATTERN_PREFIX env variable
|
||||||
|
["/api/controller/", "https://localhost", "/api/controller/v2/"],
|
||||||
|
["/api/controller", "https://localhost", "/api/controller/v2/"],
|
||||||
|
["api/controller", "https://localhost", "/api/controller/v2/"],
|
||||||
|
["/custom/path/", "https://localhost", "/custom/path/v2/"],
|
||||||
|
],
|
||||||
|
)
|
||||||
|
def test_controller_awxkit_get_api_v2_object(collection_import, env_prefix, controller_host, expected):
|
||||||
|
controller_awxkit_class = collection_import('plugins.module_utils.awxkit').ControllerAWXKitModule
|
||||||
|
controller_awxkit = controller_awxkit_class(argument_spec={}, direct_params=dict(controller_host=controller_host))
|
||||||
|
with mock.patch('plugins.module_utils.awxkit.get_registered_page', mock_get_registered_page):
|
||||||
|
if env_prefix:
|
||||||
|
with mock.patch.dict(os.environ, {"CONTROLLER_OPTIONAL_API_URLPATTERN_PREFIX": env_prefix}):
|
||||||
|
api_v2_object = controller_awxkit.get_api_v2_object()
|
||||||
|
else:
|
||||||
|
api_v2_object = controller_awxkit.get_api_v2_object()
|
||||||
|
assert getattr(api_v2_object, 'prefix') == expected
|
||||||
Reference in New Issue
Block a user