diff --git a/src/DIRAC/AccountingSystem/Agent/NetworkAgent.py b/src/DIRAC/AccountingSystem/Agent/NetworkAgent.py index f8b6f2bfc67..3bea53b2279 100644 --- a/src/DIRAC/AccountingSystem/Agent/NetworkAgent.py +++ b/src/DIRAC/AccountingSystem/Agent/NetworkAgent.py @@ -15,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 @@ -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..87fd4dee9f8 100644 --- a/src/DIRAC/AccountingSystem/DB/AccountingDB.py +++ b/src/DIRAC/AccountingSystem/DB/AccountingDB.py @@ -10,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() @@ -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..43d5aea3cec 100644 --- a/src/DIRAC/AccountingSystem/Service/ReportGeneratorHandler.py +++ b/src/DIRAC/AccountingSystem/Service/ReportGeneratorHandler.py @@ -19,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 @@ -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..dbcdb91a7bb 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 """ -import datetime from DIRAC import S_ERROR, S_OK, gConfig, gLogger from DIRAC.ConfigurationSystem.Client.ConfigurationClient import ConfigurationClient @@ -15,6 +14,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: @@ -103,8 +103,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, datetime.datetime.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 b21b34ec2f6..d6bbc9d760a 100755 --- a/src/DIRAC/ConfigurationSystem/private/ConfigurationData.py +++ b/src/DIRAC/ConfigurationSystem/private/ConfigurationData.py @@ -6,7 +6,6 @@ import zipfile import _thread import time -import datetime import secrets from diraccfg import CFG @@ -16,6 +15,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 @@ -201,7 +201,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 +326,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..df021038c65 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 """ -import datetime import difflib import zlib @@ -10,6 +9,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 @@ -29,7 +29,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..16845269093 100755 --- a/src/DIRAC/ConfigurationSystem/scripts/dirac_admin_sort_cs_sites.py +++ b/src/DIRAC/ConfigurationSystem/scripts/dirac_admin_sort_cs_sites.py @@ -11,11 +11,11 @@ $ dirac-admin-sort-cs-sites -C CLOUDS DIRAC sort site names by country postfix in '/Resources/Sites/CLOUDS' and '/Resources/Sites/DIRAC' subsection """ -from datetime import datetime 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 @@ -112,7 +112,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..d59bc3a8e6f 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 """ -import datetime import importlib.metadata import inspect import os @@ -20,6 +19,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: @@ -233,7 +233,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..41f0de0b911 100755 --- a/src/DIRAC/Core/DISET/MessageClient.py +++ b/src/DIRAC/Core/DISET/MessageClient.py @@ -1,12 +1,12 @@ import random import threading -import datetime from hashlib import md5 from DIRAC.Core.Utilities.ThreadSafe import Synchronizer 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 @@ -29,7 +29,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..c524535905e 100755 --- a/src/DIRAC/Core/DISET/RequestHandler.py +++ b/src/DIRAC/Core/DISET/RequestHandler.py @@ -1,13 +1,14 @@ """ Base class for all services """ import os -import time, datetime +import time import psutil import DIRAC 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 @@ -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..9c81a5f02f5 100644 --- a/src/DIRAC/Core/DISET/ServiceReactor.py +++ b/src/DIRAC/Core/DISET/ServiceReactor.py @@ -16,7 +16,6 @@ """ import time -import datetime import selectors import signal import os @@ -28,6 +27,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 @@ -260,7 +260,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..5ae7900a7b8 100644 --- a/src/DIRAC/Core/DISET/private/Service.py +++ b/src/DIRAC/Core/DISET/private/Service.py @@ -10,7 +10,6 @@ import os import time -import datetime import threading import psutil @@ -24,11 +23,11 @@ from DIRAC.Core.DISET.private.TransportPool import getGlobalTransportPool from DIRAC.Core.DISET.private.MessageBroker import MessageBroker, MessageSender from DIRAC.Core.DISET.AuthManager import AuthManager -from DIRAC.Core.DISET.RequestHandler import getServiceOption from DIRAC.Core.Utilities import Network, TimeUtilities 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 @@ -50,7 +49,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..6f1f3aca6a9 100644 --- a/src/DIRAC/Core/LCG/GOCDBClient.py +++ b/src/DIRAC/Core/LCG/GOCDBClient.py @@ -13,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): @@ -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..3ae7971a408 100644 --- a/src/DIRAC/Core/Security/VOMS.py +++ b/src/DIRAC/Core/Security/VOMS.py @@ -1,17 +1,17 @@ """ Module for dealing with VOMS (Virtual Organization Membership Service) """ -from datetime import datetime import os import tempfile import shutil -from DIRAC import S_OK, S_ERROR, gConfig, rootPath, gLogger +from DIRAC import S_OK, S_ERROR, gConfig from DIRAC.Core.Utilities import DErrno from DIRAC.Core.Security import Locations 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 @@ -167,11 +167,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 +206,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..1b561f6d603 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 """ -import datetime import os import secrets import time @@ -20,6 +19,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)) @@ -201,7 +201,7 @@ def hasExpired(self): return res notAfter = res["Value"] - now = datetime.datetime.utcnow() + now = DiracTime.utcnow() return S_OK(notAfter < now) @@ -440,7 +440,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..a2cc4df2c7f 100644 --- a/src/DIRAC/Core/Tornado/Server/TornadoService.py +++ b/src/DIRAC/Core/Tornado/Server/TornadoService.py @@ -5,13 +5,13 @@ import os -from datetime import datetime from tornado.web import url as TornadoURL import DIRAC -from DIRAC import gLogger, S_OK +from DIRAC import S_OK from DIRAC.Core.Tornado.Server.private.BaseRequestHandler import BaseRequestHandler +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.ConfigurationSystem.Client import PathFinder @@ -182,7 +182,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 +192,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..efdce5769f5 100644 --- a/src/DIRAC/Core/Tornado/Server/private/BaseRequestHandler.py +++ b/src/DIRAC/Core/Tornado/Server/private/BaseRequestHandler.py @@ -7,7 +7,6 @@ import time import inspect import threading -from datetime import datetime from http import HTTPStatus from urllib.parse import unquote @@ -24,6 +23,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 @@ -441,7 +441,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..2686b598065 100755 --- a/src/DIRAC/Core/Utilities/DEncode.py +++ b/src/DIRAC/Core/Utilities/DEncode.py @@ -22,6 +22,7 @@ from pprint import pformat from DIRAC import gLogger +from DIRAC.Core.Utilities.TimeUtilities import DiracTime def _ord(char): @@ -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..32929886d60 100644 --- a/src/DIRAC/Core/Utilities/ElasticSearchDB.py +++ b/src/DIRAC/Core/Utilities/ElasticSearchDB.py @@ -9,6 +9,7 @@ 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 @@ -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..731440fc637 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 ... """ -import datetime from pylab import setp from matplotlib.patches import Polygon @@ -18,6 +17,7 @@ PrettyDateFormatter, PrettyScalarFormatter, ) +from DIRAC.Core.Utilities.TimeUtilities import DiracTime class BarGraph(PlotBase): @@ -65,8 +65,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..49965ae47a8 100644 --- a/src/DIRAC/Core/Utilities/Graphs/CurveGraph.py +++ b/src/DIRAC/Core/Utilities/Graphs/CurveGraph.py @@ -11,9 +11,9 @@ PrettyDateFormatter, PrettyScalarFormatter, ) +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from matplotlib.lines import Line2D from matplotlib.dates import date2num -import datetime class CurveGraph(PlotBase): @@ -35,8 +35,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..4809319f8a8 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 ... """ -import datetime import importlib import os import time @@ -16,6 +15,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 @@ -103,7 +103,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..fa37076cdd5 100644 --- a/src/DIRAC/Core/Utilities/Graphs/GraphData.py +++ b/src/DIRAC/Core/Utilities/Graphs/GraphData.py @@ -5,12 +5,12 @@ """ import time -import datetime import numpy 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 @@ -194,9 +194,7 @@ def makeNumKeys(self): self.all_num_keys.append(next) next += 1 elif self.key_type == "time": - self.all_num_keys = [ - date2num(datetime.datetime.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] @@ -411,7 +409,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..096053aadbf 100644 --- a/src/DIRAC/Core/Utilities/Graphs/GraphUtilities.py +++ b/src/DIRAC/Core/Utilities/Graphs/GraphUtilities.py @@ -29,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 @@ -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..6673fb93c78 100644 --- a/src/DIRAC/Core/Utilities/Graphs/LineGraph.py +++ b/src/DIRAC/Core/Utilities/Graphs/LineGraph.py @@ -11,9 +11,9 @@ PrettyDateFormatter, PrettyScalarFormatter, ) +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from matplotlib.patches import Polygon from matplotlib.dates import date2num -import datetime class LineGraph(PlotBase): @@ -49,8 +49,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..858b280a9a2 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 ... """ -import datetime from pylab import setp from matplotlib.colors import Normalize import matplotlib.cm as cm @@ -20,6 +19,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)), @@ -113,8 +113,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..6948d3d893e 100644 --- a/src/DIRAC/Core/Utilities/Profiler.py +++ b/src/DIRAC/Core/Utilities/Profiler.py @@ -7,6 +7,7 @@ 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): @@ -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..c509ff53c85 100644 --- a/src/DIRAC/DataManagementSystem/Agent/FTS3Agent.py +++ b/src/DIRAC/DataManagementSystem/Agent/FTS3Agent.py @@ -31,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 @@ -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..bf5c750cf8c 100644 --- a/src/DIRAC/DataManagementSystem/Agent/RequestOperations/CheckMigration.py +++ b/src/DIRAC/DataManagementSystem/Agent/RequestOperations/CheckMigration.py @@ -4,6 +4,7 @@ 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 @@ -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..bc7d1bd338d 100644 --- a/src/DIRAC/DataManagementSystem/Client/DataManager.py +++ b/src/DIRAC/DataManagementSystem/Client/DataManager.py @@ -14,7 +14,7 @@ import fnmatch import os import time -from datetime import datetime, timedelta +from datetime import timedelta # # from DIRAC import DIRAC @@ -24,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 @@ -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..bfb1e104d4a 100644 --- a/src/DIRAC/DataManagementSystem/Client/FTS3File.py +++ b/src/DIRAC/DataManagementSystem/Client/FTS3File.py @@ -1,5 +1,5 @@ -import datetime from DIRAC.Core.Utilities.JEncode import JSerializable +from DIRAC.Core.Utilities.TimeUtilities import DiracTime class FTS3File(JSerializable): @@ -63,7 +63,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..b534b212332 100644 --- a/src/DIRAC/DataManagementSystem/Client/FTS3Job.py +++ b/src/DIRAC/DataManagementSystem/Client/FTS3Job.py @@ -38,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 @@ -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..796156f9f2e 100644 --- a/src/DIRAC/DataManagementSystem/Client/FTS3Operation.py +++ b/src/DIRAC/DataManagementSystem/Client/FTS3Operation.py @@ -1,4 +1,3 @@ -import datetime import errno import json from sqlalchemy import orm @@ -21,6 +20,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 @@ -116,7 +116,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..f00693127b7 100644 --- a/src/DIRAC/DataManagementSystem/DB/FTS3DB.py +++ b/src/DIRAC/DataManagementSystem/DB/FTS3DB.py @@ -35,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 @@ -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..b9204bb6449 100755 --- a/src/DIRAC/DataManagementSystem/DB/FileCatalogComponents/FileManager/FileManagerPs.py +++ b/src/DIRAC/DataManagementSystem/DB/FileCatalogComponents/FileManager/FileManagerPs.py @@ -1,11 +1,11 @@ """FileManager for ... ?""" import os -import datetime 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 @@ -221,7 +221,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 +465,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..acdd0999433 100755 --- a/src/DIRAC/DataManagementSystem/scripts/dirac_dms_user_lfns.py +++ b/src/DIRAC/DataManagementSystem/scripts/dirac_dms_user_lfns.py @@ -17,7 +17,8 @@ """ import fnmatch -from datetime import datetime, timedelta +from datetime import timedelta +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.Core.Base.Script import Script @@ -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..b64bda5cfbe 100644 --- a/src/DIRAC/FrameworkSystem/Client/SecurityLogClient.py +++ b/src/DIRAC/FrameworkSystem/Client/SecurityLogClient.py @@ -1,7 +1,7 @@ """ For reporting messages to security log service """ +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import syslog -import datetime from DIRAC import gLogger, gConfig from DIRAC.Core.Base.Client import Client @@ -30,7 +30,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..f4def1453c4 100644 --- a/src/DIRAC/FrameworkSystem/Service/SystemAdministratorHandler.py +++ b/src/DIRAC/FrameworkSystem/Service/SystemAdministratorHandler.py @@ -9,7 +9,7 @@ import subprocess import tempfile import time -from datetime import datetime, timedelta +from datetime import timedelta import psutil import requests @@ -27,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 @@ -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..6329f540ed3 100644 --- a/src/DIRAC/FrameworkSystem/Utilities/MonitoringUtilities.py +++ b/src/DIRAC/FrameworkSystem/Utilities/MonitoringUtilities.py @@ -2,7 +2,7 @@ Utilities for ComponentMonitoring features """ -import datetime +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import socket from DIRAC import S_OK @@ -45,7 +45,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 +78,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..a4042ed833f 100755 --- a/src/DIRAC/FrameworkSystem/scripts/dirac_admin_users_with_proxy.py +++ b/src/DIRAC/FrameworkSystem/scripts/dirac_admin_users_with_proxy.py @@ -17,11 +17,11 @@ group : dirac_user not after : 2011-06-29 12:04:30 """ -import datetime 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 @@ -56,7 +56,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..1f7a88211a5 100755 --- a/src/DIRAC/Interfaces/API/Dirac.py +++ b/src/DIRAC/Interfaces/API/Dirac.py @@ -13,7 +13,7 @@ - Local execution of workflows for testing purposes. """ -import datetime +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import glob import io import os @@ -1778,7 +1778,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..8dc65514908 100755 --- a/src/DIRAC/Interfaces/scripts/dirac_wms_job_delete.py +++ b/src/DIRAC/Interfaces/scripts/dirac_wms_job_delete.py @@ -10,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 @@ -39,7 +39,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..edb99c1becb 100755 --- a/src/DIRAC/Interfaces/scripts/dirac_wms_job_get_output.py +++ b/src/DIRAC/Interfaces/scripts/dirac_wms_job_get_output.py @@ -12,7 +12,7 @@ """ import os import shutil -import datetime +from DIRAC.Core.Utilities.TimeUtilities import DiracTime import DIRAC from DIRAC.Core.Base.Script import Script @@ -48,7 +48,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..469cf9bd9fa 100755 --- a/src/DIRAC/Interfaces/scripts/dirac_wms_job_status.py +++ b/src/DIRAC/Interfaces/scripts/dirac_wms_job_status.py @@ -10,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 @@ -38,7 +38,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..03edf9a1199 100755 --- a/src/DIRAC/Interfaces/scripts/doutput.py +++ b/src/DIRAC/Interfaces/scripts/doutput.py @@ -5,6 +5,7 @@ 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 @@ -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..eee9b789cf1 100755 --- a/src/DIRAC/Interfaces/scripts/dstat.py +++ b/src/DIRAC/Interfaces/scripts/dstat.py @@ -5,13 +5,13 @@ $ dstat -a -u your.dirac.username """ -import datetime from DIRAC import exit as DIRACExit, S_OK, S_ERROR from DIRAC import gLogger 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 @@ -208,7 +208,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..52313d10e71 100644 --- a/src/DIRAC/RequestManagementSystem/Agent/CleanReqDBAgent.py +++ b/src/DIRAC/RequestManagementSystem/Agent/CleanReqDBAgent.py @@ -27,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" @@ -83,7 +85,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 +147,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..01014cc846f 100644 --- a/src/DIRAC/RequestManagementSystem/Client/File.py +++ b/src/DIRAC/RequestManagementSystem/Client/File.py @@ -19,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 @@ -144,7 +146,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..8c1accb88f9 100644 --- a/src/DIRAC/RequestManagementSystem/Client/Operation.py +++ b/src/DIRAC/RequestManagementSystem/Client/Operation.py @@ -2,7 +2,6 @@ # File: Operation.py # Date: 2012/07/24 12:12:05 ######################################################################## - """ :mod: Operation @@ -18,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 @@ -78,7 +78,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 +129,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 +265,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..f13c36cddcc 100755 --- a/src/DIRAC/RequestManagementSystem/Client/ReqClient.py +++ b/src/DIRAC/RequestManagementSystem/Client/ReqClient.py @@ -6,7 +6,6 @@ """ -import datetime import json import os import random @@ -22,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 @@ -469,7 +469,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..11b0c459cf5 100644 --- a/src/DIRAC/RequestManagementSystem/Client/Request.py +++ b/src/DIRAC/RequestManagementSystem/Client/Request.py @@ -15,6 +15,7 @@ # # 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 @@ -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..8407f3715c6 100644 --- a/src/DIRAC/RequestManagementSystem/DB/RequestDB.py +++ b/src/DIRAC/RequestManagementSystem/DB/RequestDB.py @@ -1,5 +1,4 @@ # We disable pylint no-callable because of https://github.com/PyCQA/pylint/issues/8138 - """Frontend for ReqDB :mod: RequestDB @@ -13,7 +12,6 @@ db holding Request, Operation and File """ -import datetime import errno import random from urllib.parse import quote_plus @@ -42,6 +40,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 @@ -277,7 +276,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 +399,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 +458,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 +507,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 +542,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..155f4bb70f0 100755 --- a/src/DIRAC/RequestManagementSystem/Service/ReqManagerHandler.py +++ b/src/DIRAC/RequestManagementSystem/Service/ReqManagerHandler.py @@ -18,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 @@ -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..4ebf559e015 100755 --- a/src/DIRAC/RequestManagementSystem/scripts/dirac_rms_request.py +++ b/src/DIRAC/RequestManagementSystem/scripts/dirac_rms_request.py @@ -4,6 +4,7 @@ """ import datetime import os +from DIRAC.Core.Utilities.TimeUtilities import DiracTime from DIRAC.Core.Base.Script import Script @@ -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..16149dc446c 100644 --- a/src/DIRAC/ResourceStatusSystem/Agent/ElementInspectorAgent.py +++ b/src/DIRAC/ResourceStatusSystem/Agent/ElementInspectorAgent.py @@ -17,6 +17,7 @@ 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 @@ -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..2c40524b89d 100644 --- a/src/DIRAC/ResourceStatusSystem/Agent/SiteInspectorAgent.py +++ b/src/DIRAC/ResourceStatusSystem/Agent/SiteInspectorAgent.py @@ -16,6 +16,7 @@ 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" @@ -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..bff561ff77a 100644 --- a/src/DIRAC/ResourceStatusSystem/Agent/SummarizeLogsAgent.py +++ b/src/DIRAC/ResourceStatusSystem/Agent/SummarizeLogsAgent.py @@ -18,10 +18,11 @@ :caption: SummarizeLogsAgent options """ -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" @@ -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..a745c276d15 100644 --- a/src/DIRAC/ResourceStatusSystem/Agent/TokenAgent.py +++ b/src/DIRAC/ResourceStatusSystem/Agent/TokenAgent.py @@ -16,6 +16,7 @@ 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 @@ -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..c2b6424662c 100644 --- a/src/DIRAC/ResourceStatusSystem/Client/ResourceStatus.py +++ b/src/DIRAC/ResourceStatusSystem/Client/ResourceStatus.py @@ -7,11 +7,12 @@ """ 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 @@ -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..cd5afd35697 100644 --- a/src/DIRAC/ResourceStatusSystem/Client/SiteStatus.py +++ b/src/DIRAC/ResourceStatusSystem/Client/SiteStatus.py @@ -7,13 +7,14 @@ import errno 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.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 @@ -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..0699e235a70 100644 --- a/src/DIRAC/ResourceStatusSystem/Command/DowntimeCommand.py +++ b/src/DIRAC/ResourceStatusSystem/Command/DowntimeCommand.py @@ -4,7 +4,7 @@ GOCDB downtimes that are modified or deleted are also synced. """ import re -from datetime import datetime, timedelta +from datetime import timedelta from operator import itemgetter from urllib.error import URLError @@ -19,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 @@ -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..f96e45ee132 100644 --- a/src/DIRAC/ResourceStatusSystem/Command/FreeDiskSpaceCommand.py +++ b/src/DIRAC/ResourceStatusSystem/Command/FreeDiskSpaceCommand.py @@ -10,12 +10,13 @@ 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 @@ -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..a6a13a9fccf 100644 --- a/src/DIRAC/ResourceStatusSystem/Command/TransferCommand.py +++ b/src/DIRAC/ResourceStatusSystem/Command/TransferCommand.py @@ -1,9 +1,10 @@ """ TransferCommand module """ -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 @@ -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..5313d7c488f 100644 --- a/src/DIRAC/ResourceStatusSystem/DB/ResourceManagementDB.py +++ b/src/DIRAC/ResourceStatusSystem/DB/ResourceManagementDB.py @@ -16,7 +16,6 @@ """ -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 @@ -24,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 @@ -76,13 +76,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 +130,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 +163,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 +205,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 +248,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 +302,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 +338,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 +423,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..56c523b6a94 100644 --- a/src/DIRAC/ResourceStatusSystem/DB/ResourceStatusDB.py +++ b/src/DIRAC/ResourceStatusSystem/DB/ResourceStatusDB.py @@ -24,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"] @@ -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..d99bd44eb10 100644 --- a/src/DIRAC/ResourceStatusSystem/Service/PublisherHandler.py +++ b/src/DIRAC/ResourceStatusSystem/Service/PublisherHandler.py @@ -13,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 @@ -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..bdee5af8f08 100644 --- a/src/DIRAC/ResourceStatusSystem/Utilities/RSSCache.py +++ b/src/DIRAC/ResourceStatusSystem/Utilities/RSSCache.py @@ -10,6 +10,7 @@ from DIRAC import S_OK, S_ERROR from DIRAC.Core.Utilities.DictCache import DictCache +from DIRAC.Core.Utilities.TimeUtilities import DiracTime class RSSCache: @@ -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..cdcb8cc5bf7 100755 --- a/src/DIRAC/ResourceStatusSystem/scripts/dirac_rss_query_db.py +++ b/src/DIRAC/ResourceStatusSystem/scripts/dirac_rss_query_db.py @@ -14,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 @@ -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..3bd266414ee 100755 --- a/src/DIRAC/ResourceStatusSystem/scripts/dirac_rss_query_dtcache.py +++ b/src/DIRAC/ResourceStatusSystem/scripts/dirac_rss_query_dtcache.py @@ -11,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(): @@ -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..0cc3311c582 100755 --- a/src/DIRAC/ResourceStatusSystem/scripts/dirac_rss_set_status.py +++ b/src/DIRAC/ResourceStatusSystem/scripts/dirac_rss_set_status.py @@ -11,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 @@ -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..9474e16a6f0 100755 --- a/src/DIRAC/ResourceStatusSystem/scripts/dirac_rss_set_token.py +++ b/src/DIRAC/ResourceStatusSystem/scripts/dirac_rss_set_token.py @@ -16,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 = {} @@ -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/CloudComputingElement.py b/src/DIRAC/Resources/Computing/CloudComputingElement.py index a95b97ed006..a0c0a6e2239 100644 --- a/src/DIRAC/Resources/Computing/CloudComputingElement.py +++ b/src/DIRAC/Resources/Computing/CloudComputingElement.py @@ -152,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 @@ -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..563b0e0de3c 100644 --- a/src/DIRAC/Resources/Computing/HTCondorCEComputingElement.py +++ b/src/DIRAC/Resources/Computing/HTCondorCEComputingElement.py @@ -48,11 +48,9 @@ # created documentation, there should only be one slash when setting the option, # but "\n" gets rendered as a linebreak in sphinx -import datetime import errno import json import os -import subprocess import tempfile import textwrap import threading @@ -63,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, @@ -85,7 +84,7 @@ class HTCondorCEComputingElement(ComputingElement): """ # static variables to ensure single cleanup every minute - _lastCleanupTime = datetime.datetime.utcnow() + _lastCleanupTime = DiracTime.utcnow() _cleanupLock = threading.Lock() ############################################################################# @@ -573,7 +572,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..2c562f6758f 100755 --- a/src/DIRAC/Resources/Storage/StorageElement.py +++ b/src/DIRAC/Resources/Storage/StorageElement.py @@ -3,7 +3,6 @@ # # custom duty - from copy import deepcopy import datetime import errno @@ -27,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 @@ -1317,7 +1317,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..1cc74a653f3 100755 --- a/src/DIRAC/StorageManagementSystem/Agent/StageMonitorAgent.py +++ b/src/DIRAC/StorageManagementSystem/Agent/StageMonitorAgent.py @@ -9,7 +9,6 @@ :dedent: 2 """ -import datetime from DIRAC import gLogger, S_OK, S_ERROR, siteName @@ -18,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 @@ -86,7 +86,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 +118,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..9e998c7fb7b 100644 --- a/src/DIRAC/TransformationSystem/Agent/InputDataAgent.py +++ b/src/DIRAC/TransformationSystem/Agent/InputDataAgent.py @@ -22,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 @@ -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..4dfcb053aa0 100644 --- a/src/DIRAC/TransformationSystem/Agent/TaskManagerAgentBase.py +++ b/src/DIRAC/TransformationSystem/Agent/TaskManagerAgentBase.py @@ -17,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 @@ -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..448168755e2 100644 --- a/src/DIRAC/TransformationSystem/Agent/TransformationAgent.py +++ b/src/DIRAC/TransformationSystem/Agent/TransformationAgent.py @@ -23,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 @@ -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..0f8edacc162 100644 --- a/src/DIRAC/TransformationSystem/Agent/TransformationCleaningAgent.py +++ b/src/DIRAC/TransformationSystem/Agent/TransformationCleaningAgent.py @@ -13,7 +13,7 @@ import errno import os import re -from datetime import datetime, timedelta +from datetime import timedelta # # from DIRAC from DIRAC import S_ERROR, S_OK @@ -24,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 @@ -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..b9c55899742 100644 --- a/src/DIRAC/TransformationSystem/Service/TransformationManagerHandler.py +++ b/src/DIRAC/TransformationSystem/Service/TransformationManagerHandler.py @@ -9,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 @@ -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..4380806ffbf 100644 --- a/src/DIRAC/WorkloadManagementSystem/Agent/JobCleaningAgent.py +++ b/src/DIRAC/WorkloadManagementSystem/Agent/JobCleaningAgent.py @@ -23,7 +23,6 @@ """ -import datetime import os from DIRAC import S_ERROR, S_OK @@ -31,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 @@ -157,7 +157,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 +394,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..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 @@ -16,6 +15,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 @@ -81,9 +81,7 @@ def handleOldPilots(self, connection): Deleted, accounting for them. """ pilotsToAccount = {} - timeLimitToConsider = TimeUtilities.toString( - datetime.datetime.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" ) @@ -112,7 +110,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 +228,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..c3ebb90e8fd 100644 --- a/src/DIRAC/WorkloadManagementSystem/Agent/SiteDirector.py +++ b/src/DIRAC/WorkloadManagementSystem/Agent/SiteDirector.py @@ -8,7 +8,6 @@ """ -import datetime import os from collections import defaultdict from concurrent.futures import ThreadPoolExecutor, as_completed @@ -27,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 @@ -836,7 +836,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 +1006,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 +1055,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..b5167e49d0f 100755 --- a/src/DIRAC/WorkloadManagementSystem/Agent/StalledJobAgent.py +++ b/src/DIRAC/WorkloadManagementSystem/Agent/StalledJobAgent.py @@ -20,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 @@ -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..fc82f1ff3c0 100644 --- a/src/DIRAC/WorkloadManagementSystem/Agent/StatesAccountingAgent.py +++ b/src/DIRAC/WorkloadManagementSystem/Agent/StatesAccountingAgent.py @@ -7,7 +7,6 @@ :dedent: 2 :caption: StatesAccountingAgent options """ -import datetime from DIRAC import S_ERROR, S_OK, gConfig from DIRAC.AccountingSystem.Client.DataStoreClient import DataStoreClient @@ -16,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 @@ -89,7 +89,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 +113,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..e8e6324787e 100644 --- a/src/DIRAC/WorkloadManagementSystem/Client/JobReport.py +++ b/src/DIRAC/WorkloadManagementSystem/Client/JobReport.py @@ -1,11 +1,11 @@ """ JobReport class encapsulates various methods of the job status reporting. It's an interface to JobStateUpdateClient, used when bulk submission is needed. """ -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 @@ -31,7 +31,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 +44,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..0f10044ec2c 100644 --- a/src/DIRAC/WorkloadManagementSystem/Client/JobState/CachedJobState.py +++ b/src/DIRAC/WorkloadManagementSystem/Client/JobState/CachedJobState.py @@ -4,11 +4,11 @@ everything locally instead of going to the DB. """ 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 @@ -296,7 +296,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..d1b1f08c096 100755 --- a/src/DIRAC/WorkloadManagementSystem/DB/JobDB.py +++ b/src/DIRAC/WorkloadManagementSystem/DB/JobDB.py @@ -31,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 @@ -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..326b3180b19 100755 --- a/src/DIRAC/WorkloadManagementSystem/DB/JobLoggingDB.py +++ b/src/DIRAC/WorkloadManagementSystem/DB/JobLoggingDB.py @@ -12,6 +12,7 @@ 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 @@ -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..2bd9f79e292 100755 --- a/src/DIRAC/WorkloadManagementSystem/DB/PilotAgentsDB.py +++ b/src/DIRAC/WorkloadManagementSystem/DB/PilotAgentsDB.py @@ -3,7 +3,6 @@ It also registers the mapping of the DIRAC jobs to the pilot agents. """ -import datetime import decimal import threading @@ -15,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 @@ -658,7 +658,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 +670,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 +1088,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..864515f35ed 100644 --- a/src/DIRAC/WorkloadManagementSystem/FutureClient/JobStateUpdateClient.py +++ b/src/DIRAC/WorkloadManagementSystem/FutureClient/JobStateUpdateClient.py @@ -7,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 @@ -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..524c38933ef 100755 --- a/src/DIRAC/WorkloadManagementSystem/JobWrapper/JobWrapper.py +++ b/src/DIRAC/WorkloadManagementSystem/JobWrapper/JobWrapper.py @@ -12,7 +12,6 @@ """ import contextlib -import datetime import glob import json import os @@ -37,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 @@ -664,7 +664,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..652c6ef938f 100755 --- a/src/DIRAC/WorkloadManagementSystem/JobWrapper/Watchdog.py +++ b/src/DIRAC/WorkloadManagementSystem/JobWrapper/Watchdog.py @@ -9,7 +9,6 @@ job. """ -import datetime import errno import getpass import math @@ -24,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 @@ -308,7 +308,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..741fabeb982 100644 --- a/src/DIRAC/WorkloadManagementSystem/Utilities/JobStatusUtility.py +++ b/src/DIRAC/WorkloadManagementSystem/Utilities/JobStatusUtility.py @@ -2,12 +2,12 @@ from __future__ import annotations -from datetime import datetime -from typing import TYPE_CHECKING, Any +from typing import TYPE_CHECKING 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 @@ -70,7 +70,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..2eefaeb7c0d 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. """ -import datetime import glob import os import shutil @@ -18,6 +17,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 @@ -131,7 +131,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..ec1a77159ba 100644 --- a/src/DIRAC/WorkloadManagementSystem/private/correctors/MonitoringHistoryCorrector.py +++ b/src/DIRAC/WorkloadManagementSystem/private/correctors/MonitoringHistoryCorrector.py @@ -5,6 +5,7 @@ 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 @@ -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..df874d57586 100644 --- a/src/DIRAC/WorkloadManagementSystem/private/correctors/WMSHistoryCorrector.py +++ b/src/DIRAC/WorkloadManagementSystem/private/correctors/WMSHistoryCorrector.py @@ -8,6 +8,7 @@ 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): @@ -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",