From 12fe5c1d054baa72b024d81415dee4956ea45651 Mon Sep 17 00:00:00 2001 From: jeanluc Date: Tue, 14 May 2024 10:36:21 +0200 Subject: [PATCH] Add test for issues #66514 and #53538 --- .../integration/ssh/state/test_parallel.py | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 tests/pytests/integration/ssh/state/test_parallel.py diff --git a/tests/pytests/integration/ssh/state/test_parallel.py b/tests/pytests/integration/ssh/state/test_parallel.py new file mode 100644 index 000000000000..8ff9d7db139a --- /dev/null +++ b/tests/pytests/integration/ssh/state/test_parallel.py @@ -0,0 +1,61 @@ +""" +Verify salt-ssh states support ``parallel``. +""" + +import pytest + +pytestmark = [ + pytest.mark.skip_on_windows(reason="salt-ssh not available on Windows"), + pytest.mark.slow_test, +] + + +@pytest.fixture(scope="module", autouse=True) +def state_tree_parallel(base_env_state_tree_root_dir): + top_file = """ + base: + 'localhost': + - parallel + '127.0.0.1': + - parallel + """ + state_file = """ + {%- for i in range(5) %} + This runs in parallel {{ i }}: + cmd.run: + - name: sleep 0.{{ i }} + - parallel: true + {%- endfor %} + """ + top_tempfile = pytest.helpers.temp_file( + "top.sls", top_file, base_env_state_tree_root_dir + ) + state_tempfile = pytest.helpers.temp_file( + "parallel.sls", state_file, base_env_state_tree_root_dir + ) + with top_tempfile, state_tempfile: + yield + + +@pytest.mark.parametrize( + "args", + ( + pytest.param(("state.sls", "parallel"), id="sls"), + pytest.param(("state.highstate",), id="highstate"), + pytest.param(("state.top", "top.sls"), id="top"), + ), +) +def test_it(salt_ssh_cli, args): + """ + Ensure states with ``parallel: true`` do not cause a crash. + This does not check that they were actually run in parallel + since that would result either in a long-running or flaky test. + """ + ret = salt_ssh_cli.run(*args) + assert ret.returncode == 0 + assert isinstance(ret.data, dict) + for i in range(5): + key = f"cmd_|-This runs in parallel {i}_|-sleep 0.{i}_|-run" + assert key in ret.data + assert "pid" in ret.data[key]["changes"] + assert ret.data[key]["changes"]["retcode"] == 0