Removed bash-like python environment statements and fixed common error reporting to send errors to console logs and api calls correctly. also removes old tox.ini files which are unneeded after service collation from previous iteration of this project. Change-Id: I1727c317b8fa0e2abd8a959321f4366fdecb82c8
388 lines
18 KiB
Python
388 lines
18 KiB
Python
import argparse
|
|
import orm.base_config as base_config
|
|
import os
|
|
import requests
|
|
|
|
from . import cli_common
|
|
from . import config
|
|
|
|
|
|
class ResponseError(Exception):
|
|
pass
|
|
|
|
|
|
class ConnectionError(Exception):
|
|
pass
|
|
|
|
|
|
def add_to_parser(service_sub):
|
|
parser = service_sub.add_parser('rms', help='Resource Management Service',
|
|
formatter_class=lambda prog: argparse.
|
|
HelpFormatter(prog,
|
|
max_help_position=30,
|
|
width=120))
|
|
parser.add_argument('--version', action='version', version='%(prog)s 1.0')
|
|
parser.add_argument('--auth-region', type=str,
|
|
help='Region used for authentication',
|
|
default=get_environment_variable('auth-region'))
|
|
parser.add_argument('--keystone-auth-url', type=str,
|
|
help='keystone-auth-url used for authentication',
|
|
default=get_environment_variable('keystone-auth-url'))
|
|
parser.add_argument('--tenant-name', type=str,
|
|
help='Keystone user tenant name',
|
|
default=get_environment_variable('tenant-name'))
|
|
parser.add_argument('--username', type=str, help='Keystone user name',
|
|
default=get_environment_variable('username'))
|
|
parser.add_argument('--user-domain', type=str, help='Keystone user domain',
|
|
default=get_environment_variable('user-domain'))
|
|
parser.add_argument('--password', type=str, help='Keystone user password',
|
|
default=get_environment_variable('password'))
|
|
parser.add_argument('--project-domain', type=str,
|
|
help='Keystone project domain',
|
|
default=get_environment_variable('project-domain'))
|
|
parser.add_argument('--rms-base-url', type=str, help='RMS base URL',
|
|
default=get_environment_variable('rms-base-url'))
|
|
parser.add_argument('--tracking_id', type=str, help='tracking id')
|
|
parser.add_argument('--port', type=int, help='port number of RMS server')
|
|
parser.add_argument('--timeout', type=int,
|
|
help='request timeout in seconds (default: 10)')
|
|
parser.add_argument('-v', '--verbose', help='show details',
|
|
action="store_true")
|
|
parser.add_argument('-f', '--faceless',
|
|
help=argparse.SUPPRESS,
|
|
default=False,
|
|
action="store_true")
|
|
subparsers = parser.add_subparsers(dest='subcmd',
|
|
metavar='<subcommand> [-h] <args>')
|
|
|
|
clnt_hdr = '[<"X-RANGER-Client" header>] '
|
|
|
|
# get group
|
|
h1 = '<group_id>'
|
|
parser_get_group = subparsers.add_parser('get_group', help=h1)
|
|
parser_get_group.add_argument('client', **cli_common.ORM_CLIENT_KWARGS)
|
|
parser_get_group.add_argument('group_id', type=str, help=h1)
|
|
|
|
# get all groups
|
|
parser_list_groups = subparsers.add_parser('list_groups', help="")
|
|
parser_list_groups.add_argument('client', **cli_common.ORM_CLIENT_KWARGS)
|
|
|
|
# create group
|
|
h1 = '<data file group json file>'
|
|
parser_create_group = subparsers.add_parser('create_group',
|
|
help='%s %s' % (clnt_hdr, h1))
|
|
parser_create_group.add_argument('client', **cli_common.ORM_CLIENT_KWARGS)
|
|
parser_create_group.add_argument('datafile', type=argparse.FileType('r'),
|
|
help='<data file with new group JSON>')
|
|
|
|
# update group
|
|
h1, h2 = '<group_id>', '<group json file>'
|
|
parser_update_group = subparsers.add_parser('update_group',
|
|
help="%s %s %s" % (clnt_hdr,
|
|
h1, h2))
|
|
parser_update_group.add_argument('client', **cli_common.ORM_CLIENT_KWARGS)
|
|
parser_update_group.add_argument('group_id', help=h2)
|
|
parser_update_group.add_argument('datafile', type=argparse.FileType('r'),
|
|
help='<data file with updated group '
|
|
'JSON>')
|
|
|
|
# delete group
|
|
h1 = '<group id>'
|
|
parser_delete_group = subparsers.add_parser('delete_group',
|
|
help='%s %s' % (clnt_hdr, h1))
|
|
parser_delete_group.add_argument('client', **cli_common.ORM_CLIENT_KWARGS)
|
|
parser_delete_group.add_argument('group_id', type=str, help=h1)
|
|
|
|
# get region
|
|
h1, h2 = '<region_name_or_id>', '[--use_version <api version>]'
|
|
parser_get_region = subparsers.add_parser('get_region',
|
|
help='%s %s' % (h1, h2))
|
|
parser_get_region.add_argument('client', **cli_common.ORM_CLIENT_KWARGS)
|
|
parser_get_region.add_argument('--use_version', type=int,
|
|
help='<api version to use (1 or 2)>')
|
|
parser_get_region.add_argument('region_name_or_id', type=str, help=h1)
|
|
|
|
# update region
|
|
h1, h2 = '<region_id>', '<full region json file>'
|
|
parser_update_region = subparsers.add_parser('update_region',
|
|
help='%s %s %s' % (clnt_hdr,
|
|
h1, h2))
|
|
parser_update_region.add_argument('client', **cli_common.ORM_CLIENT_KWARGS)
|
|
parser_update_region.add_argument('region_id', type=str, help=h1)
|
|
parser_update_region.add_argument('datafile', type=argparse.FileType('r'),
|
|
help='<data file with updated region '
|
|
'JSON>')
|
|
|
|
# create region
|
|
h1 = '<full region json file>'
|
|
parser_create_region = subparsers.add_parser('create_region',
|
|
help='%s %s' % (clnt_hdr, h1))
|
|
parser_create_region.add_argument('client', **cli_common.ORM_CLIENT_KWARGS)
|
|
parser_create_region.add_argument('datafile', type=argparse.FileType('r'),
|
|
help='<data file with new region JSON>')
|
|
|
|
# delete region
|
|
h1 = '<region id>'
|
|
parser_delete_region = subparsers.add_parser('delete_region',
|
|
help='%s %s' % (clnt_hdr, h1))
|
|
parser_delete_region.add_argument('client', **cli_common.ORM_CLIENT_KWARGS)
|
|
parser_delete_region.add_argument('region_id', type=str, help=h1)
|
|
|
|
# list regions
|
|
parser_list_region = subparsers.add_parser('list_regions',
|
|
help='\
|
|
[--use_version <api version>] [--type <type>][--status <status>]\
|
|
[--metadata <metadata>] [--ranger_agent_version <ranger_agent_version>]\
|
|
[--clli <clli>]\
|
|
[--regionname <regionname>] [--osversion <osversion>]\
|
|
[--location_type <location_type>]\
|
|
[--state <state>] [--country <country>] [--city <city>] [--street <street>]\
|
|
[--zip <zip>] [--clcp_name <clcp_name>]')
|
|
parser_list_region.add_argument('client', **cli_common.ORM_CLIENT_KWARGS)
|
|
parser_list_region.add_argument('--use_version', type=int,
|
|
help='<api version to use>')
|
|
parser_list_region.add_argument('--type', type=str, help='<type>')
|
|
parser_list_region.add_argument('--status', type=str, help='<status>')
|
|
parser_list_region.add_argument('--metadata', action='append', nargs="+",
|
|
type=str, help='<metadata>')
|
|
parser_list_region.add_argument('--ranger_agent_version', type=str,
|
|
help='<ranger_agent_version>')
|
|
parser_list_region.add_argument('--clli', type=str, help='<clli>')
|
|
parser_list_region.add_argument('--regionname', type=str,
|
|
help='<regionname>')
|
|
parser_list_region.add_argument('--osversion', type=str,
|
|
help='<osversion>')
|
|
parser_list_region.add_argument('--location_type', type=str,
|
|
help='<location_type>')
|
|
parser_list_region.add_argument('--state', type=str, help='<state>')
|
|
parser_list_region.add_argument('--country', type=str, help='<country>')
|
|
parser_list_region.add_argument('--city', type=str, help='<city>')
|
|
parser_list_region.add_argument('--street', type=str, help='<street>')
|
|
parser_list_region.add_argument('--zip', type=str, help='<zip>')
|
|
parser_list_region.add_argument('--clcp_name', type=str,
|
|
help='<clcp_name>')
|
|
|
|
# add metadata to region
|
|
h1, h2 = '<region_id>', '<metadata json file>'
|
|
parser_add_metadata = subparsers.add_parser('add_metadata',
|
|
help='%s %s %s' % (clnt_hdr,
|
|
h1, h2))
|
|
parser_add_metadata.add_argument('client', **cli_common.ORM_CLIENT_KWARGS)
|
|
parser_add_metadata.add_argument('region_id', type=str, help=h1)
|
|
parser_add_metadata.add_argument('datafile', type=argparse.FileType('r'),
|
|
help=h2)
|
|
|
|
# update region's metadata
|
|
h1, h2 = '<region_id>', '<metadata json file>'
|
|
parser_update_metadata = subparsers.add_parser('update_metadata',
|
|
help='%s %s %s' % (clnt_hdr,
|
|
h1, h2))
|
|
parser_update_metadata.add_argument('client',
|
|
**cli_common.ORM_CLIENT_KWARGS)
|
|
parser_update_metadata.add_argument('region_id', type=str, help=h1)
|
|
parser_update_metadata.add_argument('datafile',
|
|
type=argparse.FileType('r'),
|
|
help=h2)
|
|
# delete metadata key from region
|
|
h1, h2 = '<region id>', '<metadata key>'
|
|
parser_delete_metadata = subparsers.add_parser('delete_metadata',
|
|
help='%s %s %s' % (clnt_hdr,
|
|
h1, h2))
|
|
parser_delete_metadata.add_argument('client',
|
|
**cli_common.ORM_CLIENT_KWARGS)
|
|
parser_delete_metadata.add_argument('region_id', type=str, help=h1)
|
|
parser_delete_metadata.add_argument('metadata_key', type=str, help=h2)
|
|
|
|
# get region's metadata
|
|
h1 = '<region id>'
|
|
parser_get_metadata = subparsers.add_parser('get_metadata',
|
|
help='%s' % (h1))
|
|
parser_get_metadata.add_argument('client', **cli_common.ORM_CLIENT_KWARGS)
|
|
parser_get_metadata.add_argument('region_id', type=str, help=h1)
|
|
|
|
# update region's status
|
|
h1, h2 = '<region_id>', '<status>'
|
|
parser_update_status = subparsers.add_parser('update_status',
|
|
help='%s %s %s' % (clnt_hdr,
|
|
h1, h2))
|
|
parser_update_status.add_argument('client', **cli_common.ORM_CLIENT_KWARGS)
|
|
parser_update_status.add_argument('region_id', type=str, help=h1)
|
|
parser_update_status.add_argument('status', type=str, help=h2)
|
|
|
|
|
|
def validate_args(args):
|
|
for argument in ('tenant_name', 'username', 'password', 'auth_region', 'keystone_auth_url'):
|
|
argument_value = getattr(args, argument, None)
|
|
if argument_value is not None:
|
|
globals()[argument] = argument_value
|
|
else:
|
|
configuration_value = getattr(config, argument)
|
|
if configuration_value:
|
|
globals()[argument] = configuration_value
|
|
else:
|
|
message = ('ERROR: {} for token generation was not supplied. '
|
|
'Please use its command-line argument or '
|
|
'environment variable.'.format(argument))
|
|
print(message)
|
|
raise cli_common.MissingArgumentError(message)
|
|
|
|
|
|
def preparm(p):
|
|
return ('' if len(p) else '?') + ('&' if len(p) else '')
|
|
|
|
|
|
def cmd_details(args):
|
|
if args.subcmd == 'get_region':
|
|
return requests.get, '/%s' % args.region_name_or_id
|
|
elif args.subcmd == 'create_region':
|
|
return requests.post, ''
|
|
elif args.subcmd == 'update_region':
|
|
return requests.put, '/%s' % args.region_id
|
|
elif args.subcmd == 'delete_region':
|
|
return requests.delete, '/%s' % args.region_id
|
|
elif args.subcmd == 'list_regions':
|
|
param = ''
|
|
if args.type:
|
|
param += '%stype=%s' % (preparm(param), args.type)
|
|
if args.status:
|
|
param += '%sstatus=%s' % (preparm(param), args.status)
|
|
if args.metadata:
|
|
for meta in args.metadata:
|
|
param += '%smetadata=%s' % (preparm(param), meta[0])
|
|
if args.ranger_agent_version:
|
|
param += '%sranger_agent_version=%s' % (preparm(param),
|
|
args.ranger_agent_version)
|
|
if args.clli:
|
|
param += '%sclli=%s' % (preparm(param), args.clli)
|
|
if args.regionname:
|
|
param += '%sregionname=%s' % (preparm(param), args.regionname)
|
|
if args.osversion:
|
|
param += '%sosversion=%s' % (preparm(param), args.osversion)
|
|
if args.location_type:
|
|
param += '%slocation_type=%s' % (preparm(param),
|
|
args.location_type)
|
|
if args.state:
|
|
param += '%sstate=%s' % (preparm(param), args.state)
|
|
if args.country:
|
|
param += '%scountry=%s' % (preparm(param), args.country)
|
|
if args.city:
|
|
param += '%scity=%s' % (preparm(param), args.city)
|
|
if args.street:
|
|
param += '%sstreet=%s' % (preparm(param), args.street)
|
|
if args.zip:
|
|
param += '%szip=%s' % (preparm(param), args.zip)
|
|
if args.clcp_name:
|
|
param += '%svlcp_name=%s' % (preparm(param), args.clcp_name)
|
|
return requests.get, '/%s' % param
|
|
elif args.subcmd == 'add_metadata':
|
|
return requests.post, '/%s/metadata' % args.region_id
|
|
elif args.subcmd == 'update_metadata':
|
|
return requests.put, '/%s/metadata' % args.region_id
|
|
elif args.subcmd == 'delete_metadata':
|
|
return requests.delete, '/%s/metadata/%s' % (args.region_id,
|
|
args.metadata_key)
|
|
elif args.subcmd == 'get_metadata':
|
|
return requests.get, '/%s/metadata' % args.region_id
|
|
elif args.subcmd == 'update_status':
|
|
return requests.put, '/%s/status' % args.region_id
|
|
elif args.subcmd == 'get_group':
|
|
return requests.get, '/%s' % args.group_id
|
|
elif args.subcmd == 'list_groups':
|
|
return requests.get, '/'
|
|
elif args.subcmd == 'create_group':
|
|
return requests.post, '/'
|
|
elif args.subcmd == 'update_group':
|
|
return requests.put, '/%s' % args.group_id
|
|
elif args.subcmd == 'delete_group':
|
|
return requests.delete, '/%s' % args.group_id
|
|
|
|
|
|
def get_path(args):
|
|
path = 'v2/orm/regions'
|
|
if 'group' in args.subcmd:
|
|
path = 'v2/orm/groups'
|
|
return path
|
|
|
|
|
|
def get_environment_variable(argument):
|
|
# The rules are: all caps, underscores instead of dashes and prefixed
|
|
environment_variable = 'RANGER_{}'.format(
|
|
argument.replace('-', '_').upper())
|
|
|
|
return os.environ.get(environment_variable)
|
|
|
|
|
|
def run(args):
|
|
url_path = get_path(args)
|
|
rms_base_url = args.rms_base_url if args.rms_base_url \
|
|
else base_config.rms['base_url']
|
|
data = args.datafile.read() if 'datafile' in args else '{}'
|
|
timeout = args.timeout if args.timeout else 10
|
|
rest_cmd, cmd_url = cmd_details(args)
|
|
url = '%s/%s' % (rms_base_url, url_path) + cmd_url
|
|
if args.faceless:
|
|
auth_key = auth_region = requester = client = ''
|
|
else:
|
|
try:
|
|
validate_args(args)
|
|
auth_key = cli_common.get_token(timeout, args)
|
|
except Exception:
|
|
exit(1)
|
|
auth_region = globals()['auth_region']
|
|
requester = globals()['username']
|
|
client = requester
|
|
|
|
if (args.subcmd == 'get_region' or args.subcmd == 'list_regions') \
|
|
and "use_version" in args:
|
|
if args.use_version == 1:
|
|
url = '%s:%d/lcp' % (host, port) + cmd_url
|
|
elif args.use_version is not None and args.use_version != 2:
|
|
print('API error: use_version argument - invalid value, '
|
|
'allowed values: 1 or 2')
|
|
exit(1)
|
|
|
|
if args.subcmd == "update_status":
|
|
data = '{"status": "%s"}' % args.status
|
|
|
|
tracking_id = args.tracking_id if args.tracking_id else None
|
|
headers = {
|
|
'content-type': 'application/json',
|
|
'X-Auth-Token': auth_key,
|
|
'X-Auth-Region': auth_region,
|
|
'X-RANGER-Requester': requester,
|
|
'X-RANGER-Client': client,
|
|
'X-RANGER-Tracking-Id': tracking_id
|
|
}
|
|
if args.verbose:
|
|
print(("Sending API:\ntimeout: %d\ndata: %s\n"
|
|
"headers: %s\ncmd: %s\nurl: %s\n" % (timeout,
|
|
data,
|
|
headers,
|
|
rest_cmd.__name__,
|
|
url)))
|
|
try:
|
|
resp = rest_cmd(url, data=data, timeout=timeout, headers=headers,
|
|
verify=config.verify)
|
|
except Exception as e:
|
|
print(str(e))
|
|
exit(1)
|
|
|
|
if not 200 <= resp.status_code < 300:
|
|
content = resp.content
|
|
print('API error: %s %s (Reason: %d)\n%s' % (
|
|
rest_cmd.__name__.upper(),
|
|
url,
|
|
resp.status_code,
|
|
content))
|
|
exit(1)
|
|
|
|
if resp.status_code == 204: # no content
|
|
exit(0)
|
|
|
|
rj = resp.json()
|
|
|
|
if rj == 'Not found':
|
|
print('No output was found')
|
|
else:
|
|
cli_common.pretty_print_json(rj)
|