def test_add_missing_architectures(): merger = manifest_list_merger.ManifestListMerger("quay.io/src/image:1", "quay.io/dest/image:1") merged_manifest_list = merger._add_missing_architectures(new_ml, expected_missing_archs) merged_manifest_list["manifests"].sort(key=lambda manifest: manifest["digest"]) merged_ml["manifests"].sort(key=lambda manifest: manifest["digest"]) assert merged_manifest_list == merged_ml
def test_merge_manifest_lists_success(): merger = manifest_list_merger.ManifestListMerger( "quay.io/src/image:1", "quay.io/dest/image:1", "user", "pass" ) with requests_mock.Mocker() as m: m.get( "https://quay.io/v2/src/image/manifests/1", json=new_ml, headers={"Content-Type": "application/vnd.docker.distribution.manifest.list.v2+json"}, ) m.get( "https://quay.io/v2/dest/image/manifests/1", json=old_ml, headers={"Content-Type": "application/vnd.docker.distribution.manifest.list.v2+json"}, ) m.put("https://quay.io/v2/dest/image/manifests/1", status_code=200) merger.merge_manifest_lists() assert m.call_count == 3 sent_ml = m.request_history[-1].json() sent_ml["manifests"].sort(key=lambda manifest: manifest["digest"]) expected_ml = deepcopy(merged_ml) expected_ml["manifests"].sort(key=lambda manifest: manifest["digest"]) assert sent_ml == expected_ml
def test_merge_selected_architectures_raises_unrelated_error(): merger = manifest_list_merger.ManifestListMerger( "quay.io/src/image:1", "quay.io/dest/image:1", "src-quay.io", "src-user", "src-pass", "dest-user", "dest-pass", ) with requests_mock.Mocker() as m: m.get( "https://src-quay.io/v2/src/image/manifests/1", json=new_ml, headers={"Content-Type": "application/vnd.docker.distribution.manifest.list.v2+json"}, ) m.get( "https://quay.io/v2/dest/image/manifests/1", status_code=500, ) with pytest.raises(requests.exceptions.HTTPError, match=".*500 Server Error.*"): merger.merge_manifest_lists_selected_architectures(["arm64", "s390x"]) assert m.call_count == 2
def test_merge_selected_architectures_no_dest_manifest(mock_authenticate): merger = manifest_list_merger.ManifestListMerger( "quay.io/src/image:1", "quay.io/dest/image:1", "src-quay.io", "src-user", "src-pass", "dest-user", "dest-pass", ) with requests_mock.Mocker() as m: m.get( "https://src-quay.io/v2/src/image/manifests/1", json=new_ml, headers={"Content-Type": "application/vnd.docker.distribution.manifest.list.v2+json"}, ) m.get( "https://quay.io/v2/dest/image/manifests/1", [ {"headers": {"some-header": "value"}, "status_code": 401}, {"status_code": 401}, ], ) created_ml = merger.merge_manifest_lists_selected_architectures(["arm64", "s390x"]) assert m.call_count == 3 created_ml["manifests"].sort(key=lambda manifest: manifest["digest"]) expected_ml = deepcopy(merged_ml3) expected_ml["manifests"].sort(key=lambda manifest: manifest["digest"]) assert created_ml == expected_ml
def test_set_client(): merger = manifest_list_merger.ManifestListMerger("quay.io/src/image:1", "quay.io/dest/image:1") assert merger.src_image == "quay.io/src/image:1" assert merger.dest_image == "quay.io/dest/image:1" assert merger._quay_client is None client = quay_client.QuayClient("user", "pass") merger.set_quay_client(client) assert client == merger._quay_client
def test_set_client(): merger = manifest_list_merger.ManifestListMerger("quay.io/src/image:1", "quay.io/dest/image:1") assert merger.src_image == "quay.io/src/image:1" assert merger.dest_image == "quay.io/dest/image:1" assert merger._src_quay_client is None assert merger._dest_quay_client is None src_client = quay_client.QuayClient("src-user", "src-pass") dest_client = quay_client.QuayClient("dest-user", "dest-pass") merger.set_quay_clients(src_client, dest_client) assert src_client == merger._src_quay_client assert dest_client == merger._dest_quay_client
def test_init_create_client(): merger = manifest_list_merger.ManifestListMerger( "quay.io/src/image:1", "quay.io/dest/image:1", "user", "pass", host="stage.quay.io", ) assert merger.src_image == "quay.io/src/image:1" assert merger.dest_image == "quay.io/dest/image:1" assert isinstance(merger._quay_client, quay_client.QuayClient) assert merger._quay_client.username == "user" assert merger._quay_client.password == "pass" assert merger._quay_client.session.hostname == "stage.quay.io"
def test_merge_selected_architectures_no_dest_manifest(): merger = manifest_list_merger.ManifestListMerger( "quay.io/src/image:1", "quay.io/dest/image:1", "user", "pass" ) with requests_mock.Mocker() as m: m.get( "https://quay.io/v2/src/image/manifests/1", json=new_ml, headers={"Content-Type": "application/vnd.docker.distribution.manifest.list.v2+json"}, ) m.get( "https://quay.io/v2/dest/image/manifests/1", status_code=404, ) created_ml = merger.merge_manifest_lists_selected_architectures(["arm64", "s390x"]) assert m.call_count == 2 created_ml["manifests"].sort(key=lambda manifest: manifest["digest"]) expected_ml = deepcopy(merged_ml3) expected_ml["manifests"].sort(key=lambda manifest: manifest["digest"]) assert created_ml == expected_ml
def test_merge_manifest_lists_selected_architectures_missing_client(): merger = manifest_list_merger.ManifestListMerger("quay.io/src/image:1", "quay.io/dest/image:1") with pytest.raises(RuntimeError, match="QuayClient instance must be set"): merger.merge_manifest_lists_selected_architectures(["arm64", "s390x"])
def test_merge_manifest_lists_missing_client(): merger = manifest_list_merger.ManifestListMerger("quay.io/src/image:1", "quay.io/dest/image:1") with pytest.raises(RuntimeError, match="QuayClient instance must be set"): merger.merge_manifest_lists()
def test_get_missing_architectures(): merger = manifest_list_merger.ManifestListMerger("quay.io/src/image:1", "quay.io/dest/image:1") missing = merger.get_missing_architectures(new_ml, old_ml) assert missing == expected_missing_archs
def test_init(): merger = manifest_list_merger.ManifestListMerger("quay.io/src/image:1", "quay.io/dest/image:1") assert merger.src_image == "quay.io/src/image:1" assert merger.dest_image == "quay.io/dest/image:1" assert merger._quay_client is None