25
25
import datetime
26
26
import os
27
27
28
- import DIRAC .Core .Utilities .TimeUtilities as TimeUtilities
29
28
from DIRAC import S_ERROR , S_OK
30
29
from DIRAC .ConfigurationSystem .Client .Helpers .Operations import Operations
31
30
from DIRAC .ConfigurationSystem .Client .Helpers .Registry import getDNForUsername
32
31
from DIRAC .Core .Base .AgentModule import AgentModule
32
+ from DIRAC .Core .Utilities import TimeUtilities
33
33
from DIRAC .RequestManagementSystem .Client .File import File
34
34
from DIRAC .RequestManagementSystem .Client .Operation import Operation
35
35
from DIRAC .RequestManagementSystem .Client .ReqClient import ReqClient
@@ -57,6 +57,7 @@ def __init__(self, *args, **kwargs):
57
57
self .prodTypes = []
58
58
self .removeStatusDelay = {}
59
59
self .removeStatusDelayHB = {}
60
+ self .maxHBJobsAtOnce = 0
60
61
61
62
#############################################################################
62
63
def initialize (self ):
@@ -80,7 +81,7 @@ def initialize(self):
80
81
self .removeStatusDelayHB [JobStatus .DONE ] = self .am_getOption ("RemoveStatusDelayHB/Done" , - 1 )
81
82
self .removeStatusDelayHB [JobStatus .KILLED ] = self .am_getOption ("RemoveStatusDelayHB/Killed" , - 1 )
82
83
self .removeStatusDelayHB [JobStatus .FAILED ] = self .am_getOption ("RemoveStatusDelayHB/Failed" , - 1 )
83
- self .maxHBJobsAtOnce = self .am_getOption ("MaxHBJobsAtOnce" , 0 )
84
+ self .maxHBJobsAtOnce = self .am_getOption ("MaxHBJobsAtOnce" , self . maxHBJobsAtOnce )
84
85
85
86
return S_OK ()
86
87
@@ -93,7 +94,7 @@ def _getAllowedJobTypes(self):
93
94
for jobType in result ["Value" ]:
94
95
if jobType not in self .prodTypes :
95
96
cleanJobTypes .append (jobType )
96
- self .log .notice (f "JobTypes to clean { cleanJobTypes } " )
97
+ self .log .notice ("JobTypes to clean" , cleanJobTypes )
97
98
return S_OK (cleanJobTypes )
98
99
99
100
def execute (self ):
@@ -102,7 +103,7 @@ def execute(self):
102
103
# First, fully remove jobs in JobStatus.DELETED state
103
104
result = self .removeDeletedJobs ()
104
105
if not result ["OK" ]:
105
- self .log .error (f "Failed to remove jobs with status { JobStatus .DELETED } " )
106
+ self .log .error ("Failed to remove jobs with status" , JobStatus .DELETED )
106
107
107
108
# Second: set the status to JobStatus.DELETED for certain jobs
108
109
@@ -117,8 +118,7 @@ def execute(self):
117
118
118
119
baseCond = {"JobType" : result ["Value" ]}
119
120
# Delete jobs with final status
120
- for status in self .removeStatusDelay :
121
- delay = self .removeStatusDelay [status ]
121
+ for status , delay in self .removeStatusDelay .items ():
122
122
if delay < 0 :
123
123
# Negative delay means don't delete anything...
124
124
continue
@@ -185,26 +185,7 @@ def removeDeletedJobs(self):
185
185
if not jobList :
186
186
return S_OK ()
187
187
188
- ownerJobsDict = self ._getOwnerJobsDict (jobList )
189
-
190
- fail = False
191
- for owner , jobsList in ownerJobsDict .items ():
192
- ownerDN = owner .split (";" )[0 ]
193
- ownerGroup = owner .split (";" )[1 ]
194
- self .log .verbose ("Attempting to remove jobs" , f"(n={ len (jobsList )} ) for { ownerDN } : { ownerGroup } " )
195
- wmsClient = WMSClient (useCertificates = True , delegatedDN = ownerDN , delegatedGroup = ownerGroup )
196
- result = wmsClient .removeJob (jobsList )
197
- if not result ["OK" ]:
198
- self .log .error (
199
- "Could not remove jobs" ,
200
- f"for { ownerDN } : { ownerGroup } (n={ len (jobsList )} ) : { result ['Message' ]} " ,
201
- )
202
- fail = True
203
-
204
- if fail :
205
- return S_ERROR ()
206
-
207
- return S_OK ()
188
+ return self ._deleteRemoveJobs (jobList , remove = True )
208
189
209
190
def deleteJobsByStatus (self , condDict , delay = False ):
210
191
"""Sets the job status to "DELETED" for jobs in condDict.
@@ -234,19 +215,29 @@ def deleteJobsByStatus(self, condDict, delay=False):
234
215
if not jobList :
235
216
return S_OK ()
236
217
218
+ return self ._deleteRemoveJobs (jobList )
219
+
220
+ def _deleteRemoveJobs (self , jobList , remove = False ):
221
+ """Delete or removes a jobList"""
237
222
ownerJobsDict = self ._getOwnerJobsDict (jobList )
238
223
239
224
fail = False
240
225
for owner , jobsList in ownerJobsDict .items ():
241
- ownerDN = owner .split (";" )[0 ]
242
- ownerGroup = owner .split (";" )[1 ]
243
- self .log .verbose ("Attempting to delete jobs" , f"(n={ len (jobsList )} ) for { ownerDN } : { ownerGroup } " )
244
- wmsClient = WMSClient (useCertificates = True , delegatedDN = ownerDN , delegatedGroup = ownerGroup )
245
- result = wmsClient .deleteJob (jobsList )
226
+ user , ownerGroup = owner .split (";" , maxsplit = 1 )
227
+ self .log .verbose ("Attempting to delete jobs" , f"(n={ len (jobsList )} ) for { user } : { ownerGroup } " )
228
+ res = getDNForUsername (user )
229
+ if not res ["OK" ]:
230
+ self .log .error ("No DN found" , f"for { user } " )
231
+ return res
232
+ wmsClient = WMSClient (useCertificates = True , delegatedDN = res ["Value" ][0 ], delegatedGroup = ownerGroup )
233
+ if remove :
234
+ result = wmsClient .removeJob (jobsList )
235
+ else :
236
+ result = wmsClient .deleteJob (jobsList )
246
237
if not result ["OK" ]:
247
238
self .log .error (
248
- "Could not delete jobs" ,
249
- f"for { ownerDN } : { ownerGroup } (n={ len (jobsList )} ) : { result ['Message' ]} " ,
239
+ "Could not {'remove' if remove else ' delete'} jobs" ,
240
+ f"for { user } : { ownerGroup } (n={ len (jobsList )} ) : { result ['Message' ]} " ,
250
241
)
251
242
fail = True
252
243
@@ -279,7 +270,7 @@ def _getOwnerJobsDict(self, jobList):
279
270
280
271
:returns: a dict with a grouping of them by owner, e.g.{'dn;group': [1, 3, 4], 'dn;group_1': [5], 'dn_1;group': [2]}
281
272
"""
282
- res = self .jobDB .getJobsAttributes (jobList , ["OwnerDN " , "OwnerGroup" ])
273
+ res = self .jobDB .getJobsAttributes (jobList , ["Owner " , "OwnerGroup" ])
283
274
if not res ["OK" ]:
284
275
self .log .error ("Could not get the jobs attributes" , res ["Message" ])
285
276
return res
@@ -327,8 +318,7 @@ def deleteJobOversizedSandbox(self, jobIDList):
327
318
else :
328
319
successful [jobID ] = lfn
329
320
330
- result = {"Successful" : successful , "Failed" : failed }
331
- return S_OK (result )
321
+ return S_OK ({"Successful" : successful , "Failed" : failed })
332
322
333
323
def __setRemovalRequest (self , lfn , owner , ownerGroup ):
334
324
"""Set removal request with the given credentials"""
@@ -369,4 +359,3 @@ def removeHeartBeatLoggingInfo(self, status, delayDays):
369
359
self .log .error ("Failed to delete from HeartBeatLoggingInfo" , result ["Message" ])
370
360
else :
371
361
self .log .info ("Deleted HeartBeatLogging info" )
372
- return
0 commit comments