diff --git a/_lastrevision b/_lastrevision index 5d75ab5..d9d4a41 100644 --- a/_lastrevision +++ b/_lastrevision @@ -1 +1 @@ -e793c02a9091b88d181f190847fd35964ce3e91e \ No newline at end of file +06f92313dcbe69d75634862b15653b81dc74e340 \ No newline at end of file diff --git a/join-masters-if-it-is-a-list-671.patch b/join-masters-if-it-is-a-list-671.patch new file mode 100644 index 0000000..2f384ab --- /dev/null +++ b/join-masters-if-it-is-a-list-671.patch @@ -0,0 +1,105 @@ +From 94973ee85d766d7e98d02d89f4c81e59b36cb716 Mon Sep 17 00:00:00 2001 +From: Marek Czernek +Date: Thu, 29 Aug 2024 10:01:12 +0200 +Subject: [PATCH] Join masters if it is a list (#671) + +Co-authored-by: Twangboy +--- + changelog/64170.fixed.md | 2 + + salt/utils/cloud.py | 10 +++++ + tests/pytests/unit/utils/test_cloud.py | 52 ++++++++++++++++++++++++++ + 3 files changed, 64 insertions(+) + create mode 100644 changelog/64170.fixed.md + +diff --git a/changelog/64170.fixed.md b/changelog/64170.fixed.md +new file mode 100644 +index 0000000000..1d20355bf1 +--- /dev/null ++++ b/changelog/64170.fixed.md +@@ -0,0 +1,2 @@ ++Fixed issue in salt-cloud so that multiple masters specified in the cloud ++are written to the minion config properly +diff --git a/salt/utils/cloud.py b/salt/utils/cloud.py +index b7208dc4a6..a084313059 100644 +--- a/salt/utils/cloud.py ++++ b/salt/utils/cloud.py +@@ -1202,6 +1202,16 @@ def wait_for_passwd( + time.sleep(trysleep) + + ++def _format_master_param(master): ++ """ ++ If the master is a list, we need to convert it to a comma delimited string ++ Otherwise, we just return master ++ """ ++ if isinstance(master, list): ++ return ",".join(master) ++ return master ++ ++ + def deploy_windows( + host, + port=445, +diff --git a/tests/pytests/unit/utils/test_cloud.py b/tests/pytests/unit/utils/test_cloud.py +index 550b63c974..db9d258d39 100644 +--- a/tests/pytests/unit/utils/test_cloud.py ++++ b/tests/pytests/unit/utils/test_cloud.py +@@ -605,3 +605,55 @@ def test_deploy_script_ssh_timeout(): + ssh_kwargs = root_cmd.call_args.kwargs + assert "ssh_timeout" in ssh_kwargs + assert ssh_kwargs["ssh_timeout"] == 34 ++ ++ ++@pytest.mark.parametrize( ++ "master,expected", ++ [ ++ (None, None), ++ ("single_master", "single_master"), ++ (["master1", "master2", "master3"], "master1,master2,master3"), ++ ], ++) ++def test__format_master_param(master, expected): ++ result = cloud._format_master_param(master) ++ assert result == expected ++ ++ ++@pytest.mark.skip_unless_on_windows(reason="Only applicable for Windows.") ++@pytest.mark.parametrize( ++ "master,expected", ++ [ ++ (None, None), ++ ("single_master", "single_master"), ++ (["master1", "master2", "master3"], "master1,master2,master3"), ++ ], ++) ++def test_deploy_windows_master(master, expected): ++ """ ++ Test deploy_windows with master parameter ++ """ ++ mock_true = MagicMock(return_value=True) ++ mock_tuple = MagicMock(return_value=(0, 0, 0)) ++ with patch("salt.utils.smb.get_conn", MagicMock()), patch( ++ "salt.utils.smb.mkdirs", MagicMock() ++ ), patch("salt.utils.smb.put_file", MagicMock()), patch( ++ "salt.utils.smb.delete_file", MagicMock() ++ ), patch( ++ "salt.utils.smb.delete_directory", MagicMock() ++ ), patch( ++ "time.sleep", MagicMock() ++ ), patch.object( ++ cloud, "wait_for_port", mock_true ++ ), patch.object( ++ cloud, "fire_event", MagicMock() ++ ), patch.object( ++ cloud, "wait_for_psexecsvc", mock_true ++ ), patch.object( ++ cloud, "run_psexec_command", mock_tuple ++ ) as mock: ++ cloud.deploy_windows(host="test", win_installer="install.exe", master=master) ++ expected_cmd = "c:\\salttemp\\install.exe" ++ expected_args = "/S /master={} /minion-name=None".format(expected) ++ assert mock.call_args_list[0].args[0] == expected_cmd ++ assert mock.call_args_list[0].args[1] == expected_args +-- +2.44.0 + diff --git a/replace-use-of-pygit2-deprecated-and-removed-1.15.0-.patch b/replace-use-of-pygit2-deprecated-and-removed-1.15.0-.patch new file mode 100644 index 0000000..789a7ea --- /dev/null +++ b/replace-use-of-pygit2-deprecated-and-removed-1.15.0-.patch @@ -0,0 +1,122 @@ +From 3f3c8d80427c9d90bea5fbca785b210260d33a0f Mon Sep 17 00:00:00 2001 +From: Marek Czernek +Date: Wed, 21 Aug 2024 16:15:02 +0200 +Subject: [PATCH] Replace use of pygit2 deprecated and removed (1.15.0) + oid with id (#673) + +Co-authored-by: David Murphy +--- + salt/utils/gitfs.py | 31 ++++++++++++++++--------------- + 1 file changed, 16 insertions(+), 15 deletions(-) + +diff --git a/salt/utils/gitfs.py b/salt/utils/gitfs.py +index 061647edaca..f3902c1f19a 100644 +--- a/salt/utils/gitfs.py ++++ b/salt/utils/gitfs.py +@@ -1683,7 +1683,7 @@ class Pygit2(GitProvider): + # remote ref. + self.repo.checkout(checkout_ref) + if branch: +- self.repo.reset(oid, pygit2.GIT_RESET_HARD) ++ self.repo.reset(pygit2_id, pygit2.GIT_RESET_HARD) + return True + except GitLockError as exc: + if exc.errno == errno.EEXIST: +@@ -1714,11 +1714,11 @@ class Pygit2(GitProvider): + tag_ref = "refs/tags/" + tgt_ref + if remote_ref in refs: + # Get commit id for the remote ref +- oid = self.peel(self.repo.lookup_reference(remote_ref)).id ++ pygit2_id = self.peel(self.repo.lookup_reference(remote_ref)).id + if local_ref not in refs: + # No local branch for this remote, so create one and point + # it at the commit id of the remote ref +- self.repo.create_reference(local_ref, oid) ++ self.repo.create_reference(local_ref, pygit2_id) + + try: + target_sha = self.peel(self.repo.lookup_reference(remote_ref)).hex +@@ -1749,7 +1749,8 @@ class Pygit2(GitProvider): + # cachedir). + head_ref = local_head.target + # If head_ref is not a string, it will point to a +- # pygit2.Oid object and we are in detached HEAD mode. ++ # pygit2.id object (oid is deprecated and removed) and ++ # we are in detached HEAD mode. + # Therefore, there is no need to add a local reference. If + # head_ref == local_ref, then the local reference for HEAD + # in refs/heads/ already exists and again, no need to add. +@@ -1918,10 +1919,10 @@ class Pygit2(GitProvider): + the empty directories within it in the "blobs" list + """ + for entry in iter(tree): +- if entry.oid not in self.repo: ++ if entry.id not in self.repo: + # Entry is a submodule, skip it + continue +- blob = self.repo[entry.oid] ++ blob = self.repo[entry.id] + if not isinstance(blob, pygit2.Tree): + continue + blobs.append( +@@ -1940,8 +1941,8 @@ class Pygit2(GitProvider): + return ret + if self.root(tgt_env): + try: +- oid = tree[self.root(tgt_env)].oid +- tree = self.repo[oid] ++ pygit2_id = tree[self.root(tgt_env)].id ++ tree = self.repo[pygit2_id] + except KeyError: + return ret + if not isinstance(tree, pygit2.Tree): +@@ -2056,17 +2057,17 @@ class Pygit2(GitProvider): + the file paths and symlink info in the "blobs" dict + """ + for entry in iter(tree): +- if entry.oid not in self.repo: ++ if entry.id not in self.repo: + # Entry is a submodule, skip it + continue +- obj = self.repo[entry.oid] ++ obj = self.repo[entry.id] + if isinstance(obj, pygit2.Blob): + repo_path = salt.utils.path.join( + prefix, entry.name, use_posixpath=True + ) + blobs.setdefault("files", []).append(repo_path) + if stat.S_ISLNK(tree[entry.name].filemode): +- link_tgt = self.repo[tree[entry.name].oid].data ++ link_tgt = self.repo[tree[entry.name].id].data + blobs.setdefault("symlinks", {})[repo_path] = link_tgt + elif isinstance(obj, pygit2.Tree): + _traverse( +@@ -2085,8 +2086,8 @@ class Pygit2(GitProvider): + try: + # This might need to be changed to account for a root that + # spans more than one directory +- oid = tree[self.root(tgt_env)].oid +- tree = self.repo[oid] ++ pygit2_id = tree[self.root(tgt_env)].id ++ tree = self.repo[pygit2_id] + except KeyError: + return files, symlinks + if not isinstance(tree, pygit2.Tree): +@@ -2130,12 +2131,12 @@ class Pygit2(GitProvider): + # path's object ID will be the target of the symlink. Follow + # the symlink and set path to the location indicated + # in the blob data. +- link_tgt = self.repo[entry.oid].data ++ link_tgt = self.repo[entry.id].data + path = salt.utils.path.join( + os.path.dirname(path), link_tgt, use_posixpath=True + ) + else: +- blob = self.repo[entry.oid] ++ blob = self.repo[entry.id] + if isinstance(blob, pygit2.Tree): + # Path is a directory, not a file. + blob = None +-- +2.46.0 + diff --git a/salt.changes b/salt.changes index 863b2dd..3b621a4 100644 --- a/salt.changes +++ b/salt.changes @@ -1,3 +1,19 @@ +------------------------------------------------------------------- +Thu Aug 29 11:54:27 UTC 2024 - Yeray Gutiérrez Cedrés + +- Fix cloud minion configuration for multiple masters (bsc#1229109) + +- Added: + * join-masters-if-it-is-a-list-671.patch + +------------------------------------------------------------------- +Wed Aug 21 14:30:48 UTC 2024 - Marek Czernek + +- Use Pygit2 id instead of deprecated oid in gitfs + +- Added: + * replace-use-of-pygit2-deprecated-and-removed-1.15.0-.patch + ------------------------------------------------------------------- Wed Aug 7 09:45:18 UTC 2024 - Marek Czernek diff --git a/salt.spec b/salt.spec index c247868..f214b3f 100644 --- a/salt.spec +++ b/salt.spec @@ -415,6 +415,11 @@ Patch127: skip-more-tests-related-to-old-openssl-algorithms.patch # PATCH-FIX_OPENSUSE: https://github.com/openSUSE/salt/pull/662 # PATCH-FIX_UPSTREAM: https://github.com/saltstack/salt/pull/66730 Patch128: make-tests-compatible-with-venv-bundle.patch +# PATCH-FIX_UPSTREAM: https://github.com/saltstack/salt/pull/66743 +Patch129: replace-use-of-pygit2-deprecated-and-removed-1.15.0-.patch +# PATCH-FIX_OPENSUSE: https://github.com/openSUSE/salt/pull/671 +# PATCH-FIX_UPSTREAM: https://github.com/saltstack/salt/pull/64173 +Patch130: join-masters-if-it-is-a-list-671.patch ### IMPORTANT: The line below is used as a snippet marker. Do not touch it. ### SALT PATCHES LIST END