Add support for sources to composer-cli
This adds the sources command which can be used to list, add, change,
and delete sources using the TOML formatted source file.
(cherry picked from commit 6f6ce410c0)
This commit is contained in:
parent
693dc9a6f6
commit
0314cbd0e8
@ -1,4 +1,3 @@
|
|||||||
#!/usr/bin/python
|
|
||||||
#
|
#
|
||||||
# composer-cli
|
# composer-cli
|
||||||
#
|
#
|
||||||
@ -24,12 +23,14 @@ from composer.cli.blueprints import blueprints_cmd
|
|||||||
from composer.cli.modules import modules_cmd
|
from composer.cli.modules import modules_cmd
|
||||||
from composer.cli.projects import projects_cmd
|
from composer.cli.projects import projects_cmd
|
||||||
from composer.cli.compose import compose_cmd
|
from composer.cli.compose import compose_cmd
|
||||||
|
from composer.cli.sources import sources_cmd
|
||||||
|
|
||||||
command_map = {
|
command_map = {
|
||||||
"blueprints": blueprints_cmd,
|
"blueprints": blueprints_cmd,
|
||||||
"modules": modules_cmd,
|
"modules": modules_cmd,
|
||||||
"projects": projects_cmd,
|
"projects": projects_cmd,
|
||||||
"compose": compose_cmd
|
"compose": compose_cmd,
|
||||||
|
"sources": sources_cmd
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -24,36 +24,106 @@ VERSION = "{0}-{1}".format(os.path.basename(sys.argv[0]), vernum)
|
|||||||
|
|
||||||
# Documentation for the commands
|
# Documentation for the commands
|
||||||
epilog = """
|
epilog = """
|
||||||
compose start <blueprint> <type> Start a compose using the selected blueprint and output type.
|
compose start <BLUEPRINT> <TYPE>
|
||||||
types List the supported output types.
|
Start a compose using the selected blueprint and output type.
|
||||||
status List the status of all running and finished composes.
|
|
||||||
log <uuid> [<size>kB] Show the last 1kB of the compose log.
|
compose types
|
||||||
cancel <uuid> Cancel a running compose and delete any intermediate results.
|
List the supported output types.
|
||||||
delete <uuid,...> Delete the listed compose results.
|
|
||||||
info <uuid> Show detailed information on the compose.
|
compose status
|
||||||
metadata <uuid> Download the metadata use to create the compose to <uuid>-metadata.tar
|
List the status of all running and finished composes.
|
||||||
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
|
compose log <UUID> [<SIZE>]
|
||||||
image <uuid> Download the output image from the compose. Filename depends on the type.
|
Show the last SIZE kB of the compose log.
|
||||||
blueprints list List the names of the available blueprints.
|
|
||||||
show <blueprint,...> Display the blueprint in TOML format.
|
compose cancel <UUID>
|
||||||
changes <blueprint,...> Display the changes for each blueprint.
|
Cancel a running compose and delete any intermediate results.
|
||||||
diff <blueprint-name> Display the differences between 2 versions of a blueprint.
|
|
||||||
<from-commit> Commit hash or NEWEST
|
compose delete <UUID,...>
|
||||||
<to-commit> Commit hash, NEWEST, or WORKSPACE
|
Delete the listed compose results.
|
||||||
save <blueprint,...> Save the blueprint to a file, <blueprint-name>.toml
|
|
||||||
delete <blueprint> Delete a blueprint from the server
|
compose info <UUID>
|
||||||
depsolve <blueprint,...> Display the packages needed to install the blueprint.
|
Show detailed information on the compose.
|
||||||
push <blueprint> Push a blueprint TOML file to the server.
|
|
||||||
freeze <blueprint,...> Display the frozen blueprint's modules and packages.
|
compose metadata <UUID>
|
||||||
freeze show <blueprint,...> Display the frozen blueprint in TOML format.
|
Download the metadata use to create the compose to <uuid>-metadata.tar
|
||||||
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.
|
compose logs <UUID>
|
||||||
undo <blueprint> <commit> Undo changes to a blueprint by reverting to the selected commit.
|
Download the compose logs to <uuid>-logs.tar
|
||||||
workspace <blueprint> Push the blueprint TOML to the temporary workspace storage.
|
|
||||||
modules list List the available modules.
|
compose results <UUID>
|
||||||
projects list List the available projects.
|
Download all of the compose results; metadata, logs, and image to <uuid>.tar
|
||||||
projects info <project,...> Show details about the listed projects.
|
|
||||||
|
compose image <UUID>
|
||||||
|
Download the output image from the compose. Filename depends on the type.
|
||||||
|
|
||||||
|
blueprints list
|
||||||
|
List the names of the available blueprints.
|
||||||
|
|
||||||
|
blueprints show <BLUEPRINT,...>
|
||||||
|
Display the blueprint in TOML format.
|
||||||
|
|
||||||
|
blueprints changes <BLUEPRINT,...>
|
||||||
|
Display the changes for each blueprint.
|
||||||
|
|
||||||
|
blueprints diff <BLUEPRINT> <FROM-COMMIT> <TO-COMMIT>
|
||||||
|
Display the differences between 2 versions of a blueprint.
|
||||||
|
FROM-COMMIT can be a commit hash or NEWEST
|
||||||
|
TO-COMMIT can be a commit hash, NEWEST, or WORKSPACE
|
||||||
|
|
||||||
|
blueprints save <BLUEPRINT,...>
|
||||||
|
Save the blueprint to a file, <BLUEPRINT>.toml
|
||||||
|
|
||||||
|
blueprints delete <BLUEPRINT>
|
||||||
|
Delete a blueprint from the server
|
||||||
|
|
||||||
|
blueprints depsolve <BLUEPRINT,...>
|
||||||
|
Display the packages needed to install the blueprint.
|
||||||
|
|
||||||
|
blueprints push <BLUEPRINT>
|
||||||
|
Push a blueprint TOML file to the server.
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
blueprints tag <BLUEPRINT>
|
||||||
|
Tag the most recent blueprint commit as a release.
|
||||||
|
|
||||||
|
blueprints undo <BLUEPRINT> <COMMIT>
|
||||||
|
Undo changes to a blueprint by reverting to the selected commit.
|
||||||
|
|
||||||
|
blueprints 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.
|
||||||
|
|
||||||
|
sources list
|
||||||
|
List the available sources
|
||||||
|
|
||||||
|
sources info <SOURCE-NAME,...>
|
||||||
|
Details about the source.
|
||||||
|
|
||||||
|
sources add <SOURCE.TOML>
|
||||||
|
Add a package source to the server.
|
||||||
|
|
||||||
|
sources change <SOURCE.TOML>
|
||||||
|
Change an existing source
|
||||||
|
|
||||||
|
sources delete <SOURCE-NAME>
|
||||||
|
Delete a package source.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def composer_cli_parser():
|
def composer_cli_parser():
|
||||||
|
|||||||
143
src/composer/cli/sources.py
Normal file
143
src/composer/cli/sources.py
Normal file
@ -0,0 +1,143 @@
|
|||||||
|
#
|
||||||
|
# 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, handle_api_result
|
||||||
|
|
||||||
|
def sources_cmd(opts):
|
||||||
|
"""Process sources commands
|
||||||
|
|
||||||
|
:param opts: Cmdline arguments
|
||||||
|
:type opts: argparse.Namespace
|
||||||
|
:returns: Value to return from sys.exit()
|
||||||
|
:rtype: int
|
||||||
|
"""
|
||||||
|
cmd_map = {
|
||||||
|
"list": sources_list,
|
||||||
|
"info": sources_info,
|
||||||
|
"add": sources_add,
|
||||||
|
"change": sources_add,
|
||||||
|
"delete": sources_delete,
|
||||||
|
}
|
||||||
|
if opts.args[1] not in cmd_map:
|
||||||
|
log.error("Unknown sources command: %s", opts.args[1])
|
||||||
|
return 1
|
||||||
|
|
||||||
|
return cmd_map[opts.args[1]](opts.socket, opts.api_version, opts.args[2:], opts.json)
|
||||||
|
|
||||||
|
def sources_list(socket_path, api_version, args, show_json=False):
|
||||||
|
"""Output the list of available sources
|
||||||
|
|
||||||
|
: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
|
||||||
|
|
||||||
|
sources list
|
||||||
|
"""
|
||||||
|
api_route = client.api_url(api_version, "/projects/source/list")
|
||||||
|
result = client.get_url_json(socket_path, api_route)
|
||||||
|
if show_json:
|
||||||
|
print(json.dumps(result, indent=4))
|
||||||
|
return 0
|
||||||
|
|
||||||
|
print("Sources: %s" % ", ".join(result["sources"]))
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def sources_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
|
||||||
|
|
||||||
|
sources info <source-name>
|
||||||
|
"""
|
||||||
|
if len(args) == 0:
|
||||||
|
log.error("sources info is missing the name of the source")
|
||||||
|
return 1
|
||||||
|
|
||||||
|
if show_json:
|
||||||
|
api_route = client.api_url(api_version, "/projects/source/info/%s" % ",".join(args))
|
||||||
|
result = client.get_url_json(socket_path, api_route)
|
||||||
|
print(json.dumps(result, indent=4))
|
||||||
|
return 0
|
||||||
|
else:
|
||||||
|
api_route = client.api_url(api_version, "/projects/source/info/%s?format=toml" % ",".join(args))
|
||||||
|
result = client.get_url_raw(socket_path, api_route)
|
||||||
|
print(result)
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def sources_add(socket_path, api_version, args, show_json=False):
|
||||||
|
"""Add or change a source
|
||||||
|
|
||||||
|
: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
|
||||||
|
|
||||||
|
sources add <source.toml>
|
||||||
|
"""
|
||||||
|
api_route = client.api_url(api_version, "/projects/source/new")
|
||||||
|
rval = 0
|
||||||
|
for source in argify(args):
|
||||||
|
if not os.path.exists(source):
|
||||||
|
log.error("Missing source file: %s", source)
|
||||||
|
continue
|
||||||
|
source_toml = open(source, "r").read()
|
||||||
|
|
||||||
|
result = client.post_url_toml(socket_path, api_route, source_toml)
|
||||||
|
if handle_api_result(result, show_json):
|
||||||
|
rval = 1
|
||||||
|
return rval
|
||||||
|
|
||||||
|
def sources_delete(socket_path, api_version, args, show_json=False):
|
||||||
|
"""Delete a source
|
||||||
|
|
||||||
|
: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
|
||||||
|
|
||||||
|
sources delete <source-name>
|
||||||
|
"""
|
||||||
|
api_route = client.api_url(api_version, "/projects/source/delete/%s" % args[0])
|
||||||
|
result = client.delete_url_json(socket_path, api_route)
|
||||||
|
|
||||||
|
return handle_api_result(result, show_json)
|
||||||
Loading…
Reference in New Issue
Block a user