Update composer-cli to use blueprint instead of recipe
This commit is contained in:
		
							parent
							
								
									f0d29be521
								
							
						
					
					
						commit
						5efeb05aa7
					
				| @ -31,7 +31,7 @@ VERSION = "{0}-{1}".format(os.path.basename(sys.argv[0]), vernum) | ||||
| 
 | ||||
| # Documentation for the commands | ||||
| epilog = """ | ||||
| compose start <recipe> <type>    Start a compose using the selected recipe and output type. | ||||
| compose start <blueprint> <type>    Start a compose using the selected blueprint and output type. | ||||
|         types                       List the supported output types. | ||||
|         status                      List the status of all running and finished composes. | ||||
|         log <uuid> [<size>kB]       Show the last 1kB of the compose log. | ||||
| @ -42,22 +42,22 @@ compose start <recipe> <type>    Start a compose using the selected recipe and o | ||||
|         logs <uuid>                 Download the compose logs to <uuid>-logs.tar | ||||
|         results <uuid>              Download all of the compose results; metadata, logs, and image to <uuid>.tar | ||||
|         image <uuid>                Download the output image from the compose. Filename depends on the type. | ||||
| recipes list                     List the names of the available recipes. | ||||
|         show <recipe,...>        Display the recipe in TOML format. | ||||
|         changes <recipe,...>     Display the changes for each recipe. | ||||
|         diff <recipe-name>       Display the differences between 2 versions of a recipe. | ||||
| blueprints list                     List the names of the available blueprints. | ||||
|         show <blueprint,...>        Display the blueprint in TOML format. | ||||
|         changes <blueprint,...>     Display the changes for each blueprint. | ||||
|         diff <blueprint-name>       Display the differences between 2 versions of a blueprint. | ||||
|              <from-commit>          Commit hash or NEWEST | ||||
|              <to-commit>            Commit hash, NEWEST, or WORKSPACE | ||||
|         save <recipe,...>        Save the recipe to a file, <recipe-name>.toml | ||||
|         delete <recipe>          Delete a recipe from the server | ||||
|         depsolve <recipe,...>    Display the packages needed to install the recipe. | ||||
|         push <recipe>            Push a recipe TOML file to the server. | ||||
|         freeze <recipe,...>      Display the frozen recipe's modules and packages. | ||||
|         freeze show <recipe,...> Display the frozen recipe in TOML format. | ||||
|         freeze save <recipe,...> Save the frozen recipe to a file, <recipe-name>.frozen.toml. | ||||
|         tag <recipe>             Tag the most recent recipe commit as a release. | ||||
|         undo <recipe> <commit>   Undo changes to a recipe by reverting to the selected commit. | ||||
|         workspace <recipe>       Push the recipe TOML to the temporary workspace storage. | ||||
|         save <blueprint,...>        Save the blueprint to a file, <blueprint-name>.toml | ||||
|         delete <blueprint>          Delete a blueprint from the server | ||||
|         depsolve <blueprint,...>    Display the packages needed to install the blueprint. | ||||
|         push <blueprint>            Push a blueprint TOML file to the server. | ||||
|         freeze <blueprint,...>      Display the frozen blueprint's modules and packages. | ||||
|         freeze show <blueprint,...> Display the frozen blueprint in TOML format. | ||||
|         freeze save <blueprint,...> Save the frozen blueprint to a file, <blueprint-name>.frozen.toml. | ||||
|         tag <blueprint>             Tag the most recent blueprint commit as a release. | ||||
|         undo <blueprint> <commit>   Undo changes to a blueprint by reverting to the selected commit. | ||||
|         workspace <blueprint>       Push the blueprint TOML to the temporary workspace storage. | ||||
| modules list                        List the available modules. | ||||
| projects list                       List the available projects. | ||||
| projects info <project,...>         Show details about the listed projects. | ||||
|  | ||||
| @ -20,13 +20,13 @@ | ||||
| import logging | ||||
| log = logging.getLogger("composer-cli") | ||||
| 
 | ||||
| from composer.cli.recipes import recipes_cmd | ||||
| from composer.cli.blueprints import blueprints_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, | ||||
|     "blueprints": blueprints_cmd, | ||||
|     "modules": modules_cmd, | ||||
|     "projects": projects_cmd, | ||||
|     "compose": compose_cmd | ||||
|  | ||||
| @ -24,38 +24,38 @@ 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 | ||||
| 
 | ||||
| def recipes_cmd(opts): | ||||
|     """Process recipes commands | ||||
| def blueprints_cmd(opts): | ||||
|     """Process blueprints 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 | ||||
|     This dispatches the blueprints 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 | ||||
|         "list":      blueprints_list, | ||||
|         "show":      blueprints_show, | ||||
|         "changes":   blueprints_changes, | ||||
|         "diff":      blueprints_diff, | ||||
|         "save":      blueprints_save, | ||||
|         "delete":    blueprints_delete, | ||||
|         "depsolve":  blueprints_depsolve, | ||||
|         "push":      blueprints_push, | ||||
|         "freeze":    blueprints_freeze, | ||||
|         "tag":       blueprints_tag, | ||||
|         "undo":      blueprints_undo, | ||||
|         "workspace": blueprints_workspace | ||||
|         } | ||||
|     if opts.args[1] not in cmd_map: | ||||
|         log.error("Unknown recipes command: %s", opts.args[1]) | ||||
|         log.error("Unknown blueprints command: %s", opts.args[1]) | ||||
|         return 1 | ||||
| 
 | ||||
|     return cmd_map[opts.args[1]](opts.socket, opts.api_version, opts.args[2:], opts.json) | ||||
| 
 | ||||
| def recipes_list(socket_path, api_version, args, show_json=False): | ||||
|     """Output the list of available recipes | ||||
| def blueprints_list(socket_path, api_version, args, show_json=False): | ||||
|     """Output the list of available blueprints | ||||
| 
 | ||||
|     :param socket_path: Path to the Unix socket to use for API communication | ||||
|     :type socket_path: str | ||||
| @ -66,20 +66,20 @@ def recipes_list(socket_path, api_version, args, show_json=False): | ||||
|     :param show_json: Set to True to show the JSON output instead of the human readable output | ||||
|     :type show_json: bool | ||||
| 
 | ||||
|     recipes list | ||||
|     blueprints list | ||||
|     """ | ||||
|     api_route = client.api_url(api_version, "/recipes/list") | ||||
|     api_route = client.api_url(api_version, "/blueprints/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"]])) | ||||
|     print("blueprints: " + ", ".join([r for r in result["blueprints"]])) | ||||
| 
 | ||||
|     return 0 | ||||
| 
 | ||||
| def recipes_show(socket_path, api_version, args, show_json=False): | ||||
|     """Show the recipes, in TOML format | ||||
| def blueprints_show(socket_path, api_version, args, show_json=False): | ||||
|     """Show the blueprints, in TOML format | ||||
| 
 | ||||
|     :param socket_path: Path to the Unix socket to use for API communication | ||||
|     :type socket_path: str | ||||
| @ -90,18 +90,18 @@ def recipes_show(socket_path, api_version, args, show_json=False): | ||||
|     :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. | ||||
|     blueprints show <blueprint,...>        Display the blueprint in TOML format. | ||||
| 
 | ||||
|     Multiple recipes will be separated by \n\n | ||||
|     Multiple blueprints will be separated by \n\n | ||||
|     """ | ||||
|     for recipe in argify(args): | ||||
|         api_route = client.api_url(api_version, "/recipes/info/%s?format=toml" % recipe) | ||||
|     for blueprint in argify(args): | ||||
|         api_route = client.api_url(api_version, "/blueprints/info/%s?format=toml" % blueprint) | ||||
|         print(client.get_url_raw(socket_path, api_route) + "\n\n") | ||||
| 
 | ||||
|     return 0 | ||||
| 
 | ||||
| def recipes_changes(socket_path, api_version, args, show_json=False): | ||||
|     """Display the changes for each of the recipes | ||||
| def blueprints_changes(socket_path, api_version, args, show_json=False): | ||||
|     """Display the changes for each of the blueprints | ||||
| 
 | ||||
|     :param socket_path: Path to the Unix socket to use for API communication | ||||
|     :type socket_path: str | ||||
| @ -112,25 +112,25 @@ def recipes_changes(socket_path, api_version, args, show_json=False): | ||||
|     :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. | ||||
|     blueprints changes <blueprint,...>     Display the changes for each blueprint. | ||||
|     """ | ||||
|     api_route = client.api_url(api_version, "/recipes/changes/%s" % (",".join(argify(args)))) | ||||
|     api_route = client.api_url(api_version, "/blueprints/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"]: | ||||
|     for blueprint in result["blueprints"]: | ||||
|         print(blueprint["name"]) | ||||
|         for change in blueprint["changes"]: | ||||
|             prettyCommitDetails(change) | ||||
| 
 | ||||
|     return 0 | ||||
| 
 | ||||
| def prettyCommitDetails(change, indent=4): | ||||
|     """Print the recipe's change in a nice way | ||||
|     """Print the blueprint's change in a nice way | ||||
| 
 | ||||
|     :param change: The individual recipe change dict | ||||
|     :param change: The individual blueprint change dict | ||||
|     :type change: dict | ||||
|     :param indent: Number of spaces to indent | ||||
|     :type indent: int | ||||
| @ -144,8 +144,8 @@ def prettyCommitDetails(change, indent=4): | ||||
|     print " " * indent + change["timestamp"] + "  " + change["commit"] + revision() | ||||
|     print " " * indent + change["message"] + "\n" | ||||
| 
 | ||||
| def recipes_diff(socket_path, api_version, args, show_json=False): | ||||
|     """Display the differences between 2 versions of a recipe | ||||
| def blueprints_diff(socket_path, api_version, args, show_json=False): | ||||
|     """Display the differences between 2 versions of a blueprint | ||||
| 
 | ||||
|     :param socket_path: Path to the Unix socket to use for API communication | ||||
|     :type socket_path: str | ||||
| @ -156,21 +156,21 @@ def recipes_diff(socket_path, api_version, args, show_json=False): | ||||
|     :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. | ||||
|     blueprints diff <blueprint-name>       Display the differences between 2 versions of a blueprint. | ||||
|                  <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") | ||||
|         log.error("blueprints diff is missing the blueprint 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") | ||||
|         log.error("blueprints 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") | ||||
|         log.error("blueprints 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])) | ||||
|     api_route = client.api_url(api_version, "/blueprints/diff/%s/%s/%s" % (args[0], args[1], args[2])) | ||||
|     result = client.get_url_json(socket_path, api_route) | ||||
| 
 | ||||
|     if show_json: | ||||
| @ -235,8 +235,8 @@ def prettyDiffEntry(diff): | ||||
| 
 | ||||
|     return change(diff) + " " + name(diff) + " " + details(diff) | ||||
| 
 | ||||
| def recipes_save(socket_path, api_version, args, show_json=False): | ||||
|     """Save the recipe to a TOML file | ||||
| def blueprints_save(socket_path, api_version, args, show_json=False): | ||||
|     """Save the blueprint to a TOML file | ||||
| 
 | ||||
|     :param socket_path: Path to the Unix socket to use for API communication | ||||
|     :type socket_path: str | ||||
| @ -247,17 +247,17 @@ def recipes_save(socket_path, api_version, args, show_json=False): | ||||
|     :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 | ||||
|     blueprints save <blueprint,...>        Save the blueprint to a file, <blueprint-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) | ||||
|     for blueprint in argify(args): | ||||
|         api_route = client.api_url(api_version, "/blueprints/info/%s?format=toml" % blueprint) | ||||
|         blueprint_toml = client.get_url_raw(socket_path, api_route) | ||||
|         open(toml_filename(blueprint), "w").write(blueprint_toml) | ||||
| 
 | ||||
|     return 0 | ||||
| 
 | ||||
| def recipes_delete(socket_path, api_version, args, show_json=False): | ||||
|     """Delete a recipe from the server | ||||
| def blueprints_delete(socket_path, api_version, args, show_json=False): | ||||
|     """Delete a blueprint from the server | ||||
| 
 | ||||
|     :param socket_path: Path to the Unix socket to use for API communication | ||||
|     :type socket_path: str | ||||
| @ -268,15 +268,15 @@ def recipes_delete(socket_path, api_version, args, show_json=False): | ||||
|     :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 | ||||
|     delete <blueprint>          Delete a blueprint from the server | ||||
|     """ | ||||
|     api_route = client.api_url(api_version, "/recipes/delete/%s" % args[0]) | ||||
|     api_route = client.api_url(api_version, "/blueprints/delete/%s" % args[0]) | ||||
|     result = client.delete_url_json(socket_path, api_route) | ||||
| 
 | ||||
|     return handle_api_result(result, show_json) | ||||
| 
 | ||||
| def recipes_depsolve(socket_path, api_version, args, show_json=False): | ||||
|     """Display the packages needed to install the recipe | ||||
| def blueprints_depsolve(socket_path, api_version, args, show_json=False): | ||||
|     """Display the packages needed to install the blueprint | ||||
| 
 | ||||
|     :param socket_path: Path to the Unix socket to use for API communication | ||||
|     :type socket_path: str | ||||
| @ -287,27 +287,27 @@ def recipes_depsolve(socket_path, api_version, args, show_json=False): | ||||
|     :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. | ||||
|     blueprints depsolve <blueprint,...>    Display the packages needed to install the blueprint. | ||||
|     """ | ||||
|     api_route = client.api_url(api_version, "/recipes/depsolve/%s" % (",".join(argify(args)))) | ||||
|     api_route = client.api_url(api_version, "/blueprints/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"])) | ||||
|     for blueprint in result["blueprints"]: | ||||
|         if blueprint["blueprint"].get("version", ""): | ||||
|             print("blueprint: %s v%s" % (blueprint["blueprint"]["name"], blueprint["blueprint"]["version"])) | ||||
|         else: | ||||
|             print("Recipe: %s" % (recipe["recipe"]["name"])) | ||||
|         for dep in recipe["dependencies"]: | ||||
|             print("blueprint: %s" % (blueprint["blueprint"]["name"])) | ||||
|         for dep in blueprint["dependencies"]: | ||||
|             print("    " + packageNEVRA(dep)) | ||||
| 
 | ||||
|     return 0 | ||||
| 
 | ||||
| def recipes_push(socket_path, api_version, args, show_json=False): | ||||
|     """Push a recipe TOML file to the server, updating the recipe | ||||
| def blueprints_push(socket_path, api_version, args, show_json=False): | ||||
|     """Push a blueprint TOML file to the server, updating the blueprint | ||||
| 
 | ||||
|     :param socket_path: Path to the Unix socket to use for API communication | ||||
|     :type socket_path: str | ||||
| @ -318,24 +318,24 @@ def recipes_push(socket_path, api_version, args, show_json=False): | ||||
|     :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. | ||||
|     push <blueprint>            Push a blueprint TOML file to the server. | ||||
|     """ | ||||
|     api_route = client.api_url(api_version, "/recipes/new") | ||||
|     api_route = client.api_url(api_version, "/blueprints/new") | ||||
|     rval = 0 | ||||
|     for recipe in argify(args): | ||||
|         if not os.path.exists(recipe): | ||||
|             log.error("Missing recipe file: %s", recipe) | ||||
|     for blueprint in argify(args): | ||||
|         if not os.path.exists(blueprint): | ||||
|             log.error("Missing blueprint file: %s", blueprint) | ||||
|             continue | ||||
|         recipe_toml = open(recipe, "r").read() | ||||
|         blueprint_toml = open(blueprint, "r").read() | ||||
| 
 | ||||
|         result = client.post_url_toml(socket_path, api_route, recipe_toml) | ||||
|         result = client.post_url_toml(socket_path, api_route, blueprint_toml) | ||||
|         if handle_api_result(result, show_json): | ||||
|             rval = 1 | ||||
| 
 | ||||
|     return rval | ||||
| 
 | ||||
| def recipes_freeze(socket_path, api_version, args, show_json=False): | ||||
|     """Handle the recipes freeze commands | ||||
| def blueprints_freeze(socket_path, api_version, args, show_json=False): | ||||
|     """Handle the blueprints freeze commands | ||||
| 
 | ||||
|     :param socket_path: Path to the Unix socket to use for API communication | ||||
|     :type socket_path: str | ||||
| @ -346,41 +346,41 @@ def recipes_freeze(socket_path, api_version, args, show_json=False): | ||||
|     :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. | ||||
|     blueprints freeze <blueprint,...>      Display the frozen blueprint's modules and packages. | ||||
|     blueprints freeze show <blueprint,...> Display the frozen blueprint in TOML format. | ||||
|     blueprints freeze save <blueprint,...> Save the frozen blueprint to a file, <blueprint-name>.frozen.toml. | ||||
|     """ | ||||
|     if args[0] == "show": | ||||
|         return recipes_freeze_show(socket_path, api_version, args[1:], show_json) | ||||
|         return blueprints_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) | ||||
|         return blueprints_freeze_save(socket_path, api_version, args[1:], show_json) | ||||
| 
 | ||||
|     if len(args) == 0: | ||||
|         log.error("freeze is missing the recipe name") | ||||
|         log.error("freeze is missing the blueprint name") | ||||
|         return 1 | ||||
| 
 | ||||
|     api_route = client.api_url(api_version, "/recipes/freeze/%s" % (",".join(argify(args)))) | ||||
|     api_route = client.api_url(api_version, "/blueprints/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"])) | ||||
|         for entry in result["blueprints"]: | ||||
|             blueprint = entry["blueprint"] | ||||
|             if blueprint.get("version", ""): | ||||
|                 print("blueprint: %s v%s" % (blueprint["name"], blueprint["version"])) | ||||
|             else: | ||||
|                 print("Recipe: %s" % (recipe["name"])) | ||||
|                 print("blueprint: %s" % (blueprint["name"])) | ||||
| 
 | ||||
|             for m in recipe["modules"]: | ||||
|             for m in blueprint["modules"]: | ||||
|                 print("    %s-%s" % (m["name"], m["version"])) | ||||
| 
 | ||||
|             for p in recipe["packages"]: | ||||
|             for p in blueprint["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"]) | ||||
|             log.error("%s: %s", err["blueprint"], err["msg"]) | ||||
| 
 | ||||
|     # Return a 1 if there are any errors | ||||
|     if result.get("errors", []): | ||||
| @ -388,8 +388,8 @@ def recipes_freeze(socket_path, api_version, args, show_json=False): | ||||
|     else: | ||||
|         return 0 | ||||
| 
 | ||||
| def recipes_freeze_show(socket_path, api_version, args, show_json=False): | ||||
|     """Show the frozen recipe in TOML format | ||||
| def blueprints_freeze_show(socket_path, api_version, args, show_json=False): | ||||
|     """Show the frozen blueprint in TOML format | ||||
| 
 | ||||
|     :param socket_path: Path to the Unix socket to use for API communication | ||||
|     :type socket_path: str | ||||
| @ -400,20 +400,20 @@ def recipes_freeze_show(socket_path, api_version, args, show_json=False): | ||||
|     :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. | ||||
|     blueprints freeze show <blueprint,...> Display the frozen blueprint in TOML format. | ||||
|     """ | ||||
|     if len(args) == 0: | ||||
|         log.error("freeze show is missing the recipe name") | ||||
|         log.error("freeze show is missing the blueprint name") | ||||
|         return 1 | ||||
| 
 | ||||
|     for recipe in argify(args): | ||||
|         api_route = client.api_url(api_version, "/recipes/freeze/%s?format=toml" % recipe) | ||||
|     for blueprint in argify(args): | ||||
|         api_route = client.api_url(api_version, "/blueprints/freeze/%s?format=toml" % blueprint) | ||||
|         print(client.get_url_raw(socket_path, api_route)) | ||||
| 
 | ||||
|     return 0 | ||||
| 
 | ||||
| def recipes_freeze_save(socket_path, api_version, args, show_json=False): | ||||
|     """Save the frozen recipe to a TOML file | ||||
| def blueprints_freeze_save(socket_path, api_version, args, show_json=False): | ||||
|     """Save the frozen blueprint to a TOML file | ||||
| 
 | ||||
|     :param socket_path: Path to the Unix socket to use for API communication | ||||
|     :type socket_path: str | ||||
| @ -424,21 +424,21 @@ def recipes_freeze_save(socket_path, api_version, args, show_json=False): | ||||
|     :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. | ||||
|     blueprints freeze save <blueprint,...> Save the frozen blueprint to a file, <blueprint-name>.frozen.toml. | ||||
|     """ | ||||
|     if len(args) == 0: | ||||
|         log.error("freeze save is missing the recipe name") | ||||
|         log.error("freeze save is missing the blueprint 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) | ||||
|     for blueprint in argify(args): | ||||
|         api_route = client.api_url(api_version, "/blueprints/freeze/%s?format=toml" % blueprint) | ||||
|         blueprint_toml = client.get_url_raw(socket_path, api_route) | ||||
|         open(frozen_toml_filename(blueprint), "w").write(blueprint_toml) | ||||
| 
 | ||||
|     return 0 | ||||
| 
 | ||||
| def recipes_tag(socket_path, api_version, args, show_json=False): | ||||
|     """Tag the most recent recipe commit as a release | ||||
| def blueprints_tag(socket_path, api_version, args, show_json=False): | ||||
|     """Tag the most recent blueprint commit as a release | ||||
| 
 | ||||
|     :param socket_path: Path to the Unix socket to use for API communication | ||||
|     :type socket_path: str | ||||
| @ -449,15 +449,15 @@ def recipes_tag(socket_path, api_version, args, show_json=False): | ||||
|     :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. | ||||
|     blueprints tag <blueprint>             Tag the most recent blueprint commit as a release. | ||||
|     """ | ||||
|     api_route = client.api_url(api_version, "/recipes/tag/%s" % args[0]) | ||||
|     api_route = client.api_url(api_version, "/blueprints/tag/%s" % args[0]) | ||||
|     result = client.post_url(socket_path, api_route, "") | ||||
| 
 | ||||
|     return handle_api_result(result, show_json) | ||||
| 
 | ||||
| def recipes_undo(socket_path, api_version, args, show_json=False): | ||||
|     """Undo changes to a recipe | ||||
| def blueprints_undo(socket_path, api_version, args, show_json=False): | ||||
|     """Undo changes to a blueprint | ||||
| 
 | ||||
|     :param socket_path: Path to the Unix socket to use for API communication | ||||
|     :type socket_path: str | ||||
| @ -468,22 +468,22 @@ def recipes_undo(socket_path, api_version, args, show_json=False): | ||||
|     :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. | ||||
|     blueprints undo <blueprint> <commit>   Undo changes to a blueprint by reverting to the selected commit. | ||||
|     """ | ||||
|     if len(args) == 0: | ||||
|         log.error("undo is missing the recipe name and commit hash") | ||||
|         log.error("undo is missing the blueprint 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])) | ||||
|     api_route = client.api_url(api_version, "/blueprints/undo/%s/%s" % (args[0], args[1])) | ||||
|     result = client.post_url(socket_path, api_route, "") | ||||
| 
 | ||||
|     return handle_api_result(result, show_json) | ||||
| 
 | ||||
| def recipes_workspace(socket_path, api_version, args, show_json=False): | ||||
|     """Push the recipe TOML to the temporary workspace storage | ||||
| def blueprints_workspace(socket_path, api_version, args, show_json=False): | ||||
|     """Push the blueprint TOML to the temporary workspace storage | ||||
| 
 | ||||
|     :param socket_path: Path to the Unix socket to use for API communication | ||||
|     :type socket_path: str | ||||
| @ -494,17 +494,17 @@ def recipes_workspace(socket_path, api_version, args, show_json=False): | ||||
|     :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. | ||||
|     blueprints workspace <blueprint>       Push the blueprint TOML to the temporary workspace storage. | ||||
|     """ | ||||
|     api_route = client.api_url(api_version, "/recipes/workspace") | ||||
|     api_route = client.api_url(api_version, "/blueprints/workspace") | ||||
|     rval = 0 | ||||
|     for recipe in argify(args): | ||||
|         if not os.path.exists(recipe): | ||||
|             log.error("Missing recipe file: %s", recipe) | ||||
|     for blueprint in argify(args): | ||||
|         if not os.path.exists(blueprint): | ||||
|             log.error("Missing blueprint file: %s", blueprint) | ||||
|             continue | ||||
|         recipe_toml = open(recipe, "r").read() | ||||
|         blueprint_toml = open(blueprint, "r").read() | ||||
| 
 | ||||
|         result = client.post_url_toml(socket_path, api_route, recipe_toml) | ||||
|         result = client.post_url_toml(socket_path, api_route, blueprint_toml) | ||||
|         if show_json: | ||||
|             print(json.dumps(result, indent=4)) | ||||
|         elif result.get("error", False): | ||||
| @ -71,7 +71,7 @@ def compose_status(socket_path, api_version, args, show_json=False, testmode=0): | ||||
|     """ | ||||
|     def get_status(compose): | ||||
|         return {"id": compose["id"], | ||||
|                 "recipe": compose["recipe"], | ||||
|                 "blueprint": compose["blueprint"], | ||||
|                 "version": compose["version"], | ||||
|                 "compose_type": compose["compose_type"], | ||||
|                 "image_size": compose["image_size"], | ||||
| @ -80,7 +80,7 @@ def compose_status(socket_path, api_version, args, show_json=False, testmode=0): | ||||
|     # 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"], a["compose_type"]) | ||||
|         return (order.index(a["status"]), a["blueprint"], a["version"], a["compose_type"]) | ||||
| 
 | ||||
|     status = [] | ||||
| 
 | ||||
| @ -106,14 +106,14 @@ def compose_status(socket_path, api_version, args, show_json=False, testmode=0): | ||||
|         print(json.dumps(status, indent=4)) | ||||
|         return 0 | ||||
| 
 | ||||
|     # Print them as UUID RECIPE STATUS | ||||
|     # Print them as UUID blueprint STATUS | ||||
|     for c in status: | ||||
|         if c["image_size"] > 0: | ||||
|             image_size = str(c["image_size"]) | ||||
|         else: | ||||
|             image_size = "" | ||||
| 
 | ||||
|         print("%s %-8s %-15s %s %-16s %s" % (c["id"], c["status"], c["recipe"], c["version"], c["compose_type"], | ||||
|         print("%s %-8s %-15s %s %-16s %s" % (c["id"], c["status"], c["blueprint"], c["version"], c["compose_type"], | ||||
|                                              image_size)) | ||||
| 
 | ||||
| 
 | ||||
| @ -143,7 +143,7 @@ def compose_types(socket_path, api_version, args, show_json=False, testmode=0): | ||||
|     print("Compose Types: " + ", ".join([t["name"] for t in result["types"]])) | ||||
| 
 | ||||
| def compose_start(socket_path, api_version, args, show_json=False, testmode=0): | ||||
|     """Start a new compose using the selected recipe and type | ||||
|     """Start a new compose using the selected blueprint and type | ||||
| 
 | ||||
|     :param socket_path: Path to the Unix socket to use for API communication | ||||
|     :type socket_path: str | ||||
| @ -156,17 +156,17 @@ def compose_start(socket_path, api_version, args, show_json=False, testmode=0): | ||||
|     :param testmode: Set to 1 to simulate a failed compose, set to 2 to simulate a finished one. | ||||
|     :type testmode: int | ||||
| 
 | ||||
|     compose start <recipe-name> <compose-type> | ||||
|     compose start <blueprint-name> <compose-type> | ||||
|     """ | ||||
|     if len(args) == 0: | ||||
|         log.error("start is missing the recipe name and output type") | ||||
|         log.error("start is missing the blueprint 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], | ||||
|         "blueprint_name": args[0], | ||||
|         "compose_type": args[1], | ||||
|         "branch": "master" | ||||
|         } | ||||
| @ -313,7 +313,7 @@ def compose_details(socket_path, api_version, args, show_json=False, testmode=0) | ||||
| 
 | ||||
|     compose details <uuid> | ||||
| 
 | ||||
|     This returns information about the compose, including the recipe and the dependencies. | ||||
|     This returns information about the compose, including the blueprint and the dependencies. | ||||
|     """ | ||||
|     if len(args) == 0: | ||||
|         log.error("details is missing the compose build id") | ||||
| @ -336,16 +336,16 @@ def compose_details(socket_path, api_version, args, show_json=False, testmode=0) | ||||
| 
 | ||||
|     print("%s %-8s %-15s %s %-16s %s" % (result["id"], | ||||
|                                          result["queue_status"], | ||||
|                                          result["recipe"]["name"], | ||||
|                                          result["recipe"]["version"], | ||||
|                                          result["blueprint"]["name"], | ||||
|                                          result["blueprint"]["version"], | ||||
|                                          result["compose_type"], | ||||
|                                          image_size)) | ||||
|     print("Recipe Packages:") | ||||
|     for p in result["recipe"]["packages"]: | ||||
|     print("Packages:") | ||||
|     for p in result["blueprint"]["packages"]: | ||||
|         print("    %s-%s" % (p["name"], p["version"])) | ||||
| 
 | ||||
|     print("Recipe Modules:") | ||||
|     for m in result["recipe"]["modules"]: | ||||
|     print("Modules:") | ||||
|     for m in result["blueprint"]["modules"]: | ||||
|         print("    %s-%s" % (m["name"], m["version"])) | ||||
| 
 | ||||
|     print("Dependencies:") | ||||
|  | ||||
| @ -33,25 +33,25 @@ def argify(args): | ||||
|     """ | ||||
|     return filter(lambda i: i, [arg for entry in args for arg in entry.split(",")]) | ||||
| 
 | ||||
| def toml_filename(recipe_name): | ||||
|     """Convert a recipe name into a filename.toml | ||||
| def toml_filename(blueprint_name): | ||||
|     """Convert a blueprint 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 | ||||
|     :param blueprint_name: The blueprint's name | ||||
|     :type blueprint_name: str | ||||
|     :returns: The blueprint name with ' ' converted to - and .toml appended | ||||
|     :rtype: str | ||||
|     """ | ||||
|     return recipe_name.replace(" ", "-") + ".toml" | ||||
|     return blueprint_name.replace(" ", "-") + ".toml" | ||||
| 
 | ||||
| def frozen_toml_filename(recipe_name): | ||||
|     """Convert a recipe name into a filename.toml | ||||
| def frozen_toml_filename(blueprint_name): | ||||
|     """Convert a blueprint 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 | ||||
|     :param blueprint_name: The blueprint's name | ||||
|     :type blueprint_name: str | ||||
|     :returns: The blueprint name with ' ' converted to - and .toml appended | ||||
|     :rtype: str | ||||
|     """ | ||||
|     return recipe_name.replace(" ", "-") + ".frozen.toml" | ||||
|     return blueprint_name.replace(" ", "-") + ".frozen.toml" | ||||
| 
 | ||||
| def handle_api_result(result, show_json=False): | ||||
|     """Log any errors, return the correct value | ||||
|  | ||||
| @ -100,7 +100,7 @@ def post_url(socket_path, url, body): | ||||
|     return json.loads(r.data.decode("utf-8")) | ||||
| 
 | ||||
| def post_url_toml(socket_path, url, body): | ||||
|     """POST a TOML recipe to the URL | ||||
|     """POST a TOML string to the URL | ||||
| 
 | ||||
|     :param socket_path: Path to the Unix socket to use for API communication | ||||
|     :type socket_path: str | ||||
|  | ||||
| @ -59,8 +59,3 @@ class UnixHTTPConnectionPool(urllib3.connectionpool.HTTPConnectionPool): | ||||
| 
 | ||||
|     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) | ||||
|  | ||||
| @ -16,7 +16,7 @@ | ||||
| # | ||||
| import unittest | ||||
| 
 | ||||
| from composer.cli.recipes import prettyDiffEntry | ||||
| from composer.cli.blueprints import prettyDiffEntry | ||||
| 
 | ||||
| diff_entries = [{'new': {'Description': 'Shiny new description'}, 'old': {'Description': 'Old reliable description'}}, | ||||
|                 {'new': {'Version': '0.3.1'}, 'old': {'Version': '0.1.1'}}, | ||||
| @ -34,7 +34,7 @@ diff_result = [ | ||||
|     'Changed Module httpd 3.7.* -> 3.8.*', | ||||
|     'Added Package git 2.13.*'] | ||||
| 
 | ||||
| class RecipesTest(unittest.TestCase): | ||||
| class BlueprintsTest(unittest.TestCase): | ||||
|     def test_prettyDiffEntry(self): | ||||
|         """Return a nice representation of a diff entry""" | ||||
|         self.assertEqual([prettyDiffEntry(entry) for entry in diff_entries], diff_result) | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user