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.
This commit is contained in:
Brian C. Lane 2018-05-31 10:06:31 -07:00
parent a5eaebeefc
commit 957def1264
3 changed files with 152 additions and 3 deletions

View File

@ -60,7 +60,12 @@ blueprints list List the names of the available blueprints.
workspace <blueprint> Push the blueprint TOML to the temporary workspace storage. workspace <blueprint> Push the blueprint TOML to the temporary workspace storage.
modules list List the available modules. modules list List the available modules.
projects list List the available projects. projects list List the available projects.
projects info <project,...> Show details about the listed projects. info <project,...> Show details about the listed projects.
sources list List the available sources
sources info <source,...> 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> Delete a package source.
""" """
def get_parser(): def get_parser():

View File

@ -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
} }

143
src/composer/cli/sources.py Normal file
View 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)