You are viewing a plain text version of this content. The canonical link for it is here.
Posted to reviews@mesos.apache.org by GitBox <gi...@apache.org> on 2021/07/01 18:46:11 UTC

[GitHub] [mesos] asekretenko commented on a change in pull request #383: Add mesos authentication to the mesos cli

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 mean that this code 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.




-- 
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: reviews-unsubscribe@mesos.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org