2121
2222from pulpcore .plugin .util import get_domain
2323
24- from pulp_rust .app .models import RustDistribution , RustContent , _strip_sparse_prefix
24+ from pulpcore .plugin .tasking import dispatch
25+
26+ from pulp_rust .app .models import (
27+ RustDistribution ,
28+ RustContent ,
29+ RustPackageYank ,
30+ _strip_sparse_prefix ,
31+ )
32+ from pulp_rust .app .tasks import ayank_package , aunyank_package
2533from pulp_rust .app .serializers import (
2634 IndexRootSerializer ,
2735 RustContentSerializer ,
@@ -154,7 +162,12 @@ def retrieve(self, request, path, **kwargs):
154162 if content is not None :
155163 crate_versions = content .filter (name = crate_name ).order_by ("vers" )
156164 if crate_versions .exists ():
157- return self ._build_index_response (crate_versions )
165+ yanked_versions = set (
166+ RustPackageYank .objects .filter (
167+ pk__in = repo_ver .content , name = crate_name
168+ ).values_list ("vers" , flat = True )
169+ )
170+ return self ._build_index_response (crate_versions , yanked_versions )
158171
159172 # Fall back to proxying from the upstream remote
160173 if self .distribution .remote :
@@ -172,7 +185,7 @@ def retrieve(self, request, path, **kwargs):
172185 return HttpResponseNotFound (f"Crate '{ crate_name } ' not found" )
173186
174187 @staticmethod
175- def _build_index_response (crate_versions ):
188+ def _build_index_response (crate_versions , yanked_versions = frozenset () ):
176189 """Build a newline-delimited JSON response from local crate versions."""
177190 lines = []
178191 for crate_version in crate_versions :
@@ -198,7 +211,7 @@ def _build_index_response(crate_versions):
198211 "deps" : deps ,
199212 "cksum" : crate_version .cksum ,
200213 "features" : crate_version .features ,
201- "yanked" : crate_version .yanked ,
214+ "yanked" : crate_version .vers in yanked_versions ,
202215 "links" : crate_version .links ,
203216 "v" : crate_version .v ,
204217 }
@@ -291,7 +304,23 @@ def delete(self, request, name, version, rest, **kwargs):
291304 """
292305 if rest != "yank" :
293306 raise Http404 (f"Unknown action: { rest } " )
294- raise NotImplementedError ("Yank endpoint is not yet implemented" )
307+
308+ distro = self .get_distribution ()
309+ if not distro .repository :
310+ raise Http404 ("No repository associated with this distribution" )
311+
312+ task = dispatch (
313+ ayank_package ,
314+ exclusive_resources = [distro .repository ],
315+ immediate = True ,
316+ kwargs = {
317+ "repository_pk" : str (distro .repository .pk ),
318+ "name" : name ,
319+ "vers" : version ,
320+ },
321+ )
322+ has_task_completed (task )
323+ return Response ({"ok" : True })
295324
296325 def put (self , request , name , version , rest , ** kwargs ):
297326 """
@@ -302,7 +331,23 @@ def put(self, request, name, version, rest, **kwargs):
302331 """
303332 if rest != "unyank" :
304333 raise Http404 (f"Unknown action: { rest } " )
305- raise NotImplementedError ("Unyank endpoint is not yet implemented" )
334+
335+ distro = self .get_distribution ()
336+ if not distro .repository :
337+ raise Http404 ("No repository associated with this distribution" )
338+
339+ task = dispatch (
340+ aunyank_package ,
341+ exclusive_resources = [distro .repository ],
342+ immediate = True ,
343+ kwargs = {
344+ "repository_pk" : str (distro .repository .pk ),
345+ "name" : name ,
346+ "vers" : version ,
347+ },
348+ )
349+ has_task_completed (task )
350+ return Response ({"ok" : True })
306351
307352
308353def has_task_completed (task ):
0 commit comments