You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

296 lines
12 KiB

2 years ago
  1. # coding: utf-8
  2. """
  3. Seaweedfs Master Server API
  4. The Seaweedfs Master Server API allows you to store blobs # noqa: E501
  5. The version of the OpenAPI document: 3.43.0
  6. Generated by: https://openapi-generator.tech
  7. """
  8. from __future__ import absolute_import
  9. import io
  10. import json
  11. import logging
  12. import re
  13. import ssl
  14. from urllib.parse import urlencode, quote_plus
  15. import urllib3
  16. from openapi_client.exceptions import ApiException, UnauthorizedException, ForbiddenException, NotFoundException, ServiceException, ApiValueError
  17. logger = logging.getLogger(__name__)
  18. class RESTResponse(io.IOBase):
  19. def __init__(self, resp):
  20. self.urllib3_response = resp
  21. self.status = resp.status
  22. self.reason = resp.reason
  23. self.data = resp.data
  24. def getheaders(self):
  25. """Returns a dictionary of the response headers."""
  26. return self.urllib3_response.headers
  27. def getheader(self, name, default=None):
  28. """Returns a given response header."""
  29. return self.urllib3_response.headers.get(name, default)
  30. class RESTClientObject(object):
  31. def __init__(self, configuration, pools_size=4, maxsize=None):
  32. # urllib3.PoolManager will pass all kw parameters to connectionpool
  33. # https://github.com/shazow/urllib3/blob/f9409436f83aeb79fbaf090181cd81b784f1b8ce/urllib3/poolmanager.py#L75 # noqa: E501
  34. # https://github.com/shazow/urllib3/blob/f9409436f83aeb79fbaf090181cd81b784f1b8ce/urllib3/connectionpool.py#L680 # noqa: E501
  35. # maxsize is the number of requests to host that are allowed in parallel # noqa: E501
  36. # Custom SSL certificates and client certificates: http://urllib3.readthedocs.io/en/latest/advanced-usage.html # noqa: E501
  37. # cert_reqs
  38. if configuration.verify_ssl:
  39. cert_reqs = ssl.CERT_REQUIRED
  40. else:
  41. cert_reqs = ssl.CERT_NONE
  42. addition_pool_args = {}
  43. if configuration.assert_hostname is not None:
  44. addition_pool_args['assert_hostname'] = configuration.assert_hostname # noqa: E501
  45. if configuration.retries is not None:
  46. addition_pool_args['retries'] = configuration.retries
  47. if configuration.socket_options is not None:
  48. addition_pool_args['socket_options'] = configuration.socket_options
  49. if maxsize is None:
  50. if configuration.connection_pool_maxsize is not None:
  51. maxsize = configuration.connection_pool_maxsize
  52. else:
  53. maxsize = 4
  54. # https pool manager
  55. if configuration.proxy:
  56. self.pool_manager = urllib3.ProxyManager(
  57. num_pools=pools_size,
  58. maxsize=maxsize,
  59. cert_reqs=cert_reqs,
  60. ca_certs=configuration.ssl_ca_cert,
  61. cert_file=configuration.cert_file,
  62. key_file=configuration.key_file,
  63. proxy_url=configuration.proxy,
  64. proxy_headers=configuration.proxy_headers,
  65. **addition_pool_args
  66. )
  67. else:
  68. self.pool_manager = urllib3.PoolManager(
  69. num_pools=pools_size,
  70. maxsize=maxsize,
  71. cert_reqs=cert_reqs,
  72. ca_certs=configuration.ssl_ca_cert,
  73. cert_file=configuration.cert_file,
  74. key_file=configuration.key_file,
  75. **addition_pool_args
  76. )
  77. def request(self, method, url, query_params=None, headers=None,
  78. body=None, post_params=None, _preload_content=True,
  79. _request_timeout=None):
  80. """Perform requests.
  81. :param method: http request method
  82. :param url: http request url
  83. :param query_params: query parameters in the url
  84. :param headers: http request headers
  85. :param body: request json body, for `application/json`
  86. :param post_params: request post parameters,
  87. `application/x-www-form-urlencoded`
  88. and `multipart/form-data`
  89. :param _preload_content: if False, the urllib3.HTTPResponse object will
  90. be returned without reading/decoding response
  91. data. Default is True.
  92. :param _request_timeout: timeout setting for this request. If one
  93. number provided, it will be total request
  94. timeout. It can also be a pair (tuple) of
  95. (connection, read) timeouts.
  96. """
  97. method = method.upper()
  98. assert method in ['GET', 'HEAD', 'DELETE', 'POST', 'PUT',
  99. 'PATCH', 'OPTIONS']
  100. if post_params and body:
  101. raise ApiValueError(
  102. "body parameter cannot be used with post_params parameter."
  103. )
  104. post_params = post_params or {}
  105. headers = headers or {}
  106. # url already contains the URL query string
  107. # so reset query_params to empty dict
  108. query_params = {}
  109. timeout = None
  110. if _request_timeout:
  111. if isinstance(_request_timeout, (int,float)): # noqa: E501,F821
  112. timeout = urllib3.Timeout(total=_request_timeout)
  113. elif (isinstance(_request_timeout, tuple) and
  114. len(_request_timeout) == 2):
  115. timeout = urllib3.Timeout(
  116. connect=_request_timeout[0], read=_request_timeout[1])
  117. try:
  118. # For `POST`, `PUT`, `PATCH`, `OPTIONS`, `DELETE`
  119. if method in ['POST', 'PUT', 'PATCH', 'OPTIONS', 'DELETE']:
  120. # no content type provided or payload is json
  121. if not headers.get('Content-Type') or re.search('json', headers['Content-Type'], re.IGNORECASE):
  122. request_body = None
  123. if body is not None:
  124. request_body = json.dumps(body)
  125. r = self.pool_manager.request(
  126. method, url,
  127. body=request_body,
  128. preload_content=_preload_content,
  129. timeout=timeout,
  130. headers=headers)
  131. elif headers['Content-Type'] == 'application/x-www-form-urlencoded': # noqa: E501
  132. r = self.pool_manager.request(
  133. method, url,
  134. fields=post_params,
  135. encode_multipart=False,
  136. preload_content=_preload_content,
  137. timeout=timeout,
  138. headers=headers)
  139. elif headers['Content-Type'] == 'multipart/form-data':
  140. # must del headers['Content-Type'], or the correct
  141. # Content-Type which generated by urllib3 will be
  142. # overwritten.
  143. del headers['Content-Type']
  144. r = self.pool_manager.request(
  145. method, url,
  146. fields=post_params,
  147. encode_multipart=True,
  148. preload_content=_preload_content,
  149. timeout=timeout,
  150. headers=headers)
  151. # Pass a `string` parameter directly in the body to support
  152. # other content types than Json when `body` argument is
  153. # provided in serialized form
  154. elif isinstance(body, str) or isinstance(body, bytes):
  155. request_body = body
  156. r = self.pool_manager.request(
  157. method, url,
  158. body=request_body,
  159. preload_content=_preload_content,
  160. timeout=timeout,
  161. headers=headers)
  162. else:
  163. # Cannot generate the request from given parameters
  164. msg = """Cannot prepare a request message for provided
  165. arguments. Please check that your arguments match
  166. declared content type."""
  167. raise ApiException(status=0, reason=msg)
  168. # For `GET`, `HEAD`
  169. else:
  170. r = self.pool_manager.request(method, url,
  171. fields={},
  172. preload_content=_preload_content,
  173. timeout=timeout,
  174. headers=headers)
  175. except urllib3.exceptions.SSLError as e:
  176. msg = "{0}\n{1}".format(type(e).__name__, str(e))
  177. raise ApiException(status=0, reason=msg)
  178. if _preload_content:
  179. r = RESTResponse(r)
  180. # log response body
  181. logger.debug("response body: %s", r.data)
  182. if not 200 <= r.status <= 299:
  183. if r.status == 401:
  184. raise UnauthorizedException(http_resp=r)
  185. if r.status == 403:
  186. raise ForbiddenException(http_resp=r)
  187. if r.status == 404:
  188. raise NotFoundException(http_resp=r)
  189. if 500 <= r.status <= 599:
  190. raise ServiceException(http_resp=r)
  191. raise ApiException(http_resp=r)
  192. return r
  193. def get_request(self, url, headers=None, query_params=None, _preload_content=True,
  194. _request_timeout=None):
  195. return self.request("GET", url,
  196. headers=headers,
  197. _preload_content=_preload_content,
  198. _request_timeout=_request_timeout,
  199. query_params=query_params)
  200. def head_request(self, url, headers=None, query_params=None, _preload_content=True,
  201. _request_timeout=None):
  202. return self.request("HEAD", url,
  203. headers=headers,
  204. _preload_content=_preload_content,
  205. _request_timeout=_request_timeout,
  206. query_params=query_params)
  207. def options_request(self, url, headers=None, query_params=None, post_params=None,
  208. body=None, _preload_content=True, _request_timeout=None):
  209. return self.request("OPTIONS", url,
  210. headers=headers,
  211. query_params=query_params,
  212. post_params=post_params,
  213. _preload_content=_preload_content,
  214. _request_timeout=_request_timeout,
  215. body=body)
  216. def delete_request(self, url, headers=None, query_params=None, body=None,
  217. _preload_content=True, _request_timeout=None):
  218. return self.request("DELETE", url,
  219. headers=headers,
  220. query_params=query_params,
  221. _preload_content=_preload_content,
  222. _request_timeout=_request_timeout,
  223. body=body)
  224. def post_request(self, url, headers=None, query_params=None, post_params=None,
  225. body=None, _preload_content=True, _request_timeout=None):
  226. return self.request("POST", url,
  227. headers=headers,
  228. query_params=query_params,
  229. post_params=post_params,
  230. _preload_content=_preload_content,
  231. _request_timeout=_request_timeout,
  232. body=body)
  233. def put_request(self, url, headers=None, query_params=None, post_params=None,
  234. body=None, _preload_content=True, _request_timeout=None):
  235. return self.request("PUT", url,
  236. headers=headers,
  237. query_params=query_params,
  238. post_params=post_params,
  239. _preload_content=_preload_content,
  240. _request_timeout=_request_timeout,
  241. body=body)
  242. def patch_request(self, url, headers=None, query_params=None, post_params=None,
  243. body=None, _preload_content=True, _request_timeout=None):
  244. return self.request("PATCH", url,
  245. headers=headers,
  246. query_params=query_params,
  247. post_params=post_params,
  248. _preload_content=_preload_content,
  249. _request_timeout=_request_timeout,
  250. body=body)