From 337bdd15a8f32c728c8304cb121d1363c7451168 Mon Sep 17 00:00:00 2001 From: AndrewAhapov Date: Sat, 24 Mar 2018 22:05:50 +0200 Subject: [PATCH 01/19] Added some commands to work with new api --- .gitignore | 2 + infraboxcli/__init__.py | 54 +++++++++++++++++-- infraboxcli/dashboard/__init__.py | 0 infraboxcli/dashboard/cli_client.py | 24 +++++++++ infraboxcli/dashboard/external.py | 43 ++++++++++++++++ infraboxcli/dashboard/project.py | 80 +++++++++++++++++++++++++++++ infraboxcli/dashboard/user.py | 29 +++++++++++ setup.py | 1 + 8 files changed, 229 insertions(+), 4 deletions(-) create mode 100644 infraboxcli/dashboard/__init__.py create mode 100644 infraboxcli/dashboard/cli_client.py create mode 100644 infraboxcli/dashboard/external.py create mode 100644 infraboxcli/dashboard/project.py create mode 100644 infraboxcli/dashboard/user.py diff --git a/.gitignore b/.gitignore index 7d77160..5ab90b2 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,8 @@ __pycache__/ *.swp +.idea/ + # C extensions *.so diff --git a/infraboxcli/__init__.py b/infraboxcli/__init__.py index 8f4670e..f9b4f49 100644 --- a/infraboxcli/__init__.py +++ b/infraboxcli/__init__.py @@ -2,14 +2,16 @@ import os import sys -from infraboxcli.push import push -from infraboxcli.run import run from infraboxcli.graph import graph -from infraboxcli.validate import validate +from infraboxcli.init import init from infraboxcli.list_jobs import list_jobs from infraboxcli.log import logger -from infraboxcli.init import init from infraboxcli.pull import pull +from infraboxcli.push import push +from infraboxcli.run import run +from infraboxcli.dashboard.account import login +from infraboxcli.dashboard import project +from infraboxcli.validate import validate version = '0.6.0' @@ -94,6 +96,50 @@ def main(): parser_run.set_defaults(no_rm=False) parser_run.set_defaults(func=run) + # collaborators + parser_collab_add = sub_parser.add_parser('add-collaborator') + parser_collab_add.add_argument("--username", required=True, + help="Collaborator username") + parser_collab_add.set_defaults(func=project.add_collaborator) + + parser_collab_dl = sub_parser.add_parser('delete-collaborator') + parser_collab_dl.add_argument("--username", required=True, + help="Collaborator username") + parser_collab_dl.set_defaults(func=project.delete_collaborator) + + # secrets + parser_secret_add = sub_parser.add_parser('add-secret') + parser_secret_add.add_argument("--name", required=True, + help="Secret name") + parser_secret_add.add_argument("--value", required=True, + help="Secret value") + parser_secret_add.set_defaults(func=project.add_secret) + + parser_secret_dl = sub_parser.add_parser('delete-secret') + parser_secret_dl.add_argument("--name", required=True, + help="Secret name") + parser_secret_dl.set_defaults(func=project.delete_secret) + + # in-project tokens + parser_secret_add = sub_parser.add_parser('add-token') + parser_secret_add.add_argument("--d", required=True, + help="Token description") + parser_secret_add.add_argument("--scope_push", required=False, action='store_true', + help="Scope push") + parser_secret_add.add_argument("--scope_pull", required=False, action='store_true', + help="Scope pull") + parser_secret_add.set_defaults(func=project.add_token) + + parser_secret_dl = sub_parser.add_parser('delete-token') + parser_secret_dl.add_argument("--id", required=True, + help="Token id") + parser_secret_dl.set_defaults(func=project.delete_token) + + # user + parser_login = sub_parser.add_parser('login', help='Login to infrabox') + parser_login.set_defaults(func=login) + + # Parse args args = parser.parse_args() diff --git a/infraboxcli/dashboard/__init__.py b/infraboxcli/dashboard/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/infraboxcli/dashboard/cli_client.py b/infraboxcli/dashboard/cli_client.py new file mode 100644 index 0000000..f789016 --- /dev/null +++ b/infraboxcli/dashboard/cli_client.py @@ -0,0 +1,24 @@ +import requests + +session = requests.Session() + + +def get(url, headers=None, cookies_handler=None): + response = session.get(url, headers=headers) + if cookies_handler: + cookies_handler(session.cookies.get_dict()) + return response + + +def post(url, data, headers=None, cookies_handler=None): + response = session.post(url, json=data, headers=headers) + if cookies_handler: + cookies_handler(session.cookies.get_dict()) + return response + + +def delete(url, headers=None, cookies_handler=None): + response = session.delete(url, headers=headers) + if cookies_handler: + cookies_handler(session.cookies.get_dict()) + return response \ No newline at end of file diff --git a/infraboxcli/dashboard/external.py b/infraboxcli/dashboard/external.py new file mode 100644 index 0000000..297dfe4 --- /dev/null +++ b/infraboxcli/dashboard/external.py @@ -0,0 +1,43 @@ +import pickle +from os.path import expanduser + +home = expanduser("~") + +def save_user_token(dict): + try: + f = open(home + '/.infra.data', 'rb') + obj = pickle.load(f) + f.close() + + except: + obj = {} + + obj['current_user_token'] = dict['token'] + + f = open(home + '/.infra.data', 'wb') + pickle.dump(obj, f) + f.close() + + +def load_current_user_token(): + try: + f = open(home + '/.infra.data', 'rb') + obj = pickle.load(f) + f.close() + curr_token = obj['current_user_token'] + except: + raise EnvironmentError('Could not load current user token. Please log in') + + return curr_token + + +def load_current_project_token(): + try: + f = open(home + '/.infra.data', 'rb') + obj = pickle.load(f) + f.close() + curr_token = obj['current_project_token'] + except: + raise EnvironmentError('Could not load current project token. Please set current project') + + return curr_token \ No newline at end of file diff --git a/infraboxcli/dashboard/project.py b/infraboxcli/dashboard/project.py new file mode 100644 index 0000000..de24a5a --- /dev/null +++ b/infraboxcli/dashboard/project.py @@ -0,0 +1,80 @@ +from infraboxcli.dashboard.cli_client import get, post, delete +from user import id_by_neme, get_user_headers +import infraboxcli.env + +url_base = 'http://localhost:8080/api/v1/projects/' + + +def delete_project(args): + infraboxcli.env.check_env_cli_token(args) + url = url_base + args.project_id + response = get(url, get_user_headers()) + + return response + + +def collaborators(args): + infraboxcli.env.check_env_cli_token(args) + url = url_base + args.project_id + '/collaborators' + response = get(url, get_user_headers()) + + return response + + +def add_collaborator(args): + infraboxcli.env.check_env_cli_token(args) + url = url_base + args.project_id + '/collaborators' + data = {'username': args.username} + + response = post(url, data, get_user_headers()) + + return response + + +def delete_collaborator(args): + infraboxcli.env.check_env_cli_token(args) + collaborator_id = id_by_neme(args.username) + + url = url_base + args.project_id + '/collaborators/' + collaborator_id[1:-2] + response = delete(url, get_user_headers()) + + return response + + +def add_secret(args): + infraboxcli.env.check_env_cli_token(args) + url = url_base + args.project_id + '/secrets' + data = {'name': args.name, 'value': args.value} + + response = post(url, data, get_user_headers()) + + return response + + +def delete_secret(args): + infraboxcli.env.check_env_cli_token(args) + url = url_base + args.project_id + '/secrets/' + args.name + response = delete(url, get_user_headers()) + + return response + + +def add_token(args): + infraboxcli.env.check_env_cli_token(args) + url = url_base + args.project_id + '/tokens' + data = { + 'description': args.d, + 'scope_push': args.scope_push, + 'scope_pull': args.scope_pull + } + + response = post(url, data, get_user_headers()) + return response + + +def delete_token(args): + infraboxcli.env.check_env_cli_token(args) + url = url_base + args.project_id + '/tokens/' + args.id + response = delete(url, get_user_headers()) + + return response \ No newline at end of file diff --git a/infraboxcli/dashboard/user.py b/infraboxcli/dashboard/user.py new file mode 100644 index 0000000..e40d20e --- /dev/null +++ b/infraboxcli/dashboard/user.py @@ -0,0 +1,29 @@ +import getpass + +from cli_client import post, get +from external import load_current_user_token, save_user_token + +url_base = 'http://localhost:8080/api/v1/user/' + +def get_user_token(): + return load_current_user_token() + +def get_user_headers(): + return {'Authorization': 'token %s' % get_user_token()} + +def login(args): + email = raw_input("Email: ") + password = getpass.getpass('Password: ') + + data = {"email": email, "password": password} + + url = 'http://localhost:8080/api/v1/account/login' + response = post(url, data, cookies_handler=save_user_token) + + return response + +def id_by_neme(username): + url = url_base + "id/" + username + response = get(url, headers=get_user_headers()) + + return response.text diff --git a/setup.py b/setup.py index 79f1870..26c0ff1 100644 --- a/setup.py +++ b/setup.py @@ -12,6 +12,7 @@ def readme(): author='infrabox', license='MIT', packages=['infraboxcli', + 'infraboxcli.dashboard', 'pyinfrabox', 'pyinfrabox.infrabox', 'pyinfrabox.badge', From 3378b1cd50d4c48a1e1cc824954f2b7ff0711652 Mon Sep 17 00:00:00 2001 From: AndrewAhapov Date: Sat, 24 Mar 2018 22:23:01 +0200 Subject: [PATCH 02/19] Module import fixed --- infraboxcli/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/infraboxcli/__init__.py b/infraboxcli/__init__.py index f9b4f49..6dada2b 100644 --- a/infraboxcli/__init__.py +++ b/infraboxcli/__init__.py @@ -9,7 +9,7 @@ from infraboxcli.pull import pull from infraboxcli.push import push from infraboxcli.run import run -from infraboxcli.dashboard.account import login +from infraboxcli.dashboard.user import login from infraboxcli.dashboard import project from infraboxcli.validate import validate From e9a952d1e408a50788a09da11c170fa9c66f5a78 Mon Sep 17 00:00:00 2001 From: AndrewAhapov Date: Sat, 24 Mar 2018 22:38:39 +0200 Subject: [PATCH 03/19] Modules import for python3 fixes --- infraboxcli/__init__.py | 7 ++++--- infraboxcli/dashboard/project.py | 2 +- infraboxcli/dashboard/user.py | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/infraboxcli/__init__.py b/infraboxcli/__init__.py index 6dada2b..0efb643 100644 --- a/infraboxcli/__init__.py +++ b/infraboxcli/__init__.py @@ -9,10 +9,11 @@ from infraboxcli.pull import pull from infraboxcli.push import push from infraboxcli.run import run -from infraboxcli.dashboard.user import login -from infraboxcli.dashboard import project from infraboxcli.validate import validate +from infraboxcli.dashboard import user +from infraboxcli.dashboard import project + version = '0.6.0' def main(): @@ -137,7 +138,7 @@ def main(): # user parser_login = sub_parser.add_parser('login', help='Login to infrabox') - parser_login.set_defaults(func=login) + parser_login.set_defaults(func=user.login) # Parse args diff --git a/infraboxcli/dashboard/project.py b/infraboxcli/dashboard/project.py index de24a5a..ab6c0e5 100644 --- a/infraboxcli/dashboard/project.py +++ b/infraboxcli/dashboard/project.py @@ -1,5 +1,5 @@ from infraboxcli.dashboard.cli_client import get, post, delete -from user import id_by_neme, get_user_headers +from infraboxcli.dashboard.user import id_by_neme, get_user_headers import infraboxcli.env url_base = 'http://localhost:8080/api/v1/projects/' diff --git a/infraboxcli/dashboard/user.py b/infraboxcli/dashboard/user.py index e40d20e..45b7268 100644 --- a/infraboxcli/dashboard/user.py +++ b/infraboxcli/dashboard/user.py @@ -1,7 +1,7 @@ import getpass -from cli_client import post, get -from external import load_current_user_token, save_user_token +from infraboxcli.dashboard.cli_client import post, get +from infraboxcli.dashboard.external import load_current_user_token, save_user_token url_base = 'http://localhost:8080/api/v1/user/' From ce3a883b7fdd5387160b13f4c0881c2846fde2d0 Mon Sep 17 00:00:00 2001 From: Kirill Abramov Date: Tue, 27 Mar 2018 18:06:51 +0200 Subject: [PATCH 04/19] Minor improvements and style fixes. --- infraboxcli/__init__.py | 89 +++++++++++++++++--------------- infraboxcli/dashboard/project.py | 4 +- 2 files changed, 49 insertions(+), 44 deletions(-) diff --git a/infraboxcli/__init__.py b/infraboxcli/__init__.py index 453e75f..c97f33d 100644 --- a/infraboxcli/__init__.py +++ b/infraboxcli/__init__.py @@ -14,7 +14,7 @@ from infraboxcli.dashboard import user from infraboxcli.dashboard import project -version = '0.6.1' +version = '0.6.2' def main(): username = 'unknown' @@ -97,50 +97,55 @@ def main(): parser_run.set_defaults(no_rm=False) parser_run.set_defaults(func=run) - # collaborators - parser_collab_add = sub_parser.add_parser('add-collaborator') - parser_collab_add.add_argument("--username", required=True, - help="Collaborator username") - parser_collab_add.set_defaults(func=project.add_collaborator) - - parser_collab_dl = sub_parser.add_parser('delete-collaborator') - parser_collab_dl.add_argument("--username", required=True, - help="Collaborator username") - parser_collab_dl.set_defaults(func=project.delete_collaborator) - - # secrets - parser_secret_add = sub_parser.add_parser('add-secret') - parser_secret_add.add_argument("--name", required=True, - help="Secret name") - parser_secret_add.add_argument("--value", required=True, - help="Secret value") - parser_secret_add.set_defaults(func=project.add_secret) - - parser_secret_dl = sub_parser.add_parser('delete-secret') - parser_secret_dl.add_argument("--name", required=True, - help="Secret name") - parser_secret_dl.set_defaults(func=project.delete_secret) - - # in-project tokens - parser_secret_add = sub_parser.add_parser('add-token') - parser_secret_add.add_argument("--d", required=True, - help="Token description") - parser_secret_add.add_argument("--scope_push", required=False, action='store_true', - help="Scope push") - parser_secret_add.add_argument("--scope_pull", required=False, action='store_true', - help="Scope pull") - parser_secret_add.set_defaults(func=project.add_token) - - parser_secret_dl = sub_parser.add_parser('delete-token') - parser_secret_dl.add_argument("--id", required=True, - help="Token id") - parser_secret_dl.set_defaults(func=project.delete_token) - - # user + # Collaborators + parser_collaborators = sub_parser.add_parser('collaborators', help='Add or remove collaborators for your project') + sub_collaborators = parser_collaborators.add_subparsers() + + parser_add_collaborator = sub_collaborators.add_parser('add', help='Add collaborator') + parser_add_collaborator.add_argument('--username', required=True, type=str, + help='Username of collaborator you want to add') + parser_add_collaborator.set_defaults(func=project.add_collaborator) + + parser_remove_collaborator = sub_collaborators.add_parser('remove', help='Remove collaborator') + parser_remove_collaborator.add_argument('--username', required=True, type=str, + help='Username of collaborator you want to remove') + parser_remove_collaborator.set_defaults(func=project.remove_collaborator) + + # Secrets + parser_secrets = sub_parser.add_parser('secrets', help='Create or delete secrets') + sub_secrets = parser_secrets.add_subparsers() + + parser_create_secret = sub_secrets.add_parser('create', help='Create secret') + parser_create_secret.add_argument('--name', required=True, type=str, help='Name of your new secret') + parser_create_secret.add_argument('--value', required=True, type=str, help='Value of your new secret') + parser_create_secret.set_defaults(func=project.add_secret) + + parser_delete_secret = sub_secrets.add_parser('delete', help='Delete secret') + parser_delete_secret.add_argument('--name', required=True, type=str, help='Name of secret you want to delete') + parser_delete_secret.set_defaults(func=project.delete_secret) + + # Tokens + parsers_project_tokens = sub_parser.add_parser('project-token', help='Manage your project tokens') + sub_project_tokens = parsers_project_tokens.add_subparsers() + + parser_add_project_token = sub_project_tokens.add_parser('add', help='Add project token') + parser_add_project_token.add_argument('--d', required=True, type=str, + help='Description of project token you want to add') + parser_add_project_token.add_argument('--scope_push', required=False, action='store_true', + help='Scope push') + parser_add_project_token.add_argument('--scope_pull', required=False, action='store_true', + help='Scope pull') + parser_add_project_token.set_defaults(func=project.add_token) + + parser_remove_project_token = sub_project_tokens.add_parser('remove', help='Remove project token') + parser_remove_project_token.add_argument('--id', required=True, type=str, + help='Id of project token you want to remove') + parser_remove_project_token.set_defaults(func=project.delete_token) + + # User parser_login = sub_parser.add_parser('login', help='Login to infrabox') parser_login.set_defaults(func=user.login) - # Parse args args = parser.parse_args() diff --git a/infraboxcli/dashboard/project.py b/infraboxcli/dashboard/project.py index ab6c0e5..9097fe2 100644 --- a/infraboxcli/dashboard/project.py +++ b/infraboxcli/dashboard/project.py @@ -31,7 +31,7 @@ def add_collaborator(args): return response -def delete_collaborator(args): +def remove_collaborator(args): infraboxcli.env.check_env_cli_token(args) collaborator_id = id_by_neme(args.username) @@ -77,4 +77,4 @@ def delete_token(args): url = url_base + args.project_id + '/tokens/' + args.id response = delete(url, get_user_headers()) - return response \ No newline at end of file + return response From 1127ca6a16db960c855dddefe01875bfaebbaf41 Mon Sep 17 00:00:00 2001 From: Kirill Abramov Date: Mon, 9 Apr 2018 17:14:57 +0200 Subject: [PATCH 05/19] New CLI API: new commands and improvements. * Added `infrabox collaborators list` option; * Added `infrabox project-token list` option; * Project-token now is being printing right after its creation into console; * Commands now are more verbose in output. --- infraboxcli/__init__.py | 10 +++++++-- infraboxcli/dashboard/project.py | 36 +++++++++++++++++++++++++++++--- 2 files changed, 41 insertions(+), 5 deletions(-) diff --git a/infraboxcli/__init__.py b/infraboxcli/__init__.py index 2ff00c4..ad055a7 100644 --- a/infraboxcli/__init__.py +++ b/infraboxcli/__init__.py @@ -101,6 +101,9 @@ def main(): parser_collaborators = sub_parser.add_parser('collaborators', help='Add or remove collaborators for your project') sub_collaborators = parser_collaborators.add_subparsers() + parser_list_collaborators = sub_collaborators.add_parser('list', help='Show collaborators list') + parser_list_collaborators.set_defaults(func=project.list_collaborators) + parser_add_collaborator = sub_collaborators.add_parser('add', help='Add collaborator') parser_add_collaborator.add_argument('--username', required=True, type=str, help='Username of collaborator you want to add') @@ -128,6 +131,9 @@ def main(): parsers_project_tokens = sub_parser.add_parser('project-token', help='Manage your project tokens') sub_project_tokens = parsers_project_tokens.add_subparsers() + parser_list_project_tokens = sub_project_tokens.add_parser('list', help='Show your all project tokens') + parser_list_project_tokens.set_defaults(func=project.list_project_tokens) + parser_add_project_token = sub_project_tokens.add_parser('add', help='Add project token') parser_add_project_token.add_argument('--d', required=True, type=str, help='Description of project token you want to add') @@ -135,12 +141,12 @@ def main(): help='Scope push') parser_add_project_token.add_argument('--scope_pull', required=False, action='store_true', help='Scope pull') - parser_add_project_token.set_defaults(func=project.add_token) + parser_add_project_token.set_defaults(func=project.add_project_token) parser_remove_project_token = sub_project_tokens.add_parser('remove', help='Remove project token') parser_remove_project_token.add_argument('--id', required=True, type=str, help='Id of project token you want to remove') - parser_remove_project_token.set_defaults(func=project.delete_token) + parser_remove_project_token.set_defaults(func=project.delete_project_token) # User parser_login = sub_parser.add_parser('login', help='Login to infrabox') diff --git a/infraboxcli/dashboard/project.py b/infraboxcli/dashboard/project.py index 9097fe2..5069784 100644 --- a/infraboxcli/dashboard/project.py +++ b/infraboxcli/dashboard/project.py @@ -13,11 +13,17 @@ def delete_project(args): return response -def collaborators(args): +def list_collaborators(args): infraboxcli.env.check_env_cli_token(args) url = url_base + args.project_id + '/collaborators' response = get(url, get_user_headers()) + print('=== Collaborators ===') + for collaborator in response.json(): + print('---') + print('Username: %s' % collaborator['username']) + print('E-mail: %s' % collaborator['email']) + return response @@ -27,6 +33,7 @@ def add_collaborator(args): data = {'username': args.username} response = post(url, data, get_user_headers()) + print(response.json()['message']) return response @@ -37,6 +44,7 @@ def remove_collaborator(args): url = url_base + args.project_id + '/collaborators/' + collaborator_id[1:-2] response = delete(url, get_user_headers()) + print(response.json()['message']) return response @@ -59,7 +67,23 @@ def delete_secret(args): return response -def add_token(args): +def list_project_tokens(args): + infraboxcli.env.check_env_cli_token(args) + url = url_base + args.project_id + '/tokens' + + response = get(url, get_user_headers()) + print('=== Project tokens ===') + for project_token in response.json(): + print('---') + print('Description: %s' % project_token['description']) + print('Id: %s' % project_token['id']) + print('Scope push: %s' % project_token['scope_push']) + print('Scope pull: %s' % project_token['scope_pull']) + + return response + + +def add_project_token(args): infraboxcli.env.check_env_cli_token(args) url = url_base + args.project_id + '/tokens' data = { @@ -69,10 +93,16 @@ def add_token(args): } response = post(url, data, get_user_headers()) + + # Print project token to the CLI + print("=== Authentication Token ===") + print("Please save your token at a secure place. We will not show it to you again.\n\n") + print(response.json()['data']['token']) + return response -def delete_token(args): +def delete_project_token(args): infraboxcli.env.check_env_cli_token(args) url = url_base + args.project_id + '/tokens/' + args.id response = delete(url, get_user_headers()) From 0a575f0c8e795129716a1981cb569bec14a4f1a1 Mon Sep 17 00:00:00 2001 From: Kirill Abramov Date: Mon, 9 Apr 2018 17:36:55 +0200 Subject: [PATCH 06/19] New CLI API: minor improvements. * Modified `infrabox project-tokens` scope_push and scope_pull options; * Added more verbosity. --- infraboxcli/__init__.py | 15 +++++++++++---- infraboxcli/dashboard/project.py | 3 +++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/infraboxcli/__init__.py b/infraboxcli/__init__.py index ad055a7..60b1ed0 100644 --- a/infraboxcli/__init__.py +++ b/infraboxcli/__init__.py @@ -137,10 +137,8 @@ def main(): parser_add_project_token = sub_project_tokens.add_parser('add', help='Add project token') parser_add_project_token.add_argument('--d', required=True, type=str, help='Description of project token you want to add') - parser_add_project_token.add_argument('--scope_push', required=False, action='store_true', - help='Scope push') - parser_add_project_token.add_argument('--scope_pull', required=False, action='store_true', - help='Scope pull') + parser_add_project_token.add_argument('--scope_push', required=False, default=True, type=str2bool, help='Scope push') + parser_add_project_token.add_argument('--scope_pull', required=False, default=True, type=str2bool, help='Scope pull') parser_add_project_token.set_defaults(func=project.add_project_token) parser_remove_project_token = sub_project_tokens.add_parser('remove', help='Remove project token') @@ -197,3 +195,12 @@ def main(): # Run command args.func(args) + + +def str2bool(v): + if v.lower() in ('yes', 'true', 't', 'y', '1'): + return True + elif v.lower() in ('no', 'false', 'f', 'n', '0'): + return False + else: + raise argparse.ArgumentTypeError('Boolean value expected.') diff --git a/infraboxcli/dashboard/project.py b/infraboxcli/dashboard/project.py index 5069784..2de933b 100644 --- a/infraboxcli/dashboard/project.py +++ b/infraboxcli/dashboard/project.py @@ -86,6 +86,7 @@ def list_project_tokens(args): def add_project_token(args): infraboxcli.env.check_env_cli_token(args) url = url_base + args.project_id + '/tokens' + data = { 'description': args.d, 'scope_push': args.scope_push, @@ -107,4 +108,6 @@ def delete_project_token(args): url = url_base + args.project_id + '/tokens/' + args.id response = delete(url, get_user_headers()) + print(response.json()['message']) + return response From 5f843f2fedf00ee1d6c990d1f01e6a6bb6e50a27 Mon Sep 17 00:00:00 2001 From: Kirill Abramov Date: Mon, 9 Apr 2018 17:45:30 +0200 Subject: [PATCH 07/19] New CLI API: Refactoring and typo fixes. --- infraboxcli/__init__.py | 28 ++++++++++++++-------------- infraboxcli/dashboard/project.py | 4 ++-- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/infraboxcli/__init__.py b/infraboxcli/__init__.py index 60b1ed0..d68b4d6 100644 --- a/infraboxcli/__init__.py +++ b/infraboxcli/__init__.py @@ -104,46 +104,46 @@ def main(): parser_list_collaborators = sub_collaborators.add_parser('list', help='Show collaborators list') parser_list_collaborators.set_defaults(func=project.list_collaborators) - parser_add_collaborator = sub_collaborators.add_parser('add', help='Add collaborator') + parser_add_collaborator = sub_collaborators.add_parser('add', help='Add a collaborator') parser_add_collaborator.add_argument('--username', required=True, type=str, - help='Username of collaborator you want to add') + help='Username of the collaborator you want to add') parser_add_collaborator.set_defaults(func=project.add_collaborator) - parser_remove_collaborator = sub_collaborators.add_parser('remove', help='Remove collaborator') + parser_remove_collaborator = sub_collaborators.add_parser('remove', help='Remove a collaborator') parser_remove_collaborator.add_argument('--username', required=True, type=str, - help='Username of collaborator you want to remove') + help='Username of the collaborator you want to remove') parser_remove_collaborator.set_defaults(func=project.remove_collaborator) # Secrets parser_secrets = sub_parser.add_parser('secrets', help='Create or delete secrets') sub_secrets = parser_secrets.add_subparsers() - parser_create_secret = sub_secrets.add_parser('create', help='Create secret') - parser_create_secret.add_argument('--name', required=True, type=str, help='Name of your new secret') - parser_create_secret.add_argument('--value', required=True, type=str, help='Value of your new secret') + parser_create_secret = sub_secrets.add_parser('create', help='Create a secret') + parser_create_secret.add_argument('--name', required=True, type=str, help='Name of the secret') + parser_create_secret.add_argument('--value', required=True, type=str, help='Value of the secret') parser_create_secret.set_defaults(func=project.add_secret) - parser_delete_secret = sub_secrets.add_parser('delete', help='Delete secret') - parser_delete_secret.add_argument('--name', required=True, type=str, help='Name of secret you want to delete') + parser_delete_secret = sub_secrets.add_parser('delete', help='Delete a secret') + parser_delete_secret.add_argument('--name', required=True, type=str, help='Name of the secret you want to delete') parser_delete_secret.set_defaults(func=project.delete_secret) # Tokens parsers_project_tokens = sub_parser.add_parser('project-token', help='Manage your project tokens') sub_project_tokens = parsers_project_tokens.add_subparsers() - parser_list_project_tokens = sub_project_tokens.add_parser('list', help='Show your all project tokens') + parser_list_project_tokens = sub_project_tokens.add_parser('list', help='Show all your project tokens') parser_list_project_tokens.set_defaults(func=project.list_project_tokens) - parser_add_project_token = sub_project_tokens.add_parser('add', help='Add project token') + parser_add_project_token = sub_project_tokens.add_parser('create', help='Create a project token') parser_add_project_token.add_argument('--d', required=True, type=str, - help='Description of project token you want to add') + help='Description of the project token you want to create') parser_add_project_token.add_argument('--scope_push', required=False, default=True, type=str2bool, help='Scope push') parser_add_project_token.add_argument('--scope_pull', required=False, default=True, type=str2bool, help='Scope pull') parser_add_project_token.set_defaults(func=project.add_project_token) - parser_remove_project_token = sub_project_tokens.add_parser('remove', help='Remove project token') + parser_remove_project_token = sub_project_tokens.add_parser('delete', help='Delete a project token') parser_remove_project_token.add_argument('--id', required=True, type=str, - help='Id of project token you want to remove') + help='Id of the project token you want to delete') parser_remove_project_token.set_defaults(func=project.delete_project_token) # User diff --git a/infraboxcli/dashboard/project.py b/infraboxcli/dashboard/project.py index 2de933b..42d7f50 100644 --- a/infraboxcli/dashboard/project.py +++ b/infraboxcli/dashboard/project.py @@ -20,9 +20,9 @@ def list_collaborators(args): print('=== Collaborators ===') for collaborator in response.json(): - print('---') print('Username: %s' % collaborator['username']) print('E-mail: %s' % collaborator['email']) + print('---') return response @@ -74,11 +74,11 @@ def list_project_tokens(args): response = get(url, get_user_headers()) print('=== Project tokens ===') for project_token in response.json(): - print('---') print('Description: %s' % project_token['description']) print('Id: %s' % project_token['id']) print('Scope push: %s' % project_token['scope_push']) print('Scope pull: %s' % project_token['scope_pull']) + print('---') return response From df4b6ed0b04cb9a87ec3e9200c741ef9969f6190 Mon Sep 17 00:00:00 2001 From: Kirill Abramov Date: Tue, 10 Apr 2018 17:53:46 +0200 Subject: [PATCH 08/19] New CLI API: minor improvements. Refactoring. * Added more error handling capabilities to the CLI. --- infraboxcli/dashboard/project.py | 10 +++++++--- infraboxcli/dashboard/user.py | 12 ++++++++++-- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/infraboxcli/dashboard/project.py b/infraboxcli/dashboard/project.py index 42d7f50..7933ca0 100644 --- a/infraboxcli/dashboard/project.py +++ b/infraboxcli/dashboard/project.py @@ -1,5 +1,5 @@ from infraboxcli.dashboard.cli_client import get, post, delete -from infraboxcli.dashboard.user import id_by_neme, get_user_headers +from infraboxcli.dashboard.user import get_id_by_name, get_user_headers import infraboxcli.env url_base = 'http://localhost:8080/api/v1/projects/' @@ -40,9 +40,13 @@ def add_collaborator(args): def remove_collaborator(args): infraboxcli.env.check_env_cli_token(args) - collaborator_id = id_by_neme(args.username) - url = url_base + args.project_id + '/collaborators/' + collaborator_id[1:-2] + try: + collaborator_id = get_id_by_name(args.username) + except: + return + + url = url_base + args.project_id + '/collaborators/' + collaborator_id response = delete(url, get_user_headers()) print(response.json()['message']) diff --git a/infraboxcli/dashboard/user.py b/infraboxcli/dashboard/user.py index 45b7268..0067ffa 100644 --- a/infraboxcli/dashboard/user.py +++ b/infraboxcli/dashboard/user.py @@ -1,4 +1,5 @@ import getpass +import json from infraboxcli.dashboard.cli_client import post, get from infraboxcli.dashboard.external import load_current_user_token, save_user_token @@ -22,8 +23,15 @@ def login(args): return response -def id_by_neme(username): +def get_id_by_name(username): url = url_base + "id/" + username response = get(url, headers=get_user_headers()) - return response.text + if response.status_code != 200: + print(response.json()['message']) + raise Exception(response.status_code) + + # remove quotes + user_id = response.json()['data']['user_id'] + + return user_id From 3f57f97b30149f24c8da22f633289278ab65f976 Mon Sep 17 00:00:00 2001 From: Kirill Abramov Date: Wed, 11 Apr 2018 15:13:42 +0200 Subject: [PATCH 09/19] New CLI API: project-token API improvements. * Added possibility to remove project-token by providing token's description; * Added some more meaningful messages in case of errors on the server side. --- infraboxcli/__init__.py | 4 +++- infraboxcli/dashboard/project.py | 40 ++++++++++++++++++++++++++++++-- 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/infraboxcli/__init__.py b/infraboxcli/__init__.py index d68b4d6..1a5f453 100644 --- a/infraboxcli/__init__.py +++ b/infraboxcli/__init__.py @@ -142,8 +142,10 @@ def main(): parser_add_project_token.set_defaults(func=project.add_project_token) parser_remove_project_token = sub_project_tokens.add_parser('delete', help='Delete a project token') - parser_remove_project_token.add_argument('--id', required=True, type=str, + parser_remove_project_token.add_argument('--id', required=False, type=str, help='Id of the project token you want to delete') + parser_remove_project_token.add_argument('--d', required=False, type=str, + help='Description of the project token you want to delete') parser_remove_project_token.set_defaults(func=project.delete_project_token) # User diff --git a/infraboxcli/dashboard/project.py b/infraboxcli/dashboard/project.py index 7933ca0..e302a57 100644 --- a/infraboxcli/dashboard/project.py +++ b/infraboxcli/dashboard/project.py @@ -87,6 +87,18 @@ def list_project_tokens(args): return response +def get_project_token_id_by_description(args): + url = url_base + args.project_id + '/tokens/' + args.d + + response = get(url, get_user_headers()) + + if response.status_code != 200: + print(response.json()['message']) + return + + return response.json()['data']['token_id'] + + def add_project_token(args): infraboxcli.env.check_env_cli_token(args) url = url_base + args.project_id + '/tokens' @@ -99,15 +111,39 @@ def add_project_token(args): response = post(url, data, get_user_headers()) + if response.status_code != 200: + print(response.json()['message']) + return + # Print project token to the CLI - print("=== Authentication Token ===") - print("Please save your token at a secure place. We will not show it to you again.\n\n") + print('=== Authentication Token ===') + print('Please save your token at a secure place. We will not show it to you again.\n\n') print(response.json()['data']['token']) return response def delete_project_token(args): + if args.id: + delete_project_token_by_id(args) + elif args.d: + delete_project_token_by_description(args) + else: + print('Please, provide either token id or description.') + + +def delete_project_token_by_description(args): + infraboxcli.env.check_env_cli_token(args) + token_id = get_project_token_id_by_description(args) + + if not token_id: + return + + args.id = token_id + return delete_project_token_by_id(args) + + +def delete_project_token_by_id(args): infraboxcli.env.check_env_cli_token(args) url = url_base + args.project_id + '/tokens/' + args.id response = delete(url, get_user_headers()) From 998959b7e1830e2169289e97fdaad82c9d958539 Mon Sep 17 00:00:00 2001 From: Kirill Abramov Date: Wed, 11 Apr 2018 15:55:06 +0200 Subject: [PATCH 10/19] (ref #30) New CLI API: improvements. * Added possibility to specify needed memory and cpu consumptions for `infrabox run` command; * New limits taken from the command line args are applied to each job taken from current infrabox.json file. --- infraboxcli/__init__.py | 5 ++++- infraboxcli/run.py | 9 +++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/infraboxcli/__init__.py b/infraboxcli/__init__.py index 1a5f453..9243175 100644 --- a/infraboxcli/__init__.py +++ b/infraboxcli/__init__.py @@ -93,7 +93,10 @@ def main(): parser_run.add_argument("--local-cache", required=False, type=str, default="/tmp/{}/infrabox/local-cache".format(username), help="Path to the local cache") - + parser_run.add_argument("--memory", required=False, type=float, + help="Override a memory consumption for your job") + parser_run.add_argument("--cpu", required=False, type=float, + help="Override a cpu consumption for your job") parser_run.set_defaults(no_rm=False) parser_run.set_defaults(func=run) diff --git a/infraboxcli/run.py b/infraboxcli/run.py index 8620609..205cdf5 100644 --- a/infraboxcli/run.py +++ b/infraboxcli/run.py @@ -447,6 +447,15 @@ def run(args): # validate infrabox.json data = load_infrabox_json(args.infrabox_json) + if args.memory: + print('WARNING: only int resource limits are supported right now. Using rounded int instead of provided value.') + for job in data['jobs']: + job['resources']['limits']['memory'] = int(args.memory) + if args.cpu: + print('WARNING: only int resource limits are supported right now. Using rounded int instead of provided value.') + for job in data['jobs']: + job['resources']['limits']['cpu'] = int(args.cpu) + jobs = get_job_list(data, args, infrabox_context=args.project_root) if not args.job_name: From 08832e511f72f4deb08126486871ddd1d1a35c5b Mon Sep 17 00:00:00 2001 From: Kirill Abramov Date: Thu, 12 Apr 2018 17:07:37 +0200 Subject: [PATCH 11/19] New CLI API: replaced dummy local api url. --- infraboxcli/dashboard/project.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/infraboxcli/dashboard/project.py b/infraboxcli/dashboard/project.py index e302a57..6ebaaaf 100644 --- a/infraboxcli/dashboard/project.py +++ b/infraboxcli/dashboard/project.py @@ -2,12 +2,12 @@ from infraboxcli.dashboard.user import get_id_by_name, get_user_headers import infraboxcli.env -url_base = 'http://localhost:8080/api/v1/projects/' +api_projects_endpoint_url = '/api/v1/projects/' def delete_project(args): infraboxcli.env.check_env_cli_token(args) - url = url_base + args.project_id + url = args.url + api_projects_endpoint_url + args.project_id response = get(url, get_user_headers()) return response @@ -15,7 +15,7 @@ def delete_project(args): def list_collaborators(args): infraboxcli.env.check_env_cli_token(args) - url = url_base + args.project_id + '/collaborators' + url = args.url + api_projects_endpoint_url + args.project_id + '/collaborators' response = get(url, get_user_headers()) print('=== Collaborators ===') @@ -29,7 +29,7 @@ def list_collaborators(args): def add_collaborator(args): infraboxcli.env.check_env_cli_token(args) - url = url_base + args.project_id + '/collaborators' + url = args.url + api_projects_endpoint_url + args.project_id + '/collaborators' data = {'username': args.username} response = post(url, data, get_user_headers()) @@ -46,7 +46,7 @@ def remove_collaborator(args): except: return - url = url_base + args.project_id + '/collaborators/' + collaborator_id + url = args.url + api_projects_endpoint_url + args.project_id + '/collaborators/' + collaborator_id response = delete(url, get_user_headers()) print(response.json()['message']) @@ -55,7 +55,7 @@ def remove_collaborator(args): def add_secret(args): infraboxcli.env.check_env_cli_token(args) - url = url_base + args.project_id + '/secrets' + url = args.url + api_projects_endpoint_url + args.project_id + '/secrets' data = {'name': args.name, 'value': args.value} response = post(url, data, get_user_headers()) @@ -65,7 +65,7 @@ def add_secret(args): def delete_secret(args): infraboxcli.env.check_env_cli_token(args) - url = url_base + args.project_id + '/secrets/' + args.name + url = args.url + api_projects_endpoint_url + args.project_id + '/secrets/' + args.name response = delete(url, get_user_headers()) return response @@ -73,7 +73,7 @@ def delete_secret(args): def list_project_tokens(args): infraboxcli.env.check_env_cli_token(args) - url = url_base + args.project_id + '/tokens' + url = args.url + api_projects_endpoint_url + args.project_id + '/tokens' response = get(url, get_user_headers()) print('=== Project tokens ===') @@ -88,7 +88,7 @@ def list_project_tokens(args): def get_project_token_id_by_description(args): - url = url_base + args.project_id + '/tokens/' + args.d + url = args.url + api_projects_endpoint_url + args.project_id + '/tokens/' + args.d response = get(url, get_user_headers()) @@ -101,7 +101,7 @@ def get_project_token_id_by_description(args): def add_project_token(args): infraboxcli.env.check_env_cli_token(args) - url = url_base + args.project_id + '/tokens' + url = args.url + api_projects_endpoint_url + args.project_id + '/tokens' data = { 'description': args.d, @@ -145,7 +145,7 @@ def delete_project_token_by_description(args): def delete_project_token_by_id(args): infraboxcli.env.check_env_cli_token(args) - url = url_base + args.project_id + '/tokens/' + args.id + url = args.url + api_projects_endpoint_url + args.project_id + '/tokens/' + args.id response = delete(url, get_user_headers()) print(response.json()['message']) From bf0d25d97e8e71d3fd3ae2d035427040378ba0c4 Mon Sep 17 00:00:00 2001 From: Kirill Abramov Date: Mon, 16 Apr 2018 17:35:01 +0200 Subject: [PATCH 12/19] New CLI API: project-tokens' deletion refactoring. * Instead of requesting project-token's id by it's name from API, we request all project-tokens from API, and then process it by ourselves. * Changed cli argument from 'd' to 'description'. --- infraboxcli/__init__.py | 3 ++- infraboxcli/dashboard/project.py | 31 ++++++++++++++++--------------- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/infraboxcli/__init__.py b/infraboxcli/__init__.py index 9243175..dfa9b01 100644 --- a/infraboxcli/__init__.py +++ b/infraboxcli/__init__.py @@ -135,6 +135,7 @@ def main(): sub_project_tokens = parsers_project_tokens.add_subparsers() parser_list_project_tokens = sub_project_tokens.add_parser('list', help='Show all your project tokens') + parser_list_project_tokens.add_argument('--verbose', required=False, default=True, type=str2bool) parser_list_project_tokens.set_defaults(func=project.list_project_tokens) parser_add_project_token = sub_project_tokens.add_parser('create', help='Create a project token') @@ -147,7 +148,7 @@ def main(): parser_remove_project_token = sub_project_tokens.add_parser('delete', help='Delete a project token') parser_remove_project_token.add_argument('--id', required=False, type=str, help='Id of the project token you want to delete') - parser_remove_project_token.add_argument('--d', required=False, type=str, + parser_remove_project_token.add_argument('--description', required=False, type=str, help='Description of the project token you want to delete') parser_remove_project_token.set_defaults(func=project.delete_project_token) diff --git a/infraboxcli/dashboard/project.py b/infraboxcli/dashboard/project.py index 6ebaaaf..14475a5 100644 --- a/infraboxcli/dashboard/project.py +++ b/infraboxcli/dashboard/project.py @@ -76,27 +76,27 @@ def list_project_tokens(args): url = args.url + api_projects_endpoint_url + args.project_id + '/tokens' response = get(url, get_user_headers()) - print('=== Project tokens ===') - for project_token in response.json(): - print('Description: %s' % project_token['description']) - print('Id: %s' % project_token['id']) - print('Scope push: %s' % project_token['scope_push']) - print('Scope pull: %s' % project_token['scope_pull']) - print('---') + if args.verbose: + print('=== Project tokens ===') + for project_token in response.json(): + print('Description: %s' % project_token['description']) + print('Id: %s' % project_token['id']) + print('Scope push: %s' % project_token['scope_push']) + print('Scope pull: %s' % project_token['scope_pull']) + print('---') return response def get_project_token_id_by_description(args): - url = args.url + api_projects_endpoint_url + args.project_id + '/tokens/' + args.d - - response = get(url, get_user_headers()) + args.verbose = False + all_project_tokens = list_project_tokens(args).json() - if response.status_code != 200: - print(response.json()['message']) - return + for project_token in all_project_tokens: + if args.description == project_token['description']: + return project_token['id'] - return response.json()['data']['token_id'] + return None def add_project_token(args): @@ -126,7 +126,7 @@ def add_project_token(args): def delete_project_token(args): if args.id: delete_project_token_by_id(args) - elif args.d: + elif args.description: delete_project_token_by_description(args) else: print('Please, provide either token id or description.') @@ -137,6 +137,7 @@ def delete_project_token_by_description(args): token_id = get_project_token_id_by_description(args) if not token_id: + print('Token with such a description does not exist.') return args.id = token_id From 732e0d13bb2074c8130d86727e890a904673cda2 Mon Sep 17 00:00:00 2001 From: Kirill Abramov Date: Tue, 17 Apr 2018 15:59:15 +0200 Subject: [PATCH 13/19] Updated .gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 5ab90b2..47076d2 100644 --- a/.gitignore +++ b/.gitignore @@ -104,3 +104,6 @@ ENV/ # mypy .mypy_cache/ + +# exuberant ctags +tags From 6fffbf2c4f0215d0e8e80f5a1b5ad0377b131311 Mon Sep 17 00:00:00 2001 From: Kirill Abramov Date: Tue, 17 Apr 2018 16:31:25 +0200 Subject: [PATCH 14/19] New CLI API: replaced dummy local API url. --- infraboxcli/dashboard/user.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/infraboxcli/dashboard/user.py b/infraboxcli/dashboard/user.py index 0067ffa..45369b5 100644 --- a/infraboxcli/dashboard/user.py +++ b/infraboxcli/dashboard/user.py @@ -4,7 +4,7 @@ from infraboxcli.dashboard.cli_client import post, get from infraboxcli.dashboard.external import load_current_user_token, save_user_token -url_base = 'http://localhost:8080/api/v1/user/' +api_endpoint_url = '/api/v1/' def get_user_token(): return load_current_user_token() @@ -18,13 +18,13 @@ def login(args): data = {"email": email, "password": password} - url = 'http://localhost:8080/api/v1/account/login' + url = args.url + api_endpoint_url + 'account/login' response = post(url, data, cookies_handler=save_user_token) return response def get_id_by_name(username): - url = url_base + "id/" + username + url = args.url + api_endpoint_url + "user/id/" + username response = get(url, headers=get_user_headers()) if response.status_code != 200: From 73631f8b9164018a3ac0ef69893476e98ed85b49 Mon Sep 17 00:00:00 2001 From: Kirill Abramov Date: Tue, 17 Apr 2018 16:58:55 +0200 Subject: [PATCH 15/19] New CLI API: collaborators' deletion refactoring. * Instead of requesting user id by collaborator's name from API, we request all collaborators from API, and then process it by ourselves. * Stylystic fixes. --- infraboxcli/__init__.py | 1 + infraboxcli/dashboard/project.py | 26 +++++++++++++++++--------- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/infraboxcli/__init__.py b/infraboxcli/__init__.py index dfa9b01..0371b79 100644 --- a/infraboxcli/__init__.py +++ b/infraboxcli/__init__.py @@ -105,6 +105,7 @@ def main(): sub_collaborators = parser_collaborators.add_subparsers() parser_list_collaborators = sub_collaborators.add_parser('list', help='Show collaborators list') + parser_list_collaborators.add_argument('--verbose', required=False, default=True, type=str2bool) parser_list_collaborators.set_defaults(func=project.list_collaborators) parser_add_collaborator = sub_collaborators.add_parser('add', help='Add a collaborator') diff --git a/infraboxcli/dashboard/project.py b/infraboxcli/dashboard/project.py index 14475a5..029492e 100644 --- a/infraboxcli/dashboard/project.py +++ b/infraboxcli/dashboard/project.py @@ -18,11 +18,12 @@ def list_collaborators(args): url = args.url + api_projects_endpoint_url + args.project_id + '/collaborators' response = get(url, get_user_headers()) - print('=== Collaborators ===') - for collaborator in response.json(): - print('Username: %s' % collaborator['username']) - print('E-mail: %s' % collaborator['email']) - print('---') + if args.verbose: + print('=== Collaborators ===') + for collaborator in response.json(): + print('Username: %s' % collaborator['username']) + print('E-mail: %s' % collaborator['email']) + print('---') return response @@ -30,7 +31,7 @@ def list_collaborators(args): def add_collaborator(args): infraboxcli.env.check_env_cli_token(args) url = args.url + api_projects_endpoint_url + args.project_id + '/collaborators' - data = {'username': args.username} + data = { 'username': args.username } response = post(url, data, get_user_headers()) print(response.json()['message']) @@ -41,9 +42,16 @@ def add_collaborator(args): def remove_collaborator(args): infraboxcli.env.check_env_cli_token(args) - try: - collaborator_id = get_id_by_name(args.username) - except: + args.verbose = False + all_project_collaborators = list_collaborators(args).json() + collaborator_id = None + for collaborator in all_project_collaborators: + if collaborator['username'] == args.username: + collaborator_id = collaborator['id'] + break + + if collaborator_id is None: + print('Specified user is not in collaborators list.') return url = args.url + api_projects_endpoint_url + args.project_id + '/collaborators/' + collaborator_id From c009ab8ca98e850eea0d87aa4452601ea8af0576 Mon Sep 17 00:00:00 2001 From: Kirill Abramov Date: Tue, 17 Apr 2018 17:06:00 +0200 Subject: [PATCH 16/19] New CLI API: project-token API changes. * Temporarily disabled possibility to specify scope_push and scope_pull parameters for project-token until this functionality is implemented in API. * Changed CLI argument on token create from 'd' to 'description'. --- infraboxcli/__init__.py | 7 ++++--- infraboxcli/dashboard/project.py | 10 +++++++--- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/infraboxcli/__init__.py b/infraboxcli/__init__.py index 0371b79..4ed0a1e 100644 --- a/infraboxcli/__init__.py +++ b/infraboxcli/__init__.py @@ -140,10 +140,11 @@ def main(): parser_list_project_tokens.set_defaults(func=project.list_project_tokens) parser_add_project_token = sub_project_tokens.add_parser('create', help='Create a project token') - parser_add_project_token.add_argument('--d', required=True, type=str, + parser_add_project_token.add_argument('--description', required=True, type=str, help='Description of the project token you want to create') - parser_add_project_token.add_argument('--scope_push', required=False, default=True, type=str2bool, help='Scope push') - parser_add_project_token.add_argument('--scope_pull', required=False, default=True, type=str2bool, help='Scope pull') + #TODO when scope push/pull functionality is implemented, uncomment following 2 lines + #parser_add_project_token.add_argument('--scope_push', required=False, default=True, type=str2bool, help='Scope push') + #parser_add_project_token.add_argument('--scope_pull', required=False, default=True, type=str2bool, help='Scope pull') parser_add_project_token.set_defaults(func=project.add_project_token) parser_remove_project_token = sub_project_tokens.add_parser('delete', help='Delete a project token') diff --git a/infraboxcli/dashboard/project.py b/infraboxcli/dashboard/project.py index 029492e..f270767 100644 --- a/infraboxcli/dashboard/project.py +++ b/infraboxcli/dashboard/project.py @@ -112,9 +112,13 @@ def add_project_token(args): url = args.url + api_projects_endpoint_url + args.project_id + '/tokens' data = { - 'description': args.d, - 'scope_push': args.scope_push, - 'scope_pull': args.scope_pull + 'description': args.description, + #TODO when scope push/pull functionality is implemented, + # delete following 2 lines and uncomment next 2 lines + 'scope_push': True, + 'scope_pull': True + #'scope_push': args.scope_push, + #'scope_pull': args.scope_pull } response = post(url, data, get_user_headers()) From 5e7419577f71e193ac61606b68c36f7016dc364b Mon Sep 17 00:00:00 2001 From: Kirill Abramov Date: Tue, 17 Apr 2018 17:30:25 +0200 Subject: [PATCH 17/19] Description fixes. --- infraboxcli/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/infraboxcli/__init__.py b/infraboxcli/__init__.py index 4ed0a1e..d5cf6b8 100644 --- a/infraboxcli/__init__.py +++ b/infraboxcli/__init__.py @@ -94,9 +94,9 @@ def main(): default="/tmp/{}/infrabox/local-cache".format(username), help="Path to the local cache") parser_run.add_argument("--memory", required=False, type=float, - help="Override a memory consumption for your job") + help="Override a memory limit for your job") parser_run.add_argument("--cpu", required=False, type=float, - help="Override a cpu consumption for your job") + help="Override a cpu limit for your job") parser_run.set_defaults(no_rm=False) parser_run.set_defaults(func=run) From 6664d13597fecc797bb34729e9c8e7bb1be363b6 Mon Sep 17 00:00:00 2001 From: Kirill Abramov Date: Tue, 17 Apr 2018 17:31:39 +0200 Subject: [PATCH 18/19] Removed redundant and deprecated method. --- infraboxcli/dashboard/project.py | 2 +- infraboxcli/dashboard/user.py | 13 ------------- 2 files changed, 1 insertion(+), 14 deletions(-) diff --git a/infraboxcli/dashboard/project.py b/infraboxcli/dashboard/project.py index f270767..75b52eb 100644 --- a/infraboxcli/dashboard/project.py +++ b/infraboxcli/dashboard/project.py @@ -1,5 +1,5 @@ from infraboxcli.dashboard.cli_client import get, post, delete -from infraboxcli.dashboard.user import get_id_by_name, get_user_headers +from infraboxcli.dashboard.user import get_user_headers import infraboxcli.env api_projects_endpoint_url = '/api/v1/projects/' diff --git a/infraboxcli/dashboard/user.py b/infraboxcli/dashboard/user.py index 45369b5..59fd5cb 100644 --- a/infraboxcli/dashboard/user.py +++ b/infraboxcli/dashboard/user.py @@ -22,16 +22,3 @@ def login(args): response = post(url, data, cookies_handler=save_user_token) return response - -def get_id_by_name(username): - url = args.url + api_endpoint_url + "user/id/" + username - response = get(url, headers=get_user_headers()) - - if response.status_code != 200: - print(response.json()['message']) - raise Exception(response.status_code) - - # remove quotes - user_id = response.json()['data']['user_id'] - - return user_id From 338a400ba2121761c6634e6510dddce8145fddb6 Mon Sep 17 00:00:00 2001 From: Kirill Abramov Date: Tue, 17 Apr 2018 17:48:46 +0200 Subject: [PATCH 19/19] New CLI API: login API improved. * Added possibility to specify email and password as arguments; * It's not allowed to pass password without email as argument. --- infraboxcli/__init__.py | 2 ++ infraboxcli/dashboard/user.py | 14 +++++++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/infraboxcli/__init__.py b/infraboxcli/__init__.py index d5cf6b8..69145e9 100644 --- a/infraboxcli/__init__.py +++ b/infraboxcli/__init__.py @@ -156,6 +156,8 @@ def main(): # User parser_login = sub_parser.add_parser('login', help='Login to infrabox') + parser_login.add_argument('--email', required=False, default=None, type=str, help='Email of the user') + parser_login.add_argument('--password', required=False, default=None, type=str, help='Password of the user') parser_login.set_defaults(func=user.login) # Parse args diff --git a/infraboxcli/dashboard/user.py b/infraboxcli/dashboard/user.py index 59fd5cb..6e26431 100644 --- a/infraboxcli/dashboard/user.py +++ b/infraboxcli/dashboard/user.py @@ -13,10 +13,18 @@ def get_user_headers(): return {'Authorization': 'token %s' % get_user_token()} def login(args): - email = raw_input("Email: ") - password = getpass.getpass('Password: ') + email = args.email + password = args.password - data = {"email": email, "password": password} + if email is None: + email = raw_input("Email: ") + # Don't allow to pass password without email + password = None + + if password is None: + password = getpass.getpass('Password: ') + + data = { "email": email, "password": password} url = args.url + api_endpoint_url + 'account/login' response = post(url, data, cookies_handler=save_user_token)