+
+
+def CheckDrainFlag():
+ """Check if the queue is marked to be drained.
+
+ This currently uses the queue drain file, which makes it a per-node flag.
+ In the future this can be moved to the config file.
+
+ @rtype: boolean
+ @return: True if the job queue is marked drained
+
+ """
+ return os.path.exists(pathutils.JOB_QUEUE_DRAIN_FILE)
+
+
+def SetDrainFlag(drain_flag):
+ """Sets the drain flag for the queue.
+
+ @type drain_flag: boolean
+ @param drain_flag: Whether to set or unset the drain flag
+ @attention: This function should only called the current holder of the queue
+ lock
+
+ """
+ getents = runtime.GetEnts()
+
+ if drain_flag:
+ utils.WriteFile(pathutils.JOB_QUEUE_DRAIN_FILE, data="",
+ uid=getents.masterd_uid, gid=getents.masterd_gid)
+ else:
+ utils.RemoveFile(pathutils.JOB_QUEUE_DRAIN_FILE)
+
+ assert (not drain_flag) ^ CheckDrainFlag()
+
+
+def FormatJobID(job_id):
+ """Convert a job ID to int format.
+
+ Currently this just is a no-op that performs some checks, but if we
+ want to change the job id format this will abstract this change.
+
+ @type job_id: int or long
+ @param job_id: the numeric job id
+ @rtype: int
+ @return: the formatted job id
+
+ """
+ if not isinstance(job_id, (int, long)):
+ raise errors.ProgrammerError("Job ID '%s' not numeric" % job_id)
+ if job_id < 0:
+ raise errors.ProgrammerError("Job ID %s is negative" % job_id)
+
+ return job_id
+
+
+def GetArchiveDirectory(job_id):
+ """Returns the archive directory for a job.
+
+ @type job_id: str
+ @param job_id: Job identifier
+ @rtype: str
+ @return: Directory name
+
+ """
+ return str(ParseJobId(job_id) / JOBS_PER_ARCHIVE_DIRECTORY)
+
+
+def ParseJobId(job_id):
+ """Parses a job ID and converts it to integer.
+
+ """
+ try:
+ return int(job_id)
+ except (ValueError, TypeError):
+ raise errors.ParameterError("Invalid job ID '%s'" % job_id)