Skip to content

Commit ea34091

Browse files
committed
refactor: use ObjectLoader for DB instantiation in JobCleaningAgent
1 parent 3ae10f3 commit ea34091

File tree

2 files changed

+60
-17
lines changed

2 files changed

+60
-17
lines changed

src/DIRAC/WorkloadManagementSystem/Agent/JobCleaningAgent.py

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,14 @@
3131
from DIRAC.ConfigurationSystem.Client.Helpers.Registry import getDNForUsername
3232
from DIRAC.Core.Base.AgentModule import AgentModule
3333
from DIRAC.Core.Utilities import TimeUtilities
34+
from DIRAC.Core.Utilities.ObjectLoader import ObjectLoader
3435
from DIRAC.RequestManagementSystem.Client.File import File
3536
from DIRAC.RequestManagementSystem.Client.Operation import Operation
3637
from DIRAC.RequestManagementSystem.Client.ReqClient import ReqClient
3738
from DIRAC.RequestManagementSystem.Client.Request import Request
3839
from DIRAC.WorkloadManagementSystem.Client import JobStatus
3940
from DIRAC.WorkloadManagementSystem.Client.WMSClient import WMSClient
40-
from DIRAC.WorkloadManagementSystem.DB.JobDB import JobDB
4141
from DIRAC.WorkloadManagementSystem.DB.JobParametersDB import getJobParameters
42-
from DIRAC.WorkloadManagementSystem.DB.SandboxMetadataDB import SandboxMetadataDB
4342
from DIRAC.WorkloadManagementSystem.DB.StatusUtils import kill_delete_jobs
4443
from DIRAC.WorkloadManagementSystem.Service.JobPolicy import RIGHT_DELETE
4544

@@ -55,6 +54,8 @@ def __init__(self, *args, **kwargs):
5554

5655
# clients
5756
self.jobDB = None
57+
self.taskQueueDB = None
58+
self.pilotAgentsDB = None
5859
self.sandboxDB = None
5960

6061
self.maxJobsAtOnce = 500
@@ -67,8 +68,25 @@ def __init__(self, *args, **kwargs):
6768
def initialize(self):
6869
"""Sets defaults"""
6970

70-
self.jobDB = JobDB()
71-
self.sandboxDB = SandboxMetadataDB()
71+
result = ObjectLoader().loadObject("WorkloadManagementSystem.DB.JobDB", "JobDB")
72+
if not result["OK"]:
73+
return result
74+
self.jobDB = result["Value"]()
75+
76+
result = ObjectLoader().loadObject("WorkloadManagementSystem.DB.TaskQueueDB", "TaskQueueDB")
77+
if not result["OK"]:
78+
return result
79+
self.taskQueueDB = result["Value"]()
80+
81+
result = ObjectLoader().loadObject("WorkloadManagementSystem.DB.PilotAgentsDB", "PilotAgentsDB")
82+
if not result["OK"]:
83+
return result
84+
self.pilotAgentsDB = result["Value"]()
85+
86+
result = ObjectLoader().loadObject("WorkloadManagementSystem.DB.SandboxMetadataDB", "SandboxMetadataDB")
87+
if not result["OK"]:
88+
return result
89+
self.sandboxDB = result["Value"]()
7290

7391
agentTSTypes = self.am_getOption("ProductionTypes", [])
7492
if agentTSTypes:
@@ -239,7 +257,13 @@ def _deleteRemoveJobs(self, jobList, remove=False):
239257
wmsClient = WMSClient(useCertificates=True, delegatedDN=res["Value"][0], delegatedGroup=ownerGroup)
240258
result = wmsClient.removeJob(jobsList)
241259
else:
242-
result = kill_delete_jobs(RIGHT_DELETE, jobsList)
260+
result = kill_delete_jobs(
261+
RIGHT_DELETE,
262+
jobsList,
263+
jobdb=self.jobDB,
264+
taskqueuedb=self.taskQueueDB,
265+
pilotagentsdb=self.pilotAgentsDB,
266+
)
243267
if not result["OK"]:
244268
self.log.error(
245269
f"Could not {'remove' if remove else 'delete'} jobs",

src/DIRAC/WorkloadManagementSystem/Agent/test/Test_Agent_JobCleaningAgent.py

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
""" Test class for Job Cleaning Agent
2-
"""
1+
"""Test class for Job Cleaning Agent"""
2+
33
from unittest.mock import MagicMock
44

55
import pytest
@@ -16,6 +16,9 @@
1616
mockNone = MagicMock()
1717
mockNone.return_value = None
1818
mockJMC = MagicMock()
19+
mockJobDB = MagicMock()
20+
mockJobDB.getDistinctJobAttributes = mockReply
21+
mockJobDB.selectJobs = mockReply
1922

2023

2124
@pytest.fixture
@@ -27,16 +30,20 @@ def jca(mocker):
2730
create=True,
2831
)
2932
mocker.patch("DIRAC.WorkloadManagementSystem.Agent.JobCleaningAgent.AgentModule.am_getOption", return_value=mockAM)
33+
34+
def mock_load_object(module_path, class_name):
35+
mocks = {
36+
"JobDB": mockJobDB,
37+
"TaskQueueDB": MagicMock(),
38+
"PilotAgentsDB": MagicMock(),
39+
"SandboxMetadataDB": MagicMock(),
40+
}
41+
return {"OK": True, "Value": lambda: mocks[class_name]}
42+
3043
mocker.patch(
31-
"DIRAC.WorkloadManagementSystem.Agent.JobCleaningAgent.JobDB.getDistinctJobAttributes", side_effect=mockReply
32-
)
33-
mocker.patch("DIRAC.WorkloadManagementSystem.Agent.JobCleaningAgent.JobDB.selectJobs", side_effect=mockReply)
34-
mocker.patch("DIRAC.WorkloadManagementSystem.Agent.JobCleaningAgent.JobDB.__init__", side_effect=mockNone)
35-
mocker.patch(
36-
"DIRAC.WorkloadManagementSystem.Agent.JobCleaningAgent.SandboxMetadataDB.__init__", side_effect=mockNone
44+
"DIRAC.WorkloadManagementSystem.Agent.StalledJobAgent.ObjectLoader.loadObject",
45+
side_effect=mock_load_object,
3746
)
38-
mocker.patch("DIRAC.WorkloadManagementSystem.Agent.JobCleaningAgent.ReqClient", return_value=mockNone)
39-
4047
jca = JobCleaningAgent()
4148
jca.log = gLogger
4249
jca.log.setLevel("DEBUG")
@@ -128,15 +135,27 @@ def test_deleteJobOversizedSandbox(mocker, inputs, params, expected):
128135

129136
mocker.patch("DIRAC.WorkloadManagementSystem.Agent.JobCleaningAgent.AgentModule.__init__")
130137
mocker.patch("DIRAC.WorkloadManagementSystem.Agent.JobCleaningAgent.AgentModule.am_getOption", return_value=mockAM)
131-
mocker.patch("DIRAC.WorkloadManagementSystem.Agent.JobCleaningAgent.JobDB", return_value=mockNone)
132-
mocker.patch("DIRAC.WorkloadManagementSystem.Agent.JobCleaningAgent.SandboxMetadataDB", return_value=mockNone)
133138
mocker.patch("DIRAC.WorkloadManagementSystem.Agent.JobCleaningAgent.ReqClient", return_value=mockNone)
134139
mocker.patch(
135140
"DIRAC.WorkloadManagementSystem.Agent.JobCleaningAgent.getDNForUsername", return_value=S_OK(["/bih/boh/DN"])
136141
)
137142
mocker.patch("DIRAC.WorkloadManagementSystem.Agent.JobCleaningAgent.getJobParameters", return_value=params)
138143

144+
def mock_load_object(module_path, class_name):
145+
mocks = {
146+
"JobDB": MagicMock(),
147+
"TaskQueueDB": MagicMock(),
148+
"PilotAgentsDB": MagicMock(),
149+
"SandboxMetadataDB": MagicMock(),
150+
}
151+
return {"OK": True, "Value": lambda: mocks[class_name]}
152+
153+
mocker.patch(
154+
"DIRAC.WorkloadManagementSystem.Agent.StalledJobAgent.ObjectLoader.loadObject",
155+
side_effect=mock_load_object,
156+
)
139157
jobCleaningAgent = JobCleaningAgent()
158+
140159
jobCleaningAgent.log = gLogger
141160
jobCleaningAgent.log.setLevel("DEBUG")
142161
jobCleaningAgent._AgentModule__configDefaults = mockAM

0 commit comments

Comments
 (0)