Source code for bowl.cli

"""
This module is the commandline interface of bowl.

Created on 14 March 2014
@author: Charlie Lewis
"""

import argparse
from bowl.cli_opts import add
from bowl.cli_opts import connect
from bowl.cli_opts import delete
from bowl.cli_opts import disconnect
from bowl.cli_opts import grant
from bowl.cli_opts import hosts
from bowl.cli_opts import image_import
from bowl.cli_opts import images
from bowl.cli_opts import info
from bowl.cli_opts import kill
from bowl.cli_opts import link
from bowl.cli_opts import list
from bowl.cli_opts import login
from bowl.cli_opts import logout
from bowl.cli_opts import logs
from bowl.cli_opts import new
from bowl.cli_opts import remove
from bowl.cli_opts import repositories
from bowl.cli_opts import revoke
from bowl.cli_opts import services
from bowl.cli_opts import snapshot
from bowl.cli_opts import snapshots
from bowl.cli_opts import start
from bowl.cli_opts import stop
from bowl.cli_opts import subtract
from bowl.cli_opts import test
from bowl.cli_opts import unlink
from bowl.cli_opts import update
from bowl.cli_opts import version

[docs]class cli(object): """ This class is responsible for all commandline operations. """
[docs] def parse_args(self): default_metadata_path = "~/.bowl" default_path = "/bowl" parser = argparse.ArgumentParser() subparsers = parser.add_subparsers(title='bowl commands') # add parse_add = subparsers.add_parser('add', help='add a service') parse_add.add_argument('OS', help='specify operating system for service') parse_add.add_argument('VERSION', help='specify version of operating system') parse_add.add_argument('TYPE', help='specify type of service (databases, environment, services, tools)') parse_add.add_argument('NAME', help='specify name of service') parse_add.add_argument('JSON', help='JSON object or path to JSON object that contains associated metadata') parse_add.add_argument('PATH', help='path that contains the Dockerfile') parse_add.add_argument('--metadata_path', '-m', default=default_metadata_path, help='metadata path, default '+default_metadata_path) # !! TODO use default, and restructure if/else in add parse_add.add_argument('--repository', '-r', help='specify repository to add service to, use localhost by default') parse_add.set_defaults(func=add.add.main) # connect parse_connect = subparsers.add_parser('connect', help='connect to a docker host') parse_connect.add_argument('DOCKER_HOST', help='specify docker host to connect to') parse_connect.add_argument('--metadata_path', '-m', default=default_metadata_path, help='metadata path, default '+default_metadata_path) parse_connect.set_defaults(func=connect.connect.main) # delete parse_delete = subparsers.add_parser('delete', help='delete an image') parse_delete.add_argument('IMAGE_NAME', help='specify name of image to delete') parse_delete.add_argument('--metadata_path', '-m', default=default_metadata_path, help='metadata path, default '+default_metadata_path) parse_delete.set_defaults(func=delete.delete.main) # disconnect parse_disconnect = subparsers.add_parser('disconnect', help='disconnect from a docker host') parse_disconnect.add_argument('DOCKER_HOST', help='specify docker host to disconnect from') parse_disconnect.add_argument('--metadata_path', '-m', default=default_metadata_path, help='metadata path, default '+default_metadata_path) parse_disconnect.set_defaults(func=disconnect.disconnect.main) # grant parse_grant = subparsers.add_parser('grant', help='grant access to container for a user') parse_grant.add_argument('USER', help='specify user to grant access') parse_grant.add_argument('--container', '-c', default="all", help='specify container to add access to for the specified user, default all') parse_grant.add_argument('--metadata_path', '-m', default=default_metadata_path, help='metadata path, default '+default_metadata_path) parse_grant.add_argument('-z', action='store_true', help='do not print any output') parse_grant.set_defaults(func=grant.grant.main) # hosts parse_hosts = subparsers.add_parser('hosts', help='list hosts that are registered') parse_hosts.add_argument('--metadata_path', '-m', default=default_metadata_path, help='metadata path, default '+default_metadata_path) parse_hosts.add_argument('-z', action='store_true', help='do not print any output') parse_hosts.set_defaults(func=hosts.hosts.main) # images parse_images = subparsers.add_parser('images', help='list images') parse_images.add_argument('--metadata_path', '-m', default=default_metadata_path, help='metadata path, default '+default_metadata_path) parse_images.add_argument('-z', action='store_true', help='do not print any output') parse_images.set_defaults(func=images.images.main) # import parse_import = subparsers.add_parser('import', help='import an image') parse_import.add_argument('IMAGE_NAME', help='specify name of image to import') parse_import.add_argument('DOCKER_HOST', help='specify Docker host of image to import') parse_import.add_argument('-d', '--description', help='description of image to import') parse_import.add_argument('--metadata_path', '-m', default=default_metadata_path, help='metadata path, default '+default_metadata_path) parse_import.add_argument('-u', '--uuid', help='uuid of image to import') # use non-standard naming scheme to not conflict with python's import parse_import.set_defaults(func=image_import.image_import.main) # info parse_info = subparsers.add_parser('info', help='display system-wide information') parse_info.add_argument('--metadata_path', '-m', default=default_metadata_path, help='metadata path, default '+default_metadata_path) parse_info.add_argument('-z', action='store_true', help='do not print any output') parse_info.set_defaults(func=info.info.main) # kill parse_kill = subparsers.add_parser('kill', help='kill running container') parse_kill.add_argument('CONTAINER', help='specify container to kill') parse_kill.add_argument('--metadata_path', '-m', default=default_metadata_path, help='metadata path, default '+default_metadata_path) parse_kill.add_argument('-z', action='store_true', help='do not print any output') parse_kill.set_defaults(func=kill.kill.main) # link parse_link = subparsers.add_parser('link', help='link to a service repository host') parse_link.add_argument('SERVICE_HOST', help='specify service repository host to connect to') parse_link.add_argument('NAME', help='specify a name for the repository') parse_link.add_argument('--path', default=default_metadata_path, help='specify path where services live, default '+default_metadata_path) parse_link.add_argument('--port', '-p', default='8080', help='specify port that service host is running on, default=8080') parse_link.add_argument('--metadata_path', '-m', default=default_metadata_path, help='metadata path, default '+default_metadata_path) parse_link.add_argument('-z', action='store_true', help='do not print any output') parse_link.set_defaults(func=link.link.main) # list parse_list = subparsers.add_parser('list', help='list containers running') parse_list.add_argument('--metadata_path', '-m', default=default_metadata_path, help='metadata path, default '+default_metadata_path) parse_list.add_argument('-z', action='store_true', help='do not print any output') parse_list.set_defaults(func=list.list.main) # login parse_login = subparsers.add_parser('login', help='login with credentials') parse_login.add_argument('-e', '--email', help='email address') parse_login.add_argument('-u', '--username', help='username') parse_login.add_argument('PASSWORD', help='password') parse_login.set_defaults(func=login.login.main) # logout parse_logout = subparsers.add_parser('logout', help='logout') parse_logout.set_defaults(func=logout.logout.main) # logs parse_logs = subparsers.add_parser('logs', help='container logs') parse_logs.add_argument('CONTAINER', help='specify container to get logs from') parse_logs.add_argument('--metadata_path', '-m', default=default_metadata_path, help='metadata path, default '+default_metadata_path) parse_logs.add_argument('-z', action='store_true', help='do not print any output') parse_logs.set_defaults(func=logs.logs.main) # new parse_new = subparsers.add_parser('new', help='new container') parse_new.add_argument('--metadata_path', '-m', default=default_metadata_path, help='metadata path, default '+default_metadata_path) parse_new.add_argument('--toggle_default', action='store_true', help='toggle using default services, uses them by default') parse_new.add_argument('--no_curses', '-n', action='store_true', help='do not use curses') parse_new.add_argument('--service', '-s', action='append', help='add a service to the container, can be used more than once, only used with no_curses') parse_new.add_argument('--image', '-i', help='specify an image, only used with no_curses') parse_new.add_argument('--host', action='append', help='add a host to run the container one, can be used more than once, only used with no_curses') parse_new.add_argument('--command', '-c', action='store_true', help='override command at runtime of container, only used with no_curses') parse_new.add_argument('--entrypoint', '-e', action='store_true', help='override entrypoint at runtime of container, only used with no_curses') parse_new.add_argument('--volume', '-v', action='store_true', help='add volumes at runtime of container, only used with no_curses') parse_new.add_argument('--port', '-p', action='store_true', help='set ports at runtime of container, only used with no_curses') parse_new.add_argument('--link', '-l', action='store_true', help='add links to containers at runtime of container, only used with no_curses') parse_new.add_argument('--name', action='store_true', help='set ports at runtime of container, only used with no_curses') parse_new.add_argument('--unique', '-u', action='store_true', help='set different runtime parameters for each container, only used with no_curses') parse_new.add_argument('--user', action='store_true', help='add a user at runtime of container, only used with no_curses') parse_new.set_defaults(func=new.new.main) # remove parse_remove = subparsers.add_parser('rm', help='remove a container') parse_remove.add_argument('CONTAINER', help='specify container to remove') parse_remove.add_argument('--metadata_path', '-m', default=default_metadata_path, help='metadata path, default '+default_metadata_path) parse_remove.add_argument('-z', action='store_true', help='do not print any output') parse_remove.set_defaults(func=remove.remove.main) # repositories parse_repositories = subparsers.add_parser('repositories', help='list repositories that are registered') parse_repositories.add_argument('--metadata_path', '-m', default=default_metadata_path, help='metadata path, default '+default_metadata_path) parse_repositories.add_argument('-z', action='store_true', help='do not print any output') parse_repositories.set_defaults(func=repositories.repositories.main) # revoke parse_revoke = subparsers.add_parser('revoke', help='revoke access to container for a user') parse_revoke.add_argument('USER', help='specify user to revoke access') parse_revoke.add_argument('--container', '-c', default="all", help='specify container to remove access to for the specified user, default all') parse_revoke.add_argument('--metadata_path', '-m', default=default_metadata_path, help='metadata path, default '+default_metadata_path) parse_revoke.add_argument('-z', action='store_true', help='do not print any output') parse_revoke.set_defaults(func=revoke.revoke.main) # services parse_services = subparsers.add_parser('services', help='list services') parse_services.add_argument('-j', '--json', action='store_true', help='print complete JSON object for each service') parse_services.add_argument('--metadata_path', '-m', default=default_metadata_path, help='metadata path, default '+default_metadata_path) parse_services.add_argument('-q', '--quiet', action='store_true', help='print only the name, will ignore -j if also supplied') parse_services.add_argument('-z', action='store_true', help='do not print any output') parse_services.set_defaults(func=services.services.main) # snapshot parse_snapshot = subparsers.add_parser('snapshot', help='snapshot running container') parse_snapshot.add_argument('CONTAINER', help='specify container to snapshot') parse_snapshot.add_argument('--metadata_path', '-m', default=default_metadata_path, help='metadata path, default '+default_metadata_path) parse_snapshot.add_argument('-z', action='store_true', help='do not print any output') parse_snapshot.set_defaults(func=snapshot.snapshot.main) # snapshots parse_snapshots = subparsers.add_parser('snapshots', help='list snapshots') parse_snapshots.add_argument('--metadata_path', '-m', default=default_metadata_path, help='metadata path, default '+default_metadata_path) parse_snapshots.add_argument('-z', action='store_true', help='do not print any output') parse_snapshots.set_defaults(func=snapshots.snapshots.main) # start parse_start = subparsers.add_parser('start', help='start the api/repository service server') parse_start.add_argument('--metadata_path', '-m', default=default_metadata_path, help='metadata path, default '+default_metadata_path) parse_start.add_argument('-z', action='store_true', help='do not print any output') parse_start.set_defaults(func=start.start.main) # stop parse_stop = subparsers.add_parser('stop', help='stop the api/repository service server') parse_stop.add_argument('--metadata_path', '-m', default=default_metadata_path, help='metadata path, default '+default_metadata_path) parse_stop.add_argument('-z', action='store_true', help='do not print any output') parse_stop.set_defaults(func=stop.stop.main) # subtract parse_subtract = subparsers.add_parser('subtract', help='subtract a service') parse_subtract.add_argument('OS', help='specify operating system for service') parse_subtract.add_argument('VERSION', help='specify version of operating system') parse_subtract.add_argument('TYPE', help='specify type of service (database, environment, service, tool)') parse_subtract.add_argument('NAME', help='specify name of service') parse_subtract.add_argument('--metadata_path', '-m', default=default_metadata_path, help='metadata path, default '+default_metadata_path) # !! TODO use default, and restructure if/else in subtract parse_subtract.add_argument('--repository', '-r', help='specify repository to subtract service from, use localhost by default') parse_subtract.set_defaults(func=subtract.subtract.main) # test parse_test = subparsers.add_parser('test', help='run tests') parse_test.add_argument('-c', action='store_true', help='send to coveralls') parse_test.add_argument('-f', action='store_true', help='do not run tests') parse_test.add_argument('--path', '-p', default=default_path, help='path to test, default '+default_path) parse_test.set_defaults(func=test.test.main) # unlink parse_unlink = subparsers.add_parser('unlink', help='unlink a service repository') parse_unlink.add_argument('NAME', help='specify name of service repository to disconnect from') parse_unlink.add_argument('--metadata_path', '-m', default=default_metadata_path, help='metadata path, default '+default_metadata_path) parse_unlink.set_defaults(func=unlink.unlink.main) # update parse_update = subparsers.add_parser('update', help='update service repository hosts') parse_update.add_argument('--metadata_path', '-m', default=default_metadata_path, help='metadata path, default '+default_metadata_path) parse_update.add_argument('-r' '--repository', help='specify service repository host to get updates from') parse_update.add_argument('-z', action='store_true', help='do not print any output') parse_update.set_defaults(func=update.update.main) # version parse_version = subparsers.add_parser('version', help='show version') parse_version.add_argument('-z', action='store_true', help='do not print any output') parse_version.set_defaults(func=version.version.main) args = parser.parse_args() if args.func: args.func(args)
[docs]def main(): cli().parse_args()
if __name__ == "__main__": # pragma: no cover main()