jh629g 5eb91bd5d5 Add Domain name to ranger region
Refactor ranger to allow domain
for resource deployment to be
defined in create region api call,
rather than only being retrieved
from ranger configuration.

Change-Id: I1b481c49d4402438c8aa91a8ebd8b6dbe797997b
2020-02-13 19:14:32 +00:00

392 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>] [--domain_name <domain_name>]\
[--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('--domain_name', type=str,
help='<domain_name>')
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.domain_name:
param += '%sdomain_name=%s' % (preparm(param), args.domain_name)
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)