def test_remove_fail_without_type_id(fast_poller, client): """Remove fails when a critria is provided without unit type""" repo = Repository(id="some-repo") repo.__dict__["_client"] = client criteria = Criteria.and_( Criteria.with_field("filename", "some.rpm"), Criteria.with_field("signing_key", Matcher.in_(["key123"])), ) with pytest.raises(ValueError): repo.remove_content(criteria=criteria)
def test_copy_with_criteria(fast_poller, requests_mocker, client): """Copy with criteria succeeds, and serializes criteria correctly.""" src = Repository(id="src-repo") dest = Repository(id="dest-repo") src.__dict__["_client"] = client dest.__dict__["_client"] = client requests_mocker.post( "https://pulp.example.com/pulp/api/v2/repositories/dest-repo/actions/associate/", [{"json": {"spawned_tasks": [{"task_id": "task1"}, {"task_id": "task2"}]}}], ) requests_mocker.post( "https://pulp.example.com/pulp/api/v2/tasks/search/", [ { "json": [ {"task_id": "task1", "state": "finished"}, {"task_id": "task2", "state": "skipped"}, ] } ], ) crit = Criteria.and_( Criteria.with_unit_type(RpmUnit), Criteria.with_field("name", Matcher.in_(["bash", "glibc"])), ) # Copy should succeed, and return the tasks (in this case with no matches) assert sorted(client.copy_content(src, dest, crit), key=lambda t: t.id) == [ Task(id="task1", completed=True, succeeded=True), Task(id="task2", completed=True, succeeded=True), ] hist = requests_mocker.request_history # First request should have been the associate. assert ( hist[0].url == "https://pulp.example.com/pulp/api/v2/repositories/dest-repo/actions/associate/" ) # It should have encoded our criteria object as needed by the Pulp API. assert hist[0].json() == { "criteria": { "filters": {"unit": {"name": {"$in": ["bash", "glibc"]}}}, "type_ids": ["rpm", "srpm"], }, "source_repo_id": "src-repo", }
def _rpm_criteria(self, filename, signing_keys=None, sha256sum=None): if signing_keys: return Criteria.and_( Criteria.with_field("filename", filename), Criteria.with_field("signing_key", Matcher.in_(signing_keys)), ) if sha256sum: return Criteria.and_( Criteria.with_field("filename", filename), Criteria.with_field("sha256sum", sha256sum), ) return Criteria.with_field("filename", filename)
def test_stringify_complex_criteria(): crit = Criteria.and_( Criteria.with_field("must-exist", Matcher.exists()), Criteria.with_field("foo", Matcher.equals("bar")), Criteria.true(), Criteria.or_( Criteria.with_field("foo", Matcher.regex("quux")), Criteria.with_field("other", Matcher.in_(["x", "y", "z"])), Criteria.with_field("num", Matcher.less_than(9000)), ), Criteria.with_unit_type(FileUnit), ) assert (str(crit) == "((must-exist EXISTS) AND foo=='bar' AND TRUE " "AND (foo=~/quux/ OR (other IN ['x', 'y', 'z']) OR num<9000) " "AND (content_type_id IN ['iso']))")
def test_search_mapped_field_in(): """Can do 'in' search with fields subject to Python<=>Pulp conversion.""" controller = FakeController() repo1 = Repository(id="repo1", eng_product_id=888) repo2 = Repository(id="repo2", eng_product_id=123) repo3 = Repository(id="repo3", eng_product_id=456) controller.insert_repository(repo1) controller.insert_repository(repo2) controller.insert_repository(repo3) client = controller.client crit = Criteria.with_field("eng_product_id", Matcher.in_([123, 456])) found = client.search_repository(crit).data assert sorted(found) == [repo2, repo3]
def test_remove_with_criteria(fast_poller, requests_mocker, client): """Remove succeeds when given a critria/filter for removal""" repo = Repository(id="some-repo") repo.__dict__["_client"] = client requests_mocker.post( "https://pulp.example.com/pulp/api/v2/repositories/some-repo/actions/unassociate/", [ { "json": { "spawned_tasks": [{ "task_id": "task1" }] } }, { "json": { "spawned_tasks": [{ "task_id": "task2" }] } }, ], ) requests_mocker.post( "https://pulp.example.com/pulp/api/v2/tasks/search/", [ { "json": [{ "task_id": "task1", "state": "finished" }] }, { "json": [{ "task_id": "task2", "state": "finished" }] }, ], ) criteria = Criteria.and_( Criteria.with_unit_type(RpmUnit), Criteria.with_field("filename", "some.rpm"), Criteria.with_field("signing_key", Matcher.in_(["key123"])), ) assert repo.remove_content(criteria=criteria).result() == [ Task(id="task1", completed=True, succeeded=True) ] # It should have passed the criteria to Pulp req = requests_mocker.request_history assert ( req[0].url == "https://pulp.example.com/pulp/api/v2/repositories/some-repo/actions/unassociate/" ) assert req[0].json() == { "criteria": { "filters": { "unit": { "$and": [ { "filename": { "$eq": "some.rpm" } }, { "signing_key": { "$in": ["key123"] } }, ] } }, "type_ids": ["rpm", "srpm"], } } # Providing both criteria and type_ids assert repo.remove_content(criteria=criteria, type_ids=["type1", "type2"]).result() == [ Task(id="task2", completed=True, succeeded=True) ] # It should have passed only the critera to Pulp and ignore type_ids as kwarg req = requests_mocker.request_history assert ( req[0].url == "https://pulp.example.com/pulp/api/v2/repositories/some-repo/actions/unassociate/" ) assert req[0].json() == { "criteria": { "filters": { "unit": { "$and": [ { "filename": { "$eq": "some.rpm" } }, { "signing_key": { "$in": ["key123"] } }, ] } }, "type_ids": ["rpm", "srpm"], } }
def test_copy_content_with_criteria(controller): """copy_content can filter copied units by field values""" src = YumRepository(id="src-repo") dest = YumRepository(id="dest-repo") controller.insert_repository(src) controller.insert_repository(dest) src_units = [ RpmUnit(name="bash", version="4.0", release="1", arch="x86_64"), RpmUnit(name="bash", version="4.0", release="2", arch="x86_64"), RpmUnit(name="bash", version="4.1", release="3", arch="x86_64"), RpmUnit(name="glibc", version="5.0", release="1", arch="x86_64"), ] controller.insert_units(src, src_units) client = controller.client # Repos are initially detached, re-fetch them via client src = client.get_repository(src.id).result() dest = client.get_repository(dest.id).result() # This is what we want to copy... crit = Criteria.and_( Criteria.with_field("name", "bash"), Criteria.with_field("release", Matcher.in_(["1", "3"])), ) # Copy should succeed copy_tasks = list( client.copy_content(src, dest, crit, options=CopyOptions(require_signed_rpms=False))) # It should have copied only those units matching the criteria units = sum([t.units for t in copy_tasks], []) assert sorted(units, key=repr) == [ RpmUnit(name="bash", version="4.0", release="1", arch="x86_64", epoch="0"), RpmUnit(name="bash", version="4.1", release="3", arch="x86_64", epoch="0"), ] # The copy should also impact subsequent content searches. dest_units = list(dest.search_content()) assert sorted(dest_units, key=repr) == [ RpmUnit( unit_id="e3e70682-c209-4cac-629f-6fbed82c07cd", name="bash", version="4.0", release="1", arch="x86_64", epoch="0", repository_memberships=["src-repo", "dest-repo"], ), RpmUnit( unit_id="d4713d60-c8a7-0639-eb11-67b367a9c378", name="bash", version="4.1", release="3", arch="x86_64", epoch="0", repository_memberships=["src-repo", "dest-repo"], ), ]
def test_delete_files(command_tester, fake_collector, monkeypatch): """Deleting files from repos succeeds""" repo1 = FileRepository( id="some-filerepo", eng_product_id=123, relative_url="some/publish/url", mutable_urls=["mutable1", "mutable2"], ) repo2 = FileRepository( id="other-filerepo", eng_product_id=123, relative_url="other/publish/url", mutable_urls=["mutable1", "mutable2"], ) files1 = [ FileUnit(path="hello.iso", size=123, sha256sum="a" * 64, unit_id="files1_f1"), FileUnit(path="some.iso", size=454435, sha256sum="b" * 64, unit_id="files1_f2"), ] files2 = [ FileUnit(path="other.iso", size=123, sha256sum="a" * 64, unit_id="files2_f1") ] with FakeDeletePackages() as task_instance: task_instance.pulp_client_controller.insert_repository(repo1) task_instance.pulp_client_controller.insert_repository(repo2) task_instance.pulp_client_controller.insert_units(repo1, files1) task_instance.pulp_client_controller.insert_units(repo2, files2) # Let's try setting the cache flush root via env. monkeypatch.setenv("FASTPURGE_ROOT_URL", "https://cdn.example2.com/") # It should run with expected output. command_tester.test( task_instance.main, [ "test-delete", "--pulp-url", "https://pulp.example.com/", "--fastpurge-host", "fakehost-xxx.example.net", "--fastpurge-client-secret", "abcdef", "--fastpurge-client-token", "efg", "--fastpurge-access-token", "tok", "--repo", "some-filerepo", "--file", "some.iso,hello.iso", "--file", "other.iso", "--file", "random.txt", ], ) # deleted units are collected assert sorted(fake_collector.items, key=lambda pi: pi["filename"]) == [ { "origin": "pulp", "src": None, "state": "DELETED", "build": None, "dest": "some-filerepo", "checksums": {"sha256": "a" * 64}, "signing_key": None, "filename": "hello.iso", }, { "origin": "pulp", "src": None, "state": "DELETED", "build": None, "dest": "some-filerepo", "checksums": {"sha256": "b" * 64}, "signing_key": None, "filename": "some.iso", }, ] # verify whether files were deleted on Pulp client = task_instance.pulp_client # get the repo where the files were deleted repos = list( client.search_repository(Criteria.with_id("some-filerepo")).result() ) assert len(repos) == 1 repo = repos[0] unit_ids = [] for f in files1: unit_ids.append(f.unit_id) criteria = Criteria.with_field("unit_id", Matcher.in_(unit_ids)) # deleted files are not in the repo files = list(repo.search_content(criteria).result()) assert len(files) == 0 # same files exist on Pulp as orphans files_search = list(client.search_content(criteria).result()) assert len(files_search) == 2
def test_delete_modules(command_tester, fake_collector, monkeypatch): """Deleting modules and it's artifacts from repos succeeds""" repo = YumRepository( id="some-yumrepo", relative_url="some/publish/url", mutable_urls=["repomd.xml"] ) files = [ RpmUnit( name="bash", version="1.23", release="1.test8", arch="x86_64", filename="bash-1.23-1.test8_x86_64.rpm", sha256sum="a" * 64, md5sum="b" * 32, signing_key="aabbcc", provides=[], requires=[], unit_id="rpm1", ), RpmUnit( name="dash", version="1.23", release="1.test8", arch="x86_64", filename="dash-1.23-1.test8_x86_64.rpm", sha256sum="a" * 64, md5sum="b" * 32, signing_key="aabbcc", provides=[], requires=[], unit_id="rpm2", ), ModulemdUnit( name="mymod", stream="s1", version=123, context="a1c2", arch="s390x", artifacts=["bash-0:1.23-1.test8_x86_64", "dash-0:1.23-1.test8_x86_64"], unit_id="module1", ), ] with FakeDeletePackages() as task_instance: task_instance.pulp_client_controller.insert_repository(repo) task_instance.pulp_client_controller.insert_units(repo, files) # Let's try setting the cache flush root via env. monkeypatch.setenv("FASTPURGE_ROOT_URL", "https://cdn.example2.com/") # It should run with expected output. command_tester.test( task_instance.main, [ "test-delete", "--pulp-url", "https://pulp.example.com/", "--fastpurge-host", "fakehost-xxx.example.net", "--fastpurge-client-secret", "abcdef", "--fastpurge-client-token", "efg", "--fastpurge-access-token", "tok", "--repo", "some-yumrepo", "--file", "mymod:s1:123:a1c2:s390x", "--signing-key", "aabbcc", ], ) assert sorted(fake_collector.items, key=lambda pi: pi["filename"]) == [ { "origin": "pulp", "src": None, "state": "DELETED", "build": None, "dest": "some-yumrepo", "checksums": {"sha256": "a" * 64}, "signing_key": None, "filename": "bash-1.23-1.test8.x86_64.rpm", }, { "origin": "pulp", "src": None, "state": "DELETED", "build": None, "dest": "some-yumrepo", "checksums": {"sha256": "a" * 64}, "signing_key": None, "filename": "dash-1.23-1.test8.x86_64.rpm", }, { "origin": "pulp", "src": None, "state": "DELETED", "build": None, "dest": "some-yumrepo", "checksums": None, "signing_key": None, "filename": "mymod:s1:123:a1c2:s390x", }, ] # verify whether files were deleted on Pulp client = task_instance.pulp_client # get the repo where the files were deleted repos = list( client.search_repository(Criteria.with_id("some-yumrepo")).result() ) assert len(repos) == 1 repo = repos[0] # criteria with the unit_ids unit_ids = [] for f in files: unit_ids.append(f.unit_id) criteria = Criteria.with_field("unit_id", Matcher.in_(unit_ids)) # deleted files are not in the repo files = list(repo.search_content(criteria).result()) assert len(files) == 0 # same files exist on Pulp as orphans files_search = list(client.search_content(criteria).result()) assert len(files_search) == 3
def test_delete_unsigned_rpms(command_tester, fake_collector, monkeypatch): """Deleting unsigned RPMs from repos succeeds""" repo = YumRepository( id="some-yumrepo", relative_url="some/publish/url", mutable_urls=["repomd.xml"] ) files = [ RpmUnit( name="signed", version="1.23", release="1.test8", arch="x86_64", filename="signed-1.23-1.test8_x86_64.rpm", sha256sum="a" * 64, md5sum="b" * 32, signing_key="aabbcc", unit_id="signed_rpm", ), RpmUnit( name="unsigned", version="2.25", release="1.test8", arch="x86_64", filename="unsigned-2.25-1.test8_x86_64.rpm", sha256sum="a" * 64, md5sum="b" * 32, signing_key=None, unit_id="unsigned_rpm", ), ] with FakeDeletePackages() as task_instance: task_instance.pulp_client_controller.insert_repository(repo) task_instance.pulp_client_controller.insert_units(repo, files) # Let's try setting the cache flush root via env. monkeypatch.setenv("FASTPURGE_ROOT_URL", "https://cdn.example2.com/") # It should run with expected output. command_tester.test( task_instance.main, [ "test-delete", "--pulp-url", "https://pulp.example.com/", "--fastpurge-host", "fakehost-xxx.example.net", "--fastpurge-client-secret", "abcdef", "--fastpurge-client-token", "efg", "--fastpurge-access-token", "tok", "--repo", "some-yumrepo", "--file", "unsigned-2.25-1.test8_x86_64.rpm,signed-1.23-1.test8_x86_64.rpm", "--allow-unsigned", ], ) # It should record that it removed these push items: assert sorted(fake_collector.items, key=lambda pi: pi["filename"]) == [ { "origin": "pulp", "src": None, "dest": "some-yumrepo", "signing_key": None, "filename": "unsigned-2.25-1.test8.x86_64.rpm", "state": "DELETED", "build": None, "checksums": {"sha256": "a" * 64}, } ] # verify whether files were deleted on Pulp client = task_instance.pulp_client # get the repo where the files were deleted repos = list( client.search_repository(Criteria.with_id("some-yumrepo")).result() ) assert len(repos) == 1 repo = repos[0] # criteria with the unit_ids unit_ids = [] for f in files: unit_ids.append(f.unit_id) criteria = Criteria.with_field("unit_id", Matcher.in_(unit_ids)) # unsigned RPM is deleted, only signed RPM left in the repo result_files = list(repo.search_content(criteria).result()) assert len(result_files) == 1 assert files[0].filename == "signed-1.23-1.test8_x86_64.rpm"
def test_delete_rpms(command_tester, fake_collector, monkeypatch): """Deleting RPMs from repos succeeds""" repo1 = YumRepository( id="some-yumrepo", relative_url="some/publish/url", mutable_urls=["repomd.xml"] ) repo2 = YumRepository( id="other-yumrepo", relative_url="other/publish/url", mutable_urls=["repomd.xml"], ) files1 = [ RpmUnit( name="bash", version="1.23", release="1.test8", arch="x86_64", filename="bash-1.23-1.test8_x86_64.rpm", sha256sum="a" * 64, md5sum="b" * 32, signing_key="aabbcc", unit_id="file1_rpm1", ), RpmUnit( name="dash", version="2.25", release="1.test8", arch="x86_64", filename="dash-2.25-1.test8_x86_64.rpm", sha256sum="a" * 64, md5sum="b" * 32, signing_key="aabbcc", unit_id="file1_rpm2", ), ModulemdUnit( name="mymod", stream="s1", version=123, context="a1c2", arch="s390x", unit_id="file1_mod1", ), ] files2 = [ RpmUnit( name="crash", version="3.30", release="1.test8", arch="s390x", filename="crash-3.30-1.test8_s390x.rpm", sha256sum="a" * 64, md5sum="b" * 32, signing_key="aabbcc", unit_id="file2_rpm1", ) ] files3 = [ RpmUnit( name="rash", version="1.30", release="1.test8", arch="noarch", filename="rash-1.30-1.test8_noarch.rpm", sha256sum="a" * 64, md5sum="b" * 32, signing_key="aabbcc", unit_id="file3_rpm1", ) ] undeleted = [ RpmUnit( name="exist", version="1.34", release="1.test8", arch="noarch", filename="exist-1.34-1.test8_noarch.rpm", sha256sum="a" * 64, md5sum="b" * 32, signing_key="aabbcc", unit_id="undeleted_rpm1", ) ] files1.extend(files3) files1.extend(undeleted) files2.extend(files3) with FakeDeletePackages() as task_instance: task_instance.pulp_client_controller.insert_repository(repo1) task_instance.pulp_client_controller.insert_repository(repo2) task_instance.pulp_client_controller.insert_units(repo1, files1) task_instance.pulp_client_controller.insert_units(repo2, files2) # Let's try setting the cache flush root via env. monkeypatch.setenv("FASTPURGE_ROOT_URL", "https://cdn.example2.com/") # It should run with expected output. command_tester.test( task_instance.main, [ "test-delete", "--pulp-url", "https://pulp.example.com/", "--fastpurge-host", "fakehost-xxx.example.net", "--fastpurge-client-secret", "abcdef", "--fastpurge-client-token", "efg", "--fastpurge-access-token", "tok", "--repo", "some-yumrepo,other-yumrepo", "--repo", "some-other-repo", "--file", "bash-1.23-1.test8_x86_64.rpm", "--file", "dash-2.25-1.test8_x86_64.rpm,crash-3.30-1.test8_s390x.rpm", "--file", "trash-1.0-1.test8_noarch.rpm,rash-1.30-1.test8_noarch.rpm", "--signing-key", "aabbcc", ], ) # It should record that it removed these push items: assert sorted(fake_collector.items, key=lambda pi: pi["filename"]) == [ { "origin": "pulp", "src": None, "dest": "some-yumrepo", "signing_key": None, "filename": "bash-1.23-1.test8.x86_64.rpm", "state": "DELETED", "build": None, "checksums": {"sha256": "a" * 64}, }, { "origin": "pulp", "src": None, "dest": "other-yumrepo", "signing_key": None, "filename": "crash-3.30-1.test8.s390x.rpm", "state": "DELETED", "build": None, "checksums": {"sha256": "a" * 64}, }, { "origin": "pulp", "src": None, "dest": "some-yumrepo", "signing_key": None, "filename": "dash-2.25-1.test8.x86_64.rpm", "state": "DELETED", "build": None, "checksums": {"sha256": "a" * 64}, }, { "origin": "pulp", "src": None, "dest": "other-yumrepo", "signing_key": None, "filename": "rash-1.30-1.test8.noarch.rpm", "state": "DELETED", "build": None, "checksums": {"sha256": "a" * 64}, }, { "origin": "pulp", "src": None, "dest": "some-yumrepo", "signing_key": None, "filename": "rash-1.30-1.test8.noarch.rpm", "state": "DELETED", "build": None, "checksums": {"sha256": "a" * 64}, }, ] # verify whether files were deleted on Pulp client = task_instance.pulp_client # get the repo where the files were deleted repos = sorted( list( client.search_repository( Criteria.with_id(["some-yumrepo", "other-yumrepo"]) ).result() ), key=lambda r: r.id, ) assert len(repos) == 2 r2, r1 = repos assert r1.id == repo1.id assert r2.id == repo2.id # criteria with the unit_ids # critera1 for files1 in repo1 unit_ids = [] for f in files1: unit_ids.append(f.unit_id) criteria1 = Criteria.with_field("unit_id", Matcher.in_(unit_ids)) # critera2 for files2 in repo2 unit_ids = [] for f in files2: unit_ids.append(f.unit_id) criteria2 = Criteria.with_field("unit_id", Matcher.in_(unit_ids)) # files are not in the repo1 except undeleted rpm and module result1 = sorted( list(r1.search_content(criteria1).result()), key=lambda v: v.unit_id ) assert len(result1) == 2 # modulemd in files1 assert result1[0].unit_id == files1[2].unit_id # undeleted file assert result1[1].unit_id == undeleted[0].unit_id # files are not in repo2 result2 = list(r2.search_content(criteria1).result()) assert len(result2) == 0 # All the files exist on Pulp files_search = list( client.search_content(Criteria.or_(criteria1, criteria2)).result() ) assert len(files_search) == 6
def test_delete_advisory(command_tester, fake_collector, monkeypatch): """Deletion of packages and modules in advisories from provided repos succeeds""" repo1 = YumRepository(id="some-yumrepo", relative_url="some/publish/url", mutable_urls=["repomd.xml"]) repo2 = YumRepository( id="some-other-repo", relative_url="other/publish/url", mutable_urls=["repomd.xml"], ) pkglist = [ ErratumPackageCollection( name="colection-0", packages=None, short="", module=ErratumModule(name="mymod", stream="s1", version="123", context="a1c2", arch="s390x"), ), ErratumPackageCollection( name="collection-1", packages=[ ErratumPackage( name="bash", version="1.23", release="1.test8", arch="x86_64", filename="bash-1.23-1.test8_x86_64.rpm", sha256sum="a" * 64, md5sum="b" * 32, ), ErratumPackage( name="dash", version="1.23", release="1.test8", arch="x86_64", filename="dash-1.23-1.test8_x86_64.rpm", sha256sum="a" * 64, md5sum="b" * 32, ), ], short="", module=None, ), ] files1 = [ RpmUnit( name="bash", version="1.23", release="1.test8", arch="x86_64", filename="bash-1.23-1.test8_x86_64.rpm", sha256sum="a" * 64, md5sum="b" * 32, signing_key="aabbcc", unit_id="files1_rpm1", ), RpmUnit( name="dash", version="1.23", release="1.test8", arch="x86_64", filename="dash-1.23-1.test8_x86_64.rpm", sha256sum="a" * 64, md5sum="b" * 32, signing_key="aabbcc", unit_id="files1_rpm2", ), RpmUnit( name="crash", version="1.23", release="1.test8", arch="x86_64", filename= "crash-1.23-1.test8.module+el8.0.0+3049+59fd2bba.x86_64.rpm", sha256sum="a" * 64, md5sum="b" * 32, signing_key="aabbcc", unit_id="files1_rpm3", ), ModulemdUnit( name="mymod", stream="s1", version=123, context="a1c2", arch="s390x", artifacts=[ "crash-0:1.23-1.test8.module+el8.0.0+3049+59fd2bba.x86_64" ], unit_id="files1_mod1", ), ErratumUnit( unit_id="e3e70682-c209-4cac-629f-6fbed82c07cd", id="RHSA-1111:22", summary="Dummy erratum", content_type_id="erratum", repository_memberships=["some-yumrepo"], pkglist=pkglist, ), ] files2 = [ ErratumUnit( unit_id="x4e73262-e239-44ac-629f-6fbed82c07cd", id="RHBA-1001:22", summary="Other erratum", content_type_id="erratum", repository_memberships=["some-other-repo"], pkglist=[], ), ] with FakeDeleteAdvisory() as task_instance: task_instance.pulp_client_controller.insert_repository(repo1) task_instance.pulp_client_controller.insert_repository(repo2) task_instance.pulp_client_controller.insert_units(repo1, files1) task_instance.pulp_client_controller.insert_units(repo2, files2) # Let's try setting the cache flush root via env. monkeypatch.setenv("FASTPURGE_ROOT_URL", "https://cdn.example2.com/") # It should run with expected output. command_tester.test( task_instance.main, [ "test-delete", "--pulp-url", "https://pulp.example.com/", "--fastpurge-host", "fakehost-xxx.example.net", "--fastpurge-client-secret", "abcdef", "--fastpurge-client-token", "efg", "--fastpurge-access-token", "tok", "--repo", "some-yumrepo,other-yumrepo", "--advisory", "RHSA-1111:22", "--advisory", "RHBA-1001:22", ], ) assert sorted(fake_collector.items, key=lambda pi: pi["filename"]) == [ { "origin": "pulp", "src": None, "dest": "some-yumrepo", "signing_key": None, "filename": "bash-1.23-1.test8.x86_64.rpm", "state": "DELETED", "build": None, "checksums": { "sha256": "a" * 64 }, }, { "origin": "pulp", "src": None, "dest": "some-yumrepo", "signing_key": None, "filename": "crash-1.23-1.test8.x86_64.rpm", "state": "DELETED", "build": None, "checksums": { "sha256": "a" * 64 }, }, { "origin": "pulp", "src": None, "dest": "some-yumrepo", "signing_key": None, "filename": "dash-1.23-1.test8.x86_64.rpm", "state": "DELETED", "build": None, "checksums": { "sha256": "a" * 64 }, }, { "origin": "pulp", "src": None, "dest": "some-yumrepo", "signing_key": None, "filename": "mymod:s1:123:a1c2:s390x", "state": "DELETED", "build": None, "checksums": None, }, ] # verify whether the rpms and modules were deleted from the repo on Pulp client = task_instance.pulp_client # effectively only some-yumrepo(repo1) was modified repos = list( client.search_repository( Criteria.with_id("some-yumrepo")).result()) assert len(repos) == 1 repo = repos[0] # list the removed unit's unit_id # RPMs from the erratum package list unit_ids = ["files1_rpm1", "files1_rpm2"] # module from the erratum package list unit_ids.append("files1_mod1") # package in the above module unit_ids.append("files1_rpm3") criteria = Criteria.with_field("unit_id", Matcher.in_(unit_ids)) # deleted files are not in the repo files = list(repo.search_content(criteria).result()) assert len(files) == 0 # same files exist on Pulp as orphans files_search = list(client.search_content(criteria).result()) assert len(files_search) == 4
def test_delete_advisory_no_repos_provided(command_tester, fake_collector, monkeypatch): """Deletion of packages succeeds in all the repos when the same advisory is present in multiple repos and repos are not provided in the request""" repo1 = YumRepository(id="some-yumrepo", relative_url="some/publish/url", mutable_urls=["repomd.xml"]) repo2 = YumRepository( id="other-yumrepo", relative_url="other/publish/url", mutable_urls=["repomd.xml"], ) pkglist = [ ErratumPackageCollection( name="collection-1", packages=[ ErratumPackage( name="bash", version="1.23", release="1.test8", arch="x86_64", filename="bash-1.23-1.test8_x86_64.rpm", sha256sum="a" * 64, md5sum="b" * 32, ), ErratumPackage( name="dash", version="1.23", release="1.test8", arch="x86_64", filename="dash-1.23-1.test8_x86_64.rpm", sha256sum="a" * 64, md5sum="b" * 32, ), ], short="", module=None, ), ] files = [ RpmUnit( name="bash", version="1.23", release="1.test8", arch="x86_64", filename="bash-1.23-1.test8_x86_64.rpm", sha256sum="a" * 64, md5sum="b" * 32, signing_key="aabbcc", unit_id="files1_rpm1", ), RpmUnit( name="dash", version="1.23", release="1.test8", arch="x86_64", filename="dash-1.23-1.test8_x86_64.rpm", sha256sum="a" * 64, md5sum="b" * 32, signing_key="aabbcc", unit_id="files1_rpm2", ), RpmUnit( name="crash", version="1.23", release="1.test8", arch="x86_64", filename= "crash-1.23-1.test8.module+el8.0.0+3049+59fd2bba.x86_64.rpm", sha256sum="a" * 64, md5sum="b" * 32, signing_key="aabbcc", unit_id="files1_rpm3", ), ErratumUnit( unit_id="x4e73262-e239-44ac-629f-6fbed82c07cd", id="RHBA-1001:22", summary="Other erratum", content_type_id="erratum", repository_memberships=["some-yumrepo", "other-yumrepo"], pkglist=pkglist, ), ] with FakeDeleteAdvisory() as task_instance: task_instance.pulp_client_controller.insert_repository(repo1) task_instance.pulp_client_controller.insert_repository(repo2) task_instance.pulp_client_controller.insert_units(repo1, files) task_instance.pulp_client_controller.insert_units(repo2, files) # Let's try setting the cache flush root via env. monkeypatch.setenv("FASTPURGE_ROOT_URL", "https://cdn.example2.com/") # It should run with expected output. command_tester.test( task_instance.main, [ "test-delete", "--pulp-url", "https://pulp.example.com/", "--fastpurge-host", "fakehost-xxx.example.net", "--fastpurge-client-secret", "abcdef", "--fastpurge-client-token", "efg", "--fastpurge-access-token", "tok", "--advisory", "RHBA-1001:22", ], ) assert sorted(fake_collector.items, key=lambda pi: (pi["filename"], pi["dest"])) == [ { "build": None, "checksums": { "sha256": "a" * 64 }, "dest": "other-yumrepo", "filename": "bash-1.23-1.test8.x86_64.rpm", "origin": "pulp", "signing_key": None, "src": None, "state": "DELETED", }, { "build": None, "checksums": { "sha256": "a" * 64 }, "dest": "some-yumrepo", "filename": "bash-1.23-1.test8.x86_64.rpm", "origin": "pulp", "signing_key": None, "src": None, "state": "DELETED", }, { "build": None, "checksums": { "sha256": "a" * 64 }, "dest": "other-yumrepo", "filename": "dash-1.23-1.test8.x86_64.rpm", "origin": "pulp", "signing_key": None, "src": None, "state": "DELETED", }, { "build": None, "checksums": { "sha256": "a" * 64 }, "dest": "some-yumrepo", "filename": "dash-1.23-1.test8.x86_64.rpm", "origin": "pulp", "signing_key": None, "src": None, "state": "DELETED", }, ] # verify whether the rpms were deleted from the repo on Pulp client = task_instance.pulp_client # get all the repos repos = list( client.search_repository( Criteria.with_id("some-yumrepo")).result()) assert len(repos) == 1 repo1 = repos[0] repos = list( client.search_repository( Criteria.with_id("other-yumrepo")).result()) assert len(repos) == 1 repo2 = repos[0] # list the removed unit's unit_id # RPMs from the erratum package list unit_ids = ["files1_rpm1", "files1_rpm2"] criteria = Criteria.with_field("unit_id", Matcher.in_(unit_ids)) # deleted packages from the advisory are not in both the repos files = list(repo1.search_content(criteria).result()) assert len(files) == 0 files = list(repo2.search_content(criteria).result()) assert len(files) == 0 # same files exist on Pulp as orphans files_search = list(client.search_content(criteria).result()) assert len(files_search) == 2