diff --git a/patch-tracking/patch_tracking/app.py b/patch-tracking/patch_tracking/app.py index 82328aca9dde50609565d4077bba6e56bb829e1b..84aaad191ea4574ef5da3b4c8002d35843149866 100644 --- a/patch-tracking/patch_tracking/app.py +++ b/patch-tracking/patch_tracking/app.py @@ -21,22 +21,15 @@ def check_token(): """ check gitee/github token """ gitee_token = app.config['GITEE_ACCESS_TOKEN'] github_token = app.config['GITHUB_ACCESS_TOKEN'] - token_error = False - try: - github_ret = github_api.get_user_info(github_token) - if github_ret[0] != "success": - logger.error('github token is bad credentials.') - token_error = True - except UnicodeEncodeError: - logger.error('github token is bad credentials.') - token_error = True - gitee_ret = gitee_api.get_user_info(gitee_token) - if gitee_ret[0] != "success": - logger.error('gitee token is bad credentials.') - token_error = True + github_ret = github_api.get_user_info(github_token) + if not github_ret[0]: + logger.error(github_ret[1]) + sys.exit(1) - if token_error: + gitee_ret = gitee_api.get_user_info(gitee_token) + if not gitee_ret[0]: + logger.error(gitee_ret[1]) sys.exit(1) diff --git a/patch-tracking/patch_tracking/cli/patch_tracking_cli.py b/patch-tracking/patch_tracking/cli/patch_tracking_cli.py index a223d1f2c8f9c5c8d37e0665bce5280cc63018f0..c2a67f7003fb107f037a94d1c6108cf8d0c62c4c 100755 --- a/patch-tracking/patch_tracking/cli/patch_tracking_cli.py +++ b/patch-tracking/patch_tracking/cli/patch_tracking_cli.py @@ -11,6 +11,8 @@ from requests.auth import HTTPBasicAuth from requests.packages.urllib3.exceptions import InsecureRequestWarning requests.packages.urllib3.disable_warnings(InsecureRequestWarning) +pandas.set_option('display.max_rows', None) +pandas.set_option('display.width', None) def query_table(args): @@ -28,7 +30,7 @@ def query_table(args): return 'success', ret return 'error', ret - except Exception as exception: + except IOError as exception: return 'error', 'Connect server error: ' + str(exception) elif args.table == "issue": url = '/'.join(['https:/', server, 'issue']) @@ -39,7 +41,7 @@ def query_table(args): return 'success', ret return 'error', ret - except Exception as exception: + except IOError as exception: return 'error', 'Connect server error: ' + str(exception) return 'error', 'table ' + args.table + ' not found' @@ -81,7 +83,7 @@ def server_check(url): """ try: ret = requests.head(url=url, verify=False) - except Exception as exception: + except IOError as exception: print(f"Error: Cannot connect to {url}, please make sure patch-tracking service is running.") return 'error', exception if ret.status_code == 200 or ret.status_code == 404: @@ -102,7 +104,7 @@ def repo_branch_check(url): } try: ret = requests.get(url=url, headers=headers) - except Exception as exception: + except IOError as exception: return 'error', exception if ret.status_code == 404: return 'error', f'{url} not exist.' @@ -142,13 +144,13 @@ def params_input_track(params, file_path=None): password = params['password'] if enabled not in ["True", "true", "False", "false"]: - print(add_usage) + print(ADD_USAGE) return "error", "error: enabled: invalid value: '{}' (choose from 'True', 'true', 'False', 'false')".format( enabled ) if version_control not in ["github"]: - print(add_usage) + print(ADD_USAGE) return "error", "error: version_control: invalid value: '{}' (choose from 'github')".format(version_control) err = latin1_encode(user) @@ -171,7 +173,7 @@ def params_input_track(params, file_path=None): } try: ret = requests.post(url, json=data, verify=False, auth=HTTPBasicAuth(user, password)) - except Exception as exception: + except IOError as exception: return 'error', 'Connect server error: ' + str(exception) if ret.status_code == 401 or ret.status_code == 403: return 'error', 'Authenticate Error. Please make sure user and password are correct.' @@ -183,6 +185,7 @@ def params_input_track(params, file_path=None): def check_add_param(params): + """check add type param""" success = True required_params = ["repo", "branch", "scm_repo", "scm_branch", "version_control", "enabled"] miss_params = list() @@ -213,7 +216,7 @@ def add(args): style3 = bool(args.dir) if str([style1, style2, style3]).count('True') >= 2: - print("usage:" + add_usage) + print("usage:" + ADD_USAGE) print("patch_tracking_cli add: error: mix different usage style") return @@ -271,12 +274,12 @@ def delete(args): if ret.status_code == 200 and ret.json()['code'] == '2001': print('Tracking delete successfully.') return - elif ret.status_code == 200 and ret.json()['code'] == '6005': + if ret.status_code == 200 and ret.json()['code'] == '6005': print('Delete Nothing. Tracking not exist.') return print("Tracking delete failed. Error: {}".format(ret.text)) - except Exception as exception: + except IOError as exception: print('Connect server error: ' + str(exception)) @@ -286,9 +289,9 @@ def query(args): """ status, ret = query_table(args) if status == "success": - df = pandas.DataFrame.from_dict(ret.json()["data"], orient="columns") - df.index = range(1, len(df) + 1) - print(df) + data_frame = pandas.DataFrame.from_dict(ret.json()["data"], orient="columns") + data_frame.index = range(1, len(data_frame) + 1) + print(data_frame) else: print(ret) @@ -364,14 +367,14 @@ authentication_parser.add_argument('--user', required=True, help='authentication authentication_parser.add_argument('--password', required=True, help='authentication password') # add -add_usage = """ +ADD_USAGE = """ patch_tracking_cli add --server SERVER --user USER --password PASSWORD --version_control github --scm_repo SCM_REPO --scm_branch SCM_BRANCH --repo REPO --branch BRANCH --enabled True patch_tracking_cli add --server SERVER --user USER --password PASSWORD --file FILE patch_tracking_cli add --server SERVER --user USER --password PASSWORD --dir DIR""" parser_add = subparsers.add_parser( - 'add', parents=[common_parser, authentication_parser], help="add tracking", usage=add_usage, allow_abbrev=False + 'add', parents=[common_parser, authentication_parser], help="add tracking", usage=ADD_USAGE, allow_abbrev=False ) parser_add.set_defaults(func=add) parser_add.add_argument("--version_control", choices=['github'], help="upstream version control system") @@ -400,6 +403,7 @@ parser_query.add_argument("--branch", help="source package branch") def main(): + """main""" args_ = parser.parse_args() if args_.subparser_name: if args_.func(args_) != "success": diff --git a/patch-tracking/patch_tracking/util/gitee_api.py b/patch-tracking/patch_tracking/util/gitee_api.py index 4571eae507dcc841e58f3a5ca6eb5273beff59a3..4a0af0025560298fd529f9df81da43a8e363e208 100644 --- a/patch-tracking/patch_tracking/util/gitee_api.py +++ b/patch-tracking/patch_tracking/util/gitee_api.py @@ -5,13 +5,62 @@ import base64 import logging import requests from flask import current_app +from requests import exceptions -log = logging.getLogger(__name__) +logger = logging.getLogger(__name__) ORG_URL = "https://gitee.com/api/v5/orgs" REPO_URL = "https://gitee.com/api/v5/repos" +def get_request(url, params): + """ + get request + """ + logger.debug("Get request, connect url: %s", url) + try: + response = requests.get(url, params=params) + return True, response + except exceptions.ConnectionError as err: + logger.error(err) + return False, 'connection error' + except IOError as err: + logger.error(err) + return False, 'IO error' + + +def post_request(url, data): + """ + post request + """ + logger.debug("Post request, connect url: %s", url) + try: + response = requests.post(url, data=data) + return True, response + except exceptions.ConnectionError as err: + logger.error(err) + return False, 'connection error' + except IOError as err: + logger.error(err) + return False, 'IO error' + + +def put_request(url, data): + """ + put request + """ + logger.debug("Put request, connect url: %s", url) + try: + response = requests.put(url, data=data) + return True, response + except exceptions.ConnectionError as err: + logger.error(err) + return False, 'connection error' + except IOError as err: + logger.error(err) + return False, 'IO error' + + def get_user_info(token): """ get user info @@ -19,10 +68,13 @@ def get_user_info(token): url = "https://gitee.com/api/v5/user" gitee_token = token param = {'access_token': gitee_token} - ret = requests.get(url, params=param) - if ret.status_code == 200: - return "success", ret.text - return "error", ret.json() + ret, ret_info = get_request(url, params=param) + if ret: + if ret_info.status_code == 200: + return True, ret_info.text + return False, ret_info.json() + + return False, ret_info def get_path_content(repo, branch, path): @@ -32,8 +84,8 @@ def get_path_content(repo, branch, path): gitee_token = current_app.config['GITEE_ACCESS_TOKEN'] url = '/'.join([REPO_URL, repo, 'contents', path]) param = {'access_token': gitee_token, 'ref': branch} - ret = requests.get(url, params=param).json() - return ret + _, ret_info = get_request(url, params=param) + return ret_info.json() def create_branch(repo, branch, new_branch): @@ -43,11 +95,13 @@ def create_branch(repo, branch, new_branch): gitee_token = current_app.config['GITEE_ACCESS_TOKEN'] url = '/'.join([REPO_URL, repo, 'branches']) data = {'access_token': gitee_token, 'refs': branch, 'branch_name': new_branch} - response = requests.post(url, data=data) - if response.status_code == 201: - return 'success' + ret, response = post_request(url, data=data) + if ret: + if response.status_code == 201: + return 'success' + return response.json() - return response.json() + return response def upload_patch(data): @@ -60,11 +114,13 @@ def upload_patch(data): content = base64.b64encode(data['patch_file_content'].encode("utf-8")) message = '[patch tracking] ' + data['cur_time'] + ' - ' + data['commit_url'] + '\n' data = {'access_token': gitee_token, 'content': content, 'message': message, 'branch': data['branch']} - response = requests.post(url, data=data) - if response.status_code == 201: - return 'success' + ret, response = post_request(url, data=data) + if ret: + if response.status_code == 201: + return 'success' + return response.json() - return response.json() + return response def create_spec(repo, branch, spec_content, cur_time): @@ -78,11 +134,13 @@ def create_spec(repo, branch, spec_content, cur_time): content = base64.b64encode(spec_content.encode("utf-8")) message = '[patch tracking] ' + cur_time + ' - ' + 'create spec file' + '\n' data = {'access_token': gitee_token, 'content': content, 'message': message, 'branch': branch} - response = requests.post(url, data=data) - if response.status_code == 201: - return 'success' + ret, response = post_request(url, data=data) + if ret: + if response.status_code == 201: + return 'success' + return response.json() - return response.json() + return response def upload_spec(repo, branch, cur_time, spec_content, spec_sha): @@ -105,11 +163,13 @@ def upload_spec(repo, branch, cur_time, spec_content, spec_sha): 'branch': branch, 'sha': spec_sha } - response = requests.put(url, data=data) - if response.status_code == 200: - return 'success' + ret, response = put_request(url, data=data) + if ret: + if response.status_code == 200: + return 'success' + return response.json() - return response.json() + return response def create_gitee_issue(repo, branch, issue_body, cur_time): @@ -125,11 +185,13 @@ def create_gitee_issue(repo, branch, issue_body, cur_time): 'title': '[patch tracking] ' + branch + ' ' + cur_time, 'body': issue_body } - response = requests.post(url, data=data) - if response.status_code == 201: - return 'success', response.json()['number'] + ret, response = post_request(url, data=data) + if ret: + if response.status_code == 201: + return 'success', response.json()['number'] + return 'error', response.json() - return 'error', response.json() + return 'error', response def create_pull_request(repo, branch, patch_branch, issue_num, cur_time): @@ -148,8 +210,10 @@ def create_pull_request(repo, branch, patch_branch, issue_num, cur_time): 'body': '#' + issue_num, "prune_source_branch": "true" } - response = requests.post(url, data=data) - if response.status_code == 201: - return 'success' + ret, response = post_request(url, data=data) + if ret: + if response.status_code == 201: + return 'success' + return response.json() - return response.json() + return response diff --git a/patch-tracking/patch_tracking/util/github_api.py b/patch-tracking/patch_tracking/util/github_api.py index 31b533c4ec35d61dd664191031e0890a4012ec89..214d290f99931f6f210e473e2bbb295e8a7fb84c 100644 --- a/patch-tracking/patch_tracking/util/github_api.py +++ b/patch-tracking/patch_tracking/util/github_api.py @@ -4,7 +4,7 @@ functionality of invoking GitHub API import time import logging import requests -from requests.exceptions import ConnectionError as requests_connectionError +from requests import exceptions from flask import current_app logger = logging.getLogger(__name__) @@ -29,19 +29,23 @@ def get_user_info(token): try: ret = requests.get(url, headers=headers) if ret.status_code == 200: - return 'success', ret.text - return 'error', ret.json() - except requests_connectionError as err: + return True, ret.text + return False, ret.json() + except exceptions.ConnectionError as err: logger.warning(err) time.sleep(10) count -= 1 continue + except UnicodeEncodeError: + return False, 'github token is bad credentials.' + except IOError as error: + return False, error if count == 0: logger.error('Fail to connnect to github: %s after retry 30 times.', url) - return 'connect error' + return False, 'connect error' -class GitHubApi: +class GitHubApi(object): """ Encapsulates GitHub functionality """ @@ -67,14 +71,17 @@ class GitHubApi: try: response = requests.get(url, headers=self.headers) return response - except requests_connectionError as err: + except exceptions.ConnectionError as err: logger.warning(err) time.sleep(10) count -= 1 continue + except IOError as err: + logger.error(err) + return False if count == 0: logger.error('Fail to connnect to github: %s after retry 30 times.', url) - return 'connect error' + return False def get_commit_info(self, repo_url, commit_id): """ @@ -84,7 +91,7 @@ class GitHubApi: api_url = 'https://api.github.com/repos' url = '/'.join([api_url, repo_url, 'commits', commit_id]) ret = self.api_request(url) - if ret != 'connect error': + if ret: if ret.status_code == 200: res_dict['commit_id'] = commit_id res_dict['message'] = ret.json()['commit']['message'] @@ -108,7 +115,7 @@ class GitHubApi: url = '/'.join([api_url, repo_url, 'branches', branch]) ret = self.api_request(url) res_dict = dict() - if ret != 'connect error': + if ret: if ret.status_code == 200: res_dict['latest_commit'] = ret.json()['commit']['sha'] res_dict['message'] = ret.json()['commit']['commit']['message'] @@ -133,7 +140,7 @@ class GitHubApi: url = '/'.join([api_url, repo_url, 'compare', commit]) ret = self.api_request(url) - if ret != 'connect error': + if ret: if ret.status_code == 200: patch_content = ret.text ret_dict['status'] = 'success'