diff --git a/lorax-composer/.buildinfo b/lorax-composer/.buildinfo index ee6d8d3b..2447dcf4 100644 --- a/lorax-composer/.buildinfo +++ b/lorax-composer/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 972a8f4b79671d03d004b6b084c1be20 +config: d0036b060ae50548427b7f3aa21363e9 tags: fbb0d17656682115ca4d033fb2f83ba1 diff --git a/lorax-composer/.doctrees/composer.cli.doctree b/lorax-composer/.doctrees/composer.cli.doctree new file mode 100644 index 00000000..77e24c51 Binary files /dev/null and b/lorax-composer/.doctrees/composer.cli.doctree differ diff --git a/lorax-composer/.doctrees/composer.doctree b/lorax-composer/.doctrees/composer.doctree new file mode 100644 index 00000000..670a404d Binary files /dev/null and b/lorax-composer/.doctrees/composer.doctree differ diff --git a/lorax-composer/.doctrees/environment.pickle b/lorax-composer/.doctrees/environment.pickle index 1d5ac8e1..a3d916ee 100644 Binary files a/lorax-composer/.doctrees/environment.pickle and b/lorax-composer/.doctrees/environment.pickle differ diff --git a/lorax-composer/.doctrees/index.doctree b/lorax-composer/.doctrees/index.doctree index e632e201..abf17588 100644 Binary files a/lorax-composer/.doctrees/index.doctree and b/lorax-composer/.doctrees/index.doctree differ diff --git a/lorax-composer/.doctrees/intro.doctree b/lorax-composer/.doctrees/intro.doctree index 004bc8f6..74dca9e5 100644 Binary files a/lorax-composer/.doctrees/intro.doctree and b/lorax-composer/.doctrees/intro.doctree differ diff --git a/lorax-composer/.doctrees/livemedia-creator.doctree b/lorax-composer/.doctrees/livemedia-creator.doctree new file mode 100644 index 00000000..96d09883 Binary files /dev/null and b/lorax-composer/.doctrees/livemedia-creator.doctree differ diff --git a/lorax-composer/.doctrees/lorax-composer.doctree b/lorax-composer/.doctrees/lorax-composer.doctree index 996b9f0e..8f64c815 100644 Binary files a/lorax-composer/.doctrees/lorax-composer.doctree and b/lorax-composer/.doctrees/lorax-composer.doctree differ diff --git a/lorax-composer/.doctrees/lorax.doctree b/lorax-composer/.doctrees/lorax.doctree new file mode 100644 index 00000000..c4730d86 Binary files /dev/null and b/lorax-composer/.doctrees/lorax.doctree differ diff --git a/lorax-composer/.doctrees/modules.doctree b/lorax-composer/.doctrees/modules.doctree index dede9510..5560675b 100644 Binary files a/lorax-composer/.doctrees/modules.doctree and b/lorax-composer/.doctrees/modules.doctree differ diff --git a/lorax-composer/.doctrees/product-images.doctree b/lorax-composer/.doctrees/product-images.doctree new file mode 100644 index 00000000..494ffddb Binary files /dev/null and b/lorax-composer/.doctrees/product-images.doctree differ diff --git a/lorax-composer/.doctrees/pylorax.api.doctree b/lorax-composer/.doctrees/pylorax.api.doctree index a212f8b7..7e4e3ac0 100644 Binary files a/lorax-composer/.doctrees/pylorax.api.doctree and b/lorax-composer/.doctrees/pylorax.api.doctree differ diff --git a/lorax-composer/.doctrees/pylorax.doctree b/lorax-composer/.doctrees/pylorax.doctree index 4a6f5f7f..7b33f334 100644 Binary files a/lorax-composer/.doctrees/pylorax.doctree and b/lorax-composer/.doctrees/pylorax.doctree differ diff --git a/lorax-composer/_modules/composer/cli.html b/lorax-composer/_modules/composer/cli.html new file mode 100644 index 00000000..2540b689 --- /dev/null +++ b/lorax-composer/_modules/composer/cli.html @@ -0,0 +1,150 @@ + + + + + + +
+ + +
+#!/usr/bin/python
+#
+# composer-cli
+#
+# Copyright (C) 2018 Red Hat, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+import logging
+log = logging.getLogger("composer-cli")
+
+from composer.cli.recipes import recipes_cmd
+from composer.cli.modules import modules_cmd
+from composer.cli.projects import projects_cmd
+from composer.cli.compose import compose_cmd
+
+command_map = {
+ "recipes": recipes_cmd,
+ "modules": modules_cmd,
+ "projects": projects_cmd,
+ "compose": compose_cmd
+ }
+
+
+[docs]def main(opts):
+ """ Main program execution
+
+ :param opts: Cmdline arguments
+ :type opts: argparse.Namespace
+ """
+ if len(opts.args) == 0:
+ log.error("Missing command")
+ return 1
+ elif opts.args[0] not in command_map:
+ log.error("Unknown command %s", opts.args[0])
+ return 1
+ if len(opts.args) == 1:
+ log.error("Missing %s sub-command", opts.args[0])
+ return 1
+ else:
+ try:
+ return command_map[opts.args[0]](opts)
+ except Exception as e:
+ log.error(str(e))
+ return 1
+
+#
+# Copyright (C) 2018 Red Hat, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+import logging
+log = logging.getLogger("composer-cli")
+
+import sys
+import json
+
+from composer import http_client as client
+from composer.cli.utilities import argify, handle_api_result, packageNEVRA
+
+[docs]def compose_cmd(opts):
+ """Process compose commands
+
+ :param opts: Cmdline arguments
+ :type opts: argparse.Namespace
+ :returns: Value to return from sys.exit()
+ :rtype: int
+
+ This dispatches the compose commands to a function
+ """
+ cmd_map = {
+ "status": compose_status,
+ "types": compose_types,
+ "start": compose_start,
+ "log": compose_log,
+ "cancel": compose_cancel,
+ "delete": compose_delete,
+ "details": compose_details,
+ "metadata": compose_metadata,
+ "results": compose_results,
+ "logs": compose_logs,
+ "image": compose_image,
+ }
+ if opts.args[1] not in cmd_map:
+ log.error("Unknown compose command: %s", opts.args[1])
+ return 1
+
+ return cmd_map[opts.args[1]](opts.socket, opts.api_version, opts.args[2:], opts.json, opts.testmode)
+
+[docs]def compose_status(socket_path, api_version, args, show_json=False, testmode=0):
+ """Return the status of all known composes
+
+ :param socket_path: Path to the Unix socket to use for API communication
+ :type socket_path: str
+ :param api_version: Version of the API to talk to. eg. "0"
+ :type api_version: str
+ :param args: List of remaining arguments from the cmdline
+ :type args: list of str
+ :param show_json: Set to True to show the JSON output instead of the human readable output
+ :type show_json: bool
+
+ This doesn't map directly to an API command, it combines the results from queue, finished,
+ and failed so raw JSON output is not available.
+ """
+ def get_status(compose):
+ return {"id": compose["id"],
+ "recipe": compose["recipe"],
+ "version": compose["version"],
+ "status": compose["queue_status"]}
+
+ # Sort the status in a specific order
+ def sort_status(a):
+ order = ["RUNNING", "WAITING", "FINISHED", "FAILED"]
+ return (order.index(a["status"]), a["recipe"], a["version"])
+
+ status = []
+
+ # Get the composes currently in the queue
+ api_route = client.api_url(api_version, "/compose/queue")
+ result = client.get_url_json(socket_path, api_route)
+ status.extend(map(get_status, result["run"] + result["new"]))
+
+ # Get the list of finished composes
+ api_route = client.api_url(api_version, "/compose/finished")
+ result = client.get_url_json(socket_path, api_route)
+ status.extend(map(get_status, result["finished"]))
+
+ # Get the list of failed composes
+ api_route = client.api_url(api_version, "/compose/failed")
+ result = client.get_url_json(socket_path, api_route)
+ status.extend(map(get_status, result["failed"]))
+
+ # Sort them by status (running, waiting, finished, failed) and then by name and version.
+ status.sort(key=sort_status)
+
+ if show_json:
+ print(json.dumps(status, indent=4))
+ return 0
+
+ # Print them as UUID RECIPE STATUS
+ for c in status:
+ print("%s %-8s %-15s %s" % (c["id"], c["status"], c["recipe"], c["version"]))
+
+
+[docs]def compose_types(socket_path, api_version, args, show_json=False):
+ """Return information about the supported compose types
+
+ :param socket_path: Path to the Unix socket to use for API communication
+ :type socket_path: str
+ :param api_version: Version of the API to talk to. eg. "0"
+ :type api_version: str
+ :param args: List of remaining arguments from the cmdline
+ :type args: list of str
+ :param show_json: Set to True to show the JSON output instead of the human readable output
+ :type show_json: bool
+
+ Add additional details to types that are known to composer-cli. Raw JSON output does not
+ include this extra information.
+ """
+ api_route = client.api_url(api_version, "/compose/types")
+ result = client.get_url_json(socket_path, api_route)
+ if show_json:
+ print(json.dumps(result, indent=4))
+ return 0
+
+ print("Compose Types: " + ", ".join([t["name"] for t in result["types"]]))
+
+[docs]def compose_start(socket_path, api_version, args, show_json=False, testmode=0):
+ """Start a new compose using the selected recipe and type
+
+ :param socket_path: Path to the Unix socket to use for API communication
+ :type socket_path: str
+ :param api_version: Version of the API to talk to. eg. "0"
+ :type api_version: str
+ :param args: List of remaining arguments from the cmdline
+ :type args: list of str
+ :param show_json: Set to True to show the JSON output instead of the human readable output
+ :type show_json: bool
+
+ compose start <recipe-name> <compose-type>
+ """
+ if len(args) == 0:
+ log.error("start is missing the recipe name and output type")
+ return 1
+ if len(args) == 1:
+ log.error("start is missing the output type")
+ return 1
+
+ config = {
+ "recipe_name": args[0],
+ "compose_type": args[1],
+ "branch": "master"
+ }
+ if testmode:
+ test_url = "?test=%d" % testmode
+ else:
+ test_url = ""
+ api_route = client.api_url(api_version, "/compose" + test_url)
+ result = client.post_url_json(socket_path, api_route, json.dumps(config))
+
+ if show_json:
+ print(json.dumps(result, indent=4))
+ return 0
+
+ if result.get("error", False):
+ log.error(result["error"]["msg"])
+ return 1
+
+ if result["status"] == False:
+ return 1
+
+ print("Compose %s added to the queue" % result["build_id"])
+ return 0
+
+[docs]def compose_log(socket_path, api_version, args, show_json=False, testmode=0):
+ """Show the last part of the compose log
+
+ :param socket_path: Path to the Unix socket to use for API communication
+ :type socket_path: str
+ :param api_version: Version of the API to talk to. eg. "0"
+ :type api_version: str
+ :param args: List of remaining arguments from the cmdline
+ :type args: list of str
+ :param show_json: Set to True to show the JSON output instead of the human readable output
+ :type show_json: bool
+
+ compose log <uuid> [<size>kB]
+
+ This will display the last 1kB of the compose's log file. Can be used to follow progress
+ during the build.
+ """
+ if len(args) == 0:
+ log.error("log is missing the compose build id")
+ return 1
+ if len(args) == 2:
+ try:
+ log_size = int(args[1])
+ except ValueError:
+ log.error("Log size must be an integer.")
+ return 1
+ else:
+ log_size = 1024
+
+ api_route = client.api_url(api_version, "/compose/log/%s?size=%d" % (args[0], log_size))
+ result = client.get_url_raw(socket_path, api_route)
+
+ print(result)
+
+[docs]def compose_cancel(socket_path, api_version, args, show_json=False, testmode=0):
+ """Cancel a running compose
+
+ :param socket_path: Path to the Unix socket to use for API communication
+ :type socket_path: str
+ :param api_version: Version of the API to talk to. eg. "0"
+ :type api_version: str
+ :param args: List of remaining arguments from the cmdline
+ :type args: list of str
+ :param show_json: Set to True to show the JSON output instead of the human readable output
+ :type show_json: bool
+
+ compose cancel <uuid>
+
+ This will cancel a running compose. It does nothing if the compose has finished.
+ """
+ if len(args) == 0:
+ log.error("cancel is missing the compose build id")
+ return 1
+
+ api_route = client.api_url(api_version, "/compose/cancel/%s" % args[0])
+ result = client.delete_url_json(socket_path, api_route)
+ return handle_api_result(result, show_json)
+
+[docs]def compose_delete(socket_path, api_version, args, show_json=False, testmode=0):
+ """Delete a finished compose's results
+
+ :param socket_path: Path to the Unix socket to use for API communication
+ :type socket_path: str
+ :param api_version: Version of the API to talk to. eg. "0"
+ :type api_version: str
+ :param args: List of remaining arguments from the cmdline
+ :type args: list of str
+ :param show_json: Set to True to show the JSON output instead of the human readable output
+ :type show_json: bool
+
+ compose delete <uuid,...>
+
+ Delete the listed compose results. It will only delete results for composes that have finished
+ or failed, not a running compose.
+ """
+ if len(args) == 0:
+ log.error("delete is missing the compose build id")
+ return 1
+
+ api_route = client.api_url(api_version, "/compose/delete/%s" % (",".join(argify(args))))
+ result = client.delete_url_json(socket_path, api_route)
+
+ if show_json:
+ print(json.dumps(result, indent=4))
+ return 0
+
+ # Print any errors
+ for err in result.get("errors", []):
+ log.error("%s: %s", err["uuid"], err["msg"])
+
+ if result.get("errors", []):
+ return 1
+ else:
+ return 0
+
+[docs]def compose_details(socket_path, api_version, args, show_json=False, testmode=0):
+ """Return detailed information about the compose
+
+ :param socket_path: Path to the Unix socket to use for API communication
+ :type socket_path: str
+ :param api_version: Version of the API to talk to. eg. "0"
+ :type api_version: str
+ :param args: List of remaining arguments from the cmdline
+ :type args: list of str
+ :param show_json: Set to True to show the JSON output instead of the human readable output
+ :type show_json: bool
+
+ compose details <uuid>
+
+ This returns information about the compose, including the recipe and the dependencies.
+ """
+ if len(args) == 0:
+ log.error("details is missing the compose build id")
+ return 1
+
+ api_route = client.api_url(api_version, "/compose/info/%s" % args[0])
+ result = client.get_url_json(socket_path, api_route)
+ if show_json:
+ print(json.dumps(result, indent=4))
+ return 0
+
+ print("%s %-8s %-15s %s %s" % (result["id"],
+ result["queue_status"],
+ result["recipe"]["name"],
+ result["recipe"]["version"],
+ result["compose_type"]))
+ print("Recipe Packages:")
+ for p in result["recipe"]["packages"]:
+ print(" %s-%s" % (p["name"], p["version"]))
+
+ print("Recipe Modules:")
+ for m in result["recipe"]["modules"]:
+ print(" %s-%s" % (m["name"], m["version"]))
+
+ print("Dependencies:")
+ for d in result["deps"]["packages"]:
+ print(" " + packageNEVRA(d))
+
+[docs]def compose_metadata(socket_path, api_version, args, show_json=False, testmode=0):
+ """Download a tar file of the compose's metadata
+
+ :param socket_path: Path to the Unix socket to use for API communication
+ :type socket_path: str
+ :param api_version: Version of the API to talk to. eg. "0"
+ :type api_version: str
+ :param args: List of remaining arguments from the cmdline
+ :type args: list of str
+ :param show_json: Set to True to show the JSON output instead of the human readable output
+ :type show_json: bool
+
+ compose metadata <uuid>
+
+ Saves the metadata as uuid-metadata.tar
+ """
+ if len(args) == 0:
+ log.error("metadata is missing the compose build id")
+ return 1
+
+ api_route = client.api_url(api_version, "/compose/metadata/%s" % args[0])
+ return client.download_file(socket_path, api_route)
+
+[docs]def compose_results(socket_path, api_version, args, show_json=False, testmode=0):
+ """Download a tar file of the compose's results
+
+ :param socket_path: Path to the Unix socket to use for API communication
+ :type socket_path: str
+ :param api_version: Version of the API to talk to. eg. "0"
+ :type api_version: str
+ :param args: List of remaining arguments from the cmdline
+ :type args: list of str
+ :param show_json: Set to True to show the JSON output instead of the human readable output
+ :type show_json: bool
+
+ compose results <uuid>
+
+ The results includes the metadata, output image, and logs.
+ It is saved as uuid.tar
+ """
+ if len(args) == 0:
+ log.error("results is missing the compose build id")
+ return 1
+
+ api_route = client.api_url(api_version, "/compose/results/%s" % args[0])
+ return client.download_file(socket_path, api_route, sys.stdout.isatty())
+
+[docs]def compose_logs(socket_path, api_version, args, show_json=False, testmode=0):
+ """Download a tar of the compose's logs
+
+ :param socket_path: Path to the Unix socket to use for API communication
+ :type socket_path: str
+ :param api_version: Version of the API to talk to. eg. "0"
+ :type api_version: str
+ :param args: List of remaining arguments from the cmdline
+ :type args: list of str
+ :param show_json: Set to True to show the JSON output instead of the human readable output
+ :type show_json: bool
+
+ compose logs <uuid>
+
+ Saves the logs as uuid-logs.tar
+ """
+ if len(args) == 0:
+ log.error("logs is missing the compose build id")
+ return 1
+
+ api_route = client.api_url(api_version, "/compose/logs/%s" % args[0])
+ return client.download_file(socket_path, api_route, sys.stdout.isatty())
+
+[docs]def compose_image(socket_path, api_version, args, show_json=False, testmode=0):
+ """Download the compose's output image
+
+ :param socket_path: Path to the Unix socket to use for API communication
+ :type socket_path: str
+ :param api_version: Version of the API to talk to. eg. "0"
+ :type api_version: str
+ :param args: List of remaining arguments from the cmdline
+ :type args: list of str
+ :param show_json: Set to True to show the JSON output instead of the human readable output
+ :type show_json: bool
+
+ compose image <uuid>
+
+ This downloads only the result image, saving it as the image name, which depends on the type
+ of compose that was selected.
+ """
+ if len(args) == 0:
+ log.error("logs is missing the compose build id")
+ return 1
+
+ api_route = client.api_url(api_version, "/compose/image/%s" % args[0])
+ return client.download_file(socket_path, api_route, sys.stdout.isatty())
+
+#
+# Copyright (C) 2018 Red Hat, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+import logging
+log = logging.getLogger("composer-cli")
+
+import json
+
+from composer import http_client as client
+
+[docs]def modules_cmd(opts):
+ """Process modules commands
+
+ :param opts: Cmdline arguments
+ :type opts: argparse.Namespace
+ :returns: Value to return from sys.exit()
+ :rtype: int
+ """
+ if opts.args[1] != "list":
+ log.error("Unknown modules command: %s", opts.args[1])
+ return 1
+
+ api_route = client.api_url(opts.api_version, "/modules/list")
+ result = client.get_url_json(opts.socket, api_route)
+ if opts.json:
+ print(json.dumps(result, indent=4))
+ return 0
+
+ print("Modules:\n" + "\n".join([" "+r["name"] for r in result["modules"]]))
+
+ return 0
+
+#
+# Copyright (C) 2018 Red Hat, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+import logging
+log = logging.getLogger("composer-cli")
+
+import json
+import textwrap
+
+from composer import http_client as client
+
+[docs]def projects_cmd(opts):
+ """Process projects commands
+
+ :param opts: Cmdline arguments
+ :type opts: argparse.Namespace
+ :returns: Value to return from sys.exit()
+ :rtype: int
+ """
+ cmd_map = {
+ "list": projects_list,
+ "info": projects_info,
+ }
+ if opts.args[1] not in cmd_map:
+ log.error("Unknown projects command: %s", opts.args[1])
+ return 1
+
+ return cmd_map[opts.args[1]](opts.socket, opts.api_version, opts.args[2:], opts.json)
+
+[docs]def projects_list(socket_path, api_version, args, show_json=False):
+ """Output the list of available projects
+
+ :param socket_path: Path to the Unix socket to use for API communication
+ :type socket_path: str
+ :param api_version: Version of the API to talk to. eg. "0"
+ :type api_version: str
+ :param args: List of remaining arguments from the cmdline
+ :type args: list of str
+ :param show_json: Set to True to show the JSON output instead of the human readable output
+ :type show_json: bool
+
+ projects list
+ """
+ api_route = client.api_url(api_version, "/projects/list")
+ result = client.get_url_json(socket_path, api_route)
+ if show_json:
+ print(json.dumps(result, indent=4))
+ return 0
+
+ for proj in result["projects"]:
+ for k in ["name", "summary", "homepage", "description"]:
+ print("%s: %s" % (k.title(), textwrap.fill(proj[k], subsequent_indent=" " * (len(k)+2))))
+ print("\n\n")
+
+ return 0
+
+[docs]def projects_info(socket_path, api_version, args, show_json=False):
+ """Output info on a list of projects
+
+ :param socket_path: Path to the Unix socket to use for API communication
+ :type socket_path: str
+ :param api_version: Version of the API to talk to. eg. "0"
+ :type api_version: str
+ :param args: List of remaining arguments from the cmdline
+ :type args: list of str
+ :param show_json: Set to True to show the JSON output instead of the human readable output
+ :type show_json: bool
+
+ projects info <project,...>
+ """
+ if len(args) == 0:
+ log.error("projects info is missing the packages")
+ return 1
+
+ api_route = client.api_url(api_version, "/projects/info/%s" % ",".join(args))
+ result = client.get_url_json(socket_path, api_route)
+ if show_json:
+ print(json.dumps(result, indent=4))
+ return 0
+
+ for proj in result["projects"]:
+ for k in ["name", "summary", "homepage", "description"]:
+ print("%s: %s" % (k.title(), textwrap.fill(proj[k], subsequent_indent=" " * (len(k)+2))))
+ print("Builds: ")
+ for build in proj["builds"]:
+ print(" %s%s-%s.%s at %s for %s" % ("" if not build["epoch"] else build["epoch"] + ":",
+ build["source"]["version"],
+ build["release"],
+ build["arch"],
+ build["build_time"],
+ build["changelog"]))
+ print("")
+ return 0
+
+#
+# Copyright (C) 2018 Red Hat, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+import logging
+log = logging.getLogger("composer-cli")
+
+import os
+import json
+
+from composer import http_client as client
+from composer.cli.utilities import argify, frozen_toml_filename, toml_filename, handle_api_result
+from composer.cli.utilities import packageNEVRA
+
+[docs]def recipes_cmd(opts):
+ """Process recipes commands
+
+ :param opts: Cmdline arguments
+ :type opts: argparse.Namespace
+ :returns: Value to return from sys.exit()
+ :rtype: int
+
+ This dispatches the recipes commands to a function
+ """
+ cmd_map = {
+ "list": recipes_list,
+ "show": recipes_show,
+ "changes": recipes_changes,
+ "diff": recipes_diff,
+ "save": recipes_save,
+ "delete": recipes_delete,
+ "depsolve": recipes_depsolve,
+ "push": recipes_push,
+ "freeze": recipes_freeze,
+ "tag": recipes_tag,
+ "undo": recipes_undo,
+ "workspace": recipes_workspace
+ }
+ if opts.args[1] not in cmd_map:
+ log.error("Unknown recipes command: %s", opts.args[1])
+ return 1
+
+ return cmd_map[opts.args[1]](opts.socket, opts.api_version, opts.args[2:], opts.json)
+
+[docs]def recipes_list(socket_path, api_version, args, show_json=False):
+ """Output the list of available recipes
+
+ :param socket_path: Path to the Unix socket to use for API communication
+ :type socket_path: str
+ :param api_version: Version of the API to talk to. eg. "0"
+ :type api_version: str
+ :param args: List of remaining arguments from the cmdline
+ :type args: list of str
+ :param show_json: Set to True to show the JSON output instead of the human readable output
+ :type show_json: bool
+
+ recipes list
+ """
+ api_route = client.api_url(api_version, "/recipes/list")
+ result = client.get_url_json(socket_path, api_route)
+ if show_json:
+ print(json.dumps(result, indent=4))
+ return 0
+
+ print("Recipes: " + ", ".join([r for r in result["recipes"]]))
+
+ return 0
+
+[docs]def recipes_show(socket_path, api_version, args, show_json=False):
+ """Show the recipes, in TOML format
+
+ :param socket_path: Path to the Unix socket to use for API communication
+ :type socket_path: str
+ :param api_version: Version of the API to talk to. eg. "0"
+ :type api_version: str
+ :param args: List of remaining arguments from the cmdline
+ :type args: list of str
+ :param show_json: Set to True to show the JSON output instead of the human readable output
+ :type show_json: bool
+
+ recipes show <recipe,...> Display the recipe in TOML format.
+
+ Multiple recipes will be separated by \n\n
+ """
+ for recipe in argify(args):
+ api_route = client.api_url(api_version, "/recipes/info/%s?format=toml" % recipe)
+ print(client.get_url_raw(socket_path, api_route) + "\n\n")
+
+ return 0
+
+[docs]def recipes_changes(socket_path, api_version, args, show_json=False):
+ """Display the changes for each of the recipes
+
+ :param socket_path: Path to the Unix socket to use for API communication
+ :type socket_path: str
+ :param api_version: Version of the API to talk to. eg. "0"
+ :type api_version: str
+ :param args: List of remaining arguments from the cmdline
+ :type args: list of str
+ :param show_json: Set to True to show the JSON output instead of the human readable output
+ :type show_json: bool
+
+ recipes changes <recipe,...> Display the changes for each recipe.
+ """
+ api_route = client.api_url(api_version, "/recipes/changes/%s" % (",".join(argify(args))))
+ result = client.get_url_json(socket_path, api_route)
+ if show_json:
+ print(json.dumps(result, indent=4))
+ return 0
+
+ for recipe in result["recipes"]:
+ print(recipe["name"])
+ for change in recipe["changes"]:
+ prettyCommitDetails(change)
+
+ return 0
+
+[docs]def prettyCommitDetails(change, indent=4):
+ """Print the recipe's change in a nice way
+
+ :param change: The individual recipe change dict
+ :type change: dict
+ :param indent: Number of spaces to indent
+ :type indent: int
+ """
+ def revision():
+ if change["revision"]:
+ return " revision %d" % change["revision"]
+ else:
+ return ""
+
+ print " " * indent + change["timestamp"] + " " + change["commit"] + revision()
+ print " " * indent + change["message"] + "\n"
+
+[docs]def recipes_diff(socket_path, api_version, args, show_json=False):
+ """Display the differences between 2 versions of a recipe
+
+ :param socket_path: Path to the Unix socket to use for API communication
+ :type socket_path: str
+ :param api_version: Version of the API to talk to. eg. "0"
+ :type api_version: str
+ :param args: List of remaining arguments from the cmdline
+ :type args: list of str
+ :param show_json: Set to True to show the JSON output instead of the human readable output
+ :type show_json: bool
+
+ recipes diff <recipe-name> Display the differences between 2 versions of a recipe.
+ <from-commit> Commit hash or NEWEST
+ <to-commit> Commit hash, NEWEST, or WORKSPACE
+ """
+ if len(args) == 0:
+ log.error("recipes diff is missing the recipe name, from commit, and to commit")
+ return 1
+ elif len(args) == 1:
+ log.error("recipes diff is missing the from commit, and the to commit")
+ return 1
+ elif len(args) == 2:
+ log.error("recipes diff is missing the to commit")
+ return 1
+
+ api_route = client.api_url(api_version, "/recipes/diff/%s/%s/%s" % (args[0], args[1], args[2]))
+ result = client.get_url_json(socket_path, api_route)
+
+ if show_json:
+ print(json.dumps(result, indent=4))
+ return 0
+
+ if result.get("error", False):
+ log.error(result["error"]["msg"])
+ return 1
+
+ for diff in result["diff"]:
+ print(prettyDiffEntry(diff))
+
+ return 0
+
+[docs]def prettyDiffEntry(diff):
+ """Generate nice diff entry string.
+
+ :param diff: Difference entry dict
+ :type diff: dict
+ :returns: Nice string
+ """
+ def change(diff):
+ if diff["old"] and diff["new"]:
+ return "Changed"
+ elif diff["new"] and not diff["old"]:
+ return "Added"
+ elif diff["old"] and not diff["new"]:
+ return "Removed"
+ else:
+ return "Unknown"
+
+ def name(diff):
+ if diff["old"]:
+ return diff["old"].keys()[0]
+ elif diff["new"]:
+ return diff["new"].keys()[0]
+ else:
+ return "Unknown"
+
+ def details(diff):
+ if change(diff) == "Changed":
+ if name(diff) == "Description":
+ return '"%s" -> "%s"' % (diff["old"][name(diff)], diff["old"][name(diff)])
+ elif name(diff) == "Version":
+ return "%s -> %s" % (diff["old"][name(diff)], diff["old"][name(diff)])
+ elif name(diff) in ["Module", "Package"]:
+ return "%s %s -> %s" % (diff["old"][name(diff)]["name"], diff["old"][name(diff)]["version"],
+ diff["new"][name(diff)]["version"])
+ else:
+ return "Unknown"
+ elif change(diff) == "Added":
+ if name(diff) in ["Module", "Package"]:
+ return "%s %s" % (diff["new"][name(diff)]["name"], diff["new"][name(diff)]["version"])
+ else:
+ return " ".join([diff["new"][k] for k in diff["new"]])
+ elif change(diff) == "Removed":
+ if name(diff) in ["Module", "Package"]:
+ return "%s %s" % (diff["old"][name(diff)]["name"], diff["old"][name(diff)]["version"])
+ else:
+ return " ".join([diff["old"][k] for k in diff["old"]])
+
+ return change(diff) + " " + name(diff) + " " + details(diff)
+
+[docs]def recipes_save(socket_path, api_version, args, show_json=False):
+ """Save the recipe to a TOML file
+
+ :param socket_path: Path to the Unix socket to use for API communication
+ :type socket_path: str
+ :param api_version: Version of the API to talk to. eg. "0"
+ :type api_version: str
+ :param args: List of remaining arguments from the cmdline
+ :type args: list of str
+ :param show_json: Set to True to show the JSON output instead of the human readable output
+ :type show_json: bool
+
+ recipes save <recipe,...> Save the recipe to a file, <recipe-name>.toml
+ """
+ for recipe in argify(args):
+ api_route = client.api_url(api_version, "/recipes/info/%s?format=toml" % recipe)
+ recipe_toml = client.get_url_raw(socket_path, api_route)
+ open(toml_filename(recipe), "w").write(recipe_toml)
+
+ return 0
+
+[docs]def recipes_delete(socket_path, api_version, args, show_json=False):
+ """Delete a recipe from the server
+
+ :param socket_path: Path to the Unix socket to use for API communication
+ :type socket_path: str
+ :param api_version: Version of the API to talk to. eg. "0"
+ :type api_version: str
+ :param args: List of remaining arguments from the cmdline
+ :type args: list of str
+ :param show_json: Set to True to show the JSON output instead of the human readable output
+ :type show_json: bool
+
+ delete <recipe> Delete a recipe from the server
+ """
+ api_route = client.api_url(api_version, "/recipes/delete/%s" % args[0])
+ result = client.delete_url_json(socket_path, api_route)
+
+ return handle_api_result(result, show_json)
+
+[docs]def recipes_depsolve(socket_path, api_version, args, show_json=False):
+ """Display the packages needed to install the recipe
+
+ :param socket_path: Path to the Unix socket to use for API communication
+ :type socket_path: str
+ :param api_version: Version of the API to talk to. eg. "0"
+ :type api_version: str
+ :param args: List of remaining arguments from the cmdline
+ :type args: list of str
+ :param show_json: Set to True to show the JSON output instead of the human readable output
+ :type show_json: bool
+
+ recipes depsolve <recipe,...> Display the packages needed to install the recipe.
+ """
+ api_route = client.api_url(api_version, "/recipes/depsolve/%s" % (",".join(argify(args))))
+ result = client.get_url_json(socket_path, api_route)
+
+ if show_json:
+ print(json.dumps(result, indent=4))
+ return 0
+
+ for recipe in result["recipes"]:
+ if recipe["recipe"].get("version", ""):
+ print("Recipe: %s v%s" % (recipe["recipe"]["name"], recipe["recipe"]["version"]))
+ else:
+ print("Recipe: %s" % (recipe["recipe"]["name"]))
+ for dep in recipe["dependencies"]:
+ print(" " + packageNEVRA(dep))
+
+ return 0
+
+[docs]def recipes_push(socket_path, api_version, args, show_json=False):
+ """Push a recipe TOML file to the server, updating the recipe
+
+ :param socket_path: Path to the Unix socket to use for API communication
+ :type socket_path: str
+ :param api_version: Version of the API to talk to. eg. "0"
+ :type api_version: str
+ :param args: List of remaining arguments from the cmdline
+ :type args: list of str
+ :param show_json: Set to True to show the JSON output instead of the human readable output
+ :type show_json: bool
+
+ push <recipe> Push a recipe TOML file to the server.
+ """
+ api_route = client.api_url(api_version, "/recipes/new")
+ rval = 0
+ for recipe in argify(args):
+ if not os.path.exists(recipe):
+ log.error("Missing recipe file: %s", recipe)
+ continue
+ recipe_toml = open(recipe, "r").read()
+
+ result = client.post_url_toml(socket_path, api_route, recipe_toml)
+ if handle_api_result(result, show_json):
+ rval = 1
+
+ return rval
+
+[docs]def recipes_freeze(socket_path, api_version, args, show_json=False):
+ """Handle the recipes freeze commands
+
+ :param socket_path: Path to the Unix socket to use for API communication
+ :type socket_path: str
+ :param api_version: Version of the API to talk to. eg. "0"
+ :type api_version: str
+ :param args: List of remaining arguments from the cmdline
+ :type args: list of str
+ :param show_json: Set to True to show the JSON output instead of the human readable output
+ :type show_json: bool
+
+ recipes freeze <recipe,...> Display the frozen recipe's modules and packages.
+ recipes freeze show <recipe,...> Display the frozen recipe in TOML format.
+ recipes freeze save <recipe,...> Save the frozen recipe to a file, <recipe-name>.frozen.toml.
+ """
+ if args[0] == "show":
+ return recipes_freeze_show(socket_path, api_version, args[1:], show_json)
+ elif args[0] == "save":
+ return recipes_freeze_save(socket_path, api_version, args[1:], show_json)
+
+ if len(args) == 0:
+ log.error("freeze is missing the recipe name")
+ return 1
+
+ api_route = client.api_url(api_version, "/recipes/freeze/%s" % (",".join(argify(args))))
+ result = client.get_url_json(socket_path, api_route)
+
+ if show_json:
+ print(json.dumps(result, indent=4))
+ else:
+ for entry in result["recipes"]:
+ recipe = entry["recipe"]
+ if recipe.get("version", ""):
+ print("Recipe: %s v%s" % (recipe["name"], recipe["version"]))
+ else:
+ print("Recipe: %s" % (recipe["name"]))
+
+ for m in recipe["modules"]:
+ print(" %s-%s" % (m["name"], m["version"]))
+
+ for p in recipe["packages"]:
+ print(" %s-%s" % (p["name"], p["version"]))
+
+ # Print any errors
+ for err in result.get("errors", []):
+ log.error("%s: %s", err["recipe"], err["msg"])
+
+ # Return a 1 if there are any errors
+ if result.get("errors", []):
+ return 1
+ else:
+ return 0
+
+[docs]def recipes_freeze_show(socket_path, api_version, args, show_json=False):
+ """Show the frozen recipe in TOML format
+
+ :param socket_path: Path to the Unix socket to use for API communication
+ :type socket_path: str
+ :param api_version: Version of the API to talk to. eg. "0"
+ :type api_version: str
+ :param args: List of remaining arguments from the cmdline
+ :type args: list of str
+ :param show_json: Set to True to show the JSON output instead of the human readable output
+ :type show_json: bool
+
+ recipes freeze show <recipe,...> Display the frozen recipe in TOML format.
+ """
+ if len(args) == 0:
+ log.error("freeze show is missing the recipe name")
+ return 1
+
+ for recipe in argify(args):
+ api_route = client.api_url(api_version, "/recipes/freeze/%s?format=toml" % recipe)
+ print(client.get_url_raw(socket_path, api_route))
+
+ return 0
+
+[docs]def recipes_freeze_save(socket_path, api_version, args, show_json=False):
+ """Save the frozen recipe to a TOML file
+
+ :param socket_path: Path to the Unix socket to use for API communication
+ :type socket_path: str
+ :param api_version: Version of the API to talk to. eg. "0"
+ :type api_version: str
+ :param args: List of remaining arguments from the cmdline
+ :type args: list of str
+ :param show_json: Set to True to show the JSON output instead of the human readable output
+ :type show_json: bool
+
+ recipes freeze save <recipe,...> Save the frozen recipe to a file, <recipe-name>.frozen.toml.
+ """
+ if len(args) == 0:
+ log.error("freeze save is missing the recipe name")
+ return 1
+
+ for recipe in argify(args):
+ api_route = client.api_url(api_version, "/recipes/freeze/%s?format=toml" % recipe)
+ recipe_toml = client.get_url_raw(socket_path, api_route)
+ open(frozen_toml_filename(recipe), "w").write(recipe_toml)
+
+ return 0
+
+[docs]def recipes_tag(socket_path, api_version, args, show_json=False):
+ """Tag the most recent recipe commit as a release
+
+ :param socket_path: Path to the Unix socket to use for API communication
+ :type socket_path: str
+ :param api_version: Version of the API to talk to. eg. "0"
+ :type api_version: str
+ :param args: List of remaining arguments from the cmdline
+ :type args: list of str
+ :param show_json: Set to True to show the JSON output instead of the human readable output
+ :type show_json: bool
+
+ recipes tag <recipe> Tag the most recent recipe commit as a release.
+ """
+ api_route = client.api_url(api_version, "/recipes/tag/%s" % args[0])
+ result = client.post_url(socket_path, api_route, "")
+
+ return handle_api_result(result, show_json)
+
+[docs]def recipes_undo(socket_path, api_version, args, show_json=False):
+ """Undo changes to a recipe
+
+ :param socket_path: Path to the Unix socket to use for API communication
+ :type socket_path: str
+ :param api_version: Version of the API to talk to. eg. "0"
+ :type api_version: str
+ :param args: List of remaining arguments from the cmdline
+ :type args: list of str
+ :param show_json: Set to True to show the JSON output instead of the human readable output
+ :type show_json: bool
+
+ recipes undo <recipe> <commit> Undo changes to a recipe by reverting to the selected commit.
+ """
+ if len(args) == 0:
+ log.error("undo is missing the recipe name and commit hash")
+ return 1
+ elif len(args) == 1:
+ log.error("undo is missing commit hash")
+ return 1
+
+ api_route = client.api_url(api_version, "/recipes/undo/%s/%s" % (args[0], args[1]))
+ result = client.post_url(socket_path, api_route, "")
+
+ return handle_api_result(result, show_json)
+
+[docs]def recipes_workspace(socket_path, api_version, args, show_json=False):
+ """Push the recipe TOML to the temporary workspace storage
+
+ :param socket_path: Path to the Unix socket to use for API communication
+ :type socket_path: str
+ :param api_version: Version of the API to talk to. eg. "0"
+ :type api_version: str
+ :param args: List of remaining arguments from the cmdline
+ :type args: list of str
+ :param show_json: Set to True to show the JSON output instead of the human readable output
+ :type show_json: bool
+
+ recipes workspace <recipe> Push the recipe TOML to the temporary workspace storage.
+ """
+ api_route = client.api_url(api_version, "/recipes/workspace")
+ rval = 0
+ for recipe in argify(args):
+ if not os.path.exists(recipe):
+ log.error("Missing recipe file: %s", recipe)
+ continue
+ recipe_toml = open(recipe, "r").read()
+
+ result = client.post_url_toml(socket_path, api_route, recipe_toml)
+ if show_json:
+ print(json.dumps(result, indent=4))
+ elif result.get("error", False):
+ log.error(result["error"]["msg"])
+
+ # Any errors results in returning a 1, but we continue with the rest first
+ if not result.get("status", False):
+ rval = 1
+
+ return rval
+
+#
+# Copyright (C) 2018 Red Hat, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+import logging
+log = logging.getLogger("composer-cli")
+
+import json
+
+[docs]def argify(args):
+ """Take a list of human args and return a list with each item
+
+ :param args: list of strings with possible commas and spaces
+ :type args: list of str
+ :returns: List of all the items
+ :rtype: list of str
+
+ Examples:
+
+ ["one,two", "three", ",four", ",five,"] returns ["one", "two", "three", "four", "five"]
+ """
+ return filter(lambda i: i, [arg for entry in args for arg in entry.split(",")])
+
+[docs]def toml_filename(recipe_name):
+ """Convert a recipe name into a filename.toml
+
+ :param recipe_name: The recipe's name
+ :type recipe_name: str
+ :returns: The recipe name with ' ' converted to - and .toml appended
+ :rtype: str
+ """
+ return recipe_name.replace(" ", "-") + ".toml"
+
+[docs]def frozen_toml_filename(recipe_name):
+ """Convert a recipe name into a filename.toml
+
+ :param recipe_name: The recipe's name
+ :type recipe_name: str
+ :returns: The recipe name with ' ' converted to - and .toml appended
+ :rtype: str
+ """
+ return recipe_name.replace(" ", "-") + ".frozen.toml"
+
+[docs]def handle_api_result(result, show_json=False):
+ """Log any errors, return the correct value
+
+ :param result: JSON result from the http query
+ :type result: dict
+ """
+ if show_json:
+ print(json.dumps(result, indent=4))
+ elif result.get("error", False):
+ log.error(result["error"]["msg"])
+
+ if result["status"] == True:
+ return 0
+ else:
+ return 1
+
+[docs]def packageNEVRA(pkg):
+ """Return the package info as a NEVRA
+
+ :param pkg: The package details
+ :type pkg: dict
+ :returns: name-[epoch:]version-release-arch
+ :rtype: str
+ """
+ if pkg["epoch"]:
+ return "%s-%s:%s-%s.%s" % (pkg["name"], pkg["epoch"], pkg["version"], pkg["release"], pkg["arch"])
+ else:
+ return "%s-%s-%s.%s" % (pkg["name"], pkg["version"], pkg["release"], pkg["arch"])
+
+#
+# Copyright (C) 2018 Red Hat, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+import logging
+log = logging.getLogger("composer-cli")
+
+import os
+import sys
+import json
+
+from composer.unix_socket import UnixHTTPConnectionPool
+
+[docs]def api_url(api_version, url):
+ """Return the versioned path to the API route
+
+ :param api_version: The version of the API to talk to. eg. "0"
+ :type api_version: str
+ :param url: The API route to talk to
+ :type url: str
+ :returns: The full url to use for the route and API version
+ :rtype: str
+ """
+ return os.path.normpath("/api/v%s/%s" % (api_version, url))
+
+[docs]def get_url_raw(socket_path, url):
+ """Return the raw results of a GET request
+
+ :param socket_path: Path to the Unix socket to use for API communication
+ :type socket_path: str
+ :param url: URL to request
+ :type url: str
+ :returns: The raw response from the server
+ :rtype: str
+ """
+ http = UnixHTTPConnectionPool(socket_path)
+ r = http.request("GET", url)
+ return r.data.decode('utf-8')
+
+[docs]def get_url_json(socket_path, url):
+ """Return the JSON results of a GET request
+
+ :param socket_path: Path to the Unix socket to use for API communication
+ :type socket_path: str
+ :param url: URL to request
+ :type url: str
+ :returns: The json response from the server
+ :rtype: dict
+ """
+ http = UnixHTTPConnectionPool(socket_path)
+ r = http.request("GET", url)
+ return json.loads(r.data.decode('utf-8'))
+
+[docs]def delete_url_json(socket_path, url):
+ """Send a DELETE request to the url and return JSON response
+
+ :param socket_path: Path to the Unix socket to use for API communication
+ :type socket_path: str
+ :param url: URL to send DELETE to
+ :type url: str
+ :returns: The json response from the server
+ :rtype: dict
+ """
+ http = UnixHTTPConnectionPool(socket_path)
+ r = http.request("DELETE", url)
+ return json.loads(r.data.decode("utf-8"))
+
+[docs]def post_url(socket_path, url, body):
+ """POST raw data to the URL
+
+ :param socket_path: Path to the Unix socket to use for API communication
+ :type socket_path: str
+ :param url: URL to send POST to
+ :type url: str
+ :param body: The data for the body of the POST
+ :type body: str
+ :returns: The json response from the server
+ :rtype: dict
+ """
+ http = UnixHTTPConnectionPool(socket_path)
+ r = http.request("POST", url,
+ body=body.encode("utf-8"))
+ return json.loads(r.data.decode("utf-8"))
+
+[docs]def post_url_toml(socket_path, url, body):
+ """POST a TOML recipe to the URL
+
+ :param socket_path: Path to the Unix socket to use for API communication
+ :type socket_path: str
+ :param url: URL to send POST to
+ :type url: str
+ :param body: The data for the body of the POST
+ :type body: str
+ :returns: The json response from the server
+ :rtype: dict
+ """
+ http = UnixHTTPConnectionPool(socket_path)
+ r = http.request("POST", url,
+ body=body.encode("utf-8"),
+ headers={"Content-Type": "text/x-toml"})
+ return json.loads(r.data.decode("utf-8"))
+
+[docs]def post_url_json(socket_path, url, body):
+ """POST some JSON data to the URL
+
+ :param socket_path: Path to the Unix socket to use for API communication
+ :type socket_path: str
+ :param url: URL to send POST to
+ :type url: str
+ :param body: The data for the body of the POST
+ :type body: str
+ :returns: The json response from the server
+ :rtype: dict
+ """
+ http = UnixHTTPConnectionPool(socket_path)
+ r = http.request("POST", url,
+ body=body.encode("utf-8"),
+ headers={"Content-Type": "application/json"})
+ return json.loads(r.data.decode("utf-8"))
+
+[docs]def get_filename(headers):
+ """Get the filename from the response header
+
+ :param response: The urllib3 response object
+ :type response: Response
+ :raises: RuntimeError if it cannot find a filename in the header
+ :returns: Filename from content-disposition header
+ :rtype: str
+ """
+ log.debug("Headers = %s", headers)
+ if "content-disposition" not in headers:
+ raise RuntimeError("No Content-Disposition header; cannot get filename")
+
+ try:
+ k, _, v = headers["content-disposition"].split(";")[1].strip().partition("=")
+ if k != "filename":
+ raise RuntimeError("No filename= found in content-disposition header")
+ except RuntimeError:
+ raise
+ except Exception as e:
+ raise RuntimeError("Error parsing filename from content-disposition header: %s" % str(e))
+
+ return os.path.basename(v)
+
+[docs]def download_file(socket_path, url, progress=True):
+ """Download a file, saving it to the CWD with the included filename
+
+ :param socket_path: Path to the Unix socket to use for API communication
+ :type socket_path: str
+ :param url: URL to send POST to
+ :type url: str
+ """
+ http = UnixHTTPConnectionPool(socket_path)
+ r = http.request("GET", url, preload_content=False)
+ if r.status == 400:
+ err = json.loads(r.data.decode("utf-8"))
+ if not err["status"]:
+ raise RuntimeError(err["error"]["msg"])
+
+ filename = get_filename(r.headers)
+ if os.path.exists(filename):
+ msg = "%s exists, skipping download" % filename
+ log.error(msg)
+ raise RuntimeError(msg)
+
+ with open(filename, "wb") as f:
+ while True:
+ data = r.read(10 * 1024**2)
+ if not data:
+ break
+ f.write(data)
+
+ if progress:
+ data_written = f.tell()
+ if data_written > 5 * 1024**2:
+ sys.stdout.write("%s: %0.2f MB \r" % (filename, data_written / 1024**2))
+ else:
+ sys.stdout.write("%s: %0.2f kB\r" % (filename, data_written / 1024))
+ sys.stdout.flush()
+
+ print("")
+ r.release_conn()
+
+ return 0
+
+#
+# Copyright (C) 2018 Red Hat, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+import httplib
+import socket
+import urllib3
+
+
+# These 2 classes were adapted and simplified for use with just urllib3.
+# Originally from https://github.com/msabramo/requests-unixsocket/blob/master/requests_unixsocket/adapters.py
+
+# The following was adapted from some code from docker-py
+# https://github.com/docker/docker-py/blob/master/docker/transport/unixconn.py
+[docs]class UnixHTTPConnection(httplib.HTTPConnection, object):
+
+ def __init__(self, socket_path, timeout=60):
+ """Create an HTTP connection to a unix domain socket
+
+ :param socket_path: The path to the Unix domain socket
+ :param timeout: Number of seconds to timeout the connection
+ """
+ super(UnixHTTPConnection, self).__init__('localhost', timeout=timeout)
+ self.socket_path = socket_path
+ self.sock = None
+
+ def __del__(self): # base class does not have d'tor
+ if self.sock:
+ self.sock.close()
+
+[docs] def connect(self):
+ sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
+ sock.settimeout(self.timeout)
+ sock.connect(self.socket_path)
+ self.sock = sock
+
+[docs]class UnixHTTPConnectionPool(urllib3.connectionpool.HTTPConnectionPool):
+
+ def __init__(self, socket_path, timeout=60):
+ """Create a connection pool using a Unix domain socket
+
+ :param socket_path: The path to the Unix domain socket
+ :param timeout: Number of seconds to timeout the connection
+ """
+ super(UnixHTTPConnectionPool, self).__init__('localhost', timeout=timeout)
+ self.socket_path = socket_path
+
+ def _new_conn(self):
+ return UnixHTTPConnection(self.socket_path, self.timeout)
+
+if __name__ == '__main__':
+ http = UnixHTTPConnectionPool("/var/run/weldr/api.socket")
+ r = http.request("GET", "/api/v0/recipes/list")
+ print(r.data)
+
+#
+# __init__.py
+#
+# Copyright (C) 2010 Red Hat, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# Red Hat Author(s): Martin Gracik <mgracik@redhat.com>
+# David Cantrell <dcantrell@redhat.com>
+# Will Woods <wwoods@redhat.com>
+
+# set up logging
+import logging
+logger = logging.getLogger("pylorax")
+logger.addHandler(logging.NullHandler())
+
+import sys
+import os
+import ConfigParser
+import tempfile
+import locale
+from subprocess import CalledProcessError
+import selinux
+
+from pylorax.base import BaseLoraxClass, DataHolder
+import pylorax.output as output
+
+import yum
+import pylorax.ltmpl as ltmpl
+
+import pylorax.imgutils as imgutils
+from pylorax.sysutils import joinpaths, linktree, remove
+from rpmUtils.arch import getBaseArch
+
+from pylorax.treebuilder import RuntimeBuilder, TreeBuilder
+from pylorax.buildstamp import BuildStamp
+from pylorax.treeinfo import TreeInfo
+from pylorax.discinfo import DiscInfo
+from pylorax.executils import runcmd, runcmd_output
+
+# get lorax version
+try:
+ import pylorax.version
+except ImportError:
+ vernum = "devel"
+else:
+ vernum = pylorax.version.num
+
+# List of drivers to remove on ppc64 arch to keep initrd < 32MiB
+REMOVE_PPC64_DRIVERS = "floppy scsi_debug nouveau radeon cirrus mgag200"
+REMOVE_PPC64_MODULES = "drm plymouth"
+
+[docs]class ArchData(DataHolder):
+ lib64_arches = ("x86_64", "ppc64", "ppc64le", "s390x", "ia64", "aarch64")
+ bcj_arch = dict(i386="x86", x86_64="x86",
+ ppc="powerpc", ppc64="powerpc", ppc64le="powerpc",
+ arm="arm", armhfp="arm")
+
+ def __init__(self, buildarch):
+ DataHolder.__init__(self, buildarch=buildarch)
+ self.basearch = getBaseArch(buildarch)
+ self.libdir = "lib64" if self.basearch in self.lib64_arches else "lib"
+ self.bcj = self.bcj_arch.get(self.basearch)
+
+[docs]class Lorax(BaseLoraxClass):
+
+ def __init__(self):
+ BaseLoraxClass.__init__(self)
+ self._configured = False
+ self.conf = None
+ self.outputdir = None
+ self.workdir = None
+ self.inroot = None
+ self.arch = None
+ self.product = None
+ self.debug = False
+
+ # set locale to C
+ locale.setlocale(locale.LC_ALL, 'C')
+
+[docs] def configure(self, conf_file="/etc/lorax/lorax.conf"):
+ self.conf = ConfigParser.SafeConfigParser()
+
+ # set defaults
+ self.conf.add_section("lorax")
+ self.conf.set("lorax", "debug", "1")
+ self.conf.set("lorax", "sharedir", "/usr/share/lorax")
+
+ self.conf.add_section("output")
+ self.conf.set("output", "colors", "1")
+ self.conf.set("output", "encoding", "utf-8")
+ self.conf.set("output", "ignorelist", "/usr/share/lorax/ignorelist")
+
+ self.conf.add_section("templates")
+ self.conf.set("templates", "ramdisk", "ramdisk.ltmpl")
+
+ self.conf.add_section("yum")
+ self.conf.set("yum", "skipbroken", "0")
+
+ self.conf.add_section("compression")
+ self.conf.set("compression", "type", "xz")
+ self.conf.set("compression", "args", "")
+ self.conf.set("compression", "bcj", "on")
+
+ # read the config file
+ if os.path.isfile(conf_file):
+ self.conf.read(conf_file)
+
+ # set up the output
+ self.debug = self.conf.getboolean("lorax", "debug")
+ output_level = output.DEBUG if self.debug else output.INFO
+
+ colors = self.conf.getboolean("output", "colors")
+ encoding = self.conf.get("output", "encoding")
+
+ self.output.basic_config(output_level=output_level,
+ colors=colors, encoding=encoding)
+
+ ignorelist = self.conf.get("output", "ignorelist")
+ if os.path.isfile(ignorelist):
+ with open(ignorelist, "r") as fobj:
+ for line in fobj:
+ line = line.strip()
+ if line and not line.startswith("#"):
+ self.output.ignore(line)
+
+ # cron does not have sbin in PATH,
+ # so we have to add it ourselves
+ os.environ["PATH"] = "{0}:/sbin:/usr/sbin".format(os.environ["PATH"])
+
+ # remove some environmental variables that can cause problems with package scripts
+ env_remove = ('DISPLAY', 'DBUS_SESSION_BUS_ADDRESS')
+ _ = [os.environ.pop(k) for k in env_remove if k in os.environ]
+
+ self._configured = True
+
+[docs] def init_stream_logging(self):
+ sh = logging.StreamHandler()
+ sh.setLevel(logging.INFO)
+ logger.addHandler(sh)
+
+[docs] def init_file_logging(self, logdir, logname="pylorax.log"):
+ fh = logging.FileHandler(filename=joinpaths(logdir, logname), mode="w")
+ fh.setLevel(logging.DEBUG)
+ logger.addHandler(fh)
+
+[docs] def run(self, ybo, product, version, release, variant="", bugurl="",
+ isfinal=False, workdir=None, outputdir=None, buildarch=None, volid=None,
+ domacboot=False, doupgrade=True, remove_temp=False,
+ installpkgs=None,
+ size=2,
+ add_templates=None,
+ add_template_vars=None,
+ add_arch_templates=None,
+ add_arch_template_vars=None,
+ template_tempdir=None):
+
+ assert self._configured
+
+ installpkgs = installpkgs or []
+
+ if domacboot:
+ try:
+ runcmd(["rpm", "-q", "hfsplus-tools"])
+ except CalledProcessError:
+ logger.critical("you need to install hfsplus-tools to create mac images")
+ sys.exit(1)
+
+ # set up work directory
+ self.workdir = workdir or tempfile.mkdtemp(prefix="pylorax.work.")
+ if not os.path.isdir(self.workdir):
+ os.makedirs(self.workdir)
+
+ # set up log directory
+ logdir = '/var/log/lorax'
+ if not os.path.isdir(logdir):
+ os.makedirs(logdir)
+
+ self.init_stream_logging()
+ self.init_file_logging(logdir)
+
+ logger.debug("version is %s", vernum)
+ logger.debug("using work directory %s", self.workdir)
+ logger.debug("using log directory %s", logdir)
+
+ # set up output directory
+ self.outputdir = outputdir or tempfile.mkdtemp(prefix="pylorax.out.")
+ if not os.path.isdir(self.outputdir):
+ os.makedirs(self.outputdir)
+ logger.debug("using output directory %s", self.outputdir)
+
+ # do we have root privileges?
+ logger.info("checking for root privileges")
+ if not os.geteuid() == 0:
+ logger.critical("no root privileges")
+ sys.exit(1)
+
+ # is selinux disabled?
+ # With selinux in enforcing mode the rpcbind package required for
+ # dracut nfs module, which is in turn required by anaconda module,
+ # will not get installed, because it's preinstall scriptlet fails,
+ # resulting in an incomplete initial ramdisk image.
+ # The reason is that the scriptlet runs tools from the shadow-utils
+ # package in chroot, particularly groupadd and useradd to add the
+ # required rpc group and rpc user. This operation fails, because
+ # the selinux context on files in the chroot, that the shadow-utils
+ # tools need to access (/etc/group, /etc/passwd, /etc/shadow etc.),
+ # is wrong and selinux therefore disallows access to these files.
+ logger.info("checking the selinux mode")
+ if selinux.is_selinux_enabled() and selinux.security_getenforce():
+ logger.critical("selinux must be disabled or in Permissive mode")
+ sys.exit(1)
+
+ # do we have a proper yum base object?
+ logger.info("checking yum base object")
+ if not isinstance(ybo, yum.YumBase):
+ logger.critical("no yum base object")
+ sys.exit(1)
+ self.inroot = ybo.conf.installroot
+ logger.debug("using install root: %s", self.inroot)
+
+ if not buildarch:
+ buildarch = get_buildarch(ybo)
+
+ logger.info("setting up build architecture")
+ self.arch = ArchData(buildarch)
+ for attr in ('buildarch', 'basearch', 'libdir'):
+ logger.debug("self.arch.%s = %s", attr, getattr(self.arch,attr))
+
+ logger.info("setting up build parameters")
+ product = DataHolder(name=product, version=version, release=release,
+ variant=variant, bugurl=bugurl, isfinal=isfinal)
+ self.product = product
+ logger.debug("product data: %s", product)
+
+ # NOTE: if you change isolabel, you need to change pungi to match, or
+ # the pungi images won't boot.
+ isolabel = volid or "%s %s %s" % (self.product.name, self.product.version,
+ self.arch.basearch)
+
+ if len(isolabel) > 32:
+ logger.fatal("the volume id cannot be longer than 32 characters")
+ sys.exit(1)
+
+ templatedir = self.conf.get("lorax", "sharedir")
+ # NOTE: rb.root = ybo.conf.installroot (== self.inroot)
+ rb = RuntimeBuilder(product=self.product, arch=self.arch,
+ yum=ybo, templatedir=templatedir,
+ installpkgs=installpkgs,
+ add_templates=add_templates,
+ add_template_vars=add_template_vars)
+
+ logger.info("installing runtime packages")
+ rb.yum.conf.skip_broken = self.conf.getboolean("yum", "skipbroken")
+ rb.install()
+
+ # write .buildstamp
+ buildstamp = BuildStamp(self.product.name, self.product.version,
+ self.product.bugurl, self.product.isfinal, self.arch.buildarch)
+
+ buildstamp.write(joinpaths(self.inroot, ".buildstamp"))
+
+ if self.debug:
+ rb.writepkglists(joinpaths(logdir, "pkglists"))
+ rb.writepkgsizes(joinpaths(logdir, "original-pkgsizes.txt"))
+
+ logger.info("doing post-install configuration")
+ rb.postinstall()
+
+ # write .discinfo
+ discinfo = DiscInfo(self.product.release, self.arch.basearch)
+ discinfo.write(joinpaths(self.outputdir, ".discinfo"))
+
+ logger.info("backing up installroot")
+ installroot = joinpaths(self.workdir, "installroot")
+ linktree(self.inroot, installroot)
+
+ logger.info("generating kernel module metadata")
+ rb.generate_module_data()
+
+ logger.info("cleaning unneeded files")
+ rb.cleanup()
+
+ if self.debug:
+ rb.writepkgsizes(joinpaths(logdir, "final-pkgsizes.txt"))
+
+ logger.info("creating the runtime image")
+ runtime = "images/install.img"
+ compression = self.conf.get("compression", "type")
+ compressargs = self.conf.get("compression", "args").split()
+ if self.conf.getboolean("compression", "bcj"):
+ if self.arch.bcj:
+ compressargs += ["-Xbcj", self.arch.bcj]
+ else:
+ logger.info("no BCJ filter for arch %s", self.arch.basearch)
+ rb.create_runtime(joinpaths(installroot,runtime),
+ compression=compression, compressargs=compressargs)
+
+ logger.info("preparing to build output tree and boot images")
+ treebuilder = TreeBuilder(product=self.product, arch=self.arch,
+ inroot=installroot, outroot=self.outputdir,
+ runtime=runtime, isolabel=isolabel,
+ domacboot=domacboot, doupgrade=doupgrade,
+ templatedir=templatedir,
+ add_templates=add_arch_templates,
+ add_template_vars=add_arch_template_vars,
+ workdir=self.workdir)
+
+ logger.info("rebuilding initramfs images")
+ dracut_args = ["--xz", "--install", "/.buildstamp", "--no-early-microcode", "--add", "fips"]
+ anaconda_args = dracut_args + ["--add", "anaconda pollcdrom"]
+
+ # ppc64 cannot boot an initrd > 32MiB so remove some drivers
+ if self.arch.basearch in ("ppc64", "ppc64le"):
+ dracut_args.extend(["--omit-drivers", REMOVE_PPC64_DRIVERS])
+
+ # Only omit dracut modules from the initrd so that they're kept for
+ # upgrade.img
+ anaconda_args.extend(["--omit", REMOVE_PPC64_MODULES])
+
+ treebuilder.rebuild_initrds(add_args=anaconda_args)
+
+ if doupgrade:
+ # Build upgrade.img. It'd be nice if these could coexist in the same
+ # image, but that would increase the size of the anaconda initramfs,
+ # which worries some people (esp. PPC tftpboot). So they're separate.
+ try:
+ # If possible, use the 'redhat-upgrade-tool' plymouth theme
+ themes = runcmd_output(['plymouth-set-default-theme', '--list'],
+ root=installroot)
+ if 'redhat-upgrade-tool' in themes.splitlines():
+ os.environ['PLYMOUTH_THEME_NAME'] = 'redhat-upgrade-tool'
+ except RuntimeError:
+ pass
+ upgrade_args = dracut_args + ["--add", "system-upgrade convertfs"]
+ treebuilder.rebuild_initrds(add_args=upgrade_args, prefix="upgrade")
+
+ logger.info("populating output tree and building boot images")
+ treebuilder.build()
+
+ # write .treeinfo file and we're done
+ treeinfo = TreeInfo(self.product.name, self.product.version,
+ self.product.variant, self.arch.basearch)
+ for section, data in treebuilder.treeinfo_data.items():
+ treeinfo.add_section(section, data)
+ treeinfo.write(joinpaths(self.outputdir, ".treeinfo"))
+
+ # cleanup
+ if remove_temp:
+ remove(self.workdir)
+
+
+[docs]def get_buildarch(ybo):
+ # get architecture of the available anaconda package
+ buildarch = None
+ for anaconda in ybo.doPackageLists(patterns=["anaconda"]).available:
+ if anaconda.arch != "src":
+ buildarch = anaconda.arch
+ break
+ if not buildarch:
+ logger.critical("no anaconda package in the repository")
+ sys.exit(1)
+
+ return buildarch
+
Main program execution
+Parameters: | opts (argparse.Namespace) – Cmdline arguments | +
---|
Cancel a running compose
+Parameters: | + | +
---|
compose cancel <uuid>
+This will cancel a running compose. It does nothing if the compose has finished.
+Process compose commands
+Parameters: | opts (argparse.Namespace) – Cmdline arguments | +
---|---|
Returns: | Value to return from sys.exit() | +
Return type: | int | +
This dispatches the compose commands to a function
+Delete a finished compose’s results
+Parameters: | + | +
---|
compose delete <uuid,...>
+Delete the listed compose results. It will only delete results for composes that have finished +or failed, not a running compose.
+Return detailed information about the compose
+Parameters: | + | +
---|
compose details <uuid>
+This returns information about the compose, including the recipe and the dependencies.
+Download the compose’s output image
+Parameters: | + | +
---|
compose image <uuid>
+This downloads only the result image, saving it as the image name, which depends on the type +of compose that was selected.
+Show the last part of the compose log
+Parameters: | + | +
---|
compose log <uuid> [<size>kB]
+This will display the last 1kB of the compose’s log file. Can be used to follow progress +during the build.
+Download a tar of the compose’s logs
+Parameters: | + | +
---|
compose logs <uuid>
+Saves the logs as uuid-logs.tar
+Download a tar file of the compose’s metadata
+Parameters: | + | +
---|
compose metadata <uuid>
+Saves the metadata as uuid-metadata.tar
+Download a tar file of the compose’s results
+Parameters: | + | +
---|
compose results <uuid>
+The results includes the metadata, output image, and logs. +It is saved as uuid.tar
+Start a new compose using the selected recipe and type
+Parameters: | + | +
---|
compose start <recipe-name> <compose-type>
+Return the status of all known composes
+Parameters: | + | +
---|
This doesn’t map directly to an API command, it combines the results from queue, finished, +and failed so raw JSON output is not available.
+Return information about the supported compose types
+Parameters: | + | +
---|
Add additional details to types that are known to composer-cli. Raw JSON output does not +include this extra information.
+Process modules commands
+Parameters: | opts (argparse.Namespace) – Cmdline arguments | +
---|---|
Returns: | Value to return from sys.exit() | +
Return type: | int | +
Process projects commands
+Parameters: | opts (argparse.Namespace) – Cmdline arguments | +
---|---|
Returns: | Value to return from sys.exit() | +
Return type: | int | +
Output info on a list of projects
+Parameters: | + | +
---|
projects info <project,...>
+Print the recipe’s change in a nice way
+Parameters: | + | +
---|
Generate nice diff entry string.
+Parameters: | diff (dict) – Difference entry dict | +
---|---|
Returns: | Nice string | +
Display the changes for each of the recipes
+Parameters: | + | +
---|
recipes changes <recipe,...> Display the changes for each recipe.
+Process recipes commands
+Parameters: | opts (argparse.Namespace) – Cmdline arguments | +
---|---|
Returns: | Value to return from sys.exit() | +
Return type: | int | +
This dispatches the recipes commands to a function
+Delete a recipe from the server
+Parameters: | + | +
---|
delete <recipe> Delete a recipe from the server
+Display the packages needed to install the recipe
+Parameters: | + | +
---|
recipes depsolve <recipe,...> Display the packages needed to install the recipe.
+Display the differences between 2 versions of a recipe
+Parameters: | + | +
---|
Handle the recipes freeze commands
+Parameters: | + | +
---|
recipes freeze <recipe,...> Display the frozen recipe’s modules and packages. +recipes freeze show <recipe,...> Display the frozen recipe in TOML format. +recipes freeze save <recipe,...> Save the frozen recipe to a file, <recipe-name>.frozen.toml.
+Save the frozen recipe to a TOML file
+Parameters: | + | +
---|
recipes freeze save <recipe,...> Save the frozen recipe to a file, <recipe-name>.frozen.toml.
+Show the frozen recipe in TOML format
+Parameters: | + | +
---|
recipes freeze show <recipe,...> Display the frozen recipe in TOML format.
+Output the list of available recipes
+Parameters: | + | +
---|
recipes list
+Push a recipe TOML file to the server, updating the recipe
+Parameters: | + | +
---|
push <recipe> Push a recipe TOML file to the server.
+Save the recipe to a TOML file
+Parameters: | + | +
---|
recipes save <recipe,...> Save the recipe to a file, <recipe-name>.toml
+Show the recipes, in TOML format
+Parameters: | + | +
---|
recipes show <recipe,...> Display the recipe in TOML format.
+Multiple recipes will be separated by
+Tag the most recent recipe commit as a release
+Parameters: | + | +
---|
recipes tag <recipe> Tag the most recent recipe commit as a release.
+Undo changes to a recipe
+Parameters: | + | +
---|
recipes undo <recipe> <commit> Undo changes to a recipe by reverting to the selected commit.
+Take a list of human args and return a list with each item
+Parameters: | args (list of str) – list of strings with possible commas and spaces | +
---|---|
Returns: | List of all the items | +
Return type: | list of str | +
Examples:
+[“one,two”, “three”, ”,four”, ”,five,”] returns [“one”, “two”, “three”, “four”, “five”]
+Convert a recipe name into a filename.toml
+Parameters: | recipe_name (str) – The recipe’s name | +
---|---|
Returns: | The recipe name with ‘ ‘ converted to - and .toml appended | +
Return type: | str | +
Log any errors, return the correct value
+Parameters: | result (dict) – JSON result from the http query | +
---|
Return the versioned path to the API route
+Parameters: | + | +
---|---|
Returns: | The full url to use for the route and API version + |
+
Return type: | str + |
+
Send a DELETE request to the url and return JSON response
+Parameters: | + | +
---|---|
Returns: | The json response from the server + |
+
Return type: | dict + |
+
Download a file, saving it to the CWD with the included filename
+Parameters: | + | +
---|
Get the filename from the response header
+Parameters: | response (Response) – The urllib3 response object | +
---|---|
Raises : | RuntimeError if it cannot find a filename in the header | +
Returns: | Filename from content-disposition header | +
Return type: | str | +
Return the JSON results of a GET request
+Parameters: | + | +
---|---|
Returns: | The json response from the server + |
+
Return type: | dict + |
+
Return the raw results of a GET request
+Parameters: | + | +
---|---|
Returns: | The raw response from the server + |
+
Return type: | str + |
+
POST raw data to the URL
+Parameters: | + | +
---|---|
Returns: | The json response from the server + |
+
Return type: | dict + |
+
POST some JSON data to the URL
+Parameters: | + | +
---|---|
Returns: | The json response from the server + |
+
Return type: | dict + |
+
Bases: httplib.HTTPConnection, object
+ + +
|
Bases: pylorax.base.DataHolder
Bases: pylorax.base.BaseLoraxClass
Bases: object
diff --git a/lorax-composer/pylorax.html b/lorax-composer/pylorax.html index ed8fe38d..c30c71b7 100644 --- a/lorax-composer/pylorax.html +++ b/lorax-composer/pylorax.html @@ -8,7 +8,7 @@
-
+
@@ -16,7 +16,7 @@ - - + + - +
diff --git a/lorax-composer/search.html b/lorax-composer/search.html index 8bdb3022..73cdf6ef 100644 --- a/lorax-composer/search.html +++ b/lorax-composer/search.html @@ -8,7 +8,7 @@
-
+
@@ -16,7 +16,7 @@ - + @@ -43,7 +43,7 @@
-
+
@@ -94,11 +94,11 @@
-
+
diff --git a/lorax-composer/searchindex.js b/lorax-composer/searchindex.js index c18a4f70..d866a343 100644 --- a/lorax-composer/searchindex.js +++ b/lorax-composer/searchindex.js @@ -1 +1 @@ -Search.setIndex({objects:{"pylorax.yumhelper.LoraxRpmCallback":{filelog:[3,2,1,""],errorlog:[3,2,1,""],event:[3,2,1,""],scriptout:[3,2,1,""]},"pylorax.ltmpl":{LoraxTemplate:[3,5,1,""],brace_expand:[3,1,1,""],split_and_expand:[3,1,1,""],rexists:[3,1,1,""],rglob:[3,1,1,""],LoraxTemplateRunner:[3,5,1,""]},"pylorax.yumhelper.LoraxTransactionCallback":{event:[3,2,1,""]},"pylorax.treebuilder.TreeBuilder":{kernels:[3,3,1,""],rebuild_initrds:[3,2,1,""],copy_dracut_hooks:[3,2,1,""],build:[3,2,1,""],dracut_hooks_path:[3,3,1,""],implantisomd5:[3,2,1,""]},"pylorax.installer.VirtualInstall":{destroy:[3,2,1,""]},"pylorax.__init__.ArchData":{bcj_arch:[3,3,1,""],lib64_arches:[3,3,1,""]},"pylorax.api.config":{make_yum_dirs:[4,1,1,""],ComposerConfig:[4,5,1,""],make_queue_dirs:[4,1,1,""],configure:[4,1,1,""]},"pylorax.executils.tee":{stop:[3,2,1,""],run:[3,2,1,""]},"pylorax.__init__":{ArchData:[3,5,1,""],get_buildarch:[3,1,1,""],Lorax:[3,5,1,""]},"pylorax.logmonitor.LogMonitor":{shutdown:[3,2,1,""]},"pylorax.discinfo":{DiscInfo:[3,5,1,""]},"pylorax.api.v0":{v0_api:[4,1,1,""],take_limits:[4,1,1,""]},"pylorax.api.workspace":{workspace_write:[4,1,1,""],workspace_dir:[4,1,1,""],workspace_delete:[4,1,1,""],workspace_read:[4,1,1,""]},"pylorax.decorators":{singleton:[3,1,1,""]},"pylorax.sysutils":{joinpaths:[3,1,1,""],remove:[3,1,1,""],replace:[3,1,1,""],linktree:[3,1,1,""],touch:[3,1,1,""],chmod_:[3,1,1,""],chown_:[3,1,1,""]},"pylorax.api.recipes.Recipe":{package_names:[4,3,1,""],bump_version:[4,2,1,""],module_names:[4,3,1,""],freeze:[4,2,1,""],toml:[4,2,1,""],filename:[4,3,1,""]},"pylorax.api.server.GitLock":{repo:[4,3,1,""],lock:[4,3,1,""],dir:[4,3,1,""]},"pylorax.imgutils":{LoopDev:[3,5,1,""],mkfsimage:[3,1,1,""],mkdiskfsimage:[3,1,1,""],mksparse:[3,1,1,""],do_grafts:[3,1,1,""],copytree:[3,1,1,""],mkext4img:[3,1,1,""],PartitionMount:[3,5,1,""],mksquashfs:[3,1,1,""],default_image_name:[3,1,1,""],mkbtrfsimg:[3,1,1,""],round_to_blocks:[3,1,1,""],mkqcow2:[3,1,1,""],Mount:[3,5,1,""],compress:[3,1,1,""],loop_attach:[3,1,1,""],estimate_size:[3,1,1,""],get_loop_name:[3,1,1,""],mkcpio:[3,1,1,""],loop_detach:[3,1,1,""],mkrootfsimg:[3,1,1,""],mkhfsimg:[3,1,1,""],DMDev:[3,5,1,""],mktar:[3,1,1,""],mount:[3,1,1,""],umount:[3,1,1,""],loop_waitfor:[3,1,1,""],dm_detach:[3,1,1,""],mkdosimg:[3,1,1,""],dm_attach:[3,1,1,""]},"pylorax.logmonitor":{LogRequestHandler:[3,5,1,""],LogServer:[3,5,1,""],LogMonitor:[3,5,1,""]},"pylorax.yumhelper.LoraxDownloadCallback":{updateProgress:[3,2,1,""]},"pylorax.api.yumbase":{get_base_object:[4,1,1,""]},"pylorax.api.compose":{repo_to_ks:[4,1,1,""],compose_args:[4,1,1,""],move_compose_results:[4,1,1,""],start_build:[4,1,1,""],compose_types:[4,1,1,""]},"pylorax.api":{queue:[4,0,1,""],compose:[4,0,1,""],crossdomain:[4,0,1,""],recipes:[4,0,1,""],yumbase:[4,0,1,""],v0:[4,0,1,""],workspace:[4,0,1,""],server:[4,0,1,""],config:[4,0,1,""],projects:[4,0,1,""]},"pylorax.api.config.ComposerConfig":{get_default:[4,2,1,""]},"pylorax.buildstamp.BuildStamp":{write:[3,2,1,""]},"pylorax.api.projects":{yaps_to_project_info:[4,1,1,""],dep_evra:[4,1,1,""],api_changelog:[4,1,1,""],dep_nevra:[4,1,1,""],projects_list:[4,1,1,""],api_time:[4,1,1,""],modules_info:[4,1,1,""],projects_info:[4,1,1,""],modules_list:[4,1,1,""],yaps_to_module:[4,1,1,""],ProjectsError:[4,4,1,""],projects_depsolve:[4,1,1,""],yaps_to_project:[4,1,1,""],tm_to_dep:[4,1,1,""]},"pylorax.api.crossdomain":{crossdomain:[4,1,1,""]},"pylorax.discinfo.DiscInfo":{write:[3,2,1,""]},"pylorax.ltmpl.LoraxTemplate":{parse:[3,2,1,""]},"pylorax.creator":{make_appliance:[3,1,1,""],is_image_mounted:[3,1,1,""],run_creator:[3,1,1,""],make_image:[3,1,1,""],make_runtime:[3,1,1,""],mount_boot_part_over_root:[3,1,1,""],get_ks_disk_size:[3,1,1,""],make_livecd:[3,1,1,""],make_live_images:[3,1,1,""],create_pxe_config:[3,1,1,""],find_ostree_root:[3,1,1,""],rebuild_initrds_for_live:[3,1,1,""],KernelInfo:[3,5,1,""],make_squashfs:[3,1,1,""]},"pylorax.installer":{VirtualInstall:[3,5,1,""],IsoMountpoint:[3,5,1,""],InstallError:[3,4,1,""],novirt_install:[3,1,1,""],virt_install:[3,1,1,""]},"pylorax.buildstamp":{BuildStamp:[3,5,1,""]},"pylorax.installer.IsoMountpoint":{get_iso_label:[3,2,1,""],umount:[3,2,1,""]},"pylorax.api.server":{GitLock:[4,5,1,""]},"pylorax.logmonitor.LogRequestHandler":{setup:[3,2,1,""],finish:[3,2,1,""],handle:[3,2,1,""],iserror:[3,2,1,""]},"pylorax.executils":{execConsole:[3,1,1,""],execWithRedirect:[3,1,1,""],execWithPulseProgress:[3,1,1,""],execWithCallback:[3,1,1,""],tee:[3,5,1,""],runcmd:[3,1,1,""],ExecProduct:[3,5,1,""],runcmd_output:[3,1,1,""],execWithCapture:[3,1,1,""]},"pylorax.api.recipes":{read_recipe_commit:[4,1,1,""],prepare_commit:[4,1,1,""],tag_file_commit:[4,1,1,""],get_commit_details:[4,1,1,""],find_commit_tag:[4,1,1,""],find_name:[4,1,1,""],is_commit_tag:[4,1,1,""],list_commits:[4,1,1,""],recipe_from_dict:[4,1,1,""],delete_recipe:[4,1,1,""],recipe_filename:[4,1,1,""],open_or_create_repo:[4,1,1,""],read_commit:[4,1,1,""],recipe_from_toml:[4,1,1,""],CommitDetails:[4,5,1,""],commit_recipe_directory:[4,1,1,""],revert_file:[4,1,1,""],RecipeFileError:[4,4,1,""],read_commit_spec:[4,1,1,""],CommitTimeValError:[4,4,1,""],read_recipe_and_id:[4,1,1,""],delete_file:[4,1,1,""],head_commit:[4,1,1,""],RecipeModule:[4,5,1,""],get_revision_from_tag:[4,1,1,""],tag_recipe_commit:[4,1,1,""],commit_recipe:[4,1,1,""],revert_recipe:[4,1,1,""],RecipeError:[4,4,1,""],Recipe:[4,5,1,""],diff_items:[4,1,1,""],commit_recipe_file:[4,1,1,""],recipe_from_file:[4,1,1,""],write_commit:[4,1,1,""],gfile:[4,1,1,""],RecipePackage:[4,5,1,""],is_parent_diff:[4,1,1,""],list_branch_files:[4,1,1,""],recipe_diff:[4,1,1,""],list_commit_files:[4,1,1,""]},"pylorax.base.BaseLoraxClass":{pwarning:[3,2,1,""],pcritical:[3,2,1,""],pdebug:[3,2,1,""],perror:[3,2,1,""],pinfo:[3,2,1,""]},"pylorax.base.DataHolder":{copy:[3,2,1,""]},"pylorax.logmonitor.LogServer":{log_check:[3,2,1,""]},"pylorax.creator.KernelInfo":{get_kernel_arch:[3,2,1,""],get_kernels:[3,2,1,""]},"pylorax.treeinfo.TreeInfo":{write:[3,2,1,""],add_section:[3,2,1,""]},"pylorax.yumhelper":{LoraxTransactionCallback:[3,5,1,""],LoraxRpmCallback:[3,5,1,""],LoraxDownloadCallback:[3,5,1,""]},pylorax:{installer:[3,0,1,""],logmonitor:[3,0,1,""],creator:[3,0,1,""],api:[4,0,1,""],ltmpl:[3,0,1,""],sysutils:[3,0,1,""],discinfo:[3,0,1,""],imgutils:[3,0,1,""],base:[3,0,1,""],treeinfo:[3,0,1,""],treebuilder:[3,0,1,""],yumhelper:[3,0,1,""],buildstamp:[3,0,1,""],output:[3,0,1,""],decorators:[3,0,1,""],"__init__":[3,0,1,""],executils:[3,0,1,""]},"pylorax.api.queue":{uuid_info:[4,1,1,""],start_queue_monitor:[4,1,1,""],monitor:[4,1,1,""],make_compose:[4,1,1,""],get_compose_type:[4,1,1,""],queue_status:[4,1,1,""],uuid_delete:[4,1,1,""],uuid_image:[4,1,1,""],compose_detail:[4,1,1,""],uuid_cancel:[4,1,1,""],build_status:[4,1,1,""],uuid_tar:[4,1,1,""],uuid_log:[4,1,1,""],uuid_status:[4,1,1,""]},"pylorax.treebuilder":{findkernels:[3,1,1,""],generate_module_info:[3,1,1,""],RuntimeBuilder:[3,5,1,""],TreeBuilder:[3,5,1,""],udev_escape:[3,1,1,""]},"pylorax.treebuilder.RuntimeBuilder":{create_runtime:[3,2,1,""],writepkgsizes:[3,2,1,""],writepkglists:[3,2,1,""],postinstall:[3,2,1,""],cleanup:[3,2,1,""],install:[3,2,1,""],generate_module_data:[3,2,1,""]},"pylorax.treeinfo":{TreeInfo:[3,5,1,""]},"pylorax.__init__.Lorax":{init_stream_logging:[3,2,1,""],init_file_logging:[3,2,1,""],run:[3,2,1,""],configure:[3,2,1,""]},"pylorax.base":{DataHolder:[3,5,1,""],BaseLoraxClass:[3,5,1,""]},"pylorax.ltmpl.LoraxTemplateRunner":{move:[3,2,1,""],run_pkg_transaction:[3,2,1,""],runcmd:[3,2,1,""],createaddrsize:[3,2,1,""],removekmod:[3,2,1,""],append:[3,2,1,""],removefrom:[3,2,1,""],installkernel:[3,2,1,""],installimg:[3,2,1,""],log:[3,2,1,""],gconfset:[3,2,1,""],mkdir:[3,2,1,""],installupgradeinitrd:[3,2,1,""],treeinfo:[3,2,1,""],removepkg:[3,2,1,""],run:[3,2,1,""],symlink:[3,2,1,""],replace:[3,2,1,""],hardlink:[3,2,1,""],chmod:[3,2,1,""],copy:[3,2,1,""],installpkg:[3,2,1,""],remove:[3,2,1,""],systemctl:[3,2,1,""],installinitrd:[3,2,1,""],install:[3,2,1,""]}},terms:{represent:4,all:[3,4,5,1],kickstart:[3,4,1],"23t00":4,selinux:3,basearch:3,mnt:3,scriptout:3,get_kernel_arch:3,baseloraxclass:3,prefix:3,code:[3,4,1],v0_api:4,buildstamp:[3,2],get_loop_nam:3,follow:[3,4],disk:[3,1],build_id:4,build_statu:4,installkernel:3,depend:4,results_dir:[3,4],mkdiskfsimag:3,flask:4,yumbas:[3,4,2],rxxx:4,umask:3,ggit:4,init:3,program:[3,4],present:5,under:[3,1],exit:3,fatal:3,make_livecd:3,loopdev:3,lib64_arch:3,old_recip:4,sourc:[3,4],everi:4,string:[3,4],mkf:3,fals:[3,4],"0e08ecbb708675bfabc82952599a1712a843779d":4,mountarg:3,fatalerror:3,archdata:3,s390x:3,systemctl:[3,1],raise_err:3,loopx:3,failur:[3,4],ia64:3,untouch:3,diskimag:3,exact:4,kernelinfo:3,basesystem:4,recip:[3,4,2,1],level:[4,1],upd:5,cmd:3,list:[3,4,5,1],dict_typ:4,correct:[3,4,5,1],item:[3,4],shlex:3,stderr:3,recipepackag:4,ping:4,domacboot:3,dir:[3,4],pleas:3,prevent:4,tupl:[3,4],transactionmemb:4,storag:[3,4,1],compose_typ:[4,1],cfg:[3,4],copy_dracut_hook:3,lane:1,tee:3,zero:4,possibl:3,video:3,anaconda:[3,4,5,1],link:3,further:3,trail:4,outputdir:3,append:[3,4,1],subclass:4,compat:1,index:0,what:[3,4,5,1],servic:3,addr:3,bdc:1,projectserror:4,section:[3,4,1],abl:1,both:4,current:[3,4,5,1],delet:[3,4],absolut:3,version:[3,4,5,1],mkbtrfsimg:3,add_sect:3,param:3,"new":[3,4,5,1],bytesread:3,method:[3,4],keepglob:3,squashf:3,uuid_info:4,full:[3,4],hash:4,mount_boot_part_over_root:3,gener:[3,4,5],error:[3,4],here:[3,4,5],list_commit:4,make_:1,rglob:3,workspace_read:4,recipe_nam:[3,4,1],packagedir:3,path:[3,4,1],along:4,powerpc:3,modifi:3,sinc:[4,1],valu:[3,4],wait:[3,4],bcj_arch:3,search:[3,0,4],"41ef9c3e4b73":4,make_appli:3,errorlog:3,popen:[3,4],live_image_nam:3,queue:[3,4,2,1],make_live_imag:3,tri:[3,4],loop:3,action:3,ancient:4,chang:[3,4,1],fileglob:3,make_imag:3,"52z":4,ts_total:3,overrid:[3,4],via:1,prepare_commit:4,extra:1,appli:[3,4],modul:[3,0,4,5,2],inroot:3,releas:[3,4,5],unix:1,api:[3,4,2,1],is_commit_tag:4,instal:[3,4,5,2,1],recipe_dict:4,total:4,conf_fil:[3,4],writepkgs:3,regex:3,flag:3,from:[3,4,5,1],stream:4,armhfp:3,commun:1,loraxrpmcallback:3,ppc64le:3,two:[3,4],next:3,yum:[3,4,5],live:[3,5,1],shoud:3,call:[3,4,5],bash:[4,5],"08t00":4,msg:[3,4],dict:[3,4],care:3,type:[3,4,1],initrd_path:3,more:[3,5,1],kernel_arg:3,almost:5,valuetok:3,desir:4,minim:1,repo_to_k:4,share:[3,4,1],relat:4,about:[3,4],inputdesc:3,pinfo:3,rootdir:3,partitionmount:3,indic:[3,0],examin:3,pkgglob:3,actual:3,given:[3,4],unpack:5,"4c68":4,installroot:3,must:[3,4],none:[3,4,1],chdir:3,word:3,restor:4,dep:4,alia:4,setup:[3,4],work:[3,4],uniqu:4,dev:3,histori:4,descriptor:3,remain:3,archiv:[3,4],can:[3,4,1],assum:3,field:[4,1],root:[3,4,5,1],dee:4,control:[3,5,1],overwritten:3,rpmbasecallback:3,quickstart:1,tar:[4,1],workspace_writ:4,process:[3,4,5,1],lock:4,ppc64:3,templat:[3,4,5],xfsprog:3,callback_func:3,recipefileerror:4,want:[4,1],new_recip:4,acl:[3,4],moddir:3,alwai:[4,1],revert_recip:4,chroot:3,end:[3,4,1],newlin:3,turn:5,qcow2:3,filesystem:[3,4],projects_info:4,"4cdb":4,discinfo:[3,2],write:[3,4,5],brian:1,sig:4,"__init__":3,add_arg:3,removepkg:3,opt:3,instead:[3,4,1],config:[3,4,2],image_nam:[4,1],pungi:5,mako:[3,5],product:3,frac:3,runcmd_output:3,winnt:3,get_iso_label:3,split_and_expand:3,after:[3,4],variant:3,yum_obj:3,fstype:3,befor:[3,0,5],wrong:3,generate_module_info:3,weldr:1,mai:[3,4],multipl:3,arch:[3,4,5],physic:3,scriptlet:3,rhel7:[4,1],recipe_from_fil:4,committimevalerror:4,attempt:[4,5],phys_root:3,emit:3,ani:[3,4,1],ltmpl:[3,2],installpkg:3,correspond:3,"4c9f":4,produc:[5,1],caus:3,inform:[4,5,1],"switch":3,maintain:5,udev_escap:3,cpu:3,order:[4,5],oper:[4,5],uuid_imag:4,composit:4,help:3,graft:3,max_ag:4,api_tim:4,move:[3,4,1],becaus:[4,1],"4af9":4,ts_current:3,top:[4,1],i386:3,privileg:1,flexibl:5,paramet:[3,4],systemd:[3,1],depmod:3,group:[3,4,1],cli:4,img:3,how:[3,5],chosen:[3,4],fix:3,lvm2:3,nevra:4,resort:3,requir:[3,4],downloadbasecallback:3,srcdir:3,pass:[3,4,1],treebuild:[3,4,2],imgutil:[3,2],exract:4,run_creat:3,them:[3,4,5,1],good:3,"return":[3,4,1],thei:[4,1],python:[3,5],timestamp:[3,4],subdirectori:4,initi:3,devel:4,acff:4,mention:3,mksquashf:3,execproduct:3,perror:3,"7f16":4,detach:3,introduct:[0,5],yaps_to_project_info:4,livecd:3,recipe_filenam:4,name:[3,4,1],destfil:3,run_pkg_transact:3,simpl:[3,1],virtualinstal:3,make_squashf:3,package_nam:4,datahold:[3,4],separ:[3,4],token:3,exampl:[3,4,1],uuid_delet:4,mode:[3,4],addrsiz:3,each:[3,4,1],debug:[3,1],found:[3,4,1],updat:[3,4],dm_attach:3,loop_dev:3,subset:4,make_queue_dir:4,domain:1,doupgrad:3,dep_nevra:4,bump:4,replac:[3,4,5],hard:4,idea:5,procedur:3,realli:3,initrd:3,finish:[3,4,1],umount:[3,1],mountpoint:3,extract:[3,4],event:3,special:4,out:[3,4,5,1],lzma:3,network:3,logmonitor:[3,2],space:[4,1],goe:[3,5],open:[3,4],newli:3,template_tempdir:3,monitor:[3,4,1],content:[3,0,4,1],rel:3,add2636e7459:4,executil:[3,2],ref:4,cwd:3,tmpl:3,shut:3,init_file_log:3,insid:3,workflow:5,runtimeerror:[3,4],contain:[3,4,5],differ:[3,4],undo:[3,4],standard:3,findkernel:3,base:[3,4,2],mime:4,dictionari:4,cmdlist:3,put:[3,4],org:4,"byte":4,ftruncat:3,maketreeinfo:5,preun:3,driven:5,architectur:[3,5],thread:[3,4,1],postinstal:3,tag:[3,4],uuid_statu:4,could:[3,1],traceback:3,get_buildarch:3,comoposit:4,keep:3,cee5f4c20fc33ea4d54bfecf56f4ad41ad15f4f3:4,thing:[4,5,1],vmlinuz:3,enforc:4,iso:[3,4,5,1],isn:[3,4],outsid:3,"96db":4,fmt:3,first:[3,4,5,1],feed:3,softwar:4,bootdir:3,reimplement:3,directli:[4,1],x86_64:[3,4],fedora:3,bugurl:3,"3e11eb87a63d289662cba4b1804a0947a6843379":4,number:[4,1],echo:3,hook:3,alreadi:[4,1],diff_item:4,messag:[3,4,1],ad52:4,owner:1,miss:4,log_path:3,size:[3,4],losetup:3,removefrom:3,round:3,work_dir:3,unknown:3,caught:4,mkdir:3,system:[3,4],least:3,tm_to_dep:4,fobj:3,makestamp:5,make_disk:1,master:[4,1],statement:3,lognam:3,recent:4,"final":[3,4,5,1],store:[3,4,1],listen:3,attach:3,subpackag:[3,2],releasev:3,consol:1,option:[3,4,5,1],rpmtran:3,welcom:0,tool:5,copi:[3,4,5,1],leav:[4,1],specifi:[3,4],direct:4,loop_attach:3,intrd:3,part:4,pars:3,tag_recipe_commit:4,add_template_var:3,find_ostree_root:3,exactli:4,than:[3,4],templatedir:3,c30b7d80:4,db_support:4,postun:3,execwithpulseprogress:3,whenev:3,provid:5,remov:[3,4,5,1],tree:[3,4,5],second:4,charact:3,project:[3,4,2,1],ostre:3,fe925c35e795:4,str:[3,4],ybo:3,is_parent_diff:4,other:[3,4,5,1],thu:3,result:[3,4,1],pre:[3,1],read_recipe_commit:4,warfar:4,comput:3,runner:3,well:[3,4,1],yaps_to_project:4,newrun:3,anywher:3,bec7:4,packag:[3,4,5,2,1],rebuild_initrd:3,shell:3,increment:4,tabl:0,need:[3,4,1],take:[3,4],build_tim:4,"null":4,xattr:3,loraxdir:3,make_yum_dir:4,"0x7ff04f808150":3,built:[3,4],lib:[3,4,1],callback:3,open_or_create_repo:4,gitlock:4,especi:1,e6fa6db4:4,port:3,note:3,also:1,ideal:3,client:4,"03397f8d":4,build:[3,4,5,1],which:[3,4,5],recipe_path:4,read_recipe_and_id:4,brace:3,noth:[3,4],sysutil:[3,2],runtim:3,sure:[3,1],vnc:3,play0ad:4,deploy:3,track:4,status_filt:4,glob:3,object:[3,4],compress:[3,4],rebuild_initrds_for_l:3,most:4,artifact:4,"48a5":4,bar:3,novirt_instal:[3,4,1],homepag:4,"class":[3,4],avail:[4,1],metac:3,don:[3,4],"11t01":4,"397f":4,url:[4,1],doc:1,clear:[4,5],later:3,request:[3,4,1],group_typ:4,doe:[4,1],pipe:3,mkdosimg:3,place:[3,4],clean:[4,5,1],af92:4,shortnam:3,modules_list:4,chown_:3,useradd:1,set:[3,4,5,1],usr:[3,4],to_commit:[3,4],semver:4,random:3,yaps_to_modul:4,create_pxe_config:3,sequenc:3,chmod_:3,pkg:3,permiss:1,mkfsarg:3,protocol:1,label:3,data:[3,4,5],find:[3,4,5],xml:3,access:4,onli:[3,4,1],execut:[3,5],pretti:[3,1],num_workspac:3,execwithcallback:3,configur:[3,4,5],figur:5,should:[3,4,1],recipe_from_toml:4,make_runtim:3,compressarg:3,initramf:[3,4],logdir:3,descript:[3,4],e695affd:4,ftime:3,local:[3,4],meant:4,info:[3,4,1],rootf:3,"6d292bd0":4,variou:4,get:[3,4],retrysleep:3,add_templ:3,stop:3,cpio:3,octalmod:3,repo:[4,5,1],repl:3,"import":1,composerconfig:4,revpars:4,neither:4,restart:4,target:3,dmsetup:3,mktar:3,enabl:[3,4],a2ef832e6b1a:4,get_ks_disk_s:3,depsolv:[3,4],specif:[3,4],old_item:4,"45e380f39894":4,lst:4,yield:4,patch:4,allbut:3,make_compos:4,ae1bf7e3:4,stuff:3,partit:[3,1],dracut_hooks_path:3,comma:[3,4],metadata:[3,4],where:[3,4,1],summari:4,transact:4,kernel:3,filelog:3,project_nam:[3,4],commandlin:3,creator:[3,4,2,1],problem:[3,4,5],knowledg:5,anaconda_arg:4,see:[3,4],dmdev:3,bare:4,test_mod:4,arg:[3,4],fail:[3,4],"10t23":4,outroot:3,bump_vers:4,arm:3,atla:4,statu:[3,4,1],still:[3,1],"30z":4,kei:3,correctli:4,redirect:3,pattern:3,someth:[3,5,1],kbyte:[3,4],below:4,iso_path:3,pkglistdir:3,written:5,delete_fil:4,"745712b2":4,rexist:3,start_build:4,between:[3,4],progress:3,read_commit_spec:4,bunch:3,sysroot:3,implantisomd5:3,spars:3,srcglob:3,e083921a7ed1cf2eec91ad12b9ad1e70ef3470b:4,parent:4,x86:3,were:[3,4],style:3,popul:4,boundri:4,lazi:3,hardlink:3,outfil:3,virtio_host:3,come:4,blocksiz:3,uuid:[3,4,1],callback_data:3,"03374adbf080fe34f5c6c29f2e49cc2b86958bf2":4,get_revision_from_tag:4,last:[3,4],preexec_fn:3,modules_info:4,constructor:4,pylorax:[0,1,2,3,4,5],etc:[3,4],initrd_address:3,move_compose_result:[4,1],context:3,mani:4,b36e:4,whole:3,bd31:4,kpartx:3,images_dir:3,isoinfo:3,logrequesthandl:3,point:[3,4,5],applianc:3,yumhelp:[3,2],tag_file_commit:4,argumentpars:[3,4],chmod:3,disk_img:3,uuid_log:4,virt_instal:3,empti:3,commit_id:4,redhat:1,shutdown:3,"8d7d":4,linktre:3,diff:[3,4],qemu:3,speak:5,blog:1,sys_root_dir:3,revisor:5,platform:4,aarch64:3,rebuild:3,devic:3,compos:[3,0,4,2,1],jboss:4,otherwis:[3,4],addon:4,much:3,destin:3,yap:4,a215:4,upstream_vc:4,uuid_cancel:4,calledprocesserror:3,a697ca405cdf:4,valueerror:4,joinpath:3,lpar:3,ram:3,transmogrifi:3,crossdomain:[3,4,2],liveo:3,imag:[3,4,5,1],baserequesthandl:3,convert:[3,4],argument:[3,4,1],upgrad:3,"4b8a":4,pxe:3,execwithredirect:3,create_runtim:3,workspac:[3,4,2],"catch":3,start_queue_monitor:4,those:[4,5],sound:3,mkrootfsimg:3,compose_arg:[4,1],save:[3,4,1],look:[4,5],remove_temp:3,raw:4,plain:4,mount:[3,1],properti:4,defin:[4,1],"while":4,write_commit:4,"0ad":4,img_mount:3,from_commit:[3,4],occas:3,volid:3,avahi:4,virtio_consol:3,higer:4,gconfset:3,keytyp:3,argv:3,real:3,mandatori:4,argpars:3,ordereddict:4,have:[3,4,1],stdout:[3,4],readi:[3,4],virt:[3,4],readm:4,non:4,automatic_opt:4,createaddrs:3,undelet:4,cmdline:[3,1],kwarg:3,armplatform:4,conf:[3,4,5],module_nam:[3,4],incom:3,revis:4,unneed:[3,4,5,1],seem:3,sever:4,"2b4174b3614b":4,configpars:4,decor:[3,2],read_commit:4,develop:4,socketserv:3,author:[4,1],media:3,make:[3,4,1],yumavailablepackagesqlit:4,cross:4,same:[3,4],installupgradeinitrd:3,recipe_from_dict:4,preserv:3,epoch:4,instanc:4,split:3,install_log:3,document:0,logmethod:3,complet:[3,5],reticul:3,virtio_port:3,workdir:3,http:[3,4,1],installerror:3,expans:3,oid:4,driver:[3,5],kill:3,libvirt:3,dep_evra:4,"06e8":4,rais:[3,4],temporari:[3,4,5],logfil:[3,4],ownership:[4,1],skip:4,"70b84195":4,callback_arg:3,suffix:3,respons:[3,4],implement:3,expand:3,loop_detach:3,audit:4,find_commit_tag:4,appropri:3,off:1,equival:3,"3726a1093fd0":4,mount_ok:3,com:[4,1],builder:4,mkfsimag:3,itself:1,except:[3,4],iserror:3,loraxtempl:3,uuid_tar:4,without:4,command:[3,5,1],installinitrd:3,endfor:3,destroi:3,libus:4,source_ref:4,rout:[3,4,1],left:3,list_branch_fil:4,construct:3,newest:4,entri:[4,1],just:3,less:4,"0instal":4,template_fil:3,rest:[3,1],execwithcaptur:3,recipemodul:4,revert_fil:4,virtual:3,"13z":4,touch:3,rundir:3,roughli:3,previous:5,runtimebuild:3,"01t08":4,samba:4,"870f":4,easi:3,mix:5,dm_detach:3,buildinstal:5,returncod:3,add_arch_template_var:3,execconsol:3,outputdesc:3,script:[3,4,5],add:[3,4,1],generate_module_data:3,myconfig:3,blob:4,isomountpoint:3,input:3,attach_to_al:4,app:3,match:[3,4],safeconfigpars:4,bin:3,applic:[4,1],estimate_s:3,pcritic:3,maxretri:3,fname:3,is_image_mount:3,format:[3,4],dest:3,big:3,caller:4,round_to_block:3,wwood:3,devicemapp:3,commit_recip:4,"47z":4,game:4,ks_path:3,iter:4,repo_url:3,step:5,gnu:4,bit:1,runcmd:3,recurs:3,you:[3,4,1],licens:4,get_default:4,head_commit:4,ignor:3,success:4,lost:4,header:4,whitespac:3,resolv:3,integ:4,server:[3,4,2,1],updateprogress:3,collect:4,widest:1,boot_dir:3,either:[3,4,1],compose_detail:4,rescu:3,"4a23":4,output:[3,4,2,1],recipe_diff:4,el7:4,stdin:3,db_version:4,www:4,drop:1,root_dir:[3,4],"1mbyte":4,grub:3,captur:3,projects_list:4,revert:4,linux:3,some:[3,4,5,1],back:3,yumlock:4,isfin:3,recipe_str:4,elaps:3,read:[3,4,5],commit_recipe_fil:4,get_commit_detail:4,loop_waitfor:3,changelog:4,te_tot:3,librari:5,workspace_delet:4,tmp:[3,4],freez:[3,4],mkspars:3,get_base_object:4,lead:3,logserv:3,rpm:[3,4,5],test_config:4,though:5,dyy8gj:4,per:4,rootfs_imag:3,when:[3,4,1],substitut:3,"28z":4,larg:[4,1],unit:3,f629b7a948f5:4,spec:4,reproduc:4,localhost:3,"61b799739ce8":4,find_nam:4,"9bf1":4,previou:[3,4],run:[3,4,1],direcori:3,uncompress:4,share_dir:4,modeless:3,"45502a6d":4,usag:3,symlink:[3,4],gconf:3,host:[3,4],lorax:[3,0,4,5,1],repositori:4,offset:[3,4],hw_random:3,loraxtransactioncallback:3,post:[3,4,1],img_siz:3,stage:5,src:3,sbin:3,recipeerror:4,rare:3,socket:1,livemedia:[3,4,1],gplv3:4,loraxdownloadcallback:3,page:0,writepkglist:3,retun:4,toml:[4,1],includ:[4,1],done:4,build_env_ref:4,"99anaconda":3,commit:[3,4],pdebug:3,backup:[3,4],disabl:3,unmaintain:5,ppc:3,associ:3,"56z":4,own:[4,1],add_arch_templ:3,satisfi:4,commitdetail:4,kdir:3,basenam:3,pyo:3,encod:4,commit_recipe_directori:4,automat:3,build_config_ref:4,down:3,"4b70":4,been:[3,4],central:5,pivot:3,noarch:4,init_stream_log:3,spline:3,"2ping":4,behind:3,origin:4,git:[4,1],new_item:4,prepar:4,hwmon:3,mount_dir:3,support:[4,5,1],bodi:4,json:[4,1],gfile:4,custom:5,like:[3,4,1],start:[4,1],reli:5,gid:4,gib:3,fraction:3,"var":[3,1],overhead:3,stage2:3,workspace_dir:4,cancel:[3,4],select:[3,4],"function":[3,4,1],pwarn:3,head:4,creation:[3,5],gzip:3,form:4,enough:3,templatefil:3,"29b492f26ed35d80800b536623bafc51e2f0eff2":4,baseurl:4,client_address:3,continu:3,brace_expand:3,thi:[3,4,1],state:3,old_vers:4,"9c81":4,newer:3,te_curr:3,renam:3,line:[3,4,5],"true":[3,4,1],longer:4,count:4,pull:5,pkgsizefil:3,dracut:3,d6bd:4,cleanup:[3,4],consist:5,isolabel:3,whether:4,api_changelog:4,"11t00":4,queue_statu:4,maximum:4,until:3,do_graft:3,directori:[3,4,1],composerpars:4,mkqcow2:3,limit:[3,4],anaconfigurationthread:4,rerun:4,sampl:3,"523b":4,remaind:4,similar:1,succe:4,treeinfo:[3,2],sort:4,tomlerror:4,memori:3,uid:4,creat:[3,4,5,1],"int":[3,4],retriev:4,fread:3,filenam:[3,4],doesn:[3,4,1],"char":3,fila:4,loraxtemplaterunn:3,dracut_hook:3,file:[3,4,5,1],removekmod:3,kubernet:4,exist:[3,4,5,1],check:[3,4,1],fill:4,mkext4img:3,bzip2:3,log_check:3,installimg:3,quot:3,pronounc:4,titl:[3,4],user:[3,4,1],pat:3,boot:[3,4,5,1],detail:4,invalid:4,prepend:4,"default":[3,4,1],old:4,valid:4,bool:4,usbutil:3,branch:[4,1],test:[3,4],pathnam:3,installtre:3,allow_no_valu:4,get_kernel:3,list_commit_fil:4,instroot:5,variabl:3,extern:3,compress_arg:4,"8c8435ef":4,tcpserver:3,copytre:3,time:[3,4,1],unmount:3,disk_siz:3,"_map":1,log:[3,4,1],default_image_nam:3,singleton:3,mkcpio:3,"44c0":4,bcl:1,bootload:1,mkhfsimg:3,now:4,handl:[3,1],curl:1,schema_vers:4,projects_depsolv:4,fsimag:3,isolinux:3,mask:3,glusterf:4,aren:4,get_compose_typ:4,vcpu:3,buildarch:3,text:4,take_limit:4,"7078e521a54b12eae31c3fd028680da7a0815a4d":4,escap:3,dst:3,delete_recip:4},objtypes:{"0":"py:module","1":"py:function","2":"py:method","3":"py:attribute","4":"py:exception","5":"py:class"},titles:["Welcome to Lorax’s documentation!","lorax-composer","pylorax","pylorax Package","api Package","Introduction to Lorax"],objnames:{"0":["py","module","Python module"],"1":["py","function","Python function"],"2":["py","method","Python method"],"3":["py","attribute","Python attribute"],"4":["py","exception","Python exception"],"5":["py","class","Python class"]},filenames:["index","lorax-composer","modules","pylorax","pylorax.api","intro"]}) \ No newline at end of file +Search.setIndex({objects:{"":{pylorax:[4,0,1,""],composer:[9,0,1,""]},"pylorax.yumhelper.LoraxRpmCallback":{filelog:[4,2,1,""],errorlog:[4,2,1,""],event:[4,2,1,""],scriptout:[4,2,1,""]},composer:{http_client:[9,0,1,""],cli:[10,0,1,""],unix_socket:[9,0,1,""]},"pylorax.yumhelper.LoraxTransactionCallback":{event:[4,2,1,""]},"pylorax.treebuilder.TreeBuilder":{kernels:[4,3,1,""],rebuild_initrds:[4,2,1,""],copy_dracut_hooks:[4,2,1,""],build:[4,2,1,""],dracut_hooks_path:[4,3,1,""],implantisomd5:[4,2,1,""]},"composer.unix_socket.UnixHTTPConnection":{connect:[9,2,1,""]},"pylorax.installer.VirtualInstall":{destroy:[4,2,1,""]},"pylorax.api.yumbase":{get_base_object:[5,1,1,""]},"pylorax.api.config":{ComposerConfig:[5,4,1,""],make_yum_dirs:[5,1,1,""],make_queue_dirs:[5,1,1,""],configure:[5,1,1,""]},"pylorax.executils.tee":{stop:[4,2,1,""],run:[4,2,1,""]},"composer.cli.compose":{compose_details:[10,1,1,""],compose_metadata:[10,1,1,""],compose_cmd:[10,1,1,""],compose_image:[10,1,1,""],compose_results:[10,1,1,""],compose_types:[10,1,1,""],compose_cancel:[10,1,1,""],compose_delete:[10,1,1,""],compose_status:[10,1,1,""],compose_start:[10,1,1,""],compose_logs:[10,1,1,""],compose_log:[10,1,1,""]},"composer.http_client":{get_url_json:[9,1,1,""],api_url:[9,1,1,""],post_url_toml:[9,1,1,""],get_url_raw:[9,1,1,""],post_url:[9,1,1,""],download_file:[9,1,1,""],delete_url_json:[9,1,1,""],get_filename:[9,1,1,""],post_url_json:[9,1,1,""]},"pylorax.api.compose":{repo_to_ks:[5,1,1,""],compose_args:[5,1,1,""],move_compose_results:[5,1,1,""],start_build:[5,1,1,""],compose_types:[5,1,1,""]},"pylorax.api.v0":{v0_api:[5,1,1,""],take_limits:[5,1,1,""]},"composer.cli":{compose:[10,0,1,""],recipes:[10,0,1,""],modules:[10,0,1,""],utilities:[10,0,1,""],main:[10,1,1,""],projects:[10,0,1,""]},"pylorax.api.workspace":{workspace_write:[5,1,1,""],workspace_dir:[5,1,1,""],workspace_delete:[5,1,1,""],workspace_read:[5,1,1,""]},"pylorax.logmonitor.LogMonitor":{shutdown:[4,2,1,""]},"pylorax.decorators":{singleton:[4,1,1,""]},"pylorax.sysutils":{joinpaths:[4,1,1,""],remove:[4,1,1,""],replace:[4,1,1,""],linktree:[4,1,1,""],touch:[4,1,1,""],chmod_:[4,1,1,""],chown_:[4,1,1,""]},"pylorax.ltmpl":{LoraxTemplate:[4,4,1,""],brace_expand:[4,1,1,""],split_and_expand:[4,1,1,""],rexists:[4,1,1,""],rglob:[4,1,1,""],LoraxTemplateRunner:[4,4,1,""]},"pylorax.api.recipes.Recipe":{package_names:[5,3,1,""],bump_version:[5,2,1,""],module_names:[5,3,1,""],filename:[5,3,1,""],toml:[5,2,1,""],freeze:[5,2,1,""]},"pylorax.creator.KernelInfo":{get_kernel_arch:[4,2,1,""],get_kernels:[4,2,1,""]},"composer.cli.projects":{projects_list:[10,1,1,""],projects_cmd:[10,1,1,""],projects_info:[10,1,1,""]},"pylorax.imgutils":{LoopDev:[4,4,1,""],mkfsimage:[4,1,1,""],mkdiskfsimage:[4,1,1,""],mksparse:[4,1,1,""],do_grafts:[4,1,1,""],copytree:[4,1,1,""],mkext4img:[4,1,1,""],PartitionMount:[4,4,1,""],dm_detach:[4,1,1,""],default_image_name:[4,1,1,""],mkbtrfsimg:[4,1,1,""],round_to_blocks:[4,1,1,""],mkqcow2:[4,1,1,""],Mount:[4,4,1,""],compress:[4,1,1,""],loop_attach:[4,1,1,""],estimate_size:[4,1,1,""],get_loop_name:[4,1,1,""],mkcpio:[4,1,1,""],loop_detach:[4,1,1,""],mkrootfsimg:[4,1,1,""],mkhfsimg:[4,1,1,""],DMDev:[4,4,1,""],mktar:[4,1,1,""],dm_attach:[4,1,1,""],umount:[4,1,1,""],loop_waitfor:[4,1,1,""],mksquashfs:[4,1,1,""],mkdosimg:[4,1,1,""],mount:[4,1,1,""]},"pylorax.logmonitor":{LogRequestHandler:[4,4,1,""],LogServer:[4,4,1,""],LogMonitor:[4,4,1,""]},"pylorax.yumhelper.LoraxDownloadCallback":{updateProgress:[4,2,1,""]},"pylorax.api":{queue:[5,0,1,""],compose:[5,0,1,""],crossdomain:[5,0,1,""],recipes:[5,0,1,""],yumbase:[5,0,1,""],v0:[5,0,1,""],workspace:[5,0,1,""],server:[5,0,1,""],config:[5,0,1,""],projects:[5,0,1,""]},"pylorax.api.server.GitLock":{repo:[5,3,1,""],lock:[5,3,1,""],dir:[5,3,1,""]},"pylorax.base":{DataHolder:[4,4,1,""],BaseLoraxClass:[4,4,1,""]},"composer.cli.utilities":{handle_api_result:[10,1,1,""],argify:[10,1,1,""],packageNEVRA:[10,1,1,""],toml_filename:[10,1,1,""],frozen_toml_filename:[10,1,1,""]},"pylorax.api.config.ComposerConfig":{get_default:[5,2,1,""]},"pylorax.buildstamp":{BuildStamp:[4,4,1,""]},"pylorax.api.projects":{yaps_to_project_info:[5,1,1,""],tm_to_dep:[5,1,1,""],api_changelog:[5,1,1,""],dep_nevra:[5,1,1,""],projects_list:[5,1,1,""],projects_info:[5,1,1,""],modules_info:[5,1,1,""],api_time:[5,1,1,""],modules_list:[5,1,1,""],dep_evra:[5,1,1,""],ProjectsError:[5,5,1,""],yaps_to_module:[5,1,1,""],projects_depsolve:[5,1,1,""],yaps_to_project:[5,1,1,""]},"pylorax.api.crossdomain":{crossdomain:[5,1,1,""]},"pylorax.api.server":{GitLock:[5,4,1,""]},"pylorax.ArchData":{bcj_arch:[4,3,1,""],lib64_arches:[4,3,1,""]},"pylorax.Lorax":{init_stream_logging:[4,2,1,""],init_file_logging:[4,2,1,""],run:[4,2,1,""],configure:[4,2,1,""]},"pylorax.discinfo.DiscInfo":{write:[4,2,1,""]},"pylorax.ltmpl.LoraxTemplate":{parse:[4,2,1,""]},"composer.unix_socket":{UnixHTTPConnection:[9,4,1,""],UnixHTTPConnectionPool:[9,4,1,""]},"pylorax.logmonitor.LogRequestHandler":{setup:[4,2,1,""],finish:[4,2,1,""],handle:[4,2,1,""],iserror:[4,2,1,""]},"pylorax.installer":{VirtualInstall:[4,4,1,""],IsoMountpoint:[4,4,1,""],virt_install:[4,1,1,""],novirt_install:[4,1,1,""],InstallError:[4,5,1,""]},"pylorax.installer.IsoMountpoint":{get_iso_label:[4,2,1,""],umount:[4,2,1,""]},"pylorax.treeinfo.TreeInfo":{write:[4,2,1,""],add_section:[4,2,1,""]},"pylorax.creator":{make_appliance:[4,1,1,""],is_image_mounted:[4,1,1,""],run_creator:[4,1,1,""],make_image:[4,1,1,""],mount_boot_part_over_root:[4,1,1,""],make_runtime:[4,1,1,""],get_ks_disk_size:[4,1,1,""],make_livecd:[4,1,1,""],make_live_images:[4,1,1,""],create_pxe_config:[4,1,1,""],find_ostree_root:[4,1,1,""],rebuild_initrds_for_live:[4,1,1,""],KernelInfo:[4,4,1,""],make_squashfs:[4,1,1,""]},"pylorax.executils":{execConsole:[4,1,1,""],execWithRedirect:[4,1,1,""],execWithPulseProgress:[4,1,1,""],execWithCallback:[4,1,1,""],tee:[4,4,1,""],runcmd:[4,1,1,""],ExecProduct:[4,4,1,""],runcmd_output:[4,1,1,""],execWithCapture:[4,1,1,""]},"pylorax.treebuilder.RuntimeBuilder":{create_runtime:[4,2,1,""],writepkgsizes:[4,2,1,""],writepkglists:[4,2,1,""],postinstall:[4,2,1,""],generate_module_data:[4,2,1,""],install:[4,2,1,""],cleanup:[4,2,1,""]},"composer.cli.recipes":{recipes_diff:[10,1,1,""],recipes_push:[10,1,1,""],recipes_freeze_show:[10,1,1,""],recipes_cmd:[10,1,1,""],recipes_changes:[10,1,1,""],recipes_undo:[10,1,1,""],recipes_delete:[10,1,1,""],recipes_tag:[10,1,1,""],recipes_depsolve:[10,1,1,""],recipes_workspace:[10,1,1,""],recipes_show:[10,1,1,""],recipes_freeze_save:[10,1,1,""],prettyDiffEntry:[10,1,1,""],recipes_save:[10,1,1,""],prettyCommitDetails:[10,1,1,""],recipes_list:[10,1,1,""],recipes_freeze:[10,1,1,""]},"pylorax.base.BaseLoraxClass":{pwarning:[4,2,1,""],pinfo:[4,2,1,""],pcritical:[4,2,1,""],pdebug:[4,2,1,""],perror:[4,2,1,""]},"composer.cli.modules":{modules_cmd:[10,1,1,""]},"pylorax.discinfo":{DiscInfo:[4,4,1,""]},"pylorax.base.DataHolder":{copy:[4,2,1,""]},"pylorax.logmonitor.LogServer":{log_check:[4,2,1,""]},"pylorax.buildstamp.BuildStamp":{write:[4,2,1,""]},"pylorax.yumhelper":{LoraxTransactionCallback:[4,4,1,""],LoraxRpmCallback:[4,4,1,""],LoraxDownloadCallback:[4,4,1,""]},pylorax:{installer:[4,0,1,""],logmonitor:[4,0,1,""],creator:[4,0,1,""],api:[5,0,1,""],ltmpl:[4,0,1,""],get_buildarch:[4,1,1,""],sysutils:[4,0,1,""],discinfo:[4,0,1,""],imgutils:[4,0,1,""],Lorax:[4,4,1,""],base:[4,0,1,""],treeinfo:[4,0,1,""],treebuilder:[4,0,1,""],yumhelper:[4,0,1,""],buildstamp:[4,0,1,""],ArchData:[4,4,1,""],output:[4,0,1,""],decorators:[4,0,1,""],executils:[4,0,1,""]},"pylorax.api.queue":{build_status:[5,1,1,""],start_queue_monitor:[5,1,1,""],monitor:[5,1,1,""],uuid_status:[5,1,1,""],get_compose_type:[5,1,1,""],uuid_info:[5,1,1,""],make_compose:[5,1,1,""],uuid_delete:[5,1,1,""],uuid_image:[5,1,1,""],compose_detail:[5,1,1,""],uuid_cancel:[5,1,1,""],uuid_tar:[5,1,1,""],uuid_log:[5,1,1,""],queue_status:[5,1,1,""]},"pylorax.treebuilder":{findkernels:[4,1,1,""],generate_module_info:[4,1,1,""],RuntimeBuilder:[4,4,1,""],TreeBuilder:[4,4,1,""],udev_escape:[4,1,1,""]},"pylorax.api.recipes":{read_recipe_commit:[5,1,1,""],prepare_commit:[5,1,1,""],tag_file_commit:[5,1,1,""],get_commit_details:[5,1,1,""],delete_recipe:[5,1,1,""],find_name:[5,1,1,""],head_commit:[5,1,1,""],is_commit_tag:[5,1,1,""],list_commits:[5,1,1,""],delete_file:[5,1,1,""],recipe_from_toml:[5,1,1,""],read_commit:[5,1,1,""],recipe_filename:[5,1,1,""],open_or_create_repo:[5,1,1,""],recipe_from_dict:[5,1,1,""],CommitDetails:[5,4,1,""],commit_recipe_directory:[5,1,1,""],revert_file:[5,1,1,""],RecipeFileError:[5,5,1,""],read_commit_spec:[5,1,1,""],read_recipe_and_id:[5,1,1,""],get_revision_from_tag:[5,1,1,""],commit_recipe:[5,1,1,""],RecipeModule:[5,4,1,""],RecipeError:[5,5,1,""],tag_recipe_commit:[5,1,1,""],find_commit_tag:[5,1,1,""],revert_recipe:[5,1,1,""],CommitTimeValError:[5,5,1,""],Recipe:[5,4,1,""],diff_items:[5,1,1,""],commit_recipe_file:[5,1,1,""],recipe_from_file:[5,1,1,""],write_commit:[5,1,1,""],gfile:[5,1,1,""],RecipePackage:[5,4,1,""],is_parent_diff:[5,1,1,""],list_branch_files:[5,1,1,""],recipe_diff:[5,1,1,""],list_commit_files:[5,1,1,""]},"pylorax.treeinfo":{TreeInfo:[4,4,1,""]},"pylorax.ltmpl.LoraxTemplateRunner":{move:[4,2,1,""],run_pkg_transaction:[4,2,1,""],replace:[4,2,1,""],createaddrsize:[4,2,1,""],removekmod:[4,2,1,""],append:[4,2,1,""],removefrom:[4,2,1,""],installkernel:[4,2,1,""],installimg:[4,2,1,""],log:[4,2,1,""],gconfset:[4,2,1,""],mkdir:[4,2,1,""],installupgradeinitrd:[4,2,1,""],treeinfo:[4,2,1,""],removepkg:[4,2,1,""],run:[4,2,1,""],symlink:[4,2,1,""],systemctl:[4,2,1,""],chmod:[4,2,1,""],copy:[4,2,1,""],installpkg:[4,2,1,""],remove:[4,2,1,""],runcmd:[4,2,1,""],hardlink:[4,2,1,""],installinitrd:[4,2,1,""],install:[4,2,1,""]}},terms:{kickstart:[4,5,7,1],four:10,prefix:[4,5,7],build_statu:5,umask:4,swap:7,under:[4,7,1,8],sha256:7,newli:4,spec:5,loopdev:4,old_recip:5,everi:5,mnt:4,fatalerror:4,raise_err:4,basesystem:5,upd:6,cmd:4,shlex:4,tty1:7,x86_64:[4,5,7,8],transactionmemb:5,tmpl:[4,8,2],direct:5,second:5,handle_api_result:10,mkbtrfsimg:4,"new":[1,4,5,6,7,8,10],told:8,here:[2,4,5,6,7,8],recipe_nam:[4,5,1,10],download_fil:9,path:[9,1,4,5,7,10],errorlog:4,unix_socket:[3,9],cmdlist:4,recipes_list:10,unix:[10,1,9],buildinstal:6,total:[5,7],unit:4,dnf:8,describ:7,would:[7,2],loraxrpmcallback:4,noarch:5,get_filenam:9,program:[4,5,7,10],call:[4,5,6],recommend:7,type:[9,1,4,5,7,10],until:4,relat:5,inputdesc:4,rootdir:4,unpack:6,nspawn:8,must:[4,5,8,2],word:4,restor:5,setup:[4,5,7,8],work:[4,5,7,8],make_livecd:4,root:[1,4,5,6,7,8],overrid:[4,5,8],"08t00":5,indic:[4,0],want:[5,7,1],new_recip:5,moddir:4,winnt:4,revert_recip:5,end:[4,5,7,1,8],turn:6,vagrant:7,"4cdb":5,how:[4,6,7,8],yum:[4,5,6,8],config:[4,7,5,3],image_nam:[5,1],pungi:6,"2b4174b3614b":5,after:[4,5,7,8],befor:[4,0,6,7],wrong:4,unmount:[4,7],httpconnect:9,arch:[4,5,6,7,8,10],rhel7:[5,7,1],attempt:[5,6],phys_root:4,warfar:5,"4c9f":5,e6fa6db4:5,maintain:6,environ:[7,8],udev_escap:4,order:[5,6],origin:5,composit:5,feedback:7,over:2,becaus:[5,7,1,8],"4af9":5,privileg:1,flexibl:6,tarfil:7,uuid:[4,5,1,10],img:[4,7,8,2],fix:4,easier:7,imgutil:[4,3],them:[4,5,6,1,8],thei:[5,7,1,8],pinfo:4,yaps_to_project_info:5,compose_statu:10,changelog:5,make_squashf:4,timeout:9,each:[4,5,7,1,10],debug:[4,7,1],reticul:4,recipe_filenam:5,extract:[4,5],network:[4,7],goe:[4,6,8],dst:4,content:[0,1,2,4,5,8,9],size:[4,5,7,10],written:[6,7],free:8,standard:4,preun:4,traceback:4,domacboot:4,iso:[1,4,5,6,7,8],isn:[4,5],runcmd_output:4,onto:8,fmt:4,bootdir:4,pxeboot:8,system:[4,5,7,8],hook:4,alreadi:[5,1],packagenevra:10,compose_metadata:10,top:[5,1,2],sometim:7,tm_to_dep:5,makestamp:6,make_disk:1,master:[5,1],compos:[0,1,10,3,4,5,9],zerombr:7,listen:4,consol:1,rpmtran:4,namespac:10,tool:[6,7,8],bec7:5,c30b7d80:5,target:[4,7,8],provid:6,tree:[4,5,6,8,2],project:[1,10,3,4,5,7,9],mkisof:8,isoinfo:4,runner:4,ram:[4,7],mind:7,raw:[5,7,10,9],increment:5,further:4,seem:4,fname:4,endfor:4,sharedir:8,though:6,glob:[4,8],object:[4,5,9],specifi:[4,5,7],yourdomain:7,metac:4,don:[4,5,7],doc:[7,1],doe:[5,7,1,10,8],random:4,add_template_var:4,directli:[5,7,1,10],pkg:[4,10],mkfsarg:4,absolut:4,configur:[4,5,6,7,8],make_runtim:4,compressarg:4,watch:7,amazon:7,report:7,bootload:[7,1],a2ef832e6b1a:5,findkernel:4,method:[4,5,7],allbut:[4,8],ae1bf7e3:5,metadata:[4,5,8,10],commandlin:[4,7,8],connectionpool:9,mandatori:5,result:[1,10,4,5,7,8,9],respons:[4,5,9],fail:[4,5,10],"0x7ff04f808150":[],best:[7,8],iso_path:4,figur:6,rexist:4,start_build:5,add_templ:4,read_commit_spec:5,sysroot:4,attribut:7,boundri:5,extens:8,lazi:4,callback_data:4,get_revision_from_tag:5,against:7,logic:8,diskimag:4,com:[5,7,1,8],logrequesthandl:4,applianc:[4,7],runcmd:[4,8],"1mbyte":5,diff:[4,5,10],assum:4,speak:[6,8],sys_root_dir:4,three:10,been:[4,5,7],much:4,basic:8,dracut:[4,7],lpar:4,ani:[4,5,7,1,10],"catch":[4,7],spin:7,gnu:5,servic:[4,8],properti:5,write_commit:5,occas:4,avahi:5,safeconfigpars:5,higer:5,keytyp:4,writepkgs:4,automatic_opt:5,undelet:5,cmdline:[4,7,1,10,8],kwarg:4,conf:[4,5,6],module_nam:[4,5],sever:[5,7,2],mako:[4,6,7,8],depsolv:[4,5,10],direcori:4,make:[4,5,7,1,8],drawback:7,split:4,complet:[4,6],wheel:7,make_yum_dir:5,installerror:4,ftruncat:4,fairli:8,rais:[4,5,9],ownership:[5,1],find_commit_tag:5,dmsetup:4,thu:4,socket_path:[10,9],bugzilla:7,client:[5,7],thi:[1,2,4,5,7,8,10],endif:8,gzip:4,everyth:[7,8],left:4,protocol:1,just:[4,2],human:10,yet:7,previous:[6,7],note:[4,7],shoud:4,"4b8a":5,"870f":5,easi:4,dm_detach:4,interfer:8,had:7,add_arch_template_var:4,execconsol:4,myconfig:4,save:[9,1,4,5,8,10],get_commit_detail:5,opt:[4,10],applic:[5,1],preserv:4,disposit:9,wwood:4,devicemapp:4,ks_path:4,repo_url:4,head_commit:5,get_default:5,specif:[4,5,7,8,2],arbitrari:8,updateprogress:4,el7:5,www:5,root_dir:[4,5],projects_list:[5,10],mkspars:4,flatten:7,"44c0":5,collect:5,subclass:5,localhost:4,uncompress:5,post_url_toml:9,disk_info:7,gconf:4,hw_random:4,repositori:[5,8],post:[4,5,7,1,9],sshd:7,commit:[4,5,10],xfce:7,produc:[6,7,1],ppc:[4,2],commitdetail:5,basenam:4,encod:5,down:4,old:[5,8],storag:[4,5,1,10],mbr:7,git:[5,7,1],hwmon:4,support:[1,2,5,6,8,10],avail:[5,7,1,10],stuck:7,reli:6,gid:5,gib:4,fraction:4,overhead:4,stage2:4,pwarn:4,head:5,form:[5,8],"9c81":5,add_arg:4,"true":[4,10,5,1,9],revpars:5,"397f":5,maximum:5,tell:8,composerpars:5,anaconfigurationthread:5,rerun:5,emit:4,featur:7,fedoraproject:7,exist:[4,5,6,7,1],ship:8,check:[4,5,1],graft:4,mkext4img:4,argifi:10,when:[4,5,7,1],valuetok:4,test:[4,5,7],node:8,treebuild:[4,5,3,2],"8c8435ef":5,kvm:7,urllib3:9,default_image_nam:4,allow_no_valu:5,longer:5,anywher:4,pathnam:4,time:[4,5,7,1,2],push:10,skip:[5,7],scriptout:4,per:5,get_loop_nam:4,yumavailablepackagesqlit:5,depend:[10,5,7,8,2],flask:5,readabl:10,ggit:5,"4c68":5,addon:5,sourc:[4,5,10,9],string:[4,5,10],mountarg:4,s390x:4,exact:5,kernelinfo:4,run_creat:4,level:[5,1],leftov:7,iter:5,item:[4,5,10],round:4,dir:[4,5],prevent:5,anaconda:[1,2,4,5,6,7,8],installclass:2,port:[4,7],addr:4,current:[4,5,6,7,1],gener:[4,5,6,7,8,10],list_commit:5,satisfi:5,workspace_read:5,packagedir:4,along:[5,8],wait:[4,5],bcj_arch:4,"41ef9c3e4b73":5,compose_log:10,retrysleep:4,live_image_nam:4,queue:[4,5,3,1,10],iserror:4,"52z":5,prepare_commit:5,extra:[7,1,10],modul:[0,10,3,4,5,6,8,9],paramat:2,instal:[1,2,3,4,5,6,7,8,10],recipe_dict:5,regex:4,memori:[4,7],test_mod:5,live:[4,6,7,1],msg:[4,5],"99anaconda":4,"0x7f43500f0150":[],afford:7,share:[1,2,4,5,7,8],enhanc:7,examin:[4,7],kdir:4,prepar:5,uniqu:5,cat:7,descriptor:4,keepglob:4,stream:5,abort:7,alwai:[5,7,1],chroot:[4,8,2],multipl:[4,10],dyy8gj:5,ping:5,write:[4,5,6],make_queue_dir:5,map:10,product:[4,0,2],usabl:7,mai:[4,5,7,8],data:[4,5,6,7,9],buildarch:4,yaps_to_modul:5,"29b492f26ed35d80800b536623bafc51e2f0eff2":5,stdin:4,inform:[5,6,1,10],"switch":[4,7],cannot:[8,9],combin:10,talk:[10,9],uuid_imag:5,api_tim:5,lst:5,still:[4,7,1],depmod:4,group:[4,5,7,1],monitor:[4,5,7,1],platform:[5,7],mail:7,main:10,virtio_consol:4,non:5,initi:4,mksquashf:4,execproduct:4,now:[5,7,8,2],introduct:[0,6],name:[1,4,5,7,8,10],didn:7,revert:[5,10],package_nam:5,datahold:[4,5],separ:[4,5,10],updat:[0,2,4,5,7,8,10],loop_dev:4,armplatform:5,domain:1,compose_result:10,dep_nevra:5,replac:[2,4,5,6,7,8],individu:10,continu:4,happen:[7,8],accomplish:7,space:[5,1,10,8],ksflatten:7,correct:[4,5,6,1,10],compose_typ:[5,1,10],runtimeerror:[4,5,9],contain:[4,5,6,7,2],modules_list:5,mime:5,yum_obj:4,org:[5,7,8],"byte":5,lmc:7,care:4,wai:[7,10],get_buildarch:4,comoposit:5,refus:7,thing:[5,6,7,1],vmlinuz:4,place:[4,5,7,8,2],first:[4,5,6,7,1],oper:[5,6,7],build_tim:5,reimplement:4,redhat:[7,1,8],kernel:[4,7,8],open:[4,5],executil:[4,3],given:[4,5],convent:7,caught:[5,7],recipes_cmd:10,fobj:4,workspace_dir:5,lognam:4,releasev:[4,7],especi:1,copi:[1,2,4,5,6,7,8],artifact:5,than:[4,5],execwithpulseprogress:4,memtest86:7,fe925c35e795:5,were:[4,5],pre:[4,1],db_version:5,yaps_to_project:5,argument:[1,4,5,7,8,10],bash:[5,6],destroi:4,runtimebuild:[4,2],ideal:4,take:[4,5,7,10,2],noth:[4,5,10],sure:[4,7,1],normal:[7,8,2],track:5,compress:[4,5,7,2],"48a5":5,novirt_instal:[4,5,1],homepag:5,renam:4,rescu:[4,7],later:[4,8],drive:8,runtim:[4,8,2],af92:5,shortnam:4,useradd:1,show:[7,10],permiss:[7,1],hack:7,xml:[4,7],onli:[4,5,7,1,10],transact:5,activ:7,enough:4,dict:[4,5,10,9],logdir:4,rootpw:7,overwritten:4,"6d292bd0":5,variou:5,get:[4,5,7,9],cpio:4,repo:[5,6,7,1,8],repl:4,requir:[4,5],get_ks_disk_s:4,"_map":1,virt_instal:4,yield:5,where:[4,5,7,1,8],summari:5,init_stream_log:4,filelog:4,bump_vers:5,detect:7,label:[4,7],behind:4,between:[4,5,10],"import":[7,1],implantisomd5:4,spars:4,srcglob:4,parent:5,systemd:[4,1,8],tui:7,"8d7d":5,come:5,cli:[5,3,10,9],"03374adbf080fe34f5c6c29f2e49cc2b86958bf2":5,pkgname:2,compose_imag:10,pylorax:[1,2,3,4,5,6,8],mani:5,rawhid:[7,8],setenforc:8,yumhelp:[4,3],tag_file_commit:5,dispatch:10,cancel:[4,5,7,10],coupl:7,rebuild:4,pkgsizefil:4,uuid_cancel:5,valueerror:5,transmogrifi:4,workspac:[4,5,3,10],those:[5,6,2],sound:[4,8],mkrootfsimg:4,mount:[4,7,1],"0ad":5,argpars:[4,10],stdout:[4,5],destin:4,"__init__":[],develop:[5,7],author:[5,7,1,8],media:[4,7],same:[4,5,7,8],installupgradeinitrd:4,post_url:9,epoch:[5,10],timestamp:[4,5],document:[0,7,8],outputdesc:4,finish:[4,5,1,10,8],oid:5,driver:[4,6],dep_evra:5,bugurl:4,extern:4,loop_detach:4,appropri:[4,7],"3726a1093fd0":5,recipes_freeze_sav:10,without:[5,7],installinitrd:4,roughli:4,execut:[4,6,10],template_fil:4,rest:[4,1],unmaintain:6,touch:4,speed:7,"01t08":5,samba:5,livemedia:[4,0,5,7,1],widest:1,returncod:4,param:4,desktop:7,blog:1,blob:5,isomountpoint:4,ami:7,around:7,read:[4,5,6,7],install_log:4,whitespac:4,integ:5,server:[9,1,3,4,5,10],either:[4,5,7,1],"45502a6d":5,output:[1,3,4,5,7,8,10],nice:10,semver:5,grub:[4,7],freez:[4,5,10],rpmbasecallback:4,qemu:4,pdebug:4,exit:[4,7,10],f629b7a948f5:5,blocksiz:4,"9bf1":5,share_dir:5,modeless:4,revisor:6,found:[4,5,7,1],src:[4,0,3,7],partitionmount:4,central:6,compose_cmd:10,gplv3:5,acl:[4,5],backup:[4,5],build_config_ref:5,pivot:4,your:[7,8,2],log:[4,5,7,1,10],aren:[5,8],start:[5,7,1,10,8],strictli:8,tupl:[4,5],group_typ:5,pull:[6,7,8],possibl:[4,7,10],"default":[4,5,7,1,8],delete_fil:5,"523b":5,connect:9,uid:5,creat:[1,2,4,5,6,7,8],fila:5,file:[1,2,4,5,6,7,8,9,10],intrd:4,fill:5,api_url:9,kbyte:[4,5],tcpserver:4,prepend:5,field:[5,1],cleanup:[4,5,7,8],treeinfo:[4,3,8],chmod_:4,ignor:4,you:[1,2,4,5,7,8],trash:7,architectur:[4,6,7,8],sequenc:4,disk_siz:4,compose_start:10,uuid_log:5,mkhfsimg:4,prettycommitdetail:10,directori:[1,2,4,5,7,8],fsimag:[4,7],descript:[4,5],get_compose_typ:5,vcpu:[4,7],escap:4,cpu:4,represent:5,all:[1,2,4,5,6,7,8,10],selinux:[4,7],"0e08ecbb708675bfabc82952599a1712a843779d":5,get_kernel_arch:4,baseloraxclass:4,follow:[4,5,7,10],disk:[4,7,1],build_id:5,rxxx:5,recipes_freez:10,init:[4,7],compose_cancel:10,fals:[4,5,10],util:[3,10,9],print:10,systemctl:[4,1,8],failur:[4,5],ia64:4,strang:7,uuid_delet:5,list:[1,4,5,6,7,8,10],dict_typ:5,stderr:4,retun:5,copy_dracut_hook:4,tee:4,zero:5,pass:[1,2,4,5,7,8],uuid_tar:5,sysutil:[4,3],what:[1,4,5,6,7,8],section:[4,5,7,1],abl:[1,8],delet:[9,4,5,7,8,10],abbrevi:7,version:[1,10,4,5,6,7,8,9],add_sect:4,modules_cmd:10,squashf:[4,7,8],uuid_info:5,full:[4,5,9],hash:[5,10],recipes_push:10,modifi:[4,7],valu:[4,5,10],search:[4,0,5],popen:[4,5],make_live_imag:4,action:4,http_client:[3,9],fileglob:4,via:[1,8],filenam:[4,5,10,9],select:[4,5,7,8,10],find_nam:5,two:[4,5,10],rhel:[7,8],initrd_path:4,more:[4,6,1],kernel_arg:4,desir:5,flag:4,known:10,cach:7,installroot:[4,8],none:[4,5,1],dep:5,dev:[4,7,8],histori:5,projectserror:5,remain:[4,8,10],dee:5,ppc64:4,templat:[2,4,5,6,7,8],xfsprog:4,minimum:7,xxxx:7,newlin:4,anoth:[7,8],projects_info:[5,10],virtio_host:4,discinfo:[4,3,8],gfile:5,simpl:[4,1,8],commit_id:5,split_and_expand:4,variant:4,novirt:7,fstype:4,weldr:1,pat:4,associ:4,socketserv:4,bar:4,recipe_from_fil:5,github:7,post_url_json:9,caus:4,callback:4,rootm:7,help:[4,7,8],max_ag:5,rootf:[4,7],i386:4,paramet:[4,5,10,9],style:4,bd31:5,resort:4,downloadbasecallback:4,"96db":5,recip:[9,1,3,4,5,10],good:[4,7],"return":[4,10,5,1,9],recipes_diff:10,acff:5,"7f16":5,detach:4,livecd:4,httplib:9,virtualinstal:4,token:4,frozen_toml_filenam:10,dm_attach:4,weight:8,hard:5,idea:[6,7],procedur:4,realli:[4,7,8],initrd:[4,7,8],loopx:4,expect:7,delete_url_json:9,http:[1,4,5,7,8,10],event:4,lzma:4,template_tempdir:4,"7078e521a54b12eae31c3fd028680da7a0815a4d":5,archdata:4,proxi:7,pub:7,reason:7,base:[3,4,5,7,8,9],put:[4,5,2],maketreeinfo:6,driven:6,thread:[4,5,7,1],uuid_statu:5,pyanaconda:2,feed:4,singleton:4,lvm2:4,"3e11eb87a63d289662cba4b1804a0947a6843379":5,number:[5,1,10,8],bootabl:7,done:5,construct:4,ad52:5,miss:5,losetup:4,differ:[4,5,7,10],script:[4,5,6,7],least:[4,7],statement:4,img_siz:4,store:[4,5,7,1,8],option:[1,4,5,6,7,8],loop_attach:4,part:[5,7,10,2],pars:4,find_ostree_root:4,templatedir:4,db_support:5,postun:4,whenev:4,remov:[1,4,5,6,7,8],ostre:[4,7],str:[4,5,10,9],is_parent_diff:5,comput:4,newrun:4,partitin:7,packag:[1,2,3,4,5,6,7,8,9,10],"null":[5,7],built:[4,5,8],lib:[4,5,1],gitlock:5,mkqcow2:4,pkglistdir:4,also:[7,1,8],append:[4,5,1,10,8],recipe_path:5,brace:4,vnc:[4,7],distribut:8,take_limit:5,passwd:7,status_filt:5,previou:[4,5],most:[5,7,10],rebuild_initrds_for_l:4,clear:[5,6],mkdosimg:4,clean:[5,6,7,1],find:[4,5,6,7,9],access:5,pretti:[4,1],num_workspac:4,solut:7,recipe_from_toml:5,e695affd:5,octalmod:4,restart:5,mktar:4,umount:[4,7,1],make_compos:5,common:[7,8],kill:[4,7],set:[1,4,5,6,7,8,10],creator:[0,1,3,4,5,7],see:[4,5,7,8],bare:5,arg:[4,5,7,10],arm:4,atla:5,someth:[4,6,7,1],won:7,ftime:4,kpartx:[4,7],dmdev:4,hardlink:4,outfil:4,popul:5,both:[5,7],last:[4,5,10],preexec_fn:4,initrd_address:4,move_compose_result:[5,1],context:4,whole:4,source_ref:5,images_dir:4,point:[4,5,6],except:[4,5,8],header:[5,9],shutdown:[4,7],linux:[4,7],aarch64:[4,8,2],devic:[4,7,8],empti:[4,8],a215:5,upstream_vc:5,a697ca405cdf:5,joinpath:4,liveo:[4,8],imag:[0,1,2,4,5,6,7,8,10],create_runtim:4,lib64_arch:4,compose_arg:[5,1],look:[5,6,7,2],remove_temp:4,frozen:10,"while":[5,2],error:[4,5,7,10],loop:[4,8],real:[4,7],ordereddict:5,ppc64le:[4,2],readi:[4,5],readm:5,itself:1,cento:8,decor:[4,3],read_commit:5,fedora:[4,7],minim:[7,1],logmethod:4,higher:8,virtio_port:4,x86:[4,8,2],temporari:[4,5,6,7,8,10],user:[4,5,7,1],"70b84195":5,implement:[4,2],recent:[5,10],subpackag:[4,3,9],equival:4,older:7,mount_ok:4,entri:[5,7,1,10],play0ad:5,libus:5,docker:7,ts_total:4,api_changelog:5,"0instal":5,revert_fil:5,openstack:7,rundir:4,password:7,efi:7,log_check:4,input:[4,7],build:[1,2,4,5,6,7,8,10],bin:4,bio:7,pcritic:4,maxretri:4,format:[4,5,7,10],big:4,checksum:7,commit_recip:5,api_vers:[10,9],game:5,step:[6,7],bit:1,livesi:7,lost:5,toml_filenam:10,resolv:4,elaps:4,loop_waitfor:4,logserv:4,compose_detail:[5,10],"4a23":5,encount:7,"30z":5,creation:[4,6,7,8,2],some:[1,4,5,6,7,8,9],back:4,isfin:4,sampl:4,mirror:[7,8],"0x7f4f7f21e150":4,workspace_delet:5,get_base_object:5,test_config:5,recipes_undo:10,substitut:[4,8],larg:[5,1],cloud:7,reproduc:5,"61b799739ce8":5,run:[1,2,4,5,7,8,10],composerconfig:5,copytre:4,unixhttpconnectionpool:9,gnome:7,loraxdownloadcallback:4,writepkglist:4,dialog:7,build_env_ref:5,recipes_freeze_show:10,block:8,pythonpath:7,mirrormanag:7,"2ping":5,mkf:4,bodi:[5,9],custom:[6,7,8,2],includ:[9,2,5,7,10,1],loraxdir:4,brace_expand:4,link:4,newer:[4,7],atom:7,line:[4,5,6],info:[4,5,1,10],d6bd:5,consist:6,isolabel:4,caller:5,dracut_hook:4,similar:[1,8],fread:4,recipes_sav:10,doesn:[4,5,1,10],"char":4,loraxtemplaterunn:[4,8],removekmod:[4,8],kubernet:5,curl:1,installimg:[4,2],pronounc:5,titl:[4,5,7],clearpart:7,invalid:5,postinstal:[4,8],httpconnectionpool:9,mock:[7,8],list_commit_fil:5,instroot:6,compress_arg:5,lane:[7,1,8],trail:5,get_url_raw:9,bootproto:7,far:7,code:[4,5,1,8],queri:10,basearch:4,recipes_tag:10,v0_api:5,buildstamp:[4,3],installkernel:4,yumbas:[4,5,3],send:9,fatal:[4,7],untouch:4,tri:[4,5,7],"try":7,recipepackag:5,anaconda_arg:5,pleas:4,cfg:[4,5],video:4,download:[10,8,9],outputdir:4,client_address:4,compat:1,index:0,bdc:1,to_commit:[4,5],jboss:5,bytesread:4,can:[1,2,4,5,7,8,10],mount_boot_part_over_root:4,make_:1,rglob:4,becom:7,sinc:[5,7,1],convert:[4,5,7,10],glusterf:5,chang:[1,4,5,7,8,10],list_branch_fil:5,fstab:7,appli:[4,5],app:[4,7],api:[9,1,3,4,5,10],is_commit_tag:5,pxe:[4,7],from:[1,2,4,5,6,7,8,9,10],armhfp:4,commun:[10,1,9],upgrad:4,next:4,few:[7,8],usr:[4,5,7,8,2],remaind:5,sort:5,repo_to_k:5,about:[4,5,7,10],schema_vers:5,"23t00":5,pkgglob:4,actual:4,execwithcaptur:4,conf_fil:[4,5],chdir:4,retriev:5,alia:5,callback_func:4,control:[4,6,1],"0x7f28ecf6e150":[],quickstart:[7,1,8],tar:[5,7,1,10],process:[1,2,4,5,6,7,8,10],lock:5,sudo:7,tag:[4,5,8,10],recipefileerror:5,generate_module_info:4,scriptlet:4,qcow2:[4,7],brian:[7,1,8],sig:5,subdirectori:5,instead:[1,4,5,7,8,10],frac:4,get_iso_label:4,stop:[4,7],physic:4,light:8,installpkg:[4,8,2],correspond:4,move:[4,5,1,8],ts_current:4,comma:[4,5,10],bunch:4,ext4:8,chosen:[4,5,7],nevra:[5,10],srcdir:4,exract:5,python:[4,6,8],removepkg:[4,8],devel:[5,7],mention:4,perror:4,destfil:4,anyth:2,mode:[4,5,7,8],addrsiz:4,subset:5,doupgrad:4,bump:5,"45e380f39894":5,ec2:7,mountpoint:[4,7],patch:5,special:[5,8],out:[4,5,6,1],variabl:[4,7,8],logmonitor:[4,3],make_appli:4,mount_dir:4,spline:4,rel:4,add2636e7459:5,dhcp:7,ref:5,cwd:[4,9],shut:4,get_url_json:9,init_file_log:4,insid:[4,7,8],workflow:6,undo:[4,5,10],powerpc:4,dictionari:5,inroot:4,releas:[4,5,6,7,8,10],indent:10,could:[4,7,1],keep:[4,7],cee5f4c20fc33ea4d54bfecf56f4ad41ad15f4f3:5,enforc:[5,7],outsid:4,softwar:5,suffix:4,echo:4,run_pkg_transact:[4,8],diff_item:5,owner:1,removefrom:[4,8],ancient:5,work_dir:4,unknown:4,licens:5,mkdir:[4,8],results_dir:[4,5],messag:[4,5,1],attach:4,"final":[1,2,4,5,6,7,8],shell:4,tag_recipe_commit:5,create_pxe_config:4,exactli:5,haven:7,charact:4,ybo:4,f16:7,f15:7,read_recipe_commit:5,recipes_chang:10,rebuild_initrd:4,have:[1,4,5,7,8,10],tabl:0,need:[1,4,5,7,8,10],xattr:4,open_or_create_repo:5,rout:[4,5,1,9],mix:6,generate_module_data:4,"03397f8d":5,which:[2,4,5,6,7,8,10],read_recipe_and_id:5,singl:7,deploy:4,pyo:4,"class":[4,5,9,2],"11t01":5,"11t00":5,url:[5,7,1,9],request:[4,5,1,9],pipe:4,uefi:7,projects_cmd:10,chown_:4,text:[5,8],redirect:4,locat:[7,8],execwithcallback:4,should:[4,5,7,1],initramf:[4,5,7,8],local:[4,5,7],meant:5,te_curr:4,te_tot:4,templatefil:4,testmod:10,enabl:[4,5],old_item:5,stuff:4,partit:[4,7,1],dracut_hooks_path:4,project_nam:[4,5],knowledg:6,"10t23":5,outroot:4,xxxxx:7,statu:[4,5,1,10],correctli:[5,7],gconfset:[4,8],pattern:4,state:4,"745712b2":5,progress:[4,10,9],neither:5,e083921a7ed1cf2eec91ad12b9ad1e70ef3470b:5,kei:4,addit:[8,10],start_queue_monitor:5,modules_info:5,configpars:5,etc:[4,5,7],instanc:5,b36e:5,argumentpars:[4,5],chmod:[4,8],linktre:4,rpm:[4,5,6],syslinux:7,prettydiffentri:10,yap:5,compon:7,json:[10,5,1,9],unixhttpconnect:9,"06e8":5,calledprocesserror:4,crossdomain:[4,5,3],execwithredirect:4,present:6,multi:7,plain:5,defin:[5,1],img_mount:4,from_commit:[4,5],volid:4,observ:7,argv:4,almost:6,virt:[4,5,7],site:7,createaddrs:4,archiv:[4,5,2],incom:4,revis:5,unneed:[4,5,6,1,8],recipes_delet:10,commit_recipe_directori:5,welcom:[0,7],cross:5,recipe_from_dict:5,handl:[4,7,1,10,8],workdir:4,workspace_writ:5,expans:4,libvirt:[4,7],logfil:[4,5,7],expand:4,audit:5,off:1,builder:[5,7],mkfsimag:4,well:[4,5,7,1,8],loraxtempl:4,exampl:[1,2,4,5,7,10],command:[1,2,4,6,7,8,10],filesystem:[4,5,7,8,2],usual:7,newest:[5,10],less:5,recipemodul:5,"13z":5,log_path:4,add:[1,2,4,5,7,8,10],valid:5,attach_to_al:5,match:[4,5],estimate_s:4,nvr:8,is_image_mount:4,dest:4,round_to_block:4,show_json:10,five:10,disk_img:4,recurs:4,like:[1,2,4,5,7,8],success:5,"28z":5,boot_dir:4,lose:7,recipe_diff:5,page:0,drop:[1,2],recipes_depsolv:10,captur:4,recipes_show:10,yumlock:5,recipe_str:5,commit_recipe_fil:5,librari:6,tmp:[4,5,7],lead:4,isolinux:4,leav:[5,1],usag:4,symlink:[4,5,8],host:[4,5,7],make_imag:4,lorax:[0,1,2,4,5,6,7,8],offset:[4,5],loraxtransactioncallback:4,stage:[6,7],sbin:[4,7],recipeerror:5,rare:4,socket:[10,1,9],toml:[10,5,1,9],constructor:5,committimevalerror:5,ltmpl:[4,3,8],disabl:[4,7,8],"56z":5,own:[5,7,1,8],add_arch_templ:4,automat:4,"4b70":5,checksum_typ:7,new_item:5,mkdiskfsimag:4,recipes_workspac:10,"var":[4,7,1],"function":[4,5,1,10],baseurl:5,old_vers:5,bug:7,count:5,succe:5,whether:5,queue_statu:5,displai:10,do_graft:4,projects_depsolv:5,below:[5,7],limit:[4,5,7],otherwis:[4,5],problem:[4,5,6,7],"int":[4,5,10],mask:4,dure:10,baserequesthandl:4,pid:7,bzip2:4,callback_arg:4,quot:4,boot:[1,2,4,5,6,7,8],detail:[5,10],virtual:[4,7],other:[4,5,6,7,1],bool:[5,10],usbutil:4,branch:[5,1],"47z":5,installtre:4,get_kernel:4,"1kb":10,mkcpio:4,bcl:[7,1,8],rootfs_imag:4,reliabl:7,tomlerror:5,compose_delet:10,delete_recip:5},objtypes:{"0":"py:module","1":"py:function","2":"py:method","3":"py:attribute","4":"py:class","5":"py:exception"},titles:["Welcome to Lorax’s documentation!","lorax-composer","Product and Updates Images","src","pylorax Package","api Package","Introduction to Lorax","livemedia-creator","Lorax","composer Package","cli Package"],objnames:{"0":["py","module","Python module"],"1":["py","function","Python function"],"2":["py","method","Python method"],"3":["py","attribute","Python attribute"],"4":["py","class","Python class"],"5":["py","exception","Python exception"]},filenames:["index","lorax-composer","product-images","modules","pylorax","pylorax.api","intro","livemedia-creator","lorax","composer","composer.cli"]}) \ No newline at end of file