From 2ac182e3b1e5d855ea817c374a7321dc742e62a2 Mon Sep 17 00:00:00 2001 From: martynia Date: Mon, 27 Jul 2026 14:31:16 +0100 Subject: [PATCH 1/7] feat: replace datetime.utcnow and datetime.utcfromtimestamp with Dirac own implementation --- .../Core/Utilities/TimeUtilities.py | 4 +++- .../AccountingSystem/Agent/NetworkAgent.py | 3 ++- .../Client/Types/BaseAccountingType.py | 7 +++--- src/DIRAC/AccountingSystem/DB/AccountingDB.py | 5 ++-- .../Service/ReportGeneratorHandler.py | 5 ++-- src/DIRAC/ConfigurationSystem/Client/CSAPI.py | 3 ++- .../private/ConfigurationData.py | 5 ++-- .../private/Modificator.py | 3 ++- .../scripts/dirac_admin_sort_cs_sites.py | 3 ++- src/DIRAC/Core/Base/AgentModule.py | 3 ++- src/DIRAC/Core/DISET/MessageClient.py | 3 ++- src/DIRAC/Core/DISET/RequestHandler.py | 5 ++-- src/DIRAC/Core/DISET/ServiceReactor.py | 3 ++- src/DIRAC/Core/DISET/private/Service.py | 3 ++- src/DIRAC/Core/LCG/GOCDBClient.py | 3 ++- src/DIRAC/Core/Security/VOMS.py | 7 +++--- .../Core/Security/m2crypto/X509Certificate.py | 5 ++-- .../Core/Tornado/Server/TornadoService.py | 5 ++-- .../Server/private/BaseRequestHandler.py | 3 ++- src/DIRAC/Core/Utilities/DEncode.py | 3 ++- src/DIRAC/Core/Utilities/ElasticSearchDB.py | 5 ++-- src/DIRAC/Core/Utilities/Graphs/BarGraph.py | 5 ++-- src/DIRAC/Core/Utilities/Graphs/CurveGraph.py | 5 ++-- src/DIRAC/Core/Utilities/Graphs/Graph.py | 3 ++- src/DIRAC/Core/Utilities/Graphs/GraphData.py | 5 ++-- .../Core/Utilities/Graphs/GraphUtilities.py | 7 +++--- src/DIRAC/Core/Utilities/Graphs/LineGraph.py | 5 ++-- .../Core/Utilities/Graphs/QualityMapGraph.py | 5 ++-- src/DIRAC/Core/Utilities/Profiler.py | 3 ++- .../DataManagementSystem/Agent/FTS3Agent.py | 3 ++- .../Agent/RequestOperations/CheckMigration.py | 3 ++- .../Client/DataManager.py | 15 ++++++------ .../DataManagementSystem/Client/FTS3File.py | 3 ++- .../DataManagementSystem/Client/FTS3Job.py | 5 ++-- .../Client/FTS3Operation.py | 3 ++- src/DIRAC/DataManagementSystem/DB/FTS3DB.py | 7 +++--- .../FileManager/FileManagerPs.py | 5 ++-- .../scripts/dirac_dms_user_lfns.py | 3 ++- .../Client/ProxyManagerClient.py | 5 ++-- .../Client/SecurityLogClient.py | 3 ++- .../Service/SystemAdministratorHandler.py | 7 +++--- .../Utilities/MonitoringUtilities.py | 5 ++-- .../scripts/dirac_admin_users_with_proxy.py | 3 ++- src/DIRAC/Interfaces/API/Dirac.py | 3 ++- src/DIRAC/Interfaces/API/DiracAdmin.py | 5 ++-- .../scripts/dirac_wms_job_delete.py | 3 ++- .../scripts/dirac_wms_job_get_output.py | 3 ++- .../scripts/dirac_wms_job_status.py | 3 ++- src/DIRAC/Interfaces/scripts/doutput.py | 3 ++- src/DIRAC/Interfaces/scripts/dstat.py | 3 ++- .../Service/MonitoringHandler.py | 5 ++-- .../Agent/CleanReqDBAgent.py | 5 ++-- .../RequestManagementSystem/Client/File.py | 3 ++- .../Client/Operation.py | 7 +++--- .../Client/ReqClient.py | 3 ++- .../RequestManagementSystem/Client/Request.py | 7 +++--- .../RequestManagementSystem/DB/RequestDB.py | 11 +++++---- .../Service/ReqManagerHandler.py | 3 ++- .../scripts/dirac_rms_request.py | 5 ++-- .../Agent/ElementInspectorAgent.py | 3 ++- .../Agent/SiteInspectorAgent.py | 3 ++- .../Agent/SummarizeLogsAgent.py | 3 ++- .../ResourceStatusSystem/Agent/TokenAgent.py | 7 +++--- .../Client/ResourceStatus.py | 3 ++- .../ResourceStatusSystem/Client/SiteStatus.py | 3 ++- .../Command/DowntimeCommand.py | 5 ++-- .../Command/FreeDiskSpaceCommand.py | 5 ++-- .../Command/TransferCommand.py | 3 ++- .../DB/ResourceManagementDB.py | 23 ++++++++++--------- .../DB/ResourceStatusDB.py | 11 +++++---- .../Service/PublisherHandler.py | 5 ++-- .../Utilities/RSSCache.py | 3 ++- .../scripts/dirac_rss_query_db.py | 5 ++-- .../scripts/dirac_rss_query_dtcache.py | 3 ++- .../scripts/dirac_rss_set_status.py | 3 ++- .../scripts/dirac_rss_set_token.py | 3 ++- .../Resources/Computing/BatchSystems/Host.py | 5 ++-- .../Computing/CloudComputingElement.py | 3 ++- .../Computing/HTCondorCEComputingElement.py | 5 ++-- src/DIRAC/Resources/Storage/StorageElement.py | 3 ++- .../Agent/StageMonitorAgent.py | 5 ++-- .../Agent/InputDataAgent.py | 9 ++++---- .../Agent/TaskManagerAgentBase.py | 7 +++--- .../Agent/TransformationAgent.py | 9 ++++---- .../Agent/TransformationCleaningAgent.py | 5 ++-- .../Service/TransformationManagerHandler.py | 3 ++- .../Agent/JobCleaningAgent.py | 5 ++-- .../Agent/PilotStatusAgent.py | 7 +++--- .../Agent/SiteDirector.py | 9 ++++---- .../Agent/StalledJobAgent.py | 15 ++++++------ .../Agent/StatesAccountingAgent.py | 5 ++-- .../Client/JobReport.py | 5 ++-- .../Client/JobState/CachedJobState.py | 3 ++- .../WorkloadManagementSystem/DB/JobDB.py | 13 ++++++----- .../DB/JobLoggingDB.py | 7 +++--- .../DB/PilotAgentsDB.py | 9 ++++---- .../FutureClient/JobStateUpdateClient.py | 3 ++- .../JobWrapper/JobWrapper.py | 3 ++- .../JobWrapper/Watchdog.py | 3 ++- .../Utilities/JobStatusUtility.py | 3 ++- .../Utilities/PilotCStoJSONSynchronizer.py | 3 ++- .../correctors/MonitoringHistoryCorrector.py | 3 ++- .../private/correctors/WMSHistoryCorrector.py | 3 ++- 103 files changed, 307 insertions(+), 203 deletions(-) diff --git a/dirac-common/src/DIRACCommon/Core/Utilities/TimeUtilities.py b/dirac-common/src/DIRACCommon/Core/Utilities/TimeUtilities.py index 36229323588..c7e5c2a1964 100644 --- a/dirac-common/src/DIRACCommon/Core/Utilities/TimeUtilities.py +++ b/dirac-common/src/DIRACCommon/Core/Utilities/TimeUtilities.py @@ -23,6 +23,8 @@ import sys import time +from DIRAC.Core.Utilities.TimeUtilities import DiracTime + # Some useful constants for time operations microsecond = datetime.timedelta(microseconds=1) second = datetime.timedelta(seconds=1) @@ -111,7 +113,7 @@ def fromEpoch(epoch): epoch /= 1000**2 elif epoch > 10**11: # milliseconds epoch /= 1000 - return datetime.datetime.utcfromtimestamp(epoch) + return DiracTime.utcfromtimestamp(epoch) def toString(myDate=None): diff --git a/src/DIRAC/AccountingSystem/Agent/NetworkAgent.py b/src/DIRAC/AccountingSystem/Agent/NetworkAgent.py index f8b6f2bfc67..7a6221d110a 100644 --- a/src/DIRAC/AccountingSystem/Agent/NetworkAgent.py +++ b/src/DIRAC/AccountingSystem/Agent/NetworkAgent.py @@ -8,6 +8,7 @@ :caption: NetworkAgent options """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from datetime import datetime from DIRAC import S_OK, S_ERROR, gLogger @@ -165,7 +166,7 @@ def processMessage(self, headers, body): timestamps = sorted(body["datapoints"]) for timestamp in timestamps: try: - date = datetime.utcfromtimestamp(float(timestamp)) + date = DiracTime.utcfromtimestamp(float(timestamp)) # create a key that allows to join packet-loss-rate and one-way-delay # metrics in one network accounting record diff --git a/src/DIRAC/AccountingSystem/Client/Types/BaseAccountingType.py b/src/DIRAC/AccountingSystem/Client/Types/BaseAccountingType.py index 7591bb6f948..c72915b3652 100644 --- a/src/DIRAC/AccountingSystem/Client/Types/BaseAccountingType.py +++ b/src/DIRAC/AccountingSystem/Client/Types/BaseAccountingType.py @@ -1,6 +1,7 @@ """ Within this module is defined the class from which all other accounting types are defined """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime from DIRAC import S_OK, S_ERROR @@ -55,7 +56,7 @@ def setStartTime(self, startTime=False): By default use now """ if not startTime: - self.startTime = datetime.datetime.utcnow() + self.startTime = DiracTime.utcnow() else: self.startTime = startTime @@ -65,7 +66,7 @@ def setEndTime(self, endTime=False): By default use now """ if not endTime: - self.endTime = datetime.datetime.utcnow() + self.endTime = DiracTime.utcnow() else: self.endTime = endTime @@ -73,7 +74,7 @@ def setNowAsStartAndEndTime(self): """ Set current time as start and end time of the report """ - self.startTime = datetime.datetime.utcnow() + self.startTime = DiracTime.utcnow() self.endTime = self.startTime def setValueByKey(self, key, value): diff --git a/src/DIRAC/AccountingSystem/DB/AccountingDB.py b/src/DIRAC/AccountingSystem/DB/AccountingDB.py index 01389df7171..eae61945eaf 100644 --- a/src/DIRAC/AccountingSystem/DB/AccountingDB.py +++ b/src/DIRAC/AccountingSystem/DB/AccountingDB.py @@ -1,3 +1,4 @@ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime """Frontend to MySQL DB AccountingDB""" import datetime @@ -50,7 +51,7 @@ def __init__(self, name="Accounting/AccountingDB", readOnly=False, parentLogger= minute=random.randint(0, 59), # nosec B311 second=random.randint(0, 59), # nosec B311 ) - lcd = datetime.datetime.utcnow() + lcd = DiracTime.utcnow() lcd.replace(hour=self.__compactTime.hour + 1, minute=0, second=0) self.__lastCompactionEpoch = TimeUtilities.toEpoch(lcd) self.__registerTypes() @@ -69,7 +70,7 @@ def autoCompactDB(self): def __periodicAutoCompactDB(self): while self.autoCompact: - nct = datetime.datetime.utcnow() + nct = DiracTime.utcnow() if nct.hour >= self.__compactTime.hour: nct = nct + datetime.timedelta(days=1) nct = nct.replace( diff --git a/src/DIRAC/AccountingSystem/Service/ReportGeneratorHandler.py b/src/DIRAC/AccountingSystem/Service/ReportGeneratorHandler.py index 0101fbc52ba..224d3715957 100644 --- a/src/DIRAC/AccountingSystem/Service/ReportGeneratorHandler.py +++ b/src/DIRAC/AccountingSystem/Service/ReportGeneratorHandler.py @@ -6,6 +6,7 @@ :dedent: 2 :caption: ReportGenerator options """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import os import datetime @@ -76,13 +77,13 @@ def __checkPlotRequest(self, reportRequest): return S_ERROR("Value Error") if lastSeconds < 3600: return S_ERROR("lastSeconds must be more than 3600") - now = datetime.datetime.utcnow() + now = DiracTime.utcnow() reportRequest["endTime"] = now reportRequest["startTime"] = now - datetime.timedelta(seconds=lastSeconds) else: # if enddate is not there, just set it to now if not reportRequest.get("endTime", False): - reportRequest["endTime"] = datetime.datetime.utcnow() + reportRequest["endTime"] = DiracTime.utcnow() # Check keys for key, keyType in self.__reportRequestDict.items(): if key not in reportRequest: diff --git a/src/DIRAC/ConfigurationSystem/Client/CSAPI.py b/src/DIRAC/ConfigurationSystem/Client/CSAPI.py index 14806e1c0cf..baee7e00636 100644 --- a/src/DIRAC/ConfigurationSystem/Client/CSAPI.py +++ b/src/DIRAC/ConfigurationSystem/Client/CSAPI.py @@ -3,6 +3,7 @@ Most of these functions can only be done by administrators """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime from DIRAC import S_ERROR, S_OK, gConfig, gLogger @@ -104,7 +105,7 @@ def initialize(self): self.__csMod = Modificator( self.__rpcClient, "%s - %s - %s" - % (self.__userGroup, self.__userDN, datetime.datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S")), + % (self.__userGroup, self.__userDN, DiracTime.utcnow().strftime("%Y-%m-%d %H:%M:%S")), ) retVal = self.downloadCSData() if not retVal["OK"]: diff --git a/src/DIRAC/ConfigurationSystem/private/ConfigurationData.py b/src/DIRAC/ConfigurationSystem/private/ConfigurationData.py index b21b34ec2f6..579abc09b44 100755 --- a/src/DIRAC/ConfigurationSystem/private/ConfigurationData.py +++ b/src/DIRAC/ConfigurationSystem/private/ConfigurationData.py @@ -1,6 +1,7 @@ """ ConfigurationData module is the base for cfg files management """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import os.path import zlib import zipfile @@ -201,7 +202,7 @@ def deleteOptionInCFG(self, path, cfg=False): self.sync() def generateNewVersion(self): - self.setVersion(str(datetime.datetime.utcnow())) + self.setVersion(str(DiracTime.utcnow())) self.sync() gLogger.info(f"Generated new version {self.getVersion()}") @@ -326,7 +327,7 @@ def dumpRemoteCFGToFile(self, fileName): def __backupCurrentConfiguration(self, backupName): configurationFilename = f"{self.getName()}.cfg" configurationFile = os.path.join(DIRAC.rootPath, "etc", configurationFilename) - today = datetime.datetime.utcnow().date() + today = DiracTime.utcnow().date() backupPath = os.path.join(self.getBackupDir(), str(today.year), "%02d" % today.month) mkDir(backupPath) backupFile = os.path.join(backupPath, configurationFilename.replace(".cfg", f".{backupName}.zip")) diff --git a/src/DIRAC/ConfigurationSystem/private/Modificator.py b/src/DIRAC/ConfigurationSystem/private/Modificator.py index 7f07a506075..48cf6b58fa3 100755 --- a/src/DIRAC/ConfigurationSystem/private/Modificator.py +++ b/src/DIRAC/ConfigurationSystem/private/Modificator.py @@ -1,5 +1,6 @@ """ This is the guy that actually modifies the content of the CS """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime import difflib import zlib @@ -29,7 +30,7 @@ def loadCredentials(self): self.commiterId = "{}@{} - {}".format( credDict["username"], credDict["group"], - datetime.datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S"), + DiracTime.utcnow().strftime("%Y-%m-%d %H:%M:%S"), ) return retVal return retVal diff --git a/src/DIRAC/ConfigurationSystem/scripts/dirac_admin_sort_cs_sites.py b/src/DIRAC/ConfigurationSystem/scripts/dirac_admin_sort_cs_sites.py index 4b04d53596b..74dcab6b682 100755 --- a/src/DIRAC/ConfigurationSystem/scripts/dirac_admin_sort_cs_sites.py +++ b/src/DIRAC/ConfigurationSystem/scripts/dirac_admin_sort_cs_sites.py @@ -3,6 +3,7 @@ # File : dirac-admin-sort-cs-sites # Author : Matvey Sapunov ######################################################################## +from DIRAC.Core.Utilities.TimeUtilities import DiracTime """ Sort site names at CS in "/Resources" section. Sort can be alphabetic or by country postfix in a site name. Alphabetic sort is default (i.e. LCG.IHEP.cn, LCG.IHEP.su, LCG.IN2P3.fr) @@ -112,7 +113,7 @@ def main(): gLogger.notice("Nothing to do, site names are already sorted") DIRACExit(0) - timestamp = str(datetime.utcnow()) + timestamp = str(DiracTime.utcnow()) stamp = f"Site names are sorted by {Script.scriptName} script at {timestamp}" cs.setOptionComment("/Resources/Sites", stamp) diff --git a/src/DIRAC/Core/Base/AgentModule.py b/src/DIRAC/Core/Base/AgentModule.py index 8d8d1508848..268f1c1de08 100644 --- a/src/DIRAC/Core/Base/AgentModule.py +++ b/src/DIRAC/Core/Base/AgentModule.py @@ -1,6 +1,7 @@ """ Base class for all agent modules """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime import importlib.metadata import inspect @@ -233,7 +234,7 @@ def am_checkStopAgentFile(self): def am_createStopAgentFile(self): try: with open(self.am_getStopAgentFile(), "w") as fd: - fd.write(f"Dirac site agent Stopped at {str(datetime.datetime.utcnow())}") + fd.write(f"Dirac site agent Stopped at {str(DiracTime.utcnow())}") except Exception as err: self.log.info(f"Failed to write stop file: {str(err)}") diff --git a/src/DIRAC/Core/DISET/MessageClient.py b/src/DIRAC/Core/DISET/MessageClient.py index 9dffc6d0647..1b961e6d07e 100755 --- a/src/DIRAC/Core/DISET/MessageClient.py +++ b/src/DIRAC/Core/DISET/MessageClient.py @@ -1,3 +1,4 @@ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import random import threading import datetime @@ -29,7 +30,7 @@ def _initialize(self): def __generateUniqueClientName(self): hashStr = ":".join( - (str(datetime.datetime.utcnow()), str(random.random()), Network.getFQDN(), gLogger.getName()) # nosec B311 + (str(DiracTime.utcnow()), str(random.random()), Network.getFQDN(), gLogger.getName()) # nosec B311 ) hexHash = md5(hashStr.encode(), usedforsecurity=False).hexdigest() return hexHash diff --git a/src/DIRAC/Core/DISET/RequestHandler.py b/src/DIRAC/Core/DISET/RequestHandler.py index 1e0b010d546..d76ac2ea541 100755 --- a/src/DIRAC/Core/DISET/RequestHandler.py +++ b/src/DIRAC/Core/DISET/RequestHandler.py @@ -1,5 +1,6 @@ """ Base class for all services """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import os import time, datetime import psutil @@ -494,12 +495,12 @@ def __logRemoteQueryResponse(self, retVal, elapsedTime): def export_ping(self): dInfo = {} dInfo["version"] = DIRAC.version - dInfo["time"] = datetime.datetime.utcnow() + dInfo["time"] = DiracTime.utcnow() # Uptime dInfo["host uptime"] = int(time.time() - psutil.boot_time()) startTime = self.serviceInfoDict["serviceStartTime"] dInfo["service start time"] = self.serviceInfoDict["serviceStartTime"] - serviceUptime = datetime.datetime.utcnow() - startTime + serviceUptime = DiracTime.utcnow() - startTime dInfo["service uptime"] = int(serviceUptime.total_seconds()) # Load average dInfo["load"] = " ".join([str(lx) for lx in os.getloadavg()]) diff --git a/src/DIRAC/Core/DISET/ServiceReactor.py b/src/DIRAC/Core/DISET/ServiceReactor.py index 97cc3c9121f..9ad4eb39e10 100644 --- a/src/DIRAC/Core/DISET/ServiceReactor.py +++ b/src/DIRAC/Core/DISET/ServiceReactor.py @@ -15,6 +15,7 @@ """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import time import datetime import selectors @@ -260,7 +261,7 @@ class ReactorStats: def __init__(self): self.__connections = 0 self.__established = 0 - self.__startTime = datetime.datetime.utcnow() + self.__startTime = DiracTime.utcnow() def connectionStablished(self): self.__connections += 1 diff --git a/src/DIRAC/Core/DISET/private/Service.py b/src/DIRAC/Core/DISET/private/Service.py index 87781d459d3..6d489ae14ed 100644 --- a/src/DIRAC/Core/DISET/private/Service.py +++ b/src/DIRAC/Core/DISET/private/Service.py @@ -8,6 +8,7 @@ # pylint: skip-file # __searchInitFunctions gives RuntimeError: maximum recursion depth exceeded +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import os import time import datetime @@ -50,7 +51,7 @@ def __init__(self, serviceData): """ self._svcData = serviceData self._name = serviceData["modName"] - self._startTime = datetime.datetime.utcnow() + self._startTime = DiracTime.utcnow() self._validNames = [serviceData["modName"]] if serviceData["loadName"] not in self._validNames: self._validNames.append(serviceData["loadName"]) diff --git a/src/DIRAC/Core/LCG/GOCDBClient.py b/src/DIRAC/Core/LCG/GOCDBClient.py index be6b042f7f0..386bbcf1b31 100644 --- a/src/DIRAC/Core/LCG/GOCDBClient.py +++ b/src/DIRAC/Core/LCG/GOCDBClient.py @@ -3,6 +3,7 @@ WARN: the URL of the GOC DB API is hardcoded, and is: https://goc.egi.eu/gocdbpi/public/ """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import socket import time from datetime import datetime, timedelta @@ -109,7 +110,7 @@ def getStatus(self, granularity, name=None, startDate=None, startingInHours=None startDateMax = None if startingInHours is not None: - startDate = datetime.utcnow() + startDate = DiracTime.utcnow() startDateMax = startDate + timedelta(hours=startingInHours) if startDate is not None: diff --git a/src/DIRAC/Core/Security/VOMS.py b/src/DIRAC/Core/Security/VOMS.py index a9bab537510..1989cf71a62 100644 --- a/src/DIRAC/Core/Security/VOMS.py +++ b/src/DIRAC/Core/Security/VOMS.py @@ -1,6 +1,7 @@ """ Module for dealing with VOMS (Virtual Organization Membership Service) """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from datetime import datetime import os import tempfile @@ -167,11 +168,11 @@ def getVOMSProxyInfo(self, proxy, option=False): data = res["Value"] if option == "actimeleft": - now = datetime.utcnow() + now = DiracTime.utcnow() left = data["notAfter"] - now return S_OK("%d\n" % left.total_seconds()) if option == "timeleft": - now = datetime.utcnow() + now = DiracTime.utcnow() left = proxyDict["chain"].getNotAfterDate()["Value"] - now return S_OK("%d\n" % left.total_seconds()) if option == "identity": @@ -206,7 +207,7 @@ def getVOMSProxyInfo(self, proxy, option=False): lines.append(f"attribute : {fqan}") if "attribute" in data: lines.append(f"attribute : {data['attribute']}") - now = datetime.utcnow() + now = DiracTime.utcnow() left = (data["notAfter"] - now).total_seconds() h = int(left / 3600) m = int(left / 60) - h * 60 diff --git a/src/DIRAC/Core/Security/m2crypto/X509Certificate.py b/src/DIRAC/Core/Security/m2crypto/X509Certificate.py index 6e9f10d3b05..a96f1381b8e 100644 --- a/src/DIRAC/Core/Security/m2crypto/X509Certificate.py +++ b/src/DIRAC/Core/Security/m2crypto/X509Certificate.py @@ -5,6 +5,7 @@ X509RFC: https://tools.ietf.org/html/rfc5280 """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime import os import secrets @@ -201,7 +202,7 @@ def hasExpired(self): return res notAfter = res["Value"] - now = datetime.datetime.utcnow() + now = DiracTime.utcnow() return S_OK(notAfter < now) @@ -440,7 +441,7 @@ def getRemainingSecs(self): :returns: S_OK(remaining seconds) """ notAfter = self.getNotAfterDate()["Value"] - now = datetime.datetime.utcnow() + now = DiracTime.utcnow() remainingSeconds = max(0, int((notAfter - now).total_seconds())) return S_OK(remainingSeconds) diff --git a/src/DIRAC/Core/Tornado/Server/TornadoService.py b/src/DIRAC/Core/Tornado/Server/TornadoService.py index dc4bd80bfd7..2e795f9abcb 100644 --- a/src/DIRAC/Core/Tornado/Server/TornadoService.py +++ b/src/DIRAC/Core/Tornado/Server/TornadoService.py @@ -4,6 +4,7 @@ """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import os from datetime import datetime from tornado.web import url as TornadoURL @@ -182,7 +183,7 @@ def export_ping(self): # COPY FROM DIRAC.Core.DISET.RequestHandler dInfo = {} dInfo["version"] = DIRAC.version - dInfo["time"] = datetime.utcnow() + dInfo["time"] = DiracTime.utcnow() # Uptime try: with open("/proc/uptime") as oFD: @@ -192,7 +193,7 @@ def export_ping(self): pass # nosec B110 startTime = self._startTime dInfo["service start time"] = self._startTime - serviceUptime = datetime.utcnow() - startTime + serviceUptime = DiracTime.utcnow() - startTime dInfo["service uptime"] = int(serviceUptime.total_seconds()) # Load average try: diff --git a/src/DIRAC/Core/Tornado/Server/private/BaseRequestHandler.py b/src/DIRAC/Core/Tornado/Server/private/BaseRequestHandler.py index bb57e93f2df..0ff667d5a2c 100644 --- a/src/DIRAC/Core/Tornado/Server/private/BaseRequestHandler.py +++ b/src/DIRAC/Core/Tornado/Server/private/BaseRequestHandler.py @@ -4,6 +4,7 @@ This module is basic for each of these components and describes the basic concept of access to them. """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import time import inspect import threading @@ -441,7 +442,7 @@ def __initialize(cls, request): absoluteUrl = request.full_url() # The time at which the handler was initialized - cls._startTime = datetime.utcnow() + cls._startTime = DiracTime.utcnow() cls.log.info("Initializing method for first use", f"{cls._fullComponentName}, initializing..") # component monitoring initialization diff --git a/src/DIRAC/Core/Utilities/DEncode.py b/src/DIRAC/Core/Utilities/DEncode.py index 09b04c7c5d4..cc8f3a50490 100755 --- a/src/DIRAC/Core/Utilities/DEncode.py +++ b/src/DIRAC/Core/Utilities/DEncode.py @@ -11,6 +11,7 @@ t -> tuple d -> dictionary """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime import os @@ -217,7 +218,7 @@ def stripArgs(frame): gLogger.info("\n".join(lines)) -_dateTimeObject = datetime.datetime.utcnow() +_dateTimeObject = DiracTime.utcnow() _dateTimeType = type(_dateTimeObject) _dateType = type(_dateTimeObject.date()) _timeType = type(_dateTimeObject.time()) diff --git a/src/DIRAC/Core/Utilities/ElasticSearchDB.py b/src/DIRAC/Core/Utilities/ElasticSearchDB.py index c362413b87f..dc4d83581af 100644 --- a/src/DIRAC/Core/Utilities/ElasticSearchDB.py +++ b/src/DIRAC/Core/Utilities/ElasticSearchDB.py @@ -3,6 +3,7 @@ It is used to query Opensearch instances. """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import copy import functools import json @@ -592,7 +593,7 @@ def getUniqueValue(self, indexName, key, orderBy=False): """ query = self._Search(indexName) - endDate = datetime.utcnow() + endDate = DiracTime.utcnow() startDate = endDate - timedelta(days=30) @@ -671,7 +672,7 @@ def generateFullIndexName(indexName, period): return indexName # Do NOT use datetime.today() because it is not UTC - todayUTC = datetime.utcnow().date() + todayUTC = DiracTime.utcnow().date() suffix = None if period.lower() == "day": diff --git a/src/DIRAC/Core/Utilities/Graphs/BarGraph.py b/src/DIRAC/Core/Utilities/Graphs/BarGraph.py index 53a194ee6dd..d43f45825e3 100644 --- a/src/DIRAC/Core/Utilities/Graphs/BarGraph.py +++ b/src/DIRAC/Core/Utilities/Graphs/BarGraph.py @@ -4,6 +4,7 @@ The DIRAC Graphs package is derived from the GraphTool plotting package of the CMS/Phedex Project by ... """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime from pylab import setp @@ -65,8 +66,8 @@ def draw(self): start_plot = 0 end_plot = 0 if "starttime" in self.prefs and "endtime" in self.prefs: - start_plot = date2num(datetime.datetime.utcfromtimestamp(to_timestamp(self.prefs["starttime"]))) - end_plot = date2num(datetime.datetime.utcfromtimestamp(to_timestamp(self.prefs["endtime"]))) + start_plot = date2num(DiracTime.utcfromtimestamp(to_timestamp(self.prefs["starttime"]))) + end_plot = date2num(DiracTime.utcfromtimestamp(to_timestamp(self.prefs["endtime"]))) nKeys = self.gdata.getNumberOfKeys() tmp_b = [] diff --git a/src/DIRAC/Core/Utilities/Graphs/CurveGraph.py b/src/DIRAC/Core/Utilities/Graphs/CurveGraph.py index 6799f09c01c..deb484132a8 100644 --- a/src/DIRAC/Core/Utilities/Graphs/CurveGraph.py +++ b/src/DIRAC/Core/Utilities/Graphs/CurveGraph.py @@ -3,6 +3,7 @@ The DIRAC Graphs package is derived from the GraphTool plotting package of the CMS/Phedex Project by ... """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.Core.Utilities.Graphs.PlotBase import PlotBase from DIRAC.Core.Utilities.Graphs.GraphUtilities import ( darkenColor, @@ -35,8 +36,8 @@ def draw(self): start_plot = 0 end_plot = 0 if "starttime" in self.prefs and "endtime" in self.prefs: - start_plot = date2num(datetime.datetime.utcfromtimestamp(to_timestamp(self.prefs["starttime"]))) - end_plot = date2num(datetime.datetime.utcfromtimestamp(to_timestamp(self.prefs["endtime"]))) + start_plot = date2num(DiracTime.utcfromtimestamp(to_timestamp(self.prefs["starttime"]))) + end_plot = date2num(DiracTime.utcfromtimestamp(to_timestamp(self.prefs["endtime"]))) labels = self.gdata.getLabels() labels.reverse() diff --git a/src/DIRAC/Core/Utilities/Graphs/Graph.py b/src/DIRAC/Core/Utilities/Graphs/Graph.py index 67e1ccd3769..9ec9a1434eb 100644 --- a/src/DIRAC/Core/Utilities/Graphs/Graph.py +++ b/src/DIRAC/Core/Utilities/Graphs/Graph.py @@ -5,6 +5,7 @@ CMS/Phedex Project by ... """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime import importlib import os @@ -103,7 +104,7 @@ def layoutFigure(self, legend): # Make the plot time stamp if requested flag = prefs.get("graph_time_stamp", True) if flag: - timeString = "Generated on " + datetime.datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S ") + "UTC" + timeString = "Generated on " + DiracTime.utcnow().strftime("%Y-%m-%d %H:%M:%S ") + "UTC" time_size = prefs["text_size"] * 0.8 figure.text( 0.995, 0.005, timeString, ha="right", va="bottom", size=pixelToPoint(time_size, dpi), fontstyle="italic" diff --git a/src/DIRAC/Core/Utilities/Graphs/GraphData.py b/src/DIRAC/Core/Utilities/Graphs/GraphData.py index 0602b78ca11..8868de4b9d4 100644 --- a/src/DIRAC/Core/Utilities/Graphs/GraphData.py +++ b/src/DIRAC/Core/Utilities/Graphs/GraphData.py @@ -4,6 +4,7 @@ CMS/Phedex Project by ... """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import time import datetime import numpy @@ -195,7 +196,7 @@ def makeNumKeys(self): next += 1 elif self.key_type == "time": self.all_num_keys = [ - date2num(datetime.datetime.utcfromtimestamp(to_timestamp(key))) for key in self.all_keys + date2num(DiracTime.utcfromtimestamp(to_timestamp(key))) for key in self.all_keys ] elif self.key_type == "numeric": self.all_num_keys = [float(key) for key in self.all_keys] @@ -411,7 +412,7 @@ def initialize(self): self.num_keys.append(next) next += 1 elif self.key_type == "time": - self.num_keys = [date2num(datetime.datetime.utcfromtimestamp(to_timestamp(key))) for key in self.keys] + self.num_keys = [date2num(DiracTime.utcfromtimestamp(to_timestamp(key))) for key in self.keys] elif self.key_type == "numeric": self.num_keys = [float(key) for key in self.keys] diff --git a/src/DIRAC/Core/Utilities/Graphs/GraphUtilities.py b/src/DIRAC/Core/Utilities/Graphs/GraphUtilities.py index 6e2942bbca3..3300b4b94a9 100644 --- a/src/DIRAC/Core/Utilities/Graphs/GraphUtilities.py +++ b/src/DIRAC/Core/Utilities/Graphs/GraphUtilities.py @@ -4,6 +4,7 @@ The DIRAC Graphs package is derived from the GraphTool plotting package of the CMS/Phedex Project by ... """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import os import time import datetime @@ -72,7 +73,7 @@ def convert_to_datetime(dstring): results = saferEval(dstring) if isinstance(results, (int, float)): # Use utcfromtimestamp for UTC time - results = datetime.datetime.utcfromtimestamp(int(results)) + results = DiracTime.utcfromtimestamp(int(results)) elif isinstance(results, datetime.datetime): if results.tzinfo is not None: # non-naive datetime: convert to UTC @@ -88,7 +89,7 @@ def convert_to_datetime(dstring): try: t = time.strptime(dstring, dateformat) timestamp = calendar.timegm(t) # Convert to UTC timestamp - results = datetime.datetime.utcfromtimestamp(timestamp) + results = DiracTime.utcfromtimestamp(timestamp) break except Exception: pass # nosec @@ -97,7 +98,7 @@ def convert_to_datetime(dstring): dstring = dstring.split(".", 1)[0] t = time.strptime(dstring, dateformat) timestamp = calendar.timegm(t) # Convert to UTC timestamp - results = datetime.datetime.utcfromtimestamp(timestamp) + results = DiracTime.utcfromtimestamp(timestamp) except Exception: raise ValueError( "Unable to create time from string!\nExpecting " diff --git a/src/DIRAC/Core/Utilities/Graphs/LineGraph.py b/src/DIRAC/Core/Utilities/Graphs/LineGraph.py index c8868e0f843..8d859d35894 100644 --- a/src/DIRAC/Core/Utilities/Graphs/LineGraph.py +++ b/src/DIRAC/Core/Utilities/Graphs/LineGraph.py @@ -4,6 +4,7 @@ The DIRAC Graphs package is derived from the GraphTool plotting package of the CMS/Phedex Project by ... """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.Core.Utilities.Graphs.PlotBase import PlotBase from DIRAC.Core.Utilities.Graphs.GraphUtilities import ( to_timestamp, @@ -49,8 +50,8 @@ def draw(self): start_plot = 0 end_plot = 0 if "starttime" in self.prefs and "endtime" in self.prefs: - start_plot = date2num(datetime.datetime.utcfromtimestamp(to_timestamp(self.prefs["starttime"]))) - end_plot = date2num(datetime.datetime.utcfromtimestamp(to_timestamp(self.prefs["endtime"]))) + start_plot = date2num(DiracTime.utcfromtimestamp(to_timestamp(self.prefs["starttime"]))) + end_plot = date2num(DiracTime.utcfromtimestamp(to_timestamp(self.prefs["endtime"]))) self.polygons = [] seq_b = [(self.gdata.max_num_key, 0.0), (self.gdata.min_num_key, 0.0)] diff --git a/src/DIRAC/Core/Utilities/Graphs/QualityMapGraph.py b/src/DIRAC/Core/Utilities/Graphs/QualityMapGraph.py index db6c34d4971..b22b5c1efdc 100644 --- a/src/DIRAC/Core/Utilities/Graphs/QualityMapGraph.py +++ b/src/DIRAC/Core/Utilities/Graphs/QualityMapGraph.py @@ -4,6 +4,7 @@ CMS/Phedex Project by ... """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime from pylab import setp from matplotlib.colors import Normalize @@ -113,8 +114,8 @@ def draw(self): start_plot = 0 end_plot = 0 if "starttime" in self.prefs and "endtime" in self.prefs: - start_plot = date2num(datetime.datetime.utcfromtimestamp(to_timestamp(self.prefs["starttime"]))) - end_plot = date2num(datetime.datetime.utcfromtimestamp(to_timestamp(self.prefs["endtime"]))) + start_plot = date2num(DiracTime.utcfromtimestamp(to_timestamp(self.prefs["starttime"]))) + end_plot = date2num(DiracTime.utcfromtimestamp(to_timestamp(self.prefs["endtime"]))) labels = self.gdata.getLabels() nKeys = self.gdata.getNumberOfKeys() diff --git a/src/DIRAC/Core/Utilities/Profiler.py b/src/DIRAC/Core/Utilities/Profiler.py index 2a7e0b775ab..a5f2f806f9a 100644 --- a/src/DIRAC/Core/Utilities/Profiler.py +++ b/src/DIRAC/Core/Utilities/Profiler.py @@ -1,6 +1,7 @@ """ Profiling class for updated information on process status """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime import errno import psutil @@ -192,7 +193,7 @@ def getAllProcessData(self, withChildren=False, withTerminatedChildren=False): """ data = {} - data["datetime"] = datetime.datetime.utcnow() + data["datetime"] = DiracTime.utcnow() data["stats"] = {} result = self.pid() diff --git a/src/DIRAC/DataManagementSystem/Agent/FTS3Agent.py b/src/DIRAC/DataManagementSystem/Agent/FTS3Agent.py index 9efdb53f966..d2a89dd4d07 100644 --- a/src/DIRAC/DataManagementSystem/Agent/FTS3Agent.py +++ b/src/DIRAC/DataManagementSystem/Agent/FTS3Agent.py @@ -11,6 +11,7 @@ """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime import errno import os @@ -318,7 +319,7 @@ def monitorJobsLoop(self): # Not only is it pointless to monitor right after submission # but also we would end up fetching multiple time the same job otherwise # as we call getActiveJobs by batch - lastMonitor = datetime.datetime.utcnow() - datetime.timedelta(minutes=MONITORING_DELAY) + lastMonitor = DiracTime.utcnow() - datetime.timedelta(minutes=MONITORING_DELAY) log.debug("Getting active jobs") diff --git a/src/DIRAC/DataManagementSystem/Agent/RequestOperations/CheckMigration.py b/src/DIRAC/DataManagementSystem/Agent/RequestOperations/CheckMigration.py index 17a037af6f0..9d089064112 100644 --- a/src/DIRAC/DataManagementSystem/Agent/RequestOperations/CheckMigration.py +++ b/src/DIRAC/DataManagementSystem/Agent/RequestOperations/CheckMigration.py @@ -1,3 +1,4 @@ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime """Ensure the files have been migrated to tape.""" import datetime from pprint import pformat @@ -56,6 +57,6 @@ def _run(self): opFile.Status = "Done" else: self.log.notice("File has NOT been migrated:", opFile.LFN) - now = datetime.datetime.utcnow().replace(microsecond=0) + now = DiracTime.utcnow().replace(microsecond=0) extraDelay = datetime.timedelta(minutes=20) self.request.NotBefore = now + extraDelay diff --git a/src/DIRAC/DataManagementSystem/Client/DataManager.py b/src/DIRAC/DataManagementSystem/Client/DataManager.py index d3c67d44129..c1b96a1af7e 100644 --- a/src/DIRAC/DataManagementSystem/Client/DataManager.py +++ b/src/DIRAC/DataManagementSystem/Client/DataManager.py @@ -10,6 +10,7 @@ """ # # imports +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import errno import fnmatch import os @@ -38,7 +39,7 @@ def _isOlderThan(stringTime, days): """Check if a time stamp is older than a given number of days""" timeDelta = timedelta(days=days) - maxCTime = datetime.utcnow() - timeDelta + maxCTime = DiracTime.utcnow() - timeDelta # st = time.strptime( stringTime, "%a %b %d %H:%M:%S %Y" ) # cTimeStruct = datetime( st[0], st[1], st[2], st[3], st[4], st[5], st[6], None ) cTimeStruct = stringTime @@ -521,7 +522,7 @@ def putAndRegister(self, lfn, fileName, diracSE, guid=None, path=None, checksum= failed = {} ########################################################## # Perform the put here. - startTime = datetime.utcnow() + startTime = DiracTime.utcnow() transferStartTime = time.time() res = returnSingleResult(storageElement.putFile(fileDict)) putTime = time.time() - transferStartTime @@ -536,7 +537,7 @@ def putAndRegister(self, lfn, fileName, diracSE, guid=None, path=None, checksum= accountingDict["TransferOK"] = 0 accountingDict["FinalStatus"] = "Failed" sendingResult = self.dataOpSender.sendData( - accountingDict, commitFlag=True, startTime=startTime, endTime=datetime.utcnow() + accountingDict, commitFlag=True, startTime=startTime, endTime=DiracTime.utcnow() ) log.verbose("Committing data operation") @@ -1398,14 +1399,14 @@ def __removeCatalogReplica(self, replicaTuples): """ log = self.log.getSubLogger("__removeCatalogReplica") - startTime = datetime.utcnow() + startTime = DiracTime.utcnow() registrationStartTime = time.time() # HACK! replicaDict = {} for lfn, pfn, se in replicaTuples: replicaDict[lfn] = {"SE": se, "PFN": pfn} res = self.fileCatalog.removeReplica(replicaDict) - endTime = datetime.utcnow() + endTime = DiracTime.utcnow() accountingDict = _initialiseAccountingDict("removeCatalogReplica", "", len(replicaTuples)) accountingDict["RegistrationTime"] = time.time() - registrationStartTime @@ -1459,13 +1460,13 @@ def __removePhysicalReplica(self, storageElementName, lfnsToRemove, replicaDict= log.verbose(errStr, f"{storageElementName} {res['Message']}") return S_ERROR(f"{errStr} {res['Message']}") - startTime = datetime.utcnow() + startTime = DiracTime.utcnow() transferStartTime = time.time() lfnsToRemove = list(lfnsToRemove) ret = storageElement.getFileSize(lfnsToRemove, replicaDict=replicaDict) deletedSizes = ret.get("Value", {}).get("Successful", {}) res = storageElement.removeFile(lfnsToRemove, replicaDict=replicaDict) - endTime = datetime.utcnow() + endTime = DiracTime.utcnow() accountingDict = _initialiseAccountingDict("removePhysicalReplica", storageElementName, len(lfnsToRemove)) accountingDict["TransferTime"] = time.time() - transferStartTime diff --git a/src/DIRAC/DataManagementSystem/Client/FTS3File.py b/src/DIRAC/DataManagementSystem/Client/FTS3File.py index bcd4e34a55f..6c43075f58a 100644 --- a/src/DIRAC/DataManagementSystem/Client/FTS3File.py +++ b/src/DIRAC/DataManagementSystem/Client/FTS3File.py @@ -1,3 +1,4 @@ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime from DIRAC.Core.Utilities.JEncode import JSerializable @@ -63,7 +64,7 @@ def __init__(self): self.status = FTS3File.INIT_STATE self.attempt = 0 - now = datetime.datetime.utcnow().replace(microsecond=0) + now = DiracTime.utcnow().replace(microsecond=0) self.creationTime = now self.lastUpdate = now diff --git a/src/DIRAC/DataManagementSystem/Client/FTS3Job.py b/src/DIRAC/DataManagementSystem/Client/FTS3Job.py index 6756c2d808f..912b798f9b0 100644 --- a/src/DIRAC/DataManagementSystem/Client/FTS3Job.py +++ b/src/DIRAC/DataManagementSystem/Client/FTS3Job.py @@ -1,3 +1,4 @@ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime """FTS3Job module containing only the FTS3Job class""" import datetime @@ -221,7 +222,7 @@ def monitor(self, context=None, ftsServer=None, ucert=None): except FTS3ClientException as e: return S_ERROR(f"Error getting the job status {e}") - now = datetime.datetime.utcnow().replace(microsecond=0) + now = DiracTime.utcnow().replace(microsecond=0) self.lastMonitor = now newStatus = jobStatusDict["job_state"].capitalize() @@ -910,7 +911,7 @@ def submit(self, context=None, ftsServer=None, ucert=None, pinTime=36000, protoc if ftsFile.fileID in fileIDsInTheJob: ftsFile.status = "Submitted" - now = datetime.datetime.utcnow().replace(microsecond=0) + now = DiracTime.utcnow().replace(microsecond=0) self.submitTime = now self.lastUpdate = now self.lastMonitor = now diff --git a/src/DIRAC/DataManagementSystem/Client/FTS3Operation.py b/src/DIRAC/DataManagementSystem/Client/FTS3Operation.py index 763b5b4f994..e71cdb8eb01 100644 --- a/src/DIRAC/DataManagementSystem/Client/FTS3Operation.py +++ b/src/DIRAC/DataManagementSystem/Client/FTS3Operation.py @@ -1,3 +1,4 @@ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime import errno import json @@ -116,7 +117,7 @@ def __init__( self.ftsJobs = [] - now = datetime.datetime.utcnow().replace(microsecond=0) + now = DiracTime.utcnow().replace(microsecond=0) self.creationTime = now self.lastUpdate = now diff --git a/src/DIRAC/DataManagementSystem/DB/FTS3DB.py b/src/DIRAC/DataManagementSystem/DB/FTS3DB.py index cc01a7ad2c6..988e8b32667 100644 --- a/src/DIRAC/DataManagementSystem/DB/FTS3DB.py +++ b/src/DIRAC/DataManagementSystem/DB/FTS3DB.py @@ -1,3 +1,4 @@ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime """Frontend to FTS3 MySQL DB. Written using sqlalchemy""" # We disable the no-member error because @@ -332,7 +333,7 @@ def getActiveJobs(self, limit=20, lastMonitor=None, jobAssignmentTag="Assigned") ftsJobs = ftsJobsQuery.all() if jobAssignmentTag: - jobAssignmentTag += f"_{datetime.datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S')}" + jobAssignmentTag += f"_{DiracTime.utcnow().strftime('%Y-%m-%d %H:%M:%S')}" jobIds = [job.jobID for job in ftsJobs] if jobIds: @@ -569,7 +570,7 @@ def getNonFinishedOperations(self, limit=20, operationAssignmentTag="Assigned"): ftsOperations = session.query(FTS3Operation).filter(FTS3Operation.operationID.in_(operationIDs)).all() if operationAssignmentTag: - operationAssignmentTag += f"_{datetime.datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S')}" + operationAssignmentTag += f"_{DiracTime.utcnow().strftime('%Y-%m-%d %H:%M:%S')}" session.execute( update(FTS3Operation) @@ -692,7 +693,7 @@ def deleteFinalOperations(self, limit=20, deleteDelay=180): session = self.dbSession(expire_on_commit=False) - fromDate = datetime.datetime.utcnow() - datetime.timedelta(days=deleteDelay) + fromDate = DiracTime.utcnow() - datetime.timedelta(days=deleteDelay) try: ftsOps = ( session.query(FTS3Operation.operationID) diff --git a/src/DIRAC/DataManagementSystem/DB/FileCatalogComponents/FileManager/FileManagerPs.py b/src/DIRAC/DataManagementSystem/DB/FileCatalogComponents/FileManager/FileManagerPs.py index da95306b0dc..417b6f510f1 100755 --- a/src/DIRAC/DataManagementSystem/DB/FileCatalogComponents/FileManager/FileManagerPs.py +++ b/src/DIRAC/DataManagementSystem/DB/FileCatalogComponents/FileManager/FileManagerPs.py @@ -1,3 +1,4 @@ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime """FileManager for ... ?""" import os @@ -221,7 +222,7 @@ def __insertMultipleFiles(self, allFileValues, wantedLfns): for lfn in wantedLfns: dirID, size, s_uid, s_gid, statusID, fileName, guid, checksum, checksumtype, mode = allFileValues[lfn] - utcNow = datetime.datetime.utcnow().replace(microsecond=0) + utcNow = DiracTime.utcnow().replace(microsecond=0) fileValuesStrings.append( "(%s, %s, %s, %s, %s, '%s', '%s', '%s', '%s', '%s', '%s', %s)" % (dirID, size, s_uid, s_gid, statusID, fileName, guid, checksum, checksumtype, utcNow, utcNow, mode) @@ -465,7 +466,7 @@ def __insertMultipleReplicas(self, allReplicaValues, lfnsChunk): for lfn in lfnsChunk: fileID, seID, statusID, replicaType, pfn = allReplicaValues[lfn] - utcNow = datetime.datetime.utcnow().replace(microsecond=0) + utcNow = DiracTime.utcnow().replace(microsecond=0) repValuesStrings.append(f"({fileID},{seID},'{statusID}','{replicaType}','{utcNow}','{utcNow}','{pfn}')") repDescStrings.append(f"(r.FileID = {fileID} AND SEID = {seID})") diff --git a/src/DIRAC/DataManagementSystem/scripts/dirac_dms_user_lfns.py b/src/DIRAC/DataManagementSystem/scripts/dirac_dms_user_lfns.py index b6bb517b083..117a97fe022 100755 --- a/src/DIRAC/DataManagementSystem/scripts/dirac_dms_user_lfns.py +++ b/src/DIRAC/DataManagementSystem/scripts/dirac_dms_user_lfns.py @@ -1,4 +1,5 @@ #!/usr/bin/env python +from DIRAC.Core.Utilities.TimeUtilities import DiracTime """ Get the list of all the user files. @@ -63,7 +64,7 @@ def main(): def isOlderThan(cTimeStruct, days): timeDelta = timedelta(days=days) - maxCTime = datetime.utcnow() - timeDelta + maxCTime = DiracTime.utcnow() - timeDelta if cTimeStruct < maxCTime: return True return False diff --git a/src/DIRAC/FrameworkSystem/Client/ProxyManagerClient.py b/src/DIRAC/FrameworkSystem/Client/ProxyManagerClient.py index 14883429b3b..483601abd76 100755 --- a/src/DIRAC/FrameworkSystem/Client/ProxyManagerClient.py +++ b/src/DIRAC/FrameworkSystem/Client/ProxyManagerClient.py @@ -4,6 +4,7 @@ Client also contain caching of the requested proxy information. """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime import os @@ -59,7 +60,7 @@ def __getSecondsLeftToExpiration(self, expiration, utc=True): :return: datetime """ if utc: - td = expiration - datetime.datetime.utcnow() + td = expiration - DiracTime.utcnow() else: td = expiration - datetime.datetime.now() return td.days * 86400 + td.seconds @@ -591,7 +592,7 @@ def getUploadedProxyLifeTime(self, DN): expiryPos = pNames.index("ExpirationTime") for row in data["Records"]: if DN == row[dnPos]: - td = row[expiryPos] - datetime.datetime.utcnow() + td = row[expiryPos] - DiracTime.utcnow() secondsLeft = td.days * 86400 + td.seconds return S_OK(max(0, secondsLeft)) return S_OK(0) diff --git a/src/DIRAC/FrameworkSystem/Client/SecurityLogClient.py b/src/DIRAC/FrameworkSystem/Client/SecurityLogClient.py index d4231831cda..303042b1e0e 100644 --- a/src/DIRAC/FrameworkSystem/Client/SecurityLogClient.py +++ b/src/DIRAC/FrameworkSystem/Client/SecurityLogClient.py @@ -1,5 +1,6 @@ """ For reporting messages to security log service """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import syslog import datetime @@ -30,7 +31,7 @@ def addMessage( timestamp=False, ): if not timestamp: - timestamp = datetime.datetime.utcnow() + timestamp = DiracTime.utcnow() msg = [ timestamp, success, diff --git a/src/DIRAC/FrameworkSystem/Service/SystemAdministratorHandler.py b/src/DIRAC/FrameworkSystem/Service/SystemAdministratorHandler.py index d539896d040..6ae701c9bb6 100644 --- a/src/DIRAC/FrameworkSystem/Service/SystemAdministratorHandler.py +++ b/src/DIRAC/FrameworkSystem/Service/SystemAdministratorHandler.py @@ -1,3 +1,4 @@ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime """SystemAdministrator service is a tool to control and monitor the DIRAC services and agents""" import importlib @@ -372,7 +373,7 @@ def export_updateSoftware(self, version): newProPrefix = os.path.join( rootPath, "versions", - f"{directory}-{datetime.utcnow().strftime('%s')}", + f"{directory}-{DiracTime.utcnow().strftime('%s')}", ) installPrefix = os.path.join(newProPrefix, f"{platform.system()}-{platform.machine()}") self.log.info("Running DIRACOS installer for prefix", installPrefix) @@ -517,7 +518,7 @@ def export_checkComponentLog(self, component): errors_1 = 0 errors_24 = 0 - now = datetime.utcnow() + now = DiracTime.utcnow() lastError = "" for line in logLines: if "ERROR:" in line: @@ -736,7 +737,7 @@ def __storeHostInfo(): return result fields = result["Value"] - fields["Timestamp"] = datetime.utcnow() + fields["Timestamp"] = DiracTime.utcnow() fields["Extension"] = fields["Extensions"] result = ComponentMonitoringClient().updateLog(socket.getfqdn(), fields) if not result["OK"]: diff --git a/src/DIRAC/FrameworkSystem/Utilities/MonitoringUtilities.py b/src/DIRAC/FrameworkSystem/Utilities/MonitoringUtilities.py index c3647052dc1..c2454f9bf17 100644 --- a/src/DIRAC/FrameworkSystem/Utilities/MonitoringUtilities.py +++ b/src/DIRAC/FrameworkSystem/Utilities/MonitoringUtilities.py @@ -2,6 +2,7 @@ Utilities for ComponentMonitoring features """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime import socket @@ -45,7 +46,7 @@ def monitorInstallation(componentType, system, component, module=None, cpu=None, return S_OK(f"Monitoring of {component} is already enabled") result = monitoringClient.addInstallation( - {"InstallationTime": datetime.datetime.utcnow(), "InstalledBy": user, "Instance": instance}, + {"InstallationTime": DiracTime.utcnow(), "InstalledBy": user, "Instance": instance}, {"Type": componentType, "DIRACSystem": system, "DIRACModule": module}, {"HostName": hostname, "CPU": cpu}, True, @@ -78,6 +79,6 @@ def monitorUninstallation(system, component, cpu=None, hostname=None, user=None) {"Instance": instance, "UnInstallationTime": None}, {"DIRACSystem": system}, {"HostName": hostname, "CPU": cpu}, - {"UnInstallationTime": datetime.datetime.utcnow(), "UnInstalledBy": user}, + {"UnInstallationTime": DiracTime.utcnow(), "UnInstalledBy": user}, ) return result diff --git a/src/DIRAC/FrameworkSystem/scripts/dirac_admin_users_with_proxy.py b/src/DIRAC/FrameworkSystem/scripts/dirac_admin_users_with_proxy.py index 88c934ea6cf..4c5fdd143ca 100755 --- a/src/DIRAC/FrameworkSystem/scripts/dirac_admin_users_with_proxy.py +++ b/src/DIRAC/FrameworkSystem/scripts/dirac_admin_users_with_proxy.py @@ -1,4 +1,5 @@ #!/usr/bin/env python +from DIRAC.Core.Utilities.TimeUtilities import DiracTime """ Print list of users with proxies. @@ -56,7 +57,7 @@ def main(): keys = result["Value"]["ParameterNames"] records = result["Value"]["Records"] dataDict = {} - now = datetime.datetime.utcnow() + now = DiracTime.utcnow() for record in records: expirationDate = record[3] dt = expirationDate - now diff --git a/src/DIRAC/Interfaces/API/Dirac.py b/src/DIRAC/Interfaces/API/Dirac.py index c52227dee6d..8d62230a223 100755 --- a/src/DIRAC/Interfaces/API/Dirac.py +++ b/src/DIRAC/Interfaces/API/Dirac.py @@ -13,6 +13,7 @@ - Local execution of workflows for testing purposes. """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime import glob import io @@ -1778,7 +1779,7 @@ def selectJobs( except Exception as x: return self._errorReport(str(x), "Expected yyyy-mm-dd string for date") else: - date = str(datetime.datetime.utcnow().date()) + date = str(DiracTime.utcnow().date()) self.log.verbose(f"Setting date to {date}") self.log.verbose(f"Will select jobs with last update {date} and following conditions") diff --git a/src/DIRAC/Interfaces/API/DiracAdmin.py b/src/DIRAC/Interfaces/API/DiracAdmin.py index adc0b657504..ae49e0c7c3e 100755 --- a/src/DIRAC/Interfaces/API/DiracAdmin.py +++ b/src/DIRAC/Interfaces/API/DiracAdmin.py @@ -5,6 +5,7 @@ """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import os from datetime import datetime, timedelta @@ -181,7 +182,7 @@ def allowSite(self, site, comment, printOutput=False, days=1): if tokenLifetime <= 0: tokenExpiration = datetime.max else: - tokenExpiration = datetime.utcnow().replace(microsecond=0) + timedelta(days=tokenLifetime) + tokenExpiration = DiracTime.utcnow().replace(microsecond=0) + timedelta(days=tokenLifetime) if not (result := self.sitestatus.setSiteStatus(site, "Active", comment, expiry=tokenExpiration))["OK"]: return result @@ -258,7 +259,7 @@ def banSite(self, site, comment, printOutput=False, days=1): if tokenLifetime <= 0: tokenExpiration = datetime.max else: - tokenExpiration = datetime.utcnow().replace(microsecond=0) + timedelta(days=tokenLifetime) + tokenExpiration = DiracTime.utcnow().replace(microsecond=0) + timedelta(days=tokenLifetime) if not (result := self.sitestatus.setSiteStatus(site, "Banned", comment, expiry=tokenExpiration))["OK"]: return result diff --git a/src/DIRAC/Interfaces/scripts/dirac_wms_job_delete.py b/src/DIRAC/Interfaces/scripts/dirac_wms_job_delete.py index a0ddc4959ea..c1debdf7ff5 100755 --- a/src/DIRAC/Interfaces/scripts/dirac_wms_job_delete.py +++ b/src/DIRAC/Interfaces/scripts/dirac_wms_job_delete.py @@ -3,6 +3,7 @@ # File : dirac-wms-job-delete # Author : Stuart Paterson ######################################################################## +from DIRAC.Core.Utilities.TimeUtilities import DiracTime """ Delete DIRAC job from WMS, if running it will be killed @@ -39,7 +40,7 @@ def main(): jFile.close() elif sw.lower() in ("g", "jobgroup"): group = value - jobDate = toString(datetime.datetime.utcnow().date() - 30 * day) + jobDate = toString(DiracTime.utcnow().date() - 30 * day) result = dirac.selectJobs(jobGroup=value, date=jobDate) if not result["OK"]: if "No jobs selected" not in result["Message"]: diff --git a/src/DIRAC/Interfaces/scripts/dirac_wms_job_get_output.py b/src/DIRAC/Interfaces/scripts/dirac_wms_job_get_output.py index b69296593ca..081125ccd26 100755 --- a/src/DIRAC/Interfaces/scripts/dirac_wms_job_get_output.py +++ b/src/DIRAC/Interfaces/scripts/dirac_wms_job_get_output.py @@ -3,6 +3,7 @@ # File : dirac-wms-job-get-output # Author : Stuart Paterson ######################################################################## +from DIRAC.Core.Utilities.TimeUtilities import DiracTime """ Retrieve output sandbox for a DIRAC job @@ -48,7 +49,7 @@ def main(): jFile.close() elif sw.lower() in ("g", "jobgroup"): group = value - jobDate = toString(datetime.datetime.utcnow().date() - 30 * day) + jobDate = toString(DiracTime.utcnow().date() - 30 * day) # Choose jobs in final state, no more than 30 days old result = dirac.selectJobs(jobGroup=value, date=jobDate, status="Done") diff --git a/src/DIRAC/Interfaces/scripts/dirac_wms_job_status.py b/src/DIRAC/Interfaces/scripts/dirac_wms_job_status.py index dd0580f5bca..f7827aa4f93 100755 --- a/src/DIRAC/Interfaces/scripts/dirac_wms_job_status.py +++ b/src/DIRAC/Interfaces/scripts/dirac_wms_job_status.py @@ -3,6 +3,7 @@ # File : dirac-wms-job-status # Author : Stuart Paterson ######################################################################## +from DIRAC.Core.Utilities.TimeUtilities import DiracTime """ Retrieve status of the given DIRAC job @@ -38,7 +39,7 @@ def main(): jobs += jFile.read().split() jFile.close() elif key.lower() in ("g", "jobgroup"): - jobDate = toString(datetime.datetime.utcnow().date() - 30 * day) + jobDate = toString(DiracTime.utcnow().date() - 30 * day) # Choose jobs no more than 30 days old result = dirac.selectJobs(jobGroup=value, date=jobDate) if not result["OK"]: diff --git a/src/DIRAC/Interfaces/scripts/doutput.py b/src/DIRAC/Interfaces/scripts/doutput.py index 991f18d327c..a3c915d8d9d 100755 --- a/src/DIRAC/Interfaces/scripts/doutput.py +++ b/src/DIRAC/Interfaces/scripts/doutput.py @@ -1,4 +1,5 @@ #!/usr/bin/env python +from DIRAC.Core.Utilities.TimeUtilities import DiracTime """ Retrieve output sandbox for a DIRAC job """ @@ -119,7 +120,7 @@ def main(): args += l.split(",") for jobGroup in params.getJobGroup(): - jobDate = toString(datetime.datetime.utcnow().date() - 30 * day) + jobDate = toString(DiracTime.utcnow().date() - 30 * day) # Choose jobs in final state, no more than 30 days old for s in ["Done", "Failed"]: diff --git a/src/DIRAC/Interfaces/scripts/dstat.py b/src/DIRAC/Interfaces/scripts/dstat.py index 8fea55274f5..2cff593c9e2 100755 --- a/src/DIRAC/Interfaces/scripts/dstat.py +++ b/src/DIRAC/Interfaces/scripts/dstat.py @@ -1,4 +1,5 @@ #!/usr/bin/env python +from DIRAC.Core.Utilities.TimeUtilities import DiracTime """ Retrieves job status according to given criteria. Example: @@ -208,7 +209,7 @@ def main(): if not jobs: # time interval - jobDate = toString(datetime.datetime.utcnow().date() - params.getJobDate() * day) + jobDate = toString(DiracTime.utcnow().date() - params.getJobDate() * day) # job owner userName = params.getUser() diff --git a/src/DIRAC/MonitoringSystem/Service/MonitoringHandler.py b/src/DIRAC/MonitoringSystem/Service/MonitoringHandler.py index bfc2e1e4247..72133535fad 100644 --- a/src/DIRAC/MonitoringSystem/Service/MonitoringHandler.py +++ b/src/DIRAC/MonitoringSystem/Service/MonitoringHandler.py @@ -10,6 +10,7 @@ """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime import os @@ -183,14 +184,14 @@ def __checkPlotRequest(self, reportRequest): return S_ERROR("Value Error") if lastSeconds < 3600: return S_ERROR("lastSeconds must be more than 3600") - now = datetime.datetime.utcnow() # this is an UTC time + now = DiracTime.utcnow() # this is an UTC time reportRequest["endTime"] = now reportRequest["startTime"] = now - datetime.timedelta(seconds=lastSeconds) else: # if end date is not there, just set it to now if not reportRequest.get("endTime"): # check the existence of the endTime it can be present and empty - reportRequest["endTime"] = datetime.datetime.utcnow() + reportRequest["endTime"] = DiracTime.utcnow() # Check keys for key in self.__reportRequestDict: if key not in reportRequest: diff --git a/src/DIRAC/RequestManagementSystem/Agent/CleanReqDBAgent.py b/src/DIRAC/RequestManagementSystem/Agent/CleanReqDBAgent.py index 18107dfbf4c..535110d2910 100644 --- a/src/DIRAC/RequestManagementSystem/Agent/CleanReqDBAgent.py +++ b/src/DIRAC/RequestManagementSystem/Agent/CleanReqDBAgent.py @@ -3,6 +3,7 @@ # Author: Krzysztof.Ciba@NOSPAMgmail.com # Date: 2013/05/17 08:31:26 ######################################################################## +from DIRAC.Core.Utilities.TimeUtilities import DiracTime """Cleaning the RequestDB from obsolete records and kicking assigned requests .. literalinclude:: ../ConfigTemplate.cfg @@ -83,7 +84,7 @@ def initialize(self): def execute(self): """execution in one cycle""" - now = datetime.datetime.utcnow() + now = DiracTime.utcnow() kickTime = now - datetime.timedelta(hours=self.KICK_GRACE_HOURS) rmTime = now - datetime.timedelta(days=self.DEL_GRACE_DAYS) @@ -145,7 +146,7 @@ def execute(self): # optional: Set Scheduled requests to Cancelled if older than threshold if self.cancelGraceDays > 0: - cancelTime = datetime.datetime.utcnow() - datetime.timedelta(days=self.cancelGraceDays) + cancelTime = DiracTime.utcnow() - datetime.timedelta(days=self.cancelGraceDays) result = self.__requestDB.getRequestIDsList(["Scheduled"], self.DEL_LIMIT) if not result["OK"]: self.log.error("Failed to get list of Scheduled requests:", result["Message"]) diff --git a/src/DIRAC/RequestManagementSystem/Client/File.py b/src/DIRAC/RequestManagementSystem/Client/File.py index dbcda08696f..7a7e4426dab 100644 --- a/src/DIRAC/RequestManagementSystem/Client/File.py +++ b/src/DIRAC/RequestManagementSystem/Client/File.py @@ -2,6 +2,7 @@ # File: File.py # Date: 2012/08/03 15:02:53 ######################################################################## +from DIRAC.Core.Utilities.TimeUtilities import DiracTime """ :mod: File @@ -144,7 +145,7 @@ def Status(self, value): updateTime = self._Status != value if updateTime and self._parent: - self._parent.LastUpdate = datetime.datetime.utcnow().replace(microsecond=0) + self._parent.LastUpdate = DiracTime.utcnow().replace(microsecond=0) self._Status = value diff --git a/src/DIRAC/RequestManagementSystem/Client/Operation.py b/src/DIRAC/RequestManagementSystem/Client/Operation.py index 03571413233..5ef9d294e74 100644 --- a/src/DIRAC/RequestManagementSystem/Client/Operation.py +++ b/src/DIRAC/RequestManagementSystem/Client/Operation.py @@ -3,6 +3,7 @@ # Date: 2012/07/24 12:12:05 ######################################################################## +from DIRAC.Core.Utilities.TimeUtilities import DiracTime """ :mod: Operation @@ -78,7 +79,7 @@ def __init__(self, fromDict=None): """ self._parent = None - now = datetime.datetime.utcnow().replace(microsecond=0) + now = DiracTime.utcnow().replace(microsecond=0) self._SubmitTime = now self._LastUpdate = now self._CreationTime = now @@ -129,7 +130,7 @@ def _notify(self): # If the status moved to Failed or Done, update the lastUpdate time if newStatus in ("Failed", "Done", "Scheduled"): if self._Status != newStatus: - self._LastUpdate = datetime.datetime.utcnow().replace(microsecond=0) + self._LastUpdate = DiracTime.utcnow().replace(microsecond=0) self._Status = newStatus if self._parent: @@ -265,7 +266,7 @@ def Status(self, value): # If the status moved to Failed or Done, update the lastUpdate time if value in ("Failed", "Done"): if self._Status != value: - self._LastUpdate = datetime.datetime.utcnow().replace(microsecond=0) + self._LastUpdate = DiracTime.utcnow().replace(microsecond=0) self._Status = value if self._parent: diff --git a/src/DIRAC/RequestManagementSystem/Client/ReqClient.py b/src/DIRAC/RequestManagementSystem/Client/ReqClient.py index d7796da1363..8410fbeb70e 100755 --- a/src/DIRAC/RequestManagementSystem/Client/ReqClient.py +++ b/src/DIRAC/RequestManagementSystem/Client/ReqClient.py @@ -6,6 +6,7 @@ """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime import json import os @@ -469,7 +470,7 @@ def resetFailedRequest(self, requestID, allR=False): op.Status = "Waiting" # Reset also NotBefore - req.NotBefore = datetime.datetime.utcnow().replace(microsecond=0) + req.NotBefore = DiracTime.utcnow().replace(microsecond=0) return self.putRequest(req) return S_OK("Not reset") diff --git a/src/DIRAC/RequestManagementSystem/Client/Request.py b/src/DIRAC/RequestManagementSystem/Client/Request.py index c3241f9ac1d..5045efa9eab 100644 --- a/src/DIRAC/RequestManagementSystem/Client/Request.py +++ b/src/DIRAC/RequestManagementSystem/Client/Request.py @@ -9,6 +9,7 @@ # Disable invalid names warning # pylint: disable=invalid-name # # imports +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime import json @@ -54,7 +55,7 @@ def __init__(self, fromDict=None): """ self.__waiting = None - now = datetime.datetime.utcnow().replace(microsecond=0) + now = DiracTime.utcnow().replace(microsecond=0) self._CreationTime = now self._SubmitTime = now @@ -316,7 +317,7 @@ def delayNextExecution(self, deltaTime): :param deltaTime: time in minutes before next execution """ - now = datetime.datetime.utcnow().replace(microsecond=0) + now = DiracTime.utcnow().replace(microsecond=0) extraDelay = datetime.timedelta(minutes=deltaTime) self._NotBefore = now + extraDelay @@ -351,7 +352,7 @@ def Status(self, value): # If the status moved to Failed or Done, update the lastUpdate time if value in ("Done", "Failed"): if value != self._Status: - self.LastUpdate = datetime.datetime.utcnow().replace(microsecond=0) + self.LastUpdate = DiracTime.utcnow().replace(microsecond=0) if value == "Done": self.Error = "" diff --git a/src/DIRAC/RequestManagementSystem/DB/RequestDB.py b/src/DIRAC/RequestManagementSystem/DB/RequestDB.py index 249363d9c7a..4fd837077b6 100644 --- a/src/DIRAC/RequestManagementSystem/DB/RequestDB.py +++ b/src/DIRAC/RequestManagementSystem/DB/RequestDB.py @@ -1,5 +1,6 @@ # We disable pylint no-callable because of https://github.com/PyCQA/pylint/issues/8138 +from DIRAC.Core.Utilities.TimeUtilities import DiracTime """Frontend for ReqDB :mod: RequestDB @@ -277,7 +278,7 @@ def cancelRequest(self, requestID): .values( { Request._Status: "Canceled", # pylint: disable=no-member - Request._LastUpdate: datetime.datetime.utcnow(), # pylint: disable=no-member + Request._LastUpdate: DiracTime.utcnow(), # pylint: disable=no-member } ) .execution_options(synchronize_session=False) @@ -400,7 +401,7 @@ def getRequest(self, reqID=0, assigned=True): return S_ERROR(f"getRequest: status of request '{reqID}' is 'Assigned', request cannot be selected") else: - now = datetime.datetime.utcnow().replace(microsecond=0) + now = DiracTime.utcnow().replace(microsecond=0) reqIDs = set() try: reqAscIDs = ( @@ -459,7 +460,7 @@ def getRequest(self, reqID=0, assigned=True): .values( { Request._Status: "Assigned", # pylint: disable=no-member - Request._LastUpdate: datetime.datetime.utcnow(), # pylint: disable=no-member + Request._LastUpdate: DiracTime.utcnow(), # pylint: disable=no-member } ) ) @@ -508,7 +509,7 @@ def getBulkRequests(self, numberOfRequest=10, assigned=True): # If we are here, the request MUST exist, so no try catch # the joinedload is to force the non-lazy loading of all the attributes, especially _parent try: - now = datetime.datetime.utcnow().replace(microsecond=0) + now = DiracTime.utcnow().replace(microsecond=0) requestIDs = ( session.query(Request.RequestID) # pylint: disable=no-member .with_for_update() @@ -543,7 +544,7 @@ def getBulkRequests(self, numberOfRequest=10, assigned=True): .values( { Request._Status: "Assigned", # pylint: disable=no-member - Request._LastUpdate: datetime.datetime.utcnow(), # pylint: disable=no-member + Request._LastUpdate: DiracTime.utcnow(), # pylint: disable=no-member } ) ) diff --git a/src/DIRAC/RequestManagementSystem/Service/ReqManagerHandler.py b/src/DIRAC/RequestManagementSystem/Service/ReqManagerHandler.py index afdd072000f..28fa3560ff6 100755 --- a/src/DIRAC/RequestManagementSystem/Service/ReqManagerHandler.py +++ b/src/DIRAC/RequestManagementSystem/Service/ReqManagerHandler.py @@ -10,6 +10,7 @@ """ # # imports +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import json import datetime import math @@ -108,7 +109,7 @@ def export_putRequest(self, requestJSON): # If NotBefore is not set or user defined, we calculate its value - now = datetime.datetime.utcnow().replace(microsecond=0) + now = DiracTime.utcnow().replace(microsecond=0) extraDelay = datetime.timedelta(0) if request.Status not in Request.FINAL_STATES and (not request.NotBefore or request.NotBefore < now): # We don't delay if it is the first insertion diff --git a/src/DIRAC/RequestManagementSystem/scripts/dirac_rms_request.py b/src/DIRAC/RequestManagementSystem/scripts/dirac_rms_request.py index 8e6c8e39190..563d5271351 100755 --- a/src/DIRAC/RequestManagementSystem/scripts/dirac_rms_request.py +++ b/src/DIRAC/RequestManagementSystem/scripts/dirac_rms_request.py @@ -1,4 +1,5 @@ #!/bin/env python +from DIRAC.Core.Utilities.TimeUtilities import DiracTime """ Show request given its ID, a jobID or a transformation and a task """ @@ -15,7 +16,7 @@ def convertDate(date): except (ValueError, TypeError): pass try: - value = datetime.datetime.utcnow() - datetime.timedelta(hours=int(24 * float(date))) + value = DiracTime.utcnow() - datetime.timedelta(hours=int(24 * float(date))) except Exception: from DIRAC import gLogger @@ -151,7 +152,7 @@ def main(): verbose = True if status: if not until: - until = datetime.datetime.utcnow() + until = DiracTime.utcnow() if not since: since = until - datetime.timedelta(hours=24) from DIRAC.RequestManagementSystem.Client.ReqClient import ReqClient diff --git a/src/DIRAC/ResourceStatusSystem/Agent/ElementInspectorAgent.py b/src/DIRAC/ResourceStatusSystem/Agent/ElementInspectorAgent.py index 0adbd643832..96dd4f356ef 100644 --- a/src/DIRAC/ResourceStatusSystem/Agent/ElementInspectorAgent.py +++ b/src/DIRAC/ResourceStatusSystem/Agent/ElementInspectorAgent.py @@ -12,6 +12,7 @@ :caption: ElementInspectorAgent options """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime import concurrent.futures @@ -94,7 +95,7 @@ def execute(self): if not res["OK"]: return res - utcnow = datetime.datetime.utcnow().replace(microsecond=0) + utcnow = DiracTime.utcnow().replace(microsecond=0) future_to_element = {} # filter elements by Type diff --git a/src/DIRAC/ResourceStatusSystem/Agent/SiteInspectorAgent.py b/src/DIRAC/ResourceStatusSystem/Agent/SiteInspectorAgent.py index ef05ed33483..85927497a69 100644 --- a/src/DIRAC/ResourceStatusSystem/Agent/SiteInspectorAgent.py +++ b/src/DIRAC/ResourceStatusSystem/Agent/SiteInspectorAgent.py @@ -10,6 +10,7 @@ :dedent: 2 :caption: SiteInspectorAgent options """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime import concurrent.futures @@ -72,7 +73,7 @@ def execute(self): It gets the sites from the Database which are eligible to be re-checked. """ - utcnow = datetime.datetime.utcnow().replace(microsecond=0) + utcnow = DiracTime.utcnow().replace(microsecond=0) future_to_element = {} # get the current status diff --git a/src/DIRAC/ResourceStatusSystem/Agent/SummarizeLogsAgent.py b/src/DIRAC/ResourceStatusSystem/Agent/SummarizeLogsAgent.py index d1cf9654050..ebb9f4cff0d 100644 --- a/src/DIRAC/ResourceStatusSystem/Agent/SummarizeLogsAgent.py +++ b/src/DIRAC/ResourceStatusSystem/Agent/SummarizeLogsAgent.py @@ -18,6 +18,7 @@ :caption: SummarizeLogsAgent options """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from datetime import datetime, timedelta from DIRAC import S_OK @@ -245,7 +246,7 @@ def _removeOldHistoryEntries(self, element, months): :return: S_OK / S_ERROR """ - toRemove = datetime.utcnow().replace(microsecond=0) - timedelta(days=30 * months) + toRemove = DiracTime.utcnow().replace(microsecond=0) - timedelta(days=30 * months) self.log.info("Removing history entries", f"older than {toRemove}") deleteResult = self.rsClient.deleteStatusElement( diff --git a/src/DIRAC/ResourceStatusSystem/Agent/TokenAgent.py b/src/DIRAC/ResourceStatusSystem/Agent/TokenAgent.py index e8374372319..51c41f907ee 100644 --- a/src/DIRAC/ResourceStatusSystem/Agent/TokenAgent.py +++ b/src/DIRAC/ResourceStatusSystem/Agent/TokenAgent.py @@ -11,6 +11,7 @@ :caption: TokenAgent options """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from datetime import datetime, timedelta from DIRAC import S_OK, S_ERROR @@ -91,7 +92,7 @@ def _getInterestingTokens(self, element): If the TokenOwner is not the rssToken ( rs_svc ), it is selected. """ - tokenExpLimit = datetime.utcnow() + timedelta(hours=self.notifyHours) + tokenExpLimit = DiracTime.utcnow() + timedelta(hours=self.notifyHours) tokenElements = self.rsClient.selectStatusElement( element, "Status", meta={"older": ["TokenExpiration", tokenExpLimit]} @@ -132,7 +133,7 @@ def _processTokens(self, element, tokenElements): return S_ERROR(e) # If token has already expired - if tokenExpiration < datetime.utcnow(): + if tokenExpiration < DiracTime.utcnow(): _msg = '%s with statusType "%s" and owner %s EXPIRED' self.log.info(_msg % (name, statusType, tokenOwner)) @@ -164,7 +165,7 @@ def _notifyOfTokens(self): among users. It ends sending notifications to the users. """ - now = datetime.utcnow() + now = DiracTime.utcnow() adminExpired = [] adminExpiring = [] diff --git a/src/DIRAC/ResourceStatusSystem/Client/ResourceStatus.py b/src/DIRAC/ResourceStatusSystem/Client/ResourceStatus.py index 648eaf1935a..032243dc851 100644 --- a/src/DIRAC/ResourceStatusSystem/Client/ResourceStatus.py +++ b/src/DIRAC/ResourceStatusSystem/Client/ResourceStatus.py @@ -6,6 +6,7 @@ """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import math from datetime import datetime, timedelta from time import sleep @@ -171,7 +172,7 @@ def __setRSSElementStatus(self, elementName, elementType, statusType, status, re Sets on the RSS the Elements status """ - expiration = datetime.utcnow() + timedelta(days=1) + expiration = DiracTime.utcnow() + timedelta(days=1) self.rssCache.acquireLock() try: diff --git a/src/DIRAC/ResourceStatusSystem/Client/SiteStatus.py b/src/DIRAC/ResourceStatusSystem/Client/SiteStatus.py index 775293a1d75..c5f139c571b 100644 --- a/src/DIRAC/ResourceStatusSystem/Client/SiteStatus.py +++ b/src/DIRAC/ResourceStatusSystem/Client/SiteStatus.py @@ -5,6 +5,7 @@ The status is kept in the RSSCache object, which is a small wrapper on top of DictCache """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import errno import math from datetime import datetime, timedelta @@ -230,7 +231,7 @@ def setSiteStatus(self, site, status, comment="No comment", expiry=None): else: return S_ERROR(f"Unable to get user proxy info {result['Message']} ") - tokenExpiration = datetime.utcnow() + timedelta(days=1) + tokenExpiration = DiracTime.utcnow() + timedelta(days=1) if expiry: tokenExpiration = expiry diff --git a/src/DIRAC/ResourceStatusSystem/Command/DowntimeCommand.py b/src/DIRAC/ResourceStatusSystem/Command/DowntimeCommand.py index aabd98e6d4e..8b19b3b19a6 100644 --- a/src/DIRAC/ResourceStatusSystem/Command/DowntimeCommand.py +++ b/src/DIRAC/ResourceStatusSystem/Command/DowntimeCommand.py @@ -3,6 +3,7 @@ GOCDB downtimes that are modified or deleted are also synced. """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import re from datetime import datetime, timedelta from operator import itemgetter @@ -87,7 +88,7 @@ def _cleanCommand(self, element, elementNames): uniformResult = [dict(zip(result["Columns"], res)) for res in result["Value"]] - currentDate = datetime.utcnow() + currentDate = DiracTime.utcnow() if not uniformResult: continue @@ -311,7 +312,7 @@ def doCache(self): uniformResult = [dict(zip(result["Columns"], res)) for res in result["Value"]] # 'targetDate' can be either now or in some 'hours' from now - targetDate = datetime.utcnow() + targetDate = DiracTime.utcnow() # dtOverlapping is a buffer to assure only one dt is returned # when there are overlapping outage/warning dt for same element diff --git a/src/DIRAC/ResourceStatusSystem/Command/FreeDiskSpaceCommand.py b/src/DIRAC/ResourceStatusSystem/Command/FreeDiskSpaceCommand.py index d194657807f..795949618ef 100644 --- a/src/DIRAC/ResourceStatusSystem/Command/FreeDiskSpaceCommand.py +++ b/src/DIRAC/ResourceStatusSystem/Command/FreeDiskSpaceCommand.py @@ -8,6 +8,7 @@ """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import errno import sys from datetime import datetime, timedelta @@ -101,7 +102,7 @@ def _storeCommand(self, results): # Stores in cache res = self.rmClient.addOrModifySpaceTokenOccupancyCache( endpoint=results["Endpoint"], - lastCheckTime=datetime.utcnow(), + lastCheckTime=DiracTime.utcnow(), free=results["Free"], total=results["Total"], token=results["ElementName"], @@ -200,7 +201,7 @@ def _cleanCommand(self, toDelete=None): toDelete = [] res = self.rmClient.selectSpaceTokenOccupancyCache( - meta={"older": ["LastCheckTime", datetime.utcnow() - timedelta(hours=6)]} + meta={"older": ["LastCheckTime", DiracTime.utcnow() - timedelta(hours=6)]} ) if not res["OK"]: return res diff --git a/src/DIRAC/ResourceStatusSystem/Command/TransferCommand.py b/src/DIRAC/ResourceStatusSystem/Command/TransferCommand.py index 4c3987d2ddd..c60c9281c8f 100644 --- a/src/DIRAC/ResourceStatusSystem/Command/TransferCommand.py +++ b/src/DIRAC/ResourceStatusSystem/Command/TransferCommand.py @@ -1,5 +1,6 @@ """ TransferCommand module """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from datetime import datetime, timedelta from DIRAC import S_OK, S_ERROR @@ -98,7 +99,7 @@ def doNew(self, masterParams=None): return params hours, name, direction, metric = params["Value"] - toD = datetime.utcnow() + toD = DiracTime.utcnow() fromD = toD - timedelta(hours=hours) # dictionary with conditions for the accounting diff --git a/src/DIRAC/ResourceStatusSystem/DB/ResourceManagementDB.py b/src/DIRAC/ResourceStatusSystem/DB/ResourceManagementDB.py index 3279ff4d515..9f35d9da3ca 100644 --- a/src/DIRAC/ResourceStatusSystem/DB/ResourceManagementDB.py +++ b/src/DIRAC/ResourceStatusSystem/DB/ResourceManagementDB.py @@ -16,6 +16,7 @@ """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime from sqlalchemy.orm import class_mapper, declarative_base from sqlalchemy.orm.query import Query @@ -76,13 +77,13 @@ def fromDict(self, dictionary): "DateEffective", self.dateeffective.replace(microsecond=0) if self.dateeffective - else datetime.datetime.utcnow().replace(microsecond=0), + else DiracTime.utcnow().replace(microsecond=0), ) self.lastchecktime = dictionary.get( "LastCheckTime", self.lastchecktime.replace(microsecond=0) if self.lastchecktime - else datetime.datetime.utcnow().replace(microsecond=0), + else DiracTime.utcnow().replace(microsecond=0), ) def toList(self): @@ -130,7 +131,7 @@ def fromDict(self, dictionary): "LastCheckTime", self.lastchecktime.replace(microsecond=0) if self.lastchecktime - else datetime.datetime.utcnow().replace(microsecond=0), + else DiracTime.utcnow().replace(microsecond=0), ) def toList(self): @@ -163,7 +164,7 @@ def fromDict(self, dictionary): "LastCheckTime", self.lastchecktime.replace(microsecond=0) if self.lastchecktime - else datetime.datetime.utcnow().replace(microsecond=0), + else DiracTime.utcnow().replace(microsecond=0), ) def toList(self): @@ -205,7 +206,7 @@ def fromDict(self, dictionary): "LastCheckTime", self.lastchecktime.replace(microsecond=0) if self.lastchecktime - else datetime.datetime.utcnow().replace(microsecond=0), + else DiracTime.utcnow().replace(microsecond=0), ) def toList(self): @@ -248,13 +249,13 @@ def fromDict(self, dictionary): "DateEffective", self.dateeffective.replace(microsecond=0) if self.dateeffective - else datetime.datetime.utcnow().replace(microsecond=0), + else DiracTime.utcnow().replace(microsecond=0), ) self.lastchecktime = dictionary.get( "LastCheckTime", self.lastchecktime.replace(microsecond=0) if self.lastchecktime - else datetime.datetime.utcnow().replace(microsecond=0), + else DiracTime.utcnow().replace(microsecond=0), ) def toList(self): @@ -302,7 +303,7 @@ def fromDict(self, dictionary): "LastCheckTime", self.lastchecktime.replace(microsecond=0) if self.lastchecktime - else datetime.datetime.utcnow().replace(microsecond=0), + else DiracTime.utcnow().replace(microsecond=0), ) def toList(self): @@ -338,7 +339,7 @@ def fromDict(self, dictionary): "LastCheckTime", self.lastchecktime.replace(microsecond=0) if self.lastchecktime - else datetime.datetime.utcnow().replace(microsecond=0), + else DiracTime.utcnow().replace(microsecond=0), ) def toList(self): @@ -423,9 +424,9 @@ def addOrModify(self, table, params): # now we assume we need to modify for columnName, columnValue in params.items(): if columnName == "LastCheckTime" and not columnValue: # we always update lastCheckTime - columnValue = datetime.datetime.utcnow().replace(microsecond=0) + columnValue = DiracTime.utcnow().replace(microsecond=0) if columnName == "DateEffective" and not columnValue: # we always update DateEffective, if there - columnValue = datetime.datetime.utcnow().replace(microsecond=0) + columnValue = DiracTime.utcnow().replace(microsecond=0) if columnValue: setattr(res, columnName.lower(), columnValue) diff --git a/src/DIRAC/ResourceStatusSystem/DB/ResourceStatusDB.py b/src/DIRAC/ResourceStatusSystem/DB/ResourceStatusDB.py index 072afab441d..b0bb06573db 100644 --- a/src/DIRAC/ResourceStatusSystem/DB/ResourceStatusDB.py +++ b/src/DIRAC/ResourceStatusSystem/DB/ResourceStatusDB.py @@ -16,6 +16,7 @@ """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime from sqlalchemy.orm import class_mapper, declarative_base from sqlalchemy.orm.query import Query @@ -72,7 +73,7 @@ def fromDict(self, dictionary): self.status = dictionary.get("Status", self.status) self.previousstatus = dictionary.get("PreviousStatus", self.previousstatus) self.statustype = dictionary.get("StatusType", self.statustype) - self.time = dictionary.get("Time", datetime.datetime.utcnow()) + self.time = dictionary.get("Time", DiracTime.utcnow()) def toList(self): """ @@ -122,7 +123,7 @@ def fromDict(self, dictionary): utcnow = ( self.lastchecktime.replace(microsecond=0) if self.lastchecktime - else datetime.datetime.utcnow().replace(microsecond=0) + else DiracTime.utcnow().replace(microsecond=0) ) self.name = dictionary.get("Name", self.name) @@ -309,7 +310,7 @@ def insert(self, table, params): """ if not params.get("DateEffective"): - params["DateEffective"] = datetime.datetime.utcnow().replace(microsecond=0) + params["DateEffective"] = DiracTime.utcnow().replace(microsecond=0) return super().insert(table, params) @@ -368,9 +369,9 @@ def addOrModify(self, table, params): for columnName, columnValue in params.items(): if columnName == "LastCheckTime" and not columnValue: # we always update lastCheckTime - columnValue = datetime.datetime.utcnow().replace(microsecond=0) + columnValue = DiracTime.utcnow().replace(microsecond=0) if changeDE and columnName == "DateEffective" and not columnValue: - columnValue = datetime.datetime.utcnow().replace(microsecond=0) + columnValue = DiracTime.utcnow().replace(microsecond=0) if columnValue: if isinstance(columnValue, datetime.datetime): columnValue = columnValue.replace(microsecond=0) diff --git a/src/DIRAC/ResourceStatusSystem/Service/PublisherHandler.py b/src/DIRAC/ResourceStatusSystem/Service/PublisherHandler.py index 7fb15a27a26..edbeba49e7c 100644 --- a/src/DIRAC/ResourceStatusSystem/Service/PublisherHandler.py +++ b/src/DIRAC/ResourceStatusSystem/Service/PublisherHandler.py @@ -6,6 +6,7 @@ """ # pylint: disable=no-self-use +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from datetime import datetime, timedelta # DIRAC @@ -231,7 +232,7 @@ def export_setToken(self, element, name, statusType, token, elementType, usernam if token == "Acquire": # nosec: B105 tokenOwner = username - tokenExpiration = datetime.utcnow() + timedelta(days=1) + tokenExpiration = DiracTime.utcnow() + timedelta(days=1) elif token == "Release": # nosec: B105 tokenOwner = "rs_svc" tokenExpiration = datetime.max @@ -353,7 +354,7 @@ def export_setStatus(self, element, name, statusType, status, elementType, usern return S_ERROR("Your selection has been modified. Please refresh.") reason = f"Status {status} forced by {username} ( web )" - tokenExpiration = datetime.utcnow() + timedelta(days=1) + tokenExpiration = DiracTime.utcnow() + timedelta(days=1) newStatus = self.rsClient.addOrModifyStatusElement( element, diff --git a/src/DIRAC/ResourceStatusSystem/Utilities/RSSCache.py b/src/DIRAC/ResourceStatusSystem/Utilities/RSSCache.py index 125a3e4a53e..0739a17bd64 100644 --- a/src/DIRAC/ResourceStatusSystem/Utilities/RSSCache.py +++ b/src/DIRAC/ResourceStatusSystem/Utilities/RSSCache.py @@ -4,6 +4,7 @@ Extension of DictCache to be used within RSS """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime import threading import time @@ -184,7 +185,7 @@ def refreshCacheAndHistory(self): refreshResult = self.refreshCache() - now = datetime.datetime.utcnow() + now = DiracTime.utcnow() if self.__rssCacheStatus: # Check oldest record diff --git a/src/DIRAC/ResourceStatusSystem/scripts/dirac_rss_query_db.py b/src/DIRAC/ResourceStatusSystem/scripts/dirac_rss_query_db.py index 73fe792f899..4cf1f8a6469 100755 --- a/src/DIRAC/ResourceStatusSystem/scripts/dirac_rss_query_db.py +++ b/src/DIRAC/ResourceStatusSystem/scripts/dirac_rss_query_db.py @@ -1,4 +1,5 @@ #!/usr/bin/env python +from DIRAC.Core.Utilities.TimeUtilities import DiracTime """ Script that dumps the DB information for the elements into the standard output. If returns information concerning the StatusType and Status attributes. @@ -120,8 +121,8 @@ def getToken(key): if not tokenExpiration["OK"]: error(tokenExpiration["Message"]) - now = datetime.datetime.utcnow() - # datetime.datetime.utcnow() + now = DiracTime.utcnow() + # DiracTime.utcnow() expirationDate = now + datetime.timedelta(seconds=tokenExpiration["Value"]) return expirationDate diff --git a/src/DIRAC/ResourceStatusSystem/scripts/dirac_rss_query_dtcache.py b/src/DIRAC/ResourceStatusSystem/scripts/dirac_rss_query_dtcache.py index 097401afcab..6464f4d3f49 100755 --- a/src/DIRAC/ResourceStatusSystem/scripts/dirac_rss_query_dtcache.py +++ b/src/DIRAC/ResourceStatusSystem/scripts/dirac_rss_query_dtcache.py @@ -1,4 +1,5 @@ #!/usr/bin/env python +from DIRAC.Core.Utilities.TimeUtilities import DiracTime """ Select/Add/Delete a new DownTime entry for a given Site or Service. """ @@ -132,7 +133,7 @@ def filterOngoing(selectOutput): downtimes = selectOutput downtimesFiltered = [] - currentDate = TimeUtilities.toEpoch(datetime.datetime.utcnow()) + currentDate = TimeUtilities.toEpoch(DiracTime.utcnow()) for dt in downtimes: dtStart = TimeUtilities.toEpoch(dt["startDate"]) diff --git a/src/DIRAC/ResourceStatusSystem/scripts/dirac_rss_set_status.py b/src/DIRAC/ResourceStatusSystem/scripts/dirac_rss_set_status.py index 5dac537107a..b525efb3cac 100755 --- a/src/DIRAC/ResourceStatusSystem/scripts/dirac_rss_set_status.py +++ b/src/DIRAC/ResourceStatusSystem/scripts/dirac_rss_set_status.py @@ -1,4 +1,5 @@ #!/usr/bin/env python +from DIRAC.Core.Utilities.TimeUtilities import DiracTime """ Script that facilitates the modification of a element through the command line. However, the usage of this script will set the element token to the command @@ -167,7 +168,7 @@ def setStatus(switchDict, tokenOwner): if tokenLifetime <= 0: tokenExpiration = datetime.max else: - tokenExpiration = datetime.utcnow().replace(microsecond=0) + timedelta(days=tokenLifetime) + tokenExpiration = DiracTime.utcnow().replace(microsecond=0) + timedelta(days=tokenLifetime) for status, statusType in elements: gLogger.debug(f"{status} {statusType}") diff --git a/src/DIRAC/ResourceStatusSystem/scripts/dirac_rss_set_token.py b/src/DIRAC/ResourceStatusSystem/scripts/dirac_rss_set_token.py index 311693eb820..10ae2a41e8a 100755 --- a/src/DIRAC/ResourceStatusSystem/scripts/dirac_rss_set_token.py +++ b/src/DIRAC/ResourceStatusSystem/scripts/dirac_rss_set_token.py @@ -1,4 +1,5 @@ #!/usr/bin/env python +from DIRAC.Core.Utilities.TimeUtilities import DiracTime """ Script that helps setting the token of the elements in RSS. It can acquire or release the token. @@ -130,7 +131,7 @@ def setToken(user): tokenExpiration = datetime.max newTokenOwner = "rs_svc" else: - tokenExpiration = datetime.utcnow().replace(microsecond=0) + timedelta(days=int(switchDict["days"])) + tokenExpiration = DiracTime.utcnow().replace(microsecond=0) + timedelta(days=int(switchDict["days"])) newTokenOwner = user gLogger.always(f"New token: {newTokenOwner} --- until {tokenExpiration}") diff --git a/src/DIRAC/Resources/Computing/BatchSystems/Host.py b/src/DIRAC/Resources/Computing/BatchSystems/Host.py index b65de5baf35..a6a9152866a 100644 --- a/src/DIRAC/Resources/Computing/BatchSystems/Host.py +++ b/src/DIRAC/Resources/Computing/BatchSystems/Host.py @@ -4,6 +4,7 @@ # Author: A.T. ######################################################################### +from DIRAC.Core.Utilities.TimeUtilities import DiracTime """ Host - class for managing jobs on a host. Host objects are invoked with LocalComputingElement or SSHComputingElement objects """ @@ -123,7 +124,7 @@ def submitJob(self, **kwargs): # Store the job info jobInfo = { "PID": pid, - "SubmissionTime": datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S"), + "SubmissionTime": DiracTime.utcnow().strftime("%Y-%m-%d %H:%M:%S"), "JOBID": stamps[_i], "NCores": nCores, } @@ -215,7 +216,7 @@ def getCEStatus(self, **kwargs): usedCores += jobInfo["NCores"] else: stamp = jobInfo["JOBID"] - jobLife = datetime.utcnow() - datetime.strptime(jobInfo["SubmissionTime"], "%Y-%m-%d %H:%M:%S") + jobLife = DiracTime.utcnow() - datetime.strptime(jobInfo["SubmissionTime"], "%Y-%m-%d %H:%M:%S") if jobLife > CLEAN_DELAY: self.__cleanJob(stamp, infoDir, workDir, outputDir, errorDir) diff --git a/src/DIRAC/Resources/Computing/CloudComputingElement.py b/src/DIRAC/Resources/Computing/CloudComputingElement.py index a95b97ed006..84095965849 100644 --- a/src/DIRAC/Resources/Computing/CloudComputingElement.py +++ b/src/DIRAC/Resources/Computing/CloudComputingElement.py @@ -1,3 +1,4 @@ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime r""" Cloud Computing Element This allows submission to cloud sites using libcloud (via the standard @@ -507,7 +508,7 @@ def cleanupPilots(self): self.log.info(f"Starting cleanup for {self.ceName}") try: maxLifetime = int(self.ceParameters.get("Context_MaxLifetime", DEF_MAXLIFETIME)) - now = datetime.datetime.utcnow() + now = DiracTime.utcnow() driver = self._getDriver() for node in driver.list_nodes(): if not node.name.startswith(VM_NAME_PREFIX): diff --git a/src/DIRAC/Resources/Computing/HTCondorCEComputingElement.py b/src/DIRAC/Resources/Computing/HTCondorCEComputingElement.py index 0f6cb63c7c7..aeba959b556 100644 --- a/src/DIRAC/Resources/Computing/HTCondorCEComputingElement.py +++ b/src/DIRAC/Resources/Computing/HTCondorCEComputingElement.py @@ -48,6 +48,7 @@ # created documentation, there should only be one slash when setting the option, # but "\n" gets rendered as a linebreak in sphinx +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime import errno import json @@ -85,7 +86,7 @@ class HTCondorCEComputingElement(ComputingElement): """ # static variables to ensure single cleanup every minute - _lastCleanupTime = datetime.datetime.utcnow() + _lastCleanupTime = DiracTime.utcnow() _cleanupLock = threading.Lock() ############################################################################# @@ -573,7 +574,7 @@ def __cleanup(self): if not HTCondorCEComputingElement._cleanupLock.acquire(False): return - now = datetime.datetime.utcnow() + now = DiracTime.utcnow() if (now - HTCondorCEComputingElement._lastCleanupTime).total_seconds() < 60: HTCondorCEComputingElement._cleanupLock.release() return diff --git a/src/DIRAC/Resources/Storage/StorageElement.py b/src/DIRAC/Resources/Storage/StorageElement.py index 6386e158abd..ea285937920 100755 --- a/src/DIRAC/Resources/Storage/StorageElement.py +++ b/src/DIRAC/Resources/Storage/StorageElement.py @@ -4,6 +4,7 @@ # # custom duty +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from copy import deepcopy import datetime import errno @@ -1317,7 +1318,7 @@ def __executeMethod(self, lfn, *args, **kwargs): for url in urlDict: urlsToUse[url] = lfnDict[urlDict[url]] - startDate = datetime.datetime.utcnow() + startDate = DiracTime.utcnow() startTime = time.time() res = fcn(urlsToUse, *args, **kwargs) elapsedTime = time.time() - startTime diff --git a/src/DIRAC/StorageManagementSystem/Agent/StageMonitorAgent.py b/src/DIRAC/StorageManagementSystem/Agent/StageMonitorAgent.py index f93d2b71363..7fb9fd8522b 100755 --- a/src/DIRAC/StorageManagementSystem/Agent/StageMonitorAgent.py +++ b/src/DIRAC/StorageManagementSystem/Agent/StageMonitorAgent.py @@ -9,6 +9,7 @@ :dedent: 2 """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime from DIRAC import gLogger, S_OK, S_ERROR, siteName @@ -86,7 +87,7 @@ def __monitorStorageElementStageRequests(self, storageElement, seReplicaIDs, rep f"StageMonitor.__monitorStorageElementStageRequests: No requests to monitor for {storageElement}." ) return - startTime = datetime.datetime.utcnow() + startTime = DiracTime.utcnow() res = StorageElement(storageElement, protocolSections=self.storagePlugins).getFileMetadata(lfnRepIDs) if not res["OK"]: gLogger.error( @@ -118,7 +119,7 @@ def __monitorStorageElementStageRequests(self, storageElement, seReplicaIDs, rep oldRequests.append(lfnRepIDs[lfn]) # only ReplicaIDs # Check if sending data operation to Monitoring - self.dataOpSender.sendData(accountingDict, startTime=startTime, endTime=datetime.datetime.utcnow()) + self.dataOpSender.sendData(accountingDict, startTime=startTime, endTime=DiracTime.utcnow()) # Update the states of the replicas in the database if terminalReplicaIDs: gLogger.info( diff --git a/src/DIRAC/TransformationSystem/Agent/InputDataAgent.py b/src/DIRAC/TransformationSystem/Agent/InputDataAgent.py index baeccc90f5f..80b5296da31 100644 --- a/src/DIRAC/TransformationSystem/Agent/InputDataAgent.py +++ b/src/DIRAC/TransformationSystem/Agent/InputDataAgent.py @@ -14,6 +14,7 @@ :dedent: 2 :caption: InputDataAgent options """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import time import datetime @@ -103,7 +104,7 @@ def execute(self): if transID in self.timeLog: if transID in self.fullTimeLog: # If it is more than a day since the last reduced query, make a full query just in case - if (datetime.datetime.utcnow() - self.fullTimeLog[transID]) < datetime.timedelta( + if (DiracTime.utcnow() - self.fullTimeLog[transID]) < datetime.timedelta( seconds=self.fullUpdatePeriod ): timeStamp = self.timeLog[transID] @@ -114,10 +115,10 @@ def execute(self): else: self.log.error("DateKey was not set in the CS, cannot use the RefreshOnly") else: - self.fullTimeLog[transID] = datetime.datetime.utcnow() - self.timeLog[transID] = datetime.datetime.utcnow() + self.fullTimeLog[transID] = DiracTime.utcnow() + self.timeLog[transID] = DiracTime.utcnow() if transID not in self.fullTimeLog: - self.fullTimeLog[transID] = datetime.datetime.utcnow() + self.fullTimeLog[transID] = DiracTime.utcnow() # Perform the query to the metadata catalog self.log.verbose("Using input data query for transformation", "%d: %s" % (transID, str(inputDataQuery))) diff --git a/src/DIRAC/TransformationSystem/Agent/TaskManagerAgentBase.py b/src/DIRAC/TransformationSystem/Agent/TaskManagerAgentBase.py index 38735809216..111cf551126 100644 --- a/src/DIRAC/TransformationSystem/Agent/TaskManagerAgentBase.py +++ b/src/DIRAC/TransformationSystem/Agent/TaskManagerAgentBase.py @@ -7,6 +7,7 @@ In case you want to further extend it you are required to follow the note on the initialize method and on the _getClients method. """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import concurrent.futures import datetime import time @@ -336,7 +337,7 @@ def updateTaskStatus(self, transDict, clients): ], ) condDict = {"TransformationID": transID, "ExternalStatus": updateStatus} - timeStamp = str(datetime.datetime.utcnow() - datetime.timedelta(minutes=10)) + timeStamp = str(DiracTime.utcnow() - datetime.timedelta(minutes=10)) # Get transformation tasks transformationTasks = clients["TransformationClient"].getTransformationTasks( @@ -408,7 +409,7 @@ def updateFileStatus(self, transDict, clients): transID = transDict["TransformationID"] method = "updateFileStatus" - timeStamp = str(datetime.datetime.utcnow() - datetime.timedelta(minutes=10)) + timeStamp = str(DiracTime.utcnow() - datetime.timedelta(minutes=10)) # get transformation files condDict = {"TransformationID": transID, "Status": ["Assigned"]} @@ -491,7 +492,7 @@ def checkReservedTasks(self, transDict, clients): # Select the tasks which have been in Reserved status for more than 1 hour for selected transformations condDict = {"TransformationID": transID, "ExternalStatus": "Reserved"} - time_stamp_older = str(datetime.datetime.utcnow() - datetime.timedelta(hours=1)) + time_stamp_older = str(DiracTime.utcnow() - datetime.timedelta(hours=1)) res = clients["TransformationClient"].getTransformationTasks(condDict=condDict, older=time_stamp_older) self._logDebug(f"getTransformationTasks({condDict}) return value:", res, method=method, transID=transID) diff --git a/src/DIRAC/TransformationSystem/Agent/TransformationAgent.py b/src/DIRAC/TransformationSystem/Agent/TransformationAgent.py index c1611a0eb9f..cda8d6c7852 100644 --- a/src/DIRAC/TransformationSystem/Agent/TransformationAgent.py +++ b/src/DIRAC/TransformationSystem/Agent/TransformationAgent.py @@ -9,6 +9,7 @@ :caption: TransformationAgent options """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from importlib import import_module import time @@ -179,7 +180,7 @@ def cleanOldTransformationCache(self, active_trans_ids: list[int]): # Since idle transformations aren't in active_trans_ids, let's filter it more # and take only files that haven't been touched for 2 month - last_update_threshold = (datetime.datetime.utcnow() - datetime.timedelta(days=60)).timestamp() + last_update_threshold = (DiracTime.utcnow() - datetime.timedelta(days=60)).timestamp() for cache_file in useless_cache_files: if Path(cache_file).stat().st_mtime < last_update_threshold: @@ -422,7 +423,7 @@ def _getTransformationFiles(self, transDict, clients, statusList=None, replicate pass # Check if something new happened - now = datetime.datetime.utcnow() + now = DiracTime.utcnow() if not kickTrans and skipIfNoNewUnused and noUnusedDelay: nextStamp = self.unusedTimeStamp.setdefault(transID, now) + datetime.timedelta(hours=noUnusedDelay) skip = now < nextStamp @@ -605,7 +606,7 @@ def _getDataReplicasDM(self, transID, lfns, clients, forJobs=True, ignoreMissing def __updateCache(self, transID, newReplicas): """Add replicas to the cache""" - self.replicaCache.setdefault(transID, {})[datetime.datetime.utcnow()] = newReplicas + self.replicaCache.setdefault(transID, {})[DiracTime.utcnow()] = newReplicas def __clearCacheForTrans(self, transID): """Remove all replicas for a transformation""" @@ -625,7 +626,7 @@ def __cleanCache(self, transID): """Cleans the cache""" try: if transID in self.replicaCache: - timeLimit = datetime.datetime.utcnow() - datetime.timedelta(days=self.replicaCacheValidity) + timeLimit = DiracTime.utcnow() - datetime.timedelta(days=self.replicaCacheValidity) for updateTime in set(self.replicaCache[transID]): nCache = len(self.replicaCache[transID][updateTime]) if updateTime < timeLimit or not nCache: diff --git a/src/DIRAC/TransformationSystem/Agent/TransformationCleaningAgent.py b/src/DIRAC/TransformationSystem/Agent/TransformationCleaningAgent.py index 34a428bf9a7..3d647ec5b38 100644 --- a/src/DIRAC/TransformationSystem/Agent/TransformationCleaningAgent.py +++ b/src/DIRAC/TransformationSystem/Agent/TransformationCleaningAgent.py @@ -9,6 +9,7 @@ """ # # imports +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import ast import errno import os @@ -213,7 +214,7 @@ def execute(self): self.log.error("Could not get the transformations", res["Message"]) # Obtain the transformations in Completed status and archive if inactive for X days - olderThanTime = datetime.utcnow() - timedelta(days=self.archiveAfter) + olderThanTime = DiracTime.utcnow() - timedelta(days=self.archiveAfter) res = self.transClient.getTransformations( {"Status": TransformationStatus.COMPLETED, "Type": self.transformationTypes}, older=olderThanTime, @@ -260,7 +261,7 @@ def finalize(self): So, we should just clean from time to time. What I added here is done only when the agent finalize, and it's quite light-ish operation anyway. """ - res = self.jobDB.getDistinctJobAttributes("JobGroup", None, datetime.utcnow() - timedelta(days=365)) + res = self.jobDB.getDistinctJobAttributes("JobGroup", None, DiracTime.utcnow() - timedelta(days=365)) if not res["OK"]: self.log.error("Failed to get job groups", res["Message"]) return res diff --git a/src/DIRAC/TransformationSystem/Service/TransformationManagerHandler.py b/src/DIRAC/TransformationSystem/Service/TransformationManagerHandler.py index 4b4652a3865..f1d0ffcf24b 100644 --- a/src/DIRAC/TransformationSystem/Service/TransformationManagerHandler.py +++ b/src/DIRAC/TransformationSystem/Service/TransformationManagerHandler.py @@ -1,5 +1,6 @@ """ Service for interacting with TransformationDB """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime from DIRAC import S_ERROR, S_OK @@ -484,7 +485,7 @@ def export_getTasksToSubmit(self, transName, numTasks, site=""): submitDict = {} # Apply a delay to avoid race conditions - older = datetime.datetime.utcnow() - datetime.timedelta(seconds=30) + older = DiracTime.utcnow() - datetime.timedelta(seconds=30) # Retrieve tasks that are ready for submission res = self.transformationDB.getTasksForSubmission( diff --git a/src/DIRAC/WorkloadManagementSystem/Agent/JobCleaningAgent.py b/src/DIRAC/WorkloadManagementSystem/Agent/JobCleaningAgent.py index 346c4e5458e..1b1121b3c5f 100644 --- a/src/DIRAC/WorkloadManagementSystem/Agent/JobCleaningAgent.py +++ b/src/DIRAC/WorkloadManagementSystem/Agent/JobCleaningAgent.py @@ -23,6 +23,7 @@ """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime import os @@ -157,7 +158,7 @@ def execute(self): condDict = dict(baseCond) if status != "Any": condDict["Status"] = status - delTime = str(datetime.datetime.utcnow() - delay * TimeUtilities.day) + delTime = str(DiracTime.utcnow() - delay * TimeUtilities.day) result = self.deleteJobsByStatus(condDict, delTime) if not result["OK"]: self.log.error("Failed to delete jobs", f"with condDict {condDict}") @@ -394,7 +395,7 @@ def removeHeartBeatLoggingInfo(self, status, delayDays): :returns: None """ self.log.info(f"Removing HeartBeatLoggingInfo for Jobs with {status} and older than {delayDays} day(s)") - delTime = str(datetime.datetime.utcnow() - delayDays * TimeUtilities.day) + delTime = str(DiracTime.utcnow() - delayDays * TimeUtilities.day) result = self.jobDB.removeInfoFromHeartBeatLogging(status, delTime, self.maxHBJobsAtOnce) if not result["OK"]: self.log.error("Failed to delete from HeartBeatLoggingInfo", result["Message"]) diff --git a/src/DIRAC/WorkloadManagementSystem/Agent/PilotStatusAgent.py b/src/DIRAC/WorkloadManagementSystem/Agent/PilotStatusAgent.py index 2a3b2ecb7b8..747bbcf0e20 100644 --- a/src/DIRAC/WorkloadManagementSystem/Agent/PilotStatusAgent.py +++ b/src/DIRAC/WorkloadManagementSystem/Agent/PilotStatusAgent.py @@ -8,6 +8,7 @@ :caption: PilotStatusAgent options """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime from DIRAC import S_OK @@ -82,7 +83,7 @@ def handleOldPilots(self, connection): """ pilotsToAccount = {} timeLimitToConsider = TimeUtilities.toString( - datetime.datetime.utcnow() - TimeUtilities.day * self.pilotStalledDays + DiracTime.utcnow() - TimeUtilities.day * self.pilotStalledDays ) result = self.pilotDB.selectPilots( {"Status": PilotStatus.PILOT_TRANSIENT_STATES}, older=timeLimitToConsider, timeStamp="LastUpdateTime" @@ -112,7 +113,7 @@ def handleOldPilots(self, connection): continue deletedJobDict = pilotsDict[pRef] deletedJobDict["Status"] = PilotStatus.DELETED - deletedJobDict["StatusDate"] = datetime.datetime.utcnow() + deletedJobDict["StatusDate"] = DiracTime.utcnow() pilotsToAccount[pRef] = deletedJobDict if len(pilotsToAccount) > 100: self.accountPilots(pilotsToAccount, connection) @@ -230,7 +231,7 @@ def _killPilots(self, acc): self.log.error("Failed to kill some pilots", result["Message"]) def _checkJobLastUpdateTime(self, joblist, StalledDays): - timeLimitToConsider = datetime.datetime.utcnow() - TimeUtilities.day * StalledDays + timeLimitToConsider = DiracTime.utcnow() - TimeUtilities.day * StalledDays ret = False for jobID in joblist: result = self.jobDB.getJobAttributes(int(jobID)) diff --git a/src/DIRAC/WorkloadManagementSystem/Agent/SiteDirector.py b/src/DIRAC/WorkloadManagementSystem/Agent/SiteDirector.py index 3519ef3b0b5..956bce9d47d 100644 --- a/src/DIRAC/WorkloadManagementSystem/Agent/SiteDirector.py +++ b/src/DIRAC/WorkloadManagementSystem/Agent/SiteDirector.py @@ -8,6 +8,7 @@ """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime import os from collections import defaultdict @@ -836,7 +837,7 @@ def _getUpdatedPilotStatus(self, pilotDict: dict[str, Any], pilotCEDict: dict[st updatedPilots = {} for pilotReference, pilotInfo in pilotDict.items(): oldStatus = pilotInfo["Status"] - sinceLastUpdate = datetime.datetime.utcnow() - pilotInfo["LastUpdateTime"] + sinceLastUpdate = DiracTime.utcnow() - pilotInfo["LastUpdateTime"] ceStatus = pilotCEDict.get(pilotReference, oldStatus) if oldStatus != ceStatus: @@ -1006,8 +1007,8 @@ def _sendPilotSubmissionAccounting( """ pA = PilotSubmissionAccounting() - pA.setStartTime(datetime.datetime.utcnow()) - pA.setEndTime(datetime.datetime.utcnow()) + pA.setStartTime(DiracTime.utcnow()) + pA.setEndTime(DiracTime.utcnow()) pA.setValueByKey("HostName", DIRAC.siteName()) pA.setValueByKey("SiteDirector", self.am_getModuleParam("agentName")) pA.setValueByKey("Site", siteName) @@ -1055,7 +1056,7 @@ def _sendPilotSubmissionMonitoring( "Status": status, "NumTotal": numTotal, "NumSucceeded": numSucceeded, - "timestamp": int(toEpochMilliSeconds(datetime.datetime.utcnow())), + "timestamp": int(toEpochMilliSeconds(DiracTime.utcnow())), } pilotMonitoringReporter.addRecord(pilotMonitoringData) diff --git a/src/DIRAC/WorkloadManagementSystem/Agent/StalledJobAgent.py b/src/DIRAC/WorkloadManagementSystem/Agent/StalledJobAgent.py index 73b081db1f4..8da57321192 100755 --- a/src/DIRAC/WorkloadManagementSystem/Agent/StalledJobAgent.py +++ b/src/DIRAC/WorkloadManagementSystem/Agent/StalledJobAgent.py @@ -9,6 +9,7 @@ :caption: StalledJobAgent options """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import concurrent.futures import datetime @@ -130,7 +131,7 @@ def execute(self): # 1) Queueing the jobs that might be marked Stalled # This is the minimum time we wait for declaring a job Stalled, therefore it is safe - checkTime = datetime.datetime.utcnow() - self.stalledTime * second + checkTime = DiracTime.utcnow() - self.stalledTime * second checkedStatuses = [JobStatus.RUNNING, JobStatus.COMPLETING] # Only get jobs whose HeartBeat is older than the stalledTime result = self.jobDB.selectJobs({"Status": checkedStatuses}, older=checkTime, timeStamp="HeartBeatTime") @@ -546,16 +547,16 @@ def _checkLoggingInfo(self, jobID, jobDict): startTime = fromString(startTime) if startTime is None: self.log.error("Wrong timestamp in DB", items[3]) - startTime = datetime.datetime.utcnow() + startTime = DiracTime.utcnow() - endTime = datetime.datetime.utcnow() + endTime = DiracTime.utcnow() # status, minor, app, stime, source for items in logList: if items[0] == "Stalled": endTime = fromString(items[3]) if endTime is None: self.log.error("Wrong timestamp in DB", items[3]) - endTime = datetime.datetime.utcnow() + endTime = DiracTime.utcnow() return startTime, endTime @@ -564,7 +565,7 @@ def _kickStuckJobs(self): message = "" - checkTime = datetime.datetime.utcnow() - self.matchedTime * second + checkTime = DiracTime.utcnow() - self.matchedTime * second result = self.jobDB.selectJobs({"Status": JobStatus.MATCHED}, older=checkTime) if not result["OK"]: self.log.error("Failed to select jobs", result["Message"]) @@ -578,7 +579,7 @@ def _kickStuckJobs(self): message = f"Failed to reschedule jobs stuck in {JobStatus.MATCHED} status" message += "\n" + result["Message"] - checkTime = datetime.datetime.utcnow() - self.rescheduledTime * second + checkTime = DiracTime.utcnow() - self.rescheduledTime * second result = self.jobDB.selectJobs({"Status": JobStatus.RESCHEDULED}, older=checkTime) if not result["OK"]: self.log.error("Failed to select jobs", result["Message"]) @@ -603,7 +604,7 @@ def _failSubmittingJobs(self): """ # Get old Submitting Jobs - checkTime = datetime.datetime.utcnow() - self.submittingTime * second + checkTime = DiracTime.utcnow() - self.submittingTime * second result = self.jobDB.selectJobs({"Status": JobStatus.SUBMITTING}, older=checkTime) if not result["OK"]: self.log.error("Failed to select jobs", result["Message"]) diff --git a/src/DIRAC/WorkloadManagementSystem/Agent/StatesAccountingAgent.py b/src/DIRAC/WorkloadManagementSystem/Agent/StatesAccountingAgent.py index 637665b0593..1140542b3ae 100644 --- a/src/DIRAC/WorkloadManagementSystem/Agent/StatesAccountingAgent.py +++ b/src/DIRAC/WorkloadManagementSystem/Agent/StatesAccountingAgent.py @@ -7,6 +7,7 @@ :dedent: 2 :caption: StatesAccountingAgent options """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime from DIRAC import S_ERROR, S_OK, gConfig @@ -89,7 +90,7 @@ def execute(self): if "Monitoring" in self.pilotMonitoringOption: self.log.info("Committing PilotsHistory to Monitoring") result = PilotAgentsDB().getSummarySnapshot() - now = datetime.datetime.utcnow() + now = DiracTime.utcnow() if not result["OK"]: self.log.error( "Can't get the PilotAgentsDB summary", @@ -113,7 +114,7 @@ def execute(self): # WMSHistory to Monitoring or Accounting self.log.info(f"Committing WMSHistory to {'and '.join(self.jobMonitoringOption)} backend") result = JobDB().getSummarySnapshot(self.__jobDBFields) - now = datetime.datetime.utcnow() + now = DiracTime.utcnow() if not result["OK"]: self.log.error("Can't get the JobDB summary", f"{result['Message']}: won't commit WMSHistory at this cycle") return S_ERROR() diff --git a/src/DIRAC/WorkloadManagementSystem/Client/JobReport.py b/src/DIRAC/WorkloadManagementSystem/Client/JobReport.py index c3c9fbd6e15..4ebd04ffa62 100644 --- a/src/DIRAC/WorkloadManagementSystem/Client/JobReport.py +++ b/src/DIRAC/WorkloadManagementSystem/Client/JobReport.py @@ -1,6 +1,7 @@ """ JobReport class encapsulates various methods of the job status reporting. It's an interface to JobStateUpdateClient, used when bulk submission is needed. """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime from collections import defaultdict @@ -31,7 +32,7 @@ def setJob(self, jobID): def setJobStatus(self, status="", minorStatus="", applicationStatus="", sendFlag=True): """Accumulate and possibly send job status information to the JobState service""" - timeStamp = str(datetime.datetime.utcnow()) + timeStamp = str(DiracTime.utcnow()) # add job status record self.jobStatusInfo.append((status.replace("'", ""), minorStatus.replace("'", ""), timeStamp)) if applicationStatus: @@ -44,7 +45,7 @@ def setJobStatus(self, status="", minorStatus="", applicationStatus="", sendFlag def setApplicationStatus(self, appStatus, sendFlag=True): """Send application status information to the JobState service for jobID""" - timeStamp = str(datetime.datetime.utcnow()) + timeStamp = str(DiracTime.utcnow()) # add Application status record if not isinstance(appStatus, str): appStatus = repr(appStatus) diff --git a/src/DIRAC/WorkloadManagementSystem/Client/JobState/CachedJobState.py b/src/DIRAC/WorkloadManagementSystem/Client/JobState/CachedJobState.py index f42d491167a..f45bc911d27 100644 --- a/src/DIRAC/WorkloadManagementSystem/Client/JobState/CachedJobState.py +++ b/src/DIRAC/WorkloadManagementSystem/Client/JobState/CachedJobState.py @@ -3,6 +3,7 @@ IIUC this is a wrapper around the JobState object. It basically tries to cache everything locally instead of going to the DB. """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import copy import datetime import time @@ -296,7 +297,7 @@ def __addLogRecord(self, majorStatus=None, minorStatus=None, appStatus=None, sou return if not source: source = "Unknown" - self.__jobLog.append([record, datetime.datetime.utcnow(), source]) + self.__jobLog.append([record, DiracTime.utcnow(), source]) def setStatus(self, majorStatus=None, minorStatus=None, appStatus=None, source=None): if majorStatus: diff --git a/src/DIRAC/WorkloadManagementSystem/DB/JobDB.py b/src/DIRAC/WorkloadManagementSystem/DB/JobDB.py index 46ca1bbe0ae..2352141312b 100755 --- a/src/DIRAC/WorkloadManagementSystem/DB/JobDB.py +++ b/src/DIRAC/WorkloadManagementSystem/DB/JobDB.py @@ -11,6 +11,7 @@ * *CompressJDLs*: Enable compression of JDLs when they are stored in the database, default *False*. """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from __future__ import annotations import datetime @@ -782,8 +783,8 @@ def insertNewJobIntoDB( vo = getVOForGroup(ownerGroup) jobAttrs = { - "LastUpdateTime": str(datetime.datetime.utcnow()), - "SubmissionTime": str(datetime.datetime.utcnow()), + "LastUpdateTime": str(DiracTime.utcnow()), + "SubmissionTime": str(DiracTime.utcnow()), "Owner": owner, "OwnerGroup": ownerGroup, "VO": vo, @@ -867,7 +868,7 @@ def insertNewJobIntoDB( retVal["Status"] = initialStatus retVal["MinorStatus"] = initialMinorStatus - retVal["TimeStamp"] = str(datetime.datetime.utcnow()) + retVal["TimeStamp"] = str(DiracTime.utcnow()) return retVal @@ -1038,8 +1039,8 @@ def rescheduleJob(self, jobID): jobAttrs["Status"] = JobStatus.RECEIVED jobAttrs["MinorStatus"] = JobMinorStatus.RESCHEDULED jobAttrs["ApplicationStatus"] = "Unknown" - jobAttrs["LastUpdateTime"] = str(datetime.datetime.utcnow()) - jobAttrs["RescheduleTime"] = str(datetime.datetime.utcnow()) + jobAttrs["LastUpdateTime"] = str(DiracTime.utcnow()) + jobAttrs["RescheduleTime"] = str(DiracTime.utcnow()) jobAttrs["VO"] = getVOForGroup(resultDict["OwnerGroup"]) reqJDL = classAdReq.asJDL() @@ -1088,7 +1089,7 @@ def getSiteSummaryWeb(self, selectDict, sortList, startItem, maxItems): del selectDict["LastUpdateTime"] result = self.getCounters("Jobs", ["Site", "Status"], {}, newer=last_update, timeStamp="LastUpdateTime") - last_day = datetime.datetime.utcnow() - datetime.timedelta(days=1) + last_day = DiracTime.utcnow() - datetime.timedelta(days=1) resultDay = self.getCounters("Jobs", ["Site", "Status"], {}, newer=last_day, timeStamp="EndExecTime") # Get the site mask status diff --git a/src/DIRAC/WorkloadManagementSystem/DB/JobLoggingDB.py b/src/DIRAC/WorkloadManagementSystem/DB/JobLoggingDB.py index f3a7862fc43..1fecc760d95 100755 --- a/src/DIRAC/WorkloadManagementSystem/DB/JobLoggingDB.py +++ b/src/DIRAC/WorkloadManagementSystem/DB/JobLoggingDB.py @@ -6,6 +6,7 @@ deleteJob() getWMSTimeStamps() """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime from DIRAC import S_ERROR, S_OK @@ -62,7 +63,7 @@ def _get_date(date): # assumes local time while we mean UTC. if not date: # Make the UTC datetime - return datetime.datetime.utcnow() + return DiracTime.utcnow() elif isinstance(date, str): # The date is provided as a string in UTC return TimeUtilities.fromString(date) @@ -79,12 +80,12 @@ def _get_date(date): _date.append(_get_date(d)) except Exception: self.log.exception("Exception while date evaluation") - _date.append(datetime.datetime.utcnow()) + _date.append(DiracTime.utcnow()) else: _date = _get_date(date) except Exception: self.log.exception("Exception while date evaluation") - _date = [datetime.datetime.utcnow()] + _date = [DiracTime.utcnow()] cmd = ( "INSERT INTO LoggingInfo (JobId, Status, MinorStatus, ApplicationStatus, " diff --git a/src/DIRAC/WorkloadManagementSystem/DB/PilotAgentsDB.py b/src/DIRAC/WorkloadManagementSystem/DB/PilotAgentsDB.py index 1097613241b..b8b466b0b57 100755 --- a/src/DIRAC/WorkloadManagementSystem/DB/PilotAgentsDB.py +++ b/src/DIRAC/WorkloadManagementSystem/DB/PilotAgentsDB.py @@ -3,6 +3,7 @@ It also registers the mapping of the DIRAC jobs to the pilot agents. """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime import decimal import threading @@ -658,7 +659,7 @@ def getPilotSummaryWeb(self, selectDict, sortList, startItem, maxItems): if not result["OK"]: return result - last_update = datetime.datetime.utcnow() - TimeUtilities.hour + last_update = DiracTime.utcnow() - TimeUtilities.hour selectDict["Status"] = PilotStatus.ABORTED resultHour = self.getCounters( "PilotAgents", @@ -670,7 +671,7 @@ def getPilotSummaryWeb(self, selectDict, sortList, startItem, maxItems): if not resultHour["OK"]: return resultHour - last_update = datetime.datetime.utcnow() - TimeUtilities.day + last_update = DiracTime.utcnow() - TimeUtilities.day selectDict["Status"] = [PilotStatus.ABORTED, PilotStatus.DONE] resultDay = self.getCounters( "PilotAgents", @@ -1088,8 +1089,8 @@ def buildSQL(self): :return: SQL query """ - lastUpdate = datetime.datetime.utcnow() - TimeUtilities.day - lastHour = datetime.datetime.utcnow() - TimeUtilities.hour + lastUpdate = DiracTime.utcnow() - TimeUtilities.day + lastHour = DiracTime.utcnow() - TimeUtilities.hour pvtable = "pivoted" innerGroupBy = ( diff --git a/src/DIRAC/WorkloadManagementSystem/FutureClient/JobStateUpdateClient.py b/src/DIRAC/WorkloadManagementSystem/FutureClient/JobStateUpdateClient.py index 6aaaa60f82a..353a33752c1 100644 --- a/src/DIRAC/WorkloadManagementSystem/FutureClient/JobStateUpdateClient.py +++ b/src/DIRAC/WorkloadManagementSystem/FutureClient/JobStateUpdateClient.py @@ -1,3 +1,4 @@ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from __future__ import annotations import functools @@ -120,7 +121,7 @@ def setJobStatus( if source: statusDict["Source"] = source if datetime_ is None: - datetime_ = datetime.utcnow() + datetime_ = DiracTime.utcnow() with DiracXClient() as api: api.jobs.set_job_statuses( {jobID: {fromString(datetime_).replace(tzinfo=timezone.utc): statusDict}}, diff --git a/src/DIRAC/WorkloadManagementSystem/JobWrapper/JobWrapper.py b/src/DIRAC/WorkloadManagementSystem/JobWrapper/JobWrapper.py index 43e72f91738..98c2622d384 100755 --- a/src/DIRAC/WorkloadManagementSystem/JobWrapper/JobWrapper.py +++ b/src/DIRAC/WorkloadManagementSystem/JobWrapper/JobWrapper.py @@ -11,6 +11,7 @@ """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import contextlib import datetime import glob @@ -664,7 +665,7 @@ def __sendFinalStdOut(self, payloadOutput: str): header = "Last {} lines of application output from JobWrapper on {} :".format( lines, - str(datetime.datetime.utcnow()), + str(DiracTime.utcnow()), ) border = "=" * len(header) diff --git a/src/DIRAC/WorkloadManagementSystem/JobWrapper/Watchdog.py b/src/DIRAC/WorkloadManagementSystem/JobWrapper/Watchdog.py index efab0daa8dc..e6b09294a21 100755 --- a/src/DIRAC/WorkloadManagementSystem/JobWrapper/Watchdog.py +++ b/src/DIRAC/WorkloadManagementSystem/JobWrapper/Watchdog.py @@ -9,6 +9,7 @@ job. """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime import errno import getpass @@ -308,7 +309,7 @@ def _performChecks(self): size = len(outputList) recentStdOut = "Last {} lines of application output from Watchdog on {} [UTC]:".format( size, - datetime.datetime.utcnow(), + DiracTime.utcnow(), ) border = "=" * len(recentStdOut) cpuTotal = f"Last reported CPU consumed for job is {hmsCPU} (h:m:s)" diff --git a/src/DIRAC/WorkloadManagementSystem/Utilities/JobStatusUtility.py b/src/DIRAC/WorkloadManagementSystem/Utilities/JobStatusUtility.py index ffdb633a2d3..c7ccdccdba1 100644 --- a/src/DIRAC/WorkloadManagementSystem/Utilities/JobStatusUtility.py +++ b/src/DIRAC/WorkloadManagementSystem/Utilities/JobStatusUtility.py @@ -1,3 +1,4 @@ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime """Utility to set the job status in the jobDB""" from __future__ import annotations @@ -70,7 +71,7 @@ def setJobStatus( if source: sDict["Source"] = source if not dateTime: - dateTime = str(datetime.utcnow()) + dateTime = str(DiracTime.utcnow()) return self.setJobStatusBulk(jobID, {dateTime: sDict}, force=force) return S_OK() diff --git a/src/DIRAC/WorkloadManagementSystem/Utilities/PilotCStoJSONSynchronizer.py b/src/DIRAC/WorkloadManagementSystem/Utilities/PilotCStoJSONSynchronizer.py index 8bc14c09f80..601c8fc32e5 100644 --- a/src/DIRAC/WorkloadManagementSystem/Utilities/PilotCStoJSONSynchronizer.py +++ b/src/DIRAC/WorkloadManagementSystem/Utilities/PilotCStoJSONSynchronizer.py @@ -5,6 +5,7 @@ The module uploads to a web server the latest version of the pilot scripts. """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime import glob import os @@ -131,7 +132,7 @@ def getCSDict(self, includeMasterCS: bool = True) -> DReturnType[Any]: """ pilotDict = { - "timestamp": datetime.datetime.utcnow().isoformat(), + "timestamp": DiracTime.utcnow().isoformat(), "CEs": {}, "GenericPilotDNs": [], } diff --git a/src/DIRAC/WorkloadManagementSystem/private/correctors/MonitoringHistoryCorrector.py b/src/DIRAC/WorkloadManagementSystem/private/correctors/MonitoringHistoryCorrector.py index 181e684b561..9c84b99f764 100644 --- a/src/DIRAC/WorkloadManagementSystem/private/correctors/MonitoringHistoryCorrector.py +++ b/src/DIRAC/WorkloadManagementSystem/private/correctors/MonitoringHistoryCorrector.py @@ -2,6 +2,7 @@ which gets resources consumption history data from the OpenSearch Monitoring database """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime from DIRAC import gLogger, S_OK @@ -34,7 +35,7 @@ def _getHistoryData(self, timeSpan, groupToUse): reportCondition["UserGroup"] = groupToUse reportCondition["grouping"] = ["User"] - now = datetime.datetime.utcnow() + now = DiracTime.utcnow() result = monitoringClient.getReport( "WMSHistory", "AverageNumberOfJobs", diff --git a/src/DIRAC/WorkloadManagementSystem/private/correctors/WMSHistoryCorrector.py b/src/DIRAC/WorkloadManagementSystem/private/correctors/WMSHistoryCorrector.py index 068adc3913c..e1a0e5a2a17 100644 --- a/src/DIRAC/WorkloadManagementSystem/private/correctors/WMSHistoryCorrector.py +++ b/src/DIRAC/WorkloadManagementSystem/private/correctors/WMSHistoryCorrector.py @@ -2,6 +2,7 @@ which gets resources consumption history data from the WMSHistory Accounting database """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime from DIRAC import gLogger, S_OK @@ -31,7 +32,7 @@ def _getHistoryData(self, timeSpan, groupToUse): else: reportGrouping = "User" reportCondition = {"UserGroup": groupToUse} - now = datetime.datetime.utcnow() + now = DiracTime.utcnow() result = reportsClient.getReport( "WMSHistory", "AverageNumberOfJobs", From b66769ef058e5f1a02fd1bbbaff2e8f34ca0681d Mon Sep 17 00:00:00 2001 From: martynia Date: Mon, 27 Jul 2026 14:56:11 +0100 Subject: [PATCH 2/7] fix: reset DiracCommon TimeUtilities changes --- dirac-common/src/DIRACCommon/Core/Utilities/TimeUtilities.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/dirac-common/src/DIRACCommon/Core/Utilities/TimeUtilities.py b/dirac-common/src/DIRACCommon/Core/Utilities/TimeUtilities.py index c7e5c2a1964..36229323588 100644 --- a/dirac-common/src/DIRACCommon/Core/Utilities/TimeUtilities.py +++ b/dirac-common/src/DIRACCommon/Core/Utilities/TimeUtilities.py @@ -23,8 +23,6 @@ import sys import time -from DIRAC.Core.Utilities.TimeUtilities import DiracTime - # Some useful constants for time operations microsecond = datetime.timedelta(microseconds=1) second = datetime.timedelta(seconds=1) @@ -113,7 +111,7 @@ def fromEpoch(epoch): epoch /= 1000**2 elif epoch > 10**11: # milliseconds epoch /= 1000 - return DiracTime.utcfromtimestamp(epoch) + return datetime.datetime.utcfromtimestamp(epoch) def toString(myDate=None): From 29d0d6a8fbeb9f065abd41524954f6e61e3ca523 Mon Sep 17 00:00:00 2001 From: martynia Date: Mon, 27 Jul 2026 16:21:54 +0100 Subject: [PATCH 3/7] fix: reformat imports (1) --- src/DIRAC/AccountingSystem/Agent/NetworkAgent.py | 2 +- src/DIRAC/AccountingSystem/DB/AccountingDB.py | 2 +- .../AccountingSystem/Service/ReportGeneratorHandler.py | 2 +- src/DIRAC/ConfigurationSystem/Client/CSAPI.py | 5 ++--- src/DIRAC/ConfigurationSystem/private/ConfigurationData.py | 2 +- src/DIRAC/ConfigurationSystem/private/Modificator.py | 2 +- .../scripts/dirac_admin_sort_cs_sites.py | 2 +- src/DIRAC/Core/Base/AgentModule.py | 2 +- src/DIRAC/Core/DISET/MessageClient.py | 2 +- src/DIRAC/Core/DISET/RequestHandler.py | 2 +- src/DIRAC/Core/DISET/ServiceReactor.py | 2 +- src/DIRAC/Core/DISET/private/Service.py | 2 +- src/DIRAC/Core/LCG/GOCDBClient.py | 2 +- src/DIRAC/Core/Security/VOMS.py | 2 +- src/DIRAC/Core/Security/m2crypto/X509Certificate.py | 2 +- src/DIRAC/Core/Tornado/Server/TornadoService.py | 2 +- src/DIRAC/Core/Tornado/Server/private/BaseRequestHandler.py | 2 +- src/DIRAC/Core/Utilities/DEncode.py | 2 +- src/DIRAC/Core/Utilities/ElasticSearchDB.py | 2 +- src/DIRAC/Core/Utilities/Graphs/BarGraph.py | 2 +- src/DIRAC/Core/Utilities/Graphs/CurveGraph.py | 2 +- src/DIRAC/Core/Utilities/Graphs/Graph.py | 2 +- src/DIRAC/Core/Utilities/Graphs/GraphData.py | 6 ++---- src/DIRAC/Core/Utilities/Graphs/GraphUtilities.py | 2 +- src/DIRAC/Core/Utilities/Graphs/LineGraph.py | 2 +- src/DIRAC/Core/Utilities/Graphs/QualityMapGraph.py | 2 +- src/DIRAC/Core/Utilities/Profiler.py | 2 +- src/DIRAC/DataManagementSystem/Agent/FTS3Agent.py | 2 +- .../Agent/RequestOperations/CheckMigration.py | 2 +- src/DIRAC/DataManagementSystem/Client/DataManager.py | 2 +- src/DIRAC/DataManagementSystem/Client/FTS3File.py | 2 +- src/DIRAC/DataManagementSystem/Client/FTS3Job.py | 2 +- src/DIRAC/DataManagementSystem/Client/FTS3Operation.py | 2 +- src/DIRAC/DataManagementSystem/DB/FTS3DB.py | 2 +- .../DB/FileCatalogComponents/FileManager/FileManagerPs.py | 2 +- .../WorkloadManagementSystem/Agent/PilotStatusAgent.py | 6 ++---- .../WorkloadManagementSystem/Utilities/JobStatusUtility.py | 2 +- 37 files changed, 40 insertions(+), 45 deletions(-) diff --git a/src/DIRAC/AccountingSystem/Agent/NetworkAgent.py b/src/DIRAC/AccountingSystem/Agent/NetworkAgent.py index 7a6221d110a..3bea53b2279 100644 --- a/src/DIRAC/AccountingSystem/Agent/NetworkAgent.py +++ b/src/DIRAC/AccountingSystem/Agent/NetworkAgent.py @@ -8,7 +8,6 @@ :caption: NetworkAgent options """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime from datetime import datetime from DIRAC import S_OK, S_ERROR, gLogger @@ -16,6 +15,7 @@ from DIRAC.AccountingSystem.Client.Types.Network import Network from DIRAC.ConfigurationSystem.Client.Config import gConfig from DIRAC.ConfigurationSystem.Client.CSAPI import CSAPI +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.Resources.MessageQueue.MQCommunication import createConsumer diff --git a/src/DIRAC/AccountingSystem/DB/AccountingDB.py b/src/DIRAC/AccountingSystem/DB/AccountingDB.py index eae61945eaf..87fd4dee9f8 100644 --- a/src/DIRAC/AccountingSystem/DB/AccountingDB.py +++ b/src/DIRAC/AccountingSystem/DB/AccountingDB.py @@ -1,4 +1,3 @@ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime """Frontend to MySQL DB AccountingDB""" import datetime @@ -11,6 +10,7 @@ from DIRAC.Core.Utilities import DEncode, List, ThreadSafe, TimeUtilities from DIRAC.Core.Utilities.Plotting.TypeLoader import TypeLoader from DIRAC.Core.Utilities.ThreadPool import ThreadPool +from DIRAC.Core.Utilities.TimeUtilities import DiracTime gSynchro = ThreadSafe.Synchronizer() diff --git a/src/DIRAC/AccountingSystem/Service/ReportGeneratorHandler.py b/src/DIRAC/AccountingSystem/Service/ReportGeneratorHandler.py index 224d3715957..43d5aea3cec 100644 --- a/src/DIRAC/AccountingSystem/Service/ReportGeneratorHandler.py +++ b/src/DIRAC/AccountingSystem/Service/ReportGeneratorHandler.py @@ -6,7 +6,6 @@ :dedent: 2 :caption: ReportGenerator options """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime import os import datetime @@ -20,6 +19,7 @@ from DIRAC.AccountingSystem.private.Policies import gPoliciesList from DIRAC.Core.Utilities.Plotting.Plots import generateErrorMessagePlot from DIRAC.Core.Utilities.Plotting.FileCoding import extractRequestFromFileId +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.ConfigurationSystem.Client import PathFinder from DIRAC.Core.DISET.RequestHandler import RequestHandler diff --git a/src/DIRAC/ConfigurationSystem/Client/CSAPI.py b/src/DIRAC/ConfigurationSystem/Client/CSAPI.py index baee7e00636..195cf68d85c 100644 --- a/src/DIRAC/ConfigurationSystem/Client/CSAPI.py +++ b/src/DIRAC/ConfigurationSystem/Client/CSAPI.py @@ -3,7 +3,6 @@ Most of these functions can only be done by administrators """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime from DIRAC import S_ERROR, S_OK, gConfig, gLogger @@ -16,6 +15,7 @@ from DIRAC.Core.Security import Locations from DIRAC.Core.Security.X509Chain import X509Chain # pylint: disable=import-error from DIRAC.Core.Utilities import List +from DIRAC.Core.Utilities.TimeUtilities import DiracTime class CSAPI: @@ -104,8 +104,7 @@ def initialize(self): self.__rpcClient = ConfigurationClient(url=gConfig.getValue("/DIRAC/Configuration/MasterServer", "")) self.__csMod = Modificator( self.__rpcClient, - "%s - %s - %s" - % (self.__userGroup, self.__userDN, DiracTime.utcnow().strftime("%Y-%m-%d %H:%M:%S")), + f"{self.__userGroup} - {self.__userDN} - {DiracTime.utcnow().strftime('%Y-%m-%d %H:%M:%S')}", ) retVal = self.downloadCSData() if not retVal["OK"]: diff --git a/src/DIRAC/ConfigurationSystem/private/ConfigurationData.py b/src/DIRAC/ConfigurationSystem/private/ConfigurationData.py index 579abc09b44..12f89ad9676 100755 --- a/src/DIRAC/ConfigurationSystem/private/ConfigurationData.py +++ b/src/DIRAC/ConfigurationSystem/private/ConfigurationData.py @@ -1,7 +1,6 @@ """ ConfigurationData module is the base for cfg files management """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime import os.path import zlib import zipfile @@ -17,6 +16,7 @@ from DIRAC.Core.Utilities import List from DIRAC.Core.Utilities.ReturnValues import S_OK, S_ERROR from DIRAC.Core.Utilities.LockRing import LockRing +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.FrameworkSystem.Client.Logger import gLogger diff --git a/src/DIRAC/ConfigurationSystem/private/Modificator.py b/src/DIRAC/ConfigurationSystem/private/Modificator.py index 48cf6b58fa3..ce5ffd75cfb 100755 --- a/src/DIRAC/ConfigurationSystem/private/Modificator.py +++ b/src/DIRAC/ConfigurationSystem/private/Modificator.py @@ -1,6 +1,5 @@ """ This is the guy that actually modifies the content of the CS """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime import difflib import zlib @@ -11,6 +10,7 @@ from DIRAC.ConfigurationSystem.Client.ConfigurationData import gConfigurationData from DIRAC.Core.Security.ProxyInfo import getProxyInfo from DIRAC.Core.Utilities import List +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.FrameworkSystem.Utilities.diracx import diracxVerifyConfig diff --git a/src/DIRAC/ConfigurationSystem/scripts/dirac_admin_sort_cs_sites.py b/src/DIRAC/ConfigurationSystem/scripts/dirac_admin_sort_cs_sites.py index 74dcab6b682..c229803257c 100755 --- a/src/DIRAC/ConfigurationSystem/scripts/dirac_admin_sort_cs_sites.py +++ b/src/DIRAC/ConfigurationSystem/scripts/dirac_admin_sort_cs_sites.py @@ -3,7 +3,6 @@ # File : dirac-admin-sort-cs-sites # Author : Matvey Sapunov ######################################################################## -from DIRAC.Core.Utilities.TimeUtilities import DiracTime """ Sort site names at CS in "/Resources" section. Sort can be alphabetic or by country postfix in a site name. Alphabetic sort is default (i.e. LCG.IHEP.cn, LCG.IHEP.su, LCG.IN2P3.fr) @@ -17,6 +16,7 @@ from DIRAC import gLogger, exit as DIRACExit from DIRAC.Core.Base.Script import Script from DIRAC.Core.Security.ProxyInfo import getProxyInfo +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.ConfigurationSystem.Client.Helpers.Registry import getPropertiesForGroup from DIRAC.ConfigurationSystem.Client.CSAPI import CSAPI diff --git a/src/DIRAC/Core/Base/AgentModule.py b/src/DIRAC/Core/Base/AgentModule.py index 268f1c1de08..c88eb0c9ad6 100644 --- a/src/DIRAC/Core/Base/AgentModule.py +++ b/src/DIRAC/Core/Base/AgentModule.py @@ -1,7 +1,6 @@ """ Base class for all agent modules """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime import importlib.metadata import inspect @@ -21,6 +20,7 @@ from DIRAC.Core.Utilities.ReturnValues import isReturnStructure from DIRAC.Core.Utilities.Shifter import setupShifterProxyInEnv from DIRAC.Core.Utilities.ThreadScheduler import gThreadScheduler +from DIRAC.Core.Utilities.TimeUtilities import DiracTime class AgentModule: diff --git a/src/DIRAC/Core/DISET/MessageClient.py b/src/DIRAC/Core/DISET/MessageClient.py index 1b961e6d07e..3a40cdb698f 100755 --- a/src/DIRAC/Core/DISET/MessageClient.py +++ b/src/DIRAC/Core/DISET/MessageClient.py @@ -1,4 +1,3 @@ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime import random import threading import datetime @@ -8,6 +7,7 @@ from DIRAC.Core.DISET.private.BaseClient import BaseClient from DIRAC.Core.DISET.private.MessageBroker import getGlobalMessageBroker from DIRAC.Core.Utilities.ReturnValues import S_OK, S_ERROR, isReturnStructure +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.Core.Utilities import Network from DIRAC.FrameworkSystem.Client.Logger import gLogger diff --git a/src/DIRAC/Core/DISET/RequestHandler.py b/src/DIRAC/Core/DISET/RequestHandler.py index d76ac2ea541..373ede2cd2e 100755 --- a/src/DIRAC/Core/DISET/RequestHandler.py +++ b/src/DIRAC/Core/DISET/RequestHandler.py @@ -1,6 +1,5 @@ """ Base class for all services """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime import os import time, datetime import psutil @@ -9,6 +8,7 @@ from DIRAC.Core.DISET.private.FileHelper import FileHelper from DIRAC.Core.Utilities.ReturnValues import S_OK, S_ERROR, isReturnStructure +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.ConfigurationSystem.Client.Config import gConfig from DIRAC.FrameworkSystem.Client.Logger import gLogger from DIRAC.Core.Security.Properties import CS_ADMINISTRATOR diff --git a/src/DIRAC/Core/DISET/ServiceReactor.py b/src/DIRAC/Core/DISET/ServiceReactor.py index 9ad4eb39e10..8c8a191bf6b 100644 --- a/src/DIRAC/Core/DISET/ServiceReactor.py +++ b/src/DIRAC/Core/DISET/ServiceReactor.py @@ -15,7 +15,6 @@ """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime import time import datetime import selectors @@ -29,6 +28,7 @@ from DIRAC.Core.DISET.private.GatewayService import GatewayService from DIRAC.Core.Base.private.ModuleLoader import ModuleLoader from DIRAC.Core.DISET.private.Protocols import gProtocolDict +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.ConfigurationSystem.Client.Helpers import Registry from DIRAC.ConfigurationSystem.Client import PathFinder diff --git a/src/DIRAC/Core/DISET/private/Service.py b/src/DIRAC/Core/DISET/private/Service.py index 6d489ae14ed..48fa9cf8f4f 100644 --- a/src/DIRAC/Core/DISET/private/Service.py +++ b/src/DIRAC/Core/DISET/private/Service.py @@ -8,7 +8,6 @@ # pylint: skip-file # __searchInitFunctions gives RuntimeError: maximum recursion depth exceeded -from DIRAC.Core.Utilities.TimeUtilities import DiracTime import os import time import datetime @@ -30,6 +29,7 @@ from DIRAC.Core.Utilities.DErrno import ENOAUTH from DIRAC.Core.Utilities.ReturnValues import isReturnStructure from DIRAC.Core.Utilities.ThreadScheduler import gThreadScheduler +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.FrameworkSystem.Client.SecurityLogClient import SecurityLogClient diff --git a/src/DIRAC/Core/LCG/GOCDBClient.py b/src/DIRAC/Core/LCG/GOCDBClient.py index 386bbcf1b31..6f1f3aca6a9 100644 --- a/src/DIRAC/Core/LCG/GOCDBClient.py +++ b/src/DIRAC/Core/LCG/GOCDBClient.py @@ -3,7 +3,6 @@ WARN: the URL of the GOC DB API is hardcoded, and is: https://goc.egi.eu/gocdbpi/public/ """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime import socket import time from datetime import datetime, timedelta @@ -14,6 +13,7 @@ from DIRAC import S_ERROR, S_OK, gLogger from DIRAC.Core.Security.Locations import getCAsLocation +from DIRAC.Core.Utilities.TimeUtilities import DiracTime def _parseSingleElement(element, attributes=None): diff --git a/src/DIRAC/Core/Security/VOMS.py b/src/DIRAC/Core/Security/VOMS.py index 1989cf71a62..97ac5f53122 100644 --- a/src/DIRAC/Core/Security/VOMS.py +++ b/src/DIRAC/Core/Security/VOMS.py @@ -1,7 +1,6 @@ """ Module for dealing with VOMS (Virtual Organization Membership Service) """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime from datetime import datetime import os import tempfile @@ -13,6 +12,7 @@ from DIRAC.Core.Security.ProxyFile import multiProxyArgument, deleteMultiProxy from DIRAC.Core.Security.X509Chain import X509Chain # pylint: disable=import-error from DIRAC.Core.Utilities.Subprocess import systemCall +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.Core.Utilities import List # This is a variable so it can be monkeypatched in tests diff --git a/src/DIRAC/Core/Security/m2crypto/X509Certificate.py b/src/DIRAC/Core/Security/m2crypto/X509Certificate.py index a96f1381b8e..00e88a242ea 100644 --- a/src/DIRAC/Core/Security/m2crypto/X509Certificate.py +++ b/src/DIRAC/Core/Security/m2crypto/X509Certificate.py @@ -5,7 +5,6 @@ X509RFC: https://tools.ietf.org/html/rfc5280 """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime import os import secrets @@ -21,6 +20,7 @@ from DIRAC.ConfigurationSystem.Client.Helpers import Registry from DIRAC.Core.Security.m2crypto import asn1_utils, DEFAULT_PROXY_STRENGTH from DIRAC.Core.Utilities.Decorators import executeOnlyIf +from DIRAC.Core.Utilities.TimeUtilities import DiracTime # Decorator to execute the method only of the certificate has been loaded executeOnlyIfCertLoaded = executeOnlyIf("_certLoaded", S_ERROR(DErrno.ENOCERT)) diff --git a/src/DIRAC/Core/Tornado/Server/TornadoService.py b/src/DIRAC/Core/Tornado/Server/TornadoService.py index 2e795f9abcb..e76900c96ab 100644 --- a/src/DIRAC/Core/Tornado/Server/TornadoService.py +++ b/src/DIRAC/Core/Tornado/Server/TornadoService.py @@ -4,7 +4,6 @@ """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime import os from datetime import datetime from tornado.web import url as TornadoURL @@ -13,6 +12,7 @@ from DIRAC import gLogger, S_OK from DIRAC.Core.Tornado.Server.private.BaseRequestHandler import BaseRequestHandler +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.ConfigurationSystem.Client import PathFinder diff --git a/src/DIRAC/Core/Tornado/Server/private/BaseRequestHandler.py b/src/DIRAC/Core/Tornado/Server/private/BaseRequestHandler.py index 0ff667d5a2c..2aa815c5e36 100644 --- a/src/DIRAC/Core/Tornado/Server/private/BaseRequestHandler.py +++ b/src/DIRAC/Core/Tornado/Server/private/BaseRequestHandler.py @@ -4,7 +4,6 @@ This module is basic for each of these components and describes the basic concept of access to them. """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime import time import inspect import threading @@ -25,6 +24,7 @@ from DIRAC.Core.Utilities.JEncode import decode, encode from DIRAC.Core.Utilities import Network, TimeUtilities from DIRAC.Core.Utilities.ReturnValues import isReturnStructure +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.Core.Security.X509Chain import X509Chain # pylint: disable=import-error from DIRAC.Resources.IdProvider.Utilities import getIdProviderIdentifiers from DIRAC.Resources.IdProvider.IdProviderFactory import IdProviderFactory diff --git a/src/DIRAC/Core/Utilities/DEncode.py b/src/DIRAC/Core/Utilities/DEncode.py index cc8f3a50490..2686b598065 100755 --- a/src/DIRAC/Core/Utilities/DEncode.py +++ b/src/DIRAC/Core/Utilities/DEncode.py @@ -11,7 +11,6 @@ t -> tuple d -> dictionary """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime import os @@ -23,6 +22,7 @@ from pprint import pformat from DIRAC import gLogger +from DIRAC.Core.Utilities.TimeUtilities import DiracTime def _ord(char): diff --git a/src/DIRAC/Core/Utilities/ElasticSearchDB.py b/src/DIRAC/Core/Utilities/ElasticSearchDB.py index dc4d83581af..32929886d60 100644 --- a/src/DIRAC/Core/Utilities/ElasticSearchDB.py +++ b/src/DIRAC/Core/Utilities/ElasticSearchDB.py @@ -3,13 +3,13 @@ It is used to query Opensearch instances. """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime import copy import functools import json import time from datetime import datetime, timedelta from urllib import parse as urlparse +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import certifi from opensearchpy import OpenSearch diff --git a/src/DIRAC/Core/Utilities/Graphs/BarGraph.py b/src/DIRAC/Core/Utilities/Graphs/BarGraph.py index d43f45825e3..2ffd9667039 100644 --- a/src/DIRAC/Core/Utilities/Graphs/BarGraph.py +++ b/src/DIRAC/Core/Utilities/Graphs/BarGraph.py @@ -4,7 +4,6 @@ The DIRAC Graphs package is derived from the GraphTool plotting package of the CMS/Phedex Project by ... """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime from pylab import setp @@ -19,6 +18,7 @@ PrettyDateFormatter, PrettyScalarFormatter, ) +from DIRAC.Core.Utilities.TimeUtilities import DiracTime class BarGraph(PlotBase): diff --git a/src/DIRAC/Core/Utilities/Graphs/CurveGraph.py b/src/DIRAC/Core/Utilities/Graphs/CurveGraph.py index deb484132a8..efa2c1ff255 100644 --- a/src/DIRAC/Core/Utilities/Graphs/CurveGraph.py +++ b/src/DIRAC/Core/Utilities/Graphs/CurveGraph.py @@ -3,7 +3,6 @@ The DIRAC Graphs package is derived from the GraphTool plotting package of the CMS/Phedex Project by ... """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.Core.Utilities.Graphs.PlotBase import PlotBase from DIRAC.Core.Utilities.Graphs.GraphUtilities import ( darkenColor, @@ -12,6 +11,7 @@ PrettyDateFormatter, PrettyScalarFormatter, ) +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from matplotlib.lines import Line2D from matplotlib.dates import date2num import datetime diff --git a/src/DIRAC/Core/Utilities/Graphs/Graph.py b/src/DIRAC/Core/Utilities/Graphs/Graph.py index 9ec9a1434eb..db23e5687b1 100644 --- a/src/DIRAC/Core/Utilities/Graphs/Graph.py +++ b/src/DIRAC/Core/Utilities/Graphs/Graph.py @@ -5,7 +5,6 @@ CMS/Phedex Project by ... """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime import importlib import os @@ -17,6 +16,7 @@ from DIRAC.Core.Utilities.Graphs.GraphData import GraphData from DIRAC.Core.Utilities.Graphs.GraphUtilities import add_time_to_title, evalPrefs, pixelToPoint, to_timestamp from DIRAC.Core.Utilities.Graphs.Legend import Legend +from DIRAC.Core.Utilities.TimeUtilities import DiracTime DEBUG = 0 diff --git a/src/DIRAC/Core/Utilities/Graphs/GraphData.py b/src/DIRAC/Core/Utilities/Graphs/GraphData.py index 8868de4b9d4..8cd2be3ae27 100644 --- a/src/DIRAC/Core/Utilities/Graphs/GraphData.py +++ b/src/DIRAC/Core/Utilities/Graphs/GraphData.py @@ -4,7 +4,6 @@ CMS/Phedex Project by ... """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime import time import datetime import numpy @@ -12,6 +11,7 @@ from matplotlib.dates import date2num from DIRAC.Core.Utilities.Graphs.GraphUtilities import to_timestamp, pretty_float +from DIRAC.Core.Utilities.TimeUtilities import DiracTime DEBUG = 0 @@ -195,9 +195,7 @@ def makeNumKeys(self): self.all_num_keys.append(next) next += 1 elif self.key_type == "time": - self.all_num_keys = [ - date2num(DiracTime.utcfromtimestamp(to_timestamp(key))) for key in self.all_keys - ] + self.all_num_keys = [date2num(DiracTime.utcfromtimestamp(to_timestamp(key))) for key in self.all_keys] elif self.key_type == "numeric": self.all_num_keys = [float(key) for key in self.all_keys] diff --git a/src/DIRAC/Core/Utilities/Graphs/GraphUtilities.py b/src/DIRAC/Core/Utilities/Graphs/GraphUtilities.py index 3300b4b94a9..096053aadbf 100644 --- a/src/DIRAC/Core/Utilities/Graphs/GraphUtilities.py +++ b/src/DIRAC/Core/Utilities/Graphs/GraphUtilities.py @@ -4,7 +4,6 @@ The DIRAC Graphs package is derived from the GraphTool plotting package of the CMS/Phedex Project by ... """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime import os import time import datetime @@ -30,6 +29,7 @@ ) from dateutil.relativedelta import relativedelta from DIRAC.Core.Utilities.SaferEval import saferEval +from DIRAC.Core.Utilities.TimeUtilities import DiracTime # This is a hack to workaround the use of float(ScalarFormatter.__call__(...)) rcParams["axes.unicode_minus"] = False diff --git a/src/DIRAC/Core/Utilities/Graphs/LineGraph.py b/src/DIRAC/Core/Utilities/Graphs/LineGraph.py index 8d859d35894..dca3dfc6cc8 100644 --- a/src/DIRAC/Core/Utilities/Graphs/LineGraph.py +++ b/src/DIRAC/Core/Utilities/Graphs/LineGraph.py @@ -4,7 +4,6 @@ The DIRAC Graphs package is derived from the GraphTool plotting package of the CMS/Phedex Project by ... """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.Core.Utilities.Graphs.PlotBase import PlotBase from DIRAC.Core.Utilities.Graphs.GraphUtilities import ( to_timestamp, @@ -12,6 +11,7 @@ PrettyDateFormatter, PrettyScalarFormatter, ) +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from matplotlib.patches import Polygon from matplotlib.dates import date2num import datetime diff --git a/src/DIRAC/Core/Utilities/Graphs/QualityMapGraph.py b/src/DIRAC/Core/Utilities/Graphs/QualityMapGraph.py index b22b5c1efdc..3789419f356 100644 --- a/src/DIRAC/Core/Utilities/Graphs/QualityMapGraph.py +++ b/src/DIRAC/Core/Utilities/Graphs/QualityMapGraph.py @@ -4,7 +4,6 @@ CMS/Phedex Project by ... """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime from pylab import setp from matplotlib.colors import Normalize @@ -21,6 +20,7 @@ PrettyDateFormatter, PrettyScalarFormatter, ) +from DIRAC.Core.Utilities.TimeUtilities import DiracTime cdict = { "red": ((0.0, 1.0, 1.0), (0.5, 0.0, 0.0), (1.0, 0.0, 0.0)), diff --git a/src/DIRAC/Core/Utilities/Profiler.py b/src/DIRAC/Core/Utilities/Profiler.py index a5f2f806f9a..6948d3d893e 100644 --- a/src/DIRAC/Core/Utilities/Profiler.py +++ b/src/DIRAC/Core/Utilities/Profiler.py @@ -1,13 +1,13 @@ """ Profiling class for updated information on process status """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime import errno import psutil from DIRAC import gLogger, S_OK, S_ERROR from DIRAC.Core.Utilities.DErrno import EEZOMBIE, EENOPID, EEEXCEPTION +from DIRAC.Core.Utilities.TimeUtilities import DiracTime def checkInvocation(func): diff --git a/src/DIRAC/DataManagementSystem/Agent/FTS3Agent.py b/src/DIRAC/DataManagementSystem/Agent/FTS3Agent.py index d2a89dd4d07..c509ff53c85 100644 --- a/src/DIRAC/DataManagementSystem/Agent/FTS3Agent.py +++ b/src/DIRAC/DataManagementSystem/Agent/FTS3Agent.py @@ -11,7 +11,6 @@ """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime import errno import os @@ -32,6 +31,7 @@ from DIRAC.Core.Base.AgentModule import AgentModule from DIRAC.Core.Utilities.DErrno import cmpError from DIRAC.Core.Utilities.DictCache import DictCache +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.Core.Utilities.TimeUtilities import fromString from DIRAC.DataManagementSystem.Client.FTS3Job import FTS3Job from DIRAC.DataManagementSystem.DB.FTS3DB import FTS3DB diff --git a/src/DIRAC/DataManagementSystem/Agent/RequestOperations/CheckMigration.py b/src/DIRAC/DataManagementSystem/Agent/RequestOperations/CheckMigration.py index 9d089064112..bf5c750cf8c 100644 --- a/src/DIRAC/DataManagementSystem/Agent/RequestOperations/CheckMigration.py +++ b/src/DIRAC/DataManagementSystem/Agent/RequestOperations/CheckMigration.py @@ -1,10 +1,10 @@ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime """Ensure the files have been migrated to tape.""" import datetime from pprint import pformat from DIRAC import S_OK, S_ERROR from DIRAC.Core.Utilities.ReturnValues import returnSingleResult +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.RequestManagementSystem.private.OperationHandlerBase import OperationHandlerBase from DIRAC.Resources.Storage.StorageElement import StorageElement diff --git a/src/DIRAC/DataManagementSystem/Client/DataManager.py b/src/DIRAC/DataManagementSystem/Client/DataManager.py index c1b96a1af7e..38979636998 100644 --- a/src/DIRAC/DataManagementSystem/Client/DataManager.py +++ b/src/DIRAC/DataManagementSystem/Client/DataManager.py @@ -10,7 +10,6 @@ """ # # imports -from DIRAC.Core.Utilities.TimeUtilities import DiracTime import errno import fnmatch import os @@ -25,6 +24,7 @@ from DIRAC.Core.Utilities.File import makeGuid, getSize from DIRAC.Core.Utilities.List import randomize from DIRAC.Core.Utilities.ReturnValues import returnSingleResult +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.Core.Security.ProxyInfo import getProxyInfo from DIRAC.Core.Security.ProxyInfo import getVOfromProxyGroup from DIRAC.ConfigurationSystem.Client.Helpers.Operations import Operations diff --git a/src/DIRAC/DataManagementSystem/Client/FTS3File.py b/src/DIRAC/DataManagementSystem/Client/FTS3File.py index 6c43075f58a..048659e31ac 100644 --- a/src/DIRAC/DataManagementSystem/Client/FTS3File.py +++ b/src/DIRAC/DataManagementSystem/Client/FTS3File.py @@ -1,6 +1,6 @@ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime from DIRAC.Core.Utilities.JEncode import JSerializable +from DIRAC.Core.Utilities.TimeUtilities import DiracTime class FTS3File(JSerializable): diff --git a/src/DIRAC/DataManagementSystem/Client/FTS3Job.py b/src/DIRAC/DataManagementSystem/Client/FTS3Job.py index 912b798f9b0..b534b212332 100644 --- a/src/DIRAC/DataManagementSystem/Client/FTS3Job.py +++ b/src/DIRAC/DataManagementSystem/Client/FTS3Job.py @@ -1,4 +1,3 @@ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime """FTS3Job module containing only the FTS3Job class""" import datetime @@ -39,6 +38,7 @@ from DIRAC.Core.Utilities.DErrno import cmpError from DIRAC.Core.Utilities.JEncode import JSerializable +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.DataManagementSystem.Client.FTS3File import FTS3File # 3 days in seconds diff --git a/src/DIRAC/DataManagementSystem/Client/FTS3Operation.py b/src/DIRAC/DataManagementSystem/Client/FTS3Operation.py index e71cdb8eb01..e82008036f3 100644 --- a/src/DIRAC/DataManagementSystem/Client/FTS3Operation.py +++ b/src/DIRAC/DataManagementSystem/Client/FTS3Operation.py @@ -1,4 +1,3 @@ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime import errno import json @@ -22,6 +21,7 @@ from DIRAC.ResourceStatusSystem.Client.ResourceStatus import ResourceStatus from DIRAC.DataManagementSystem.Client.FTS3File import FTS3File from DIRAC.Core.Utilities.JEncode import JSerializable +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.RequestManagementSystem.Client.ReqClient import ReqClient from DIRAC.RequestManagementSystem.Client.Operation import Operation as rmsOperation diff --git a/src/DIRAC/DataManagementSystem/DB/FTS3DB.py b/src/DIRAC/DataManagementSystem/DB/FTS3DB.py index 988e8b32667..f00693127b7 100644 --- a/src/DIRAC/DataManagementSystem/DB/FTS3DB.py +++ b/src/DIRAC/DataManagementSystem/DB/FTS3DB.py @@ -1,4 +1,3 @@ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime """Frontend to FTS3 MySQL DB. Written using sqlalchemy""" # We disable the no-member error because @@ -36,6 +35,7 @@ # # from DIRAC from DIRAC import S_ERROR, S_OK, gLogger from DIRAC.ConfigurationSystem.Client.Utilities import getDBParameters +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.DataManagementSystem.Client.FTS3File import FTS3File from DIRAC.DataManagementSystem.Client.FTS3Job import FTS3Job from DIRAC.DataManagementSystem.Client.FTS3Operation import FTS3Operation, FTS3StagingOperation, FTS3TransferOperation diff --git a/src/DIRAC/DataManagementSystem/DB/FileCatalogComponents/FileManager/FileManagerPs.py b/src/DIRAC/DataManagementSystem/DB/FileCatalogComponents/FileManager/FileManagerPs.py index 417b6f510f1..dd4ded43925 100755 --- a/src/DIRAC/DataManagementSystem/DB/FileCatalogComponents/FileManager/FileManagerPs.py +++ b/src/DIRAC/DataManagementSystem/DB/FileCatalogComponents/FileManager/FileManagerPs.py @@ -1,4 +1,3 @@ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime """FileManager for ... ?""" import os @@ -7,6 +6,7 @@ from DIRAC import S_OK, S_ERROR from DIRAC.DataManagementSystem.DB.FileCatalogComponents.FileManager.FileManagerBase import FileManagerBase from DIRAC.Core.Utilities.List import stringListToString, intListToString, breakListIntoChunks +from DIRAC.Core.Utilities.TimeUtilities import DiracTime # The logic of some methods is basically a copy/paste from the FileManager class, # so I could have inherited from it. However, I did not want to depend on it diff --git a/src/DIRAC/WorkloadManagementSystem/Agent/PilotStatusAgent.py b/src/DIRAC/WorkloadManagementSystem/Agent/PilotStatusAgent.py index 747bbcf0e20..9bb9e128439 100644 --- a/src/DIRAC/WorkloadManagementSystem/Agent/PilotStatusAgent.py +++ b/src/DIRAC/WorkloadManagementSystem/Agent/PilotStatusAgent.py @@ -8,7 +8,6 @@ :caption: PilotStatusAgent options """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime from DIRAC import S_OK @@ -17,6 +16,7 @@ from DIRAC.ConfigurationSystem.Client.Helpers.Resources import getCESiteMapping from DIRAC.Core.Base.AgentModule import AgentModule from DIRAC.Core.Utilities import TimeUtilities +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.WorkloadManagementSystem.Client import PilotStatus from DIRAC.WorkloadManagementSystem.DB.JobDB import JobDB from DIRAC.WorkloadManagementSystem.DB.PilotAgentsDB import PilotAgentsDB @@ -82,9 +82,7 @@ def handleOldPilots(self, connection): Deleted, accounting for them. """ pilotsToAccount = {} - timeLimitToConsider = TimeUtilities.toString( - DiracTime.utcnow() - TimeUtilities.day * self.pilotStalledDays - ) + timeLimitToConsider = TimeUtilities.toString(DiracTime.utcnow() - TimeUtilities.day * self.pilotStalledDays) result = self.pilotDB.selectPilots( {"Status": PilotStatus.PILOT_TRANSIENT_STATES}, older=timeLimitToConsider, timeStamp="LastUpdateTime" ) diff --git a/src/DIRAC/WorkloadManagementSystem/Utilities/JobStatusUtility.py b/src/DIRAC/WorkloadManagementSystem/Utilities/JobStatusUtility.py index c7ccdccdba1..4b2bfd03902 100644 --- a/src/DIRAC/WorkloadManagementSystem/Utilities/JobStatusUtility.py +++ b/src/DIRAC/WorkloadManagementSystem/Utilities/JobStatusUtility.py @@ -1,4 +1,3 @@ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime """Utility to set the job status in the jobDB""" from __future__ import annotations @@ -9,6 +8,7 @@ from DIRAC import S_ERROR, S_OK, gLogger from DIRAC.Core.Utilities import TimeUtilities from DIRAC.Core.Utilities.ObjectLoader import ObjectLoader +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.WorkloadManagementSystem.Client import JobStatus from DIRACCommon.WorkloadManagementSystem.Utilities.JobStatusUtility import getStartAndEndTime, getNewStatus From 18507beeaf8624776a7647e8165730d5a372013c Mon Sep 17 00:00:00 2001 From: martynia Date: Mon, 27 Jul 2026 17:28:55 +0100 Subject: [PATCH 4/7] fix: reformat imports (2) --- src/DIRAC/DataManagementSystem/scripts/dirac_dms_user_lfns.py | 1 + .../FrameworkSystem/Service/SystemAdministratorHandler.py | 2 +- .../FrameworkSystem/scripts/dirac_admin_users_with_proxy.py | 2 +- src/DIRAC/Interfaces/scripts/dirac_wms_job_delete.py | 3 +-- src/DIRAC/Interfaces/scripts/dirac_wms_job_get_output.py | 2 +- src/DIRAC/Interfaces/scripts/dirac_wms_job_status.py | 3 +-- src/DIRAC/Interfaces/scripts/doutput.py | 2 +- src/DIRAC/Interfaces/scripts/dstat.py | 2 +- src/DIRAC/RequestManagementSystem/Agent/CleanReqDBAgent.py | 3 ++- src/DIRAC/RequestManagementSystem/Client/File.py | 3 ++- src/DIRAC/RequestManagementSystem/Client/Operation.py | 3 +-- src/DIRAC/RequestManagementSystem/DB/RequestDB.py | 3 +-- .../RequestManagementSystem/scripts/dirac_rms_request.py | 2 +- src/DIRAC/ResourceStatusSystem/scripts/dirac_rss_query_db.py | 2 +- .../ResourceStatusSystem/scripts/dirac_rss_query_dtcache.py | 2 +- .../ResourceStatusSystem/scripts/dirac_rss_set_status.py | 2 +- src/DIRAC/ResourceStatusSystem/scripts/dirac_rss_set_token.py | 2 +- src/DIRAC/Resources/Computing/BatchSystems/Host.py | 4 +++- src/DIRAC/Resources/Computing/CloudComputingElement.py | 2 +- 19 files changed, 23 insertions(+), 22 deletions(-) diff --git a/src/DIRAC/DataManagementSystem/scripts/dirac_dms_user_lfns.py b/src/DIRAC/DataManagementSystem/scripts/dirac_dms_user_lfns.py index 117a97fe022..ee4a567f316 100755 --- a/src/DIRAC/DataManagementSystem/scripts/dirac_dms_user_lfns.py +++ b/src/DIRAC/DataManagementSystem/scripts/dirac_dms_user_lfns.py @@ -1,5 +1,6 @@ #!/usr/bin/env python from DIRAC.Core.Utilities.TimeUtilities import DiracTime + """ Get the list of all the user files. diff --git a/src/DIRAC/FrameworkSystem/Service/SystemAdministratorHandler.py b/src/DIRAC/FrameworkSystem/Service/SystemAdministratorHandler.py index 6ae701c9bb6..c4aab36b5a7 100644 --- a/src/DIRAC/FrameworkSystem/Service/SystemAdministratorHandler.py +++ b/src/DIRAC/FrameworkSystem/Service/SystemAdministratorHandler.py @@ -1,4 +1,3 @@ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime """SystemAdministrator service is a tool to control and monitor the DIRAC services and agents""" import importlib @@ -28,6 +27,7 @@ from DIRAC.Core.Utilities.Subprocess import systemCall from DIRAC.Core.Utilities.ThreadScheduler import gThreadScheduler from DIRAC.Core.Utilities.TimeUtilities import day, fromString, hour +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.FrameworkSystem.Client.ComponentInstaller import gComponentInstaller from DIRAC.FrameworkSystem.Client.ComponentMonitoringClient import ComponentMonitoringClient diff --git a/src/DIRAC/FrameworkSystem/scripts/dirac_admin_users_with_proxy.py b/src/DIRAC/FrameworkSystem/scripts/dirac_admin_users_with_proxy.py index 4c5fdd143ca..b4c5db6542e 100755 --- a/src/DIRAC/FrameworkSystem/scripts/dirac_admin_users_with_proxy.py +++ b/src/DIRAC/FrameworkSystem/scripts/dirac_admin_users_with_proxy.py @@ -1,5 +1,4 @@ #!/usr/bin/env python -from DIRAC.Core.Utilities.TimeUtilities import DiracTime """ Print list of users with proxies. @@ -23,6 +22,7 @@ import DIRAC from DIRAC.Core.Base.Script import Script from DIRAC.Core.Utilities import TimeUtilities +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.FrameworkSystem.Client.ProxyManagerClient import gProxyManager diff --git a/src/DIRAC/Interfaces/scripts/dirac_wms_job_delete.py b/src/DIRAC/Interfaces/scripts/dirac_wms_job_delete.py index c1debdf7ff5..8dc65514908 100755 --- a/src/DIRAC/Interfaces/scripts/dirac_wms_job_delete.py +++ b/src/DIRAC/Interfaces/scripts/dirac_wms_job_delete.py @@ -3,7 +3,6 @@ # File : dirac-wms-job-delete # Author : Stuart Paterson ######################################################################## -from DIRAC.Core.Utilities.TimeUtilities import DiracTime """ Delete DIRAC job from WMS, if running it will be killed @@ -11,8 +10,8 @@ $ dirac-wms-job-delete 12 Deleted job 12 """ -import datetime import os.path +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.Core.Base.Script import Script diff --git a/src/DIRAC/Interfaces/scripts/dirac_wms_job_get_output.py b/src/DIRAC/Interfaces/scripts/dirac_wms_job_get_output.py index 081125ccd26..797ae3ec932 100755 --- a/src/DIRAC/Interfaces/scripts/dirac_wms_job_get_output.py +++ b/src/DIRAC/Interfaces/scripts/dirac_wms_job_get_output.py @@ -3,7 +3,6 @@ # File : dirac-wms-job-get-output # Author : Stuart Paterson ######################################################################## -from DIRAC.Core.Utilities.TimeUtilities import DiracTime """ Retrieve output sandbox for a DIRAC job @@ -14,6 +13,7 @@ import os import shutil import datetime +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import DIRAC from DIRAC.Core.Base.Script import Script diff --git a/src/DIRAC/Interfaces/scripts/dirac_wms_job_status.py b/src/DIRAC/Interfaces/scripts/dirac_wms_job_status.py index f7827aa4f93..469cf9bd9fa 100755 --- a/src/DIRAC/Interfaces/scripts/dirac_wms_job_status.py +++ b/src/DIRAC/Interfaces/scripts/dirac_wms_job_status.py @@ -3,7 +3,6 @@ # File : dirac-wms-job-status # Author : Stuart Paterson ######################################################################## -from DIRAC.Core.Utilities.TimeUtilities import DiracTime """ Retrieve status of the given DIRAC job @@ -11,8 +10,8 @@ $ dirac-wms-job-status 2 JobID=2 Status=Done; MinorStatus=Execution Complete; Site=EELA.UTFSM.cl; """ -import datetime import os +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.Core.Base.Script import Script diff --git a/src/DIRAC/Interfaces/scripts/doutput.py b/src/DIRAC/Interfaces/scripts/doutput.py index a3c915d8d9d..03edf9a1199 100755 --- a/src/DIRAC/Interfaces/scripts/doutput.py +++ b/src/DIRAC/Interfaces/scripts/doutput.py @@ -1,11 +1,11 @@ #!/usr/bin/env python -from DIRAC.Core.Utilities.TimeUtilities import DiracTime """ Retrieve output sandbox for a DIRAC job """ import DIRAC from DIRAC import S_OK, gLogger from DIRAC.Interfaces.Utilities.DConfigCache import ConfigCache +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.Core.Base.Script import Script import os diff --git a/src/DIRAC/Interfaces/scripts/dstat.py b/src/DIRAC/Interfaces/scripts/dstat.py index 2cff593c9e2..66d703dbfce 100755 --- a/src/DIRAC/Interfaces/scripts/dstat.py +++ b/src/DIRAC/Interfaces/scripts/dstat.py @@ -1,5 +1,4 @@ #!/usr/bin/env python -from DIRAC.Core.Utilities.TimeUtilities import DiracTime """ Retrieves job status according to given criteria. Example: @@ -13,6 +12,7 @@ from DIRAC.Interfaces.Utilities.DCommands import DSession from DIRAC.Interfaces.Utilities.DConfigCache import ConfigCache from DIRAC.Interfaces.Utilities.DCommands import ArrayFormatter +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.Core.Base.Script import Script from DIRAC.Core.Utilities.TimeUtilities import toString, day from DIRAC.Core.Utilities.SaferEval import saferEval diff --git a/src/DIRAC/RequestManagementSystem/Agent/CleanReqDBAgent.py b/src/DIRAC/RequestManagementSystem/Agent/CleanReqDBAgent.py index 535110d2910..52313d10e71 100644 --- a/src/DIRAC/RequestManagementSystem/Agent/CleanReqDBAgent.py +++ b/src/DIRAC/RequestManagementSystem/Agent/CleanReqDBAgent.py @@ -3,7 +3,6 @@ # Author: Krzysztof.Ciba@NOSPAMgmail.com # Date: 2013/05/17 08:31:26 ######################################################################## -from DIRAC.Core.Utilities.TimeUtilities import DiracTime """Cleaning the RequestDB from obsolete records and kicking assigned requests .. literalinclude:: ../ConfigTemplate.cfg @@ -28,6 +27,8 @@ # # from DIRAC from DIRAC import S_OK from DIRAC.Core.Base.AgentModule import AgentModule +from DIRAC.Core.Utilities.TimeUtilities import DiracTime + from DIRAC.RequestManagementSystem.DB.RequestDB import RequestDB AGENT_NAME = "RequestManagement/CleanReqDBAgent" diff --git a/src/DIRAC/RequestManagementSystem/Client/File.py b/src/DIRAC/RequestManagementSystem/Client/File.py index 7a7e4426dab..01014cc846f 100644 --- a/src/DIRAC/RequestManagementSystem/Client/File.py +++ b/src/DIRAC/RequestManagementSystem/Client/File.py @@ -2,7 +2,6 @@ # File: File.py # Date: 2012/08/03 15:02:53 ######################################################################## -from DIRAC.Core.Utilities.TimeUtilities import DiracTime """ :mod: File @@ -20,6 +19,8 @@ from DIRAC import S_OK, S_ERROR from DIRAC.Core.Utilities.File import checkGuid +from DIRAC.Core.Utilities.TimeUtilities import DiracTime + from DIRAC.RequestManagementSystem.private.JSONUtils import RMSEncoder diff --git a/src/DIRAC/RequestManagementSystem/Client/Operation.py b/src/DIRAC/RequestManagementSystem/Client/Operation.py index 5ef9d294e74..8c1accb88f9 100644 --- a/src/DIRAC/RequestManagementSystem/Client/Operation.py +++ b/src/DIRAC/RequestManagementSystem/Client/Operation.py @@ -2,8 +2,6 @@ # File: Operation.py # Date: 2012/07/24 12:12:05 ######################################################################## - -from DIRAC.Core.Utilities.TimeUtilities import DiracTime """ :mod: Operation @@ -19,6 +17,7 @@ # # from DIRAC from DIRAC import S_OK, S_ERROR +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.RequestManagementSystem.Client.File import File from DIRAC.RequestManagementSystem.private.JSONUtils import RMSEncoder diff --git a/src/DIRAC/RequestManagementSystem/DB/RequestDB.py b/src/DIRAC/RequestManagementSystem/DB/RequestDB.py index 4fd837077b6..98efa2b58e9 100644 --- a/src/DIRAC/RequestManagementSystem/DB/RequestDB.py +++ b/src/DIRAC/RequestManagementSystem/DB/RequestDB.py @@ -1,6 +1,4 @@ # We disable pylint no-callable because of https://github.com/PyCQA/pylint/issues/8138 - -from DIRAC.Core.Utilities.TimeUtilities import DiracTime """Frontend for ReqDB :mod: RequestDB @@ -43,6 +41,7 @@ # # from DIRAC from DIRAC import S_ERROR, S_OK, gLogger from DIRAC.ConfigurationSystem.Client.Utilities import getDBParameters +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.RequestManagementSystem.Client.File import File from DIRAC.RequestManagementSystem.Client.Operation import Operation from DIRAC.RequestManagementSystem.Client.Request import Request diff --git a/src/DIRAC/RequestManagementSystem/scripts/dirac_rms_request.py b/src/DIRAC/RequestManagementSystem/scripts/dirac_rms_request.py index 563d5271351..4ebf559e015 100755 --- a/src/DIRAC/RequestManagementSystem/scripts/dirac_rms_request.py +++ b/src/DIRAC/RequestManagementSystem/scripts/dirac_rms_request.py @@ -1,10 +1,10 @@ #!/bin/env python -from DIRAC.Core.Utilities.TimeUtilities import DiracTime """ Show request given its ID, a jobID or a transformation and a task """ import datetime import os +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.Core.Base.Script import Script diff --git a/src/DIRAC/ResourceStatusSystem/scripts/dirac_rss_query_db.py b/src/DIRAC/ResourceStatusSystem/scripts/dirac_rss_query_db.py index 4cf1f8a6469..cdcb8cc5bf7 100755 --- a/src/DIRAC/ResourceStatusSystem/scripts/dirac_rss_query_db.py +++ b/src/DIRAC/ResourceStatusSystem/scripts/dirac_rss_query_db.py @@ -1,5 +1,4 @@ #!/usr/bin/env python -from DIRAC.Core.Utilities.TimeUtilities import DiracTime """ Script that dumps the DB information for the elements into the standard output. If returns information concerning the StatusType and Status attributes. @@ -15,6 +14,7 @@ from DIRAC.Core.Utilities import TimeUtilities from DIRAC.Core.Utilities.PrettyPrint import printTable from DIRAC.Core.Utilities.SaferEval import saferEval +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.ResourceStatusSystem.Client import ResourceStatusClient diff --git a/src/DIRAC/ResourceStatusSystem/scripts/dirac_rss_query_dtcache.py b/src/DIRAC/ResourceStatusSystem/scripts/dirac_rss_query_dtcache.py index 6464f4d3f49..3bd266414ee 100755 --- a/src/DIRAC/ResourceStatusSystem/scripts/dirac_rss_query_dtcache.py +++ b/src/DIRAC/ResourceStatusSystem/scripts/dirac_rss_query_dtcache.py @@ -1,5 +1,4 @@ #!/usr/bin/env python -from DIRAC.Core.Utilities.TimeUtilities import DiracTime """ Select/Add/Delete a new DownTime entry for a given Site or Service. """ @@ -12,6 +11,7 @@ from DIRAC.Core.Utilities.ObjectLoader import ObjectLoader from DIRAC.Core.Utilities.PrettyPrint import printTable from DIRAC.Core.Utilities.SaferEval import saferEval +from DIRAC.Core.Utilities.TimeUtilities import DiracTime def registerSwitches(): diff --git a/src/DIRAC/ResourceStatusSystem/scripts/dirac_rss_set_status.py b/src/DIRAC/ResourceStatusSystem/scripts/dirac_rss_set_status.py index b525efb3cac..0cc3311c582 100755 --- a/src/DIRAC/ResourceStatusSystem/scripts/dirac_rss_set_status.py +++ b/src/DIRAC/ResourceStatusSystem/scripts/dirac_rss_set_status.py @@ -1,5 +1,4 @@ #!/usr/bin/env python -from DIRAC.Core.Utilities.TimeUtilities import DiracTime """ Script that facilitates the modification of a element through the command line. However, the usage of this script will set the element token to the command @@ -12,6 +11,7 @@ from DIRAC import exit as DIRACExit from DIRAC.Core.Base.Script import Script from DIRAC.Core.Security.ProxyInfo import getProxyInfo +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.ResourceStatusSystem.Client import ResourceStatusClient from DIRAC.ResourceStatusSystem.PolicySystem import StateMachine diff --git a/src/DIRAC/ResourceStatusSystem/scripts/dirac_rss_set_token.py b/src/DIRAC/ResourceStatusSystem/scripts/dirac_rss_set_token.py index 10ae2a41e8a..9474e16a6f0 100755 --- a/src/DIRAC/ResourceStatusSystem/scripts/dirac_rss_set_token.py +++ b/src/DIRAC/ResourceStatusSystem/scripts/dirac_rss_set_token.py @@ -1,5 +1,4 @@ #!/usr/bin/env python -from DIRAC.Core.Utilities.TimeUtilities import DiracTime """ Script that helps setting the token of the elements in RSS. It can acquire or release the token. @@ -17,6 +16,7 @@ from DIRAC import gLogger from DIRAC.Core.Base.Script import Script from DIRAC.Core.Security.ProxyInfo import getProxyInfo +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.ResourceStatusSystem.Client.ResourceStatusClient import ResourceStatusClient switchDict = {} diff --git a/src/DIRAC/Resources/Computing/BatchSystems/Host.py b/src/DIRAC/Resources/Computing/BatchSystems/Host.py index a6a9152866a..4d6ac2c6ab0 100644 --- a/src/DIRAC/Resources/Computing/BatchSystems/Host.py +++ b/src/DIRAC/Resources/Computing/BatchSystems/Host.py @@ -4,7 +4,7 @@ # Author: A.T. ######################################################################### -from DIRAC.Core.Utilities.TimeUtilities import DiracTime + """ Host - class for managing jobs on a host. Host objects are invoked with LocalComputingElement or SSHComputingElement objects """ @@ -23,6 +23,8 @@ import multiprocessing from datetime import datetime, timedelta +from DIRAC.Core.Utilities.TimeUtilities import DiracTime + # Clean job info and output after so many days CLEAN_DELAY = timedelta(7) diff --git a/src/DIRAC/Resources/Computing/CloudComputingElement.py b/src/DIRAC/Resources/Computing/CloudComputingElement.py index 84095965849..a0c0a6e2239 100644 --- a/src/DIRAC/Resources/Computing/CloudComputingElement.py +++ b/src/DIRAC/Resources/Computing/CloudComputingElement.py @@ -1,4 +1,3 @@ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime r""" Cloud Computing Element This allows submission to cloud sites using libcloud (via the standard @@ -153,6 +152,7 @@ from DIRAC import S_ERROR, S_OK, rootPath from DIRAC.ConfigurationSystem.Client.Helpers.Operations import Operations +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.FrameworkSystem.Client.ProxyManagerClient import gProxyManager from DIRAC.Resources.Computing.ComputingElement import ComputingElement From 6ba8430a13a56dd7367d7bcec89a60ea0f4ad8b6 Mon Sep 17 00:00:00 2001 From: martynia Date: Mon, 27 Jul 2026 17:47:36 +0100 Subject: [PATCH 5/7] fix: reformat imports (3) --- src/DIRAC/DataManagementSystem/scripts/dirac_dms_user_lfns.py | 3 +-- src/DIRAC/WorkloadManagementSystem/DB/JobDB.py | 2 +- .../FutureClient/JobStateUpdateClient.py | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/DIRAC/DataManagementSystem/scripts/dirac_dms_user_lfns.py b/src/DIRAC/DataManagementSystem/scripts/dirac_dms_user_lfns.py index ee4a567f316..3801be8bf70 100755 --- a/src/DIRAC/DataManagementSystem/scripts/dirac_dms_user_lfns.py +++ b/src/DIRAC/DataManagementSystem/scripts/dirac_dms_user_lfns.py @@ -1,6 +1,4 @@ #!/usr/bin/env python -from DIRAC.Core.Utilities.TimeUtilities import DiracTime - """ Get the list of all the user files. @@ -20,6 +18,7 @@ import fnmatch from datetime import datetime, timedelta +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.Core.Base.Script import Script diff --git a/src/DIRAC/WorkloadManagementSystem/DB/JobDB.py b/src/DIRAC/WorkloadManagementSystem/DB/JobDB.py index 2352141312b..d1b1f08c096 100755 --- a/src/DIRAC/WorkloadManagementSystem/DB/JobDB.py +++ b/src/DIRAC/WorkloadManagementSystem/DB/JobDB.py @@ -11,7 +11,6 @@ * *CompressJDLs*: Enable compression of JDLs when they are stored in the database, default *False*. """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime from __future__ import annotations import datetime @@ -32,6 +31,7 @@ SErrorException, DReturnType, ) +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.FrameworkSystem.Client.Logger import contextLogger from DIRAC.ResourceStatusSystem.Client.SiteStatus import SiteStatus from DIRAC.WorkloadManagementSystem.Client import JobMinorStatus, JobStatus diff --git a/src/DIRAC/WorkloadManagementSystem/FutureClient/JobStateUpdateClient.py b/src/DIRAC/WorkloadManagementSystem/FutureClient/JobStateUpdateClient.py index 353a33752c1..864515f35ed 100644 --- a/src/DIRAC/WorkloadManagementSystem/FutureClient/JobStateUpdateClient.py +++ b/src/DIRAC/WorkloadManagementSystem/FutureClient/JobStateUpdateClient.py @@ -1,4 +1,3 @@ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime from __future__ import annotations import functools @@ -8,6 +7,7 @@ from DIRAC.Core.Security.DiracX import DiracXClient, FutureClient, addRPCStub from DIRAC.Core.Utilities.ReturnValues import convertToReturnValue, returnValueOrRaise +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.Core.Utilities.TimeUtilities import fromString from DIRAC.WorkloadManagementSystem.Client import JobStatus From a9c72a952a78d9c833250c597e5e5001cbb6cdda Mon Sep 17 00:00:00 2001 From: martynia Date: Mon, 27 Jul 2026 18:47:55 +0100 Subject: [PATCH 6/7] fix: reformat imports (4) --- src/DIRAC/RequestManagementSystem/Client/ReqClient.py | 3 +-- src/DIRAC/RequestManagementSystem/Client/Request.py | 2 +- .../RequestManagementSystem/Service/ReqManagerHandler.py | 2 +- src/DIRAC/ResourceStatusSystem/Agent/ElementInspectorAgent.py | 2 +- src/DIRAC/ResourceStatusSystem/Agent/SiteInspectorAgent.py | 2 +- src/DIRAC/ResourceStatusSystem/Agent/SummarizeLogsAgent.py | 4 ++-- src/DIRAC/ResourceStatusSystem/Agent/TokenAgent.py | 2 +- src/DIRAC/ResourceStatusSystem/Client/ResourceStatus.py | 4 ++-- src/DIRAC/ResourceStatusSystem/Client/SiteStatus.py | 2 +- src/DIRAC/ResourceStatusSystem/Command/DowntimeCommand.py | 4 ++-- .../ResourceStatusSystem/Command/FreeDiskSpaceCommand.py | 4 ++-- src/DIRAC/ResourceStatusSystem/Command/TransferCommand.py | 4 ++-- src/DIRAC/ResourceStatusSystem/DB/ResourceManagementDB.py | 3 +-- src/DIRAC/ResourceStatusSystem/DB/ResourceStatusDB.py | 2 +- src/DIRAC/ResourceStatusSystem/Service/PublisherHandler.py | 2 +- src/DIRAC/ResourceStatusSystem/Utilities/RSSCache.py | 2 +- src/DIRAC/Resources/Computing/HTCondorCEComputingElement.py | 4 +--- src/DIRAC/Resources/Storage/StorageElement.py | 3 +-- src/DIRAC/StorageManagementSystem/Agent/StageMonitorAgent.py | 3 +-- src/DIRAC/TransformationSystem/Agent/InputDataAgent.py | 2 +- src/DIRAC/TransformationSystem/Agent/TaskManagerAgentBase.py | 2 +- src/DIRAC/TransformationSystem/Agent/TransformationAgent.py | 2 +- .../TransformationSystem/Agent/TransformationCleaningAgent.py | 4 ++-- .../Service/TransformationManagerHandler.py | 2 +- src/DIRAC/WorkloadManagementSystem/Agent/JobCleaningAgent.py | 3 +-- src/DIRAC/WorkloadManagementSystem/Agent/PilotStatusAgent.py | 1 - src/DIRAC/WorkloadManagementSystem/Agent/SiteDirector.py | 3 +-- src/DIRAC/WorkloadManagementSystem/Agent/StalledJobAgent.py | 2 +- .../WorkloadManagementSystem/Agent/StatesAccountingAgent.py | 3 +-- src/DIRAC/WorkloadManagementSystem/Client/JobReport.py | 3 +-- .../Client/JobState/CachedJobState.py | 3 +-- src/DIRAC/WorkloadManagementSystem/DB/JobLoggingDB.py | 2 +- src/DIRAC/WorkloadManagementSystem/DB/PilotAgentsDB.py | 3 +-- src/DIRAC/WorkloadManagementSystem/JobWrapper/JobWrapper.py | 3 +-- src/DIRAC/WorkloadManagementSystem/JobWrapper/Watchdog.py | 3 +-- .../Utilities/PilotCStoJSONSynchronizer.py | 2 +- .../private/correctors/MonitoringHistoryCorrector.py | 2 +- .../private/correctors/WMSHistoryCorrector.py | 2 +- 38 files changed, 43 insertions(+), 58 deletions(-) diff --git a/src/DIRAC/RequestManagementSystem/Client/ReqClient.py b/src/DIRAC/RequestManagementSystem/Client/ReqClient.py index 8410fbeb70e..f13c36cddcc 100755 --- a/src/DIRAC/RequestManagementSystem/Client/ReqClient.py +++ b/src/DIRAC/RequestManagementSystem/Client/ReqClient.py @@ -6,8 +6,6 @@ """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime -import datetime import json import os import random @@ -23,6 +21,7 @@ from DIRAC.Core.Utilities.List import fromChar, randomize from DIRAC.Core.Utilities.ObjectLoader import ObjectLoader from DIRAC.Core.Utilities.ReturnValues import returnValueOrRaise +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.RequestManagementSystem.Client.Request import Request from DIRAC.RequestManagementSystem.private.RequestValidator import RequestValidator from DIRAC.WorkloadManagementSystem.Client import JobMinorStatus, JobStatus diff --git a/src/DIRAC/RequestManagementSystem/Client/Request.py b/src/DIRAC/RequestManagementSystem/Client/Request.py index 5045efa9eab..11b0c459cf5 100644 --- a/src/DIRAC/RequestManagementSystem/Client/Request.py +++ b/src/DIRAC/RequestManagementSystem/Client/Request.py @@ -9,13 +9,13 @@ # Disable invalid names warning # pylint: disable=invalid-name # # imports -from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime import json # # from DIRAC from DIRAC import S_OK, S_ERROR from DIRAC.Core.Security.ProxyInfo import getProxyInfo +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.RequestManagementSystem.Client.Operation import Operation from DIRAC.RequestManagementSystem.private.JSONUtils import RMSEncoder from DIRAC.DataManagementSystem.Utilities.DMSHelpers import DMSHelpers diff --git a/src/DIRAC/RequestManagementSystem/Service/ReqManagerHandler.py b/src/DIRAC/RequestManagementSystem/Service/ReqManagerHandler.py index 28fa3560ff6..155f4bb70f0 100755 --- a/src/DIRAC/RequestManagementSystem/Service/ReqManagerHandler.py +++ b/src/DIRAC/RequestManagementSystem/Service/ReqManagerHandler.py @@ -10,7 +10,6 @@ """ # # imports -from DIRAC.Core.Utilities.TimeUtilities import DiracTime import json import datetime import math @@ -19,6 +18,7 @@ from DIRAC import gLogger, S_OK, S_ERROR from DIRAC.Core.DISET.RequestHandler import RequestHandler, getServiceOption from DIRAC.Core.Utilities import DErrno +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.Core.Utilities.DEncode import ignoreEncodeWarning # # from RMS diff --git a/src/DIRAC/ResourceStatusSystem/Agent/ElementInspectorAgent.py b/src/DIRAC/ResourceStatusSystem/Agent/ElementInspectorAgent.py index 96dd4f356ef..16149dc446c 100644 --- a/src/DIRAC/ResourceStatusSystem/Agent/ElementInspectorAgent.py +++ b/src/DIRAC/ResourceStatusSystem/Agent/ElementInspectorAgent.py @@ -12,12 +12,12 @@ :caption: ElementInspectorAgent options """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime import concurrent.futures from DIRAC import S_ERROR, S_OK from DIRAC.Core.Base.AgentModule import AgentModule +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.Core.Utilities.ObjectLoader import ObjectLoader from DIRAC.ResourceStatusSystem.PolicySystem.PEP import PEP diff --git a/src/DIRAC/ResourceStatusSystem/Agent/SiteInspectorAgent.py b/src/DIRAC/ResourceStatusSystem/Agent/SiteInspectorAgent.py index 85927497a69..2c40524b89d 100644 --- a/src/DIRAC/ResourceStatusSystem/Agent/SiteInspectorAgent.py +++ b/src/DIRAC/ResourceStatusSystem/Agent/SiteInspectorAgent.py @@ -10,13 +10,13 @@ :dedent: 2 :caption: SiteInspectorAgent options """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime import concurrent.futures from DIRAC import S_OK, S_ERROR from DIRAC.Core.Base.AgentModule import AgentModule from DIRAC.Core.Utilities.ObjectLoader import ObjectLoader +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.ResourceStatusSystem.PolicySystem.PEP import PEP AGENT_NAME = "ResourceStatus/SiteInspectorAgent" diff --git a/src/DIRAC/ResourceStatusSystem/Agent/SummarizeLogsAgent.py b/src/DIRAC/ResourceStatusSystem/Agent/SummarizeLogsAgent.py index ebb9f4cff0d..bff561ff77a 100644 --- a/src/DIRAC/ResourceStatusSystem/Agent/SummarizeLogsAgent.py +++ b/src/DIRAC/ResourceStatusSystem/Agent/SummarizeLogsAgent.py @@ -18,11 +18,11 @@ :caption: SummarizeLogsAgent options """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime -from datetime import datetime, timedelta +from datetime import timedelta from DIRAC import S_OK from DIRAC.Core.Base.AgentModule import AgentModule +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.ResourceStatusSystem.Client.ResourceStatusClient import ResourceStatusClient AGENT_NAME = "ResourceStatus/SummarizeLogsAgent" diff --git a/src/DIRAC/ResourceStatusSystem/Agent/TokenAgent.py b/src/DIRAC/ResourceStatusSystem/Agent/TokenAgent.py index 51c41f907ee..a745c276d15 100644 --- a/src/DIRAC/ResourceStatusSystem/Agent/TokenAgent.py +++ b/src/DIRAC/ResourceStatusSystem/Agent/TokenAgent.py @@ -11,12 +11,12 @@ :caption: TokenAgent options """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime from datetime import datetime, timedelta from DIRAC import S_OK, S_ERROR from DIRAC.ConfigurationSystem.Client.Helpers.Operations import Operations from DIRAC.Core.Base.AgentModule import AgentModule +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.Interfaces.API.DiracAdmin import DiracAdmin from DIRAC.ResourceStatusSystem.Client.ResourceStatusClient import ResourceStatusClient diff --git a/src/DIRAC/ResourceStatusSystem/Client/ResourceStatus.py b/src/DIRAC/ResourceStatusSystem/Client/ResourceStatus.py index 032243dc851..c2b6424662c 100644 --- a/src/DIRAC/ResourceStatusSystem/Client/ResourceStatus.py +++ b/src/DIRAC/ResourceStatusSystem/Client/ResourceStatus.py @@ -6,13 +6,13 @@ """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime import math -from datetime import datetime, timedelta +from datetime import timedelta from time import sleep from DIRAC import S_ERROR, S_OK, gLogger from DIRAC.Core.Utilities.DIRACSingleton import DIRACSingleton +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.ResourceStatusSystem.Client.ResourceStatusClient import ResourceStatusClient from DIRAC.ResourceStatusSystem.Utilities.InfoGetter import getPoliciesThatApply from DIRAC.ResourceStatusSystem.Utilities.RSSCacheNoThread import RSSCache diff --git a/src/DIRAC/ResourceStatusSystem/Client/SiteStatus.py b/src/DIRAC/ResourceStatusSystem/Client/SiteStatus.py index c5f139c571b..46ba7484b86 100644 --- a/src/DIRAC/ResourceStatusSystem/Client/SiteStatus.py +++ b/src/DIRAC/ResourceStatusSystem/Client/SiteStatus.py @@ -5,7 +5,6 @@ The status is kept in the RSSCache object, which is a small wrapper on top of DictCache """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime import errno import math from datetime import datetime, timedelta @@ -15,6 +14,7 @@ from DIRAC.Core.Security.ProxyInfo import getProxyInfo from DIRAC.Core.Utilities import DErrno from DIRAC.Core.Utilities.DIRACSingleton import DIRACSingleton +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.ResourceStatusSystem.Client.ResourceStatusClient import ResourceStatusClient from DIRAC.ResourceStatusSystem.Utilities.RSSCacheNoThread import RSSCache from DIRAC.ResourceStatusSystem.Utilities.RssConfiguration import RssConfiguration diff --git a/src/DIRAC/ResourceStatusSystem/Command/DowntimeCommand.py b/src/DIRAC/ResourceStatusSystem/Command/DowntimeCommand.py index 8b19b3b19a6..0699e235a70 100644 --- a/src/DIRAC/ResourceStatusSystem/Command/DowntimeCommand.py +++ b/src/DIRAC/ResourceStatusSystem/Command/DowntimeCommand.py @@ -3,9 +3,8 @@ GOCDB downtimes that are modified or deleted are also synced. """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime import re -from datetime import datetime, timedelta +from datetime import timedelta from operator import itemgetter from urllib.error import URLError @@ -20,6 +19,7 @@ ) from DIRAC.Core.LCG.GOCDBClient import GOCDBClient from DIRAC.Core.Utilities.SiteSEMapping import getSEHosts, getStorageElementsHosts +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.Resources.Storage.StorageElement import StorageElement from DIRAC.ResourceStatusSystem.Client.ResourceManagementClient import ResourceManagementClient from DIRAC.ResourceStatusSystem.Command.Command import Command diff --git a/src/DIRAC/ResourceStatusSystem/Command/FreeDiskSpaceCommand.py b/src/DIRAC/ResourceStatusSystem/Command/FreeDiskSpaceCommand.py index 795949618ef..f96e45ee132 100644 --- a/src/DIRAC/ResourceStatusSystem/Command/FreeDiskSpaceCommand.py +++ b/src/DIRAC/ResourceStatusSystem/Command/FreeDiskSpaceCommand.py @@ -8,15 +8,15 @@ """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime import errno import sys -from datetime import datetime, timedelta +from datetime import timedelta from DIRAC import S_ERROR, S_OK from DIRAC.AccountingSystem.Client.DataStoreClient import gDataStoreClient from DIRAC.AccountingSystem.Client.Types.StorageOccupancy import StorageOccupancy from DIRAC.Core.Utilities.File import convertSizeUnits +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.DataManagementSystem.Utilities.DMSHelpers import DMSHelpers from DIRAC.Resources.Storage.StorageElement import StorageElement from DIRAC.ResourceStatusSystem.Client.ResourceManagementClient import ResourceManagementClient diff --git a/src/DIRAC/ResourceStatusSystem/Command/TransferCommand.py b/src/DIRAC/ResourceStatusSystem/Command/TransferCommand.py index c60c9281c8f..a6a13a9fccf 100644 --- a/src/DIRAC/ResourceStatusSystem/Command/TransferCommand.py +++ b/src/DIRAC/ResourceStatusSystem/Command/TransferCommand.py @@ -1,10 +1,10 @@ """ TransferCommand module """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime -from datetime import datetime, timedelta +from datetime import timedelta from DIRAC import S_OK, S_ERROR from DIRAC.Core.Utilities.JEncode import strToIntDict +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.ConfigurationSystem.Client.Helpers.Resources import getSites from DIRAC.AccountingSystem.Client.ReportsClient import ReportsClient from DIRAC.DataManagementSystem.Utilities.DMSHelpers import DMSHelpers diff --git a/src/DIRAC/ResourceStatusSystem/DB/ResourceManagementDB.py b/src/DIRAC/ResourceStatusSystem/DB/ResourceManagementDB.py index 9f35d9da3ca..5313d7c488f 100644 --- a/src/DIRAC/ResourceStatusSystem/DB/ResourceManagementDB.py +++ b/src/DIRAC/ResourceStatusSystem/DB/ResourceManagementDB.py @@ -16,8 +16,6 @@ """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime -import datetime from sqlalchemy.orm import class_mapper, declarative_base from sqlalchemy.orm.query import Query from sqlalchemy import Column, String, DateTime, exc, Integer, Float @@ -25,6 +23,7 @@ from DIRAC import S_OK, S_ERROR from DIRAC.Core.Base.SQLAlchemyDB import SQLAlchemyDB from DIRAC.Core.Utilities.ObjectLoader import ObjectLoader +from DIRAC.Core.Utilities.TimeUtilities import DiracTime # Defining the tables diff --git a/src/DIRAC/ResourceStatusSystem/DB/ResourceStatusDB.py b/src/DIRAC/ResourceStatusSystem/DB/ResourceStatusDB.py index b0bb06573db..56c523b6a94 100644 --- a/src/DIRAC/ResourceStatusSystem/DB/ResourceStatusDB.py +++ b/src/DIRAC/ResourceStatusSystem/DB/ResourceStatusDB.py @@ -16,7 +16,6 @@ """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime from sqlalchemy.orm import class_mapper, declarative_base from sqlalchemy.orm.query import Query @@ -25,6 +24,7 @@ from DIRAC import S_OK, S_ERROR, gConfig from DIRAC.Core.Base.SQLAlchemyDB import SQLAlchemyDB from DIRAC.Core.Utilities.ObjectLoader import ObjectLoader +from DIRAC.Core.Utilities.TimeUtilities import DiracTime TABLESLIST = ["SiteStatus", "ResourceStatus"] diff --git a/src/DIRAC/ResourceStatusSystem/Service/PublisherHandler.py b/src/DIRAC/ResourceStatusSystem/Service/PublisherHandler.py index edbeba49e7c..d99bd44eb10 100644 --- a/src/DIRAC/ResourceStatusSystem/Service/PublisherHandler.py +++ b/src/DIRAC/ResourceStatusSystem/Service/PublisherHandler.py @@ -6,7 +6,6 @@ """ # pylint: disable=no-self-use -from DIRAC.Core.Utilities.TimeUtilities import DiracTime from datetime import datetime, timedelta # DIRAC @@ -14,6 +13,7 @@ from DIRAC.Core.DISET.RequestHandler import RequestHandler from DIRAC.Core.Utilities.ObjectLoader import ObjectLoader from DIRAC.Core.Utilities.SiteSEMapping import getSEHosts, getStorageElementsHosts +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.ConfigurationSystem.Client.Helpers.Resources import getSites, getSiteCEMapping from DIRAC.DataManagementSystem.Utilities.DMSHelpers import DMSHelpers diff --git a/src/DIRAC/ResourceStatusSystem/Utilities/RSSCache.py b/src/DIRAC/ResourceStatusSystem/Utilities/RSSCache.py index 0739a17bd64..bdee5af8f08 100644 --- a/src/DIRAC/ResourceStatusSystem/Utilities/RSSCache.py +++ b/src/DIRAC/ResourceStatusSystem/Utilities/RSSCache.py @@ -4,13 +4,13 @@ Extension of DictCache to be used within RSS """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime import threading import time from DIRAC import S_OK, S_ERROR from DIRAC.Core.Utilities.DictCache import DictCache +from DIRAC.Core.Utilities.TimeUtilities import DiracTime class RSSCache: diff --git a/src/DIRAC/Resources/Computing/HTCondorCEComputingElement.py b/src/DIRAC/Resources/Computing/HTCondorCEComputingElement.py index aeba959b556..563b0e0de3c 100644 --- a/src/DIRAC/Resources/Computing/HTCondorCEComputingElement.py +++ b/src/DIRAC/Resources/Computing/HTCondorCEComputingElement.py @@ -48,12 +48,9 @@ # created documentation, there should only be one slash when setting the option, # but "\n" gets rendered as a linebreak in sphinx -from DIRAC.Core.Utilities.TimeUtilities import DiracTime -import datetime import errno import json import os -import subprocess import tempfile import textwrap import threading @@ -64,6 +61,7 @@ from DIRAC.Core.Utilities.File import cleanDirectory, mkDir from DIRAC.Core.Utilities.List import breakListIntoChunks from DIRAC.Core.Utilities.Subprocess import systemCall +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.FrameworkSystem.private.authorization.utils.Tokens import writeToTokenFile from DIRAC.Resources.Computing.BatchSystems.Condor import ( HOLD_REASON_SUBCODE, diff --git a/src/DIRAC/Resources/Storage/StorageElement.py b/src/DIRAC/Resources/Storage/StorageElement.py index ea285937920..2c562f6758f 100755 --- a/src/DIRAC/Resources/Storage/StorageElement.py +++ b/src/DIRAC/Resources/Storage/StorageElement.py @@ -3,8 +3,6 @@ # # custom duty - -from DIRAC.Core.Utilities.TimeUtilities import DiracTime from copy import deepcopy import datetime import errno @@ -28,6 +26,7 @@ from DIRAC.Core.Utilities.Pfn import pfnparse from DIRAC.Core.Utilities.SiteSEMapping import getSEsForSite from DIRAC.Core.Utilities.Network import getFQDN +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.Core.Security.Locations import getProxyLocation from DIRAC.Core.Security.ProxyInfo import getVOfromProxyGroup from DIRAC.ConfigurationSystem.Client.Helpers.Operations import Operations diff --git a/src/DIRAC/StorageManagementSystem/Agent/StageMonitorAgent.py b/src/DIRAC/StorageManagementSystem/Agent/StageMonitorAgent.py index 7fb9fd8522b..1cc74a653f3 100755 --- a/src/DIRAC/StorageManagementSystem/Agent/StageMonitorAgent.py +++ b/src/DIRAC/StorageManagementSystem/Agent/StageMonitorAgent.py @@ -9,8 +9,6 @@ :dedent: 2 """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime -import datetime from DIRAC import gLogger, S_OK, S_ERROR, siteName @@ -19,6 +17,7 @@ from DIRAC.Resources.Storage.StorageElement import StorageElement from DIRAC.MonitoringSystem.Client.DataOperationSender import DataOperationSender from DIRAC.Core.Security.ProxyInfo import getProxyInfo +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import re diff --git a/src/DIRAC/TransformationSystem/Agent/InputDataAgent.py b/src/DIRAC/TransformationSystem/Agent/InputDataAgent.py index 80b5296da31..9e998c7fb7b 100644 --- a/src/DIRAC/TransformationSystem/Agent/InputDataAgent.py +++ b/src/DIRAC/TransformationSystem/Agent/InputDataAgent.py @@ -14,7 +14,6 @@ :dedent: 2 :caption: InputDataAgent options """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime import time import datetime @@ -23,6 +22,7 @@ from DIRAC import S_OK from DIRAC.Core.Base.AgentModule import AgentModule from DIRAC.Core.Utilities.DErrno import cmpError +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.TransformationSystem.Client.TransformationClient import TransformationClient from DIRAC.Resources.Catalog.FileCatalogClient import FileCatalogClient from DIRAC.ConfigurationSystem.Client.Helpers.Operations import Operations diff --git a/src/DIRAC/TransformationSystem/Agent/TaskManagerAgentBase.py b/src/DIRAC/TransformationSystem/Agent/TaskManagerAgentBase.py index 111cf551126..4dfcb053aa0 100644 --- a/src/DIRAC/TransformationSystem/Agent/TaskManagerAgentBase.py +++ b/src/DIRAC/TransformationSystem/Agent/TaskManagerAgentBase.py @@ -7,7 +7,6 @@ In case you want to further extend it you are required to follow the note on the initialize method and on the _getClients method. """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime import concurrent.futures import datetime import time @@ -18,6 +17,7 @@ from DIRAC.Core.Security.ProxyInfo import getProxyInfo from DIRAC.Core.Utilities.Dictionaries import breakDictionaryIntoChunks from DIRAC.Core.Utilities.List import breakListIntoChunks +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.TransformationSystem.Agent.TransformationAgentsUtilities import TransformationAgentsUtilities from DIRAC.TransformationSystem.Client.FileReport import FileReport from DIRAC.TransformationSystem.Client.TransformationClient import TransformationClient diff --git a/src/DIRAC/TransformationSystem/Agent/TransformationAgent.py b/src/DIRAC/TransformationSystem/Agent/TransformationAgent.py index cda8d6c7852..448168755e2 100644 --- a/src/DIRAC/TransformationSystem/Agent/TransformationAgent.py +++ b/src/DIRAC/TransformationSystem/Agent/TransformationAgent.py @@ -9,7 +9,6 @@ :caption: TransformationAgent options """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime from importlib import import_module import time @@ -24,6 +23,7 @@ from DIRAC.Core.Base.AgentModule import AgentModule from DIRAC.Core.Utilities.ThreadSafe import Synchronizer from DIRAC.Core.Utilities.List import breakListIntoChunks, randomize +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.DataManagementSystem.Client.DataManager import DataManager from DIRAC.TransformationSystem.Client import TransformationFilesStatus from DIRAC.TransformationSystem.Client.TransformationClient import TransformationClient diff --git a/src/DIRAC/TransformationSystem/Agent/TransformationCleaningAgent.py b/src/DIRAC/TransformationSystem/Agent/TransformationCleaningAgent.py index 3d647ec5b38..0f8edacc162 100644 --- a/src/DIRAC/TransformationSystem/Agent/TransformationCleaningAgent.py +++ b/src/DIRAC/TransformationSystem/Agent/TransformationCleaningAgent.py @@ -9,12 +9,11 @@ """ # # imports -from DIRAC.Core.Utilities.TimeUtilities import DiracTime import ast import errno import os import re -from datetime import datetime, timedelta +from datetime import timedelta # # from DIRAC from DIRAC import S_ERROR, S_OK @@ -25,6 +24,7 @@ from DIRAC.Core.Utilities.ObjectLoader import ObjectLoader from DIRAC.Core.Utilities.Proxy import executeWithUserProxy from DIRAC.Core.Utilities.ReturnValues import returnSingleResult +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.RequestManagementSystem.Client.File import File from DIRAC.RequestManagementSystem.Client.Operation import Operation from DIRAC.RequestManagementSystem.Client.ReqClient import ReqClient diff --git a/src/DIRAC/TransformationSystem/Service/TransformationManagerHandler.py b/src/DIRAC/TransformationSystem/Service/TransformationManagerHandler.py index f1d0ffcf24b..b9c55899742 100644 --- a/src/DIRAC/TransformationSystem/Service/TransformationManagerHandler.py +++ b/src/DIRAC/TransformationSystem/Service/TransformationManagerHandler.py @@ -1,6 +1,5 @@ """ Service for interacting with TransformationDB """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime from DIRAC import S_ERROR, S_OK @@ -10,6 +9,7 @@ from DIRAC.Core.Utilities.DEncode import ignoreEncodeWarning from DIRAC.Core.Utilities.JEncode import encode as jencode from DIRAC.Core.Utilities.ObjectLoader import ObjectLoader +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.Core.Workflow.Workflow import fromXMLString diff --git a/src/DIRAC/WorkloadManagementSystem/Agent/JobCleaningAgent.py b/src/DIRAC/WorkloadManagementSystem/Agent/JobCleaningAgent.py index 1b1121b3c5f..4380806ffbf 100644 --- a/src/DIRAC/WorkloadManagementSystem/Agent/JobCleaningAgent.py +++ b/src/DIRAC/WorkloadManagementSystem/Agent/JobCleaningAgent.py @@ -23,8 +23,6 @@ """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime -import datetime import os from DIRAC import S_ERROR, S_OK @@ -32,6 +30,7 @@ from DIRAC.ConfigurationSystem.Client.Helpers.Registry import getDNForUsername from DIRAC.Core.Base.AgentModule import AgentModule from DIRAC.Core.Utilities import TimeUtilities +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.Core.Utilities.ObjectLoader import ObjectLoader from DIRAC.RequestManagementSystem.Client.File import File from DIRAC.RequestManagementSystem.Client.Operation import Operation diff --git a/src/DIRAC/WorkloadManagementSystem/Agent/PilotStatusAgent.py b/src/DIRAC/WorkloadManagementSystem/Agent/PilotStatusAgent.py index 9bb9e128439..a32f60a2ae8 100644 --- a/src/DIRAC/WorkloadManagementSystem/Agent/PilotStatusAgent.py +++ b/src/DIRAC/WorkloadManagementSystem/Agent/PilotStatusAgent.py @@ -8,7 +8,6 @@ :caption: PilotStatusAgent options """ -import datetime from DIRAC import S_OK from DIRAC.AccountingSystem.Client.DataStoreClient import gDataStoreClient diff --git a/src/DIRAC/WorkloadManagementSystem/Agent/SiteDirector.py b/src/DIRAC/WorkloadManagementSystem/Agent/SiteDirector.py index 956bce9d47d..c3ebb90e8fd 100644 --- a/src/DIRAC/WorkloadManagementSystem/Agent/SiteDirector.py +++ b/src/DIRAC/WorkloadManagementSystem/Agent/SiteDirector.py @@ -8,8 +8,6 @@ """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime -import datetime import os from collections import defaultdict from concurrent.futures import ThreadPoolExecutor, as_completed @@ -28,6 +26,7 @@ from DIRAC.Core.Base.AgentModule import AgentModule from DIRAC.Core.Security import X509Chain from DIRAC.Core.Utilities.TimeUtilities import second, toEpochMilliSeconds +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.FrameworkSystem.Client.ProxyManagerClient import gProxyManager from DIRAC.FrameworkSystem.Client.TokenManagerClient import gTokenManager from DIRAC.MonitoringSystem.Client.MonitoringReporter import MonitoringReporter diff --git a/src/DIRAC/WorkloadManagementSystem/Agent/StalledJobAgent.py b/src/DIRAC/WorkloadManagementSystem/Agent/StalledJobAgent.py index 8da57321192..b5167e49d0f 100755 --- a/src/DIRAC/WorkloadManagementSystem/Agent/StalledJobAgent.py +++ b/src/DIRAC/WorkloadManagementSystem/Agent/StalledJobAgent.py @@ -9,7 +9,6 @@ :caption: StalledJobAgent options """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime import concurrent.futures import datetime @@ -21,6 +20,7 @@ from DIRAC.Core.Utilities.ClassAd.ClassAdLight import ClassAd from DIRAC.Core.Utilities.ObjectLoader import ObjectLoader from DIRAC.Core.Utilities.TimeUtilities import fromString, second, toEpoch +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.WorkloadManagementSystem.Client import JobMinorStatus, JobStatus from DIRAC.WorkloadManagementSystem.DB.JobParametersDB import getJobParameters from DIRAC.WorkloadManagementSystem.DB.StatusUtils import kill_delete_jobs diff --git a/src/DIRAC/WorkloadManagementSystem/Agent/StatesAccountingAgent.py b/src/DIRAC/WorkloadManagementSystem/Agent/StatesAccountingAgent.py index 1140542b3ae..fc82f1ff3c0 100644 --- a/src/DIRAC/WorkloadManagementSystem/Agent/StatesAccountingAgent.py +++ b/src/DIRAC/WorkloadManagementSystem/Agent/StatesAccountingAgent.py @@ -7,8 +7,6 @@ :dedent: 2 :caption: StatesAccountingAgent options """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime -import datetime from DIRAC import S_ERROR, S_OK, gConfig from DIRAC.AccountingSystem.Client.DataStoreClient import DataStoreClient @@ -17,6 +15,7 @@ from DIRAC.ConfigurationSystem.Client.Helpers.Resources import getSites from DIRAC.Core.Base.AgentModule import AgentModule from DIRAC.Core.Utilities import TimeUtilities +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.MonitoringSystem.Client.MonitoringReporter import MonitoringReporter from DIRAC.WorkloadManagementSystem.DB.JobDB import JobDB from DIRAC.WorkloadManagementSystem.DB.PilotAgentsDB import PilotAgentsDB diff --git a/src/DIRAC/WorkloadManagementSystem/Client/JobReport.py b/src/DIRAC/WorkloadManagementSystem/Client/JobReport.py index 4ebd04ffa62..e8e6324787e 100644 --- a/src/DIRAC/WorkloadManagementSystem/Client/JobReport.py +++ b/src/DIRAC/WorkloadManagementSystem/Client/JobReport.py @@ -1,12 +1,11 @@ """ JobReport class encapsulates various methods of the job status reporting. It's an interface to JobStateUpdateClient, used when bulk submission is needed. """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime -import datetime from collections import defaultdict from DIRAC import S_ERROR, S_OK, gLogger from DIRAC.Core.Utilities import DEncode +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.RequestManagementSystem.Client.Operation import Operation from DIRAC.WorkloadManagementSystem.Client.JobStateUpdateClient import JobStateUpdateClient diff --git a/src/DIRAC/WorkloadManagementSystem/Client/JobState/CachedJobState.py b/src/DIRAC/WorkloadManagementSystem/Client/JobState/CachedJobState.py index f45bc911d27..0f10044ec2c 100644 --- a/src/DIRAC/WorkloadManagementSystem/Client/JobState/CachedJobState.py +++ b/src/DIRAC/WorkloadManagementSystem/Client/JobState/CachedJobState.py @@ -3,13 +3,12 @@ IIUC this is a wrapper around the JobState object. It basically tries to cache everything locally instead of going to the DB. """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime import copy -import datetime import time from DIRAC import S_ERROR, S_OK, gLogger from DIRAC.Core.Utilities import DEncode +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.WorkloadManagementSystem.Client.JobState.JobManifest import JobManifest from DIRAC.WorkloadManagementSystem.Client.JobState.JobState import JobState diff --git a/src/DIRAC/WorkloadManagementSystem/DB/JobLoggingDB.py b/src/DIRAC/WorkloadManagementSystem/DB/JobLoggingDB.py index 1fecc760d95..326b3180b19 100755 --- a/src/DIRAC/WorkloadManagementSystem/DB/JobLoggingDB.py +++ b/src/DIRAC/WorkloadManagementSystem/DB/JobLoggingDB.py @@ -6,13 +6,13 @@ deleteJob() getWMSTimeStamps() """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime from DIRAC import S_ERROR, S_OK from DIRAC.Core.Base.DB import DB from DIRAC.Core.Utilities import TimeUtilities from DIRAC.Core.Utilities.ReturnValues import returnValueOrRaise, convertToReturnValue +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.FrameworkSystem.Client.Logger import contextLogger MAGIC_EPOC_NUMBER = 1270000000 diff --git a/src/DIRAC/WorkloadManagementSystem/DB/PilotAgentsDB.py b/src/DIRAC/WorkloadManagementSystem/DB/PilotAgentsDB.py index b8b466b0b57..2bd9f79e292 100755 --- a/src/DIRAC/WorkloadManagementSystem/DB/PilotAgentsDB.py +++ b/src/DIRAC/WorkloadManagementSystem/DB/PilotAgentsDB.py @@ -3,8 +3,6 @@ It also registers the mapping of the DIRAC jobs to the pilot agents. """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime -import datetime import decimal import threading @@ -16,6 +14,7 @@ from DIRAC.Core.Utilities import DErrno from DIRAC.Core.Utilities.MySQL import _quotedList from DIRAC.Core.Utilities.ReturnValues import returnValueOrRaise +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.FrameworkSystem.Client.Logger import contextLogger from DIRAC.ResourceStatusSystem.Client.SiteStatus import SiteStatus from DIRAC.WorkloadManagementSystem.Client import PilotStatus diff --git a/src/DIRAC/WorkloadManagementSystem/JobWrapper/JobWrapper.py b/src/DIRAC/WorkloadManagementSystem/JobWrapper/JobWrapper.py index 98c2622d384..524c38933ef 100755 --- a/src/DIRAC/WorkloadManagementSystem/JobWrapper/JobWrapper.py +++ b/src/DIRAC/WorkloadManagementSystem/JobWrapper/JobWrapper.py @@ -11,9 +11,7 @@ """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime import contextlib -import datetime import glob import json import os @@ -38,6 +36,7 @@ from DIRAC.Core.Utilities.ObjectLoader import ObjectLoader from DIRAC.Core.Utilities.SiteSEMapping import getSEsForSite from DIRAC.Core.Utilities.Subprocess import Subprocess, systemCall +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.Core.Utilities.Version import getCurrentVersion from DIRAC.DataManagementSystem.Client.DataManager import DataManager from DIRAC.DataManagementSystem.Client.FailoverTransfer import FailoverTransfer diff --git a/src/DIRAC/WorkloadManagementSystem/JobWrapper/Watchdog.py b/src/DIRAC/WorkloadManagementSystem/JobWrapper/Watchdog.py index e6b09294a21..652c6ef938f 100755 --- a/src/DIRAC/WorkloadManagementSystem/JobWrapper/Watchdog.py +++ b/src/DIRAC/WorkloadManagementSystem/JobWrapper/Watchdog.py @@ -9,8 +9,6 @@ job. """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime -import datetime import errno import getpass import math @@ -25,6 +23,7 @@ from DIRAC.ConfigurationSystem.Client.Config import gConfig from DIRAC.Core.Utilities.Os import getDiskSpace from DIRAC.Core.Utilities.Profiler import Profiler +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.WorkloadManagementSystem.Client import JobMinorStatus from DIRAC.WorkloadManagementSystem.Client.JobStateUpdateClient import JobStateUpdateClient diff --git a/src/DIRAC/WorkloadManagementSystem/Utilities/PilotCStoJSONSynchronizer.py b/src/DIRAC/WorkloadManagementSystem/Utilities/PilotCStoJSONSynchronizer.py index 601c8fc32e5..3166d041339 100644 --- a/src/DIRAC/WorkloadManagementSystem/Utilities/PilotCStoJSONSynchronizer.py +++ b/src/DIRAC/WorkloadManagementSystem/Utilities/PilotCStoJSONSynchronizer.py @@ -5,7 +5,6 @@ The module uploads to a web server the latest version of the pilot scripts. """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime import glob import os @@ -19,6 +18,7 @@ from DIRAC.ConfigurationSystem.Client.Helpers.Operations import Operations from DIRAC.ConfigurationSystem.Client.Helpers.Path import cfgPath from DIRAC.Core.Utilities.ReturnValues import DOKReturnType, DReturnType +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import socket from urllib.parse import urlparse diff --git a/src/DIRAC/WorkloadManagementSystem/private/correctors/MonitoringHistoryCorrector.py b/src/DIRAC/WorkloadManagementSystem/private/correctors/MonitoringHistoryCorrector.py index 9c84b99f764..ec1a77159ba 100644 --- a/src/DIRAC/WorkloadManagementSystem/private/correctors/MonitoringHistoryCorrector.py +++ b/src/DIRAC/WorkloadManagementSystem/private/correctors/MonitoringHistoryCorrector.py @@ -2,10 +2,10 @@ which gets resources consumption history data from the OpenSearch Monitoring database """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime from DIRAC import gLogger, S_OK +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.WorkloadManagementSystem.private.correctors.BaseHistoryCorrector import BaseHistoryCorrector from DIRAC.MonitoringSystem.Client.MonitoringClient import MonitoringClient diff --git a/src/DIRAC/WorkloadManagementSystem/private/correctors/WMSHistoryCorrector.py b/src/DIRAC/WorkloadManagementSystem/private/correctors/WMSHistoryCorrector.py index e1a0e5a2a17..df874d57586 100644 --- a/src/DIRAC/WorkloadManagementSystem/private/correctors/WMSHistoryCorrector.py +++ b/src/DIRAC/WorkloadManagementSystem/private/correctors/WMSHistoryCorrector.py @@ -2,13 +2,13 @@ which gets resources consumption history data from the WMSHistory Accounting database """ -from DIRAC.Core.Utilities.TimeUtilities import DiracTime import datetime from DIRAC import gLogger, S_OK from DIRAC.WorkloadManagementSystem.private.correctors.BaseHistoryCorrector import BaseHistoryCorrector from DIRAC.AccountingSystem.Client.ReportsClient import ReportsClient +from DIRAC.Core.Utilities.TimeUtilities import DiracTime class WMSHistoryCorrector(BaseHistoryCorrector): From 932de33efa03bf4210f05dcd2399cedf2770cb22 Mon Sep 17 00:00:00 2001 From: martynia Date: Tue, 28 Jul 2026 18:22:42 +0100 Subject: [PATCH 7/7] fix: revert changes in BatchSystems/Host.py --- src/DIRAC/Resources/Computing/BatchSystems/Host.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/DIRAC/Resources/Computing/BatchSystems/Host.py b/src/DIRAC/Resources/Computing/BatchSystems/Host.py index 4d6ac2c6ab0..b65de5baf35 100644 --- a/src/DIRAC/Resources/Computing/BatchSystems/Host.py +++ b/src/DIRAC/Resources/Computing/BatchSystems/Host.py @@ -4,7 +4,6 @@ # Author: A.T. ######################################################################### - """ Host - class for managing jobs on a host. Host objects are invoked with LocalComputingElement or SSHComputingElement objects """ @@ -23,8 +22,6 @@ import multiprocessing from datetime import datetime, timedelta -from DIRAC.Core.Utilities.TimeUtilities import DiracTime - # Clean job info and output after so many days CLEAN_DELAY = timedelta(7) @@ -126,7 +123,7 @@ def submitJob(self, **kwargs): # Store the job info jobInfo = { "PID": pid, - "SubmissionTime": DiracTime.utcnow().strftime("%Y-%m-%d %H:%M:%S"), + "SubmissionTime": datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S"), "JOBID": stamps[_i], "NCores": nCores, } @@ -218,7 +215,7 @@ def getCEStatus(self, **kwargs): usedCores += jobInfo["NCores"] else: stamp = jobInfo["JOBID"] - jobLife = DiracTime.utcnow() - datetime.strptime(jobInfo["SubmissionTime"], "%Y-%m-%d %H:%M:%S") + jobLife = datetime.utcnow() - datetime.strptime(jobInfo["SubmissionTime"], "%Y-%m-%d %H:%M:%S") if jobLife > CLEAN_DELAY: self.__cleanJob(stamp, infoDir, workDir, outputDir, errorDir)