asekretenko commented on a change in pull request #383:
URL: https://github.com/apache/mesos/pull/383#discussion_r662518660
##########
File path: src/python/cli_new/lib/cli/http.py
##########
@@ -19,70 +19,70 @@
"""
import json
-import urllib.request
-import urllib.error
-import urllib.parse
-import time
+from urllib.parse import urlencode
+import urllib3
import cli
from cli.exceptions import CLIException
+# Disable all SSL warnings. These are not necessary, as the user has
+# the option to disable SSL verification.
+urllib3.disable_warnings()
-def read_endpoint(addr, endpoint, query=None):
+def read_endpoint(addr, endpoint, config, query=None):
"""
Read the specified endpoint and return the results.
"""
+
try:
addr = cli.util.sanitize_address(addr)
except Exception as exception:
raise CLIException("Unable to sanitize address '{addr}': {error}"
.format(addr=addr, error=str(exception)))
-
try:
url = "{addr}/{endpoint}".format(addr=addr, endpoint=endpoint)
if query is not None:
- url += "?{query}".format(query=urllib.parse.urlencode(query))
- http_response = urllib.request.urlopen(url).read().decode("utf-8")
+ url += "?{query}".format(query=urlencode(query))
+ if config.principal() is not None and config.secret() is not None:
+ headers = urllib3.make_headers(
+ basic_auth=config.principal() + ":" + config.secret()
+ )
+ else:
+ headers = None
+ http = urllib3.PoolManager()
+ http_response = http.request(
+ 'GET',
+ url,
+ headers=headers,
+ timeout=config.agent_timeout()
+ )
+ return http_response.data.decode('utf-8')
+
except Exception as exception:
raise CLIException("Unable to open url '{url}': {error}"
.format(url=url, error=str(exception)))
- return http_response
-
-def get_json(addr, endpoint, condition=None, timeout=5, query=None):
+def get_json(addr, endpoint, config, condition=None, query=None):
"""
Return the contents of the 'endpoint' at 'addr' as JSON data
subject to the condition specified in 'condition'. If we are
- unable to read the data or unable to meet the condition within
- 'timeout' seconds we throw an error.
+ unable to read the data we throw an error.
"""
- start_time = time.time()
- while True:
- data = None
+ data = read_endpoint(addr, endpoint, config, query)
- try:
- data = read_endpoint(addr, endpoint, query)
- except Exception as exception:
- pass
-
- if data:
- try:
- data = json.loads(data)
- except Exception as exception:
- raise CLIException("Could not load JSON from '{data}': {error}"
- .format(data=data, error=str(exception)))
-
- if not condition:
- return data
+ try:
+ data = json.loads(data)
+ except Exception as exception:
+ raise CLIException("Could not load JSON from '{data}': {error}"
+ .format(data=data, error=str(exception)))
- if condition(data):
- return data
+ if not condition:
+ return data
- if time.time() - start_time > timeout:
- raise CLIException("Failed to get data within {seconds} seconds"
- .format(seconds=str(timeout)))
+ if condition(data):
Review comment:
Does this all mean that `get_json()` now returns `data` anyway,
regardless of whether `condition(data)` returned `true` or `false`? Is the
`condition` parameter really needed then?
It occurs to me that we have a lot of code in the tests which used to use
this function to wait until `condition` becomes true (example:
https://github.com/apache/mesos/blob/72f16f68973bf7d2ce5c621539a21fc4eccfa56e/src/python/cli_new/lib/cli/tests/base.py#L280).
While removing a lame retry loop is a good thing (this loop in its existing
form is harmful for production environments, as it contains no exponential
backoff logic), something needs to be done with these tests make use of
`condition`.
If these tests are dead code, that dead code should be removed (ideally, in
a separate commit).
On the other hand, if this wait-for-condition functionality is really needed
by tests, I would say that it should be pulled into a separate function
wrapping the new `get_json()`. Given that this is apparently only used in
tests, this new wrapper fucnction should be a part of the tests suite and not
of this file.
Given that production code is not using this `condition` logic, it makes
sense to remove the `condition` parameter from this method altogether in either
case.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]