def METHOD_NAME(self, cpuConsumed=0.0, processors=1):
    """Returns the CPU Time Left for supported batch systems.
    The CPUConsumed is the current raw total CPU.
    """
    # Quit if no norm factor available
    if not self.cpuPower:
        return S_ERROR(f"/LocalSite/CPUNormalizationFactor not defined for site {DIRAC.siteName()}")
    if not self.batchPlugin:
        return S_ERROR(self.batchError)
    resourceDict = self.batchPlugin.getResourceUsage()
    if not resourceDict["OK"]:
        self.log.warn(f"Could not determine timeleft for batch system at site {DIRAC.siteName()}")
        return resourceDict
    resources = resourceDict["Value"]
    self.log.debug(f"self.batchPlugin.getResourceUsage(): {str(resources)}")
    if not resources.get("CPULimit") and not resources.get("WallClockLimit"):
        # This should never happen
        return S_ERROR("No CPU or WallClock limit obtained")
    # if one of CPULimit or WallClockLimit is missing, compute a reasonable value
    if not resources.get("CPULimit"):
        resources["CPULimit"] = resources["WallClockLimit"] * processors
    elif not resources.get("WallClockLimit"):
        resources["WallClockLimit"] = resources["CPULimit"] / processors
    # if one of CPU or WallClock is missing, compute a reasonable value
    if not resources.get("CPU"):
        resources["CPU"] = resources["WallClock"] * processors
    elif not resources.get("WallClock"):
        resources["WallClock"] = resources["CPU"] / processors
    cpu = float(resources["CPU"])
    cpuLimit = float(resources["CPULimit"])
    wallClock = float(resources["WallClock"])
    wallClockLimit = float(resources["WallClockLimit"])
    batchSystemTimeUnit = resources.get("Unit", "Both")
    # Some batch systems rely on wall clock time and/or cpu time to make allocations
    if batchSystemTimeUnit == "WallClock":
        time = wallClock
        timeLimit = wallClockLimit
    else:
        time = cpu
        timeLimit = cpuLimit
    if time and cpuConsumed > 3600.0 and self.cpuPower:
        # If there has been more than 1 hour of consumed CPU and
        # there is a Normalization set for the current CPU
        # use that value to renormalize the values returned by the batch system
        # NOTE: cpuConsumed is non-zero for call by the JobAgent and 0 for call by the watchdog
        # cpuLimit and cpu may be in the units of the batch system, not real seconds...
        # (in this case the other case won't work)
        # therefore renormalise it using cpuConsumed (which is in real seconds)
        cpuWorkLeft = (timeLimit - time) * self.cpuPower * cpuConsumed / time
    else:
        # FIXME: this is always used by the watchdog... Also used by the JobAgent
        #        if consumed less than 1 hour of CPU
        # It was using self.scaleFactor but this is inconsistent: use the same as above
        # In case the returned cpu and cpuLimit are not in real seconds, this is however rubbish
        cpuWorkLeft = (timeLimit - time) * self.cpuPower
    self.log.verbose(f"Remaining CPU in normalized units is: {cpuWorkLeft:.2f}")
    return S_OK(cpuWorkLeft)