4093dfc994
- Make sure configured user is properly set by Salt (bsc#1210994) - Do not fail on bad message pack message (bsc#1213441, CVE-2023-20897) - Fix broken tests to make them running in the testsuite - Prevent possible exceptions on salt.utils.user.get_group_dict (bsc#1212794) - Added: * do-not-fail-on-bad-message-pack-message-bsc-1213441-.patch * fix-tests-to-make-them-running-with-salt-testsuite.patch * prevent-possible-exceptions-on-salt.utils.user.get_g.patch * make-sure-configured-user-is-properly-set-by-salt-bs.patch OBS-URL: https://build.opensuse.org/request/show/1105250 OBS-URL: https://build.opensuse.org/package/show/systemsmanagement:saltstack/salt?expand=0&rev=213
842 lines
31 KiB
Diff
842 lines
31 KiB
Diff
From 290d092c06dc378647dd1e49f000f012a7c07904 Mon Sep 17 00:00:00 2001
|
|
From: vzhestkov <vzhestkov@suse.com>
|
|
Date: Wed, 2 Aug 2023 16:13:49 +0200
|
|
Subject: [PATCH] Fix tests to make them running with salt-testsuite
|
|
|
|
---
|
|
tests/pytests/unit/cli/test_batch_async.py | 718 +++++++++++----------
|
|
tests/unit/cli/test_support.py | 6 +-
|
|
tests/unit/modules/test_saltsupport.py | 4 +-
|
|
3 files changed, 364 insertions(+), 364 deletions(-)
|
|
|
|
diff --git a/tests/pytests/unit/cli/test_batch_async.py b/tests/pytests/unit/cli/test_batch_async.py
|
|
index c0b708de76..e0774ffff3 100644
|
|
--- a/tests/pytests/unit/cli/test_batch_async.py
|
|
+++ b/tests/pytests/unit/cli/test_batch_async.py
|
|
@@ -1,386 +1,392 @@
|
|
+import pytest
|
|
+
|
|
import salt.ext.tornado
|
|
from salt.cli.batch_async import BatchAsync
|
|
-from salt.ext.tornado.testing import AsyncTestCase
|
|
from tests.support.mock import MagicMock, patch
|
|
-from tests.support.unit import TestCase, skipIf
|
|
-
|
|
-
|
|
-class AsyncBatchTestCase(AsyncTestCase, TestCase):
|
|
- def setUp(self):
|
|
- self.io_loop = self.get_new_ioloop()
|
|
- opts = {
|
|
- "batch": "1",
|
|
- "conf_file": {},
|
|
- "tgt": "*",
|
|
- "timeout": 5,
|
|
- "gather_job_timeout": 5,
|
|
- "batch_presence_ping_timeout": 1,
|
|
- "transport": None,
|
|
- "sock_dir": "",
|
|
- }
|
|
-
|
|
- with patch("salt.client.get_local_client", MagicMock(return_value=MagicMock())):
|
|
- with patch(
|
|
- "salt.cli.batch_async.batch_get_opts", MagicMock(return_value=opts)
|
|
- ):
|
|
- self.batch = BatchAsync(
|
|
- opts,
|
|
- MagicMock(side_effect=["1234", "1235", "1236"]),
|
|
- {
|
|
- "tgt": "",
|
|
- "fun": "",
|
|
- "kwargs": {"batch": "", "batch_presence_ping_timeout": 1},
|
|
- },
|
|
- )
|
|
-
|
|
- def test_ping_jid(self):
|
|
- self.assertEqual(self.batch.ping_jid, "1234")
|
|
-
|
|
- def test_batch_jid(self):
|
|
- self.assertEqual(self.batch.batch_jid, "1235")
|
|
-
|
|
- def test_find_job_jid(self):
|
|
- self.assertEqual(self.batch.find_job_jid, "1236")
|
|
-
|
|
- def test_batch_size(self):
|
|
- """
|
|
- Tests passing batch value as a number
|
|
- """
|
|
- self.batch.opts = {"batch": "2", "timeout": 5}
|
|
- self.batch.minions = {"foo", "bar"}
|
|
- self.batch.start_batch()
|
|
- self.assertEqual(self.batch.batch_size, 2)
|
|
-
|
|
- @salt.ext.tornado.testing.gen_test
|
|
- def test_batch_start_on_batch_presence_ping_timeout(self):
|
|
- self.batch.event = MagicMock()
|
|
- future = salt.ext.tornado.gen.Future()
|
|
- future.set_result({"minions": ["foo", "bar"]})
|
|
- self.batch.local.run_job_async.return_value = future
|
|
- ret = self.batch.start()
|
|
- # assert start_batch is called later with batch_presence_ping_timeout as param
|
|
- self.assertEqual(
|
|
- self.batch.event.io_loop.spawn_callback.call_args[0],
|
|
- (self.batch.start_batch,),
|
|
- )
|
|
- # assert test.ping called
|
|
- self.assertEqual(
|
|
- self.batch.local.run_job_async.call_args[0], ("*", "test.ping", [], "glob")
|
|
- )
|
|
- # assert targeted_minions == all minions matched by tgt
|
|
- self.assertEqual(self.batch.targeted_minions, {"foo", "bar"})
|
|
-
|
|
- @salt.ext.tornado.testing.gen_test
|
|
- def test_batch_start_on_gather_job_timeout(self):
|
|
- self.batch.event = MagicMock()
|
|
- future = salt.ext.tornado.gen.Future()
|
|
- future.set_result({"minions": ["foo", "bar"]})
|
|
- self.batch.local.run_job_async.return_value = future
|
|
- self.batch.batch_presence_ping_timeout = None
|
|
- ret = self.batch.start()
|
|
- # assert start_batch is called later with gather_job_timeout as param
|
|
- self.assertEqual(
|
|
- self.batch.event.io_loop.spawn_callback.call_args[0],
|
|
- (self.batch.start_batch,),
|
|
- )
|
|
|
|
- def test_batch_fire_start_event(self):
|
|
- self.batch.minions = {"foo", "bar"}
|
|
- self.batch.opts = {"batch": "2", "timeout": 5}
|
|
- self.batch.event = MagicMock()
|
|
- self.batch.metadata = {"mykey": "myvalue"}
|
|
- self.batch.start_batch()
|
|
- self.assertEqual(
|
|
- self.batch.event.fire_event.call_args[0],
|
|
- (
|
|
+
|
|
+@pytest.fixture
|
|
+def batch(temp_salt_master):
|
|
+ opts = {
|
|
+ "batch": "1",
|
|
+ "conf_file": {},
|
|
+ "tgt": "*",
|
|
+ "timeout": 5,
|
|
+ "gather_job_timeout": 5,
|
|
+ "batch_presence_ping_timeout": 1,
|
|
+ "transport": None,
|
|
+ "sock_dir": "",
|
|
+ }
|
|
+
|
|
+ with patch("salt.client.get_local_client", MagicMock(return_value=MagicMock())):
|
|
+ with patch("salt.cli.batch_async.batch_get_opts", MagicMock(return_value=opts)):
|
|
+ batch = BatchAsync(
|
|
+ opts,
|
|
+ MagicMock(side_effect=["1234", "1235", "1236"]),
|
|
{
|
|
- "available_minions": {"foo", "bar"},
|
|
- "down_minions": set(),
|
|
- "metadata": self.batch.metadata,
|
|
+ "tgt": "",
|
|
+ "fun": "",
|
|
+ "kwargs": {"batch": "", "batch_presence_ping_timeout": 1},
|
|
},
|
|
- "salt/batch/1235/start",
|
|
- ),
|
|
- )
|
|
+ )
|
|
+ yield batch
|
|
|
|
- @salt.ext.tornado.testing.gen_test
|
|
- def test_start_batch_calls_next(self):
|
|
- self.batch.run_next = MagicMock(return_value=MagicMock())
|
|
- self.batch.event = MagicMock()
|
|
- self.batch.start_batch()
|
|
- self.assertEqual(self.batch.initialized, True)
|
|
- self.assertEqual(
|
|
- self.batch.event.io_loop.spawn_callback.call_args[0], (self.batch.run_next,)
|
|
- )
|
|
|
|
- def test_batch_fire_done_event(self):
|
|
- self.batch.targeted_minions = {"foo", "baz", "bar"}
|
|
- self.batch.minions = {"foo", "bar"}
|
|
- self.batch.done_minions = {"foo"}
|
|
- self.batch.timedout_minions = {"bar"}
|
|
- self.batch.event = MagicMock()
|
|
- self.batch.metadata = {"mykey": "myvalue"}
|
|
- old_event = self.batch.event
|
|
- self.batch.end_batch()
|
|
- self.assertEqual(
|
|
- old_event.fire_event.call_args[0],
|
|
- (
|
|
- {
|
|
- "available_minions": {"foo", "bar"},
|
|
- "done_minions": self.batch.done_minions,
|
|
- "down_minions": {"baz"},
|
|
- "timedout_minions": self.batch.timedout_minions,
|
|
- "metadata": self.batch.metadata,
|
|
- },
|
|
- "salt/batch/1235/done",
|
|
- ),
|
|
- )
|
|
+def test_ping_jid(batch):
|
|
+ assert batch.ping_jid == "1234"
|
|
|
|
- def test_batch__del__(self):
|
|
- batch = BatchAsync(MagicMock(), MagicMock(), MagicMock())
|
|
- event = MagicMock()
|
|
- batch.event = event
|
|
- batch.__del__()
|
|
- self.assertEqual(batch.local, None)
|
|
- self.assertEqual(batch.event, None)
|
|
- self.assertEqual(batch.ioloop, None)
|
|
-
|
|
- def test_batch_close_safe(self):
|
|
- batch = BatchAsync(MagicMock(), MagicMock(), MagicMock())
|
|
- event = MagicMock()
|
|
- batch.event = event
|
|
- batch.patterns = {
|
|
- ("salt/job/1234/ret/*", "find_job_return"),
|
|
- ("salt/job/4321/ret/*", "find_job_return"),
|
|
- }
|
|
- batch.close_safe()
|
|
- self.assertEqual(batch.local, None)
|
|
- self.assertEqual(batch.event, None)
|
|
- self.assertEqual(batch.ioloop, None)
|
|
- self.assertEqual(len(event.unsubscribe.mock_calls), 2)
|
|
- self.assertEqual(len(event.remove_event_handler.mock_calls), 1)
|
|
-
|
|
- @salt.ext.tornado.testing.gen_test
|
|
- def test_batch_next(self):
|
|
- self.batch.event = MagicMock()
|
|
- self.batch.opts["fun"] = "my.fun"
|
|
- self.batch.opts["arg"] = []
|
|
- self.batch._get_next = MagicMock(return_value={"foo", "bar"})
|
|
- self.batch.batch_size = 2
|
|
- future = salt.ext.tornado.gen.Future()
|
|
- future.set_result({"minions": ["foo", "bar"]})
|
|
- self.batch.local.run_job_async.return_value = future
|
|
- self.batch.run_next()
|
|
- self.assertEqual(
|
|
- self.batch.local.run_job_async.call_args[0],
|
|
- ({"foo", "bar"}, "my.fun", [], "list"),
|
|
- )
|
|
- self.assertEqual(
|
|
- self.batch.event.io_loop.spawn_callback.call_args[0],
|
|
- (self.batch.find_job, {"foo", "bar"}),
|
|
- )
|
|
- self.assertEqual(self.batch.active, {"bar", "foo"})
|
|
-
|
|
- def test_next_batch(self):
|
|
- self.batch.minions = {"foo", "bar"}
|
|
- self.batch.batch_size = 2
|
|
- self.assertEqual(self.batch._get_next(), {"foo", "bar"})
|
|
-
|
|
- def test_next_batch_one_done(self):
|
|
- self.batch.minions = {"foo", "bar"}
|
|
- self.batch.done_minions = {"bar"}
|
|
- self.batch.batch_size = 2
|
|
- self.assertEqual(self.batch._get_next(), {"foo"})
|
|
-
|
|
- def test_next_batch_one_done_one_active(self):
|
|
- self.batch.minions = {"foo", "bar", "baz"}
|
|
- self.batch.done_minions = {"bar"}
|
|
- self.batch.active = {"baz"}
|
|
- self.batch.batch_size = 2
|
|
- self.assertEqual(self.batch._get_next(), {"foo"})
|
|
-
|
|
- def test_next_batch_one_done_one_active_one_timedout(self):
|
|
- self.batch.minions = {"foo", "bar", "baz", "faz"}
|
|
- self.batch.done_minions = {"bar"}
|
|
- self.batch.active = {"baz"}
|
|
- self.batch.timedout_minions = {"faz"}
|
|
- self.batch.batch_size = 2
|
|
- self.assertEqual(self.batch._get_next(), {"foo"})
|
|
-
|
|
- def test_next_batch_bigger_size(self):
|
|
- self.batch.minions = {"foo", "bar"}
|
|
- self.batch.batch_size = 3
|
|
- self.assertEqual(self.batch._get_next(), {"foo", "bar"})
|
|
-
|
|
- def test_next_batch_all_done(self):
|
|
- self.batch.minions = {"foo", "bar"}
|
|
- self.batch.done_minions = {"foo", "bar"}
|
|
- self.batch.batch_size = 2
|
|
- self.assertEqual(self.batch._get_next(), set())
|
|
-
|
|
- def test_next_batch_all_active(self):
|
|
- self.batch.minions = {"foo", "bar"}
|
|
- self.batch.active = {"foo", "bar"}
|
|
- self.batch.batch_size = 2
|
|
- self.assertEqual(self.batch._get_next(), set())
|
|
-
|
|
- def test_next_batch_all_timedout(self):
|
|
- self.batch.minions = {"foo", "bar"}
|
|
- self.batch.timedout_minions = {"foo", "bar"}
|
|
- self.batch.batch_size = 2
|
|
- self.assertEqual(self.batch._get_next(), set())
|
|
-
|
|
- def test_batch__event_handler_ping_return(self):
|
|
- self.batch.targeted_minions = {"foo"}
|
|
- self.batch.event = MagicMock(
|
|
- unpack=MagicMock(return_value=("salt/job/1234/ret/foo", {"id": "foo"}))
|
|
- )
|
|
- self.batch.start()
|
|
- self.assertEqual(self.batch.minions, set())
|
|
- self.batch._BatchAsync__event_handler(MagicMock())
|
|
- self.assertEqual(self.batch.minions, {"foo"})
|
|
- self.assertEqual(self.batch.done_minions, set())
|
|
-
|
|
- def test_batch__event_handler_call_start_batch_when_all_pings_return(self):
|
|
- self.batch.targeted_minions = {"foo"}
|
|
- self.batch.event = MagicMock(
|
|
- unpack=MagicMock(return_value=("salt/job/1234/ret/foo", {"id": "foo"}))
|
|
- )
|
|
- self.batch.start()
|
|
- self.batch._BatchAsync__event_handler(MagicMock())
|
|
- self.assertEqual(
|
|
- self.batch.event.io_loop.spawn_callback.call_args[0],
|
|
- (self.batch.start_batch,),
|
|
- )
|
|
|
|
- def test_batch__event_handler_not_call_start_batch_when_not_all_pings_return(self):
|
|
- self.batch.targeted_minions = {"foo", "bar"}
|
|
- self.batch.event = MagicMock(
|
|
- unpack=MagicMock(return_value=("salt/job/1234/ret/foo", {"id": "foo"}))
|
|
- )
|
|
- self.batch.start()
|
|
- self.batch._BatchAsync__event_handler(MagicMock())
|
|
- self.assertEqual(len(self.batch.event.io_loop.spawn_callback.mock_calls), 0)
|
|
+def test_batch_jid(batch):
|
|
+ assert batch.batch_jid == "1235"
|
|
+
|
|
+
|
|
+def test_find_job_jid(batch):
|
|
+ assert batch.find_job_jid == "1236"
|
|
+
|
|
|
|
- def test_batch__event_handler_batch_run_return(self):
|
|
- self.batch.event = MagicMock(
|
|
- unpack=MagicMock(return_value=("salt/job/1235/ret/foo", {"id": "foo"}))
|
|
+def test_batch_size(batch):
|
|
+ """
|
|
+ Tests passing batch value as a number
|
|
+ """
|
|
+ batch.opts = {"batch": "2", "timeout": 5}
|
|
+ batch.minions = {"foo", "bar"}
|
|
+ batch.start_batch()
|
|
+ assert batch.batch_size == 2
|
|
+
|
|
+
|
|
+def test_batch_start_on_batch_presence_ping_timeout(batch):
|
|
+ # batch_async = BatchAsyncMock();
|
|
+ batch.event = MagicMock()
|
|
+ future = salt.ext.tornado.gen.Future()
|
|
+ future.set_result({"minions": ["foo", "bar"]})
|
|
+ batch.local.run_job_async.return_value = future
|
|
+ with patch("salt.ext.tornado.gen.sleep", return_value=future):
|
|
+ # ret = batch_async.start(batch)
|
|
+ ret = batch.start()
|
|
+ # assert start_batch is called later with batch_presence_ping_timeout as param
|
|
+ assert batch.event.io_loop.spawn_callback.call_args[0] == (batch.start_batch,)
|
|
+ # assert test.ping called
|
|
+ assert batch.local.run_job_async.call_args[0] == ("*", "test.ping", [], "glob")
|
|
+ # assert targeted_minions == all minions matched by tgt
|
|
+ assert batch.targeted_minions == {"foo", "bar"}
|
|
+
|
|
+
|
|
+def test_batch_start_on_gather_job_timeout(batch):
|
|
+ # batch_async = BatchAsyncMock();
|
|
+ batch.event = MagicMock()
|
|
+ future = salt.ext.tornado.gen.Future()
|
|
+ future.set_result({"minions": ["foo", "bar"]})
|
|
+ batch.local.run_job_async.return_value = future
|
|
+ batch.batch_presence_ping_timeout = None
|
|
+ with patch("salt.ext.tornado.gen.sleep", return_value=future):
|
|
+ # ret = batch_async.start(batch)
|
|
+ ret = batch.start()
|
|
+ # assert start_batch is called later with gather_job_timeout as param
|
|
+ assert batch.event.io_loop.spawn_callback.call_args[0] == (batch.start_batch,)
|
|
+
|
|
+
|
|
+def test_batch_fire_start_event(batch):
|
|
+ batch.minions = {"foo", "bar"}
|
|
+ batch.opts = {"batch": "2", "timeout": 5}
|
|
+ batch.event = MagicMock()
|
|
+ batch.metadata = {"mykey": "myvalue"}
|
|
+ batch.start_batch()
|
|
+ assert batch.event.fire_event.call_args[0] == (
|
|
+ {
|
|
+ "available_minions": {"foo", "bar"},
|
|
+ "down_minions": set(),
|
|
+ "metadata": batch.metadata,
|
|
+ },
|
|
+ "salt/batch/1235/start",
|
|
+ )
|
|
+
|
|
+
|
|
+def test_start_batch_calls_next(batch):
|
|
+ batch.run_next = MagicMock(return_value=MagicMock())
|
|
+ batch.event = MagicMock()
|
|
+ batch.start_batch()
|
|
+ assert batch.initialized
|
|
+ assert batch.event.io_loop.spawn_callback.call_args[0] == (batch.run_next,)
|
|
+
|
|
+
|
|
+def test_batch_fire_done_event(batch):
|
|
+ batch.targeted_minions = {"foo", "baz", "bar"}
|
|
+ batch.minions = {"foo", "bar"}
|
|
+ batch.done_minions = {"foo"}
|
|
+ batch.timedout_minions = {"bar"}
|
|
+ batch.event = MagicMock()
|
|
+ batch.metadata = {"mykey": "myvalue"}
|
|
+ old_event = batch.event
|
|
+ batch.end_batch()
|
|
+ assert old_event.fire_event.call_args[0] == (
|
|
+ {
|
|
+ "available_minions": {"foo", "bar"},
|
|
+ "done_minions": batch.done_minions,
|
|
+ "down_minions": {"baz"},
|
|
+ "timedout_minions": batch.timedout_minions,
|
|
+ "metadata": batch.metadata,
|
|
+ },
|
|
+ "salt/batch/1235/done",
|
|
+ )
|
|
+
|
|
+
|
|
+def test_batch__del__(batch):
|
|
+ batch = BatchAsync(MagicMock(), MagicMock(), MagicMock())
|
|
+ event = MagicMock()
|
|
+ batch.event = event
|
|
+ batch.__del__()
|
|
+ assert batch.local is None
|
|
+ assert batch.event is None
|
|
+ assert batch.ioloop is None
|
|
+
|
|
+
|
|
+def test_batch_close_safe(batch):
|
|
+ batch = BatchAsync(MagicMock(), MagicMock(), MagicMock())
|
|
+ event = MagicMock()
|
|
+ batch.event = event
|
|
+ batch.patterns = {
|
|
+ ("salt/job/1234/ret/*", "find_job_return"),
|
|
+ ("salt/job/4321/ret/*", "find_job_return"),
|
|
+ }
|
|
+ batch.close_safe()
|
|
+ assert batch.local is None
|
|
+ assert batch.event is None
|
|
+ assert batch.ioloop is None
|
|
+ assert len(event.unsubscribe.mock_calls) == 2
|
|
+ assert len(event.remove_event_handler.mock_calls) == 1
|
|
+
|
|
+
|
|
+def test_batch_next(batch):
|
|
+ batch.event = MagicMock()
|
|
+ batch.opts["fun"] = "my.fun"
|
|
+ batch.opts["arg"] = []
|
|
+ batch._get_next = MagicMock(return_value={"foo", "bar"})
|
|
+ batch.batch_size = 2
|
|
+ future = salt.ext.tornado.gen.Future()
|
|
+ future.set_result({"minions": ["foo", "bar"]})
|
|
+ batch.local.run_job_async.return_value = future
|
|
+ with patch("salt.ext.tornado.gen.sleep", return_value=future):
|
|
+ batch.run_next()
|
|
+ assert batch.local.run_job_async.call_args[0] == (
|
|
+ {"foo", "bar"},
|
|
+ "my.fun",
|
|
+ [],
|
|
+ "list",
|
|
)
|
|
- self.batch.start()
|
|
- self.batch.active = {"foo"}
|
|
- self.batch._BatchAsync__event_handler(MagicMock())
|
|
- self.assertEqual(self.batch.active, set())
|
|
- self.assertEqual(self.batch.done_minions, {"foo"})
|
|
- self.assertEqual(
|
|
- self.batch.event.io_loop.spawn_callback.call_args[0],
|
|
- (self.batch.schedule_next,),
|
|
+ assert batch.event.io_loop.spawn_callback.call_args[0] == (
|
|
+ batch.find_job,
|
|
+ {"foo", "bar"},
|
|
)
|
|
+ assert batch.active == {"bar", "foo"}
|
|
+
|
|
|
|
- def test_batch__event_handler_find_job_return(self):
|
|
- self.batch.event = MagicMock(
|
|
- unpack=MagicMock(
|
|
- return_value=(
|
|
- "salt/job/1236/ret/foo",
|
|
- {"id": "foo", "return": "deadbeaf"},
|
|
- )
|
|
+def test_next_batch(batch):
|
|
+ batch.minions = {"foo", "bar"}
|
|
+ batch.batch_size = 2
|
|
+ assert batch._get_next() == {"foo", "bar"}
|
|
+
|
|
+
|
|
+def test_next_batch_one_done(batch):
|
|
+ batch.minions = {"foo", "bar"}
|
|
+ batch.done_minions = {"bar"}
|
|
+ batch.batch_size = 2
|
|
+ assert batch._get_next() == {"foo"}
|
|
+
|
|
+
|
|
+def test_next_batch_one_done_one_active(batch):
|
|
+ batch.minions = {"foo", "bar", "baz"}
|
|
+ batch.done_minions = {"bar"}
|
|
+ batch.active = {"baz"}
|
|
+ batch.batch_size = 2
|
|
+ assert batch._get_next() == {"foo"}
|
|
+
|
|
+
|
|
+def test_next_batch_one_done_one_active_one_timedout(batch):
|
|
+ batch.minions = {"foo", "bar", "baz", "faz"}
|
|
+ batch.done_minions = {"bar"}
|
|
+ batch.active = {"baz"}
|
|
+ batch.timedout_minions = {"faz"}
|
|
+ batch.batch_size = 2
|
|
+ assert batch._get_next() == {"foo"}
|
|
+
|
|
+
|
|
+def test_next_batch_bigger_size(batch):
|
|
+ batch.minions = {"foo", "bar"}
|
|
+ batch.batch_size = 3
|
|
+ assert batch._get_next() == {"foo", "bar"}
|
|
+
|
|
+
|
|
+def test_next_batch_all_done(batch):
|
|
+ batch.minions = {"foo", "bar"}
|
|
+ batch.done_minions = {"foo", "bar"}
|
|
+ batch.batch_size = 2
|
|
+ assert batch._get_next() == set()
|
|
+
|
|
+
|
|
+def test_next_batch_all_active(batch):
|
|
+ batch.minions = {"foo", "bar"}
|
|
+ batch.active = {"foo", "bar"}
|
|
+ batch.batch_size = 2
|
|
+ assert batch._get_next() == set()
|
|
+
|
|
+
|
|
+def test_next_batch_all_timedout(batch):
|
|
+ batch.minions = {"foo", "bar"}
|
|
+ batch.timedout_minions = {"foo", "bar"}
|
|
+ batch.batch_size = 2
|
|
+ assert batch._get_next() == set()
|
|
+
|
|
+
|
|
+def test_batch__event_handler_ping_return(batch):
|
|
+ batch.targeted_minions = {"foo"}
|
|
+ batch.event = MagicMock(
|
|
+ unpack=MagicMock(return_value=("salt/job/1234/ret/foo", {"id": "foo"}))
|
|
+ )
|
|
+ batch.start()
|
|
+ assert batch.minions == set()
|
|
+ batch._BatchAsync__event_handler(MagicMock())
|
|
+ assert batch.minions == {"foo"}
|
|
+ assert batch.done_minions == set()
|
|
+
|
|
+
|
|
+def test_batch__event_handler_call_start_batch_when_all_pings_return(batch):
|
|
+ batch.targeted_minions = {"foo"}
|
|
+ batch.event = MagicMock(
|
|
+ unpack=MagicMock(return_value=("salt/job/1234/ret/foo", {"id": "foo"}))
|
|
+ )
|
|
+ batch.start()
|
|
+ batch._BatchAsync__event_handler(MagicMock())
|
|
+ assert batch.event.io_loop.spawn_callback.call_args[0] == (batch.start_batch,)
|
|
+
|
|
+
|
|
+def test_batch__event_handler_not_call_start_batch_when_not_all_pings_return(batch):
|
|
+ batch.targeted_minions = {"foo", "bar"}
|
|
+ batch.event = MagicMock(
|
|
+ unpack=MagicMock(return_value=("salt/job/1234/ret/foo", {"id": "foo"}))
|
|
+ )
|
|
+ batch.start()
|
|
+ batch._BatchAsync__event_handler(MagicMock())
|
|
+ assert len(batch.event.io_loop.spawn_callback.mock_calls) == 0
|
|
+
|
|
+
|
|
+def test_batch__event_handler_batch_run_return(batch):
|
|
+ batch.event = MagicMock(
|
|
+ unpack=MagicMock(return_value=("salt/job/1235/ret/foo", {"id": "foo"}))
|
|
+ )
|
|
+ batch.start()
|
|
+ batch.active = {"foo"}
|
|
+ batch._BatchAsync__event_handler(MagicMock())
|
|
+ assert batch.active == set()
|
|
+ assert batch.done_minions == {"foo"}
|
|
+ assert batch.event.io_loop.spawn_callback.call_args[0] == (batch.schedule_next,)
|
|
+
|
|
+
|
|
+def test_batch__event_handler_find_job_return(batch):
|
|
+ batch.event = MagicMock(
|
|
+ unpack=MagicMock(
|
|
+ return_value=(
|
|
+ "salt/job/1236/ret/foo",
|
|
+ {"id": "foo", "return": "deadbeaf"},
|
|
)
|
|
)
|
|
- self.batch.start()
|
|
- self.batch.patterns.add(("salt/job/1236/ret/*", "find_job_return"))
|
|
- self.batch._BatchAsync__event_handler(MagicMock())
|
|
- self.assertEqual(self.batch.find_job_returned, {"foo"})
|
|
-
|
|
- @salt.ext.tornado.testing.gen_test
|
|
- def test_batch_run_next_end_batch_when_no_next(self):
|
|
- self.batch.end_batch = MagicMock()
|
|
- self.batch._get_next = MagicMock(return_value={})
|
|
- self.batch.run_next()
|
|
- self.assertEqual(len(self.batch.end_batch.mock_calls), 1)
|
|
-
|
|
- @salt.ext.tornado.testing.gen_test
|
|
- def test_batch_find_job(self):
|
|
- self.batch.event = MagicMock()
|
|
- future = salt.ext.tornado.gen.Future()
|
|
- future.set_result({})
|
|
- self.batch.local.run_job_async.return_value = future
|
|
- self.batch.minions = {"foo", "bar"}
|
|
- self.batch.jid_gen = MagicMock(return_value="1234")
|
|
- salt.ext.tornado.gen.sleep = MagicMock(return_value=future)
|
|
- self.batch.find_job({"foo", "bar"})
|
|
- self.assertEqual(
|
|
- self.batch.event.io_loop.spawn_callback.call_args[0],
|
|
- (self.batch.check_find_job, {"foo", "bar"}, "1234"),
|
|
+ )
|
|
+ batch.start()
|
|
+ batch.patterns.add(("salt/job/1236/ret/*", "find_job_return"))
|
|
+ batch._BatchAsync__event_handler(MagicMock())
|
|
+ assert batch.find_job_returned == {"foo"}
|
|
+
|
|
+
|
|
+def test_batch_run_next_end_batch_when_no_next(batch):
|
|
+ batch.end_batch = MagicMock()
|
|
+ batch._get_next = MagicMock(return_value={})
|
|
+ batch.run_next()
|
|
+ assert len(batch.end_batch.mock_calls) == 1
|
|
+
|
|
+
|
|
+def test_batch_find_job(batch):
|
|
+ batch.event = MagicMock()
|
|
+ future = salt.ext.tornado.gen.Future()
|
|
+ future.set_result({})
|
|
+ batch.local.run_job_async.return_value = future
|
|
+ batch.minions = {"foo", "bar"}
|
|
+ batch.jid_gen = MagicMock(return_value="1234")
|
|
+ with patch("salt.ext.tornado.gen.sleep", return_value=future):
|
|
+ batch.find_job({"foo", "bar"})
|
|
+ assert batch.event.io_loop.spawn_callback.call_args[0] == (
|
|
+ batch.check_find_job,
|
|
+ {"foo", "bar"},
|
|
+ "1234",
|
|
)
|
|
|
|
- @salt.ext.tornado.testing.gen_test
|
|
- def test_batch_find_job_with_done_minions(self):
|
|
- self.batch.done_minions = {"bar"}
|
|
- self.batch.event = MagicMock()
|
|
- future = salt.ext.tornado.gen.Future()
|
|
- future.set_result({})
|
|
- self.batch.local.run_job_async.return_value = future
|
|
- self.batch.minions = {"foo", "bar"}
|
|
- self.batch.jid_gen = MagicMock(return_value="1234")
|
|
- salt.ext.tornado.gen.sleep = MagicMock(return_value=future)
|
|
- self.batch.find_job({"foo", "bar"})
|
|
- self.assertEqual(
|
|
- self.batch.event.io_loop.spawn_callback.call_args[0],
|
|
- (self.batch.check_find_job, {"foo"}, "1234"),
|
|
- )
|
|
|
|
- def test_batch_check_find_job_did_not_return(self):
|
|
- self.batch.event = MagicMock()
|
|
- self.batch.active = {"foo"}
|
|
- self.batch.find_job_returned = set()
|
|
- self.batch.patterns = {("salt/job/1234/ret/*", "find_job_return")}
|
|
- self.batch.check_find_job({"foo"}, jid="1234")
|
|
- self.assertEqual(self.batch.find_job_returned, set())
|
|
- self.assertEqual(self.batch.active, set())
|
|
- self.assertEqual(len(self.batch.event.io_loop.add_callback.mock_calls), 0)
|
|
-
|
|
- def test_batch_check_find_job_did_return(self):
|
|
- self.batch.event = MagicMock()
|
|
- self.batch.find_job_returned = {"foo"}
|
|
- self.batch.patterns = {("salt/job/1234/ret/*", "find_job_return")}
|
|
- self.batch.check_find_job({"foo"}, jid="1234")
|
|
- self.assertEqual(
|
|
- self.batch.event.io_loop.spawn_callback.call_args[0],
|
|
- (self.batch.find_job, {"foo"}),
|
|
+def test_batch_find_job_with_done_minions(batch):
|
|
+ batch.done_minions = {"bar"}
|
|
+ batch.event = MagicMock()
|
|
+ future = salt.ext.tornado.gen.Future()
|
|
+ future.set_result({})
|
|
+ batch.local.run_job_async.return_value = future
|
|
+ batch.minions = {"foo", "bar"}
|
|
+ batch.jid_gen = MagicMock(return_value="1234")
|
|
+ with patch("salt.ext.tornado.gen.sleep", return_value=future):
|
|
+ batch.find_job({"foo", "bar"})
|
|
+ assert batch.event.io_loop.spawn_callback.call_args[0] == (
|
|
+ batch.check_find_job,
|
|
+ {"foo"},
|
|
+ "1234",
|
|
)
|
|
|
|
- def test_batch_check_find_job_multiple_states(self):
|
|
- self.batch.event = MagicMock()
|
|
- # currently running minions
|
|
- self.batch.active = {"foo", "bar"}
|
|
|
|
- # minion is running and find_job returns
|
|
- self.batch.find_job_returned = {"foo"}
|
|
+def test_batch_check_find_job_did_not_return(batch):
|
|
+ batch.event = MagicMock()
|
|
+ batch.active = {"foo"}
|
|
+ batch.find_job_returned = set()
|
|
+ batch.patterns = {("salt/job/1234/ret/*", "find_job_return")}
|
|
+ batch.check_find_job({"foo"}, jid="1234")
|
|
+ assert batch.find_job_returned == set()
|
|
+ assert batch.active == set()
|
|
+ assert len(batch.event.io_loop.add_callback.mock_calls) == 0
|
|
|
|
- # minion started running but find_job did not return
|
|
- self.batch.timedout_minions = {"faz"}
|
|
|
|
- # minion finished
|
|
- self.batch.done_minions = {"baz"}
|
|
+def test_batch_check_find_job_did_return(batch):
|
|
+ batch.event = MagicMock()
|
|
+ batch.find_job_returned = {"foo"}
|
|
+ batch.patterns = {("salt/job/1234/ret/*", "find_job_return")}
|
|
+ batch.check_find_job({"foo"}, jid="1234")
|
|
+ assert batch.event.io_loop.spawn_callback.call_args[0] == (batch.find_job, {"foo"})
|
|
|
|
- # both not yet done but only 'foo' responded to find_job
|
|
- not_done = {"foo", "bar"}
|
|
|
|
- self.batch.patterns = {("salt/job/1234/ret/*", "find_job_return")}
|
|
- self.batch.check_find_job(not_done, jid="1234")
|
|
+def test_batch_check_find_job_multiple_states(batch):
|
|
+ batch.event = MagicMock()
|
|
+ # currently running minions
|
|
+ batch.active = {"foo", "bar"}
|
|
|
|
- # assert 'bar' removed from active
|
|
- self.assertEqual(self.batch.active, {"foo"})
|
|
+ # minion is running and find_job returns
|
|
+ batch.find_job_returned = {"foo"}
|
|
|
|
- # assert 'bar' added to timedout_minions
|
|
- self.assertEqual(self.batch.timedout_minions, {"bar", "faz"})
|
|
+ # minion started running but find_job did not return
|
|
+ batch.timedout_minions = {"faz"}
|
|
+
|
|
+ # minion finished
|
|
+ batch.done_minions = {"baz"}
|
|
+
|
|
+ # both not yet done but only 'foo' responded to find_job
|
|
+ not_done = {"foo", "bar"}
|
|
+
|
|
+ batch.patterns = {("salt/job/1234/ret/*", "find_job_return")}
|
|
+ batch.check_find_job(not_done, jid="1234")
|
|
+
|
|
+ # assert 'bar' removed from active
|
|
+ assert batch.active == {"foo"}
|
|
+
|
|
+ # assert 'bar' added to timedout_minions
|
|
+ assert batch.timedout_minions == {"bar", "faz"}
|
|
+
|
|
+ # assert 'find_job' schedueled again only for 'foo'
|
|
+ assert batch.event.io_loop.spawn_callback.call_args[0] == (batch.find_job, {"foo"})
|
|
|
|
- # assert 'find_job' schedueled again only for 'foo'
|
|
- self.assertEqual(
|
|
- self.batch.event.io_loop.spawn_callback.call_args[0],
|
|
- (self.batch.find_job, {"foo"}),
|
|
- )
|
|
|
|
- def test_only_on_run_next_is_scheduled(self):
|
|
- self.batch.event = MagicMock()
|
|
- self.batch.scheduled = True
|
|
- self.batch.schedule_next()
|
|
- self.assertEqual(len(self.batch.event.io_loop.spawn_callback.mock_calls), 0)
|
|
+def test_only_on_run_next_is_scheduled(batch):
|
|
+ batch.event = MagicMock()
|
|
+ batch.scheduled = True
|
|
+ batch.schedule_next()
|
|
+ assert len(batch.event.io_loop.spawn_callback.mock_calls) == 0
|
|
diff --git a/tests/unit/cli/test_support.py b/tests/unit/cli/test_support.py
|
|
index dc0e99bb3d..971a0f122b 100644
|
|
--- a/tests/unit/cli/test_support.py
|
|
+++ b/tests/unit/cli/test_support.py
|
|
@@ -14,7 +14,7 @@ from salt.cli.support.collector import SaltSupport, SupportDataCollector
|
|
from salt.cli.support.console import IndentOutput
|
|
from salt.utils.color import get_colors
|
|
from salt.utils.stringutils import to_bytes
|
|
-from tests.support.mock import NO_MOCK, NO_MOCK_REASON, MagicMock, patch
|
|
+from tests.support.mock import MagicMock, patch
|
|
from tests.support.unit import TestCase, skipIf
|
|
|
|
try:
|
|
@@ -24,7 +24,6 @@ except ImportError:
|
|
|
|
|
|
@skipIf(not bool(pytest), "Pytest needs to be installed")
|
|
-@skipIf(NO_MOCK, NO_MOCK_REASON)
|
|
class SaltSupportIndentOutputTestCase(TestCase):
|
|
"""
|
|
Unit Tests for the salt-support indent output.
|
|
@@ -100,7 +99,6 @@ class SaltSupportIndentOutputTestCase(TestCase):
|
|
|
|
|
|
@skipIf(not bool(pytest), "Pytest needs to be installed")
|
|
-@skipIf(NO_MOCK, NO_MOCK_REASON)
|
|
class SaltSupportCollectorTestCase(TestCase):
|
|
"""
|
|
Collector tests.
|
|
@@ -232,7 +230,6 @@ class SaltSupportCollectorTestCase(TestCase):
|
|
|
|
|
|
@skipIf(not bool(pytest), "Pytest needs to be installed")
|
|
-@skipIf(NO_MOCK, NO_MOCK_REASON)
|
|
class SaltSupportRunnerTestCase(TestCase):
|
|
"""
|
|
Test runner class.
|
|
@@ -468,7 +465,6 @@ class SaltSupportRunnerTestCase(TestCase):
|
|
|
|
|
|
@skipIf(not bool(pytest), "Pytest needs to be installed")
|
|
-@skipIf(NO_MOCK, NO_MOCK_REASON)
|
|
class ProfileIntegrityTestCase(TestCase):
|
|
"""
|
|
Default profile integrity
|
|
diff --git a/tests/unit/modules/test_saltsupport.py b/tests/unit/modules/test_saltsupport.py
|
|
index 1715c68f4c..2afdd69b3e 100644
|
|
--- a/tests/unit/modules/test_saltsupport.py
|
|
+++ b/tests/unit/modules/test_saltsupport.py
|
|
@@ -8,7 +8,7 @@ import datetime
|
|
import salt.exceptions
|
|
from salt.modules import saltsupport
|
|
from tests.support.mixins import LoaderModuleMockMixin
|
|
-from tests.support.mock import NO_MOCK, NO_MOCK_REASON, MagicMock, patch
|
|
+from tests.support.mock import MagicMock, patch
|
|
from tests.support.unit import TestCase, skipIf
|
|
|
|
try:
|
|
@@ -18,7 +18,6 @@ except ImportError:
|
|
|
|
|
|
@skipIf(not bool(pytest), "Pytest required")
|
|
-@skipIf(NO_MOCK, NO_MOCK_REASON)
|
|
class SaltSupportModuleTestCase(TestCase, LoaderModuleMockMixin):
|
|
"""
|
|
Test cases for salt.modules.support::SaltSupportModule
|
|
@@ -361,7 +360,6 @@ professor: Farnsworth
|
|
|
|
|
|
@skipIf(not bool(pytest), "Pytest required")
|
|
-@skipIf(NO_MOCK, NO_MOCK_REASON)
|
|
class LogCollectorTestCase(TestCase, LoaderModuleMockMixin):
|
|
"""
|
|
Test cases for salt.modules.support::LogCollector
|
|
--
|
|
2.41.0
|
|
|