214 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			214 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
import logging
 | 
						|
import pprint
 | 
						|
import time
 | 
						|
 | 
						|
import requests
 | 
						|
 | 
						|
from orm.common.client.audit.audit_client.api import audit
 | 
						|
from pecan import conf
 | 
						|
 | 
						|
# from cms_rest.logger import get_logger
 | 
						|
#
 | 
						|
 | 
						|
conf = None
 | 
						|
LOG = logging.getLogger(__name__)
 | 
						|
 | 
						|
 | 
						|
class ResponseError(Exception):
 | 
						|
    pass
 | 
						|
 | 
						|
 | 
						|
class ConnectionError(Exception):
 | 
						|
    pass
 | 
						|
 | 
						|
 | 
						|
def set_utils_conf(_conf):
 | 
						|
    global conf
 | 
						|
    conf = _conf
 | 
						|
 | 
						|
 | 
						|
def _check_conf_initialization():
 | 
						|
    if not conf:
 | 
						|
        raise AssertionError(
 | 
						|
            'Configurations wasnt initiated, please run set_utils_conf and '
 | 
						|
            'pass pecan coniguration')
 | 
						|
 | 
						|
 | 
						|
def create_or_validate_uuid(uuid, uuid_type):
 | 
						|
    """ function to:
 | 
						|
            1) request new uuid from uuid_generator rest service
 | 
						|
            2) validate a uuid if one is being set
 | 
						|
        returns uuid string
 | 
						|
    """
 | 
						|
    _check_conf_initialization()
 | 
						|
    url = conf.api.uuid_server.base + conf.api.uuid_server.uuids
 | 
						|
 | 
						|
    if not uuid:
 | 
						|
        LOG.debug('Requesting new UUID from URL: {}'.format(url))
 | 
						|
    else:
 | 
						|
        LOG.debug('Creating UUID: {}, using URL: {}'.format(uuid, url))
 | 
						|
 | 
						|
    try:
 | 
						|
        resp = requests.post(url, data={'uuid': uuid, 'uuid_type': uuid_type},
 | 
						|
                             verify=conf.verify)
 | 
						|
    except requests.exceptions.ConnectionError as exp:
 | 
						|
        nagios = 'CON{}UUIDGEN001'.format(conf.server.name.upper())
 | 
						|
        LOG.critical(
 | 
						|
            'CRITICAL|{}|Failed in make_uuid: connection error: {}'.format(
 | 
						|
                nagios, str(exp)))
 | 
						|
        exp.message = 'connection error: Failed to get uuid: unable to connect to server'
 | 
						|
        raise
 | 
						|
    except Exception as e:
 | 
						|
        LOG.info('Failed in make_uuid:' + str(e))
 | 
						|
        return None
 | 
						|
 | 
						|
    if resp.status_code == 400:
 | 
						|
        LOG.debug('Duplicate key for uuid: {}'.format(uuid))
 | 
						|
        raise TypeError('Duplicate key for uuid: ' + str(uuid))
 | 
						|
 | 
						|
    resp = resp.json()
 | 
						|
    return resp['uuid']
 | 
						|
 | 
						|
 | 
						|
def make_transid():
 | 
						|
    """ function to request new uuid of transaction type from uuid_generator
 | 
						|
    rest service
 | 
						|
        returns uuid string
 | 
						|
    """
 | 
						|
    _check_conf_initialization()
 | 
						|
    url = conf.api.uuid_server.base + conf.api.uuid_server.uuids
 | 
						|
 | 
						|
    try:
 | 
						|
        LOG.debug('Requesting transaction ID from: {}'.format(url))
 | 
						|
        resp = requests.post(url, data={'uuid_type': 'transaction'}, verify=conf.verify)
 | 
						|
    except requests.exceptions.ConnectionError as exp:
 | 
						|
        nagios = 'CON{}UUIDGEN001'.format(conf.server.name.upper())
 | 
						|
        LOG.critical('CRITICAL|{}|Failed in make_transid: connection error: {}'.format(nagios, str(exp)))
 | 
						|
        exp.message = 'connection error: Failed to get uuid: unable to connect to server'
 | 
						|
        raise
 | 
						|
    except Exception as e:
 | 
						|
        LOG.info('Failed in make_transid:' + str(e))
 | 
						|
        return None
 | 
						|
 | 
						|
    resp = resp.json()
 | 
						|
    if 'uuid' in resp:
 | 
						|
        return resp['uuid']
 | 
						|
    else:
 | 
						|
        return None
 | 
						|
 | 
						|
 | 
						|
audit_setup = False
 | 
						|
 | 
						|
 | 
						|
def _get_event_details(cmd):
 | 
						|
    event = 'unknown'
 | 
						|
    if 'customer' in cmd:
 | 
						|
        event = 'CMS'
 | 
						|
    elif 'image' in cmd:
 | 
						|
        event = 'IMS'
 | 
						|
    elif 'flavor' in cmd:
 | 
						|
        event = 'FMS'
 | 
						|
    return event
 | 
						|
 | 
						|
 | 
						|
def audit_trail(cmd, transaction_id, headers, resource_id, message=None,
 | 
						|
                event_details=''):
 | 
						|
    """ function to send item to audit trail rest api
 | 
						|
        returns 200 for ok and None for error
 | 
						|
    :param cmd:
 | 
						|
    :param transaction_id:
 | 
						|
    :param headers:
 | 
						|
    :param resource_id:
 | 
						|
    :param message:
 | 
						|
    :return:
 | 
						|
    """
 | 
						|
    _check_conf_initialization()
 | 
						|
    global audit_setup, audit_server_url
 | 
						|
    if not audit_setup:
 | 
						|
        audit_server_url = '%s%s' % (
 | 
						|
            conf.api.audit_server.base, conf.api.audit_server.trans)
 | 
						|
        num_of_send_retries = 3
 | 
						|
        time_wait_between_retries = 1
 | 
						|
        LOG.debug('Initializing Audit, using URL: {}'.format(
 | 
						|
            audit_server_url))
 | 
						|
        audit.init(audit_server_url, num_of_send_retries,
 | 
						|
                   time_wait_between_retries, conf.server.name.upper())
 | 
						|
        audit_setup = True
 | 
						|
 | 
						|
    try:
 | 
						|
        timestamp = int(round(time.time() * 1000))
 | 
						|
        application_id = headers[
 | 
						|
            'X-RANGER-Client'] if 'X-RANGER-Client' in headers else \
 | 
						|
            'NA'
 | 
						|
        tracking_id = headers[
 | 
						|
            'X-RANGER-Tracking-Id'] if 'X-RANGER-Tracking-Id' in headers \
 | 
						|
            else transaction_id
 | 
						|
        # transaction_id is function argument
 | 
						|
        transaction_type = cmd
 | 
						|
        # resource_id is function argument
 | 
						|
        service_name = conf.server.name.upper()
 | 
						|
        user_id = headers[
 | 
						|
            'X-RANGER-Requester'] if 'X-RANGER-Requester' in headers else \
 | 
						|
            ''
 | 
						|
        external_id = 'NA'
 | 
						|
        LOG.debug('Sending to audit: timestamp: {}, application_id: {}, '
 | 
						|
                  ' tracking_id: {},'
 | 
						|
                  ' transaction_type: {}'.format(timestamp, application_id,
 | 
						|
                                                 tracking_id,
 | 
						|
                                                 transaction_type))
 | 
						|
        audit.audit(timestamp, application_id, tracking_id, transaction_id,
 | 
						|
                    transaction_type, resource_id, service_name, user_id,
 | 
						|
                    external_id, event_details)
 | 
						|
    except Exception as e:
 | 
						|
        LOG.exception('Failed in audit service. ' + str(e))
 | 
						|
        return None
 | 
						|
 | 
						|
    return 200
 | 
						|
 | 
						|
 | 
						|
def report_config(conf, dump_to_log=False, my_logger=None):
 | 
						|
    """ return the configuration (which is set by config.py) as a string
 | 
						|
    :param conf:
 | 
						|
    :param dump_to_log:
 | 
						|
    :param my_logger:
 | 
						|
    :return:
 | 
						|
    """
 | 
						|
 | 
						|
    ret = pprint.pformat(conf.to_dict(), indent=4)
 | 
						|
    effective_logger = my_logger if my_logger else LOG
 | 
						|
    if dump_to_log:
 | 
						|
        effective_logger.info('Current Configuration:\n' + ret)
 | 
						|
 | 
						|
    return ret
 | 
						|
 | 
						|
 | 
						|
def get_resource_status(resource_id):
 | 
						|
    """ Get a resource status from RDS.
 | 
						|
    :param resource_id:
 | 
						|
    :return:
 | 
						|
    """
 | 
						|
 | 
						|
    url = "{}{}{}".format(conf.api.rds_server.base,
 | 
						|
                          conf.api.rds_server.status, resource_id)
 | 
						|
    LOG.debug('Getting status from: {}'.format(url))
 | 
						|
    try:
 | 
						|
        result = requests.get(url, verify=conf.verify)
 | 
						|
    except Exception as exception:
 | 
						|
        LOG.debug('Failed to get status: {}'.format(str(exception)))
 | 
						|
        return None
 | 
						|
 | 
						|
    if result.status_code != 200:
 | 
						|
        LOG.debug('Got invalid response from RDS: code {}'.format(
 | 
						|
            result.status_code))
 | 
						|
        return None
 | 
						|
    else:
 | 
						|
        LOG.debug('Got response from RDS: {}'.format(result.json()))
 | 
						|
        return result.json()
 | 
						|
 | 
						|
 | 
						|
def get_time_human():
 | 
						|
    """this function return the timestamp for output JSON
 | 
						|
    :return: timestamp in wanted format
 | 
						|
    """
 | 
						|
    return time.strftime("%a, %b %d %Y, %X (%Z)", time.gmtime())
 |