Skip to content

Commit

Permalink
WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
moreati committed Oct 17, 2024
1 parent 3b2b03b commit df98f9f
Show file tree
Hide file tree
Showing 11 changed files with 104 additions and 106 deletions.
60 changes: 0 additions & 60 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,58 +24,12 @@ jobs:
fail-fast: false
matrix:
include:
- name: Ans_27_210
tox_env: py27-mode_ansible-ansible2.10
- name: Ans_27_4
tox_env: py27-mode_ansible-ansible4

- name: Ans_36_210
python_version: '3.6'
tox_env: py36-mode_ansible-ansible2.10
- name: Ans_36_4
python_version: '3.6'
tox_env: py36-mode_ansible-ansible4

- name: Ans_311_210
python_version: '3.11'
tox_env: py311-mode_ansible-ansible2.10
- name: Ans_311_3
python_version: '3.11'
tox_env: py311-mode_ansible-ansible3
- name: Ans_311_4
python_version: '3.11'
tox_env: py311-mode_ansible-ansible4
- name: Ans_311_5
python_version: '3.11'
tox_env: py311-mode_ansible-ansible5
- name: Ans_313_6
python_version: '3.13'
tox_env: py313-mode_ansible-ansible6
- name: Ans_313_7
python_version: '3.13'
tox_env: py313-mode_ansible-ansible7
- name: Ans_313_8
python_version: '3.13'
tox_env: py313-mode_ansible-ansible8
- name: Ans_313_9
python_version: '3.13'
tox_env: py313-mode_ansible-ansible9
- name: Ans_313_10
python_version: '3.13'
tox_env: py313-mode_ansible-ansible10
- name: Van_313_10
python_version: '3.13'
tox_env: py313-mode_ansible-ansible10-strategy_linear

- name: Mito_27
tox_env: py27-mode_mitogen
- name: Mito_36
python_version: '3.6'
tox_env: py36-mode_mitogen
- name: Mito_313
python_version: '3.13'
tox_env: py313-mode_mitogen

steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
Expand Down Expand Up @@ -164,24 +118,10 @@ jobs:
fail-fast: false
matrix:
include:
- name: Mito_27
tox_env: py27-mode_mitogen
- name: Mito_313
python_version: '3.13'
tox_env: py313-mode_mitogen

- name: Loc_27_210
tox_env: py27-mode_localhost-ansible2.10
- name: Loc_313_10
python_version: '3.13'
tox_env: py313-mode_localhost-ansible10

- name: Van_27_210
tox_env: py27-mode_localhost-ansible2.10-strategy_linear
- name: Van_313_10
python_version: '3.13'
tox_env: py313-mode_localhost-ansible10-strategy_linear

steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
Expand Down
29 changes: 25 additions & 4 deletions ansible_mitogen/runner.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,11 @@
import shutil
import sys
import tempfile
import textwrap
import traceback
import types

from ansible.module_utils.common.text.converters import to_native
from ansible.module_utils.six.moves import shlex_quote

import mitogen.core
Expand All @@ -75,6 +77,7 @@
# Prevent accidental import of an Ansible module from hanging on stdin read.
import ansible.module_utils.basic
ansible.module_utils.basic._ANSIBLE_ARGS = '{}'
import ansible.module_utils.common.respawn

# For tasks that modify /etc/resolv.conf, non-Debian derivative glibcs cache
# resolv.conf at startup and never implicitly reload it. Cope with that via an
Expand Down Expand Up @@ -622,6 +625,20 @@ def revert(self):
sys.argv[:] = self.original


def _create_payload():
smuggled_args = getattr(ansible.module_utils.basic, '_ANSIBLE_ARGS')
if not smuggled_args:
raise Exception('unable to access ansible.module_utils.basic._ANSIBLE_ARGS (not launched by AnsiballZ?)')

assert 0, '%r, %r, spec %r' % (
sys.modules['__main__'],
' '.join('%s=%r' % (s, getattr(sys.modules['__main__'], s)) for s in sorted(dir(sys.modules['__main__']))),
' '.join('%s=%r' % (s, getattr(sys.modules['__main__'].__spec__, s)) for s in sorted(dir(sys.modules['__main__'].__spec__))),
)
module_fqn = sys.modules['__main__']._module_fqn
modlib_path = sys.modules['__main__']._modlib_path


class NewStyleStdio(object):
"""
Patch ansible.module_utils.basic argument globals.
Expand All @@ -640,11 +657,15 @@ def __init__(self, args, temp_dir):
self.original_get_path = getattr(ansible.module_utils.basic,
'get_module_path', None)
ansible.module_utils.basic.get_module_path = self._get_path
#self.original_create_payload = getattr(ansible.module_utils.common.respawn,
# '_create_payload', None)
#ansible.module_utils.common.respawn._create_payload = _create_payload

def _get_path(self):
return self.temp_dir

def revert(self):
#ansible.module_utils.common.respawn._create_payload = self.original_create_payload
ansible.module_utils.basic.get_module_path = self.original_get_path
sys.stdout = self.original_stdout
sys.stderr = self.original_stderr
Expand Down Expand Up @@ -978,10 +999,7 @@ def _get_code(self):
True, # dont_inherit
))

if mitogen.core.PY3:
main_module_name = '__main__'
else:
main_module_name = b'__main__'
main_module_name = '__main__'

def _handle_magic_exception(self, mod, exc):
"""
Expand Down Expand Up @@ -1032,6 +1050,9 @@ def _run(self):
'ansible_module_' + os.path.basename(self.path),
)

# CREDIT https://github.com/phemmer
# https://github.com/mitogen-hq/mitogen/issues/849#issuecomment-988207114
sys.modules['__main__']._module_fqn = self.py_module_name
code = self._get_code()
rc = 2
try:
Expand Down
6 changes: 4 additions & 2 deletions ansible_mitogen/target.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,8 +60,10 @@
# ansible.module_utils.basic. Mitogen's importer will refuse such an import, so
# we must setup a fake "__main__" before that module is ever imported. The
# str() is to cast Unicode to bytes on Python 2.6.
if not sys.modules.get(str('__main__')):
sys.modules[str('__main__')] = types.ModuleType(str('__main__'))
if '__main__' not in sys.modules:
sys.modules['__main__'] = types.ModuleType(
'__main__', doc='ansible_mitogen.target __main__ module substitute',
)

import ansible.module_utils.json_utils

Expand Down
2 changes: 0 additions & 2 deletions tests/ansible/all.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
- import_playbook: setup/all.yml
tags: setup
- import_playbook: regression/all.yml
tags: regression
- import_playbook: integration/all.yml
tags: integration
1 change: 1 addition & 0 deletions tests/ansible/hosts/group_vars/all.yml
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
---
pkg_mgr_python_interpreter: python
pkg_repos_gpg_keys: []
pkg_repos_overrides: []
3 changes: 3 additions & 0 deletions tests/ansible/hosts/group_vars/debian11.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
pkg_repos_gpg_keys:
- src: debian-archive-bullseye-automatic.gpg # Debian 11
- src: debian-archive-bookworm-automatic.gpg # Debian 12
38 changes: 1 addition & 37 deletions tests/ansible/integration/all.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,40 +2,4 @@
#
# This playbook imports all tests that are known to work at present.
#

- import_playbook: action/all.yml
tags: action
- import_playbook: async/all.yml
tags: async
- import_playbook: become/all.yml
tags: become
- import_playbook: connection/all.yml
tags: connection
- import_playbook: connection_delegation/all.yml
tags: connection_delegation
- import_playbook: connection_loader/all.yml
tags: connection_loader
- import_playbook: context_service/all.yml
tags: context_service
- import_playbook: glibc_caches/all.yml
tags: glibc_caches
- import_playbook: interpreter_discovery/all.yml
tags: interpreter_discovery
- import_playbook: local/all.yml
tags: local
- import_playbook: module_utils/all.yml
tags: module_utils
- import_playbook: playbook_semantics/all.yml
tags: playbook_semantics
- import_playbook: process/all.yml
tags: process
- import_playbook: runner/all.yml
tags: runner
- import_playbook: ssh/all.yml
tags: ssh
- import_playbook: strategy/all.yml
tags: strategy
- import_playbook: stub_connections/all.yml
tags: stub_connections
- import_playbook: transport_config/all.yml
tags: transport_config
- import_playbook: package_managers/all.yml
69 changes: 69 additions & 0 deletions tests/ansible/integration/package_managers/all.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
- name: integration/package_managers/all.yml
hosts: test-targets
gather_facts: true
# Most OS package managers need root. Homebrew refuses to run as root. This
# approximates "pkg_mgr == homebrew" for the Linux & macOS runners in CI.
become: "{{ inventory_hostname in (groups.linux | default([])) }}"
vars:
ansible_python_interpreter: auto
package: rsync # Chosen to exist in all tested distros/package managers
tasks:
- name: Switch to archived package repositories
copy:
dest: "{{ item.dest }}"
content: "{{ item.content }}"
mode: u=rw,go=r
loop: "{{ pkg_repos_overrides }}"
loop_control:
label: "{{ item.dest }}"

- name: Add signing keys
copy:
src: "{{ item.src }}"
dest: "/etc/apt/trusted.gpg.d/{{ item.src | basename }}"
mode: u=rw,go=r
loop: "{{ pkg_repos_gpg_keys }}"

- name: Update package index
apt:
update_cache: true
when:
- ansible_facts.pkg_mgr in ["apt"]

- name: Test package module 1st call
package:
name: "{{ package }}"
state: present

- name: Test package module 2nd call
package:
name: "{{ package }}"
state: present

- name: Test dnf module 1st call
dnf:
name: "{{ package }}"
state: present
when:
- ansible_facts.pkg_mgr == 'dnf'

- name: Test dnf module 2nd call
dnf:
name: "{{ package }}"
state: present
when:
- ansible_facts.pkg_mgr == 'dnf'

- name: Test apt module 1st call
apt:
name: "{{ package }}"
state: present
when:
- ansible_facts.pkg_mgr == 'apt'

- name: Test apt module 2nd call
apt:
name: "{{ package }}"
state: present
when:
- ansible_facts.pkg_mgr == 'apt'
Binary file not shown.
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@
name: "{{ package }}"
state: present

- name: Test dnf module 2nd call
- name: Test dnf module 1st call
dnf:
name: "{{ package }}"
state: present
Expand Down

0 comments on commit df98f9f

Please sign in to comment.