From 00436001e98f958e7aa3127c67fc5a08eb38ae92 Mon Sep 17 00:00:00 2001 From: Tobias Grigo Date: Mon, 30 Jan 2023 20:46:04 +0100 Subject: [PATCH] Handle URL params for AptRepoFiles --- src/subscription_manager/repofile.py | 9 +++-- test/test_repolib.py | 58 ++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 3 deletions(-) diff --git a/src/subscription_manager/repofile.py b/src/subscription_manager/repofile.py index 9bc0a35f17..5033e3d59e 100644 --- a/src/subscription_manager/repofile.py +++ b/src/subscription_manager/repofile.py @@ -463,7 +463,8 @@ def sections(self): def fix_content(self, content): # Luckily apt ignores all Fields it does not recognize - baseurl = content["baseurl"] + url_with_params = content["baseurl"] + baseurl = url_with_params.rpartition("/")[0] url_res = re.match(r"^https?://(?P.*)$", baseurl) ent_res = re.match(r"^/etc/pki/entitlement/(?P.*).pem$", content["sslclientcert"]) if url_res and ent_res: @@ -471,11 +472,13 @@ def fix_content(self, content): entitlement = ent_res.group("entitlement") baseurl = "katello://{}@{}".format(entitlement, location) + parsed_url = urlparse(url_with_params) + query = parse_qs(parsed_url.query) apt_cont = content.copy() apt_cont["Types"] = "deb" apt_cont["URIs"] = baseurl - apt_cont["Suites"] = "default" - apt_cont["Components"] = "all" + apt_cont["Suites"] = query["rel"][0].replace(",", " ") if "rel" in query else "default" + apt_cont["Components"] = query["comp"][0].replace(",", " ") if "comp" in query else "all" apt_cont["Trusted"] = "yes" if apt_cont["arches"] is None or apt_cont["arches"] == ["ALL"]: diff --git a/test/test_repolib.py b/test/test_repolib.py index df8f6f344f..6454e30d19 100644 --- a/test/test_repolib.py +++ b/test/test_repolib.py @@ -1043,6 +1043,64 @@ def test_fix_content_default(self, mock_file): self.assertIn(key, act_content) self.assertEqual(act_content[key], exp_params[key]) + @patch("builtins.open", new_callable=mock_open, read_data="data") + def test_fix_content_url_params(self, mock_file): + # Setup mock and expected values + assert open("/etc/apt/sources.list.d/rhsm.sources").read() == "data" + mock_file.assert_called_with("/etc/apt/sources.list.d/rhsm.sources") + exp_params = { + "arches": "none", + "Types": "deb", + "URIs": "https://example.site.org/", + "Suites": "focal", + "Components": "puppet7", + "Trusted": "yes", + "sslclientcert": "mypem.pem", + } + ar = self._helper_stub_repofile() + repo_mock = self._helper_stub_repo( + "mock", + existing_values=[ + ("baseurl", "https://example.site.org/?comp=puppet7&rel=focal"), + ("sslclientcert", exp_params["ssclientcert"]), + ], + ) + # Modify data + act_content = ar.fix_content(repo_mock) + # Test modification by comparing with expected values + for key in exp_params: + self.assertIn(key, act_content) + self.assertEqual(act_content[key], exp_params[key]) + + @patch("builtins.open", new_callable=mock_open, read_data="data") + def test_fix_content_url_params_multi(self, mock_file): + # Setup mock and expected values + assert open("/etc/apt/sources.list.d/rhsm.sources").read() == "data" + mock_file.assert_called_with("/etc/apt/sources.list.d/rhsm.sources") + exp_params = { + "arches": "none", + "Types": "deb", + "URIs": "https://example.site.org/", + "Suites": "focal jammy", + "Components": "puppet7 puppet6", + "Trusted": "yes", + "sslclientcert": "mypem.pem", + } + ar = self._helper_stub_repofile() + repo_mock = self._helper_stub_repo( + "mock", + existing_values=[ + ("baseurl", "https://example.site.org/?comp=puppet7,puppet6&rel=focal,jammy"), + ("sslclientcert", exp_params["ssclientcert"]), + ], + ) + # Modify data + act_content = ar.fix_content(repo_mock) + # Test modification by comparing with expected values + for key in exp_params: + self.assertIn(key, act_content) + self.assertEqual(act_content[key], exp_params[key]) + @patch("builtins.open", new_callable=mock_open, read_data="data") def test_fix_content_arches(self, mock_file): # Setup mock and expected values