""" StorageOccupancyPlotter.__bases__: DIRAC.AccountingSystem.private.Plotters.BaseReporter.BaseReporter """ from __future__ import absolute_import from __future__ import division from __future__ import print_function from DIRAC import S_OK, gLogger from DIRAC.AccountingSystem.private.Plotters.BaseReporter import BaseReporter from DIRAC.AccountingSystem.Client.Types.StorageOccupancy import StorageOccupancy __RCSID__ = "c59810311 (2021-10-01 10:44:25 +0200) Chris Burr " class StorageOccupancyPlotter(BaseReporter): """StorageOccupancyPlotter as extension of BaseReporter.""" _typeName = "StorageOccupancy" _typeKeyFields = [dF[0] for dF in StorageOccupancy().definitionKeyFields] # ............................................................................. # Generic Reporter def reporter(self, reportRequest, spaceType, groupingFields=False): """reporter. Generic method used by all the _report methods. Only one method is actually making use of the groupingFields attribute ( `_reportFreeUsedSpace` ). """ reportRequest["condDict"]["SpaceType"] = spaceType if groupingFields: reportRequest["condDict"]["grouping"] = ["SpaceType"] reportRequest["groupingFields"] = (["%s", "%s"], reportRequest["groupingFields"][1] + ["SpaceType"]) selectString = self._getSelectStringForGrouping(reportRequest["groupingFields"]) selectFields = ( selectString + ", %s, %s, SUM(%s/%s)", reportRequest["groupingFields"][1] + ["startTime", "bucketLength", "Space", "entriesInBucket"], ) if groupingFields: # This is a little hack.. reportRequest["groupingFields"] = ("%s, %s", reportRequest["groupingFields"][1]) gLogger.warn(reportRequest) retVal = self._getTimedData( reportRequest["startTime"], reportRequest["endTime"], selectFields, reportRequest["condDict"], reportRequest["groupingFields"], {"convertToGranularity": "average", "checkNone": True}, ) if not retVal["OK"]: return retVal dataDict, granularity = retVal["Value"] self.stripDataField(dataDict, 0) accumMaxValue = self._getAccumulationMaxValue(dataDict) suitableUnits = self._findSuitableUnit(dataDict, accumMaxValue, "bytes") # 3rd value, maxValue is not used baseDataDict, graphDataDict, __, unitName = suitableUnits return S_OK( {"data": baseDataDict, "graphDataDict": graphDataDict, "granularity": granularity, "unit": unitName} ) # ............................................................................. # Generic Plotter def plotter(self, reportRequest, plotInfo, filename): """plotter. Generic plotter method used by all _plot methods. """ startEpoch = reportRequest["startTime"] endEpoch = reportRequest["endTime"] granularity = plotInfo["granularity"] dataDict = plotInfo["graphDataDict"] metadata = { "title": "Space grouped by %s" % reportRequest["grouping"], "starttime": startEpoch, "endtime": endEpoch, "span": granularity, "ylabel": plotInfo["unit"], } dataDict = self._fillWithZero(granularity, startEpoch, endEpoch, dataDict) return self._generateStackedLinePlot(filename, dataDict, metadata) # ............................................................................. _plotFreeUsedSpace = plotter _reportFreeUsedSpaceName = "Free and Used Space" def _reportFreeUsedSpace(self, reportRequest): """_reportFreeUsedSpace.""" return self.reporter(reportRequest, ["Free", "Used"], groupingFields=True) # ............................................................................. _plotTotalSpace = plotter _reportTotalSpaceName = "Total Space" def _reportTotalSpace(self, reportRequest): """_reportTotalSpace.""" return self.reporter(reportRequest, ["Total"]) # ............................................................................. _plotGuaranteedSpace = plotter _reportGuaranteedSpaceName = "Guaranteed Space" def _reportGuaranteedSpace(self, reportRequest): """_reportGuaranteedSpace.""" return self.reporter(reportRequest, ["Guaranteed"]) # ............................................................................. _plotFreeSpace = plotter _reportFreeSpaceName = "Free Space" def _reportFreeSpace(self, reportRequest): """_reportFreeSpace.""" return self.reporter(reportRequest, ["Free"]) # ............................................................................. _plotUsedSpace = plotter _reportUsedSpaceName = "Used Space" def _reportUsedSpace(self, reportRequest): """_reportUsedSpace.""" return self.reporter(reportRequest, ["Used"])