Source code for ornithology.jobs

# Copyright 2019 HTCondor Team, Computer Sciences Department,
# University of Wisconsin-Madison, WI.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import logging
import enum
import functools

import htcondor2 as htcondor
import classad2 as classad

logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)


[docs] class JobID: """ A class that encapsulates a (cluster ID, proc ID) pair. """ def __init__(self, cluster, proc): """ Parameters ---------- cluster The cluster ID for the job. proc The process ID for the job. """ self.cluster = int(cluster) self.proc = int(proc)
[docs] @classmethod def from_job_event(cls, job_event: htcondor.JobEvent) -> "JobID": """Get the :class:`JobID` of a :class:`htcondor.JobEvent`.""" return cls(job_event.cluster, job_event.proc)
[docs] @classmethod def from_job_ad(cls, job_ad: classad.ClassAd) -> "JobID": """Get the :class:`JobID` of a job ad.""" return cls(job_ad["ClusterID"], job_ad["ProcID"])
[docs] def id_for_cluster_ad(self) -> "JobID": """Return the :class:`JobID` for the cluster ad of the cluster this :class:`JobID` belongs to.""" return type(self)(cluster=self.cluster, proc=-1)
def __eq__(self, other): return ( (isinstance(other, self.__class__) or isinstance(self, other.__class__)) and self.cluster == other.cluster and self.proc == other.proc ) def __hash__(self): return hash((self.__class__, self.cluster, self.proc)) def __repr__(self): return "{}(cluster = {}, proc = {})".format( self.__class__.__name__, self.cluster, self.proc ) def __str__(self): return "{}.{}".format(self.cluster, self.proc) def __ge__(self, other): return (self.cluster, self.proc) >= (other.cluster, other.proc) def __gt__(self, other): return (self.cluster, self.proc) > (other.cluster, other.proc) def __le__(self, other): return (self.cluster, self.proc) <= (other.cluster, other.proc) def __lt__(self, other): return (self.cluster, self.proc) < (other.cluster, other.proc)
[docs] class JobStatus(str, enum.Enum): """ An enumeration of the HTCondor job states. .. warning :: ``UNMATERIALIZED`` is not a real job state! It is used as the initial state for jobs in some places, but will never show up in (for example) the job queue log. """ IDLE = "1" RUNNING = "2" REMOVED = "3" COMPLETED = "4" HELD = "5" TRANSFERRING_OUTPUT = "6" SUSPENDED = "7" FAILED = "8" BLOCKED = "9" UNMATERIALIZED = "100" def __repr__(self): return "{}.{}".format(self.__class__.__name__, self.name) __str__ = __repr__