11import sys
22import argparse
33from typing import cast
4-
54import openshift_client as oc
6-
75from .basecommand import Command , override
86from .basecommand import SubParserFactory
9- from .helpers import oc_delete
7+ from .helpers import oc_delete , is_kueue_managed_job
108
119
1210class DeleteJobsCommand (Command ):
1311 """
1412 batchtools bd [job-name [job-name ...]]
1513
16- Delete specified Jobs, or all Jobs if none are specified.
14+ Delete specified Kueue-managed GPU jobs, or all such jobs if none are specified.
15+
16+ Description:
17+ Deletes only those Jobs that are both:
18+ - named like your GPU jobs (name starts with 'job-'), and
19+ - detected as Kueue-managed (via labels/Workload linkage).
1720 """
1821
1922 name : str = "bd"
20- help : str = "Delete specified Jobs , or all if none are specified"
23+ help : str = "Delete specified Kueue-managed GPU jobs , or all if none are specified"
2124
2225 @classmethod
2326 @override
@@ -26,34 +29,39 @@ def build_parser(cls, subparsers: SubParserFactory):
2629 p .add_argument (
2730 "job_names" ,
2831 nargs = "*" ,
29- help = "Optional list of job names to delete" ,
32+ help = "Optional list of job names to delete (must be Kueue-managed) " ,
3033 )
3134 return p
3235
3336 @staticmethod
3437 @override
3538 def run (args : argparse .Namespace ):
3639 args = cast (DeleteJobsCommand , args )
37-
3840 try :
3941 jobs = oc .selector ("jobs" ).objects ()
4042 if not jobs :
4143 print ("No jobs found." )
4244 return
4345
46+ # only want to delete kueue jobs so filter for kueue jobs
47+ kueue_gpu_jobs = [job for job in jobs if is_kueue_managed_job (job )]
48+
49+ if not kueue_gpu_jobs :
50+ print ("No Kueue-managed GPU jobs to delete." )
51+ return
52+
4453 if args .job_names :
45- # delete only specified jobs
46- existing = {job .model .metadata .name for job in jobs }
54+ # if jobs are specified, only delete specified jobs
55+ allowed = {job .model .metadata .name for job in kueue_gpu_jobs }
4756 for name in args .job_names :
48- if name not in existing :
49- print (f"{ name } does not exist ; skipping." )
57+ if name not in allowed :
58+ print (f"{ name } is not a Kueue-managed GPU job ; skipping." )
5059 continue
5160 oc_delete ("job" , name )
5261 print (f"Deleted job: { name } " )
5362 else :
54- # delete all jobs
55- print ("No job names provided -> deleting ALL jobs:\n " )
56- for job in jobs :
63+ print ("No job names provided -> deleting all Kueue-managed GPU jobs:\n " )
64+ for job in kueue_gpu_jobs :
5765 name = job .model .metadata .name
5866 oc_delete ("job" , name )
5967 print (f"Deleted job: { name } " )
0 commit comments