Merge pull request #3955 from AlanCoding/lets_release

Backport collection fixes
This commit is contained in:
Ryan Petrello 2019-11-18 16:25:04 -05:00 committed by GitHub
commit 17509d560d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 187 additions and 101 deletions

View File

@ -404,7 +404,7 @@ test_collection_sanity:
mkdir -p sanity/ansible_collections/awx
cp -Ra awx_collection sanity/ansible_collections/awx/awx # symlinks do not work
cd sanity/ansible_collections/awx/awx && git init && git add . # requires both this file structure and a git repo, so there you go
cd sanity/ansible_collections/awx/awx && ansible-test sanity --test validate-modules
cd sanity/ansible_collections/awx/awx && ansible-test sanity
build_collection:
ansible-playbook -i localhost, awx_collection/template_galaxy.yml -e collection_package=$(COLLECTION_PACKAGE) -e collection_namespace=$(COLLECTION_NAMESPACE) -e collection_version=$(VERSION)

View File

@ -3,6 +3,9 @@
# Copyright: (c) 2017, Wayne Witzel III <wayne@riotousliving.com>
# 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
class ModuleDocFragment(object):

View File

@ -26,6 +26,9 @@
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
import os
import traceback

View File

@ -255,7 +255,7 @@ OLD_INPUT_NAMES = (
def credential_type_for_kind(params):
credential_type_res = tower_cli.get_resource('credential_type')
kind = params.pop('kind')
kind = params.get('kind')
arguments = {'managed_by_tower': True}
if kind == 'ssh':
if params.get('vault_password'):

View File

@ -87,7 +87,9 @@ status:
from ..module_utils.ansible_tower import TowerModule, tower_auth_config, tower_check_mode
from ansible.module_utils.six import PY2
from ansible.module_utils.six.moves import cStringIO as StringIO
from codecs import getwriter
try:
@ -123,7 +125,10 @@ def main():
# tower-cli gets very noisy when monitoring.
# We pass in our our outfile to suppress the out during our monitor call.
outfile = StringIO()
if PY2:
outfile = getwriter('utf-8')(StringIO())
else:
outfile = StringIO()
params['outfile'] = outfile
job_id = params.get('job_id')
@ -136,6 +141,12 @@ def main():
json_output['timeout'] = True
except exc.NotFound as excinfo:
fail_json = dict(msg='Unable to wait, no job_id {0} found: {1}'.format(job_id, excinfo), changed=False)
except exc.JobFailure as excinfo:
fail_json = dict(msg='Job with id={0} failed, error: {1}'.format(job_id, excinfo))
fail_json['success'] = False
result = job.get(job_id)
for k in ('id', 'status', 'elapsed', 'started', 'finished'):
fail_json[k] = result.get(k)
except (exc.ConnectionError, exc.BadRequest, exc.AuthError) as excinfo:
fail_json = dict(msg='Unable to wait for job: {0}'.format(excinfo), changed=False)

View File

@ -145,7 +145,7 @@ def main():
scm_clean=dict(type='bool', default=False),
scm_delete_on_update=dict(type='bool', default=False),
scm_update_on_launch=dict(type='bool', default=False),
scm_update_cache_timeout=dict(type='int', default=0),
scm_update_cache_timeout=dict(type='int'),
job_timeout=dict(type='int', default=0),
custom_virtualenv=dict(),
local_path=dict(),

View File

@ -92,7 +92,7 @@ EXAMPLES = '''
organization: My optional Organization
schema: "{{ lookup('file', 'my_workflow.json') }}"
- tower_worflow_template:
- tower_workflow_template:
name: Workflow Template
state: absent
'''

View File

@ -1,3 +1,6 @@
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
import io
import json
import datetime
@ -60,10 +63,10 @@ def run_module():
# Note that a proper Ansiballz explosion of the modules will have an import path like:
# ansible_collections.awx.awx.plugins.modules.{}
# We should consider supporting that in the future
resource_module = importlib.import_module('plugins.modules.{}'.format(module_name))
resource_module = importlib.import_module('plugins.modules.{0}'.format(module_name))
if not isinstance(module_params, dict):
raise RuntimeError('Module params must be dict, got {}'.format(type(module_params)))
raise RuntimeError('Module params must be dict, got {0}'.format(type(module_params)))
# Ansible params can be passed as an invocation argument or over stdin
# this short circuits within the AnsibleModule interface

View File

@ -1,3 +1,6 @@
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
import pytest
from awx.main.models import Credential, CredentialType, Organization
@ -7,20 +10,52 @@ from awx.main.models import Credential, CredentialType, Organization
def test_create_machine_credential(run_module, admin_user):
Organization.objects.create(name='test-org')
# create the ssh credential type
CredentialType.defaults['ssh']().save()
ct = CredentialType.defaults['ssh']()
ct.save()
# Example from docs
result = run_module('tower_credential', dict(
name='Team Name',
description='Team Description',
name='Test Machine Credential',
organization='test-org',
kind='ssh',
state='present'
), admin_user)
assert result.get('changed'), result
cred = Credential.objects.get(name='Team Name')
cred = Credential.objects.get(name='Test Machine Credential')
assert cred.credential_type == ct
result.pop('invocation')
assert result == {
"credential": "Team Name",
"credential": "Test Machine Credential",
"state": "present",
"id": cred.pk,
"changed": True
}
@pytest.mark.django_db
def test_create_vault_credential(run_module, admin_user):
# https://github.com/ansible/ansible/issues/61324
Organization.objects.create(name='test-org')
ct = CredentialType.defaults['vault']()
ct.save()
result = run_module('tower_credential', dict(
name='Test Vault Credential',
organization='test-org',
kind='vault',
vault_id='bar',
vault_password='foobar',
state='present'
), admin_user)
assert result.get('changed'), result
cred = Credential.objects.get(name='Test Vault Credential')
assert cred.credential_type == ct
assert 'vault_id' in cred.inputs
assert 'vault_password' in cred.inputs
result.pop('invocation')
assert result == {
"credential": "Test Vault Credential",
"state": "present",
"id": cred.pk,
"changed": True
@ -39,6 +74,7 @@ def test_create_custom_credential_type(run_module, admin_user):
state='present',
validate_certs='false'
), admin_user)
assert result.get('changed'), result
ct = CredentialType.objects.get(name='Nexus')
result.pop('invocation')

View File

@ -0,0 +1,56 @@
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
import pytest
from django.utils.timezone import now
from awx.main.models import Job
@pytest.mark.django_db
def test_job_wait_successful(run_module, admin_user):
job = Job.objects.create(status='successful', started=now(), finished=now())
result = run_module('tower_job_wait', dict(
job_id=job.id
), admin_user)
result.pop('invocation', None)
assert result.pop('finished', '')[:10] == str(job.finished)[:10]
assert result.pop('started', '')[:10] == str(job.started)[:10]
assert result == {
"status": "successful",
"success": True,
"elapsed": str(job.elapsed),
"id": job.id
}
@pytest.mark.django_db
def test_job_wait_failed(run_module, admin_user):
job = Job.objects.create(status='failed', started=now(), finished=now())
result = run_module('tower_job_wait', dict(
job_id=job.id
), admin_user)
result.pop('invocation', None)
assert result.pop('finished', '')[:10] == str(job.finished)[:10]
assert result.pop('started', '')[:10] == str(job.started)[:10]
assert result == {
"status": "failed",
"failed": True,
"success": False,
"elapsed": str(job.elapsed),
"id": job.id,
"msg": "Job with id=1 failed, error: Job failed."
}
@pytest.mark.django_db
def test_job_wait_not_found(run_module, admin_user):
result = run_module('tower_job_wait', dict(
job_id=42
), admin_user)
result.pop('invocation', None)
assert result == {
"changed": False,
"failed": True,
"msg": "Unable to wait, no job_id 42 found: The requested object could not be found."
}

View File

@ -1,6 +1,9 @@
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
import pytest
from awx.main.models import JobTemplate
from awx.main.models import JobTemplate, Job
@pytest.mark.django_db
@ -31,6 +34,27 @@ def test_create_job_template(run_module, admin_user, project, inventory):
assert jt.inventory_id == inventory.id
@pytest.mark.django_db
def test_job_launch_with_prompting(run_module, admin_user, project, inventory, machine_credential):
JobTemplate.objects.create(
name='foo',
project=project,
playbook='helloworld.yml',
ask_inventory_on_launch=True,
ask_credential_on_launch=True
)
result = run_module('tower_job_launch', dict(
job_template='foo',
inventory=inventory.name,
credential=machine_credential.name
), admin_user)
assert result.pop('changed', None), result
job = Job.objects.get(id=result['id'])
assert job.inventory == inventory
assert [cred.id for cred in job.credentials.all()] == [machine_credential.id]
@pytest.mark.django_db
def test_create_job_template_with_old_machine_cred(run_module, admin_user, project, inventory, machine_credential):

View File

@ -1,3 +1,6 @@
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
import pytest
from awx.main.models import Organization

View File

@ -0,0 +1,28 @@
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
import pytest
from awx.main.models import Project
@pytest.mark.django_db
def test_create_project(run_module, admin_user, organization):
result = run_module('tower_project', dict(
name='foo',
organization=organization.name,
scm_type='git',
scm_url='https://foo.invalid'
), admin_user)
assert result.pop('changed', None), result
proj = Project.objects.get(name='foo')
assert proj.scm_url == 'https://foo.invalid'
assert proj.organization == organization
result.pop('invocation')
assert result == {
'id': proj.id,
'project': 'foo',
'state': 'present'
}

View File

@ -1,3 +1,6 @@
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
import pytest
import json

View File

@ -1,44 +1,2 @@
plugins/modules/tower_credential_type.py validate-modules:missing-module-utils-import
plugins/modules/tower_group.py validate-modules:missing-module-utils-import
plugins/modules/tower_host.py validate-modules:missing-module-utils-import
plugins/modules/tower_inventory.py validate-modules:missing-module-utils-import
plugins/modules/tower_inventory_source.py validate-modules:missing-module-utils-import
plugins/modules/tower_job_cancel.py validate-modules:missing-module-utils-import
plugins/modules/tower_job_launch.py validate-modules:missing-module-utils-import
plugins/modules/tower_job_list.py validate-modules:missing-module-utils-import
plugins/modules/tower_job_template.py validate-modules:missing-module-utils-import
plugins/modules/tower_label.py validate-modules:missing-module-utils-import
plugins/modules/tower_notification.py validate-modules:missing-module-utils-import
plugins/modules/tower_organization.py validate-modules:missing-module-utils-import
plugins/modules/tower_project.py validate-modules:missing-module-utils-import
plugins/modules/tower_receive.py validate-modules:missing-module-utils-import
plugins/modules/tower_role.py validate-modules:missing-module-utils-import
plugins/modules/tower_settings.py validate-modules:missing-module-utils-import
plugins/modules/tower_team.py validate-modules:missing-module-utils-import
plugins/modules/tower_user.py validate-modules:missing-module-utils-import
plugins/modules/tower_workflow_launch.py validate-modules:missing-module-utils-import
plugins/modules/tower_workflow_template.py validate-modules:missing-module-utils-import
plugins/modules/tower_credential_type.py validate-modules:import-error
plugins/modules/tower_credential.py validate-modules:import-error
plugins/modules/tower_group.py validate-modules:import-error
plugins/modules/tower_host.py validate-modules:import-error
plugins/modules/tower_inventory.py validate-modules:import-error
plugins/modules/tower_inventory_source.py validate-modules:import-error
plugins/modules/tower_job_cancel.py validate-modules:import-error
plugins/modules/tower_job_launch.py validate-modules:import-error
plugins/modules/tower_job_list.py validate-modules:import-error
plugins/modules/tower_job_wait.py validate-modules:import-error
plugins/modules/tower_job_template.py validate-modules:import-error
plugins/modules/tower_label.py validate-modules:import-error
plugins/modules/tower_notification.py validate-modules:import-error
plugins/modules/tower_organization.py validate-modules:import-error
plugins/modules/tower_project.py validate-modules:import-error
plugins/modules/tower_receive.py validate-modules:import-error
plugins/modules/tower_role.py validate-modules:import-error
plugins/modules/tower_settings.py validate-modules:import-error
plugins/modules/tower_send.py validate-modules:import-error
plugins/modules/tower_team.py validate-modules:import-error
plugins/modules/tower_user.py validate-modules:import-error
plugins/modules/tower_workflow_launch.py validate-modules:import-error
plugins/modules/tower_workflow_template.py validate-modules:import-error
plugins/modules/tower_workflow_job_template.py validate-modules:import-error
plugins/modules/tower_group.py use-argspec-type-path
plugins/modules/tower_host.py use-argspec-type-path

View File

@ -1,44 +1,2 @@
plugins/modules/tower_credential_type.py validate-modules:missing-module-utils-import
plugins/modules/tower_group.py validate-modules:missing-module-utils-import
plugins/modules/tower_host.py validate-modules:missing-module-utils-import
plugins/modules/tower_inventory.py validate-modules:missing-module-utils-import
plugins/modules/tower_inventory_source.py validate-modules:missing-module-utils-import
plugins/modules/tower_job_cancel.py validate-modules:missing-module-utils-import
plugins/modules/tower_job_launch.py validate-modules:missing-module-utils-import
plugins/modules/tower_job_list.py validate-modules:missing-module-utils-import
plugins/modules/tower_job_template.py validate-modules:missing-module-utils-import
plugins/modules/tower_label.py validate-modules:missing-module-utils-import
plugins/modules/tower_notification.py validate-modules:missing-module-utils-import
plugins/modules/tower_organization.py validate-modules:missing-module-utils-import
plugins/modules/tower_project.py validate-modules:missing-module-utils-import
plugins/modules/tower_receive.py validate-modules:missing-module-utils-import
plugins/modules/tower_role.py validate-modules:missing-module-utils-import
plugins/modules/tower_settings.py validate-modules:missing-module-utils-import
plugins/modules/tower_team.py validate-modules:missing-module-utils-import
plugins/modules/tower_user.py validate-modules:missing-module-utils-import
plugins/modules/tower_workflow_launch.py validate-modules:missing-module-utils-import
plugins/modules/tower_workflow_template.py validate-modules:missing-module-utils-import
plugins/modules/tower_credential_type.py validate-modules:import-error
plugins/modules/tower_credential.py validate-modules:import-error
plugins/modules/tower_group.py validate-modules:import-error
plugins/modules/tower_host.py validate-modules:import-error
plugins/modules/tower_inventory.py validate-modules:import-error
plugins/modules/tower_inventory_source.py validate-modules:import-error
plugins/modules/tower_job_cancel.py validate-modules:import-error
plugins/modules/tower_job_launch.py validate-modules:import-error
plugins/modules/tower_job_list.py validate-modules:import-error
plugins/modules/tower_job_wait.py validate-modules:import-error
plugins/modules/tower_job_template.py validate-modules:import-error
plugins/modules/tower_label.py validate-modules:import-error
plugins/modules/tower_notification.py validate-modules:import-error
plugins/modules/tower_organization.py validate-modules:import-error
plugins/modules/tower_project.py validate-modules:import-error
plugins/modules/tower_receive.py validate-modules:import-error
plugins/modules/tower_role.py validate-modules:import-error
plugins/modules/tower_settings.py validate-modules:import-error
plugins/modules/tower_send.py validate-modules:import-error
plugins/modules/tower_team.py validate-modules:import-error
plugins/modules/tower_user.py validate-modules:import-error
plugins/modules/tower_workflow_launch.py validate-modules:import-error
plugins/modules/tower_workflow_template.py validate-modules:import-error
plugins/modules/tower_workflow_job_template.py validate-modules:import-error
plugins/modules/tower_group.py use-argspec-type-path
plugins/modules/tower_host.py use-argspec-type-path