Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
579cf3b
Revert "Revert "Merge pull request #31 from InfraBox/cli_project_feat…
sept-en Apr 25, 2018
1be3377
New CLI API: login api improvements.
sept-en Apr 25, 2018
7f35852
Bug fixes. Warning msgs are written to logger.
sept-en Apr 26, 2018
66a9003
Messages are now printed into logs. Logger improvements.
sept-en Apr 26, 2018
a2c49aa
New CLI API: secrets API improvements.
sept-en Apr 26, 2018
8493fa8
New CLI API: project requests imrpovements.
sept-en Apr 26, 2018
5848543
New CLI API: added basic project API. Refactoring.
sept-en Apr 26, 2018
7bcc0f7
New CLI API: project API improvements.
sept-en Apr 26, 2018
bffc481
Project API: display if project is public or not.
sept-en Apr 27, 2018
85bb25a
Project API: added create and delete project cmd.
sept-en Apr 27, 2018
6c68a30
Refactoring
sept-en May 2, 2018
98838c9
Project API: new argument added. Refactoring.
sept-en May 2, 2018
c715e13
Project API: refactoring and fixes.
sept-en May 2, 2018
d148f46
Login API: major improvements. Other fixes.
sept-en May 4, 2018
31af2b9
Refactoring.
sept-en May 4, 2018
8d71d05
Remotes API: added `list_remotes` feature.
sept-en May 7, 2018
d95b9f1
Config API: added `set-current-project` command.
sept-en May 7, 2018
f430b11
Config API: minor improvements and refactoring.
sept-en May 8, 2018
3dead8f
Implemented `infrabox logout` feature.
sept-en May 8, 2018
aa3bc67
Fixed python3 import modules.
sept-en May 9, 2018
2dac918
Login API: added url validation.
sept-en May 9, 2018
214298d
Improved HTTP errors handling.
sept-en May 9, 2018
7c679c4
Minor fixes.
sept-en May 9, 2018
53ea1d5
Added `project status` feature.
sept-en May 9, 2018
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ __pycache__/

*.swp

.idea/

# C extensions
*.so

Expand Down Expand Up @@ -102,3 +104,6 @@ ENV/

# mypy
.mypy_cache/

# exuberant ctags
tags
155 changes: 150 additions & 5 deletions infraboxcli/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,19 @@
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.validate import validate

from infraboxcli.dashboard import user
from infraboxcli.dashboard import project
from infraboxcli.dashboard import remotes
from infraboxcli.dashboard import local_config

version = '0.6.4'

Expand Down Expand Up @@ -94,13 +99,144 @@ 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 limit for your job")
parser_run.add_argument("--cpu", required=False, type=float,
help="Override a cpu limit for your job")
parser_run.set_defaults(no_rm=False)
parser_run.set_defaults(func=run)

# Project
parser_project = sub_parser.add_parser('project', help='Manage your project')
parser_project.add_argument('--project-name', required=False, type=str)
parser_project.set_defaults(project_command=True)
sub_project = parser_project.add_subparsers(dest='project')

# Project list
parser_projects_list = sub_project.add_parser('list', help='Get a list of all your projects')
parser_projects_list.add_argument('--verbose', required=False, default=True, type=str2bool)
parser_projects_list.set_defaults(func=project.list_projects)

# Project status
parser_projects_list = sub_project.add_parser('status', help='Get some info about your current project')
parser_projects_list.add_argument('--verbose', required=False, default=True, type=str2bool)
parser_projects_list.set_defaults(func=project.print_status)

# Create project
parser_project_create = sub_project.add_parser('create', help='Create a new project')
parser_project_create.add_argument('--name', required=True, type=str,
help='Name of the project you want to create')
parser_project_create.add_argument('--type', required=True, type=str,
help='Name of the project { upload, github, gerrit } you want to create')
parser_project_create.add_argument('--public', required=False, default=False, action='store_true',
help='Make your project public')
parser_project_create.add_argument('--private', required=False, default=False, action='store_true',
help='Make your project private')
parser_project_create.set_defaults(func=project.create_project)

parser_project_delete = sub_project.add_parser('delete', help='Delete a project')
parser_project_delete.add_argument('--name', required=False, type=str,
help='Name of the project you want to delete')
parser_project_delete.add_argument('--id', required=False, type=str,
help='Id of the project you want to delete')
parser_project_delete.set_defaults(func=project.delete_project)

# Collaborators
parser_collaborators = sub_project.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.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')
parser_add_collaborator.add_argument('--username', required=True, type=str,
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 a collaborator')
parser_remove_collaborator.add_argument('--username', required=True, type=str,
help='Username of the collaborator you want to remove')
parser_remove_collaborator.set_defaults(func=project.remove_collaborator)

# Secrets
parser_secrets = sub_project.add_parser('secrets', help='Create or delete secrets')
sub_secrets = parser_secrets.add_subparsers()

parser_list_secrets = sub_secrets.add_parser('list', help='Show all your secrets')
parser_list_secrets.add_argument('--verbose', required=False, default=True, type=str2bool)
parser_list_secrets.set_defaults(func=project.list_secrets)

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 a secret')
parser_delete_secret.add_argument('--name', required=False, type=str,
help='Name of the secret you want to delete')
parser_delete_secret.add_argument('--id', required=False, type=str,
help='Id of the secret you want to delete')
parser_delete_secret.set_defaults(func=project.delete_secret)

# Tokens
parsers_project_tokens = sub_project.add_parser('tokens', 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 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')
parser_add_project_token.add_argument('--description', required=True, type=str,
help='Description of the project token you want to create')
#TODO<Steffen> 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')
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('--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)

# Login
parser_login = sub_parser.add_parser('login', help='Login to infrabox')
parser_login.add_argument('remote_url', nargs='?', type=str, help='Name of remote')
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)

# Logout
parser_logout = sub_parser.add_parser('logout', help='Logout from current remote')
parser_logout.set_defaults(func=user.logout)

# Config
parser_config = sub_parser.add_parser('config', help='Configure your infrabox')
sub_config = parser_config.add_subparsers(dest='config')

parser_config_current_project = sub_config.add_parser('set-current-project', help='Set new current project')
parser_config_current_project.add_argument('project_name', nargs='?', type=str, help='Name of the project')
parser_config_current_project.set_defaults(func=local_config.set_current_project_name)

# Remotes
parser_remotes = sub_parser.add_parser('remotes', help='Current remotes')
sub_remotes = parser_remotes.add_subparsers()
parser_remotes_list = sub_remotes.add_parser('list', help='Show your all remotes')
parser_remotes_list.add_argument('--verbose', required=False, default=True, type=str2bool)
parser_remotes_list.set_defaults(func=remotes.list_remotes)

# Parse args
args = parser.parse_args()

# Prevent collision on `project-name` argument with `run`, `pull`, `push` commands
if 'project' in args or 'config' in args:
# Run command
args.func(args)
return

if 'version' in args:
print('infraboxcli %s' % version)
return
Expand Down Expand Up @@ -151,3 +287,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.')
Empty file.
51 changes: 51 additions & 0 deletions infraboxcli/dashboard/cli_client.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import requests

from infraboxcli.log import logger

session = requests.Session()
connection_error_message = 'Can\'t connect to the remote. Please, check your connection or remote url.'


def get(url, headers=None, cookies_handler=None, verify=None, timeout=60):
try:
response = session.get(url, headers=headers, verify=verify, timeout=timeout)
except requests.ConnectionError:
logger.error(connection_error_message)
exit(1)
except Exception as e:
logger.error(e.message)
exit(1)

if cookies_handler:
cookies_handler(url, session.cookies.get_dict())
return response


def post(url, data, headers=None, cookies_handler=None, verify=None, timeout=60):
try:
response = session.post(url, json=data, headers=headers, verify=verify, timeout=timeout)
except requests.ConnectionError:
logger.error(connection_error_message)
exit(1)
except Exception as e:
logger.error(e.message)
exit(1)

if cookies_handler:
cookies_handler(url, session.cookies.get_dict())
return response


def delete(url, headers=None, cookies_handler=None, verify=None, timeout=60):
try:
response = session.delete(url, headers=headers, verify=verify, timeout=timeout)
except requests.ConnectionError:
logger.error(connection_error_message)
exit(1)
except Exception as e:
logger.error(e.message)
exit(1)

if cookies_handler:
cookies_handler(url, session.cookies.get_dict())
return response
75 changes: 75 additions & 0 deletions infraboxcli/dashboard/external.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
from infraboxcli.log import logger
from pyinfrabox.utils import get_remote_url
from infraboxcli.dashboard import local_config


def save_user_token(url, cookies_dict):
config = local_config.get_config()
if config is None:
config = {}

config.setdefault('remotes', {})

is_new_remote_or_null = False
remote_url = get_remote_url(url)
if remote_url not in config['remotes'] \
or config['remotes'][remote_url] is None:
is_new_remote_or_null = True

# Decide what are we going to do if user entered invalid username or password:
# either use `current_user_token` if it exists or raise an error
allow_login_if_current_user_token_is_set = False

user_token = None
if 'token' not in cookies_dict:
if is_new_remote_or_null or not allow_login_if_current_user_token_is_set:
logger.error('Unauthorized: invalid username and/or password.')
exit(1)
else:
user_token = config['remotes'][remote_url]['current_user_token']
else:
user_token = cookies_dict['token']

config['current_remote'] = remote_url
config['remotes'].setdefault(remote_url, {})
config['remotes'][remote_url]['current_user_token'] = user_token

local_config.save_config(config)
logger.info('Logged in successfully.')


def get_current_user_token():
try:
config = local_config.get_config()

current_remote = config['current_remote']
if not current_remote:
raise

current_user_token = config['remotes'][current_remote]['current_user_token']
if current_user_token is None or not current_user_token:
raise

return current_user_token
except:
logger.error('Could not load current user token. Please, log in.')
exit(1)


def delete_current_user_token(args=None):
try:
config = local_config.get_config()

current_remote = config['current_remote']
if not current_remote:
raise

if not config['remotes'][current_remote]['current_user_token']:
return False

config['remotes'][current_remote]['current_user_token'] = ""
local_config.save_config(config)

return True
except:
return False
Loading