+ def delete_cmd(self, url, headers):
+ self._logger.debug("")
+ resp = self._request("DELETE", url, headers)
+
+ return resp.text
+
+ def _request(self, op, url, http_headers, data=None, retry_auth_error=True):
+ headers = http_headers.copy()
+
+ # Get authorization (include authentication headers)
+ # TODO add again token
+ # token = self._get_token(headers)
+ token = None
+
+ if token:
+ headers["X-Auth-Token"] = token
+
+ try:
+ return self._request_noauth(op, url, headers, data)
+ except AuthError:
+ # If there is an auth error retry just once
+ if retry_auth_error:
+ return self._request(op, url, headers, data, retry_auth_error=False)
+
+ def _request_noauth(self, op, url, headers, data=None):
+ # Method to execute http requests with error control
+ # Authentication error, always make just one retry
+ # ConnectionError or ServiceUnavailable make configured retries with sleep between them
+ # Other errors to raise:
+ # - NotFound
+ # - Conflict
+
+ retry = 0
+ while retry < self.max_retries:
+ retry += 1
+
+ # Execute operation
+ try:
+ self._logger.info("Request METHOD: {} URL: {}".format(op, url))
+ if op == "GET":
+ resp = self._http_get(url, headers, query_params=data)
+ elif op == "POST":
+ resp = self._http_post(url, headers, json_data=data)
+ elif op == "POST_HEADERS":
+ resp = self._http_post_headers(url, headers, json_data=data)
+ elif op == "DELETE":
+ resp = self._http_delete(url, headers, json_data=data)
+ else:
+ raise HttpException("Unsupported operation: {}".format(op))
+
+ self._logger.info("Response HTTPCODE: {}".format(resp.status_code))
+
+ # Check http return code
+ if resp:
+ return resp
+ else:
+ status_code = resp.status_code
+ if status_code == 401:
+ # Auth Error - set token to None to reload it and raise AuthError
+ self.token = None
+
+ raise AuthError("Auth error executing operation")
+ elif status_code == 409:
+ raise DuplicateFound(
+ "Duplicate resource url: {}, response: {}".format(
+ url, resp.text
+ )
+ )
+ elif status_code == 404:
+ raise NotFound(
+ "Not found resource url: {}, response: {}".format(
+ url, resp.text
+ )
+ )
+ elif resp.status_code in [502, 503]:
+ if not self.max_retries or retry >= self.max_retries:
+ raise ServiceUnavailableException(
+ "Service unavailable error url: {}".format(url)
+ )
+
+ continue
+ else:
+ raise HttpException(
+ "Error status_code: {}, error_text: {}".format(
+ resp.status_code, resp.text
+ )
+ )
+
+ except ConnectionError as e:
+ self._logger.error(
+ "Connection error executing request: {}".format(repr(e))
+ )
+
+ if not self.max_retries or retry >= self.max_retries:
+ raise ConnectionError
+
+ continue
+ except Exception as e:
+ self._logger.error("Error executing request: {}".format(repr(e)))
+ raise e
+
+ def _http_get(self, url, headers, query_params=None):
+ return requests.get(url, headers=headers, params=query_params)
+
+ def _http_post_headers(self, url, headers, json_data=None):
+ return requests.head(
+ url, json=json_data, headers=headers, verify=self.ssl_verify
+ )
+
+ def _http_post(self, url, headers, json_data=None):
+ return requests.post(
+ url, json=json_data, headers=headers, verify=self.ssl_verify
+ )
+
+ def _http_delete(self, url, headers, json_data=None):
+ return requests.delete(url, json=json_data, headers=headers)