Beispiel #1
0
def handle_general_errors(response):
    """Handle general errors.

    :param response: The response object.
    :returns: The response object.
    """
    token_expired = {'detail': 'Token has expired'}
    response_data = None
    try:
        response_data = response.json()
    except exception_class:
        pass

    if response.status_code == 401:
        handle_error_response(response)
        log.error(_(messages.SERVER_LOGIN_REQUIRED))
        log.error('$ qpc server login')
        sys.exit(1)
    elif (response.status_code == 400 and response_data == token_expired):
        handle_error_response(response)
        log.error(_(messages.SERVER_LOGIN_REQUIRED))
        log.error('$ qpc server login')
        sys.exit(1)
    elif response.status_code == 500:
        handle_error_response(response)
        log.error(_(messages.SERVER_INTERNAL_ERROR))
        sys.exit(1)

    return response
Beispiel #2
0
    def main(self):
        """Execute of subcommand operation.

        Method determine whether to display usage or pass input
        to find the best command match. If no match is found the
        usage is displayed
        """
        self.args = self.parser.parse_args()
        setup_logging(self.args.verbosity)
        is_server_cmd = self.args.subcommand == server.SUBCOMMAND
        is_server_logout = is_server_cmd and self.args.action == server.LOGOUT
        is_server_config = is_server_cmd and self.args.action == server.CONFIG

        if not is_server_config:
            # Before attempting to run command, check server location
            server_location = get_server_location()
            if server_location is None or server_location == '':
                log.error(_(messages.SERVER_CONFIG_REQUIRED % PKG_NAME))
                sys.exit(1)

        if read_require_auth():
            if ((not is_server_cmd or is_server_logout)
                    and not read_client_token()):
                log.error(_(messages.SERVER_LOGIN_REQUIRED % PKG_NAME))
                sys.exit(1)

        if self.args.subcommand in self.subcommands:
            subcommand = self.subcommands[self.args.subcommand]
            if self.args.action in subcommand:
                action = subcommand[self.args.action]
                action.main(self.args)
            else:
                self.parser.print_help()
        else:
            self.parser.print_help()
Beispiel #3
0
    def main(self):
        """Execute of subcommand operation.

        Method determine whether to display usage or pass input
        to find the best command match. If no match is found the
        usage is displayed
        """
        self.args = self.parser.parse_args()
        setup_logging(self.args.verbosity)

        if self.args.subcommand is not None \
                and self.args.subcommand != server.SUBCOMMAND:
            # Before attempting to run command, check server location
            server_location = get_server_location()
            if server_location is None or server_location == '':
                log.error(
                    'Please configure server location using command below.')
                log.error('qpc server config --host HOST --port PORT')
                sys.exit(1)

        if self.args.subcommand in self.subcommands:
            subcommand = self.subcommands[self.args.subcommand]
            if self.args.action in subcommand:
                action = subcommand[self.args.action]
                action.main(self.args)
            else:
                self.parser.print_help()
        else:
            self.parser.print_help()
Beispiel #4
0
    def main(self):
        """Execute of subcommand operation.

        Method determine whether to display usage or pass input
        to find the best command match. If no match is found the
        usage is displayed
        """
        self.args = self.parser.parse_args()
        setup_logging(self.args.verbosity)
        if self.args.subcommand != server.SUBCOMMAND or \
            (self.args.subcommand == server.SUBCOMMAND and
             self.args.action != server.CONFIG):
            # Before attempting to run command, check server location
            server_location = get_server_location()
            if server_location is None or server_location == '':
                log.error(_(messages.SERVER_CONFIG_REQUIRED))
                log.error('$ qpc server config --host HOST --port PORT')
                sys.exit(1)

        if (self.args.subcommand != server.SUBCOMMAND
                and not read_client_token()):
            log.error(_(messages.SERVER_LOGIN_REQUIRED))
            log.error('$ qpc server login')
            sys.exit(1)

        if self.args.subcommand in self.subcommands:
            subcommand = self.subcommands[self.args.subcommand]
            if self.args.action in subcommand:
                action = subcommand[self.args.action]
                action.main(self.args)
            else:
                self.parser.print_help()
        else:
            self.parser.print_help()
Beispiel #5
0
def request(method, path, params=None, payload=None,
            parser=None, headers=None):
    """Create a generic handler for passing to specific request methods.

    :param method: the request method to execute
    :param path: path after server and port (i.e. /api/v1/credentials)
    :param params: uri encoding params (i.e. ?param1=hello&param2=world)
    :param payload: dictionary of payload to be posted
    :param parser: parser for printing usage on failure
    :param headers: headers to include
    :returns: reponse object
    :raises: AssertionError error if method is not supported
    """
    # grab the cli command for the log if the parser is provided
    log_command = None
    if parser is not None:
        log_command = parser.prog
    req_headers = {}
    token = read_client_token()
    # create the url by adding the path to the configured server location
    url = get_server_location() + path
    if headers:
        req_headers.update(headers)
    if token:
        req_headers['Authorization'] = 'Token {}'.format(token)

    try:
        if method == POST:
            result = handle_general_errors(post(url, payload, req_headers))
        elif method == GET:
            result = handle_general_errors(get(url, params, req_headers))
        elif method == PATCH:
            result = handle_general_errors(patch(url, payload, req_headers))
        elif method == DELETE:
            result = handle_general_errors(delete(url, req_headers))
        elif method == PUT:
            result = handle_general_errors(put(url, payload, req_headers))
        else:
            log.error('Unsupported request method %s', method)
            parser.print_help()
            sys.exit(1)
        try:
            log_request_info(method, log_command,
                             url, result.json(), result.status_code)
        except ValueError:
            log_request_info(method, log_command,
                             url, result.text, result.status_code)
        return result
    except requests.exceptions.SSLError as ssl_error:
        print(_(SSL_ERROR_MSG))
        log.error(ssl_error)
        if parser is not None:
            parser.print_help()
        sys.exit(1)
    except requests.exceptions.ConnectionError as conn_err:
        print(_(CONNECTION_ERROR_MSG))
        log.error(conn_err)
        if parser is not None:
            parser.print_help()
        sys.exit(1)
Beispiel #6
0
def request(method, path, params=None, payload=None,
            parser=None, headers=None):
    """Create a generic handler for passing to specific request methods.

    :param method: the request method to execute
    :param path: path after server and port (i.e. /api/v1/credentials)
    :param params: uri encoding params (i.e. ?param1=hello&param2=world)
    :param payload: dictionary of payload to be posted
    :param parser: parser for printing usage on failure
    :param headers: headers to include
    :returns: reponse object
    :raises: AssertionError error if method is not supported
    """
    req_headers = {}
    token = read_client_token()
    if headers:
        req_headers.update(headers)
    if token:
        req_headers['Authorization'] = 'Token {}'.format(token)

    try:
        if method == POST:
            return post(path, payload, req_headers)
        elif method == GET:
            return get(path, params, req_headers)
        elif method == PATCH:
            return patch(path, payload, req_headers)
        elif method == DELETE:
            return delete(path, req_headers)
        elif method == PUT:
            return put(path, payload, req_headers)
        else:
            log.error('Unsupported request method %s', method)
            parser.print_help()
            sys.exit(1)
    except requests.exceptions.SSLError as ssl_error:
        print(_(SSL_ERROR_MSG))
        log.error(ssl_error)
        if parser is not None:
            parser.print_help()
        sys.exit(1)
    except requests.exceptions.ConnectionError as conn_err:
        print(_(CONNECTION_ERROR_MSG))
        log.error(conn_err)
        if parser is not None:
            parser.print_help()
        sys.exit(1)
Beispiel #7
0
def handle_general_errors(response, min_server_version):
    """Handle general errors.

    :param response: The response object.
    :returns: The response object.
    """
    server_version = response.headers.get('X-Server-Version')
    if not server_version:
        server_version = QPC_MIN_SERVER_VERSION

    if '0.0.0' not in server_version and \
            LooseVersion(server_version) < LooseVersion(min_server_version):
        print(_(messages.SERVER_TOO_OLD_FOR_CLI %
                (min_server_version, min_server_version, server_version)))
        sys.exit(1)

    token_expired = {'detail': 'Token has expired'}
    response_data = None
    try:
        response_data = response.json()
    except exception_class:
        pass

    if response.status_code == 401:
        handle_error_response(response)
        log.error(_(messages.SERVER_LOGIN_REQUIRED % (PKG_NAME)))
        sys.exit(1)
    elif (response.status_code == 400 and
          response_data == token_expired):
        handle_error_response(response)
        log.error(_(messages.SERVER_LOGIN_REQUIRED % (PKG_NAME)))
        sys.exit(1)
    elif response.status_code == 500:
        handle_error_response(response)
        log.error(_(messages.SERVER_INTERNAL_ERROR))
        sys.exit(1)

    return response
Beispiel #8
0
def request(method, path, params=None, payload=None,
            parser=None, headers=None, min_server_version=QPC_MIN_SERVER_VERSION):
    """Create a generic handler for passing to specific request methods.

    :param method: the request method to execute
    :param path: path after server and port (i.e. /api/v1/credentials)
    :param params: uri encoding params (i.e. ?param1=hello&param2=world)
    :param payload: dictionary of payload to be posted
    :param parser: parser for printing usage on failure
    :param headers: headers to include
    :param min_server_version: min qpc server version allowed
    :returns: reponse object
    :raises: AssertionError error if method is not supported
    """
    # grab the cli command for the log if the parser is provided
    log_command = None
    if parser is not None:
        log_command = parser.prog
    req_headers = {}
    token = read_client_token()
    # create the url by adding the path to the configured server location
    url = get_server_location() + path
    if headers:
        req_headers.update(headers)
    if token:
        req_headers['Authorization'] = 'Token {}'.format(token)

    try:
        if method == POST:
            result = handle_general_errors(post(url, payload, req_headers), min_server_version)
        elif method == GET:
            result = handle_general_errors(get(url, params, req_headers), min_server_version)
        elif method == PATCH:
            result = handle_general_errors(patch(url, payload, req_headers), min_server_version)
        elif method == DELETE:
            result = handle_general_errors(delete(url, req_headers), min_server_version)
        elif method == PUT:
            result = handle_general_errors(put(url, payload, req_headers), min_server_version)
        else:
            log.error('Unsupported request method %s', method)
            parser.print_help()
            sys.exit(1)
        try:
            log_request_info(method, log_command,
                             url, result.json(), result.status_code)
        except ValueError:
            log_request_info(method, log_command,
                             url, result.text, result.status_code)
        return result
    except (requests.exceptions.ConnectionError, requests.exceptions.SSLError):
        config = read_server_config()
        if config is not None:
            protocol = 'https'
            host = config.get(CONFIG_HOST_KEY)
            port = config.get(CONFIG_PORT_KEY)
            if config.get(CONFIG_USE_HTTP):
                protocol = 'http'
            log.error(_(CONNECTION_ERROR_MSG % (protocol, host, port)))
            log.error(_(messages.SERVER_CONFIG_REQUIRED % PKG_NAME))
        else:
            log.error(_(messages.SERVER_CONFIG_REQUIRED % PKG_NAME))
        sys.exit(1)