From 131f5ff0186545adec19e0cfe0d342e2d2cbdec6 Mon Sep 17 00:00:00 2001 From: Bill Nottingham Date: Thu, 28 May 2020 12:17:46 -0400 Subject: [PATCH 01/43] Remove dev env futzing of supervisord.conf permissions If we just link it into the dev env, we don't need to copy it at startup, and we don't need write permissions on it. --- installer/roles/image_build/templates/Dockerfile.j2 | 1 - tools/docker-compose-cluster.yml | 3 +++ tools/docker-compose.yml | 1 + tools/docker-compose/bootstrap_development.sh | 1 - 4 files changed, 4 insertions(+), 2 deletions(-) diff --git a/installer/roles/image_build/templates/Dockerfile.j2 b/installer/roles/image_build/templates/Dockerfile.j2 index 7e8ffe0e05..8acc2c2e7b 100644 --- a/installer/roles/image_build/templates/Dockerfile.j2 +++ b/installer/roles/image_build/templates/Dockerfile.j2 @@ -220,7 +220,6 @@ RUN for dir in \ /vendor ; \ do mkdir -m 0775 -p $dir ; chmod g+rw $dir ; chgrp root $dir ; done && \ for file in \ - /etc/supervisord.conf \ /var/run/nginx.pid \ /venv/awx/lib/python3.6/site-packages/awx.egg-link ; \ do touch $file ; chmod g+rw $file ; done diff --git a/tools/docker-compose-cluster.yml b/tools/docker-compose-cluster.yml index 4dc7ef49ce..95f7f5aaa8 100644 --- a/tools/docker-compose-cluster.yml +++ b/tools/docker-compose-cluster.yml @@ -31,6 +31,7 @@ services: - "../:/awx_devel" - "./redis/redis_socket_ha_1:/var/run/redis/" - "./memcached/:/var/run/memcached" + - "./docker-compose/supervisor.conf:/etc/supervisord.conf" ports: - "5899-5999:5899-5999" awx-2: @@ -50,6 +51,7 @@ services: - "../:/awx_devel" - "./redis/redis_socket_ha_2:/var/run/redis/" - "./memcached/:/var/run/memcached" + - "./docker-compose/supervisor.conf:/etc/supervisord.conf" ports: - "7899-7999:7899-7999" awx-3: @@ -69,6 +71,7 @@ services: - "../:/awx_devel" - "./redis/redis_socket_ha_3:/var/run/redis/" - "./memcached/:/var/run/memcached" + - "./docker-compose/supervisor.conf:/etc/supervisord.conf" ports: - "8899-8999:8899-8999" redis_1: diff --git a/tools/docker-compose.yml b/tools/docker-compose.yml index a96c835c02..d4dee7f101 100644 --- a/tools/docker-compose.yml +++ b/tools/docker-compose.yml @@ -35,6 +35,7 @@ services: - "./redis/redis_socket_standalone:/var/run/redis/" - "./memcached/:/var/run/memcached" - "./rsyslog/:/var/lib/awx/rsyslog" + - "./docker-compose/supervisor.conf:/etc/supervisord.conf" privileged: true tty: true # A useful container that simply passes through log messages to the console diff --git a/tools/docker-compose/bootstrap_development.sh b/tools/docker-compose/bootstrap_development.sh index 00642d5528..095d3e0d04 100755 --- a/tools/docker-compose/bootstrap_development.sh +++ b/tools/docker-compose/bootstrap_development.sh @@ -20,7 +20,6 @@ else fi make awx-link -yes | cp -rf /awx_devel/tools/docker-compose/supervisor.conf /etc/supervisord.conf # AWX bootstrapping make version_file From 68568be23523ca0015d870e94564539672ecca52 Mon Sep 17 00:00:00 2001 From: nixocio Date: Thu, 28 May 2020 17:14:53 -0400 Subject: [PATCH 02/43] Add error feedback in Preview Step Add error feedback in Preview Step. closes: https://github.com/ansible/awx/issues/7016 --- .../LaunchPrompt/steps/PreviewStep.jsx | 49 ++++++++++++++----- .../LaunchPrompt/steps/PreviewStep.test.jsx | 7 +++ .../LaunchPrompt/steps/useCredentialsStep.jsx | 3 +- .../LaunchPrompt/steps/useInventoryStep.jsx | 3 +- .../steps/useOtherPromptsStep.jsx | 3 +- .../LaunchPrompt/steps/useSurveyStep.jsx | 3 +- .../src/components/LaunchPrompt/useSteps.js | 18 +++---- 7 files changed, 60 insertions(+), 26 deletions(-) diff --git a/awx/ui_next/src/components/LaunchPrompt/steps/PreviewStep.jsx b/awx/ui_next/src/components/LaunchPrompt/steps/PreviewStep.jsx index 835fbba18d..14e26f4d10 100644 --- a/awx/ui_next/src/components/LaunchPrompt/steps/PreviewStep.jsx +++ b/awx/ui_next/src/components/LaunchPrompt/steps/PreviewStep.jsx @@ -1,11 +1,29 @@ -import React from 'react'; +import React, { Fragment } from 'react'; +import styled from 'styled-components'; +import { ExclamationCircleIcon as PFExclamationCircleIcon } from '@patternfly/react-icons'; +import { Tooltip } from '@patternfly/react-core'; +import { t } from '@lingui/macro'; import { useFormikContext } from 'formik'; +import { withI18n } from '@lingui/react'; import yaml from 'js-yaml'; -import PromptDetail from '../../PromptDetail'; import mergeExtraVars, { maskPasswords } from '../mergeExtraVars'; import getSurveyValues from '../getSurveyValues'; +import PromptDetail from '../../PromptDetail'; -function PreviewStep({ resource, config, survey, formErrors }) { +const ExclamationCircleIcon = styled(PFExclamationCircleIcon)` + margin-left: 10px; + margin-top: -2px; +`; + +const ErrorMessageWrapper = styled.div` + align-items: center; + color: var(--pf-global--danger-color--200); + display: flex; + font-weight: var(--pf-global--FontWeight--bold); + margin-bottom: 10px; +`; + +function PreviewStep({ resource, config, survey, formErrors, i18n }) { const { values } = useFormikContext(); const surveyValues = getSurveyValues(values); @@ -29,21 +47,26 @@ function PreviewStep({ resource, config, survey, formErrors }) { } return ( - <> + + {formErrors.length > 0 && ( + + {i18n._(t`Some of the previous step(s) have errors`)} + + + + + )} - {formErrors && ( -
    - {Object.keys(formErrors).map( - field => `${field}: ${formErrors[field]}` - )} -
- )} - +
); } -export default PreviewStep; +export default withI18n()(PreviewStep); diff --git a/awx/ui_next/src/components/LaunchPrompt/steps/PreviewStep.test.jsx b/awx/ui_next/src/components/LaunchPrompt/steps/PreviewStep.test.jsx index 71a33b2fec..b596e866ea 100644 --- a/awx/ui_next/src/components/LaunchPrompt/steps/PreviewStep.test.jsx +++ b/awx/ui_next/src/components/LaunchPrompt/steps/PreviewStep.test.jsx @@ -24,6 +24,10 @@ const survey = { ], }; +const formErrors = { + inventory: 'An inventory must be selected', +}; + describe('PreviewStep', () => { test('should render PromptDetail', async () => { let wrapper; @@ -37,6 +41,7 @@ describe('PreviewStep', () => { survey_enabled: true, }} survey={survey} + formErrors={formErrors} /> ); @@ -62,6 +67,7 @@ describe('PreviewStep', () => { config={{ ask_limit_on_launch: true, }} + formErrors={formErrors} /> ); @@ -85,6 +91,7 @@ describe('PreviewStep', () => { config={{ ask_variables_on_launch: true, }} + formErrors={formErrors} /> ); diff --git a/awx/ui_next/src/components/LaunchPrompt/steps/useCredentialsStep.jsx b/awx/ui_next/src/components/LaunchPrompt/steps/useCredentialsStep.jsx index f63d85599b..85299a08c1 100644 --- a/awx/ui_next/src/components/LaunchPrompt/steps/useCredentialsStep.jsx +++ b/awx/ui_next/src/components/LaunchPrompt/steps/useCredentialsStep.jsx @@ -19,7 +19,8 @@ export default function useCredentialsStep( initialValues: getInitialValues(config, resource), validate, isReady: true, - error: null, + contentError: null, + formError: null, setTouched: setFieldsTouched => { setFieldsTouched({ credentials: true, diff --git a/awx/ui_next/src/components/LaunchPrompt/steps/useInventoryStep.jsx b/awx/ui_next/src/components/LaunchPrompt/steps/useInventoryStep.jsx index cd1deb76f7..aa8acbd6f6 100644 --- a/awx/ui_next/src/components/LaunchPrompt/steps/useInventoryStep.jsx +++ b/awx/ui_next/src/components/LaunchPrompt/steps/useInventoryStep.jsx @@ -27,7 +27,8 @@ export default function useInventoryStep(config, resource, visitedSteps, i18n) { initialValues: getInitialValues(config, resource), validate, isReady: true, - error: null, + contentError: null, + formError: stepErrors, setTouched: setFieldsTouched => { setFieldsTouched({ inventory: true, diff --git a/awx/ui_next/src/components/LaunchPrompt/steps/useOtherPromptsStep.jsx b/awx/ui_next/src/components/LaunchPrompt/steps/useOtherPromptsStep.jsx index 516238ca7a..1d33987c92 100644 --- a/awx/ui_next/src/components/LaunchPrompt/steps/useOtherPromptsStep.jsx +++ b/awx/ui_next/src/components/LaunchPrompt/steps/useOtherPromptsStep.jsx @@ -24,7 +24,8 @@ export default function useOtherPrompt(config, resource, visitedSteps, i18n) { initialValues: getInitialValues(config, resource), validate, isReady: true, - error: null, + contentError: null, + formError: stepErrors, setTouched: setFieldsTouched => { setFieldsTouched({ job_type: true, diff --git a/awx/ui_next/src/components/LaunchPrompt/steps/useSurveyStep.jsx b/awx/ui_next/src/components/LaunchPrompt/steps/useSurveyStep.jsx index 5ee623dd14..ac0fbe0c3c 100644 --- a/awx/ui_next/src/components/LaunchPrompt/steps/useSurveyStep.jsx +++ b/awx/ui_next/src/components/LaunchPrompt/steps/useSurveyStep.jsx @@ -54,7 +54,8 @@ export default function useSurveyStep(config, resource, visitedSteps, i18n) { validate, survey, isReady: !isLoading && !!survey, - error, + contentError: error, + formError: stepErrors, setTouched: setFieldsTouched => { if (!survey || !survey.spec) { return; diff --git a/awx/ui_next/src/components/LaunchPrompt/useSteps.js b/awx/ui_next/src/components/LaunchPrompt/useSteps.js index ed61a01804..e8519c58a4 100644 --- a/awx/ui_next/src/components/LaunchPrompt/useSteps.js +++ b/awx/ui_next/src/components/LaunchPrompt/useSteps.js @@ -13,14 +13,13 @@ export default function useSteps(config, resource, i18n) { useOtherPromptsStep(config, resource, visited, i18n), useSurveyStep(config, resource, visited, i18n), ]; + + const formErrorsContent = steps + .filter(s => s?.formError && Object.keys(s.formError).length > 0) + .map(({ formError }) => formError); + steps.push( - usePreviewStep( - config, - resource, - steps[3].survey, - {}, // TODO: formErrors ? - i18n - ) + usePreviewStep(config, resource, steps[3].survey, formErrorsContent, i18n) ); const pfSteps = steps.map(s => s.step).filter(s => s != null); @@ -31,8 +30,9 @@ export default function useSteps(config, resource, i18n) { }; }, {}); const isReady = !steps.some(s => !s.isReady); - const stepWithError = steps.find(s => s.error); - const contentError = stepWithError ? stepWithError.error : null; + + const stepWithError = steps.find(s => s.contentError); + const contentError = stepWithError ? stepWithError.contentError : null; const validate = values => { const errors = steps.reduce((acc, cur) => { From e3814c6f0fa1a2ab91ff828e0c9c95df7654d070 Mon Sep 17 00:00:00 2001 From: AlanCoding Date: Sun, 29 Mar 2020 21:39:51 -0400 Subject: [PATCH 03/43] Share inventory plugin auth code with modules refactor shared auth option definitions to repeat less --- awx_collection/plugins/inventory/tower.py | 78 ++++++++----------- .../plugins/module_utils/ansible_tower.py | 30 ------- .../plugins/module_utils/tower_api.py | 77 +++++++++++------- awx_collection/test/awx/test_module_utils.py | 15 +--- 4 files changed, 85 insertions(+), 115 deletions(-) diff --git a/awx_collection/plugins/inventory/tower.py b/awx_collection/plugins/inventory/tower.py index 7ed641eefc..0aca4af4a8 100644 --- a/awx_collection/plugins/inventory/tower.py +++ b/awx_collection/plugins/inventory/tower.py @@ -21,31 +21,23 @@ DOCUMENTATION = ''' are missing, this plugin will try to fill in missing arguments by reading from environment variables. - If reading configurations from environment variables, the path in the command must be @tower_inventory. options: - plugin: - description: the name of this plugin, it should always be set to 'tower' - for this plugin to recognize it as it's own. - env: - - name: ANSIBLE_INVENTORY_ENABLED - required: True - choices: ['tower'] host: description: The network address of your Ansible Tower host. - type: string env: - name: TOWER_HOST - required: True username: description: The user that you plan to use to access inventories on Ansible Tower. - type: string env: - name: TOWER_USERNAME - required: True password: description: The password for your Ansible Tower user. - type: string env: - name: TOWER_PASSWORD - required: True + oauth_token: + description: + - The Tower OAuth token to use. + env: + - name: TOWER_OAUTH_TOKEN inventory_id: description: - The ID of the Ansible Tower inventory that you wish to import. @@ -56,14 +48,14 @@ DOCUMENTATION = ''' env: - name: TOWER_INVENTORY required: True - validate_certs: - description: Specify whether Ansible should verify the SSL certificate of Ansible Tower host. + verify_ssl: + description: + - Specify whether Ansible should verify the SSL certificate of Ansible Tower host. + - Defaults to True, but this is handled by the shared module_utils code type: bool - default: True env: - name: TOWER_VERIFY_SSL - required: False - aliases: [ verify_ssl ] + aliases: [ validate_certs ] include_metadata: description: Make extra requests to provide all group vars with metadata about the source Ansible Tower host. type: bool @@ -99,7 +91,6 @@ inventory_id: the_ID_of_targeted_ansible_tower_inventory ''' import os -import re from ansible.module_utils import six from ansible.module_utils._text import to_text, to_native @@ -107,13 +98,11 @@ from ansible.errors import AnsibleParserError, AnsibleOptionsError from ansible.plugins.inventory import BaseInventoryPlugin from ansible.config.manager import ensure_type -from ..module_utils.ansible_tower import make_request, CollectionsParserError, Request +from ..module_utils.tower_api import TowerModule -# Python 2/3 Compatibility -try: - from urlparse import urljoin -except ImportError: - from urllib.parse import urljoin + +def handle_error(**kwargs): + raise AnsibleParserError(to_native(kwargs.get('msg'))) class InventoryModule(BaseInventoryPlugin): @@ -131,20 +120,25 @@ class InventoryModule(BaseInventoryPlugin): else: return False + def warn_callback(self, warning): + self.display.warning(warning) + def parse(self, inventory, loader, path, cache=True): super(InventoryModule, self).parse(inventory, loader, path) if not self.no_config_file_supplied and os.path.isfile(path): self._read_config_data(path) - # Read inventory from tower server. - # Note the environment variables will be handled automatically by InventoryManager. - tower_host = self.get_option('host') - if not re.match('(?:http|https)://', tower_host): - tower_host = 'https://{tower_host}'.format(tower_host=tower_host) - request_handler = Request(url_username=self.get_option('username'), - url_password=self.get_option('password'), - force_basic_auth=True, - validate_certs=self.get_option('validate_certs')) + # Defer processing of params to logic shared with the modules + module_params = {} + for plugin_param, module_param in TowerModule.short_params.items(): + opt_val = self.get_option(plugin_param) + if opt_val is not None: + module_params[module_param] = opt_val + + module = TowerModule( + argument_spec={}, direct_params=module_params, + error_callback=handle_error, warn_callback=self.warn_callback + ) # validate type of inventory_id because we allow two types as special case inventory_id = self.get_option('inventory_id') @@ -159,13 +153,11 @@ class InventoryModule(BaseInventoryPlugin): 'not integer, and cannot convert to string: {err}'.format(err=to_native(e)) ) inventory_id = inventory_id.replace('/', '') - inventory_url = '/api/v2/inventories/{inv_id}/script/?hostvars=1&towervars=1&all=1'.format(inv_id=inventory_id) - inventory_url = urljoin(tower_host, inventory_url) + inventory_url = '/api/v2/inventories/{inv_id}/script/'.format(inv_id=inventory_id) - try: - inventory = make_request(request_handler, inventory_url) - except CollectionsParserError as e: - raise AnsibleParserError(to_native(e)) + inventory = module.get_endpoint( + inventory_url, data={'hostvars': '1', 'towervars': '1', 'all': '1'} + )['json'] # To start with, create all the groups. for group_name in inventory: @@ -195,12 +187,8 @@ class InventoryModule(BaseInventoryPlugin): # Fetch extra variables if told to do so if self.get_option('include_metadata'): - config_url = urljoin(tower_host, '/api/v2/config/') - try: - config_data = make_request(request_handler, config_url) - except CollectionsParserError as e: - raise AnsibleParserError(to_native(e)) + config_data = module.get_endpoint('/api/v2/config/')['json'] server_data = {} server_data['license_type'] = config_data.get('license_info', {}).get('license_type', 'unknown') diff --git a/awx_collection/plugins/module_utils/ansible_tower.py b/awx_collection/plugins/module_utils/ansible_tower.py index c51b410127..17d6a38680 100644 --- a/awx_collection/plugins/module_utils/ansible_tower.py +++ b/awx_collection/plugins/module_utils/ansible_tower.py @@ -29,14 +29,9 @@ from __future__ import (absolute_import, division, print_function) __metaclass__ = type -import json import os import traceback -from ansible.module_utils._text import to_native -from ansible.module_utils.urls import urllib_error, ConnectionError, socket, httplib -from ansible.module_utils.urls import Request # noqa - TOWER_CLI_IMP_ERR = None try: import tower_cli.utils.exceptions as exc @@ -51,31 +46,6 @@ except ImportError: from ansible.module_utils.basic import AnsibleModule, missing_required_lib -class CollectionsParserError(Exception): - pass - - -def make_request(request_handler, tower_url): - ''' - Makes the request to given URL, handles errors, returns JSON - ''' - try: - response = request_handler.get(tower_url) - except (ConnectionError, urllib_error.URLError, socket.error, httplib.HTTPException) as e: - n_error_msg = 'Connection to remote host failed: {err}'.format(err=to_native(e)) - # If Tower gives a readable error message, display that message to the user. - if callable(getattr(e, 'read', None)): - n_error_msg += ' with message: {err_msg}'.format(err_msg=to_native(e.read())) - raise CollectionsParserError(n_error_msg) - - # Attempt to parse JSON. - try: - return json.loads(response.read()) - except (ValueError, TypeError) as e: - # If the JSON parse fails, print the ValueError - raise CollectionsParserError('Failed to parse json from host: {err}'.format(err=to_native(e))) - - def tower_auth_config(module): ''' `tower_auth_config` attempts to load the tower-cli.cfg file diff --git a/awx_collection/plugins/module_utils/tower_api.py b/awx_collection/plugins/module_utils/tower_api.py index f22f6ed511..5d4f221f4e 100644 --- a/awx_collection/plugins/module_utils/tower_api.py +++ b/awx_collection/plugins/module_utils/tower_api.py @@ -42,7 +42,21 @@ class TowerModule(AnsibleModule): 'tower': 'Red Hat Ansible Tower', } url = None - honorred_settings = ('host', 'username', 'password', 'verify_ssl', 'oauth_token') + AUTH_ARGSPEC = dict( + tower_host=dict(required=False, fallback=(env_fallback, ['TOWER_HOST'])), + tower_username=dict(required=False, fallback=(env_fallback, ['TOWER_USERNAME'])), + tower_password=dict(no_log=True, required=False, fallback=(env_fallback, ['TOWER_PASSWORD'])), + validate_certs=dict(type='bool', aliases=['tower_verify_ssl'], required=False, fallback=(env_fallback, ['TOWER_VERIFY_SSL'])), + tower_oauthtoken=dict(type='str', no_log=True, required=False, fallback=(env_fallback, ['TOWER_OAUTH_TOKEN'])), + tower_config_file=dict(type='path', required=False, default=None), + ) + short_params = { + 'host': 'tower_host', + 'username': 'tower_username', + 'password': 'tower_password', + 'verify_ssl': 'validate_certs', + 'oauth_token': 'tower_oauthtoken', + } host = '127.0.0.1' username = None password = None @@ -55,36 +69,32 @@ class TowerModule(AnsibleModule): config_name = 'tower_cli.cfg' ENCRYPTED_STRING = "$encrypted$" version_checked = False + error_callback = None + warn_callback = None - def __init__(self, argument_spec, **kwargs): - args = dict( - tower_host=dict(required=False, fallback=(env_fallback, ['TOWER_HOST'])), - tower_username=dict(required=False, fallback=(env_fallback, ['TOWER_USERNAME'])), - tower_password=dict(no_log=True, required=False, fallback=(env_fallback, ['TOWER_PASSWORD'])), - validate_certs=dict(type='bool', aliases=['tower_verify_ssl'], required=False, fallback=(env_fallback, ['TOWER_VERIFY_SSL'])), - tower_oauthtoken=dict(type='str', no_log=True, required=False, fallback=(env_fallback, ['TOWER_OAUTH_TOKEN'])), - tower_config_file=dict(type='path', required=False, default=None), - ) - args.update(argument_spec) + def __init__(self, argument_spec, direct_params=None, error_callback=None, warn_callback=None, **kwargs): + full_argspec = {} + full_argspec.update(TowerModule.AUTH_ARGSPEC) + full_argspec.update(argument_spec) kwargs['supports_check_mode'] = True + self.error_callback = error_callback + self.warn_callback = warn_callback + self.json_output = {'changed': False} - super(TowerModule, self).__init__(argument_spec=args, **kwargs) + if direct_params is not None: + self.params = direct_params + else: + super(TowerModule, self).__init__(argument_spec=full_argspec, **kwargs) self.load_config_files() # Parameters specified on command line will override settings in any config - if self.params.get('tower_host'): - self.host = self.params.get('tower_host') - if self.params.get('tower_username'): - self.username = self.params.get('tower_username') - if self.params.get('tower_password'): - self.password = self.params.get('tower_password') - if self.params.get('validate_certs') is not None: - self.verify_ssl = self.params.get('validate_certs') - if self.params.get('tower_oauthtoken'): - self.oauth_token = self.params.get('tower_oauthtoken') + for short_param, long_param in self.short_params.items(): + direct_value = self.params.get(long_param) + if direct_value is not None: + setattr(self, short_param, direct_value) # Perform some basic validation if not re.match('^https{0,1}://', self.host): @@ -116,10 +126,10 @@ class TowerModule(AnsibleModule): # If we have a specified tower config, load it if self.params.get('tower_config_file'): - duplicated_params = [] - for direct_field in ('tower_host', 'tower_username', 'tower_password', 'validate_certs', 'tower_oauthtoken'): - if self.params.get(direct_field): - duplicated_params.append(direct_field) + duplicated_params = [ + fn for fn in self.AUTH_ARGSPEC + if fn != 'tower_config_file' and self.params.get(fn) is not None + ] if duplicated_params: self.warn(( 'The parameter(s) {0} were provided at the same time as tower_config_file. ' @@ -184,7 +194,7 @@ class TowerModule(AnsibleModule): # If we made it here then we have values from reading the ini file, so let's pull them out into a dict config_data = {} - for honorred_setting in self.honorred_settings: + for honorred_setting in self.short_params: try: config_data[honorred_setting] = config.get('general', honorred_setting) except NoOptionError: @@ -197,7 +207,7 @@ class TowerModule(AnsibleModule): raise ConfigFileException("An unknown exception occured trying to load config file: {0}".format(e)) # If we made it here, we have a dict which has values in it from our config, any final settings logic can be performed here - for honorred_setting in self.honorred_settings: + for honorred_setting in self.short_params: if honorred_setting in config_data: # Veriffy SSL must be a boolean if honorred_setting == 'verify_ssl': @@ -748,13 +758,22 @@ class TowerModule(AnsibleModule): def fail_json(self, **kwargs): # Try to log out if we are authenticated self.logout() - super(TowerModule, self).fail_json(**kwargs) + if self.error_callback: + self.error_callback(**kwargs) + else: + super(TowerModule, self).fail_json(**kwargs) def exit_json(self, **kwargs): # Try to log out if we are authenticated self.logout() super(TowerModule, self).exit_json(**kwargs) + def warn(self, warning): + if self.warn_callback is not None: + self.warn_callback(warning) + else: + super(TowerModule, self).warn(warning) + def is_job_done(self, job_status): if job_status in ['new', 'pending', 'waiting', 'running']: return False diff --git a/awx_collection/test/awx/test_module_utils.py b/awx_collection/test/awx/test_module_utils.py index 3c3cdf61c8..c7238d8c98 100644 --- a/awx_collection/test/awx/test_module_utils.py +++ b/awx_collection/test/awx/test_module_utils.py @@ -71,21 +71,14 @@ def test_duplicate_config(collection_import, silence_warning): 'tower_config_file': 'my_config' } - class DuplicateTestTowerModule(TowerModule): - def load_config(self, config_path): - assert config_path == 'my_config' - - def _load_params(self): - self.params = data - - cli_data = {'ANSIBLE_MODULE_ARGS': data} - testargs = ['module_file.py', json.dumps(cli_data)] - with mock.patch.object(sys, 'argv', testargs): + with mock.patch.object(TowerModule, 'load_config') as mock_load: argument_spec = dict( name=dict(required=True), zig=dict(type='str'), ) - DuplicateTestTowerModule(argument_spec=argument_spec) + TowerModule(argument_spec=argument_spec, direct_params=data) + assert mock_load.mock_calls[-1] == mock.call('my_config') + silence_warning.assert_called_once_with( 'The parameter(s) tower_username were provided at the same time as ' 'tower_config_file. Precedence may be unstable, ' From 86f1ba984acfc8eb4e55cb1b65812fc940e7fa81 Mon Sep 17 00:00:00 2001 From: AlanCoding Date: Wed, 3 Jun 2020 08:44:11 -0400 Subject: [PATCH 04/43] Comply with updated Ansible sanity test rules --- awx_collection/plugins/doc_fragments/auth.py | 1 - awx_collection/plugins/inventory/tower.py | 2 -- .../plugins/lookup/tower_schedule_rrule.py | 1 - .../plugins/modules/tower_credential.py | 9 ++------- .../plugins/modules/tower_credential_type.py | 1 - awx_collection/plugins/modules/tower_group.py | 2 -- awx_collection/plugins/modules/tower_host.py | 2 -- .../plugins/modules/tower_inventory.py | 3 --- .../plugins/modules/tower_inventory_source.py | 3 --- .../plugins/modules/tower_job_cancel.py | 1 - .../plugins/modules/tower_job_launch.py | 6 ------ .../plugins/modules/tower_job_list.py | 1 - .../plugins/modules/tower_job_template.py | 17 ----------------- .../plugins/modules/tower_job_wait.py | 3 +-- awx_collection/plugins/modules/tower_label.py | 1 - awx_collection/plugins/modules/tower_license.py | 3 --- .../plugins/modules/tower_notification.py | 5 +++-- .../plugins/modules/tower_organization.py | 3 --- awx_collection/plugins/modules/tower_project.py | 6 ------ awx_collection/plugins/modules/tower_receive.py | 5 ++--- awx_collection/plugins/modules/tower_role.py | 1 - .../plugins/modules/tower_schedule.py | 1 - awx_collection/plugins/modules/tower_send.py | 5 ++--- .../plugins/modules/tower_settings.py | 2 -- awx_collection/plugins/modules/tower_team.py | 2 -- awx_collection/plugins/modules/tower_user.py | 1 - .../modules/tower_workflow_job_template.py | 1 - .../modules/tower_workflow_job_template_node.py | 1 - .../plugins/modules/tower_workflow_launch.py | 3 --- .../plugins/modules/tower_workflow_template.py | 8 ++------ awx_collection/tests/sanity/ignore-2.10.txt | 6 +++--- .../roles/generate/templates/tower_module.j2 | 3 +-- 32 files changed, 16 insertions(+), 93 deletions(-) diff --git a/awx_collection/plugins/doc_fragments/auth.py b/awx_collection/plugins/doc_fragments/auth.py index 3763fafd80..21e8d07482 100644 --- a/awx_collection/plugins/doc_fragments/auth.py +++ b/awx_collection/plugins/doc_fragments/auth.py @@ -33,7 +33,6 @@ options: - The Tower OAuth token to use. - If value not set, will try environment variable C(TOWER_OAUTH_TOKEN) and then config files type: str - version_added: "3.7" validate_certs: description: - Whether to allow insecure connections to Tower or AWX. diff --git a/awx_collection/plugins/inventory/tower.py b/awx_collection/plugins/inventory/tower.py index 7ed641eefc..48ef5643ac 100644 --- a/awx_collection/plugins/inventory/tower.py +++ b/awx_collection/plugins/inventory/tower.py @@ -12,7 +12,6 @@ DOCUMENTATION = ''' - Matthew Jones (@matburt) - Yunfan Zhang (@YunfanZhang42) short_description: Ansible dynamic inventory plugin for Ansible Tower. - version_added: "2.7" description: - Reads inventories from Ansible Tower. - Supports reading configuration from both YAML config file and environment variables. @@ -68,7 +67,6 @@ DOCUMENTATION = ''' description: Make extra requests to provide all group vars with metadata about the source Ansible Tower host. type: bool default: False - version_added: "2.8" ''' EXAMPLES = ''' diff --git a/awx_collection/plugins/lookup/tower_schedule_rrule.py b/awx_collection/plugins/lookup/tower_schedule_rrule.py index e34751d9ac..0af71b0000 100644 --- a/awx_collection/plugins/lookup/tower_schedule_rrule.py +++ b/awx_collection/plugins/lookup/tower_schedule_rrule.py @@ -6,7 +6,6 @@ __metaclass__ = type DOCUMENTATION = """ lookup: tower_schedule_rrule author: John Westcott IV (@john-westcott-iv) - version_added: "3.7" short_description: Generate an rrule string which can be used for Tower Schedules requirements: - pytz diff --git a/awx_collection/plugins/modules/tower_credential.py b/awx_collection/plugins/modules/tower_credential.py index 12a6e930ff..2ca50dea4d 100644 --- a/awx_collection/plugins/modules/tower_credential.py +++ b/awx_collection/plugins/modules/tower_credential.py @@ -17,7 +17,6 @@ DOCUMENTATION = ''' --- module: tower_credential author: "Wayne Witzel III (@wwitzel3)" -version_added: "2.3" short_description: create, update, or destroy Ansible Tower credential. description: - Create, update, or destroy Ansible Tower credentials. See @@ -45,7 +44,6 @@ options: description: - Name of credential type. - Will be preferred over kind - version_added: "2.10" type: str inputs: description: @@ -53,7 +51,6 @@ options: Credential inputs where the keys are var names used in templating. Refer to the Ansible Tower documentation for example syntax. - Any fields in this dict will take prescedence over any fields mentioned below (i.e. host, username, etc) - version_added: "2.9" type: dict user: description: @@ -124,7 +121,6 @@ options: description: - STS token for aws type. - Deprecated, please use inputs - version_added: "2.6" type: str secret: description: @@ -177,7 +173,6 @@ options: - This parameter is only valid if C(kind) is specified as C(vault). - Deprecated, please use inputs type: str - version_added: "2.8" state: description: - Desired state of the resource. @@ -360,9 +355,9 @@ def main(): # Deprication warnings for legacy_input in OLD_INPUT_NAMES: if module.params.get(legacy_input) is not None: - module.deprecate(msg='{0} parameter has been deprecated, please use inputs instead'.format(legacy_input), version="3.6") + module.deprecate(msg='{0} parameter has been deprecated, please use inputs instead'.format(legacy_input), version="ansible.tower:4.0.0") if kind: - module.deprecate(msg='The kind parameter has been deprecated, please use credential_type instead', version="3.6") + module.deprecate(msg='The kind parameter has been deprecated, please use credential_type instead', version="ansible.tower:4.0.0") cred_type_id = module.resolve_name_to_id('credential_types', credential_type if credential_type else KIND_CHOICES[kind]) if organization: diff --git a/awx_collection/plugins/modules/tower_credential_type.py b/awx_collection/plugins/modules/tower_credential_type.py index 57ae60c6c3..561ae78f5a 100644 --- a/awx_collection/plugins/modules/tower_credential_type.py +++ b/awx_collection/plugins/modules/tower_credential_type.py @@ -18,7 +18,6 @@ DOCUMENTATION = ''' --- module: tower_credential_type author: "Adrien Fleury (@fleu42)" -version_added: "2.7" short_description: Create, update, or destroy custom Ansible Tower credential type. description: - Create, update, or destroy Ansible Tower credential type. See diff --git a/awx_collection/plugins/modules/tower_group.py b/awx_collection/plugins/modules/tower_group.py index e8ce833cca..a64826eb88 100644 --- a/awx_collection/plugins/modules/tower_group.py +++ b/awx_collection/plugins/modules/tower_group.py @@ -17,7 +17,6 @@ DOCUMENTATION = ''' --- module: tower_group author: "Wayne Witzel III (@wwitzel3)" -version_added: "2.3" short_description: create, update, or destroy Ansible Tower group. description: - Create, update, or destroy Ansible Tower groups. See @@ -63,7 +62,6 @@ options: description: - A new name for this group (for renaming) type: str - version_added: "3.7" extends_documentation_fragment: awx.awx.auth ''' diff --git a/awx_collection/plugins/modules/tower_host.py b/awx_collection/plugins/modules/tower_host.py index 3cefc3bad6..cb4712a27c 100644 --- a/awx_collection/plugins/modules/tower_host.py +++ b/awx_collection/plugins/modules/tower_host.py @@ -16,7 +16,6 @@ ANSIBLE_METADATA = {'metadata_version': '1.1', DOCUMENTATION = ''' --- module: tower_host -version_added: "2.3" author: "Wayne Witzel III (@wwitzel3)" short_description: create, update, or destroy Ansible Tower host. description: @@ -32,7 +31,6 @@ options: description: - To use when changing a hosts's name. type: str - version_added: "3.7" description: description: - The description to use for the host. diff --git a/awx_collection/plugins/modules/tower_inventory.py b/awx_collection/plugins/modules/tower_inventory.py index bfada2596e..d0ced63048 100644 --- a/awx_collection/plugins/modules/tower_inventory.py +++ b/awx_collection/plugins/modules/tower_inventory.py @@ -16,7 +16,6 @@ ANSIBLE_METADATA = {'metadata_version': '1.1', DOCUMENTATION = ''' --- module: tower_inventory -version_added: "2.3" author: "Wayne Witzel III (@wwitzel3)" short_description: create, update, or destroy Ansible Tower inventory. description: @@ -46,12 +45,10 @@ options: - The kind field. Cannot be modified after created. default: "" choices: ["", "smart"] - version_added: "2.7" type: str host_filter: description: - The host_filter field. Only useful when C(kind=smart). - version_added: "2.7" type: str state: description: diff --git a/awx_collection/plugins/modules/tower_inventory_source.py b/awx_collection/plugins/modules/tower_inventory_source.py index c17751fa96..98d523837e 100644 --- a/awx_collection/plugins/modules/tower_inventory_source.py +++ b/awx_collection/plugins/modules/tower_inventory_source.py @@ -17,7 +17,6 @@ DOCUMENTATION = ''' --- module: tower_inventory_source author: "Adrien Fleury (@fleu42)" -version_added: "2.7" short_description: create, update, or destroy Ansible Tower inventory source. description: - Create, update, or destroy Ansible Tower inventory source. See @@ -32,7 +31,6 @@ options: description: - A new name for this assets (will rename the asset) type: str - version_added: "3.7" description: description: - The description to use for the inventory source. @@ -85,7 +83,6 @@ options: - Override vars in child groups and hosts with those from external source. type: bool custom_virtualenv: - version_added: "2.9" description: - Local absolute file path containing a custom Python virtualenv to use. type: str diff --git a/awx_collection/plugins/modules/tower_job_cancel.py b/awx_collection/plugins/modules/tower_job_cancel.py index c88ce3e935..5e82834f6c 100644 --- a/awx_collection/plugins/modules/tower_job_cancel.py +++ b/awx_collection/plugins/modules/tower_job_cancel.py @@ -17,7 +17,6 @@ DOCUMENTATION = ''' --- module: tower_job_cancel author: "Wayne Witzel III (@wwitzel3)" -version_added: "2.3" short_description: Cancel an Ansible Tower Job. description: - Cancel Ansible Tower jobs. See diff --git a/awx_collection/plugins/modules/tower_job_launch.py b/awx_collection/plugins/modules/tower_job_launch.py index 325e7fcfbd..f3447bf24c 100644 --- a/awx_collection/plugins/modules/tower_job_launch.py +++ b/awx_collection/plugins/modules/tower_job_launch.py @@ -17,7 +17,6 @@ DOCUMENTATION = ''' --- module: tower_job_launch author: "Wayne Witzel III (@wwitzel3)" -version_added: "2.3" short_description: Launch an Ansible Job. description: - Launch an Ansible Tower jobs. See @@ -64,29 +63,24 @@ options: - A specific of the SCM project to run the template on. - This is only applicable if your project allows for branch override. type: str - version_added: "3.7" skip_tags: description: - Specific tags to skip from the playbook. type: list elements: str - version_added: "3.7" verbosity: description: - Verbosity level for this job run type: int choices: [ 0, 1, 2, 3, 4, 5 ] - version_added: "3.7" diff_mode: description: - Show the changes made by Ansible tasks where supported type: bool - version_added: "3.7" credential_passwords: description: - Passwords for credentials which are set to prompt on launch type: dict - version_added: "3.7" extends_documentation_fragment: awx.awx.auth ''' diff --git a/awx_collection/plugins/modules/tower_job_list.py b/awx_collection/plugins/modules/tower_job_list.py index 9723fa774f..2ecfd9d98a 100644 --- a/awx_collection/plugins/modules/tower_job_list.py +++ b/awx_collection/plugins/modules/tower_job_list.py @@ -17,7 +17,6 @@ DOCUMENTATION = ''' --- module: tower_job_list author: "Wayne Witzel III (@wwitzel3)" -version_added: "2.3" short_description: List Ansible Tower jobs. description: - List Ansible Tower jobs. See diff --git a/awx_collection/plugins/modules/tower_job_template.py b/awx_collection/plugins/modules/tower_job_template.py index 946ffdf5e5..b1e143e3bd 100644 --- a/awx_collection/plugins/modules/tower_job_template.py +++ b/awx_collection/plugins/modules/tower_job_template.py @@ -17,7 +17,6 @@ DOCUMENTATION = ''' --- module: tower_job_template author: "Wayne Witzel III (@wwitzel3)" -version_added: "2.3" short_description: create, update, or destroy Ansible Tower job templates. description: - Create, update, or destroy Ansible Tower job templates. See @@ -57,19 +56,16 @@ options: description: - Name of the credential to use for the job template. - Deprecated, use 'credentials'. - version_added: 2.7 type: str credentials: description: - List of credentials to use for the job template. type: list elements: str - version_added: 2.8 vault_credential: description: - Name of the vault credential to use for the job template. - Deprecated, use 'credentials'. - version_added: 2.7 type: str forks: description: @@ -89,7 +85,6 @@ options: description: - Specify C(extra_vars) for the template. type: dict - version_added: 3.7 job_tags: description: - Comma separated list of the tags to use for the job template. @@ -97,7 +92,6 @@ options: force_handlers: description: - Enable forcing playbook handlers to run even if a task fails. - version_added: 2.7 type: bool default: 'no' aliases: @@ -109,12 +103,10 @@ options: start_at_task: description: - Start the playbook at the task matching this name. - version_added: 2.7 type: str diff_mode: description: - Enable diff mode for the job template. - version_added: 2.7 type: bool aliases: - diff_mode_enabled @@ -122,7 +114,6 @@ options: use_fact_cache: description: - Enable use of fact caching for the job template. - version_added: 2.7 type: bool default: 'no' aliases: @@ -139,7 +130,6 @@ options: ask_diff_mode_on_launch: description: - Prompt user to enable diff mode (show changes) to files when supported by modules. - version_added: 2.7 type: bool default: 'False' aliases: @@ -154,7 +144,6 @@ options: ask_limit_on_launch: description: - Prompt user for a limit on launch. - version_added: 2.7 type: bool default: 'False' aliases: @@ -169,7 +158,6 @@ options: ask_skip_tags_on_launch: description: - Prompt user for job tags to skip on launch. - version_added: 2.7 type: bool default: 'False' aliases: @@ -184,7 +172,6 @@ options: ask_verbosity_on_launch: description: - Prompt user to choose a verbosity level on launch. - version_added: 2.7 type: bool default: 'False' aliases: @@ -206,13 +193,11 @@ options: survey_enabled: description: - Enable a survey on the job template. - version_added: 2.7 type: bool default: 'no' survey_spec: description: - JSON/YAML dict formatted survey definition. - version_added: 2.8 type: dict become_enabled: description: @@ -222,7 +207,6 @@ options: allow_simultaneous: description: - Allow simultaneous runs of the job template. - version_added: 2.7 type: bool default: 'no' aliases: @@ -232,7 +216,6 @@ options: - Maximum time in seconds to wait for a job to finish (server-side). type: int custom_virtualenv: - version_added: "2.9" description: - Local absolute file path containing a custom Python virtualenv to use. type: str diff --git a/awx_collection/plugins/modules/tower_job_wait.py b/awx_collection/plugins/modules/tower_job_wait.py index 6e954db561..77a6977c5c 100644 --- a/awx_collection/plugins/modules/tower_job_wait.py +++ b/awx_collection/plugins/modules/tower_job_wait.py @@ -16,7 +16,6 @@ ANSIBLE_METADATA = {'metadata_version': '1.1', DOCUMENTATION = ''' --- module: tower_job_wait -version_added: "2.3" author: "Wayne Witzel III (@wwitzel3)" short_description: Wait for Ansible Tower job to finish. description: @@ -141,7 +140,7 @@ def main(): interval = abs((min_interval + max_interval) / 2) module.deprecate( msg="Min and max interval have been deprecated, please use interval instead; interval will be set to {0}".format(interval), - version="3.7" + version="ansible.tower:4.0.0" ) # Attempt to look up job based on the provided id diff --git a/awx_collection/plugins/modules/tower_label.py b/awx_collection/plugins/modules/tower_label.py index 0d3a5a2dad..d0820d93a8 100644 --- a/awx_collection/plugins/modules/tower_label.py +++ b/awx_collection/plugins/modules/tower_label.py @@ -17,7 +17,6 @@ DOCUMENTATION = ''' --- module: tower_label author: "Wayne Witzel III (@wwitzel3)" -version_added: "2.3" short_description: create, update, or destroy Ansible Tower labels. description: - Create, update, or destroy Ansible Tower labels. See diff --git a/awx_collection/plugins/modules/tower_license.py b/awx_collection/plugins/modules/tower_license.py index 8f3a806720..a1d9840d50 100644 --- a/awx_collection/plugins/modules/tower_license.py +++ b/awx_collection/plugins/modules/tower_license.py @@ -16,7 +16,6 @@ DOCUMENTATION = ''' --- module: tower_license author: "John Westcott IV (@john-westcott-iv)" -version_added: "2.9" short_description: Set the license for Ansible Tower description: - Get or Set Ansible Tower license. See @@ -27,13 +26,11 @@ options: - The contents of the license file required: True type: dict - version_added: "3.7" eula_accepted: description: - Whether or not the EULA is accepted. required: True type: bool - version_added: "3.7" extends_documentation_fragment: awx.awx.auth ''' diff --git a/awx_collection/plugins/modules/tower_notification.py b/awx_collection/plugins/modules/tower_notification.py index c4bfda164c..bfe672a50e 100644 --- a/awx_collection/plugins/modules/tower_notification.py +++ b/awx_collection/plugins/modules/tower_notification.py @@ -17,7 +17,6 @@ DOCUMENTATION = ''' --- module: tower_notification author: "Samuel Carpentier (@samcarpentier)" -version_added: "2.8" short_description: create, update, or destroy Ansible Tower notification. description: - Create, update, or destroy Ansible Tower notifications. See @@ -371,7 +370,9 @@ def main(): # Deprecation warnings for all other params for legacy_input in OLD_INPUT_NAMES: if module.params.get(legacy_input) is not None: - module.deprecate(msg='{0} parameter has been deprecated, please use notification_configuration instead'.format(legacy_input), version="3.6") + module.deprecate( + msg='{0} parameter has been deprecated, please use notification_configuration instead'.format(legacy_input), + version="ansible.tower:4.0.0") # Attempt to look up the related items the user specified (these will fail the module if not found) organization_id = None diff --git a/awx_collection/plugins/modules/tower_organization.py b/awx_collection/plugins/modules/tower_organization.py index 71238e1681..fbbbf2885c 100644 --- a/awx_collection/plugins/modules/tower_organization.py +++ b/awx_collection/plugins/modules/tower_organization.py @@ -16,7 +16,6 @@ ANSIBLE_METADATA = {'metadata_version': '1.1', DOCUMENTATION = ''' --- module: tower_organization -version_added: "2.3" author: "Wayne Witzel III (@wwitzel3)" short_description: create, update, or destroy Ansible Tower organizations description: @@ -33,7 +32,6 @@ options: - The description to use for the organization. type: str custom_virtualenv: - version_added: "2.9" description: - Local absolute file path containing a custom Python virtualenv to use. type: str @@ -43,7 +41,6 @@ options: - The max hosts allowed in this organizations default: "0" type: int - version_added: "3.7" state: description: - Desired state of the resource. diff --git a/awx_collection/plugins/modules/tower_project.py b/awx_collection/plugins/modules/tower_project.py index 5ef35539e8..12f9e2809c 100644 --- a/awx_collection/plugins/modules/tower_project.py +++ b/awx_collection/plugins/modules/tower_project.py @@ -17,7 +17,6 @@ DOCUMENTATION = ''' --- module: tower_project author: "Wayne Witzel III (@wwitzel3)" -version_added: "2.3" short_description: create, update, or destroy Ansible Tower projects description: - Create, update, or destroy Ansible Tower projects. See @@ -56,7 +55,6 @@ options: - The refspec to use for the SCM resource. type: str default: '' - version_added: "3.7" scm_credential: description: - Name of the credential to use with this SCM resource. @@ -77,7 +75,6 @@ options: type: bool default: 'no' scm_update_cache_timeout: - version_added: "2.8" description: - Cache Timeout to cache prior project syncs for a certain number of seconds. Only valid if scm_update_on_launch is to True, otherwise ignored. @@ -87,17 +84,14 @@ options: description: - Allow changing the SCM branch or revision in a job template that uses this project. type: bool - version_added: "3.7" aliases: - scm_allow_override job_timeout: - version_added: "2.8" description: - The amount of time (in seconds) to run before the SCM Update is canceled. A value of 0 means no timeout. default: 0 type: int custom_virtualenv: - version_added: "2.8" description: - Local absolute file path containing a custom Python virtualenv to use type: str diff --git a/awx_collection/plugins/modules/tower_receive.py b/awx_collection/plugins/modules/tower_receive.py index bdce881ba7..b673e9b81d 100644 --- a/awx_collection/plugins/modules/tower_receive.py +++ b/awx_collection/plugins/modules/tower_receive.py @@ -17,11 +17,10 @@ DOCUMENTATION = ''' --- module: tower_receive deprecated: - removed_in: "3.7" + removed_in: "14.0.0" why: Deprecated in favor of upcoming C(_export) module. alternative: Once published, use M(tower_export) instead. author: "John Westcott IV (@john-westcott-iv)" -version_added: "2.8" short_description: Receive assets from Ansible Tower. description: - Receive assets from Ansible Tower. See @@ -166,7 +165,7 @@ def main(): module = TowerModule(argument_spec=argument_spec, supports_check_mode=False) - module.deprecate(msg="This module is deprecated and will be replaced by the AWX CLI export command.", version="3.7") + module.deprecate(msg="This module is deprecated and will be replaced by the AWX CLI export command.", version="awx.awx:14.0.0") if not HAS_TOWER_CLI: module.fail_json(msg='ansible-tower-cli required for this module') diff --git a/awx_collection/plugins/modules/tower_role.py b/awx_collection/plugins/modules/tower_role.py index 2b23a85004..4cba215b0a 100644 --- a/awx_collection/plugins/modules/tower_role.py +++ b/awx_collection/plugins/modules/tower_role.py @@ -16,7 +16,6 @@ ANSIBLE_METADATA = {'metadata_version': '1.1', DOCUMENTATION = ''' --- module: tower_role -version_added: "2.3" author: "Wayne Witzel III (@wwitzel3)" short_description: grant or revoke an Ansible Tower role. description: diff --git a/awx_collection/plugins/modules/tower_schedule.py b/awx_collection/plugins/modules/tower_schedule.py index b492a1654b..24f8468e4a 100644 --- a/awx_collection/plugins/modules/tower_schedule.py +++ b/awx_collection/plugins/modules/tower_schedule.py @@ -17,7 +17,6 @@ DOCUMENTATION = ''' --- module: tower_schedule author: "John Westcott IV (@john-westcott-iv)" -version_added: "2.3" short_description: create, update, or destroy Ansible Tower schedules. description: - Create, update, or destroy Ansible Tower schedules. See diff --git a/awx_collection/plugins/modules/tower_send.py b/awx_collection/plugins/modules/tower_send.py index 6747a27002..7ac60ece59 100644 --- a/awx_collection/plugins/modules/tower_send.py +++ b/awx_collection/plugins/modules/tower_send.py @@ -17,11 +17,10 @@ DOCUMENTATION = ''' --- module: tower_send deprecated: - removed_in: "3.7" + removed_in: "14.0.0" why: Deprecated in favor of upcoming C(_import) module. alternative: Once published, use M(tower_import) instead. author: "John Westcott IV (@john-westcott-iv)" -version_added: "2.8" short_description: Send assets to Ansible Tower. description: - Send assets to Ansible Tower. See @@ -106,7 +105,7 @@ def main(): module = TowerModule(argument_spec=argument_spec, supports_check_mode=False) - module.deprecate(msg="This module is deprecated and will be replaced by the AWX CLI import command", version="3.7") + module.deprecate(msg="This module is deprecated and will be replaced by the AWX CLI import command", version="awx.awx:14.0.0") if not HAS_TOWER_CLI: module.fail_json(msg='ansible-tower-cli required for this module') diff --git a/awx_collection/plugins/modules/tower_settings.py b/awx_collection/plugins/modules/tower_settings.py index b7ecde45ef..c706c4f0f9 100644 --- a/awx_collection/plugins/modules/tower_settings.py +++ b/awx_collection/plugins/modules/tower_settings.py @@ -17,7 +17,6 @@ DOCUMENTATION = ''' --- module: tower_settings author: "Nikhil Jain (@jainnikhil30)" -version_added: "2.7" short_description: Modify Ansible Tower settings. description: - Modify Ansible Tower settings. See @@ -37,7 +36,6 @@ options: description: - A data structure to be sent into the settings endpoint type: dict - version_added: "3.7" requirements: - pyyaml extends_documentation_fragment: awx.awx.auth diff --git a/awx_collection/plugins/modules/tower_team.py b/awx_collection/plugins/modules/tower_team.py index bb8a89d570..e1506b2425 100644 --- a/awx_collection/plugins/modules/tower_team.py +++ b/awx_collection/plugins/modules/tower_team.py @@ -17,7 +17,6 @@ DOCUMENTATION = ''' --- module: tower_team author: "Wayne Witzel III (@wwitzel3)" -version_added: "2.3" short_description: create, update, or destroy Ansible Tower team. description: - Create, update, or destroy Ansible Tower teams. See @@ -32,7 +31,6 @@ options: description: - To use when changing a team's name. type: str - version_added: "3.7" description: description: - The description to use for the team. diff --git a/awx_collection/plugins/modules/tower_user.py b/awx_collection/plugins/modules/tower_user.py index d710ed8a6d..7d049de016 100644 --- a/awx_collection/plugins/modules/tower_user.py +++ b/awx_collection/plugins/modules/tower_user.py @@ -17,7 +17,6 @@ DOCUMENTATION = ''' --- module: tower_user author: "John Westcott IV (@john-westcott-iv)" -version_added: "2.3" short_description: create, update, or destroy Ansible Tower users. description: - Create, update, or destroy Ansible Tower users. See diff --git a/awx_collection/plugins/modules/tower_workflow_job_template.py b/awx_collection/plugins/modules/tower_workflow_job_template.py index 402933461e..c3ad692af4 100644 --- a/awx_collection/plugins/modules/tower_workflow_job_template.py +++ b/awx_collection/plugins/modules/tower_workflow_job_template.py @@ -17,7 +17,6 @@ DOCUMENTATION = ''' --- module: tower_workflow_job_template author: "John Westcott IV (@john-westcott-iv)" -version_added: "2.3" short_description: create, update, or destroy Ansible Tower workflow job templates. description: - Create, update, or destroy Ansible Tower workflow job templates. diff --git a/awx_collection/plugins/modules/tower_workflow_job_template_node.py b/awx_collection/plugins/modules/tower_workflow_job_template_node.py index 65603effae..629badce37 100644 --- a/awx_collection/plugins/modules/tower_workflow_job_template_node.py +++ b/awx_collection/plugins/modules/tower_workflow_job_template_node.py @@ -17,7 +17,6 @@ DOCUMENTATION = ''' --- module: tower_workflow_job_template_node author: "John Westcott IV (@john-westcott-iv)" -version_added: "2.3" short_description: create, update, or destroy Ansible Tower workflow job template nodes. description: - Create, update, or destroy Ansible Tower workflow job template nodes. diff --git a/awx_collection/plugins/modules/tower_workflow_launch.py b/awx_collection/plugins/modules/tower_workflow_launch.py index 3551f211b4..8ef73d82fc 100644 --- a/awx_collection/plugins/modules/tower_workflow_launch.py +++ b/awx_collection/plugins/modules/tower_workflow_launch.py @@ -14,7 +14,6 @@ DOCUMENTATION = ''' --- module: tower_workflow_launch author: "John Westcott IV (@john-westcott-iv)" -version_added: "2.8" short_description: Run a workflow in Ansible Tower description: - Launch an Ansible Tower workflows. See @@ -32,7 +31,6 @@ options: - Organization the workflow job template exists in. - Used to help lookup the object, cannot be modified using this module. - If not provided, will lookup by name only, which does not work with duplicates. - required: False type: str inventory: description: @@ -47,7 +45,6 @@ options: - A specific branch of the SCM project to run the template on. - This is only applicable if your project allows for branch override. type: str - version_added: "3.7" extra_vars: description: - Any extra vars required to launch the job. diff --git a/awx_collection/plugins/modules/tower_workflow_template.py b/awx_collection/plugins/modules/tower_workflow_template.py index a1accfb453..9a652a4373 100644 --- a/awx_collection/plugins/modules/tower_workflow_template.py +++ b/awx_collection/plugins/modules/tower_workflow_template.py @@ -17,11 +17,10 @@ DOCUMENTATION = ''' --- module: tower_workflow_template deprecated: - removed_in: "3.7" + removed_in: "14.0.0" why: Deprecated in favor of C(_workflow_job_template) and C(_workflow_job_template_node) modules. alternative: Use M(tower_workflow_job_template) and M(_workflow_job_template_node) instead. author: "Adrien Fleury (@fleu42)" -version_added: "2.7" short_description: create, update, or destroy Ansible Tower workflow template. description: - A tower-cli based module for CRUD actions on workflow job templates. @@ -37,12 +36,10 @@ options: description: - Prompt user for (extra_vars) on launch. type: bool - version_added: "2.9" ask_inventory: description: - Prompt user for inventory on launch. type: bool - version_added: "2.9" description: description: - The description to use for the workflow. @@ -54,7 +51,6 @@ options: inventory: description: - Name of the inventory to use for the job template. - version_added: "2.9" type: str name: description: @@ -153,7 +149,7 @@ def main(): "This module is replaced by the combination of tower_workflow_job_template and " "tower_workflow_job_template_node. This uses the old tower-cli and wll be " "removed in 2022." - ), version='4.2.0') + ), version='awx.awx:14.0.0') name = module.params.get('name') state = module.params.get('state') diff --git a/awx_collection/tests/sanity/ignore-2.10.txt b/awx_collection/tests/sanity/ignore-2.10.txt index 9242eefca9..76f35a9a85 100644 --- a/awx_collection/tests/sanity/ignore-2.10.txt +++ b/awx_collection/tests/sanity/ignore-2.10.txt @@ -1,6 +1,6 @@ plugins/modules/tower_receive.py validate-modules:deprecation-mismatch -plugins/modules/tower_receive.py validate-modules:invalid-documentation plugins/modules/tower_send.py validate-modules:deprecation-mismatch -plugins/modules/tower_send.py validate-modules:invalid-documentation plugins/modules/tower_workflow_template.py validate-modules:deprecation-mismatch -plugins/modules/tower_workflow_template.py validate-modules:invalid-documentation +plugins/modules/tower_credential.py pylint:wrong-collection-deprecated-version-tag +plugins/modules/tower_job_wait.py pylint:wrong-collection-deprecated-version-tag +plugins/modules/tower_notification.py pylint:wrong-collection-deprecated-version-tag diff --git a/awx_collection/tools/roles/generate/templates/tower_module.j2 b/awx_collection/tools/roles/generate/templates/tower_module.j2 index 5d687bfc24..a9834db28d 100644 --- a/awx_collection/tools/roles/generate/templates/tower_module.j2 +++ b/awx_collection/tools/roles/generate/templates/tower_module.j2 @@ -24,7 +24,7 @@ DOCUMENTATION = ''' --- module: tower_{{ singular_item_type }} author: "John Westcott IV (@john-westcott-iv)" -version_added: "2.3" +version_added: "4.0" short_description: create, update, or destroy Ansible Tower {{ human_readable }}. description: - Create, update, or destroy Ansible Tower {{ human_readable }}. See @@ -87,7 +87,6 @@ options: - The Tower OAuth token to use. required: False type: str - version_added: "3.7" extends_documentation_fragment: awx.awx.auth ''' From 4657680f9ed01088f619d3352d9359a1a491c536 Mon Sep 17 00:00:00 2001 From: AlanCoding Date: Wed, 3 Jun 2020 11:42:56 -0400 Subject: [PATCH 05/43] Get sanity tests to work for ansible.tower and Ansible 2.10 --- awx_collection/tools/roles/template_galaxy/tasks/main.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/awx_collection/tools/roles/template_galaxy/tasks/main.yml b/awx_collection/tools/roles/template_galaxy/tasks/main.yml index 4f018d793b..4edd056f43 100644 --- a/awx_collection/tools/roles/template_galaxy/tasks/main.yml +++ b/awx_collection/tools/roles/template_galaxy/tasks/main.yml @@ -30,6 +30,13 @@ path: "{{ collection_path }}/plugins/inventory/tower.py" regexp: "^ NAME = 'awx.awx.tower' # REPLACE$" replace: " NAME = '{{ collection_namespace }}.{{ collection_package }}.tower' # REPLACE" + + - name: Get sanity tests to work with non-default name + lineinfile: + path: "{{ collection_path }}/tests/sanity/ignore-2.10.txt" + state: absent + regexp: ' pylint:wrong-collection-deprecated-version-tag$' + when: - (collection_package != 'awx') or (collection_namespace != 'awx') From 9c57f550ed8ffe9d52df1ff3919c4a52bc8ac8c7 Mon Sep 17 00:00:00 2001 From: nixocio Date: Wed, 3 Jun 2020 16:03:01 -0400 Subject: [PATCH 06/43] Modify JobTemplateForm to use formik `setValue` Modify JobTemplateForm to use formik `setValue`. Following the same convention used in the `.WorkflowJobTemplateForm`. Also, replace the usage of `useFormikContext` to `useField`. --- .../Template/shared/JobTemplateForm.jsx | 21 +++++++++---------- .../Template/shared/JobTemplateForm.test.jsx | 11 +++++++--- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/awx/ui_next/src/screens/Template/shared/JobTemplateForm.jsx b/awx/ui_next/src/screens/Template/shared/JobTemplateForm.jsx index c16f861eb8..7bd4409fde 100644 --- a/awx/ui_next/src/screens/Template/shared/JobTemplateForm.jsx +++ b/awx/ui_next/src/screens/Template/shared/JobTemplateForm.jsx @@ -2,7 +2,7 @@ import React, { useState, useEffect, useCallback } from 'react'; import PropTypes from 'prop-types'; import { withI18n } from '@lingui/react'; import { t } from '@lingui/macro'; -import { withFormik, useField, useFormikContext } from 'formik'; +import { withFormik, useField } from 'formik'; import { Form, FormGroup, @@ -52,8 +52,6 @@ function JobTemplateForm({ submitError, i18n, }) { - const { values: formikValues } = useFormikContext(); - const [contentError, setContentError] = useState(false); const [inventory, setInventory] = useState( template?.summary_fields?.inventory @@ -65,6 +63,7 @@ function JobTemplateForm({ Boolean(template.webhook_service) ); + const [askInventoryOnLaunchField] = useField('ask_inventory_on_launch'); const [jobTypeField, jobTypeMeta, jobTypeHelpers] = useField({ name: 'job_type', validate: required(null, i18n), @@ -81,7 +80,7 @@ function JobTemplateForm({ }); const [credentialField, , credentialHelpers] = useField('credentials'); const [labelsField, , labelsHelpers] = useField('labels'); - const [limitField, limitMeta] = useField('limit'); + const [limitField, limitMeta, limitHelpers] = useField('limit'); const [verbosityField] = useField('verbosity'); const [diffModeField, , diffModeHelpers] = useField('diff_mode'); const [instanceGroupsField, , instanceGroupsHelpers] = useField( @@ -231,7 +230,7 @@ function JobTemplateForm({ - {(inventoryMeta.touched || formikValues.ask_inventory_on_launch) && + {(inventoryMeta.touched || askInventoryOnLaunchField.value) && inventoryMeta.error && (
{ - scmField.onChange(event); + onChange={value => { + scmHelpers.setValue(value); }} /> @@ -383,8 +382,8 @@ function JobTemplateForm({ id="template-limit" {...limitField} isValid={!limitMeta.touched || !limitMeta.error} - onChange={(value, event) => { - limitField.onChange(event); + onChange={value => { + limitHelpers.setValue(value); }} /> diff --git a/awx/ui_next/src/screens/Template/shared/JobTemplateForm.test.jsx b/awx/ui_next/src/screens/Template/shared/JobTemplateForm.test.jsx index aef6f61c18..a373fefe37 100644 --- a/awx/ui_next/src/screens/Template/shared/JobTemplateForm.test.jsx +++ b/awx/ui_next/src/screens/Template/shared/JobTemplateForm.test.jsx @@ -29,6 +29,7 @@ describe('', () => { playbook: 'Baz', type: 'job_template', scm_branch: 'Foo', + limit: '5000', summary_fields: { inventory: { id: 2, @@ -184,9 +185,10 @@ describe('', () => { wrapper.update(); await act(async () => { - wrapper.find('input#template-scm-branch').simulate('change', { - target: { value: 'devel', name: 'scm_branch' }, - }); + wrapper.find('TextInputBase#template-scm-branch').prop('onChange')( + 'devel' + ); + wrapper.find('TextInputBase#template-limit').prop('onChange')(1234567890); wrapper.find('AnsibleSelect[name="playbook"]').simulate('change', { target: { value: 'new baz type', name: 'playbook' }, }); @@ -221,6 +223,9 @@ describe('', () => { expect(wrapper.find('input#template-scm-branch').prop('value')).toEqual( 'devel' ); + expect(wrapper.find('input#template-limit').prop('value')).toEqual( + 1234567890 + ); expect( wrapper.find('AnsibleSelect[name="playbook"]').prop('value') ).toEqual('new baz type'); From fdb53bd1afe285e5a87c9ecf896fbf8a7354c407 Mon Sep 17 00:00:00 2001 From: Jake McDermott Date: Wed, 3 Jun 2020 19:52:53 -0400 Subject: [PATCH 07/43] Remove unneeded auth props --- awx/ui_next/src/App.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/awx/ui_next/src/App.jsx b/awx/ui_next/src/App.jsx index e74edee190..ffafd07dba 100644 --- a/awx/ui_next/src/App.jsx +++ b/awx/ui_next/src/App.jsx @@ -55,12 +55,12 @@ function App() { {getRouteConfig(i18n) .flatMap(({ routes }) => routes) .map(({ path, screen: Screen }) => ( - + )) .concat( - + )} From 3fa3ddf04b35e5f8898631170d52177f6a80ed07 Mon Sep 17 00:00:00 2001 From: sean-m-sullivan Date: Thu, 4 Jun 2020 00:12:02 -0500 Subject: [PATCH 08/43] tower_job_template to use organizations --- .../plugins/modules/tower_job_template.py | 48 ++++++++++++++++--- 1 file changed, 41 insertions(+), 7 deletions(-) diff --git a/awx_collection/plugins/modules/tower_job_template.py b/awx_collection/plugins/modules/tower_job_template.py index 946ffdf5e5..37011a4502 100644 --- a/awx_collection/plugins/modules/tower_job_template.py +++ b/awx_collection/plugins/modules/tower_job_template.py @@ -45,6 +45,14 @@ options: description: - Name of the inventory to use for the job template. type: str + organization: + description: + - Organization the job template exists in. + - Used to help lookup the object, cannot be modified using this module. + - The Organization is inferred from the associated project + - If not provided, will lookup by name only, which does not work with duplicates. + type: str + version_added: 2.10 project: description: - Name of the project to use for the job template. @@ -299,6 +307,7 @@ EXAMPLES = ''' tower_job_template: name: "Ping" job_type: "run" + organization: "Default" inventory: "Local" project: "Demo" playbook: "ping.yml" @@ -329,6 +338,10 @@ from ..module_utils.tower_api import TowerModule import json +def versiontuple(v): + return tuple(map(int, (v.split(".")))) + + def update_survey(module, last_request): spec_endpoint = last_request.get('related', {}).get('survey_spec') if module.params.get('survey_spec') == {}: @@ -349,6 +362,7 @@ def main(): name=dict(required=True), new_name=dict(), description=dict(default=''), + organization=dict(), job_type=dict(choices=['run', 'check']), inventory=dict(), project=dict(), @@ -415,19 +429,26 @@ def main(): credentials = [] credentials.append(credential) + new_fields = {} + search_fields = {'name': name} + + # Attempt to look up the related items the user specified (these will fail the module if not found) + organization_id = None + organization = module.params.get('organization') + if organization: + organization_id = module.resolve_name_to_id('organizations', organization) + tower_version = module.get_endpoint('ping')['json']['version'] + if versiontuple(tower_version) >= versiontuple("3.7.0"): + search_fields['organization'] = new_fields['organization'] = organization_id + # Attempt to look up an existing item based on the provided data - existing_item = module.get_one('job_templates', **{ - 'data': { - 'name': name, - } - }) + existing_item = module.get_one('job_templates', **{'data': search_fields}) if state == 'absent': # If the state was absent we can let the module delete it if needed, the module will handle exiting from this module.delete_if_needed(existing_item) # Create the data that gets sent for create and update - new_fields = {} new_fields['name'] = new_name if new_name else name for field_name in ( 'description', 'job_type', 'playbook', 'scm_branch', 'forks', 'limit', 'verbosity', @@ -454,7 +475,20 @@ def main(): if inventory is not None: new_fields['inventory'] = module.resolve_name_to_id('inventories', inventory) if project is not None: - new_fields['project'] = module.resolve_name_to_id('projects', project) + if organization_id is not None: + project_data = module.get_one('projects', **{ + 'data': { + 'name': project, + 'organization': organization_id, + } + }) + if project_data is None: + module.fail_json(msg="The project {0} in organization {1} was not found on the Tower server".format( + project, organization + )) + new_fields['project'] = project_data['id'] + else: + new_fields['project'] = module.resolve_name_to_id('projects', project) if webhook_credential is not None: new_fields['webhook_credential'] = module.resolve_name_to_id('credentials', webhook_credential) From 4531c418e26f9b47fc1224d96b202b89c159132e Mon Sep 17 00:00:00 2001 From: AndrewCopeland Date: Thu, 4 Jun 2020 09:57:00 -0400 Subject: [PATCH 09/43] URL encode '/' to '%2F' for conjur credential plugin --- awx/main/credential_plugins/conjur.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/awx/main/credential_plugins/conjur.py b/awx/main/credential_plugins/conjur.py index 313b766bdc..718eebbc64 100644 --- a/awx/main/credential_plugins/conjur.py +++ b/awx/main/credential_plugins/conjur.py @@ -50,9 +50,9 @@ conjur_inputs = { def conjur_backend(**kwargs): url = kwargs['url'] api_key = kwargs['api_key'] - account = quote(kwargs['account']) - username = quote(kwargs['username']) - secret_path = quote(kwargs['secret_path']) + account = quote(kwargs['account'], safe='') + username = quote(kwargs['username'], safe='') + secret_path = quote(kwargs['secret_path'], safe='') version = kwargs.get('secret_version') cacert = kwargs.get('cacert', None) From ced8f42835fc917bcfa5bd757f135518c888fbac Mon Sep 17 00:00:00 2001 From: Jeff Bradberry Date: Thu, 4 Jun 2020 14:19:46 -0400 Subject: [PATCH 10/43] Force worker processes to have a different signal handler from the parent Situations have come up where the 5+ minute kill signal for run_task_manager is emitted to the worker process running it, but since the worker improperly inherited the AWXConsumerBase().stop() handler a deadlock ultimately was triggered on the database connection. --- awx/main/dispatch/worker/base.py | 1 + awx/main/scheduler/task_manager.py | 1 + 2 files changed, 2 insertions(+) diff --git a/awx/main/dispatch/worker/base.py b/awx/main/dispatch/worker/base.py index b0611676fa..7001cd9bb9 100644 --- a/awx/main/dispatch/worker/base.py +++ b/awx/main/dispatch/worker/base.py @@ -35,6 +35,7 @@ class WorkerSignalHandler: def __init__(self): self.kill_now = False + signal.signal(signal.SIGTERM, signal.SIG_DFL) signal.signal(signal.SIGINT, self.exit_gracefully) def exit_gracefully(self, *args, **kwargs): diff --git a/awx/main/scheduler/task_manager.py b/awx/main/scheduler/task_manager.py index 247f37544d..c16a1d1fa0 100644 --- a/awx/main/scheduler/task_manager.py +++ b/awx/main/scheduler/task_manager.py @@ -581,3 +581,4 @@ class TaskManager(): logger.debug("Starting Scheduler") with task_manager_bulk_reschedule(): self._schedule() + logger.debug("Finishing Scheduler") From 951f13c066202b0d0f82786511f15da57b7a405f Mon Sep 17 00:00:00 2001 From: Ryan Petrello Date: Thu, 4 Jun 2020 18:45:33 -0400 Subject: [PATCH 11/43] remove lgpg source for dependencies we've since removed --- docs/licenses/amqp-2.5.2.tar.gz | Bin 117788 -> 0 bytes docs/licenses/baron-0.6.6.tar.gz | Bin 38389 -> 0 bytes docs/licenses/redbaron-0.6.3.tar.gz | Bin 25595 -> 0 bytes docs/licenses/suds-0.4.tar.gz | Bin 104013 -> 0 bytes 4 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 docs/licenses/amqp-2.5.2.tar.gz delete mode 100644 docs/licenses/baron-0.6.6.tar.gz delete mode 100644 docs/licenses/redbaron-0.6.3.tar.gz delete mode 100644 docs/licenses/suds-0.4.tar.gz diff --git a/docs/licenses/amqp-2.5.2.tar.gz b/docs/licenses/amqp-2.5.2.tar.gz deleted file mode 100644 index 9ee574fa18a7582be5cc6edee157eaa5e455e06c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 117788 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 z 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 B62<@k diff --git a/docs/licenses/baron-0.6.6.tar.gz b/docs/licenses/baron-0.6.6.tar.gz deleted file mode 100644 index 524001e6ea64f825ad42e1e4c1716c8443437558..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38389 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 M53&KfBLKhy0G|^-dH?_b diff --git a/docs/licenses/redbaron-0.6.3.tar.gz b/docs/licenses/redbaron-0.6.3.tar.gz deleted file mode 100644 index 31611542e76544db962973134ce36f2c9085ae9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25595 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

    H#6T6txZmUr6WR<~@`Pt3FvVx$EZ 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 A?*IS* diff --git a/docs/licenses/suds-0.4.tar.gz b/docs/licenses/suds-0.4.tar.gz deleted file mode 100644 index 168d3673e9af03aadb47a2ab037a7099bf897460..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 104013 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%0A6NUpCH$~5i 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 Date: Wed, 3 Jun 2020 14:38:05 -0400 Subject: [PATCH 12/43] Adds message for unsynced projects for copy to clipboard button --- .../ClipboardCopyButton.jsx | 10 ++++++- .../ClipboardCopyButton.test.jsx | 13 ++++++++ .../Project/ProjectList/ProjectListItem.jsx | 23 +++++++++----- .../ProjectList/ProjectListItem.test.jsx | 30 +++++++++++++++++++ 4 files changed, 68 insertions(+), 8 deletions(-) diff --git a/awx/ui_next/src/components/ClipboardCopyButton/ClipboardCopyButton.jsx b/awx/ui_next/src/components/ClipboardCopyButton/ClipboardCopyButton.jsx index 8fcac00468..30367bff79 100644 --- a/awx/ui_next/src/components/ClipboardCopyButton/ClipboardCopyButton.jsx +++ b/awx/ui_next/src/components/ClipboardCopyButton/ClipboardCopyButton.jsx @@ -40,7 +40,13 @@ class ClipboardCopyButton extends React.Component { }; render() { - const { clickTip, entryDelay, exitDelay, hoverTip } = this.props; + const { + clickTip, + entryDelay, + exitDelay, + hoverTip, + isDisabled, + } = this.props; const { copied } = this.state; return ( @@ -51,6 +57,7 @@ class ClipboardCopyButton extends React.Component { content={copied ? clickTip : hoverTip} > @@ -70,10 +70,10 @@ class ClipboardCopyButton extends React.Component { } ClipboardCopyButton.propTypes = { - clickTip: PropTypes.string.isRequired, + copyTip: PropTypes.string.isRequired, entryDelay: PropTypes.number, exitDelay: PropTypes.number, - hoverTip: PropTypes.string.isRequired, + copiedSuccessTip: PropTypes.string.isRequired, stringToCopy: PropTypes.string.isRequired, switchDelay: PropTypes.number, isDisabled: PropTypes.bool.isRequired, diff --git a/awx/ui_next/src/screens/Project/ProjectList/ProjectListItem.jsx b/awx/ui_next/src/screens/Project/ProjectList/ProjectListItem.jsx index c5090dfa30..d5651a130e 100644 --- a/awx/ui_next/src/screens/Project/ProjectList/ProjectListItem.jsx +++ b/awx/ui_next/src/screens/Project/ProjectList/ProjectListItem.jsx @@ -128,14 +128,14 @@ function ProjectListItem({ {project.scm_revision.substring(0, 7)} {!project.scm_revision && ( )} , ]} diff --git a/awx/ui_next/src/screens/Project/ProjectList/ProjectListItem.test.jsx b/awx/ui_next/src/screens/Project/ProjectList/ProjectListItem.test.jsx index d833d58c27..7866015703 100644 --- a/awx/ui_next/src/screens/Project/ProjectList/ProjectListItem.test.jsx +++ b/awx/ui_next/src/screens/Project/ProjectList/ProjectListItem.test.jsx @@ -245,7 +245,7 @@ describe('', () => { ); expect( wrapper.find('span[aria-label="copy to clipboard disabled"]').text() - ).toBe('Sync to activate'); + ).toBe('Sync for revision'); expect(wrapper.find('ClipboardCopyButton').prop('isDisabled')).toBe(true); }); }); From 4de7de3ce9b92a546832edd8e8af97c20a4d2a0a Mon Sep 17 00:00:00 2001 From: John Westcott IV Date: Fri, 5 Jun 2020 13:29:37 -0400 Subject: [PATCH 14/43] Prevent exception for Non value --- awx_collection/plugins/modules/tower_settings.py | 4 ++++ .../tests/integration/targets/tower_settings/tasks/main.yml | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/awx_collection/plugins/modules/tower_settings.py b/awx_collection/plugins/modules/tower_settings.py index b7ecde45ef..a66acadf44 100644 --- a/awx_collection/plugins/modules/tower_settings.py +++ b/awx_collection/plugins/modules/tower_settings.py @@ -82,6 +82,10 @@ except ImportError: def coerce_type(module, value): + # If our value is already None we can just return directly + if value == None: + return value + yaml_ish = bool(( value.startswith('{') and value.endswith('}') ) or ( diff --git a/awx_collection/tests/integration/targets/tower_settings/tasks/main.yml b/awx_collection/tests/integration/targets/tower_settings/tasks/main.yml index a02ca673de..6cebe979e2 100644 --- a/awx_collection/tests/integration/targets/tower_settings/tasks/main.yml +++ b/awx_collection/tests/integration/targets/tower_settings/tasks/main.yml @@ -74,3 +74,9 @@ - assert: that: - "result is changed" + +- name: Handle an omit value + tower_settings: + name: AWX_PROOT_BASE_PATH + value: '{{ junk_var | default(omit) }}' + From e6416d770b75c37988f56bcef9d0f37d4c59b3a4 Mon Sep 17 00:00:00 2001 From: John Westcott IV Date: Thu, 21 May 2020 13:14:10 -0400 Subject: [PATCH 15/43] Initial cut at tower_token module --- .../plugins/module_utils/tower_api.py | 10 ++ awx_collection/plugins/modules/tower_token.py | 157 ++++++++++++++++++ awx_collection/test/awx/test_token.py | 28 ++++ .../targets/tower_token/tasks/main.yml | 25 +++ 4 files changed, 220 insertions(+) create mode 100644 awx_collection/plugins/modules/tower_token.py create mode 100644 awx_collection/test/awx/test_token.py create mode 100644 awx_collection/tests/integration/targets/tower_token/tasks/main.yml diff --git a/awx_collection/plugins/module_utils/tower_api.py b/awx_collection/plugins/module_utils/tower_api.py index 5d4f221f4e..f950829328 100644 --- a/awx_collection/plugins/module_utils/tower_api.py +++ b/awx_collection/plugins/module_utils/tower_api.py @@ -96,6 +96,13 @@ class TowerModule(AnsibleModule): if direct_value is not None: setattr(self, short_param, direct_value) + # Perform magic depending on whether tower_oauthtoken is a string or a dict + if self.params.get('tower_oauthtoken'): + if type(self.params.get('tower_oauthtoken')) is dict: + setattr(self, 'oauth_token', self.params.get('tower_oauthtoken')['token']) + elif 'token' in self.params.get('tower_oauthtoken'): + setattr(self, 'oauth_token', self.params.get('tower_oauthtoken')) + # Perform some basic validation if not re.match('^https{0,1}://', self.host): self.host = "https://{0}".format(self.host) @@ -504,6 +511,9 @@ class TowerModule(AnsibleModule): item_name = existing_item['username'] elif 'identifier' in existing_item: item_name = existing_item['identifier'] + elif item_type == 'o_auth2_access_token': + # An oauth2 token has no name, instead we will use its id for any of the messages + item_name = existing_item['id'] else: self.fail_json(msg="Unable to process delete of {0} due to missing name".format(item_type)) diff --git a/awx_collection/plugins/modules/tower_token.py b/awx_collection/plugins/modules/tower_token.py new file mode 100644 index 0000000000..7e229ac2c1 --- /dev/null +++ b/awx_collection/plugins/modules/tower_token.py @@ -0,0 +1,157 @@ +#!/usr/bin/python +# coding: utf-8 -*- + + +# (c) 2020, John Westcott IV +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +from __future__ import absolute_import, division, print_function +__metaclass__ = type + + +ANSIBLE_METADATA = {'metadata_version': '1.1', + 'status': ['preview'], + 'supported_by': 'community'} + +DOCUMENTATION = ''' +--- +module: tower_token +author: "John Westcott IV (@john-westcott-iv)" +version_added: "2.3" +short_description: create, update, or destroy Ansible Tower tokens. +description: + - Create, update, or destroy Ansible Tower tokens. See + U(https://www.ansible.com/tower) for an overview. +options: + description: + description: + - Optional description of this access token. + required: False + type: str + default: '' + application: + description: + - The application tied to this token. + required: False + type: str + scope: + description: + - Allowed scopes, further restricts user's permissions. Must be a simple space-separated string with allowed scopes ['read', 'write']. + required: False + type: str + default: 'write' + choices: ["read", "write"] + existing_token: + description: An existing token (for use with state absent) + type: dict + state: + description: + - Desired state of the resource. + choices: ["present", "absent"] + default: "present" + type: str + tower_oauthtoken: + description: + - The Tower OAuth token to use. + required: False + type: str + version_added: "3.7" +extends_documentation_fragment: awx.awx.auth +''' + +EXAMPLES = ''' +- name: Create a new token using an existing token + tower_token: + description: '{{ token_description }}' + scope: "write" + state: present + tower_oauthtoken: "{{ ny_existing_token }}" + register: new_token + +- name: Use our new token to make another call + tower_job_list: + tower_oauthtoken: "{{ tower_token }}" + +- name: Delete our Token with the token we created + tower_token: + existing_token: "{{ tower_token }}" + state: absent +''' + +RETURNS = ''' +tower_token: + type: dict + description: A Tower token object which can be used for auth or token deletion + returned: on successful create +''' + +from ..module_utils.tower_api import TowerModule + + +def return_token(module, last_response): + # A token is special because you can never get the actual token ID back from the API. + # So the default module return would give you an ID but then the token would forever be masked on you. + # This method will return the entire token object we got back so that a user has access to the token + + module.json_output['token'] = last_response['token'] + module.json_output['ansible_facts'] = { + 'tower_token': last_response, + } + module.exit_json(**module.json_output) + + +def main(): + # Any additional arguments that are not fields of the item can be added here + argument_spec = dict( + description=dict(), + application=dict(), + scope=dict(choices=['read', 'write'], default='write'), + existing_token=dict(type='dict'), + state=dict(choices=['present', 'absent'], default='present'), + ) + + # Create a module for ourselves + module = TowerModule(argument_spec=argument_spec) + + # Extract our parameters + description = module.params.get('description') + application = module.params.get('application') + scope = module.params.get('scope') + existing_token = module.params.get('existing_token') + state = module.params.get('state') + + with open('/tmp/john', 'w') as f: + f.write("State is {0}".format(state)) + + if state == 'absent': + with open('/tmp/john', 'a') as f: + f.write("Starting delete") + # If the state was absent we can let the module delete it if needed, the module will handle exiting from this + module.delete_if_needed(existing_token) + + # Attempt to look up the related items the user specified (these will fail the module if not found) + application_id = None + if application: + application_id = module.resolve_name_to_id('applications', application) + + # Create the data that gets sent for create and update + new_fields = {} + if description is not None: + new_fields['description'] = description + if application is not None: + new_fields['application'] = application_id + if scope is not None: + new_fields['scope'] = scope + + # If the state was present and we can let the module build or update the existing item, this will return on its own + module.create_or_update_if_needed( + None, new_fields, + endpoint='tokens', item_type='token', + associations={ + }, + on_create=return_token, + ) + + +if __name__ == '__main__': + main() diff --git a/awx_collection/test/awx/test_token.py b/awx_collection/test/awx/test_token.py new file mode 100644 index 0000000000..107a833af6 --- /dev/null +++ b/awx_collection/test/awx/test_token.py @@ -0,0 +1,28 @@ +from __future__ import (absolute_import, division, print_function) +__metaclass__ = type + +import pytest + +from awx.main.models import OAuth2AccessToken + + +@pytest.mark.django_db +def test_create_token(run_module, admin_user): + + module_args = { + 'description': 'barfoo', + 'state': 'present', + 'scope': 'read', + 'tower_host': None, + 'tower_username': None, + 'tower_password': None, + 'validate_certs': None, + 'tower_oauthtoken': None, + 'tower_config_file': None, + } + + result = run_module('tower_token', module_args, admin_user) + assert result, result.get('changed') + + tokens = OAuth2AccessToken.objects.filter(description='barfoo') + assert len(tokens) == 1, tokens[0].description == 'barfoo' diff --git a/awx_collection/tests/integration/targets/tower_token/tasks/main.yml b/awx_collection/tests/integration/targets/tower_token/tasks/main.yml new file mode 100644 index 0000000000..74fcd05237 --- /dev/null +++ b/awx_collection/tests/integration/targets/tower_token/tasks/main.yml @@ -0,0 +1,25 @@ +--- +- name: Generate names + set_fact: + token_description: "AWX-Collection-tests-tower_token-description-{{ lookup('password', '/dev/null chars=ascii_letters length=16') }}" + +- name: Create a Token + tower_token: + description: '{{ token_description }}' + scope: "write" + state: present + register: new_token + +- name: Validate our token works by token + tower_job_list: + tower_oauthtoken: "{{ tower_token.token }}" + +- name: Validate out token works by object + tower_job_list: + tower_oauthtoken: "{{ tower_token }}" + +- name: Delete our Token with our own token + tower_token: + existing_token: "{{ tower_token }}" + tower_oauthtoken: "{{ tower_token }}" + state: absent From e50c8fc9c9b4c37a0af17b525bc910a39f195366 Mon Sep 17 00:00:00 2001 From: John Westcott IV Date: Thu, 21 May 2020 14:10:14 -0400 Subject: [PATCH 16/43] Updated docs and added block on tests --- awx_collection/plugins/modules/tower_token.py | 33 +++++++++-------- .../targets/tower_token/tasks/main.yml | 37 ++++++++++--------- 2 files changed, 38 insertions(+), 32 deletions(-) diff --git a/awx_collection/plugins/modules/tower_token.py b/awx_collection/plugins/modules/tower_token.py index 7e229ac2c1..638b89cc6c 100644 --- a/awx_collection/plugins/modules/tower_token.py +++ b/awx_collection/plugins/modules/tower_token.py @@ -20,8 +20,9 @@ author: "John Westcott IV (@john-westcott-iv)" version_added: "2.3" short_description: create, update, or destroy Ansible Tower tokens. description: - - Create, update, or destroy Ansible Tower tokens. See + - Create or destroy Ansible Tower tokens. See U(https://www.ansible.com/tower) for an overview. + - If you create a token it is your responsibility to delete the token. options: description: description: @@ -60,22 +61,24 @@ extends_documentation_fragment: awx.awx.auth ''' EXAMPLES = ''' -- name: Create a new token using an existing token - tower_token: - description: '{{ token_description }}' - scope: "write" - state: present - tower_oauthtoken: "{{ ny_existing_token }}" - register: new_token +- block: + - name: Create a new token using an existing token + tower_token: + description: '{{ token_description }}' + scope: "write" + state: present + tower_oauthtoken: "{{ ny_existing_token }}" -- name: Use our new token to make another call - tower_job_list: - tower_oauthtoken: "{{ tower_token }}" + - name: Use our new token to make another call + tower_job_list: + tower_oauthtoken: "{{ tower_token }}" -- name: Delete our Token with the token we created - tower_token: - existing_token: "{{ tower_token }}" - state: absent + always: + - name: Delete our Token with the token we created + tower_token: + existing_token: "{{ tower_token }}" + state: absent + when: tower_token is defined ''' RETURNS = ''' diff --git a/awx_collection/tests/integration/targets/tower_token/tasks/main.yml b/awx_collection/tests/integration/targets/tower_token/tasks/main.yml index 74fcd05237..86edd620d7 100644 --- a/awx_collection/tests/integration/targets/tower_token/tasks/main.yml +++ b/awx_collection/tests/integration/targets/tower_token/tasks/main.yml @@ -3,23 +3,26 @@ set_fact: token_description: "AWX-Collection-tests-tower_token-description-{{ lookup('password', '/dev/null chars=ascii_letters length=16') }}" -- name: Create a Token - tower_token: - description: '{{ token_description }}' - scope: "write" - state: present - register: new_token +- block: + - name: Create a Token + tower_token: + description: '{{ token_description }}' + scope: "write" + state: present + register: new_token -- name: Validate our token works by token - tower_job_list: - tower_oauthtoken: "{{ tower_token.token }}" + - name: Validate our token works by token + tower_job_list: + tower_oauthtoken: "{{ tower_token.token }}" -- name: Validate out token works by object - tower_job_list: - tower_oauthtoken: "{{ tower_token }}" + - name: Validate out token works by object + tower_job_list: + tower_oauthtoken: "{{ tower_token }}" -- name: Delete our Token with our own token - tower_token: - existing_token: "{{ tower_token }}" - tower_oauthtoken: "{{ tower_token }}" - state: absent + always: + - name: Delete our Token with our own token + tower_token: + existing_token: "{{ tower_token }}" + tower_oauthtoken: "{{ tower_token }}" + state: absent + when: tower_token is defined From 6e9a43513ea9d5116ea6a3713231eca76e323e87 Mon Sep 17 00:00:00 2001 From: John Westcott IV Date: Thu, 21 May 2020 14:14:14 -0400 Subject: [PATCH 17/43] Removed some debugging and added an exmaple --- awx_collection/plugins/modules/tower_token.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/awx_collection/plugins/modules/tower_token.py b/awx_collection/plugins/modules/tower_token.py index 638b89cc6c..8689f1625d 100644 --- a/awx_collection/plugins/modules/tower_token.py +++ b/awx_collection/plugins/modules/tower_token.py @@ -69,6 +69,19 @@ EXAMPLES = ''' state: present tower_oauthtoken: "{{ ny_existing_token }}" + - name: Delete this token + tower_token: + existing_token: "{{ tower_token }}" + state: absent + + - name: Create a new token using username/password + tower_token: + description: '{{ token_description }}' + scope: "write" + state: present + tower_username: "{{ ny_username }}" + tower_password: "{{ ny_password }}" + - name: Use our new token to make another call tower_job_list: tower_oauthtoken: "{{ tower_token }}" @@ -123,12 +136,7 @@ def main(): existing_token = module.params.get('existing_token') state = module.params.get('state') - with open('/tmp/john', 'w') as f: - f.write("State is {0}".format(state)) - if state == 'absent': - with open('/tmp/john', 'a') as f: - f.write("Starting delete") # If the state was absent we can let the module delete it if needed, the module will handle exiting from this module.delete_if_needed(existing_token) From 1dbea4614ba4d29ab7535649fe5cef9704451fa0 Mon Sep 17 00:00:00 2001 From: John Westcott IV Date: Tue, 26 May 2020 12:30:43 -0400 Subject: [PATCH 18/43] Rebasing and fixing oauthtoken docs --- awx_collection/plugins/doc_fragments/auth.py | 3 ++- awx_collection/plugins/modules/tower_token.py | 6 ------ 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/awx_collection/plugins/doc_fragments/auth.py b/awx_collection/plugins/doc_fragments/auth.py index 21e8d07482..c4cc6fcc3f 100644 --- a/awx_collection/plugins/doc_fragments/auth.py +++ b/awx_collection/plugins/doc_fragments/auth.py @@ -32,7 +32,8 @@ options: description: - The Tower OAuth token to use. - If value not set, will try environment variable C(TOWER_OAUTH_TOKEN) and then config files - type: str + type: raw + version_added: "3.7" validate_certs: description: - Whether to allow insecure connections to Tower or AWX. diff --git a/awx_collection/plugins/modules/tower_token.py b/awx_collection/plugins/modules/tower_token.py index 8689f1625d..58990b783d 100644 --- a/awx_collection/plugins/modules/tower_token.py +++ b/awx_collection/plugins/modules/tower_token.py @@ -51,12 +51,6 @@ options: choices: ["present", "absent"] default: "present" type: str - tower_oauthtoken: - description: - - The Tower OAuth token to use. - required: False - type: str - version_added: "3.7" extends_documentation_fragment: awx.awx.auth ''' From 1a0407ba50c834800870eec1699566316e9f767a Mon Sep 17 00:00:00 2001 From: John Westcott IV Date: Mon, 1 Jun 2020 13:32:00 -0400 Subject: [PATCH 19/43] Fixing ny -> my typos --- awx_collection/plugins/modules/tower_token.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/awx_collection/plugins/modules/tower_token.py b/awx_collection/plugins/modules/tower_token.py index 58990b783d..68d5be87ac 100644 --- a/awx_collection/plugins/modules/tower_token.py +++ b/awx_collection/plugins/modules/tower_token.py @@ -61,7 +61,7 @@ EXAMPLES = ''' description: '{{ token_description }}' scope: "write" state: present - tower_oauthtoken: "{{ ny_existing_token }}" + tower_oauthtoken: "{{ my_existing_token }}" - name: Delete this token tower_token: @@ -73,8 +73,8 @@ EXAMPLES = ''' description: '{{ token_description }}' scope: "write" state: present - tower_username: "{{ ny_username }}" - tower_password: "{{ ny_password }}" + tower_username: "{{ my_username }}" + tower_password: "{{ my_password }}" - name: Use our new token to make another call tower_job_list: From 7c88a51992af7fdcc96a2370906c23ac755d6008 Mon Sep 17 00:00:00 2001 From: John Westcott IV Date: Mon, 1 Jun 2020 13:32:56 -0400 Subject: [PATCH 20/43] Adding more details about tower_oauthtoken parameter --- awx_collection/plugins/doc_fragments/auth.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/awx_collection/plugins/doc_fragments/auth.py b/awx_collection/plugins/doc_fragments/auth.py index c4cc6fcc3f..1e77a63b4b 100644 --- a/awx_collection/plugins/doc_fragments/auth.py +++ b/awx_collection/plugins/doc_fragments/auth.py @@ -31,6 +31,9 @@ options: tower_oauthtoken: description: - The Tower OAuth token to use. + - This value can be in one of two formats. + - A string which is the token itself. (i.e. bqV5txm97wqJqtkxlMkhQz0pKhRMMX) + - A dictionary structure as returned by the tower_token module. - If value not set, will try environment variable C(TOWER_OAUTH_TOKEN) and then config files type: raw version_added: "3.7" From 30346618f161ed9eefc1563d25b6924017f26c29 Mon Sep 17 00:00:00 2001 From: John Westcott IV Date: Mon, 1 Jun 2020 13:35:28 -0400 Subject: [PATCH 21/43] Adding more through testing of tower_oauthtoken including failure messages --- .../plugins/module_utils/tower_api.py | 16 ++++++++---- .../targets/tower_token/tasks/main.yml | 26 +++++++++++++++++++ 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/awx_collection/plugins/module_utils/tower_api.py b/awx_collection/plugins/module_utils/tower_api.py index f950829328..7c2f52d1ca 100644 --- a/awx_collection/plugins/module_utils/tower_api.py +++ b/awx_collection/plugins/module_utils/tower_api.py @@ -3,7 +3,7 @@ __metaclass__ = type from ansible.module_utils.basic import AnsibleModule, env_fallback from ansible.module_utils.urls import Request, SSLValidationError, ConnectionError -from ansible.module_utils.six import PY2 +from ansible.module_utils.six import PY2, string_types from ansible.module_utils.six.moves import StringIO from ansible.module_utils.six.moves.urllib.parse import urlparse, urlencode from ansible.module_utils.six.moves.urllib.error import HTTPError @@ -98,10 +98,16 @@ class TowerModule(AnsibleModule): # Perform magic depending on whether tower_oauthtoken is a string or a dict if self.params.get('tower_oauthtoken'): - if type(self.params.get('tower_oauthtoken')) is dict: - setattr(self, 'oauth_token', self.params.get('tower_oauthtoken')['token']) - elif 'token' in self.params.get('tower_oauthtoken'): - setattr(self, 'oauth_token', self.params.get('tower_oauthtoken')) + token_param = self.params.get('tower_oauthtoken') + if type(token_param) is dict: + if 'token' in token_param: + self.oauth_token = self.params.get('tower_oauthtoken')['token'] + else: + self.fail_json(msg="The provided dict in tower_oauthtoken did not properly contain the token entry") + elif isinstance(token_param, string_types): + self.oauth_token = self.params.get('tower_oauthtoken') + else: + self.fail_json(msg="The provided tower_oauthtoken type was not valid ({0}), please refer to ansible-doc for valid options".format(type(token_param).__name__)) # Perform some basic validation if not re.match('^https{0,1}://', self.host): diff --git a/awx_collection/tests/integration/targets/tower_token/tasks/main.yml b/awx_collection/tests/integration/targets/tower_token/tasks/main.yml index 86edd620d7..52e5bb41d8 100644 --- a/awx_collection/tests/integration/targets/tower_token/tasks/main.yml +++ b/awx_collection/tests/integration/targets/tower_token/tasks/main.yml @@ -3,6 +3,30 @@ set_fact: token_description: "AWX-Collection-tests-tower_token-description-{{ lookup('password', '/dev/null chars=ascii_letters length=16') }}" +- name: Try to use a token as a dict which is missing the token parameter + tower_job_list: + tower_oauthtoken: + not_token: "This has no token entry" + register: results + ignore_errors: True + +- assert: + that: + - results is failed + - '"The provided dict in tower_oauthtoken did not properly contain the token entry" == results.msg' + +- name: Try to use a token as a list + tower_job_list: + tower_oauthtoken: + - dummy_token + register: results + ignore_errors: True + +- assert: + that: + - results is failed + - '"The provided tower_oauthtoken type was not valid (list), please refer to ansible-doc for valid options" == results.msg' + - block: - name: Create a Token tower_token: @@ -14,10 +38,12 @@ - name: Validate our token works by token tower_job_list: tower_oauthtoken: "{{ tower_token.token }}" + register: job_list - name: Validate out token works by object tower_job_list: tower_oauthtoken: "{{ tower_token }}" + register: job_list always: - name: Delete our Token with our own token From 11da8e254d45ae65b6a71fb30192969ad121ff94 Mon Sep 17 00:00:00 2001 From: John Westcott IV Date: Tue, 2 Jun 2020 10:18:20 -0400 Subject: [PATCH 22/43] Changing documention and fixing sanity tests --- awx_collection/plugins/module_utils/tower_api.py | 3 ++- awx_collection/plugins/modules/tower_token.py | 14 ++++++++++---- .../integration/targets/tower_token/tasks/main.yml | 2 +- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/awx_collection/plugins/module_utils/tower_api.py b/awx_collection/plugins/module_utils/tower_api.py index 7c2f52d1ca..ca5a365e8e 100644 --- a/awx_collection/plugins/module_utils/tower_api.py +++ b/awx_collection/plugins/module_utils/tower_api.py @@ -107,7 +107,8 @@ class TowerModule(AnsibleModule): elif isinstance(token_param, string_types): self.oauth_token = self.params.get('tower_oauthtoken') else: - self.fail_json(msg="The provided tower_oauthtoken type was not valid ({0}), please refer to ansible-doc for valid options".format(type(token_param).__name__)) + error_msg = "The provided tower_oauthtoken type was not valid ({0}). Valid options are str or dict.".format(type(token_param).__name__) + self.fail_json(msg=error_msg) # Perform some basic validation if not re.match('^https{0,1}://', self.host): diff --git a/awx_collection/plugins/modules/tower_token.py b/awx_collection/plugins/modules/tower_token.py index 68d5be87ac..d620e7a18a 100644 --- a/awx_collection/plugins/modules/tower_token.py +++ b/awx_collection/plugins/modules/tower_token.py @@ -22,7 +22,10 @@ short_description: create, update, or destroy Ansible Tower tokens. description: - Create or destroy Ansible Tower tokens. See U(https://www.ansible.com/tower) for an overview. - - If you create a token it is your responsibility to delete the token. + - In addition, the module sets an Ansible fact which can be passed into other + tower_* modules as the parameter tower_oauthtoken. See examples for usage. + - Because of the sensitive nature of tokens, the created token value is only available once + through the Ansible fact. (See RETURN for details) options: description: description: @@ -88,10 +91,14 @@ EXAMPLES = ''' when: tower_token is defined ''' -RETURNS = ''' +RETURN = ''' tower_token: type: dict - description: A Tower token object which can be used for auth or token deletion + description: An Ansible Fact variable representing a Tower token object which can be used for auth in subsequent modules. See examples for usage. + contains: + token: + description: The token that was generated. This token can never be accessed again, make sure this value is noted before it is lost. + type: str returned: on successful create ''' @@ -103,7 +110,6 @@ def return_token(module, last_response): # So the default module return would give you an ID but then the token would forever be masked on you. # This method will return the entire token object we got back so that a user has access to the token - module.json_output['token'] = last_response['token'] module.json_output['ansible_facts'] = { 'tower_token': last_response, } diff --git a/awx_collection/tests/integration/targets/tower_token/tasks/main.yml b/awx_collection/tests/integration/targets/tower_token/tasks/main.yml index 52e5bb41d8..8874e21e22 100644 --- a/awx_collection/tests/integration/targets/tower_token/tasks/main.yml +++ b/awx_collection/tests/integration/targets/tower_token/tasks/main.yml @@ -25,7 +25,7 @@ - assert: that: - results is failed - - '"The provided tower_oauthtoken type was not valid (list), please refer to ansible-doc for valid options" == results.msg' + - '"The provided tower_oauthtoken type was not valid (list). Valid options are str or dict." == results.msg' - block: - name: Create a Token From 41d0548af67fce58c67037f32c084914e7c15aa7 Mon Sep 17 00:00:00 2001 From: John Westcott IV Date: Tue, 2 Jun 2020 13:07:11 -0400 Subject: [PATCH 23/43] Fixing truthy linting issue --- .../tests/integration/targets/tower_token/tasks/main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/awx_collection/tests/integration/targets/tower_token/tasks/main.yml b/awx_collection/tests/integration/targets/tower_token/tasks/main.yml index 8874e21e22..0ba32c19b6 100644 --- a/awx_collection/tests/integration/targets/tower_token/tasks/main.yml +++ b/awx_collection/tests/integration/targets/tower_token/tasks/main.yml @@ -8,7 +8,7 @@ tower_oauthtoken: not_token: "This has no token entry" register: results - ignore_errors: True + ignore_errors: true - assert: that: @@ -20,7 +20,7 @@ tower_oauthtoken: - dummy_token register: results - ignore_errors: True + ignore_errors: true - assert: that: From 5df08711e9e4ed891b15b76d17c75da85d9b2873 Mon Sep 17 00:00:00 2001 From: Jim Ladd Date: Fri, 5 Jun 2020 11:25:11 -0700 Subject: [PATCH 24/43] Bump foreman collection to 0.8.1 * New release includes: 'add host_filters and want_ansible_ssh_host like script used to have' --- requirements/collections_requirements.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/collections_requirements.yml b/requirements/collections_requirements.yml index 35ed989908..15b499d361 100644 --- a/requirements/collections_requirements.yml +++ b/requirements/collections_requirements.yml @@ -7,7 +7,7 @@ collections: - name: amazon.aws version: 0.1.1 # version 0.1.0 seems to have gone missing - name: theforeman.foreman - version: 0.8.0 + version: 0.8.1 - name: google.cloud version: 0.0.9 # contains PR 167, should be good to go - name: openstack.cloud From 0e54f76f801a43e5a4e8615b315e876cb7ac94fc Mon Sep 17 00:00:00 2001 From: John Westcott IV Date: Fri, 5 Jun 2020 16:10:26 -0400 Subject: [PATCH 25/43] Fixing missing raw from merge type --- awx_collection/plugins/module_utils/tower_api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/awx_collection/plugins/module_utils/tower_api.py b/awx_collection/plugins/module_utils/tower_api.py index ca5a365e8e..d836c457c0 100644 --- a/awx_collection/plugins/module_utils/tower_api.py +++ b/awx_collection/plugins/module_utils/tower_api.py @@ -47,7 +47,7 @@ class TowerModule(AnsibleModule): tower_username=dict(required=False, fallback=(env_fallback, ['TOWER_USERNAME'])), tower_password=dict(no_log=True, required=False, fallback=(env_fallback, ['TOWER_PASSWORD'])), validate_certs=dict(type='bool', aliases=['tower_verify_ssl'], required=False, fallback=(env_fallback, ['TOWER_VERIFY_SSL'])), - tower_oauthtoken=dict(type='str', no_log=True, required=False, fallback=(env_fallback, ['TOWER_OAUTH_TOKEN'])), + tower_oauthtoken=dict(type='raw', no_log=True, required=False, fallback=(env_fallback, ['TOWER_OAUTH_TOKEN'])), tower_config_file=dict(type='path', required=False, default=None), ) short_params = { From 1f17e02fe9988fe3139d1f6dd4d876c61ceebe76 Mon Sep 17 00:00:00 2001 From: John Westcott IV Date: Fri, 5 Jun 2020 16:11:26 -0400 Subject: [PATCH 26/43] Adding more documenation and added existing_token_id param --- awx_collection/plugins/modules/tower_token.py | 28 ++++++++++++- .../targets/tower_token/tasks/main.yml | 41 +++++++++++++++++++ 2 files changed, 68 insertions(+), 1 deletion(-) diff --git a/awx_collection/plugins/modules/tower_token.py b/awx_collection/plugins/modules/tower_token.py index d620e7a18a..3ee2e2b504 100644 --- a/awx_collection/plugins/modules/tower_token.py +++ b/awx_collection/plugins/modules/tower_token.py @@ -26,6 +26,10 @@ description: tower_* modules as the parameter tower_oauthtoken. See examples for usage. - Because of the sensitive nature of tokens, the created token value is only available once through the Ansible fact. (See RETURN for details) + - Due to the nature of tokens in Tower this module is not idempotent. A second will + with the same parameters will create a new token. + - If you are creating a temporary token for use with modules you should delete the token + when you are done with it. See the example for how to do it. options: description: description: @@ -46,8 +50,11 @@ options: default: 'write' choices: ["read", "write"] existing_token: - description: An existing token (for use with state absent) + description: The data structure produced from tower_token in create mode to be used with state absent. type: dict + existing_token_id: + description: A token ID (number) which can be used to delete an arbitrary token with state absent. + type: str state: description: - Desired state of the resource. @@ -89,6 +96,11 @@ EXAMPLES = ''' existing_token: "{{ tower_token }}" state: absent when: tower_token is defined + +- name: Delete a token by its id + tower_toekn: + existing_token_id: 4 + state: absent ''' RETURN = ''' @@ -99,6 +111,9 @@ tower_token: token: description: The token that was generated. This token can never be accessed again, make sure this value is noted before it is lost. type: str + id: + description: The numeric ID of the token created + type: str returned: on successful create ''' @@ -123,6 +138,7 @@ def main(): application=dict(), scope=dict(choices=['read', 'write'], default='write'), existing_token=dict(type='dict'), + existing_token_id=dict(), state=dict(choices=['present', 'absent'], default='present'), ) @@ -134,9 +150,19 @@ def main(): application = module.params.get('application') scope = module.params.get('scope') existing_token = module.params.get('existing_token') + existing_token_id = module.params.get('existing_token_id') state = module.params.get('state') if state == 'absent': + if not existing_token: + if not existing_token_id: + module.fail_json(msg='When deleting a token you specify either the parameter existing_token or existing_token_id') + existing_token = module.get_one('tokens', **{ + 'data': { + 'id': existing_token_id, + } + }) + # If the state was absent we can let the module delete it if needed, the module will handle exiting from this module.delete_if_needed(existing_token) diff --git a/awx_collection/tests/integration/targets/tower_token/tasks/main.yml b/awx_collection/tests/integration/targets/tower_token/tasks/main.yml index 0ba32c19b6..0c4d1031c1 100644 --- a/awx_collection/tests/integration/targets/tower_token/tasks/main.yml +++ b/awx_collection/tests/integration/targets/tower_token/tasks/main.yml @@ -27,6 +27,17 @@ - results is failed - '"The provided tower_oauthtoken type was not valid (list). Valid options are str or dict." == results.msg' +- name: Try to delete a token with no existing_token or existing_token_id + tower_token: + state: absent + register: results + ignore_errors: True + +- assert: + that: + - results is failed + - '"When deleting a token you specify either the parameter existing_token or existing_token_id" == results.msg' + - block: - name: Create a Token tower_token: @@ -52,3 +63,33 @@ tower_oauthtoken: "{{ tower_token }}" state: absent when: tower_token is defined + register: results + + - assert: + that: + - results is changed or results is skipped + +- block: + - name: Create a second token + tower_token: + description: '{{ token_description }}' + scope: "write" + state: present + register: results + + - assert: + that: + - results is changed + + always: + - name: Delete the second Token with our own token + tower_token: + existing_token_id: "{{ tower_token['id'] }}" + tower_oauthtoken: "{{ tower_token }}" + state: absent + when: tower_token is defined + register: results + + - assert: + that: + - results is changed or resuslts is skipped From 91dbc2de30b56a836b1caa37d476267e5fa697cc Mon Sep 17 00:00:00 2001 From: Shane McDonald Date: Thu, 4 Jun 2020 18:32:14 -0400 Subject: [PATCH 27/43] Add queue / instance group registration to heartbeat for k8s installs There is some history here. https://github.com/ansible/awx/pull/7190 <- This PR was an attempt at fixing a bug notting ran into where some jobs on k8s installs would get stuck in Waiting forever. The PR mentioned above introduced a bug where there are no instance groups on a fresh k8s-based install. This is because this process currently happens in the launch scripts, before the database is up. With this patch, queue / instance group registration happens in the heartbeat, right after auto-registering the instance. --- .../management/commands/register_queue.py | 103 ++++++++++-------- awx/main/managers.py | 5 +- .../templates/launch_awx_task.sh.j2 | 4 +- 3 files changed, 63 insertions(+), 49 deletions(-) diff --git a/awx/main/management/commands/register_queue.py b/awx/main/management/commands/register_queue.py index 61761ec2aa..edd8068b89 100644 --- a/awx/main/management/commands/register_queue.py +++ b/awx/main/management/commands/register_queue.py @@ -16,31 +16,24 @@ class InstanceNotFound(Exception): super(InstanceNotFound, self).__init__(*args, **kwargs) -class Command(BaseCommand): +class RegisterQueue: + def __init__(self, queuename, controller, instance_percent, inst_min, hostname_list): + self.instance_not_found_err = None + self.queuename = queuename + self.controller = controller + self.instance_percent = instance_percent + self.instance_min = inst_min + self.hostname_list = hostname_list - def add_arguments(self, parser): - parser.add_argument('--queuename', dest='queuename', type=str, - help='Queue to create/update') - parser.add_argument('--hostnames', dest='hostnames', type=str, - help='Comma-Delimited Hosts to add to the Queue (will not remove already assigned instances)') - parser.add_argument('--controller', dest='controller', type=str, - default='', help='The controlling group (makes this an isolated group)') - parser.add_argument('--instance_percent', dest='instance_percent', type=int, default=0, - help='The percentage of active instances that will be assigned to this group'), - parser.add_argument('--instance_minimum', dest='instance_minimum', type=int, default=0, - help='The minimum number of instance that will be retained for this group from available instances') - - - def get_create_update_instance_group(self, queuename, instance_percent, instance_min): + def get_create_update_instance_group(self): created = False changed = False - - (ig, created) = InstanceGroup.objects.get_or_create(name=queuename) - if ig.policy_instance_percentage != instance_percent: - ig.policy_instance_percentage = instance_percent + (ig, created) = InstanceGroup.objects.get_or_create(name=self.queuename) + if ig.policy_instance_percentage != self.instance_percent: + ig.policy_instance_percentage = self.instance_percent changed = True - if ig.policy_instance_minimum != instance_min: - ig.policy_instance_minimum = instance_min + if ig.policy_instance_minimum != self.instance_min: + ig.policy_instance_minimum = self.instance_min changed = True if changed: @@ -48,12 +41,12 @@ class Command(BaseCommand): return (ig, created, changed) - def update_instance_group_controller(self, ig, controller): + def update_instance_group_controller(self, ig): changed = False control_ig = None - if controller: - control_ig = InstanceGroup.objects.filter(name=controller).first() + if self.controller: + control_ig = InstanceGroup.objects.filter(name=self.controller).first() if control_ig and ig.controller_id != control_ig.pk: ig.controller = control_ig @@ -62,10 +55,10 @@ class Command(BaseCommand): return (control_ig, changed) - def add_instances_to_group(self, ig, hostname_list): + def add_instances_to_group(self, ig): changed = False - instance_list_unique = set([x.strip() for x in hostname_list if x]) + instance_list_unique = set([x.strip() for x in self.hostname_list if x]) instances = [] for inst_name in instance_list_unique: instance = Instance.objects.filter(hostname=inst_name) @@ -86,43 +79,61 @@ class Command(BaseCommand): return (instances, changed) - def handle(self, **options): - instance_not_found_err = None - queuename = options.get('queuename') - if not queuename: - raise CommandError("Specify `--queuename` to use this command.") - ctrl = options.get('controller') - inst_per = options.get('instance_percent') - inst_min = options.get('instance_minimum') - hostname_list = [] - if options.get('hostnames'): - hostname_list = options.get('hostnames').split(",") - + def register(self): with advisory_lock('cluster_policy_lock'): with transaction.atomic(): changed2 = False changed3 = False - (ig, created, changed1) = self.get_create_update_instance_group(queuename, inst_per, inst_min) + (ig, created, changed1) = self.get_create_update_instance_group() if created: print("Creating instance group {}".format(ig.name)) elif not created: print("Instance Group already registered {}".format(ig.name)) - if ctrl: - (ig_ctrl, changed2) = self.update_instance_group_controller(ig, ctrl) + if self.controller: + (ig_ctrl, changed2) = self.update_instance_group_controller(ig) if changed2: - print("Set controller group {} on {}.".format(ctrl, queuename)) + print("Set controller group {} on {}.".format(self.controller, self.queuename)) try: - (instances, changed3) = self.add_instances_to_group(ig, hostname_list) + (instances, changed3) = self.add_instances_to_group(ig) for i in instances: print("Added instance {} to {}".format(i.hostname, ig.name)) except InstanceNotFound as e: - instance_not_found_err = e + self.instance_not_found_err = e if any([changed1, changed2, changed3]): print('(changed: True)') - if instance_not_found_err: - print(instance_not_found_err.message) + +class Command(BaseCommand): + + def add_arguments(self, parser): + parser.add_argument('--queuename', dest='queuename', type=str, + help='Queue to create/update') + parser.add_argument('--hostnames', dest='hostnames', type=str, + help='Comma-Delimited Hosts to add to the Queue (will not remove already assigned instances)') + parser.add_argument('--controller', dest='controller', type=str, + default='', help='The controlling group (makes this an isolated group)') + parser.add_argument('--instance_percent', dest='instance_percent', type=int, default=0, + help='The percentage of active instances that will be assigned to this group'), + parser.add_argument('--instance_minimum', dest='instance_minimum', type=int, default=0, + help='The minimum number of instance that will be retained for this group from available instances') + + + def handle(self, **options): + queuename = options.get('queuename') + if not queuename: + raise CommandError("Specify `--queuename` to use this command.") + ctrl = options.get('controller') + inst_per = options.get('instance_percent') + instance_min = options.get('instance_minimum') + hostname_list = [] + if options.get('hostnames'): + hostname_list = options.get('hostnames').split(",") + + rq = RegisterQueue(queuename, ctrl, inst_per, instance_min, hostname_list) + rq.register() + if rq.instance_not_found_err: + print(rq.instance_not_found_err.message) sys.exit(1) diff --git a/awx/main/managers.py b/awx/main/managers.py index 2076e7f0b0..f4b437d027 100644 --- a/awx/main/managers.py +++ b/awx/main/managers.py @@ -149,8 +149,11 @@ class InstanceManager(models.Manager): def get_or_register(self): if settings.AWX_AUTO_DEPROVISION_INSTANCES: + from awx.main.management.commands.register_queue import RegisterQueue pod_ip = os.environ.get('MY_POD_IP') - return self.register(ip_address=pod_ip) + registered = self.register(ip_address=pod_ip) + RegisterQueue('tower', None, 100, 0, []).register() + return registered else: return (False, self.me()) diff --git a/installer/roles/image_build/templates/launch_awx_task.sh.j2 b/installer/roles/image_build/templates/launch_awx_task.sh.j2 index edaf3bf362..dd54af5b3e 100755 --- a/installer/roles/image_build/templates/launch_awx_task.sh.j2 +++ b/installer/roles/image_build/templates/launch_awx_task.sh.j2 @@ -12,6 +12,8 @@ ANSIBLE_REMOTE_TEMP=/tmp ANSIBLE_LOCAL_TEMP=/tmp ansible -i "127.0.0.1," -c loca if [ -z "$AWX_SKIP_MIGRATIONS" ]; then awx-manage migrate --noinput + awx-manage provision_instance --hostname=$(hostname) + awx-manage register_queue --queuename=tower --instance_percent=100 fi if [ ! -z "$AWX_ADMIN_USER" ]&&[ ! -z "$AWX_ADMIN_PASSWORD" ]; then @@ -21,8 +23,6 @@ if [ ! -z "$AWX_ADMIN_USER" ]&&[ ! -z "$AWX_ADMIN_PASSWORD" ]; then {% endif %} fi echo 'from django.conf import settings; x = settings.AWX_TASK_ENV; x["HOME"] = "/var/lib/awx"; settings.AWX_TASK_ENV = x' | awx-manage shell -awx-manage provision_instance --hostname=$(hostname) -awx-manage register_queue --queuename=tower --instance_percent=100 unset $(cut -d = -f -1 /etc/tower/conf.d/environment.sh) From 460f31a05d55b7c957f89c7cde239ce419e94c13 Mon Sep 17 00:00:00 2001 From: Shane McDonald Date: Thu, 4 Jun 2020 19:33:32 -0400 Subject: [PATCH 28/43] Fix up test that was only failing in dev env I'm not sure how this one slipped by. The default config is built into the image, but we were bind-mounting an empty directory on top of it. --- tools/docker-compose.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/tools/docker-compose.yml b/tools/docker-compose.yml index d4dee7f101..b1e8fb93c7 100644 --- a/tools/docker-compose.yml +++ b/tools/docker-compose.yml @@ -34,7 +34,6 @@ services: - "../awx/projects/:/var/lib/awx/projects/" - "./redis/redis_socket_standalone:/var/run/redis/" - "./memcached/:/var/run/memcached" - - "./rsyslog/:/var/lib/awx/rsyslog" - "./docker-compose/supervisor.conf:/etc/supervisord.conf" privileged: true tty: true From 21abf5a788169df258566574a7e365f6e72dc94f Mon Sep 17 00:00:00 2001 From: sean-m-sullivan Date: Sat, 6 Jun 2020 20:11:46 -0500 Subject: [PATCH 29/43] updated to remove version and add docs --- awx_collection/plugins/modules/tower_job_template.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/awx_collection/plugins/modules/tower_job_template.py b/awx_collection/plugins/modules/tower_job_template.py index 37011a4502..75d16049a7 100644 --- a/awx_collection/plugins/modules/tower_job_template.py +++ b/awx_collection/plugins/modules/tower_job_template.py @@ -51,6 +51,7 @@ options: - Used to help lookup the object, cannot be modified using this module. - The Organization is inferred from the associated project - If not provided, will lookup by name only, which does not work with duplicates. + - Requires Tower Version 3.7.0 or AWX 10.0.0 IS NOT backwards compatible with earlier versions. type: str version_added: 2.10 project: @@ -338,10 +339,6 @@ from ..module_utils.tower_api import TowerModule import json -def versiontuple(v): - return tuple(map(int, (v.split(".")))) - - def update_survey(module, last_request): spec_endpoint = last_request.get('related', {}).get('survey_spec') if module.params.get('survey_spec') == {}: @@ -437,9 +434,7 @@ def main(): organization = module.params.get('organization') if organization: organization_id = module.resolve_name_to_id('organizations', organization) - tower_version = module.get_endpoint('ping')['json']['version'] - if versiontuple(tower_version) >= versiontuple("3.7.0"): - search_fields['organization'] = new_fields['organization'] = organization_id + search_fields['organization'] = new_fields['organization'] = organization_id # Attempt to look up an existing item based on the provided data existing_item = module.get_one('job_templates', **{'data': search_fields}) From 360352b78ea70cdec2f2d9bcde441e26eb74939e Mon Sep 17 00:00:00 2001 From: sean-m-sullivan Date: Sat, 6 Jun 2020 20:12:47 -0500 Subject: [PATCH 30/43] updated version --- awx_collection/plugins/modules/tower_job_template.py | 1 - 1 file changed, 1 deletion(-) diff --git a/awx_collection/plugins/modules/tower_job_template.py b/awx_collection/plugins/modules/tower_job_template.py index 75d16049a7..610a6fb8ab 100644 --- a/awx_collection/plugins/modules/tower_job_template.py +++ b/awx_collection/plugins/modules/tower_job_template.py @@ -53,7 +53,6 @@ options: - If not provided, will lookup by name only, which does not work with duplicates. - Requires Tower Version 3.7.0 or AWX 10.0.0 IS NOT backwards compatible with earlier versions. type: str - version_added: 2.10 project: description: - Name of the project to use for the job template. From 3b60529488be0725407197af2a3b364d182ae0c0 Mon Sep 17 00:00:00 2001 From: John Westcott IV Date: Mon, 8 Jun 2020 06:42:33 -0400 Subject: [PATCH 31/43] Fixes in testing and parameter processing --- awx_collection/plugins/modules/tower_token.py | 13 ++++++++++--- awx_collection/test/awx/test_token.py | 5 +++-- .../targets/tower_token/tasks/main.yml | 17 ++++++++++++++++- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/awx_collection/plugins/modules/tower_token.py b/awx_collection/plugins/modules/tower_token.py index 3ee2e2b504..3be5cebde5 100644 --- a/awx_collection/plugins/modules/tower_token.py +++ b/awx_collection/plugins/modules/tower_token.py @@ -143,7 +143,16 @@ def main(): ) # Create a module for ourselves - module = TowerModule(argument_spec=argument_spec) + module = TowerModule( + argument_spec=argument_spec, + mutually_exclusive=[ + ('existing_token', 'existing_token_id'), + ], + # If we are state absent make sure one of existing_token or existing_token_id are present + required_if=[ + [ 'state', 'absent', ('existing_token', 'existing_token_id'), True,], + ], + ) # Extract our parameters description = module.params.get('description') @@ -155,8 +164,6 @@ def main(): if state == 'absent': if not existing_token: - if not existing_token_id: - module.fail_json(msg='When deleting a token you specify either the parameter existing_token or existing_token_id') existing_token = module.get_one('tokens', **{ 'data': { 'id': existing_token_id, diff --git a/awx_collection/test/awx/test_token.py b/awx_collection/test/awx/test_token.py index 107a833af6..e3f1d2a8c1 100644 --- a/awx_collection/test/awx/test_token.py +++ b/awx_collection/test/awx/test_token.py @@ -22,7 +22,8 @@ def test_create_token(run_module, admin_user): } result = run_module('tower_token', module_args, admin_user) - assert result, result.get('changed') + assert result.get('changed'), result tokens = OAuth2AccessToken.objects.filter(description='barfoo') - assert len(tokens) == 1, tokens[0].description == 'barfoo' + assert len(tokens) == 1, 'Rokens with description of barfoo != 0: {0}'.format(len(tokens)) + assert tokens[0].scope == 'read', 'Token was not given read access' diff --git a/awx_collection/tests/integration/targets/tower_token/tasks/main.yml b/awx_collection/tests/integration/targets/tower_token/tasks/main.yml index 0c4d1031c1..2854d4e6ca 100644 --- a/awx_collection/tests/integration/targets/tower_token/tasks/main.yml +++ b/awx_collection/tests/integration/targets/tower_token/tasks/main.yml @@ -36,7 +36,22 @@ - assert: that: - results is failed - - '"When deleting a token you specify either the parameter existing_token or existing_token_id" == results.msg' + # We don't assert a message here because it handled by ansible + +- name: Try to delete a token with both existing_token or existing_token_id + tower_token: + existing_token: + id: 1234 + existing_token_id: 1234 + state: absent + register: results + ignore_errors: True + +- assert: + that: + - results is failed + # We don't assert a message here because it handled by ansible + - block: - name: Create a Token From 95b8bd63ea005e45e15c6cb5fc8600d0ff9ec0c0 Mon Sep 17 00:00:00 2001 From: John Westcott IV Date: Mon, 8 Jun 2020 07:06:45 -0400 Subject: [PATCH 32/43] Fixing linting issues --- awx_collection/plugins/modules/tower_settings.py | 2 +- .../tests/integration/targets/tower_settings/tasks/main.yml | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/awx_collection/plugins/modules/tower_settings.py b/awx_collection/plugins/modules/tower_settings.py index a66acadf44..ef4dcd9b1b 100644 --- a/awx_collection/plugins/modules/tower_settings.py +++ b/awx_collection/plugins/modules/tower_settings.py @@ -83,7 +83,7 @@ except ImportError: def coerce_type(module, value): # If our value is already None we can just return directly - if value == None: + if value is None: return value yaml_ish = bool(( diff --git a/awx_collection/tests/integration/targets/tower_settings/tasks/main.yml b/awx_collection/tests/integration/targets/tower_settings/tasks/main.yml index 6cebe979e2..16ee22e9e2 100644 --- a/awx_collection/tests/integration/targets/tower_settings/tasks/main.yml +++ b/awx_collection/tests/integration/targets/tower_settings/tasks/main.yml @@ -79,4 +79,3 @@ tower_settings: name: AWX_PROOT_BASE_PATH value: '{{ junk_var | default(omit) }}' - From 64846c3347fb3a6a7ef76ac15c1030b53fad3d2e Mon Sep 17 00:00:00 2001 From: John Westcott IV Date: Mon, 8 Jun 2020 07:09:45 -0400 Subject: [PATCH 33/43] Fixing truthy issues --- .../tests/integration/targets/tower_token/tasks/main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/awx_collection/tests/integration/targets/tower_token/tasks/main.yml b/awx_collection/tests/integration/targets/tower_token/tasks/main.yml index 2854d4e6ca..355d5dd02f 100644 --- a/awx_collection/tests/integration/targets/tower_token/tasks/main.yml +++ b/awx_collection/tests/integration/targets/tower_token/tasks/main.yml @@ -31,7 +31,7 @@ tower_token: state: absent register: results - ignore_errors: True + ignore_errors: true - assert: that: @@ -45,7 +45,7 @@ existing_token_id: 1234 state: absent register: results - ignore_errors: True + ignore_errors: true - assert: that: From 76dcd6d72a351468e55896604be60611948c7967 Mon Sep 17 00:00:00 2001 From: John Westcott IV Date: Mon, 8 Jun 2020 07:49:58 -0400 Subject: [PATCH 34/43] Fixing scooby doo fingers --- awx_collection/plugins/modules/tower_token.py | 2 +- awx_collection/test/awx/test_token.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/awx_collection/plugins/modules/tower_token.py b/awx_collection/plugins/modules/tower_token.py index 3be5cebde5..d8300a048e 100644 --- a/awx_collection/plugins/modules/tower_token.py +++ b/awx_collection/plugins/modules/tower_token.py @@ -98,7 +98,7 @@ EXAMPLES = ''' when: tower_token is defined - name: Delete a token by its id - tower_toekn: + tower_token: existing_token_id: 4 state: absent ''' diff --git a/awx_collection/test/awx/test_token.py b/awx_collection/test/awx/test_token.py index e3f1d2a8c1..442fa2e9fb 100644 --- a/awx_collection/test/awx/test_token.py +++ b/awx_collection/test/awx/test_token.py @@ -25,5 +25,5 @@ def test_create_token(run_module, admin_user): assert result.get('changed'), result tokens = OAuth2AccessToken.objects.filter(description='barfoo') - assert len(tokens) == 1, 'Rokens with description of barfoo != 0: {0}'.format(len(tokens)) + assert len(tokens) == 1, 'Tokens with description of barfoo != 0: {0}'.format(len(tokens)) assert tokens[0].scope == 'read', 'Token was not given read access' From b457c8f1336c36cefa0c72fd1e413c2feec0be26 Mon Sep 17 00:00:00 2001 From: beeankha Date: Mon, 8 Jun 2020 09:57:16 -0400 Subject: [PATCH 35/43] Update a task in tower_settings integration test playbook --- .../tests/integration/targets/tower_settings/tasks/main.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/awx_collection/tests/integration/targets/tower_settings/tasks/main.yml b/awx_collection/tests/integration/targets/tower_settings/tasks/main.yml index 16ee22e9e2..8a42f5768e 100644 --- a/awx_collection/tests/integration/targets/tower_settings/tasks/main.yml +++ b/awx_collection/tests/integration/targets/tower_settings/tasks/main.yml @@ -79,3 +79,9 @@ tower_settings: name: AWX_PROOT_BASE_PATH value: '{{ junk_var | default(omit) }}' + register: result + ignore_errors: true + +- assert: + that: + - "'Unable to update settings' in result.msg" From cf6235f6eab293074b74400a7f42a4c0da2560ad Mon Sep 17 00:00:00 2001 From: Florian Apolloner Date: Mon, 8 Jun 2020 16:30:52 +0200 Subject: [PATCH 36/43] Send content-type with mattermost notifications, fixes #7264 --- awx/main/notifications/mattermost_backend.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/awx/main/notifications/mattermost_backend.py b/awx/main/notifications/mattermost_backend.py index 7a759d41a3..78a23c72d1 100644 --- a/awx/main/notifications/mattermost_backend.py +++ b/awx/main/notifications/mattermost_backend.py @@ -3,7 +3,6 @@ import logging import requests -import json from django.utils.encoding import smart_text from django.utils.translation import ugettext_lazy as _ @@ -45,7 +44,7 @@ class MattermostBackend(AWXBaseEmailBackend, CustomNotificationBase): payload['text'] = m.subject r = requests.post("{}".format(m.recipients()[0]), - data=json.dumps(payload), verify=(not self.mattermost_no_verify_ssl)) + json=payload, verify=(not self.mattermost_no_verify_ssl)) if r.status_code >= 400: logger.error(smart_text(_("Error sending notification mattermost: {}").format(r.text))) if not self.fail_silently: From 0df4047d3dd6e1f94d3e40c3943b57f1b4ae3896 Mon Sep 17 00:00:00 2001 From: Alex Corey Date: Mon, 8 Jun 2020 11:55:21 -0400 Subject: [PATCH 37/43] Adds routing stubs for Applications --- awx/ui_next/src/routeConfig.js | 4 +- .../src/screens/Application/Applications.jsx | 26 ---------- .../Applications/Application/Application.jsx | 26 ++++++++++ .../screens/Applications/Application/index.js | 1 + .../ApplicationAdd/ApplicationAdd.jsx | 15 ++++++ .../Applications/ApplicationAdd/index.js | 1 + .../ApplicationDetails/ApplicationDetails.jsx | 11 +++++ .../Applications/ApplicationDetails/index.js | 1 + .../ApplicationEdit/ApplicationEdit.jsx | 11 +++++ .../Applications/ApplicationEdit/index.js | 1 + .../src/screens/Applications/Applications.jsx | 49 +++++++++++++++++++ .../Applications.test.jsx | 2 +- .../ApplicationsList/ApplicationsList.jsx | 15 ++++++ .../Applications/ApplicationsList/index.js | 1 + .../{Application => Applications}/index.js | 0 15 files changed, 135 insertions(+), 29 deletions(-) delete mode 100644 awx/ui_next/src/screens/Application/Applications.jsx create mode 100644 awx/ui_next/src/screens/Applications/Application/Application.jsx create mode 100644 awx/ui_next/src/screens/Applications/Application/index.js create mode 100644 awx/ui_next/src/screens/Applications/ApplicationAdd/ApplicationAdd.jsx create mode 100644 awx/ui_next/src/screens/Applications/ApplicationAdd/index.js create mode 100644 awx/ui_next/src/screens/Applications/ApplicationDetails/ApplicationDetails.jsx create mode 100644 awx/ui_next/src/screens/Applications/ApplicationDetails/index.js create mode 100644 awx/ui_next/src/screens/Applications/ApplicationEdit/ApplicationEdit.jsx create mode 100644 awx/ui_next/src/screens/Applications/ApplicationEdit/index.js create mode 100644 awx/ui_next/src/screens/Applications/Applications.jsx rename awx/ui_next/src/screens/{Application => Applications}/Applications.test.jsx (94%) create mode 100644 awx/ui_next/src/screens/Applications/ApplicationsList/ApplicationsList.jsx create mode 100644 awx/ui_next/src/screens/Applications/ApplicationsList/index.js rename awx/ui_next/src/screens/{Application => Applications}/index.js (100%) diff --git a/awx/ui_next/src/routeConfig.js b/awx/ui_next/src/routeConfig.js index 37f1732cb0..9ef1167ffa 100644 --- a/awx/ui_next/src/routeConfig.js +++ b/awx/ui_next/src/routeConfig.js @@ -1,6 +1,6 @@ import { t } from '@lingui/macro'; -import Applications from './screens/Application'; +import Applications from './screens/Applications'; import Credentials from './screens/Credential'; import CredentialTypes from './screens/CredentialType'; import Dashboard from './screens/Dashboard'; @@ -138,7 +138,7 @@ function getRouteConfig(i18n) { screen: InstanceGroups, }, { - title: i18n._(t`Integrations`), + title: i18n._(t`Applications`), path: '/applications', screen: Applications, }, diff --git a/awx/ui_next/src/screens/Application/Applications.jsx b/awx/ui_next/src/screens/Application/Applications.jsx deleted file mode 100644 index 47a5e3250a..0000000000 --- a/awx/ui_next/src/screens/Application/Applications.jsx +++ /dev/null @@ -1,26 +0,0 @@ -import React, { Component, Fragment } from 'react'; -import { withI18n } from '@lingui/react'; -import { t } from '@lingui/macro'; -import { - PageSection, - PageSectionVariants, - Title, -} from '@patternfly/react-core'; - -class Applications extends Component { - render() { - const { i18n } = this.props; - const { light } = PageSectionVariants; - - return ( - - - {i18n._(t`Applications`)} - - - - ); - } -} - -export default withI18n()(Applications); diff --git a/awx/ui_next/src/screens/Applications/Application/Application.jsx b/awx/ui_next/src/screens/Applications/Application/Application.jsx new file mode 100644 index 0000000000..5a002f2990 --- /dev/null +++ b/awx/ui_next/src/screens/Applications/Application/Application.jsx @@ -0,0 +1,26 @@ +import React from 'react'; +import { Route, Switch, Redirect } from 'react-router-dom'; +import ApplicationEdit from '../ApplicationEdit'; +import ApplicationDetails from '../ApplicationDetails'; + +function Application() { + return ( + <> + + + + + + + + + + + ); +} + +export default Application; diff --git a/awx/ui_next/src/screens/Applications/Application/index.js b/awx/ui_next/src/screens/Applications/Application/index.js new file mode 100644 index 0000000000..f76f133dd5 --- /dev/null +++ b/awx/ui_next/src/screens/Applications/Application/index.js @@ -0,0 +1 @@ +export { default } from './Application'; diff --git a/awx/ui_next/src/screens/Applications/ApplicationAdd/ApplicationAdd.jsx b/awx/ui_next/src/screens/Applications/ApplicationAdd/ApplicationAdd.jsx new file mode 100644 index 0000000000..a25c690a7b --- /dev/null +++ b/awx/ui_next/src/screens/Applications/ApplicationAdd/ApplicationAdd.jsx @@ -0,0 +1,15 @@ +import React from 'react'; +import { Card, PageSection } from '@patternfly/react-core'; + +function ApplicatonAdd() { + return ( + <> + + +

    Applications Add
    + + + + ); +} +export default ApplicatonAdd; diff --git a/awx/ui_next/src/screens/Applications/ApplicationAdd/index.js b/awx/ui_next/src/screens/Applications/ApplicationAdd/index.js new file mode 100644 index 0000000000..54101fc16b --- /dev/null +++ b/awx/ui_next/src/screens/Applications/ApplicationAdd/index.js @@ -0,0 +1 @@ +export { default } from './ApplicationAdd'; diff --git a/awx/ui_next/src/screens/Applications/ApplicationDetails/ApplicationDetails.jsx b/awx/ui_next/src/screens/Applications/ApplicationDetails/ApplicationDetails.jsx new file mode 100644 index 0000000000..c8051841bb --- /dev/null +++ b/awx/ui_next/src/screens/Applications/ApplicationDetails/ApplicationDetails.jsx @@ -0,0 +1,11 @@ +import React from 'react'; +import { Card, PageSection } from '@patternfly/react-core'; + +function ApplicationDetails() { + return ( + + Application Details + + ); +} +export default ApplicationDetails; diff --git a/awx/ui_next/src/screens/Applications/ApplicationDetails/index.js b/awx/ui_next/src/screens/Applications/ApplicationDetails/index.js new file mode 100644 index 0000000000..fc3261983b --- /dev/null +++ b/awx/ui_next/src/screens/Applications/ApplicationDetails/index.js @@ -0,0 +1 @@ +export { default } from './ApplicationDetails'; diff --git a/awx/ui_next/src/screens/Applications/ApplicationEdit/ApplicationEdit.jsx b/awx/ui_next/src/screens/Applications/ApplicationEdit/ApplicationEdit.jsx new file mode 100644 index 0000000000..e72f93b681 --- /dev/null +++ b/awx/ui_next/src/screens/Applications/ApplicationEdit/ApplicationEdit.jsx @@ -0,0 +1,11 @@ +import React from 'react'; +import { Card, PageSection } from '@patternfly/react-core'; + +function ApplicationEdit() { + return ( + + Application Edit + + ); +} +export default ApplicationEdit; diff --git a/awx/ui_next/src/screens/Applications/ApplicationEdit/index.js b/awx/ui_next/src/screens/Applications/ApplicationEdit/index.js new file mode 100644 index 0000000000..2ab4beb8d4 --- /dev/null +++ b/awx/ui_next/src/screens/Applications/ApplicationEdit/index.js @@ -0,0 +1 @@ +export { default } from './ApplicationEdit'; diff --git a/awx/ui_next/src/screens/Applications/Applications.jsx b/awx/ui_next/src/screens/Applications/Applications.jsx new file mode 100644 index 0000000000..19a23be08e --- /dev/null +++ b/awx/ui_next/src/screens/Applications/Applications.jsx @@ -0,0 +1,49 @@ +import React, { useState, useCallback } from 'react'; +import { withI18n } from '@lingui/react'; +import { t } from '@lingui/macro'; +import { Route, Switch } from 'react-router-dom'; + +import ApplicationsList from './ApplicationsList'; +import ApplicationAdd from './ApplicationAdd'; +import Application from './Application'; +import Breadcrumbs from '../../components/Breadcrumbs'; + +function Applications({ i18n }) { + const [breadcrumbConfig, setBreadcrumbConfig] = useState({ + '/applications': i18n._(t`Applications`), + '/applications/add': i18n._(t`Create New Application`), + }); + + const buildBreadcrumbConfig = useCallback( + application => { + if (!application) { + return; + } + + setBreadcrumbConfig({ + '/applications': i18n._(t`Applications`), + '/applications/add': i18n._(t`Create New Application`), + [`/application/${application.id}`]: `${application.name}`, + }); + }, + [i18n] + ); + return ( + <> + + + + + + + + + + + + + + ); +} + +export default withI18n()(Applications); diff --git a/awx/ui_next/src/screens/Application/Applications.test.jsx b/awx/ui_next/src/screens/Applications/Applications.test.jsx similarity index 94% rename from awx/ui_next/src/screens/Application/Applications.test.jsx rename to awx/ui_next/src/screens/Applications/Applications.test.jsx index cb747a920b..7915523720 100644 --- a/awx/ui_next/src/screens/Application/Applications.test.jsx +++ b/awx/ui_next/src/screens/Applications/Applications.test.jsx @@ -21,7 +21,7 @@ describe('', () => { test('initially renders without crashing', () => { expect(pageWrapper.length).toBe(1); - expect(pageSections.length).toBe(2); + expect(pageSections.length).toBe(1); expect(title.length).toBe(1); expect(title.props().size).toBe('2xl'); expect(pageSections.first().props().variant).toBe('light'); diff --git a/awx/ui_next/src/screens/Applications/ApplicationsList/ApplicationsList.jsx b/awx/ui_next/src/screens/Applications/ApplicationsList/ApplicationsList.jsx new file mode 100644 index 0000000000..6fcf16bb73 --- /dev/null +++ b/awx/ui_next/src/screens/Applications/ApplicationsList/ApplicationsList.jsx @@ -0,0 +1,15 @@ +import React from 'react'; +import { Card, PageSection } from '@patternfly/react-core'; + +function ApplicationsList() { + return ( + <> + + +
    Applications List
    +
    +
    + + ); +} +export default ApplicationsList; diff --git a/awx/ui_next/src/screens/Applications/ApplicationsList/index.js b/awx/ui_next/src/screens/Applications/ApplicationsList/index.js new file mode 100644 index 0000000000..34f1107076 --- /dev/null +++ b/awx/ui_next/src/screens/Applications/ApplicationsList/index.js @@ -0,0 +1 @@ +export { default } from './ApplicationsList'; diff --git a/awx/ui_next/src/screens/Application/index.js b/awx/ui_next/src/screens/Applications/index.js similarity index 100% rename from awx/ui_next/src/screens/Application/index.js rename to awx/ui_next/src/screens/Applications/index.js From 3f8bc0d7c8bec351e303106707564f9904e0188d Mon Sep 17 00:00:00 2001 From: Marcelo Moreira de Mello Date: Tue, 21 Apr 2020 12:09:17 -0400 Subject: [PATCH 38/43] Adds SAML Attribute Mapping to Teams and Orgs Signed-off-by: Marcelo Moreira de Mello --- awx/sso/fields.py | 2 ++ awx/sso/pipeline.py | 15 ++++++++++++--- awx/sso/tests/functional/test_pipeline.py | 19 +++++++++++++++++++ awx/sso/tests/unit/test_fields.py | 8 ++++++++ 4 files changed, 41 insertions(+), 3 deletions(-) diff --git a/awx/sso/fields.py b/awx/sso/fields.py index dddd1ee6a1..78f750fbbd 100644 --- a/awx/sso/fields.py +++ b/awx/sso/fields.py @@ -740,7 +740,9 @@ class SAMLOrgAttrField(HybridDictField): class SAMLTeamAttrTeamOrgMapField(HybridDictField): team = fields.CharField(required=True, allow_null=False) + team_alias = fields.CharField(required=False, allow_null=True) organization = fields.CharField(required=True, allow_null=False) + organization_alias = fields.CharField(required=False, allow_null=True) child = _Forbidden() diff --git a/awx/sso/pipeline.py b/awx/sso/pipeline.py index 212e3824ba..6d7e05da90 100644 --- a/awx/sso/pipeline.py +++ b/awx/sso/pipeline.py @@ -187,13 +187,22 @@ def update_user_teams_by_saml_attr(backend, details, user=None, *args, **kwargs) team_ids = [] for team_name_map in team_map.get('team_org_map', []): - team_name = team_name_map.get('team', '') + team_name = team_name_map.get('team', None) + team_alias = team_name_map.get('team_alias', None) + organization_name = team_name_map.get('organization', None) + organization_alias = team_name_map.get('organization_alias', None) if team_name in saml_team_names: - if not team_name_map.get('organization', ''): + if not organization_name: # Settings field validation should prevent this. logger.error("organization name invalid for team {}".format(team_name)) continue - org = Organization.objects.get_or_create(name=team_name_map['organization'])[0] + + if organization_alias: + organization_name = organization_alias + org = Organization.objects.get_or_create(name=organization_name)[0] + + if team_alias: + team_name = team_alias team = Team.objects.get_or_create(name=team_name, organization=org)[0] team_ids.append(team.id) diff --git a/awx/sso/tests/functional/test_pipeline.py b/awx/sso/tests/functional/test_pipeline.py index 78a04a0481..06d5503db8 100644 --- a/awx/sso/tests/functional/test_pipeline.py +++ b/awx/sso/tests/functional/test_pipeline.py @@ -193,6 +193,10 @@ class TestSAMLAttr(): {'team': 'Red', 'organization': 'Default1'}, {'team': 'Green', 'organization': 'Default1'}, {'team': 'Green', 'organization': 'Default3'}, + { + 'team': 'Yellow', 'team_alias': 'Yellow_Alias', + 'organization': 'Default4', 'organization_alias': 'Default4_Alias' + }, ] } return MockSettings() @@ -285,3 +289,18 @@ class TestSAMLAttr(): assert Team.objects.get(name='Green', organization__name='Default1').member_role.members.count() == 3 assert Team.objects.get(name='Green', organization__name='Default3').member_role.members.count() == 3 + def test_update_user_teams_alias_by_saml_attr(self, orgs, users, kwargs, mock_settings): + with mock.patch('django.conf.settings', mock_settings): + u1 = users[0] + + # Test getting teams from attribute with team->org mapping + kwargs['response']['attributes']['groups'] = ['Yellow'] + + # Ensure team and org will be created + update_user_teams_by_saml_attr(None, None, u1, **kwargs) + + assert Team.objects.filter(name='Yellow', organization__name='Default4').count() == 0 + assert Team.objects.filter(name='Yellow_Alias', organization__name='Default4_Alias').count() == 1 + assert Team.objects.get( + name='Yellow_Alias', organization__name='Default4_Alias').member_role.members.count() == 1 + diff --git a/awx/sso/tests/unit/test_fields.py b/awx/sso/tests/unit/test_fields.py index c63e137776..6d7505e022 100644 --- a/awx/sso/tests/unit/test_fields.py +++ b/awx/sso/tests/unit/test_fields.py @@ -71,6 +71,14 @@ class TestSAMLTeamAttrField(): {'team': 'Engineering', 'organization': 'Ansible2'}, {'team': 'Engineering2', 'organization': 'Ansible'}, ]}, + {'remove': True, 'saml_attr': 'foobar', 'team_org_map': [ + { + 'team': 'Engineering', 'team_alias': 'Engineering Team', + 'organization': 'Ansible', 'organization_alias': 'Awesome Org' + }, + {'team': 'Engineering', 'organization': 'Ansible2'}, + {'team': 'Engineering2', 'organization': 'Ansible'}, + ]}, ]) def test_internal_value_valid(self, data): field = SAMLTeamAttrField() From 142c0da9f0fcc9cba77de24e2509790d6adba0a3 Mon Sep 17 00:00:00 2001 From: mabashian Date: Mon, 8 Jun 2020 14:14:59 -0400 Subject: [PATCH 39/43] Manually bumps websocket-extensions to 0.1.14 --- awx/ui_next/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/awx/ui_next/package-lock.json b/awx/ui_next/package-lock.json index 57577d86d9..e9635701b6 100644 --- a/awx/ui_next/package-lock.json +++ b/awx/ui_next/package-lock.json @@ -16320,9 +16320,9 @@ } }, "websocket-extensions": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", - "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==" + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" }, "whatwg-encoding": { "version": "1.0.5", From 57a6c8d6934099a8f885165d818fc383afbae61b Mon Sep 17 00:00:00 2001 From: mabashian Date: Mon, 8 Jun 2020 14:29:52 -0400 Subject: [PATCH 40/43] Manually bumps websocket-extensions to 0.1.14 in awx/ui --- awx/ui/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/awx/ui/package-lock.json b/awx/ui/package-lock.json index 6719e512e4..3e072d5294 100644 --- a/awx/ui/package-lock.json +++ b/awx/ui/package-lock.json @@ -14435,9 +14435,9 @@ } }, "websocket-extensions": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", - "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "dev": true }, "whet.extend": { From 2784409c46c9e629cac2170262dd4ada07733978 Mon Sep 17 00:00:00 2001 From: Alex Corey Date: Mon, 8 Jun 2020 15:22:11 -0400 Subject: [PATCH 41/43] Fixes folder name --- awx/ui_next/src/routeConfig.js | 2 +- .../{Applications => Application}/Application/Application.jsx | 0 .../{Applications => Application}/Application/index.js | 0 .../ApplicationAdd/ApplicationAdd.jsx | 0 .../{Applications => Application}/ApplicationAdd/index.js | 0 .../ApplicationDetails/ApplicationDetails.jsx | 0 .../{Applications => Application}/ApplicationDetails/index.js | 0 .../ApplicationEdit/ApplicationEdit.jsx | 0 .../{Applications => Application}/ApplicationEdit/index.js | 0 .../screens/{Applications => Application}/Applications.jsx | 0 .../{Applications => Application}/Applications.test.jsx | 4 ---- .../ApplicationsList/ApplicationsList.jsx | 0 .../{Applications => Application}/ApplicationsList/index.js | 0 .../src/screens/{Applications => Application}/index.js | 0 14 files changed, 1 insertion(+), 5 deletions(-) rename awx/ui_next/src/screens/{Applications => Application}/Application/Application.jsx (100%) rename awx/ui_next/src/screens/{Applications => Application}/Application/index.js (100%) rename awx/ui_next/src/screens/{Applications => Application}/ApplicationAdd/ApplicationAdd.jsx (100%) rename awx/ui_next/src/screens/{Applications => Application}/ApplicationAdd/index.js (100%) rename awx/ui_next/src/screens/{Applications => Application}/ApplicationDetails/ApplicationDetails.jsx (100%) rename awx/ui_next/src/screens/{Applications => Application}/ApplicationDetails/index.js (100%) rename awx/ui_next/src/screens/{Applications => Application}/ApplicationEdit/ApplicationEdit.jsx (100%) rename awx/ui_next/src/screens/{Applications => Application}/ApplicationEdit/index.js (100%) rename awx/ui_next/src/screens/{Applications => Application}/Applications.jsx (100%) rename awx/ui_next/src/screens/{Applications => Application}/Applications.test.jsx (82%) rename awx/ui_next/src/screens/{Applications => Application}/ApplicationsList/ApplicationsList.jsx (100%) rename awx/ui_next/src/screens/{Applications => Application}/ApplicationsList/index.js (100%) rename awx/ui_next/src/screens/{Applications => Application}/index.js (100%) diff --git a/awx/ui_next/src/routeConfig.js b/awx/ui_next/src/routeConfig.js index 9ef1167ffa..4b43dc4993 100644 --- a/awx/ui_next/src/routeConfig.js +++ b/awx/ui_next/src/routeConfig.js @@ -1,6 +1,6 @@ import { t } from '@lingui/macro'; -import Applications from './screens/Applications'; +import Applications from './screens/Application'; import Credentials from './screens/Credential'; import CredentialTypes from './screens/CredentialType'; import Dashboard from './screens/Dashboard'; diff --git a/awx/ui_next/src/screens/Applications/Application/Application.jsx b/awx/ui_next/src/screens/Application/Application/Application.jsx similarity index 100% rename from awx/ui_next/src/screens/Applications/Application/Application.jsx rename to awx/ui_next/src/screens/Application/Application/Application.jsx diff --git a/awx/ui_next/src/screens/Applications/Application/index.js b/awx/ui_next/src/screens/Application/Application/index.js similarity index 100% rename from awx/ui_next/src/screens/Applications/Application/index.js rename to awx/ui_next/src/screens/Application/Application/index.js diff --git a/awx/ui_next/src/screens/Applications/ApplicationAdd/ApplicationAdd.jsx b/awx/ui_next/src/screens/Application/ApplicationAdd/ApplicationAdd.jsx similarity index 100% rename from awx/ui_next/src/screens/Applications/ApplicationAdd/ApplicationAdd.jsx rename to awx/ui_next/src/screens/Application/ApplicationAdd/ApplicationAdd.jsx diff --git a/awx/ui_next/src/screens/Applications/ApplicationAdd/index.js b/awx/ui_next/src/screens/Application/ApplicationAdd/index.js similarity index 100% rename from awx/ui_next/src/screens/Applications/ApplicationAdd/index.js rename to awx/ui_next/src/screens/Application/ApplicationAdd/index.js diff --git a/awx/ui_next/src/screens/Applications/ApplicationDetails/ApplicationDetails.jsx b/awx/ui_next/src/screens/Application/ApplicationDetails/ApplicationDetails.jsx similarity index 100% rename from awx/ui_next/src/screens/Applications/ApplicationDetails/ApplicationDetails.jsx rename to awx/ui_next/src/screens/Application/ApplicationDetails/ApplicationDetails.jsx diff --git a/awx/ui_next/src/screens/Applications/ApplicationDetails/index.js b/awx/ui_next/src/screens/Application/ApplicationDetails/index.js similarity index 100% rename from awx/ui_next/src/screens/Applications/ApplicationDetails/index.js rename to awx/ui_next/src/screens/Application/ApplicationDetails/index.js diff --git a/awx/ui_next/src/screens/Applications/ApplicationEdit/ApplicationEdit.jsx b/awx/ui_next/src/screens/Application/ApplicationEdit/ApplicationEdit.jsx similarity index 100% rename from awx/ui_next/src/screens/Applications/ApplicationEdit/ApplicationEdit.jsx rename to awx/ui_next/src/screens/Application/ApplicationEdit/ApplicationEdit.jsx diff --git a/awx/ui_next/src/screens/Applications/ApplicationEdit/index.js b/awx/ui_next/src/screens/Application/ApplicationEdit/index.js similarity index 100% rename from awx/ui_next/src/screens/Applications/ApplicationEdit/index.js rename to awx/ui_next/src/screens/Application/ApplicationEdit/index.js diff --git a/awx/ui_next/src/screens/Applications/Applications.jsx b/awx/ui_next/src/screens/Application/Applications.jsx similarity index 100% rename from awx/ui_next/src/screens/Applications/Applications.jsx rename to awx/ui_next/src/screens/Application/Applications.jsx diff --git a/awx/ui_next/src/screens/Applications/Applications.test.jsx b/awx/ui_next/src/screens/Application/Applications.test.jsx similarity index 82% rename from awx/ui_next/src/screens/Applications/Applications.test.jsx rename to awx/ui_next/src/screens/Application/Applications.test.jsx index 7915523720..f309a2b60a 100644 --- a/awx/ui_next/src/screens/Applications/Applications.test.jsx +++ b/awx/ui_next/src/screens/Application/Applications.test.jsx @@ -7,12 +7,10 @@ import Applications from './Applications'; describe('', () => { let pageWrapper; let pageSections; - let title; beforeEach(() => { pageWrapper = mountWithContexts(); pageSections = pageWrapper.find('PageSection'); - title = pageWrapper.find('Title'); }); afterEach(() => { @@ -22,8 +20,6 @@ describe('', () => { test('initially renders without crashing', () => { expect(pageWrapper.length).toBe(1); expect(pageSections.length).toBe(1); - expect(title.length).toBe(1); - expect(title.props().size).toBe('2xl'); expect(pageSections.first().props().variant).toBe('light'); }); }); diff --git a/awx/ui_next/src/screens/Applications/ApplicationsList/ApplicationsList.jsx b/awx/ui_next/src/screens/Application/ApplicationsList/ApplicationsList.jsx similarity index 100% rename from awx/ui_next/src/screens/Applications/ApplicationsList/ApplicationsList.jsx rename to awx/ui_next/src/screens/Application/ApplicationsList/ApplicationsList.jsx diff --git a/awx/ui_next/src/screens/Applications/ApplicationsList/index.js b/awx/ui_next/src/screens/Application/ApplicationsList/index.js similarity index 100% rename from awx/ui_next/src/screens/Applications/ApplicationsList/index.js rename to awx/ui_next/src/screens/Application/ApplicationsList/index.js diff --git a/awx/ui_next/src/screens/Applications/index.js b/awx/ui_next/src/screens/Application/index.js similarity index 100% rename from awx/ui_next/src/screens/Applications/index.js rename to awx/ui_next/src/screens/Application/index.js From 71640490621db31c29221c985b2b183f324e7247 Mon Sep 17 00:00:00 2001 From: Ryan Petrello Date: Mon, 8 Jun 2020 18:07:33 -0400 Subject: [PATCH 42/43] don't block on log aggregator socket.send() calls see: https://github.com/ansible/tower/issues/4391 --- awx/main/utils/handlers.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/awx/main/utils/handlers.py b/awx/main/utils/handlers.py index ae0e83a9c5..c5e0014f8e 100644 --- a/awx/main/utils/handlers.py +++ b/awx/main/utils/handlers.py @@ -13,6 +13,10 @@ class RSysLogHandler(logging.handlers.SysLogHandler): append_nul = False + def _connect_unixsocket(self, address): + super(RSysLogHandler, self)._connect_unixsocket(address) + self.socket.setblocking(False) + def emit(self, msg): if not settings.LOG_AGGREGATOR_ENABLED: return @@ -26,6 +30,14 @@ class RSysLogHandler(logging.handlers.SysLogHandler): # unfortunately, we can't log that because...rsyslogd is down (and # would just us back ddown this code path) pass + except BlockingIOError: + # for , rsyslogd is no longer reading from the domain socket, and + # we're unable to write any more to it without blocking (we've seen this behavior + # from time to time when logging is totally misconfigured; + # in this scenario, it also makes more sense to just drop the messages, + # because the alternative is blocking the socket.send() in the + # Python process, which we definitely don't want to do) + pass ColorHandler = logging.StreamHandler From 9dec35989875f7ae9fa9da53cb17d487897389e4 Mon Sep 17 00:00:00 2001 From: AlanCoding Date: Mon, 8 Jun 2020 20:11:11 -0400 Subject: [PATCH 43/43] fix lint failures --- awx_collection/plugins/modules/tower_token.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/awx_collection/plugins/modules/tower_token.py b/awx_collection/plugins/modules/tower_token.py index d8300a048e..165590520d 100644 --- a/awx_collection/plugins/modules/tower_token.py +++ b/awx_collection/plugins/modules/tower_token.py @@ -150,7 +150,7 @@ def main(): ], # If we are state absent make sure one of existing_token or existing_token_id are present required_if=[ - [ 'state', 'absent', ('existing_token', 'existing_token_id'), True,], + ['state', 'absent', ('existing_token', 'existing_token_id'), True, ], ], )