mirror of
https://github.com/ansible/awx.git
synced 2026-02-24 06:26:00 -03:30
Added env variable CONTROLLER_HOST, et al. Add awx.awx namespace to the runtime.yml redirects, and added templating task to change to ansible.controller
This commit is contained in:
@@ -39,93 +39,93 @@ plugin_routing:
|
|||||||
redirect: awx.awx.schedule_rrule
|
redirect: awx.awx.schedule_rrule
|
||||||
modules:
|
modules:
|
||||||
tower_job_list:
|
tower_job_list:
|
||||||
redirect: job_list
|
redirect: awx.awx.job_list
|
||||||
tower_job_launch:
|
tower_job_launch:
|
||||||
redirect: job_launch
|
redirect: awx.awx.job_launch
|
||||||
tower_workflow_job_template:
|
tower_workflow_job_template:
|
||||||
redirect: workflow_job_template
|
redirect: awx.awx.workflow_job_template
|
||||||
tower_team:
|
tower_team:
|
||||||
redirect: team
|
redirect: awx.awx.team
|
||||||
tower_job_wait:
|
tower_job_wait:
|
||||||
redirect: job_wait
|
redirect: awx.awx.job_wait
|
||||||
tower_application:
|
tower_application:
|
||||||
redirect: application
|
redirect: awx.awx.application
|
||||||
tower_ad_hoc_command_wait:
|
tower_ad_hoc_command_wait:
|
||||||
redirect: ad_hoc_command_wait
|
redirect: awx.awx.ad_hoc_command_wait
|
||||||
tower_credential:
|
tower_credential:
|
||||||
redirect: credential
|
redirect: awx.awx.credential
|
||||||
tower_label:
|
tower_label:
|
||||||
redirect: label
|
redirect: awx.awx.label
|
||||||
tower_group:
|
tower_group:
|
||||||
redirect: group
|
redirect: awx.awx.group
|
||||||
tower_host:
|
tower_host:
|
||||||
redirect: host
|
redirect: awx.awx.host
|
||||||
tower_schedule:
|
tower_schedule:
|
||||||
redirect: schedule
|
redirect: awx.awx.schedule
|
||||||
tower_role:
|
tower_role:
|
||||||
redirect: role
|
redirect: awx.awx.role
|
||||||
tower_ad_hoc_command:
|
tower_ad_hoc_command:
|
||||||
redirect: ad_hoc_command
|
redirect: awx.awx.ad_hoc_command
|
||||||
tower_execution_environment:
|
tower_execution_environment:
|
||||||
redirect: execution_environment
|
redirect: awx.awx.execution_environment
|
||||||
tower_inventory_source_update:
|
tower_inventory_source_update:
|
||||||
redirect: inventory_source_update
|
redirect: awx.awx.inventory_source_update
|
||||||
tower_instance_group:
|
tower_instance_group:
|
||||||
redirect: instance_group
|
redirect: awx.awx.instance_group
|
||||||
tower_settings:
|
tower_settings:
|
||||||
redirect: settings
|
redirect: awx.awx.settings
|
||||||
tower_meta:
|
tower_meta:
|
||||||
redirect: controller_meta
|
redirect: awx.awx.controller_meta
|
||||||
tower_export:
|
tower_export:
|
||||||
redirect: export
|
redirect: awx.awx.export
|
||||||
tower_ad_hoc_command_cancel:
|
tower_ad_hoc_command_cancel:
|
||||||
redirect: ad_hoc_command_cancel
|
redirect: awx.awx.ad_hoc_command_cancel
|
||||||
tower_inventory_source:
|
tower_inventory_source:
|
||||||
redirect: inventory_source
|
redirect: awx.awx.inventory_source
|
||||||
tower_user:
|
tower_user:
|
||||||
redirect: user
|
redirect: awx.awx.user
|
||||||
tower_workflow_launch:
|
tower_workflow_launch:
|
||||||
redirect: workflow_launch
|
redirect: awx.awx.workflow_launch
|
||||||
tower_project:
|
tower_project:
|
||||||
redirect: project
|
redirect: awx.awx.project
|
||||||
tower_token:
|
tower_token:
|
||||||
redirect: token
|
redirect: awx.awx.token
|
||||||
tower_credential_type:
|
tower_credential_type:
|
||||||
redirect: credential_type
|
redirect: awx.awx.credential_type
|
||||||
tower_license:
|
tower_license:
|
||||||
redirect: license
|
redirect: awx.awx.license
|
||||||
tower_project_update:
|
tower_project_update:
|
||||||
redirect: project_update
|
redirect: awx.awx.project_update
|
||||||
tower_notification_template:
|
tower_notification_template:
|
||||||
redirect: notification_template
|
redirect: awx.awx.notification_template
|
||||||
tower_organization:
|
tower_organization:
|
||||||
redirect: organization
|
redirect: awx.awx.organization
|
||||||
tower_job_template:
|
tower_job_template:
|
||||||
redirect: job_template
|
redirect: awx.awx.job_template
|
||||||
tower_workflow_job_template_node:
|
tower_workflow_job_template_node:
|
||||||
redirect: workflow_job_template_node
|
redirect: awx.awx.workflow_job_template_node
|
||||||
tower_job_cancel:
|
tower_job_cancel:
|
||||||
redirect: job_cancel
|
redirect: awx.awx.job_cancel
|
||||||
tower_import:
|
tower_import:
|
||||||
redirect: import
|
redirect: awx.awx.import
|
||||||
tower_credential_input_source:
|
tower_credential_input_source:
|
||||||
redirect: credential_input_source
|
redirect: awx.awx.credential_input_source
|
||||||
tower_inventory:
|
tower_inventory:
|
||||||
redirect: inventory
|
redirect: awx.awx.inventory
|
||||||
tower_receive:
|
tower_receive:
|
||||||
redirect: receive
|
redirect: awx.awx.receive
|
||||||
deprecation:
|
deprecation:
|
||||||
removal_date: TBD
|
removal_date: TBD
|
||||||
warning_text: see plugin documentation for details
|
warning_text: see plugin documentation for details
|
||||||
tower_send:
|
tower_send:
|
||||||
redirect: send
|
redirect: awx.awx.send
|
||||||
deprecation:
|
deprecation:
|
||||||
removal_date: TBD
|
removal_date: TBD
|
||||||
warning_text: see plugin documentation for details
|
warning_text: see plugin documentation for details
|
||||||
tower_workflow_template:
|
tower_workflow_template:
|
||||||
redirect: workflow_template
|
redirect: awx.awx.workflow_template
|
||||||
deprecation:
|
deprecation:
|
||||||
removal_date: TBD
|
removal_date: TBD
|
||||||
warning_text: see plugin documentation for details
|
warning_text: see plugin documentation for details
|
||||||
tower_notification:
|
tower_notification:
|
||||||
redirect: notification_template
|
redirect: awx.awx.notification_template
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ def handle_error(**kwargs):
|
|||||||
|
|
||||||
class InventoryModule(BaseInventoryPlugin):
|
class InventoryModule(BaseInventoryPlugin):
|
||||||
NAME = 'awx.awx.controller' # REPLACE
|
NAME = 'awx.awx.controller' # REPLACE
|
||||||
# Stays backward compatible with tower inventory script.
|
# Stays backward compatible with the inventory script.
|
||||||
# If the user supplies '@tower_inventory' as path, the plugin will read from environment variables.
|
# If the user supplies '@tower_inventory' as path, the plugin will read from environment variables.
|
||||||
no_config_file_supplied = False
|
no_config_file_supplied = False
|
||||||
|
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ EXAMPLES = """
|
|||||||
|
|
||||||
- name: Load the UI settings specifying the connection info
|
- name: Load the UI settings specifying the connection info
|
||||||
set_fact:
|
set_fact:
|
||||||
controller_settings: "{{ lookup('awx.awx.controller_api', 'settings/ui' host='tower.example.com', username='admin', password=my_pass_var, verify_ssl=False) }}"
|
controller_settings: "{{ lookup('awx.awx.controller_api', 'settings/ui' host='controller.example.com', username='admin', password=my_pass_var, verify_ssl=False) }}"
|
||||||
|
|
||||||
- name: Report the usernames of all users with admin privs
|
- name: Report the usernames of all users with admin privs
|
||||||
debug:
|
debug:
|
||||||
|
|||||||
@@ -254,26 +254,28 @@ class ControllerAPIModule(ControllerModule):
|
|||||||
# In PY2 we get back an HTTPResponse object but PY2 is returning an addinfourl
|
# In PY2 we get back an HTTPResponse object but PY2 is returning an addinfourl
|
||||||
# First try to get the headers in PY3 format and then drop down to PY2.
|
# First try to get the headers in PY3 format and then drop down to PY2.
|
||||||
try:
|
try:
|
||||||
tower_type = response.getheader('X-API-Product-Name', None)
|
controller_type = response.getheader('X-API-Product-Name', None)
|
||||||
tower_version = response.getheader('X-API-Product-Version', None)
|
controller_version = response.getheader('X-API-Product-Version', None)
|
||||||
except Exception:
|
except Exception:
|
||||||
tower_type = response.info().getheader('X-API-Product-Name', None)
|
controller_type = response.info().getheader('X-API-Product-Name', None)
|
||||||
tower_version = response.info().getheader('X-API-Product-Version', None)
|
controller_version = response.info().getheader('X-API-Product-Version', None)
|
||||||
|
|
||||||
parsed_collection_version = Version(self._COLLECTION_VERSION).version
|
parsed_collection_version = Version(self._COLLECTION_VERSION).version
|
||||||
parsed_tower_version = Version(tower_version).version
|
parsed_controller_version = Version(controller_version).version
|
||||||
if tower_type == 'AWX':
|
if controller_type == 'AWX':
|
||||||
collection_compare_ver = parsed_collection_version[0]
|
collection_compare_ver = parsed_collection_version[0]
|
||||||
tower_compare_ver = parsed_tower_version[0]
|
controller_compare_ver = parsed_controller_version[0]
|
||||||
else:
|
else:
|
||||||
collection_compare_ver = "{0}.{1}".format(parsed_collection_version[0], parsed_collection_version[1])
|
collection_compare_ver = "{0}.{1}".format(parsed_collection_version[0], parsed_collection_version[1])
|
||||||
tower_compare_ver = '{0}.{1}'.format(parsed_tower_version[0], parsed_tower_version[1])
|
controller_compare_ver = '{0}.{1}'.format(parsed_controller_version[0], parsed_controller_version[1])
|
||||||
|
|
||||||
if self._COLLECTION_TYPE not in self.collection_to_version or self.collection_to_version[self._COLLECTION_TYPE] != tower_type:
|
if self._COLLECTION_TYPE not in self.collection_to_version or self.collection_to_version[self._COLLECTION_TYPE] != controller_type:
|
||||||
self.warn("You are using the {0} version of this collection but connecting to {1}".format(self._COLLECTION_TYPE, tower_type))
|
self.warn("You are using the {0} version of this collection but connecting to {1}".format(self._COLLECTION_TYPE, controller_type))
|
||||||
elif collection_compare_ver != tower_compare_ver:
|
elif collection_compare_ver != controller_compare_ver:
|
||||||
self.warn(
|
self.warn(
|
||||||
"You are running collection version {0} but connecting to {2} version {1}".format(self._COLLECTION_VERSION, tower_version, tower_type)
|
"You are running collection version {0} but connecting to {2} version {1}".format(
|
||||||
|
self._COLLECTION_VERSION, controller_version, controller_type
|
||||||
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
self.version_checked = True
|
self.version_checked = True
|
||||||
@@ -694,10 +696,10 @@ class ControllerAPIModule(ControllerModule):
|
|||||||
resp = he.read()
|
resp = he.read()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
resp = 'unknown {0}'.format(e)
|
resp = 'unknown {0}'.format(e)
|
||||||
self.warn('Failed to release tower token: {0}, response: {1}'.format(he, resp))
|
self.warn('Failed to release token: {0}, response: {1}'.format(he, resp))
|
||||||
except (Exception) as e:
|
except (Exception) as e:
|
||||||
# Sanity check: Did the server send back some kind of internal error?
|
# Sanity check: Did the server send back some kind of internal error?
|
||||||
self.warn('Failed to release tower token {0}: {1}'.format(self.oauth_token_id, e))
|
self.warn('Failed to release token {0}: {1}'.format(self.oauth_token_id, e))
|
||||||
|
|
||||||
def is_job_done(self, job_status):
|
def is_job_done(self, job_status):
|
||||||
if job_status in ['new', 'pending', 'waiting', 'running']:
|
if job_status in ['new', 'pending', 'waiting', 'running']:
|
||||||
|
|||||||
@@ -32,11 +32,11 @@ class ItemNotDefined(Exception):
|
|||||||
class ControllerModule(AnsibleModule):
|
class ControllerModule(AnsibleModule):
|
||||||
url = None
|
url = None
|
||||||
AUTH_ARGSPEC = dict(
|
AUTH_ARGSPEC = dict(
|
||||||
tower_host=dict(required=False, fallback=(env_fallback, ['TOWER_HOST'])),
|
tower_host=dict(required=False, fallback=(env_fallback, ['CONTROLLER_HOST', 'TOWER_HOST'])),
|
||||||
tower_username=dict(required=False, fallback=(env_fallback, ['TOWER_USERNAME'])),
|
tower_username=dict(required=False, fallback=(env_fallback, ['CONTROLLER_USERNAME', 'TOWER_USERNAME'])),
|
||||||
tower_password=dict(no_log=True, required=False, fallback=(env_fallback, ['TOWER_PASSWORD'])),
|
tower_password=dict(no_log=True, required=False, fallback=(env_fallback, ['CONTROLLER_PASSWORD', 'TOWER_PASSWORD'])),
|
||||||
validate_certs=dict(type='bool', aliases=['tower_verify_ssl'], required=False, fallback=(env_fallback, ['TOWER_VERIFY_SSL'])),
|
validate_certs=dict(type='bool', aliases=['tower_verify_ssl'], required=False, fallback=(env_fallback, ['CONTROLLER_VERIFY_SSL', 'TOWER_VERIFY_SSL'])),
|
||||||
tower_oauthtoken=dict(type='raw', no_log=True, required=False, fallback=(env_fallback, ['TOWER_OAUTH_TOKEN'])),
|
tower_oauthtoken=dict(type='raw', no_log=True, required=False, fallback=(env_fallback, ['CONTROLLER_OAUTH_TOKEN', 'TOWER_OAUTH_TOKEN'])),
|
||||||
tower_config_file=dict(type='path', required=False, default=None),
|
tower_config_file=dict(type='path', required=False, default=None),
|
||||||
)
|
)
|
||||||
short_params = {
|
short_params = {
|
||||||
|
|||||||
@@ -10,12 +10,12 @@ from requests.models import Response
|
|||||||
from unittest import mock
|
from unittest import mock
|
||||||
|
|
||||||
awx_name = 'AWX'
|
awx_name = 'AWX'
|
||||||
tower_name = 'Red Hat Automation Platform Controller'
|
controller_name = 'Red Hat Automation Platform Controller'
|
||||||
ping_version = '1.2.3'
|
ping_version = '1.2.3'
|
||||||
|
|
||||||
|
|
||||||
def getTowerheader(self, header_name, default):
|
def getTowerheader(self, header_name, default):
|
||||||
mock_headers = {'X-API-Product-Name': tower_name, 'X-API-Product-Version': ping_version}
|
mock_headers = {'X-API-Product-Name': controller_name, 'X-API-Product-Version': ping_version}
|
||||||
return mock_headers.get(header_name, default)
|
return mock_headers.get(header_name, default)
|
||||||
|
|
||||||
|
|
||||||
@@ -107,7 +107,7 @@ def test_version_warning_strictness_controller(collection_import, silence_warnin
|
|||||||
my_module._COLLECTION_TYPE = "controller"
|
my_module._COLLECTION_TYPE = "controller"
|
||||||
my_module.get_endpoint('ping')
|
my_module.get_endpoint('ping')
|
||||||
silence_warning.assert_called_once_with(
|
silence_warning.assert_called_once_with(
|
||||||
'You are running collection version {0} but connecting to {1} version {2}'.format(my_module._COLLECTION_VERSION, tower_name, ping_version)
|
'You are running collection version {0} but connecting to {1} version {2}'.format(my_module._COLLECTION_VERSION, controller_name, ping_version)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -695,7 +695,7 @@
|
|||||||
organization: Default
|
organization: Default
|
||||||
state: present
|
state: present
|
||||||
kind: tower
|
kind: tower
|
||||||
host: https://tower.example.org
|
host: https://controller.example.org
|
||||||
username: joe
|
username: joe
|
||||||
password: secret
|
password: secret
|
||||||
register: result
|
register: result
|
||||||
|
|||||||
@@ -90,7 +90,7 @@
|
|||||||
that:
|
that:
|
||||||
- "result is not changed"
|
- "result is not changed"
|
||||||
|
|
||||||
# Test behaviour common to all tower modules
|
# Test behaviour common to all controller modules
|
||||||
- name: Check that SSL is available and verify_ssl is enabled (task must fail)
|
- name: Check that SSL is available and verify_ssl is enabled (task must fail)
|
||||||
organization:
|
organization:
|
||||||
name: Default
|
name: Default
|
||||||
|
|||||||
@@ -34,6 +34,12 @@
|
|||||||
regexp: "^ NAME = 'awx.awx.controller' # REPLACE$"
|
regexp: "^ NAME = 'awx.awx.controller' # REPLACE$"
|
||||||
replace: " NAME = '{{ collection_namespace }}.{{ collection_package }}.controller' # REPLACE"
|
replace: " NAME = '{{ collection_namespace }}.{{ collection_package }}.controller' # REPLACE"
|
||||||
|
|
||||||
|
- name: Change runtime.yml redirect destinations
|
||||||
|
replace:
|
||||||
|
path: "{{ collection_path}}/meta/runtime.yml"
|
||||||
|
regexp: "redirect: awx.awx."
|
||||||
|
replace: "redirect: '{{ collection_namespace }}.{{ collection_package }}."
|
||||||
|
|
||||||
- name: get list of test files
|
- name: get list of test files
|
||||||
find:
|
find:
|
||||||
paths: "{{ collection_path }}/tests/integration/targets/"
|
paths: "{{ collection_path }}/tests/integration/targets/"
|
||||||
|
|||||||
Reference in New Issue
Block a user