@@ -23,7 +23,42 @@ def _create(artifact_filename, filename, content_data):
2323 "ca.save(); "
2424 "print(get_url(c))"
2525 )
26- process = subprocess .run (["pulpcore-manager" , "shell" , "-c" , commands ], capture_output = True )
26+ process = subprocess .run (
27+ ["pulpcore-manager" , "shell" , "-c" , commands ], capture_output = True
28+ )
29+
30+ assert process .returncode == 0
31+ content_href = process .stdout .decode ().strip ()
32+ return python_bindings .ContentPackagesApi .read (content_href )
33+
34+ return _create
35+
36+
37+ @pytest .fixture
38+ def create_content_remote (python_bindings ):
39+ def _create (filename , content , remote , remote_2 = None ):
40+ commands = (
41+ "from pulpcore.plugin.models import ContentArtifact, RemoteArtifact; "
42+ "from pulpcore.plugin.util import extract_pk, get_url; "
43+ "from pulp_python.app.models import PythonPackageContent, PythonRemote; "
44+ f"c = PythonPackageContent(filename={ filename !r} , **{ content !r} ); "
45+ "c.save(); "
46+ f"ca = ContentArtifact(content=c, relative_path={ filename !r} ); "
47+ "ca.save(); "
48+ f"r = PythonRemote.objects.get(pk=extract_pk({ remote .pulp_href !r} )); "
49+ f"ra = RemoteArtifact(content_artifact=ca, remote=r, sha256={ content ['sha256' ]!r} ); "
50+ "ra.save(); "
51+ )
52+ if remote_2 :
53+ commands += (
54+ f"r2 = PythonRemote.objects.get(pk=extract_pk({ remote_2 .pulp_href !r} )); "
55+ f"ra2 = RemoteArtifact(content_artifact=ca, remote=r2, sha256={ content ['sha256' ]!r} ); " # noqa: E501
56+ "ra2.save(); "
57+ )
58+ commands += "print(get_url(c))"
59+ process = subprocess .run (
60+ ["pulpcore-manager" , "shell" , "-c" , commands ], capture_output = True
61+ )
2762
2863 assert process .returncode == 0
2964 content_href = process .stdout .decode ().strip ()
@@ -36,7 +71,9 @@ def _create(artifact_filename, filename, content_data):
3671def move_to_repository (python_bindings , monitor_task ):
3772 def _move (repo_href , content_hrefs ):
3873 body = {"add_content_units" : content_hrefs }
39- task = monitor_task (python_bindings .RepositoriesPythonApi .modify (repo_href , body ).task )
74+ task = monitor_task (
75+ python_bindings .RepositoriesPythonApi .modify (repo_href , body ).task
76+ )
4077 assert len (task .created_resources ) == 1
4178 return python_bindings .RepositoriesPythonApi .read (repo_href )
4279
@@ -68,8 +105,13 @@ def test_metadata_repair_command(
68105
69106 move_to_repository (python_repo .pulp_href , [content .pulp_href ])
70107 process = subprocess .run (
71- ["pulpcore-manager" , "repair-python-metadata" , "--repositories" , python_repo .pulp_href ],
72- capture_output = True
108+ [
109+ "pulpcore-manager" ,
110+ "repair-python-metadata" ,
111+ "--repositories" ,
112+ python_repo .pulp_href ,
113+ ],
114+ capture_output = True ,
73115 )
74116 assert process .returncode == 0
75117 output = process .stdout .decode ().strip ()
@@ -84,6 +126,7 @@ def test_metadata_repair_command(
84126
85127def test_metadata_repair_endpoint (
86128 create_content_direct ,
129+ delete_orphans_pre ,
87130 download_python_file ,
88131 monitor_task ,
89132 move_to_repository ,
@@ -124,3 +167,98 @@ def test_metadata_repair_endpoint(
124167 assert content .packagetype == "sdist"
125168 assert content .requires_python == ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*"
126169 assert content .author == ""
170+
171+
172+ def test_metadata_repair_endpoint_on_demand (
173+ create_content_remote ,
174+ delete_orphans_pre ,
175+ monitor_task ,
176+ move_to_repository ,
177+ python_bindings ,
178+ python_remote_factory ,
179+ python_repo_factory ,
180+ ):
181+ """
182+ Test repairing of package metadata via `Repositories.repair_metadata` endpoint
183+ when only RemoteArtifacts are present.
184+ """
185+ # 1. Set up tested data
186+ python_remote = python_remote_factory ()
187+ python_remote_bad = python_remote_factory (url = "https://fixtures.pulpproject.org/" )
188+ python_repo = python_repo_factory (remote = python_remote )
189+
190+ scipy_filename_1 = "scipy-1.1.0.tar.gz"
191+ scipy_data_1 = {
192+ "name" : "scipy" ,
193+ "version" : "1.1.0" ,
194+ "sha256" : "878352408424dffaa695ffedf2f9f92844e116686923ed9aa8626fc30d32cfd1" ,
195+ # Wrong metadata
196+ "author" : "ME" ,
197+ "packagetype" : "bdist" ,
198+ "requires_python" : ">=3.8" ,
199+ }
200+
201+ scipy_filename_2 = "scipy-1.1.0-cp36-none-win32.whl"
202+ scipy_data_2 = scipy_data_1 .copy ()
203+ scipy_data_2 ["sha256" ] = (
204+ "0e9bb7efe5f051ea7212555b290e784b82f21ffd0f655405ac4f87e288b730b3"
205+ )
206+
207+ celery_filename = "celery-2.4.1.tar.gz"
208+ celery_data = {
209+ "name" : "celery" ,
210+ "version" : "2.4.1" ,
211+ "sha256" : "c77652ca179d14473975822dbfb1b5dab950c88c171ef6bc2257ddb9066e6790" ,
212+ # Wrong metadata
213+ "author" : "ME" ,
214+ "packagetype" : "bdist" ,
215+ "requires_python" : ">=3.8" ,
216+ }
217+
218+ # 2. Create content
219+ content_1 = create_content_remote (
220+ scipy_filename_1 , scipy_data_1 , python_remote , python_remote_bad
221+ )
222+ content_2 = create_content_remote (scipy_filename_2 , scipy_data_2 , python_remote_bad )
223+ content_3 = create_content_remote (celery_filename , celery_data , python_remote )
224+
225+ content_hrefs = {}
226+ for filename , data , content in [
227+ (scipy_filename_1 , scipy_data_1 , content_1 ),
228+ (scipy_filename_2 , scipy_data_2 , content_2 ),
229+ (celery_filename , celery_data , content_3 ),
230+ ]:
231+ for field , test_value in data .items ():
232+ assert getattr (content , field ) == test_value
233+ content_hrefs [filename ] = content .pulp_href
234+ move_to_repository (python_repo .pulp_href , list (content_hrefs .values ()))
235+
236+ # 3. Repair metadata
237+ response = python_bindings .RepositoriesPythonApi .repair_metadata (
238+ python_repo .pulp_href
239+ )
240+ monitor_task (response .task )
241+
242+ # 4. Check new metadata
243+ new_metadata = [
244+ # repaired
245+ ("celery-2.4.1.tar.gz" , "celery" , "2.4.1" , "Ask Solem" , "sdist" , "" ),
246+ (
247+ "scipy-1.1.0.tar.gz" ,
248+ "scipy" ,
249+ "1.1.0" ,
250+ "" ,
251+ "sdist" ,
252+ ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" ,
253+ ),
254+ # not repaired
255+ ("scipy-1.1.0-cp36-none-win32.whl" , "scipy" , "1.1.0" , "ME" , "bdist" , ">=3.8" ),
256+ ]
257+ for filename , name , version , author , packagetype , requires_python in new_metadata :
258+ new_content = python_bindings .ContentPackagesApi .read (content_hrefs [filename ])
259+ assert new_content .filename == filename
260+ assert new_content .name == name
261+ assert new_content .version == version
262+ assert new_content .author == author
263+ assert new_content .packagetype == packagetype
264+ assert new_content .requires_python == requires_python
0 commit comments