Cleanup docstrings for queue.py

This commit is contained in:
Brian C. Lane 2018-02-08 12:07:27 -08:00
parent 9603c866af
commit 2e1e8c20c7

View File

@ -36,7 +36,7 @@ from pylorax.sysutils import joinpaths
# TODO needs a quit queue to cleanly manage quitting # TODO needs a quit queue to cleanly manage quitting
def monitor(cfg): def monitor(cfg):
""" Monitor the queue for new compose requests """Monitor the queue for new compose requests
:param cfg: Configuration settings :param cfg: Configuration settings
:type cfg: ComposerConfig :type cfg: ComposerConfig
@ -94,7 +94,23 @@ def monitor(cfg):
os.unlink(dst) os.unlink(dst)
def make_compose(cfg, results_dir): def make_compose(cfg, results_dir):
"""Run anaconda with the final-kickstart.ks from results_dir""" """Run anaconda with the final-kickstart.ks from results_dir
:param cfg: Configuration settings
:type cfg: ComposerConfig
:param results_dir: The directory containing the metadata and results for the build
:type results_dir: str
:returns: Nothing
:raises: May raise various exceptions
This takes the final-kickstart.ks, and the settings in config.toml and runs Anaconda
in no-virt mode (directly on the host operating system). Exceptions should be caught
at the higer level.
If there is a failure, the build artifacts will be cleaned up, and any logs will be
moved into logs/anaconda/ and their ownership will be set to the user from the cfg
object.
"""
# Check on the ks's presense # Check on the ks's presense
ks_path = joinpaths(results_dir, "final-kickstart.ks") ks_path = joinpaths(results_dir, "final-kickstart.ks")
@ -139,8 +155,13 @@ def make_compose(cfg, results_dir):
subprocess.call(["chown", "-R", "%s:%s" % (user, group), results_dir]) subprocess.call(["chown", "-R", "%s:%s" % (user, group), results_dir])
def get_compose_type(results_dir): def get_compose_type(results_dir):
""" Return the type of composition. """Return the type of composition.
:param results_dir: The directory containing the metadata and results for the build
:type results_dir: str
:returns: The type of compose (eg. 'tar')
:rtype: str
:raises: RuntimeError if no kickstart template can be found.
""" """
# Should only be 2 kickstarts, the final-kickstart.ks and the template # Should only be 2 kickstarts, the final-kickstart.ks and the template
t = [os.path.basename(ks)[:-3] for ks in glob(joinpaths(results_dir, "*.ks")) t = [os.path.basename(ks)[:-3] for ks in glob(joinpaths(results_dir, "*.ks"))
@ -150,8 +171,22 @@ def get_compose_type(results_dir):
return t[0] return t[0]
def compose_detail(results_dir): def compose_detail(results_dir):
""" Return details about the build.""" """Return details about the build.
:param results_dir: The directory containing the metadata and results for the build
:type results_dir: str
:returns: A dictionary with details about the compose
:rtype: dict
The following details are included in the dict:
* id - The uuid of the comoposition
* queue_status - The final status of the composition (FINISHED or FAILED)
* timestamp - The time of the last status change
* compose_type - The type of output generated (tar, iso, etc.)
* recipe - Recipe name
* version - Recipe version
"""
# Just in case it went away # Just in case it went away
if not os.path.exists(results_dir): if not os.path.exists(results_dir):
return {} return {}
@ -172,7 +207,16 @@ def compose_detail(results_dir):
} }
def queue_status(cfg): def queue_status(cfg):
""" Return details about what is in the queue.""" """Return details about what is in the queue.
:param cfg: Configuration settings
:type cfg: ComposerConfig
:returns: A list of the new composes, and a list of the running composes
:rtype: dict
This returns a dict with 2 lists. "new" is the list of uuids that are waiting to be built,
and "run" has the uuids that are being built (currently limited to 1 at a time).
"""
queue_dir = joinpaths(cfg.get("composer", "lib_dir"), "queue") queue_dir = joinpaths(cfg.get("composer", "lib_dir"), "queue")
new_queue = [os.path.realpath(p) for p in glob(joinpaths(queue_dir, "new/*"))] new_queue = [os.path.realpath(p) for p in glob(joinpaths(queue_dir, "new/*"))]
run_queue = [os.path.realpath(p) for p in glob(joinpaths(queue_dir, "run/*"))] run_queue = [os.path.realpath(p) for p in glob(joinpaths(queue_dir, "run/*"))]
@ -191,6 +235,8 @@ def uuid_status(cfg, uuid):
:type uuid: str :type uuid: str
:returns: Details about the build :returns: Details about the build
:rtype: dict or None :rtype: dict or None
Returns the same dict as `compose_details()`
""" """
uuid_dir = joinpaths(cfg.get("composer", "lib_dir"), "results", uuid) uuid_dir = joinpaths(cfg.get("composer", "lib_dir"), "results", uuid)
if os.path.exists(uuid_dir): if os.path.exists(uuid_dir):
@ -199,7 +245,7 @@ def uuid_status(cfg, uuid):
return None return None
def build_status(cfg, status_filter=None): def build_status(cfg, status_filter=None):
""" Return the details of finished or failed builds """Return the details of finished or failed builds
:param cfg: Configuration settings :param cfg: Configuration settings
:type cfg: ComposerConfig :type cfg: ComposerConfig
@ -287,6 +333,7 @@ def uuid_delete(cfg, uuid):
:type uuid: str :type uuid: str
:returns: True if it was deleted :returns: True if it was deleted
:rtype: bool :rtype: bool
:raises: This will raise an error if the delete failed
""" """
uuid_dir = joinpaths(cfg.get("composer", "lib_dir"), "results", uuid) uuid_dir = joinpaths(cfg.get("composer", "lib_dir"), "results", uuid)
if not uuid_dir or len(uuid_dir) < 10: if not uuid_dir or len(uuid_dir) < 10:
@ -303,6 +350,7 @@ def uuid_info(cfg, uuid):
:type uuid: str :type uuid: str
:returns: dictionary of information about the composition :returns: dictionary of information about the composition
:rtype: dict :rtype: dict
:raises: RuntimeError if there was a problem
This will return a dict with the following fields populated: This will return a dict with the following fields populated:
@ -364,6 +412,7 @@ def uuid_tar(cfg, uuid, metadata=False, image=False, logs=False):
:type logs: bool :type logs: bool
:returns: A stream of bytes from tar :returns: A stream of bytes from tar
:rtype: A generator :rtype: A generator
:raises: RuntimeError if there was a problem (eg. missing config file)
This yields an uncompressed tar's data to the caller. It includes This yields an uncompressed tar's data to the caller. It includes
the selected data to the caller by returning the Popen stdout from the tar process. the selected data to the caller by returning the Popen stdout from the tar process.
@ -399,6 +448,7 @@ def uuid_image(cfg, uuid):
:type uuid: str :type uuid: str
:returns: The image filename and full path :returns: The image filename and full path
:rtype: tuple of strings :rtype: tuple of strings
:raises: RuntimeError if there was a problem (eg. invalid uuid, missing config file)
""" """
uuid_dir = joinpaths(cfg.get("composer", "lib_dir"), "results", uuid) uuid_dir = joinpaths(cfg.get("composer", "lib_dir"), "results", uuid)
if not os.path.exists(uuid_dir): if not os.path.exists(uuid_dir):
@ -424,6 +474,7 @@ def uuid_log(cfg, uuid, size=1024):
:type size: int :type size: int
:returns: Up to `size` kbytes from the end of the log :returns: Up to `size` kbytes from the end of the log
:rtype: str :rtype: str
:raises: RuntimeError if there was a problem (eg. no log file available)
This function tries to return lines from the end of the log, it will This function tries to return lines from the end of the log, it will
attempt to start on a line boundry, and may return less than `size` kbytes. attempt to start on a line boundry, and may return less than `size` kbytes.