Please review first that the issue is fully related with this SDK by checking the relevant checkboxes ([x]).
I was trying to submit a job to one of our dev environments "intdev.modzy.engineering" but ran into an SSL error (error below).
I believe it is an issue with the certifications installed/trusted onto our SDK. It would be great if there were an optional "certs" parameter to the ApiClient connection line where we could specify a root TLS certificate to validate the HTTP response against...maybe something like
client = ApiClient(base_url = URL, api_key = KEY, certs = CERTS)
~\Anaconda3\envs\modzy\lib\site-packages\urllib3\connectionpool.py in urlopen(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw)
669 # Make the request on the httplib connection object.
--> 670 httplib_response = self._make_request(
671 conn,
~\Anaconda3\envs\modzy\lib\site-packages\urllib3\connectionpool.py in _make_request(self, conn, method, url, timeout, chunked, **httplib_request_kw)
380 try:
--> 381 self._validate_conn(conn)
382 except (SocketTimeout, BaseSSLError) as e:
~\Anaconda3\envs\modzy\lib\site-packages\urllib3\connectionpool.py in _validate_conn(self, conn)
977 if not getattr(conn, "sock", None): # AppEngine might not have `.sock`
--> 978 conn.connect()
979
~\Anaconda3\envs\modzy\lib\site-packages\urllib3\connection.py in connect(self)
361
--> 362 self.sock = ssl_wrap_socket(
363 sock=conn,
~\Anaconda3\envs\modzy\lib\site-packages\urllib3\util\ssl_.py in ssl_wrap_socket(sock, keyfile, certfile, cert_reqs, ca_certs, server_hostname, ssl_version, ciphers, ssl_context, ca_cert_dir, key_password, ca_cert_data)
385 if HAS_SNI and server_hostname is not None:
--> 386 return context.wrap_socket(sock, server_hostname=server_hostname)
387
~\Anaconda3\envs\modzy\lib\ssl.py in wrap_socket(self, sock, server_side, do_handshake_on_connect, suppress_ragged_eofs, server_hostname, session)
499 # ctx._wrap_socket()
--> 500 return self.sslsocket_class._create(
501 sock=sock,
~\Anaconda3\envs\modzy\lib\ssl.py in _create(cls, sock, server_side, do_handshake_on_connect, suppress_ragged_eofs, server_hostname, context, session)
1039 raise ValueError("do_handshake_on_connect should not be specified for non-blocking sockets")
-> 1040 self.do_handshake()
1041 except (OSError, ValueError):
~\Anaconda3\envs\modzy\lib\ssl.py in do_handshake(self, block)
1308 self.settimeout(None)
-> 1309 self._sslobj.do_handshake()
1310 finally:
SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1123)
During handling of the above exception, another exception occurred:
MaxRetryError Traceback (most recent call last)
~\Anaconda3\envs\modzy\lib\site-packages\requests\adapters.py in send(self, request, stream, timeout, verify, cert, proxies)
438 if not chunked:
--> 439 resp = conn.urlopen(
440 method=request.method,
~\Anaconda3\envs\modzy\lib\site-packages\urllib3\connectionpool.py in urlopen(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw)
725
--> 726 retries = retries.increment(
727 method, url, error=e, _pool=self, _stacktrace=sys.exc_info()[2]
~\Anaconda3\envs\modzy\lib\site-packages\urllib3\util\retry.py in increment(self, method, url, response, error, _pool, _stacktrace)
445 if new_retry.is_exhausted():
--> 446 raise MaxRetryError(_pool, url, error or ResponseError(cause))
447
MaxRetryError: HTTPSConnectionPool(host='intdev.modzy.engineering', port=443): Max retries exceeded with url: /api/models?per-page=1000 (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1123)')))
During handling of the above exception, another exception occurred:
SSLError Traceback (most recent call last)
~\Anaconda3\envs\modzy\lib\site-packages\modzy\http.py in request(self, method, url, json_data)
83 try:
---> 84 response = self.session.request(method, url, data=data, headers=headers)
85 self.logger.debug("response %s", response.status_code)
~\Anaconda3\envs\modzy\lib\site-packages\requests\sessions.py in request(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)
529 send_kwargs.update(settings)
--> 530 resp = self.send(prep, **send_kwargs)
531
~\Anaconda3\envs\modzy\lib\site-packages\requests\sessions.py in send(self, request, **kwargs)
642 # Send the request
--> 643 r = adapter.send(request, **kwargs)
644
~\Anaconda3\envs\modzy\lib\site-packages\requests\adapters.py in send(self, request, stream, timeout, verify, cert, proxies)
513 # This branch is for urllib3 v1.22 and later.
--> 514 raise SSLError(e, request=request)
515
SSLError: HTTPSConnectionPool(host='intdev.modzy.engineering', port=443): Max retries exceeded with url: /api/models?per-page=1000 (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1123)')))
During handling of the above exception, another exception occurred:
NetworkError Traceback (most recent call last)
<ipython-input-11-31a2100395aa> in <module>
----> 1 client.models.get_all()
~\Anaconda3\envs\modzy\lib\site-packages\modzy\models.py in get_all(self)
157 """
158 self.logger.debug("getting all models")
--> 159 return self.get_models()
160
161 def get_models(self, model_id=None, author=None, created_by_email=None, name=None, description=None,
~\Anaconda3\envs\modzy\lib\site-packages\modzy\models.py in get_models(self, model_id, author, created_by_email, name, description, is_active, is_expired, is_recommended, last_active_date_time, expiration_date_time, sort_by, direction, page, per_page)
253 body = {k: v for (k, v) in body.items() if v is not None}
254 self.logger.debug("body 2? %s", body)
--> 255 json_list = self._api_client.http.get('{}?{}'.format(self._base_route, urlencode(body)))
256 return list(Model(json_obj, self._api_client) for json_obj in json_list)
257
~\Anaconda3\envs\modzy\lib\site-packages\modzy\http.py in get(self, url)
121 or the client is unable to connect.
122 """
--> 123 return self.request('GET', url)
124
125 def post(self, url, json_data=None):
~\Anaconda3\envs\modzy\lib\site-packages\modzy\http.py in request(self, method, url, json_data)
86 except requests.exceptions.RequestException as ex:
87 self.logger.exception('unable to make network request')
---> 88 raise NetworkError(str(ex), url, reason=ex)
89
90 try:
NetworkError: HTTPSConnectionPool(host='intdev.modzy.engineering', port=443): Max retries exceeded with url: /api/models?per-page=1000 (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1123)')))```
Checklist
Please review first that the issue is fully related with this SDK by checking the relevant checkboxes (
[x]).Info
Description
I was trying to submit a job to one of our dev environments "intdev.modzy.engineering" but ran into an SSL error (error below).
Steps to reproduce
From a BAH machine, submit a job using the Python SDK using this line:
I believe it is an issue with the certifications installed/trusted onto our SDK. It would be great if there were an optional "certs" parameter to the
ApiClientconnection line where we could specify a root TLS certificate to validate the HTTP response against...maybe something likeclient = ApiClient(base_url = URL, api_key = KEY, certs = CERTS)The change might need to be made here https://github.com/modzy/sdk-python/blob/main/modzy/http.py#L84.
Expected results: Successful job submission.
Actual results: Error below
Traceback