salt/allow-namedloadercontexts-to-be-returned-from-loader.patch
Pablo Suárez Hernández 34c4e47c9b - Avoid explicit reading of /etc/salt/minion (bsc#1220357)
- Allow NamedLoaderContexts to be returned from loader
- Revert the change making reactor less blocking (bsc#1230322)
- Use --cachedir for extension_modules in salt-call (bsc#1226141)
- Prevent using SyncWrapper with no reason
- Added:
  * avoid-explicit-reading-of-etc-salt-minion-bsc-122035.patch
  * allow-namedloadercontexts-to-be-returned-from-loader.patch
  * revert-the-change-making-reactor-less-blocking-bsc-1.patch
  * use-cachedir-for-extension_modules-in-salt-call-bsc-.patch
  * prevent-using-syncwrapper-with-no-reason.patch

OBS-URL: https://build.opensuse.org/package/show/systemsmanagement:saltstack/salt?expand=0&rev=259
2024-09-25 12:19:39 +00:00

74 lines
2.8 KiB
Diff

From 1be3f92ef3bf14e47340e2e075291204b3e75e98 Mon Sep 17 00:00:00 2001
From: Victor Zhestkov <vzhestkov@suse.com>
Date: Wed, 25 Sep 2024 14:07:42 +0300
Subject: [PATCH] Allow NamedLoaderContexts to be returned from loader
It is useful in some cases to return NamedLoaderContexts from loaded
functions. Instead of choking or requireing implimenters to call the
context's value() method before being de-scoped, detect when a
NamedLoaderContext has been returned and return the value from the
current context.
Co-authored-by: Daniel A. Wozniak <daniel.wozniak@broadcom.com>
---
salt/loader/lazy.py | 5 ++++-
tests/pytests/integration/modules/test_config.py | 8 ++++++++
tests/pytests/unit/loader/test_loader.py | 13 +++++++++++++
3 files changed, 25 insertions(+), 1 deletion(-)
create mode 100644 tests/pytests/integration/modules/test_config.py
diff --git a/salt/loader/lazy.py b/salt/loader/lazy.py
index 5de995d446..b7fd97f0e1 100644
--- a/salt/loader/lazy.py
+++ b/salt/loader/lazy.py
@@ -1246,7 +1246,10 @@ class LazyLoader(salt.utils.lazy.LazyDict):
self.parent_loader = current_loader
token = salt.loader.context.loader_ctxvar.set(self)
try:
- return _func_or_method(*args, **kwargs)
+ ret = _func_or_method(*args, **kwargs)
+ if isinstance(ret, salt.loader.context.NamedLoaderContext):
+ ret = ret.value()
+ return ret
finally:
self.parent_loader = None
salt.loader.context.loader_ctxvar.reset(token)
diff --git a/tests/pytests/integration/modules/test_config.py b/tests/pytests/integration/modules/test_config.py
new file mode 100644
index 0000000000..afdf470605
--- /dev/null
+++ b/tests/pytests/integration/modules/test_config.py
@@ -0,0 +1,8 @@
+import pytest
+
+
+@pytest.mark.slow_test
+def test_config_items(salt_cli, salt_minion):
+ ret = salt_cli.run("config.items", minion_tgt=salt_minion.id)
+ assert ret.returncode == 0
+ assert isinstance(ret.data, dict)
diff --git a/tests/pytests/unit/loader/test_loader.py b/tests/pytests/unit/loader/test_loader.py
index 86348749db..aba605f42a 100644
--- a/tests/pytests/unit/loader/test_loader.py
+++ b/tests/pytests/unit/loader/test_loader.py
@@ -62,3 +62,16 @@ def test_raw_mod_functions():
ret = salt.loader.raw_mod(opts, "grains", "get")
for k, v in ret.items():
assert isinstance(v, salt.loader.lazy.LoadedFunc)
+
+
+def test_return_named_context_from_loaded_func(tmp_path):
+ opts = {
+ "optimization_order": [0],
+ }
+ contents = """
+ def foobar():
+ return __test__
+ """
+ with pytest.helpers.temp_file("mymod.py", contents, directory=tmp_path):
+ loader = salt.loader.LazyLoader([tmp_path], opts, pack={"__test__": "meh"})
+ assert loader["mymod.foobar"]() == "meh"
--
2.46.1