diff --git a/lib/ansible/modules/system/ping.py b/lib/ansible/modules/system/ping.py index 99c95ac969d..bd6d7076043 100644 --- a/lib/ansible/modules/system/ping.py +++ b/lib/ansible/modules/system/ping.py @@ -48,6 +48,7 @@ ansible webservers -m ping from ansible.module_utils.basic import AnsibleModule + def main(): module = AnsibleModule( argument_spec=dict( @@ -62,6 +63,6 @@ def main(): result['ping'] = module.params['data'] module.exit_json(**result) + if __name__ == '__main__': main() - diff --git a/test/integration/targets/module_precedence/aliases b/test/integration/targets/module_precedence/aliases new file mode 100644 index 00000000000..79d8b9285eb --- /dev/null +++ b/test/integration/targets/module_precedence/aliases @@ -0,0 +1 @@ +posix/ci/group3 diff --git a/test/integration/targets/module_precedence/lib_no_extension/ping b/test/integration/targets/module_precedence/lib_no_extension/ping new file mode 100644 index 00000000000..b5bee2044cc --- /dev/null +++ b/test/integration/targets/module_precedence/lib_no_extension/ping @@ -0,0 +1,69 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# (c) 2012, Michael DeHaan +# (c) 2016, Toshio Kuratomi +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . + + +ANSIBLE_METADATA = {'metadata_version': '1.0', + 'status': ['stableinterface'], + 'supported_by': 'core'} + + +DOCUMENTATION = ''' +--- +module: ping +version_added: historical +short_description: Try to connect to host, verify a usable python and return C(pong) on success. +description: + - A trivial test module, this module always returns C(pong) on successful + contact. It does not make sense in playbooks, but it is useful from + C(/usr/bin/ansible) to verify the ability to login and that a usable python is configured. + - This is NOT ICMP ping, this is just a trivial test module. +options: {} +author: + - "Ansible Core Team" + - "Michael DeHaan" +''' + +EXAMPLES = ''' +# Test we can logon to 'webservers' and execute python with json lib. +ansible webservers -m ping +''' + +from ansible.module_utils.basic import AnsibleModule + + +def main(): + module = AnsibleModule( + argument_spec=dict( + data=dict(required=False, default=None), + ), + supports_check_mode=True + ) + result = dict(ping='pong') + if module.params['data']: + if module.params['data'] == 'crash': + raise Exception("boom") + result['ping'] = module.params['data'] + result['location'] = 'library' + module.exit_json(**result) + + +if __name__ == '__main__': + main() diff --git a/test/integration/targets/module_precedence/lib_with_extension/ping.py b/test/integration/targets/module_precedence/lib_with_extension/ping.py new file mode 100644 index 00000000000..b5bee2044cc --- /dev/null +++ b/test/integration/targets/module_precedence/lib_with_extension/ping.py @@ -0,0 +1,69 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# (c) 2012, Michael DeHaan +# (c) 2016, Toshio Kuratomi +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . + + +ANSIBLE_METADATA = {'metadata_version': '1.0', + 'status': ['stableinterface'], + 'supported_by': 'core'} + + +DOCUMENTATION = ''' +--- +module: ping +version_added: historical +short_description: Try to connect to host, verify a usable python and return C(pong) on success. +description: + - A trivial test module, this module always returns C(pong) on successful + contact. It does not make sense in playbooks, but it is useful from + C(/usr/bin/ansible) to verify the ability to login and that a usable python is configured. + - This is NOT ICMP ping, this is just a trivial test module. +options: {} +author: + - "Ansible Core Team" + - "Michael DeHaan" +''' + +EXAMPLES = ''' +# Test we can logon to 'webservers' and execute python with json lib. +ansible webservers -m ping +''' + +from ansible.module_utils.basic import AnsibleModule + + +def main(): + module = AnsibleModule( + argument_spec=dict( + data=dict(required=False, default=None), + ), + supports_check_mode=True + ) + result = dict(ping='pong') + if module.params['data']: + if module.params['data'] == 'crash': + raise Exception("boom") + result['ping'] = module.params['data'] + result['location'] = 'library' + module.exit_json(**result) + + +if __name__ == '__main__': + main() diff --git a/test/integration/targets/module_precedence/modules_test.yml b/test/integration/targets/module_precedence/modules_test.yml new file mode 100644 index 00000000000..ab783fdbaa8 --- /dev/null +++ b/test/integration/targets/module_precedence/modules_test.yml @@ -0,0 +1,10 @@ +- hosts: localhost + gather_facts: no + tasks: + - name: Use standard ping module + ping: + register: result + + - assert: + that: + - '"location" not in result' diff --git a/test/integration/targets/module_precedence/modules_test_envvar.yml b/test/integration/targets/module_precedence/modules_test_envvar.yml new file mode 100644 index 00000000000..5b6338a3753 --- /dev/null +++ b/test/integration/targets/module_precedence/modules_test_envvar.yml @@ -0,0 +1,11 @@ +- hosts: localhost + gather_facts: no + tasks: + - name: Use ping from library path + ping: + register: result + + - assert: + that: + - '"location" in result' + - 'result["location"] == "library"' diff --git a/test/integration/targets/module_precedence/modules_test_multiple_roles.yml b/test/integration/targets/module_precedence/modules_test_multiple_roles.yml new file mode 100644 index 00000000000..855afb7710a --- /dev/null +++ b/test/integration/targets/module_precedence/modules_test_multiple_roles.yml @@ -0,0 +1,17 @@ +- hosts: localhost + gather_facts: no + vars: + expected_location: "role: foo" + roles: + - foo + - bar + + tasks: + - name: Use ping from role + ping: + register: result + + - assert: + that: + - '"location" in result' + - 'result["location"] == "{{ expected_location}}"' diff --git a/test/integration/targets/module_precedence/modules_test_multiple_roles_reverse_order.yml b/test/integration/targets/module_precedence/modules_test_multiple_roles_reverse_order.yml new file mode 100644 index 00000000000..5c57801566d --- /dev/null +++ b/test/integration/targets/module_precedence/modules_test_multiple_roles_reverse_order.yml @@ -0,0 +1,16 @@ +- hosts: localhost + gather_facts: no + vars: + expected_location: "role: bar" + roles: + - bar + - foo + tasks: + - name: Use ping from role + ping: + register: result + + - assert: + that: + - '"location" in result' + - 'result["location"] == "{{ expected_location}}"' diff --git a/test/integration/targets/module_precedence/modules_test_role.yml b/test/integration/targets/module_precedence/modules_test_role.yml new file mode 100644 index 00000000000..9a71598875e --- /dev/null +++ b/test/integration/targets/module_precedence/modules_test_role.yml @@ -0,0 +1,13 @@ +- hosts: localhost + gather_facts: no + roles: + - foo + tasks: + - name: Use ping from role + ping: + register: result + + - assert: + that: + - '"location" in result' + - 'result["location"] == "role: foo"' diff --git a/test/integration/targets/module_precedence/multiple_roles/bar/library/ping.py b/test/integration/targets/module_precedence/multiple_roles/bar/library/ping.py new file mode 100644 index 00000000000..17f1f810b1b --- /dev/null +++ b/test/integration/targets/module_precedence/multiple_roles/bar/library/ping.py @@ -0,0 +1,69 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# (c) 2012, Michael DeHaan +# (c) 2016, Toshio Kuratomi +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . + + +ANSIBLE_METADATA = {'metadata_version': '1.0', + 'status': ['stableinterface'], + 'supported_by': 'core'} + + +DOCUMENTATION = ''' +--- +module: ping +version_added: historical +short_description: Try to connect to host, verify a usable python and return C(pong) on success. +description: + - A trivial test module, this module always returns C(pong) on successful + contact. It does not make sense in playbooks, but it is useful from + C(/usr/bin/ansible) to verify the ability to login and that a usable python is configured. + - This is NOT ICMP ping, this is just a trivial test module. +options: {} +author: + - "Ansible Core Team" + - "Michael DeHaan" +''' + +EXAMPLES = ''' +# Test we can logon to 'webservers' and execute python with json lib. +ansible webservers -m ping +''' + +from ansible.module_utils.basic import AnsibleModule + + +def main(): + module = AnsibleModule( + argument_spec=dict( + data=dict(required=False, default=None), + ), + supports_check_mode=True + ) + result = dict(ping='pong') + if module.params['data']: + if module.params['data'] == 'crash': + raise Exception("boom") + result['ping'] = module.params['data'] + result['location'] = 'role: bar' + module.exit_json(**result) + + +if __name__ == '__main__': + main() diff --git a/test/integration/targets/module_precedence/multiple_roles/bar/tasks/main.yml b/test/integration/targets/module_precedence/multiple_roles/bar/tasks/main.yml new file mode 100644 index 00000000000..52c34020130 --- /dev/null +++ b/test/integration/targets/module_precedence/multiple_roles/bar/tasks/main.yml @@ -0,0 +1,10 @@ +--- +- name: Use ping from inside foo role + ping: + register: result + +- name: Make sure that we used the ping module from the foo role + assert: + that: + - '"location" in result' + - 'result["location"] == "{{ expected_location }}"' diff --git a/test/integration/targets/module_precedence/multiple_roles/foo/library/ping.py b/test/integration/targets/module_precedence/multiple_roles/foo/library/ping.py new file mode 100644 index 00000000000..d12c6ce26ec --- /dev/null +++ b/test/integration/targets/module_precedence/multiple_roles/foo/library/ping.py @@ -0,0 +1,69 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# (c) 2012, Michael DeHaan +# (c) 2016, Toshio Kuratomi +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . + + +ANSIBLE_METADATA = {'metadata_version': '1.0', + 'status': ['stableinterface'], + 'supported_by': 'core'} + + +DOCUMENTATION = ''' +--- +module: ping +version_added: historical +short_description: Try to connect to host, verify a usable python and return C(pong) on success. +description: + - A trivial test module, this module always returns C(pong) on successful + contact. It does not make sense in playbooks, but it is useful from + C(/usr/bin/ansible) to verify the ability to login and that a usable python is configured. + - This is NOT ICMP ping, this is just a trivial test module. +options: {} +author: + - "Ansible Core Team" + - "Michael DeHaan" +''' + +EXAMPLES = ''' +# Test we can logon to 'webservers' and execute python with json lib. +ansible webservers -m ping +''' + +from ansible.module_utils.basic import AnsibleModule + + +def main(): + module = AnsibleModule( + argument_spec=dict( + data=dict(required=False, default=None), + ), + supports_check_mode=True + ) + result = dict(ping='pong') + if module.params['data']: + if module.params['data'] == 'crash': + raise Exception("boom") + result['ping'] = module.params['data'] + result['location'] = 'role: foo' + module.exit_json(**result) + + +if __name__ == '__main__': + main() diff --git a/test/integration/targets/module_precedence/multiple_roles/foo/tasks/main.yml b/test/integration/targets/module_precedence/multiple_roles/foo/tasks/main.yml new file mode 100644 index 00000000000..52c34020130 --- /dev/null +++ b/test/integration/targets/module_precedence/multiple_roles/foo/tasks/main.yml @@ -0,0 +1,10 @@ +--- +- name: Use ping from inside foo role + ping: + register: result + +- name: Make sure that we used the ping module from the foo role + assert: + that: + - '"location" in result' + - 'result["location"] == "{{ expected_location }}"' diff --git a/test/integration/targets/module_precedence/roles_no_extension/foo/library/ping b/test/integration/targets/module_precedence/roles_no_extension/foo/library/ping new file mode 100644 index 00000000000..d12c6ce26ec --- /dev/null +++ b/test/integration/targets/module_precedence/roles_no_extension/foo/library/ping @@ -0,0 +1,69 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# (c) 2012, Michael DeHaan +# (c) 2016, Toshio Kuratomi +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . + + +ANSIBLE_METADATA = {'metadata_version': '1.0', + 'status': ['stableinterface'], + 'supported_by': 'core'} + + +DOCUMENTATION = ''' +--- +module: ping +version_added: historical +short_description: Try to connect to host, verify a usable python and return C(pong) on success. +description: + - A trivial test module, this module always returns C(pong) on successful + contact. It does not make sense in playbooks, but it is useful from + C(/usr/bin/ansible) to verify the ability to login and that a usable python is configured. + - This is NOT ICMP ping, this is just a trivial test module. +options: {} +author: + - "Ansible Core Team" + - "Michael DeHaan" +''' + +EXAMPLES = ''' +# Test we can logon to 'webservers' and execute python with json lib. +ansible webservers -m ping +''' + +from ansible.module_utils.basic import AnsibleModule + + +def main(): + module = AnsibleModule( + argument_spec=dict( + data=dict(required=False, default=None), + ), + supports_check_mode=True + ) + result = dict(ping='pong') + if module.params['data']: + if module.params['data'] == 'crash': + raise Exception("boom") + result['ping'] = module.params['data'] + result['location'] = 'role: foo' + module.exit_json(**result) + + +if __name__ == '__main__': + main() diff --git a/test/integration/targets/module_precedence/roles_no_extension/foo/tasks/main.yml b/test/integration/targets/module_precedence/roles_no_extension/foo/tasks/main.yml new file mode 100644 index 00000000000..985fc341153 --- /dev/null +++ b/test/integration/targets/module_precedence/roles_no_extension/foo/tasks/main.yml @@ -0,0 +1,10 @@ +--- +- name: Use ping from inside foo role + ping: + register: result + +- name: Make sure that we used the ping module from the foo role + assert: + that: + - '"location" in result' + - 'result["location"] == "role: foo"' diff --git a/test/integration/targets/module_precedence/roles_with_extension/foo/library/ping.py b/test/integration/targets/module_precedence/roles_with_extension/foo/library/ping.py new file mode 100644 index 00000000000..d12c6ce26ec --- /dev/null +++ b/test/integration/targets/module_precedence/roles_with_extension/foo/library/ping.py @@ -0,0 +1,69 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# (c) 2012, Michael DeHaan +# (c) 2016, Toshio Kuratomi +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . + + +ANSIBLE_METADATA = {'metadata_version': '1.0', + 'status': ['stableinterface'], + 'supported_by': 'core'} + + +DOCUMENTATION = ''' +--- +module: ping +version_added: historical +short_description: Try to connect to host, verify a usable python and return C(pong) on success. +description: + - A trivial test module, this module always returns C(pong) on successful + contact. It does not make sense in playbooks, but it is useful from + C(/usr/bin/ansible) to verify the ability to login and that a usable python is configured. + - This is NOT ICMP ping, this is just a trivial test module. +options: {} +author: + - "Ansible Core Team" + - "Michael DeHaan" +''' + +EXAMPLES = ''' +# Test we can logon to 'webservers' and execute python with json lib. +ansible webservers -m ping +''' + +from ansible.module_utils.basic import AnsibleModule + + +def main(): + module = AnsibleModule( + argument_spec=dict( + data=dict(required=False, default=None), + ), + supports_check_mode=True + ) + result = dict(ping='pong') + if module.params['data']: + if module.params['data'] == 'crash': + raise Exception("boom") + result['ping'] = module.params['data'] + result['location'] = 'role: foo' + module.exit_json(**result) + + +if __name__ == '__main__': + main() diff --git a/test/integration/targets/module_precedence/roles_with_extension/foo/tasks/main.yml b/test/integration/targets/module_precedence/roles_with_extension/foo/tasks/main.yml new file mode 100644 index 00000000000..985fc341153 --- /dev/null +++ b/test/integration/targets/module_precedence/roles_with_extension/foo/tasks/main.yml @@ -0,0 +1,10 @@ +--- +- name: Use ping from inside foo role + ping: + register: result + +- name: Make sure that we used the ping module from the foo role + assert: + that: + - '"location" in result' + - 'result["location"] == "role: foo"' diff --git a/test/integration/targets/module_precedence/runme.sh b/test/integration/targets/module_precedence/runme.sh new file mode 100755 index 00000000000..a9af3ca2bc3 --- /dev/null +++ b/test/integration/targets/module_precedence/runme.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash + +set -eux + +# Standard ping module +ansible-playbook modules_test.yml -i ../../inventory -v "$@" + +# Library path ping module +ANSIBLE_LIBRARY=$(pwd)/lib_with_extension ansible-playbook modules_test_envvar.yml -i ../../inventory -v "$@" +ANSIBLE_LIBRARY=$(pwd)/lib_no_extension ansible-playbook modules_test_envvar.yml -i ../../inventory -v "$@" + +# ping module from role +ANSIBLE_ROLES_PATH=$(pwd)/roles_with_extension ansible-playbook modules_test_role.yml -i ../../inventory -v "$@" +ANSIBLE_ROLES_PATH=$(pwd)/roles_no_extension ansible-playbook modules_test_role.yml -i ../../inventory -v "$@" + +# ping module from role when there's a library path module too +ANSIBLE_LIBRARY=$(pwd)/lib_no_extension ANSIBLE_ROLES_PATH=$(pwd)/roles_with_extension ansible-playbook modules_test_role.yml -i ../../inventory -v "$@" +ANSIBLE_LIBRARY=$(pwd)/lib_with_extension ANSIBLE_ROLES_PATH=$(pwd)/roles_with_extension ansible-playbook modules_test_role.yml -i ../../inventory -v "$@" +ANSIBLE_LIBRARY=$(pwd)/lib_no_extension ANSIBLE_ROLES_PATH=$(pwd)/roles_no_extension ansible-playbook modules_test_role.yml -i ../../inventory -v "$@" +ANSIBLE_LIBRARY=$(pwd)/lib_with_extension ANSIBLE_ROLES_PATH=$(pwd)/roles_no_extension ansible-playbook modules_test_role.yml -i ../../inventory -v "$@" + +# ping module in multiple roles: Note that this will use the first module found +# which is the current way things work but may not be the best way +ANSIBLE_LIBRARY=$(pwd)/lib_no_extension ANSIBLE_ROLES_PATH=$(pwd)/multiple_roles ansible-playbook modules_test_multiple_roles.yml -i ../../inventory -v "$@" +ANSIBLE_LIBRARY=$(pwd)/lib_with_extension ANSIBLE_ROLES_PATH=$(pwd)/multiple_roles ansible-playbook modules_test_multiple_roles.yml -i ../../inventory -v "$@" +ANSIBLE_LIBRARY=$(pwd)/lib_no_extension ANSIBLE_ROLES_PATH=$(pwd)/multiple_roles ansible-playbook modules_test_multiple_roles.yml -i ../../inventory -v "$@" +ANSIBLE_LIBRARY=$(pwd)/lib_with_extension ANSIBLE_ROLES_PATH=$(pwd)/multiple_roles ansible-playbook modules_test_multiple_roles.yml -i ../../inventory -v "$@" + +# And prove that with multiple roles, it's the order the roles are listed in the play that matters +ANSIBLE_LIBRARY=$(pwd)/lib_with_extension ANSIBLE_ROLES_PATH=$(pwd)/multiple_roles ansible-playbook modules_test_multiple_roles_reverse_order.yml -i ../../inventory -v "$@" diff --git a/test/sanity/code-smell/shebang.sh b/test/sanity/code-smell/shebang.sh index 0bc77b818dc..76d72c1ff94 100755 --- a/test/sanity/code-smell/shebang.sh +++ b/test/sanity/code-smell/shebang.sh @@ -7,6 +7,7 @@ grep '^#!' -rIn . \ -e '^\./lib/ansible/modules/' \ -e '^\./test/integration/targets/[^/]*/library/[^/]*:#!powershell$' \ -e '^\./test/integration/targets/[^/]*/library/[^/]*:#!/usr/bin/python$' \ + -e '^\./test/integration/targets/module_precedence/.*lib.*:#!/usr/bin/python$' \ -e '^\./hacking/cherrypick.py:#!/usr/bin/env python3$' \ -e ':#!/bin/sh$' \ -e ':#!/bin/bash( -[eux]|$)' \ diff --git a/test/sanity/pep8/legacy-files.txt b/test/sanity/pep8/legacy-files.txt index 7c9d917c338..26ddf74761c 100644 --- a/test/sanity/pep8/legacy-files.txt +++ b/test/sanity/pep8/legacy-files.txt @@ -736,7 +736,6 @@ lib/ansible/modules/system/osx_defaults.py lib/ansible/modules/system/pam_limits.py lib/ansible/modules/system/pamd.py lib/ansible/modules/system/parted.py -lib/ansible/modules/system/ping.py lib/ansible/modules/system/puppet.py lib/ansible/modules/system/runit.py lib/ansible/modules/system/seboolean.py