From 25034d6b40761386b8ac6d66da56a0fb4ed2fd89 Mon Sep 17 00:00:00 2001 From: Federico Stagni Date: Mon, 12 May 2025 11:44:16 +0200 Subject: [PATCH 1/2] refactor: move DIRAC WMS WebApp related RPC calls to dedicated service --- src/WebAppDIRAC/WebApp/handler/JobMonitorHandler.py | 8 ++++---- src/WebAppDIRAC/WebApp/handler/JobSummaryHandler.py | 6 +++--- src/WebAppDIRAC/WebApp/handler/PilotMonitorHandler.py | 10 +++++----- src/WebAppDIRAC/WebApp/handler/PilotSummaryHandler.py | 4 ++-- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/WebAppDIRAC/WebApp/handler/JobMonitorHandler.py b/src/WebAppDIRAC/WebApp/handler/JobMonitorHandler.py index 232ef214..4c15f8c4 100644 --- a/src/WebAppDIRAC/WebApp/handler/JobMonitorHandler.py +++ b/src/WebAppDIRAC/WebApp/handler/JobMonitorHandler.py @@ -5,10 +5,10 @@ from DIRAC.Core.Utilities import DictCache from DIRAC.Core.Utilities.Graphs.Palette import Palette from DIRAC.RequestManagementSystem.Client.ReqClient import ReqClient +from DIRAC.MonitoringSystem.Client.WebAppClient import WebAppClient from DIRAC.WorkloadManagementSystem.Client.JobMonitoringClient import JobMonitoringClient from DIRAC.WorkloadManagementSystem.Client.JobManagerClient import JobManagerClient from DIRAC.WorkloadManagementSystem.Client.PilotManagerClient import PilotManagerClient -from DIRAC.WorkloadManagementSystem.Client.WMSAdministratorClient import WMSAdministratorClient from DIRAC.WorkloadManagementSystem.Client.SandboxStoreClient import SandboxStoreClient from WebAppDIRAC.Lib.WebHandler import WebHandler, WErr @@ -22,7 +22,7 @@ class JobMonitorHandler(WebHandler): def web_getJobData(self): req = self._request() - result = JobMonitoringClient().getJobPageSummaryWeb(req, self.globalSort, self.pageNumber, self.numberOfJobs) + result = WebAppClient().getJobPageSummaryWeb(req, self.globalSort, self.pageNumber, self.numberOfJobs) if not result["OK"]: return {"success": "false", "result": [], "total": 0, "error": result["Message"]} @@ -375,12 +375,12 @@ def web_jobData(self, id: int, data_kind: str) -> dict: return {"success": "false", "error": "StagerReport not available"} return {"success": "false", "error": result["Message"]} if data_kind == "getPilotStdOut": - if not (result := WMSAdministratorClient().getJobPilotOutput(id))["OK"]: + if not (result := WebAppClient().getJobPilotOutput(id))["OK"]: return {"success": "false", "error": result["Message"]} if "StdOut" in result["Value"]: return {"success": "true", "result": result["Value"]["StdOut"]} if data_kind == "getPilotStdErr": - if not (result := WMSAdministratorClient().getJobPilotOutput(id))["OK"]: + if not (result := WebAppClient().getJobPilotOutput(id))["OK"]: return {"success": "false", "error": result["Message"]} if "StdErr" in result["Value"]: return {"success": "true", "result": result["Value"]["StdErr"]} diff --git a/src/WebAppDIRAC/WebApp/handler/JobSummaryHandler.py b/src/WebAppDIRAC/WebApp/handler/JobSummaryHandler.py index 8b2e4447..25a00d85 100644 --- a/src/WebAppDIRAC/WebApp/handler/JobSummaryHandler.py +++ b/src/WebAppDIRAC/WebApp/handler/JobSummaryHandler.py @@ -2,7 +2,7 @@ from time import time from DIRAC import gLogger, gConfig -from DIRAC.WorkloadManagementSystem.Client.WMSAdministratorClient import WMSAdministratorClient +from DIRAC.MonitoringSystem.Client.WebAppClient import WebAppClient from WebAppDIRAC.Lib.WebHandler import WebHandler @@ -262,7 +262,7 @@ class JobSummaryHandler(WebHandler): def web_getSelectionData(self): callback = {} - result = WMSAdministratorClient().getSiteSummarySelectors() + result = WebAppClient().getSiteSummarySelectors() gLogger.info(f"\x1b[0;31m ++++++: \x1b[0m {result}") if result["OK"]: result = result["Value"] @@ -322,7 +322,7 @@ def web_getData(self): pagestart = time() result = self.__request() gLogger.always(f"getSiteSummaryWeb({result},{self.globalSort},{self.pageNumber},{self.numberOfJobs})") - retVal = WMSAdministratorClient().getSiteSummaryWeb(result, [], self.pageNumber, self.numberOfJobs) + retVal = WebAppClient().getSiteSummaryWeb(result, [], self.pageNumber, self.numberOfJobs) gLogger.always("\033[0;31m YO: \033[0m", result) if retVal["OK"]: if retVal["Value"].get("TotalRecords", 0) > 0: diff --git a/src/WebAppDIRAC/WebApp/handler/PilotMonitorHandler.py b/src/WebAppDIRAC/WebApp/handler/PilotMonitorHandler.py index 6318d146..6f29b1b4 100644 --- a/src/WebAppDIRAC/WebApp/handler/PilotMonitorHandler.py +++ b/src/WebAppDIRAC/WebApp/handler/PilotMonitorHandler.py @@ -3,7 +3,7 @@ from DIRAC import gConfig, S_OK, gLogger from DIRAC.Core.Utilities.Graphs.Palette import Palette -from DIRAC.WorkloadManagementSystem.Client.PilotManagerClient import PilotManagerClient +from DIRAC.MonitoringSystem.Client.WebAppClient import WebAppClient from WebAppDIRAC.Lib.WebHandler import WebHandler @@ -13,7 +13,7 @@ class PilotMonitorHandler(WebHandler): def web_getPilotData(self): req = self.__request() - result = PilotManagerClient().getPilotMonitorWeb(req, self.globalSort, self.pageNumber, self.numberOfJobs) + result = WebAppClient().getPilotMonitorWeb(req, self.globalSort, self.pageNumber, self.numberOfJobs) if not result["OK"]: return {"success": "false", "result": [], "total": 0, "error": result["Message"]} @@ -61,7 +61,7 @@ def web_getSelectionData(self): tmp = {self.get_argument(i).replace('"', "") for i in self.request.arguments} callback["extra"] = list(tmp) - if (result := PilotManagerClient().getPilotMonitorSelectors())["OK"]: + if (result := WebAppClient().getPilotMonitorSelectors())["OK"]: result = result["Value"] if "Status" in result and len(result["Status"]) > 0: @@ -168,7 +168,7 @@ def __request(self): return req def web_getJobInfoData(self, data): - RPC = PilotManagerClient() + RPC = WebAppClient() if self.get_argument("data_kind") == "getPilotOutput": if (result := RPC.getPilotOutput(data))["OK"]: return {"success": "true", "result": result["Value"]["StdOut"]} @@ -190,7 +190,7 @@ def web_getStatisticsData(self, statsField): paletteColor = Palette() - RPC = PilotManagerClient() + RPC = WebAppClient() if statsField == "Site": selector = "GridSite" diff --git a/src/WebAppDIRAC/WebApp/handler/PilotSummaryHandler.py b/src/WebAppDIRAC/WebApp/handler/PilotSummaryHandler.py index 694fb4e1..85da49eb 100644 --- a/src/WebAppDIRAC/WebApp/handler/PilotSummaryHandler.py +++ b/src/WebAppDIRAC/WebApp/handler/PilotSummaryHandler.py @@ -2,7 +2,7 @@ import datetime from DIRAC import gConfig, gLogger -from DIRAC.WorkloadManagementSystem.Client.PilotManagerClient import PilotManagerClient +from DIRAC.MonitoringSystem.Client.WebAppClient import WebAppClient from DIRAC.WorkloadManagementSystem.Client.JobMonitoringClient import JobMonitoringClient from WebAppDIRAC.Lib.WebHandler import WebHandler @@ -13,7 +13,7 @@ class PilotSummaryHandler(WebHandler): def web_getPilotSummaryData(self): req = self.__request() - result = PilotManagerClient().getPilotSummaryWeb(req, self.globalSort, self.pageNumber, self.numberOfJobs) + result = WebAppClient().getPilotSummaryWeb(req, self.globalSort, self.pageNumber, self.numberOfJobs) if not result["OK"]: return {"success": "false", "result": [], "total": 0, "error": result["Message"]} From dc57e979780121d2d5604ff434ee3f7261856dad Mon Sep 17 00:00:00 2001 From: Federico Stagni Date: Mon, 12 May 2025 11:44:27 +0200 Subject: [PATCH 2/2] refactor: move DIRAC TS WebApp related RPC calls to dedicated service --- .../handler/TransformationMonitorHandler.py | 62 +++++++++---------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/src/WebAppDIRAC/WebApp/handler/TransformationMonitorHandler.py b/src/WebAppDIRAC/WebApp/handler/TransformationMonitorHandler.py index 06c445e7..0a07b586 100644 --- a/src/WebAppDIRAC/WebApp/handler/TransformationMonitorHandler.py +++ b/src/WebAppDIRAC/WebApp/handler/TransformationMonitorHandler.py @@ -6,7 +6,7 @@ from DIRAC import gConfig, gLogger from DIRAC.Core.Utilities import TimeUtilities -from DIRAC.TransformationSystem.Client.TransformationClient import TransformationClient +from DIRAC.MonitoringSystem.Client.WebAppClient import WebAppClient from WebAppDIRAC.Lib.WebHandler import WebHandler, WErr @@ -18,8 +18,8 @@ def web_getSelectionData(self): if self.getUserName().lower() == "anonymous": return {"prod": [["Insufficient rights"]]} - tsClient = TransformationClient() - if (result := tsClient.getDistinctAttributeValues("Plugin", {}))["OK"]: + waClient = WebAppClient() + if (result := waClient.getDistinctAttributeValues("Plugin", {}))["OK"]: plugin = [] if len(result["Value"]) > 0: for i in result["Value"]: @@ -30,7 +30,7 @@ def web_getSelectionData(self): plugin = "Error during RPC call" callback = {"plugin": plugin} - if (result := tsClient.getDistinctAttributeValues("Status", {}))["OK"]: + if (result := waClient.getDistinctAttributeValues("Status", {}))["OK"]: status = [] if len(result["Value"]) > 0: for i in result["Value"]: @@ -41,7 +41,7 @@ def web_getSelectionData(self): status = "Error during RPC call" callback["prodStatus"] = status - if (result := tsClient.getDistinctAttributeValues("TransformationGroup", {}))["OK"]: + if (result := waClient.getDistinctAttributeValues("TransformationGroup", {}))["OK"]: group = [] if len(result["Value"]) > 0: for i in result["Value"]: @@ -52,7 +52,7 @@ def web_getSelectionData(self): group = "Error during RPC call" callback["transformationGroup"] = group - if (result := tsClient.getDistinctAttributeValues("AgentType", {}))["OK"]: + if (result := waClient.getDistinctAttributeValues("AgentType", {}))["OK"]: atype = [] if len(result["Value"]) > 0: for i in result["Value"]: @@ -63,7 +63,7 @@ def web_getSelectionData(self): atype = "Error during RPC call" callback["agentType"] = atype - if (result := tsClient.getDistinctAttributeValues("Type", {}))["OK"]: + if (result := waClient.getDistinctAttributeValues("Type", {}))["OK"]: transType = [] if result["Value"]: for i in result["Value"]: @@ -116,8 +116,8 @@ def web_getTransformationData( TransformationFamily, ) - tsClient = TransformationClient(timeout=3600) - if not (result := tsClient.getTransformationSummaryWeb(params, self.globalSort, start, limit))["OK"]: + waClient = WebAppClient(timeout=3600) + if not (result := waClient.getTransformationSummaryWeb(params, self.globalSort, start, limit))["OK"]: return {"success": "false", "error": result["Message"]} data = result["Value"] @@ -175,7 +175,7 @@ def web_action(self, data_kind, id: int, tasks: int = None): return {"success": "false", "error": "Action is unknown!!!"} def web_executeOperation(self, action, ids): - tsClient = TransformationClient() + waClient = WebAppClient() agentType = "Manual" if action == "clean": @@ -197,10 +197,10 @@ def web_executeOperation(self, action, ids): for i in ids.split(","): try: - result = tsClient.setTransformationParameter(transid := int(i), "Status", status) + result = waClient.setTransformationParameter(transid := int(i), "Status", status) if result["OK"]: resString = f"ProdID: {transid} set to {action} successfully" - result = tsClient.setTransformationParameter(transid, "AgentType", agentType) + result = waClient.setTransformationParameter(transid, "AgentType", agentType) if not result["OK"]: resString = f"ProdID: {transid} failed to set to {action}: {result['Message']}" else: @@ -212,16 +212,16 @@ def web_executeOperation(self, action, ids): return {"success": "true", "showResult": callback} def __fileRetry(self, prodid, mode): - tsClient = TransformationClient() + waClient = WebAppClient() result = None if mode == "proc": - result = tsClient.getTransformationFilesCount(prodid, "ErrorCount", {"Status": "Processed"}) + result = waClient.getTransformationFilesCount(prodid, "ErrorCount", {"Status": "Processed"}) elif mode == "not": - result = tsClient.getTransformationFilesCount( + result = waClient.getTransformationFilesCount( prodid, "ErrorCount", {"Status": ["Unused", "Assigned", "Failed"]} ) elif mode == "all": - result = tsClient.getTransformationFilesCount(prodid, "ErrorCount") + result = waClient.getTransformationFilesCount(prodid, "ErrorCount") if not result["OK"]: return {"success": "false", "error": result["Message"]} @@ -238,12 +238,12 @@ def __fileRetry(self, prodid, mode): return {"success": "true", "result": resList} def __dataQuery(self, prodid): - tsClient = TransformationClient() + waClient = WebAppClient() # FIXME: getTransformationInputDataQuery has been replaced by getTransformationMetaQuery in DIRAC v7r0 - result = tsClient.getTransformationMetaQuery(prodid, "Input") + result = waClient.getTransformationMetaQuery(prodid, "Input") if not result["OK"] and "Unknown method" in result["Message"]: - result = tsClient.getTransformationInputDataQuery(prodid) + result = waClient.getTransformationInputDataQuery(prodid) gLogger.debug("-= #######", result) if not result["OK"]: @@ -253,20 +253,20 @@ def __dataQuery(self, prodid): return {"success": "true", "result": back} def __additionalParams(self, prodid): - if not (result := TransformationClient().getAdditionalParameters(prodid))["OK"]: + if not (result := WebAppClient().getAdditionalParameters(prodid))["OK"]: return {"success": "false", "error": result["Message"]} data = result["Value"] back = [[i, data[i]] for i in sorted(data)] return {"success": "true", "result": back} def __workflowxml(self, transid): - tsClient = TransformationClient() - if not (result := tsClient.getTransformations({"TransformationID": transid}))["OK"]: + waClient = WebAppClient() + if not (result := waClient.getTransformations({"TransformationID": transid}))["OK"]: raise WErr.fromSERROR(result) return {"success": "true", "result": result["Value"][0]["Body"]} def __getLoggingInfo(self, transid): - if (result := TransformationClient().getTransformationLogging(transid))["OK"]: + if (result := WebAppClient().getTransformationLogging(transid))["OK"]: if len(data := result["Value"]) > 0: callback = [] for i in data: @@ -278,8 +278,8 @@ def __getLoggingInfo(self, transid): return {"success": "false", "error": result["Message"]} def __transformationFileStatus(self, transid): - tsClient = TransformationClient() - if not (result := tsClient.getTransformationFilesCount(transid, "Status"))["OK"]: + waClient = WebAppClient() + if not (result := waClient.getTransformationFilesCount(transid, "Status"))["OK"]: return {"success": "false", "error": result["Message"]} resList = [] if (total := result["Value"].pop("Total")) == 0: @@ -293,8 +293,8 @@ def __transformationFileStatus(self, transid): return {"success": "true", "result": resList} def __transformationDetail(self, prodid): - tsClient = TransformationClient() - if not (result := tsClient.getTransformationParameters(prodid, ["DetailedInfo"]))["OK"]: + waClient = WebAppClient() + if not (result := waClient.getTransformationParameters(prodid, ["DetailedInfo"]))["OK"]: return {"success": "false", "error": result["Message"]} if callback := result["Value"]: return {"success": "true", "result": callback} @@ -303,7 +303,7 @@ def __transformationDetail(self, prodid): def __extendTransformation(self, transid, tasks): gLogger.info(f"Extend transformation ({transid}, {tasks})") - if (result := TransformationClient().extendTransformation(transid, tasks))["OK"]: + if (result := WebAppClient().extendTransformation(transid, tasks))["OK"]: resString = f"{transid} extended by {tasks} successfully" else: resString = f"{transid} failed to extend: {result['Message']}" @@ -311,7 +311,7 @@ def __extendTransformation(self, transid, tasks): return {"success": "true", "showResult": [resString], "result": resString} def web_showFileStatus(self, start: int, limit: int, transformationId, status): - result = TransformationClient().getTransformationFilesSummaryWeb( + result = WebAppClient().getTransformationFilesSummaryWeb( {"TransformationID": transformationId, "Status": status}, [["FileID", "ASC"]], start, @@ -353,7 +353,7 @@ def web_getTier1Sites(self): def web_setSite(self, TransformationId: int, RunNumber: int, Site): gLogger.info(f"\033[0;31m setTransformationRunsSite({TransformationId}, {RunNumber}, {Site}) \033[0m") - result = TransformationClient().setTransformationRunsSite(TransformationId, RunNumber, Site) + result = WebAppClient().setTransformationRunsSite(TransformationId, RunNumber, Site) if result["OK"]: return {"success": "true", "result": "true"} return {"success": "false", "error": result["Message"]} @@ -375,7 +375,7 @@ def _prepareSearchParameters( transformationGroup, TransformationFamily, ): - """Prepare a query dictionary which can be used with TransformationClient.getTransformationSummaryWeb + """Prepare a query dictionary which can be used with WebAppClient.getTransformationSummaryWeb Note: This method can be overridden by extensions """