From 755ba734fb463a6050a488cfc073cb2157e518f5 Mon Sep 17 00:00:00 2001 From: Alex Willmer Date: Tue, 15 Oct 2024 12:12:22 +0100 Subject: [PATCH] WIP --- .github/workflows/tests.yml | 60 --------------- ansible_mitogen/runner.py | 30 +++++++- ansible_mitogen/target.py | 6 +- tests/ansible/all.yml | 2 - tests/ansible/hosts/group_vars/all.yml | 1 + tests/ansible/hosts/group_vars/debian11.yml | 3 + tests/ansible/integration/all.yml | 38 +--------- .../integration/package_managers/all.yml | 69 ++++++++++++++++++ .../debian-archive-bookworm-automatic.gpg | Bin 0 -> 5836 bytes .../debian-archive-bullseye-automatic.gpg | Bin 0 -> 5836 bytes .../issue_776__load_plugins_called_twice.yml | 2 +- 11 files changed, 105 insertions(+), 106 deletions(-) create mode 100644 tests/ansible/hosts/group_vars/debian11.yml create mode 100644 tests/ansible/integration/package_managers/all.yml create mode 100644 tests/ansible/integration/package_managers/files/debian-archive-bookworm-automatic.gpg create mode 100644 tests/ansible/integration/package_managers/files/debian-archive-bullseye-automatic.gpg diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index cc20f04a2..27a5e0833 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -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 @@ -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 diff --git a/ansible_mitogen/runner.py b/ansible_mitogen/runner.py index b60e537ce..032e141fd 100644 --- a/ansible_mitogen/runner.py +++ b/ansible_mitogen/runner.py @@ -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 @@ -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 @@ -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. @@ -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 @@ -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): """ @@ -1032,6 +1050,10 @@ 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 + sys.modules['__main__']._modlib_path = self.get_temp_dir() code = self._get_code() rc = 2 try: diff --git a/ansible_mitogen/target.py b/ansible_mitogen/target.py index ee4cb398f..5985ff426 100644 --- a/ansible_mitogen/target.py +++ b/ansible_mitogen/target.py @@ -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 diff --git a/tests/ansible/all.yml b/tests/ansible/all.yml index 7a3e70001..49a3d83a1 100644 --- a/tests/ansible/all.yml +++ b/tests/ansible/all.yml @@ -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 diff --git a/tests/ansible/hosts/group_vars/all.yml b/tests/ansible/hosts/group_vars/all.yml index ad4adabb6..55317d34a 100644 --- a/tests/ansible/hosts/group_vars/all.yml +++ b/tests/ansible/hosts/group_vars/all.yml @@ -1,3 +1,4 @@ --- pkg_mgr_python_interpreter: python +pkg_repos_gpg_keys: [] pkg_repos_overrides: [] diff --git a/tests/ansible/hosts/group_vars/debian11.yml b/tests/ansible/hosts/group_vars/debian11.yml new file mode 100644 index 000000000..615fa099c --- /dev/null +++ b/tests/ansible/hosts/group_vars/debian11.yml @@ -0,0 +1,3 @@ +pkg_repos_gpg_keys: + - src: debian-archive-bullseye-automatic.gpg # Debian 11 + - src: debian-archive-bookworm-automatic.gpg # Debian 12 diff --git a/tests/ansible/integration/all.yml b/tests/ansible/integration/all.yml index ac196584e..dd1e0cb2b 100644 --- a/tests/ansible/integration/all.yml +++ b/tests/ansible/integration/all.yml @@ -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 diff --git a/tests/ansible/integration/package_managers/all.yml b/tests/ansible/integration/package_managers/all.yml new file mode 100644 index 000000000..869949071 --- /dev/null +++ b/tests/ansible/integration/package_managers/all.yml @@ -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' diff --git a/tests/ansible/integration/package_managers/files/debian-archive-bookworm-automatic.gpg b/tests/ansible/integration/package_managers/files/debian-archive-bookworm-automatic.gpg new file mode 100644 index 0000000000000000000000000000000000000000..ae9cfa19dd6ca8a42ffcfb3971edd607b277d71e GIT binary patch literal 5836 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 literal 0 HcmV?d00001 diff --git a/tests/ansible/integration/package_managers/files/debian-archive-bullseye-automatic.gpg b/tests/ansible/integration/package_managers/files/debian-archive-bullseye-automatic.gpg new file mode 100644 index 0000000000000000000000000000000000000000..66f1a94b55e3cd55f946abd6d5ff5beb4294b161 GIT binary patch literal 5836 zcma)=Wl$6hyM~t~Ru*sCPU%Ks>0G)I5D@AYWb#rPC>IQ$22;>9tr=Go3vJ_x zyQ5U|Tfx=dLuo6UIakPH=V<>+HPR$r#{??l1N3cNMGzz*jCi3Tw$?O2Jb?Eko_H^Ljp}$u}v% z5scH>!YMp!-Mz&~rypc&Sbl9a&?<2NJ{kZm0;qyPjRpn?647E%N2G}X0`J#JE=E7O zN%84v^jfU%+fc_yrYJg`Y~ zP-R~5;7lG0(;d;kvI}Y!&`nP^Wjd**P(qpK!4%O~Ht~jL(MwE=aNAp>7PNi)TyT>^ zI3sp-flW&w{xMotksM15)!UxhbjrD$tp3IzzXv!g2D;rw-%h(&{%~W-&i>{)_6rHF zbNaViGuU>Pty)^=| z{?k2mE-y%2>g9$BFvU1J*Ci2HRDO83FSL92fitpo-Tfvx5{r zXIZU%VdEl3^g*MYN)NdLD^$|2rAx)fp@BWf5AQPsHKxGU@G#9M{~V}4x9#TWVJu}n_u8&d)D z7{Ofo-Z1$}bzlN>oYyMO<2%O^Ca=_dM}h>eT9k;UVgIB4=@QoY6>C^tFuPcmGe!ii z`()~my|yRY+ErLpj;8kJ9*iv_#AODC0FOqAL7~QmAr+=@h7QFDj>T;K?W9AdZVNk- zm-u(+3))6K-9bZr?WZ-`M1~AV zICIGCB!)BSE*Z}k$D>4@o8H^-Z1VjE13+F$HA&noIqE69uLX2BqbXNzC@Mlhdq_}h z+aKC?mhw4f9s+s&YrH>44={g=MnI%b9SBI5^@JO6*G3d)+fZG8t6a^Vc(?#~Y#*k-eJgcz4mwfX7ueedlhFm6?$#Q5AES?0%6U&pSq(VcFnc?`yY&LM zAmFqR1}gvSOl{a=ixTP{`Q%O3pXmtc;axc3)5c_7}J4T^Xwuu5bT1Pwm!)98&Rl!OlmCQme;jm*LOi{G%_)izAcE_xm_`rvOjB7 zEL9~JB$Ax1_mu1SPwvPn`AeJ{ib2og^vNbEr?GDfw14Dmoya5rDO*{Jo^v(6EYz2N zt0M9Kz>+-A65?y60hEbT4JR2Vfo~?~IJD6?p+tSEesTY@OWoB)3MA)lX|Fi3uIo1> zC>!`vDU@<9!ngI-ALVjZ?`O9!AY&<6I76|%EiP+}rpNCOCcAA~DBV7Y!ZKVf$u{6+ z1r=@+XAfV!46#Z30723mXL2EE70#f>0&(dx{DCrWJXSBqMJOwDwxqvV_1(1wqC>nB z(_~pcw)J9zeU&zcF<8vWeFpWfIIb6oS-vN#vzR+>g2y^<`^^;PI`Ojz4jGbptR}`+ zqcJ8V4pa09q>kIoMx+jZ7Bs%^fu0N9re2!Y$>9$%)1I-5c!#)C(zVdUp2Df#Uj%-%)Jw!-Pu{1A$++{RpeN z5BeKW0^cDI90KX1;p>hy`moItt$+mcnaxI~OQ>wHi`S-IC@q`+9#_}#?vqpI{CC93 zsNPi78?tocofunon>pT8Z@0*zmSKN){^h4|hmzvwgD8OAsX0Y{R7UQ`Yr|!7f)xCD z?bWBKlv;j8hviwWemoG>L(*{)+f-oE?;|K)y>;HNFA;@N0h-6K$g#z*8&MSzHu9{BXHWPVH zpJ_&bQmLDxtITB1l*1%Axkx$rlAPf(ov7xRYubK&;fibMzFyyU7fH^)&22PjCf!a~ z5#RbSl5{-Wk=iS`%y zfkM?{6I0b!6G6aB?p%JDHOSG>qH?HuU(ANW;GGnP9c(Y2j$T*+S5uECn618xzFzW{ z0bOr90^G*M!-kKLIoz9MZ0i3G=ayHEf*q91hpVs^Nd(bwVBKQ^e0hl62t{Rfp&jp^ zb3jt+0-a(crHxX`s_2}tlw(`olMQOS%!P4OhSbOY40}?2MB_w#C?O!4Fs?yD-qSzv z&w(0HwHeyysm1cwxDe0RJFM}fIy#%h}@#5L%)zT^w#nqIoyUc19p~PdG^CH?v1wT33$XI1~k%& z!FIE0w!_NxM^d4rd++ubg9VM95=E2vQrT&$6a3O@<56A5I7LT3$|@GARTF zlwuO*=2$u$2IRbWTPU8KV*oDh%EOZ*omQNyzw}yogg@?+Q1K~oSBoYp(oI63zX$JF zEnCOkqaaoa`i%|FQ!_@B;{xWW8=7Pgl!s-5rpWYU)3F5*bd;7j=7RJBWdQ7SmrHvz{B~%_H?d+oF1fu(gHFiIL23ROL=ZQ~kCX_h;wxSXaNL#NQ*(GnrlF?bo~%sI@ZqdrpB+xs)f4x;KXht3(_T$X zMXG?JF#XOO>S*p}8P1h_Ud25GrWx5Vjmm*$gilB~&j6O%G)6Ym~ z4X7couW*tXvYOXaJWS3d;H0iPbqX@(@2pMiX(XLZt*qV6X(ZiT9qde8txah(tu5`X z?Ja2(%{^(DUcBIZ=Voi`V(w|qO!Lyh)zQwx#ns$d!t7sZ4hLsTu?V0R2EkwZUhMzc z_qafEbWCgrb_M_w2m1*K9TNt|eu9HZ1Vl#z0IAS`!~y?%<$wJG1=LeSgkm~ufIqx; z+2xuq2pJh*>q{zfOY2j>-s}IF7Q&e5u&1rdeTE{l=9p#~jCIc1xt=gE8J9Sj6(m~s zHWk+fF-T?a#BWfv;XW*?dn2a@N;@a5r(`+IoU(py*mB{e?i-5)jp;gJ%d8$PO<`+M z9Qtf`7b?f}>GZad#rrS+6gg=}C9 z`!>f~5(ZLBH!23YlYZh`5*nWcEjr(tfQa1hR%kC`-aRZU2{_2vo zLTW*fPz@=?nrZSM#eJtqlg{C)(bf|JMa&+{PmLU}MsXQWOtR#jsjeA!9g3UT#NUkRgzNxKJI!%c3x&SCy7?nYc)@_kFRUGo8+zwwVT5E z?wx%6LM(foFjVJL^;>#ZrmAmVQ-m-j9=0KMj;@B6(zPqH?o_cq_dhu7+xUU~U5^L>f<1$nOI43#^o z6-V7)BkC(tJHn#n{dlPPQ>EN=C4})VX|Lz3c?CA-<%OISG~pSfR~(cIDo@m(8hz^d zUYydCm~%>ZPN?ctILGZ+<(G1(Ssg1T&3RPmlaJ-J*{~Oesf@lAW;(X2re`5tOBoXW zsTE?r>Uj_pAzYFL;7rPKBp!WAO`v=jl zlv(7?9wx*miO)(7NQKuWHejB)*4TAS^RdX1i|iFVGN!p|9=MVT9X)rU6VCV26;aJn z7UQu_zrymRxAD7e{X-qJJRUugt>0^zQsllctPl-VJ%#Xn6C__?Qkg%W?y@EqM+!aJyf8xuu273pwSzq$1EH>()vwzla6ix0yu6JqocSpC{Q!#d7S+8n~$J^ z7A|f--IHiWtyyvcSuqgRo+IZ}{j}|QqiTG_D*j3*`lnDpk+g(vKD^&$Am@ns)%y|? z0bafLHRcTQt|~55F2f*X#+6gDTN)xS@*_ZaXP>Vx>49qrpN^?`mDFhfgCR2H=EtiH z3Ksh+txTHNHupx8ieTY^R#Y=lTeF7jLxH)i-PBb;bR=tnod6|A>^i+AzUca8xuirZ zs=>YXDq|m<4sm*oZ)fU+sAswWl|FPZ@+S&3mBBg74n&B9YdWigX}2u)(pJ35Y2+`gUW^fDz-+|zT~~Vp z2S8rLb8IWE;{+aahC^DILp7tC_os-+=ZP6dqvXD|g7Nx9y6ccf`<+u>dvlhqc(p4v zhIDM%bbMT9)K#`q_>pUZy_e@A2U(3BsA=Xw-tZc``)n|d8{r2&SdI=XHH=C zn@8yr@9>Fq_pgvY*#Yx9jjGB;oQ6&A+>-qhx-!8++i%=lh&Aa@g=h(u;ROSTF2^-W z$9dgQg#Kc0WR6mF)xa5<)6R#i>+VVzSaY<0=1QHfEMlrgN#vF`L2wf7?f0^kO9fDm z1E7_JI}=y4$!QIP=(E4g?oc|a;B+{_@+LA#c+(9{twcc`J$sMBZBL4PWGfm4=0Z1O zdYw>S$6#6&Q5TEWFXdP-k)(B%fQQgoAv|5L1fS*L-oji?n)^(6V!}_{2G4?;)u*KA zD=i*g=mUtj>A~6AO8!o+TD^Aix(HBqQrDOs^I_70E(k$ioGct+lM%-W!_s z0w!A_2O(kPS#}#zdk2U`c7?z|W(_a_(WKOMdHZGg9X)*l>zym%P0j@QOcKoQq`DDs z4q?!NhKATIHV30ePfBzyJe`!i-U87?jXu>OF@q1Ml3~O|NVRk;MxmiZ((@<;qh#X0R+(Wn0x4G!O1 literal 0 HcmV?d00001 diff --git a/tests/ansible/regression/issue_776__load_plugins_called_twice.yml b/tests/ansible/regression/issue_776__load_plugins_called_twice.yml index ef5732762..e23d650a6 100755 --- a/tests/ansible/regression/issue_776__load_plugins_called_twice.yml +++ b/tests/ansible/regression/issue_776__load_plugins_called_twice.yml @@ -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