Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

service is_enabled does not work with exit code 4 #801

Open
pfuntner opened this issue Apr 2, 2025 · 1 comment · May be fixed by #802
Open

service is_enabled does not work with exit code 4 #801

pfuntner opened this issue Apr 2, 2025 · 1 comment · May be fixed by #802

Comments

@pfuntner
Copy link

pfuntner commented Apr 2, 2025

I'm finding that when systemctl is-enabled is used for a non-existent service and the target has an exit code of 4 (such as on an Ubuntu 24 target), an exception is raised.

pytest script

(venv) $ cat service-test.py
def test_faux_service(host):
        assert not host.service('foo').is_enabled
(venv) $

Ubuntu 24

(venv) $ pytest --hosts ubuntu24 service-test.py
==================================================================================== test session starts =====================================================================================
platform linux -- Python 3.11.0rc1, pytest-8.3.5, pluggy-1.5.0
rootdir: /home/jpfuntne/sto/issues/CL9-746
plugins: testinfra-10.2.2
collected 1 item

service-test.py F                                                                                                                                                                      [100%]

========================================================================================== FAILURES ==========================================================================================
___________________________________________________________________________ test_faux_service[paramiko://ubuntu24] ___________________________________________________________________________

host = <testinfra.host.Host paramiko://ubuntu24>

    def test_faux_service(host):
>       assert not host.service('foo').is_enabled

service-test.py:2:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
venv/lib/python3.11/site-packages/testinfra/modules/service.py:197: in is_enabled
    cmd = self.run_test("systemctl is-enabled %s", self.name)
venv/lib/python3.11/site-packages/testinfra/modules/base.py:40: in run_test
    return cls._host.run_test(*args, **kwargs)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <testinfra.host.Host paramiko://ubuntu24>, command = 'systemctl is-enabled %s', args = ('foo',), kwargs = {}

    def run_test(
        self, command: str, *args: str, **kwargs: Any
    ) -> testinfra.backend.base.CommandResult:
        """Run command and check it return an exit status of 0 or 1

        :raises: AssertionError
        """
>       return self.run_expect([0, 1], command, *args, **kwargs)
E       AssertionError: Unexpected exit code 4 for CommandResult(backend=<testinfra.backend.paramiko.ParamikoBackend object at 0x7f4b7768b490>, exit_status=4, command=b'systemctl is-enabled foo', _stdout=b'not-found\n', _stderr=b'')
E       assert 4 in [0, 1]
E        +  where 4 = CommandResult(backend=<testinfra.backend.paramiko.ParamikoBackend object at 0x7f4b7768b490>, exit_status=4, command=b'systemctl is-enabled foo', _stdout=b'not-found\n', _stderr=b'').rc

venv/lib/python3.11/site-packages/testinfra/host.py:120: AssertionError
====================================================================================== warnings summary ======================================================================================
service-test.py::test_faux_service[paramiko://ubuntu24]
  /home/jpfuntne/sto/issues/CL9-746/venv/lib/python3.11/site-packages/paramiko/client.py:889: UserWarning: Unknown ssh-ed25519 host key for 34.74.229.204: b'96b278a4e66eefe2941f43fa809646db'
    warnings.warn(

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
================================================================================== short test summary info ===================================================================================
FAILED service-test.py::test_faux_service[paramiko://ubuntu24] - AssertionError: Unexpected exit code 4 for CommandResult(backend=<testinfra.backend.paramiko.ParamikoBackend object at 0x7f4b7768b490>, exit_status=4, command=b'systemctl is-enabled foo...
================================================================================ 1 failed, 1 warning in 1.46s ================================================================================
(venv) $ ssh ubuntu24 'systemctl is-enabled foo; echo $?'
not-found
4
(venv) $ ssh ubuntu24 cat /etc/os-release
PRETTY_NAME="Ubuntu 24.04.2 LTS"
NAME="Ubuntu"
VERSION_ID="24.04"
VERSION="24.04.2 LTS (Noble Numbat)"
VERSION_CODENAME=noble
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=noble
LOGO=ubuntu-logo
(venv) $

Ubuntu 22

This is not a problem on Ubuntu 22 which has an exit code of 1 in the same scenario:

(venv) $ pytest --hosts ubuntu22 service-test.py
==================================================================================== test session starts =====================================================================================
platform linux -- Python 3.11.0rc1, pytest-8.3.5, pluggy-1.5.0
rootdir: /home/jpfuntne/sto/issues/CL9-746
plugins: testinfra-10.2.2
collected 1 item

service-test.py .                                                                                                                                                                      [100%]

====================================================================================== warnings summary ======================================================================================
service-test.py::test_faux_service[paramiko://ubuntu22]
  /home/jpfuntne/sto/issues/CL9-746/venv/lib/python3.11/site-packages/paramiko/client.py:889: UserWarning: Unknown ssh-ed25519 host key for 35.185.104.216: b'232b368a904a128f57b7601d1faeb172'
    warnings.warn(

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
================================================================================ 1 passed, 1 warning in 1.48s ================================================================================
(venv) $ ssh ubuntu22 'systemctl is-enabled foo; echo $?'
1
Failed to get unit file state for foo.service: No such file or directory
(venv) $ ssh ubuntu22 cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.5 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.5 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
(venv) $

This is similar to #748 which I hoped would be fixed by #773 but it was not.

Python packages

(venv) $ pip list
Package          Version
---------------- -------
bcrypt           4.3.0
cffi             1.17.1
cryptography     44.0.2
iniconfig        2.1.0
packaging        24.2
paramiko         3.5.1
pip              22.0.2
pluggy           1.5.0
pycparser        2.22
PyNaCl           1.5.0
pytest           8.3.5
pytest-testinfra 10.2.2
setuptools       59.6.0
(venv) $
@pfuntner pfuntner linked a pull request Apr 3, 2025 that will close this issue
@pfuntner
Copy link
Author

pfuntner commented Apr 3, 2025

I've suggested a fix with #802

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant