"""Ensure the files have been migrated to tape.""" from __future__ import absolute_import from __future__ import division from __future__ import print_function import datetime from pprint import pformat from DIRAC import S_OK, S_ERROR from DIRAC.Core.Utilities.ReturnValues import returnSingleResult from DIRAC.RequestManagementSystem.private.OperationHandlerBase import OperationHandlerBase from DIRAC.Resources.Storage.StorageElement import StorageElement __RCSID__ = "c59810311 (2021-10-01 10:44:25 +0200) Chris Burr " class CheckMigration(OperationHandlerBase): """CheckMigration operation handler.""" def __init__(self, operation=None, csPath=None): """Initialize the ArchifeFiles handler. :param self: self reference :param Operation operation: Operation instance :param string csPath: CS path for this handler """ OperationHandlerBase.__init__(self, operation, csPath) self.waitingFiles = [] def __call__(self): """Process the CheckMigration operation.""" try: self._run() except Exception as e: self.log.exception("Failed to execute CheckMigration", repr(e), lException=e) return S_ERROR(str(e)) return S_OK() def _run(self): """Check for migration bit, set file done when migrated.""" self.waitingFiles = self.getWaitingFilesList() self.log.notice("Waiting files:", len(self.waitingFiles)) targetSESet = set(self.operation.targetSEList) self.log.notice("Target SEs:", ",".join(targetSESet)) migrated = True for opFile in self.waitingFiles: self.log.notice("Checking:", opFile.LFN) for targetSE in targetSESet: se = StorageElement(targetSE) if not se.status()["TapeSE"]: migrated = True and migrated continue metaData = returnSingleResult(se.getFileMetadata(opFile.LFN)) self.log.debug("MetaData: %s" % pformat(metaData)) if not metaData["OK"]: self.log.error("Failed to get metadata:", "%s: %s" % (opFile.LFN, metaData["Message"])) migrated = False continue migrated = metaData["Value"].get("Migrated", 0) == 1 and migrated if migrated: self.log.notice("File has been migrated:", opFile.LFN) opFile.Status = "Done" else: self.log.notice("File has NOT been migrated:", opFile.LFN) now = datetime.datetime.utcnow().replace(microsecond=0) extraDelay = datetime.timedelta(minutes=20) self.request.NotBefore = now + extraDelay