forked from ISPsystem/isp-maintenance
		
	Update: BaseAPI class now has error handler
This commit is contained in:
		
							parent
							
								
									cdf3a92527
								
							
						
					
					
						commit
						f773898b71
					
				| @ -1,14 +1,18 @@ | |||||||
| import sys | import sys | ||||||
| import json | import json | ||||||
|  | import click | ||||||
| import urllib | import urllib | ||||||
| import requests | import requests | ||||||
| 
 | 
 | ||||||
|  | from time import sleep | ||||||
|  | 
 | ||||||
| from mgrctl.settings.api import ( | from mgrctl.settings.api import ( | ||||||
|     API_URL, |     API_URL, | ||||||
|     API_HEADERS, |     API_HEADERS, | ||||||
|     API_EMAIL, |     API_EMAIL, | ||||||
|     API_PASSWORD, |     API_PASSWORD, | ||||||
|     API_VERIFY_SSL |     API_VERIFY_SSL, | ||||||
|  |     API_COUNT_TRY_CONNECTIONS | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @ -27,47 +31,66 @@ class BaseAPI(object): | |||||||
|         return f'{self.API_URL}/{self.API_DEFINITION}/{self.API_VERSION}{url}' |         return f'{self.API_URL}/{self.API_DEFINITION}/{self.API_VERSION}{url}' | ||||||
| 
 | 
 | ||||||
|     def call_api(self, url, method='GET', headers={}, data={}): |     def call_api(self, url, method='GET', headers={}, data={}): | ||||||
|         # Open session |         attempt = API_COUNT_TRY_CONNECTIONS | ||||||
|         with requests.Session() as session: |         while attempt: | ||||||
|             try: |             try: | ||||||
|                 url = self._gen_request_url(url) |                 uri = self._gen_request_url(url) | ||||||
|                 headers = self.API_HEADERS if not headers else headers |                 headers = self.API_HEADERS if not headers else headers | ||||||
|                 params_str = urllib.parse.urlencode(data, safe="+'()") |                 params_str = urllib.parse.urlencode(data, safe="+'()") | ||||||
|                 if method == 'POST': |                 if method == 'POST': | ||||||
|                     api_request = session.post( |                     api_request = requests.post( | ||||||
|                         url=url, |                         url=uri, | ||||||
|                         json=data, |                         json=data, | ||||||
|                         headers=headers, |                         headers=headers, | ||||||
|                         verify=self.API_VERIFY_SSL |                         verify=self.API_VERIFY_SSL | ||||||
|                     ) |                     ) | ||||||
|                 if method == 'GET': |                 if method == 'GET': | ||||||
|                     url = f'{url}?{params_str}' if params_str else url |                     uri = f'{uri}?{params_str}' if params_str else uri | ||||||
|                     api_request = session.get( |                     api_request = requests.get( | ||||||
|                         url=url, |                         url=uri, | ||||||
|                         headers=headers, |                         headers=headers, | ||||||
|                         verify=self.API_VERIFY_SSL |                         verify=self.API_VERIFY_SSL | ||||||
|                     ) |                     ) | ||||||
|             except Exception as error: |             except Exception as error: | ||||||
|                 api_request = { |                 click.echo(f'Error: {type(error).__name__}') | ||||||
|                     'result': False, |                 sys.exit() | ||||||
|                     'error': type(error).__name__ |  | ||||||
|                 } |  | ||||||
|                 return api_request |  | ||||||
|             finally: |  | ||||||
|                 session.close() |  | ||||||
| 
 | 
 | ||||||
|         # Get response |             # Get response: | ||||||
|  |             response = self._parse_response(api_request) | ||||||
|  | 
 | ||||||
|  |             # Validate response: | ||||||
|  |             if self._error_handler(response): | ||||||
|  |                 attempt -= 1 | ||||||
|  |                 sleep(2)  # wait 2 second timeout | ||||||
|  |                 continue  # new attempt connection | ||||||
|  | 
 | ||||||
|  |             return response | ||||||
|  | 
 | ||||||
|  |     def _parse_response(self, api_request): | ||||||
|         try: |         try: | ||||||
|             response = json.loads(api_request.text) |             response = json.loads(api_request.text) | ||||||
|             if 'error' in response and response['error']: |  | ||||||
|                 print(response['error']) |  | ||||||
|                 raise sys.exit() |  | ||||||
|             return response |             return response | ||||||
|         except json.decoder.JSONDecodeError: |         except json.decoder.JSONDecodeError: | ||||||
|             response = {'error': 'Can not parse response'} |             click.echo('Error: Invalid API response') | ||||||
|             print(response) |  | ||||||
|             raise sys.exit() |             raise sys.exit() | ||||||
| 
 | 
 | ||||||
|  |     def _is_error(self, response): | ||||||
|  |         if response.get('error'): | ||||||
|  |             return True | ||||||
|  | 
 | ||||||
|  |     def _is_error_3004(self, error): | ||||||
|  |         if error.get('code') == 3004: | ||||||
|  |             return True | ||||||
|  | 
 | ||||||
|  |     def _error_handler(self, response): | ||||||
|  |         if self._is_error(response): | ||||||
|  |             error = response.get('error') | ||||||
|  |             if self._is_error_3004(error): | ||||||
|  |                 return True | ||||||
|  |             else: | ||||||
|  |                 click.echo(f'Error: API return {response}') | ||||||
|  |                 raise sys.exit() | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| class BaseAuthAPI(BaseAPI): | class BaseAuthAPI(BaseAPI): | ||||||
|     def __init__(self): |     def __init__(self): | ||||||
|  | |||||||
| @ -1,5 +1,6 @@ | |||||||
| from requests.packages import urllib3 | from requests.packages import urllib3 | ||||||
| 
 | 
 | ||||||
|  | from mgrctl.settings.environment import env | ||||||
| from mgrctl.settings.platform import ( | from mgrctl.settings.platform import ( | ||||||
|     PLATFORM_TYPE, |     PLATFORM_TYPE, | ||||||
|     PLATFORM_VERIFY_SSL, |     PLATFORM_VERIFY_SSL, | ||||||
| @ -26,6 +27,9 @@ API_HEADERS = {"Internal-Auth": "on", "Accept": "application/json"} | |||||||
| # Alias for import: | # Alias for import: | ||||||
| API_VERIFY_SSL = PLATFORM_VERIFY_SSL | API_VERIFY_SSL = PLATFORM_VERIFY_SSL | ||||||
| 
 | 
 | ||||||
|  | # API 3004 Unavailable error handler: | ||||||
|  | API_COUNT_TRY_CONNECTIONS = env.int('API_COUNT_TRY_CONNECTIONS', 3) | ||||||
|  | 
 | ||||||
| # Suppress warning from urllib3: | # Suppress warning from urllib3: | ||||||
| if not PLATFORM_VERIFY_SSL_WARNING: | if not PLATFORM_VERIFY_SSL_WARNING: | ||||||
|     # ! This is not recommended, |     # ! This is not recommended, | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user