Skip to content

Commit 03b36e9

Browse files
committed
refactor: use ObjectLoader for DB instantiation in JobCleaningAgent
1 parent 12e8756 commit 03b36e9

2 files changed

Lines changed: 62 additions & 18 deletions

File tree

src/DIRAC/WorkloadManagementSystem/Agent/JobCleaningAgent.py

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
""" The Job Cleaning Agent controls removing jobs from the WMS in the end of their life cycle.
1+
"""The Job Cleaning Agent controls removing jobs from the WMS in the end of their life cycle.
22
33
This agent will take care of:
44
- removing all jobs that are in status JobStatus.DELETED
@@ -22,6 +22,7 @@
2222
than 0.
2323
2424
"""
25+
2526
import datetime
2627
import os
2728

@@ -30,14 +31,13 @@
3031
from DIRAC.ConfigurationSystem.Client.Helpers.Registry import getDNForUsername
3132
from DIRAC.Core.Base.AgentModule import AgentModule
3233
from DIRAC.Core.Utilities import TimeUtilities
34+
from DIRAC.Core.Utilities.ObjectLoader import ObjectLoader
3335
from DIRAC.RequestManagementSystem.Client.File import File
3436
from DIRAC.RequestManagementSystem.Client.Operation import Operation
3537
from DIRAC.RequestManagementSystem.Client.ReqClient import ReqClient
3638
from DIRAC.RequestManagementSystem.Client.Request import Request
3739
from DIRAC.WorkloadManagementSystem.Client import JobStatus
3840
from DIRAC.WorkloadManagementSystem.Client.WMSClient import WMSClient
39-
from DIRAC.WorkloadManagementSystem.DB.JobDB import JobDB
40-
from DIRAC.WorkloadManagementSystem.DB.SandboxMetadataDB import SandboxMetadataDB
4141
from DIRAC.WorkloadManagementSystem.DB.StatusUtils import kill_delete_jobs
4242
from DIRAC.WorkloadManagementSystem.Service.JobPolicy import RIGHT_DELETE
4343
from DIRAC.WorkloadManagementSystem.Utilities.JobParameters import getJobParameters
@@ -54,6 +54,8 @@ def __init__(self, *args, **kwargs):
5454

5555
# clients
5656
self.jobDB = None
57+
self.taskQueueDB = None
58+
self.pilotAgentsDB = None
5759
self.sandboxDB = None
5860

5961
self.maxJobsAtOnce = 500
@@ -66,8 +68,25 @@ def __init__(self, *args, **kwargs):
6668
def initialize(self):
6769
"""Sets defaults"""
6870

69-
self.jobDB = JobDB()
70-
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"]()
7190

7291
agentTSTypes = self.am_getOption("ProductionTypes", [])
7392
if agentTSTypes:
@@ -238,7 +257,13 @@ def _deleteRemoveJobs(self, jobList, remove=False):
238257
wmsClient = WMSClient(useCertificates=True, delegatedDN=res["Value"][0], delegatedGroup=ownerGroup)
239258
result = wmsClient.removeJob(jobsList)
240259
else:
241-
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+
)
242267
if not result["OK"]:
243268
self.log.error(
244269
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)