1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-18 16:36:15 +00:00

add timeout in calling metadata api

This commit is contained in:
Junxiang Huang
2024-06-14 17:44:36 +08:00
parent 3fb3df016e
commit 84165cc72f
2 changed files with 36 additions and 44 deletions

View File

@@ -37,13 +37,6 @@ def scan_library(repo_id, parent_dir = '/'):
scan_result += scan_library(repo_id, posixpath.join(parent_dir, dirent.obj_name))
return scan_result
def check_repo_metadata_is_enable(repo_id):
record = RepoMetadata.objects.filter(repo_id=repo_id).first()
if record and record.enabled:
return True
return False
def list_metadata_records(repo_id, user, parent_dir=None, name=None, is_dir=None, page=None, per_page=25, order_by=None):
sql = f'SELECT \
`{METADATA_COLUMN_ID.name}`, \
@@ -134,7 +127,11 @@ class MetadataManage(APIView):
return api_error(status.HTTP_403_FORBIDDEN, error_msg)
try:
is_enabled = check_repo_metadata_is_enable(repo_id)
record = RepoMetadata.objects.filter(repo_id=repo_id).first()
if record and record.enabled:
is_enabled = True
else:
is_enabled = False
except Exception as e:
logger.error(e)
error_msg = 'Internal Server Error'
@@ -260,20 +257,20 @@ class MetadataManage(APIView):
if not record or not record.enabled:
error_msg = f'The repo {repo_id} has disabledd the metadata manage.'
return api_error(status.HTTP_409_CONFLICT, error_msg)
metadata_server_api = MetadataServerAPI(repo_id, request.user.username)
try:
metadata_server_api = MetadataServerAPI(repo_id, request.user.username)
try:
metadata_server_api.delete_base()
except ConnectionError as err:
logger.error(err)
status_code, reason = err
return api_error(status.HTTP_503_SERVICE_UNAVAILABLE, f'error from metadata server with code {status_code}: {reason}')
except Exception as err:
logger.error(err)
error_msg = 'Internal Server Error'
return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg)
metadata_server_api.delete_base()
except ConnectionError as err:
logger.error(err)
status_code, reason = err
return api_error(status.HTTP_503_SERVICE_UNAVAILABLE, f'error from metadata server with code {status_code}: {reason}')
except Exception as err:
logger.error(err)
error_msg = 'Internal Server Error'
return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg)
try:
record.enabled = False
record.save()
except Exception as e:
@@ -331,7 +328,8 @@ class MetadataRecords(APIView):
return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
# metadata enable check
if not check_repo_metadata_is_enable(repo_id):
record = RepoMetadata.objects.filter(repo_id=repo_id).first()
if not record or not record.enabled:
error_msg = f'The metadata module is disabled for repo {repo_id}.'
return api_error(status.HTTP_404_NOT_FOUND, error_msg)
@@ -381,7 +379,8 @@ class MetadataRecords(APIView):
return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
# metadata enable check
if not check_repo_metadata_is_enable(repo_id):
record = RepoMetadata.objects.filter(repo_id=repo_id).first()
if not record or not record.enabled:
error_msg = f'The metadata module is disabled for repo {repo_id}.'
return api_error(status.HTTP_404_NOT_FOUND, error_msg)
@@ -476,7 +475,8 @@ class MetadataRecord(APIView):
name = request.data.get('name')
# metadata enable check
if not check_repo_metadata_is_enable(repo_id):
record = RepoMetadata.objects.filter(repo_id=repo_id).first()
if not record or not record.enabled:
error_msg = f'The metadata module is disabled for repo {repo_id}.'
return api_error(status.HTTP_404_NOT_FOUND, error_msg)
@@ -594,7 +594,8 @@ class MetadataRecord(APIView):
def delete(self, request, repo_id, record_id):
# metadata enable check
if not check_repo_metadata_is_enable(repo_id):
record = RepoMetadata.objects.filter(repo_id=repo_id).first()
if not record or not record.enabled:
error_msg = f'The metadata module is disabled for repo {repo_id}.'
return api_error(status.HTTP_404_NOT_FOUND, error_msg)

View File

@@ -38,13 +38,15 @@ def parse_response(response):
pass
class MetadataServerAPI:
def __init__(self, base_id, user):
def __init__(self, base_id, user, timeout=30):
self.base_id = base_id
self.user = user
self.headers = self.gen_headers()
self.timeout = timeout
def gen_headers(self):
payload = {
'exp': int(time.time()) + 300,
'exp': int(time.time()) + 3600,
'base_id': self.base_id,
'user': self.user
}
@@ -52,73 +54,62 @@ class MetadataServerAPI:
return {"Authorization": "Bearer %s" % token}
def create_base(self):
headers = self.gen_headers()
#create a metadata base for base_id
url = f'{METADATA_SERVER_URL}/api/v1/base/{self.base_id}'
response = requests.post(url, headers=headers)
response = requests.post(url, headers=self.headers, timeout=self.timeout)
return parse_response(response)
def delete_base(self):
headers = self.gen_headers()
url = f'{METADATA_SERVER_URL}/api/v1/base/{self.base_id}'
response = requests.delete(url, headers=headers)
response = requests.delete(url, headers=self.headers, timeout=self.timeout)
return parse_response(response)
def add_column(self, table, column):
headers = self.gen_headers()
url = f'{METADATA_SERVER_URL}/api/v1/base/{self.base_id}/columns'
data = {
'table_id': table.id,
'column': column.to_build_column_dict()
}
response = requests.post(url, json=data, headers=headers)
response = requests.post(url, json=data, headers=self.headers, timeout=self.timeout)
return parse_response(response)
def insert_rows(self, table, columns, rows):
headers = self.gen_headers()
url = f'{METADATA_SERVER_URL}/api/v1/base/{self.base_id}/rows'
data = {
'table_id': table.id,
'column_keys': [column.key for column in columns],
'rows': rows
}
response = requests.post(url, json=data, headers=headers)
response = requests.post(url, json=data, headers=self.headers, timeout=self.timeout)
return parse_response(response)
def update_rows(self, table, columns, rows):
headers = self.gen_headers()
url = f'{METADATA_SERVER_URL}/api/v1/base/{self.base_id}/rows'
data = {
'table_id': table.id,
'column_keys': [column.key for column in columns],
'rows': rows
}
response = requests.put(url, json=data, headers=headers)
response = requests.put(url, json=data, headers=self.headers, timeout=self.timeout)
return parse_response(response)
def delete_rows(self, table, row_ids):
headers = self.gen_headers()
url = f'{METADATA_SERVER_URL}/api/v1/base/{self.base_id}/rows'
data = {
'table_id': table.id,
'row_ids': row_ids
}
response = requests.delete(url, json=data, headers=headers)
response = requests.delete(url, json=data, headers=self.headers, timeout=self.timeout)
return parse_response(response)
def query_rows(self, sql, params=[]):
headers = self.gen_headers()
post_data = {
'sql': sql
}
if params:
post_data['params'] = params
url = f'{METADATA_SERVER_URL}/api/v1/base/{self.base_id}/query'
response = requests.post(url, json=post_data, headers=headers)
response = requests.post(url, json=post_data, headers=self.headers, timeout=self.timeout)
return parse_response(response)