This is an automated email from the ASF dual-hosted git repository.

vatamane pushed a commit to branch more-flakes-in-cluster-setup
in repository https://gitbox.apache.org/repos/asf/couchdb.git

commit 960ab6f928e1d8dbad5c647cf77a9069ed7583c3
Author: Nick Vatamaniuc <[email protected]>
AuthorDate: Wed Dec 6 23:56:49 2023 -0500

    More flaky fixes for cluster setup
    
    Noticed nouveau elixir tests still throw `connection refused` errors in the
    `finish_cluster` setup step. So try to make all the http requests in dev/run
    use retries. That also helps us DRY out some repeating bits like header auth
    and json application content type.
    
    We also had an odd `import catch error then import again` clause. I don't 
think
    we intend this to work on python 2 any longer so I cleaned that up as well.
---
 dev/run | 118 +++++++++++++++++++++++++++-------------------------------------
 1 file changed, 50 insertions(+), 68 deletions(-)

diff --git a/dev/run b/dev/run
index dbdfecf03..8d47d76f9 100755
--- a/dev/run
+++ b/dev/run
@@ -40,15 +40,8 @@ from pbkdf2 import pbkdf2_hex
 
 COMMON_SALT = uuid.uuid4().hex
 
-try:
-    from urllib.request import urlopen
-except ImportError:
-    from urllib.request import urlopen
-
-try:
-    import http.client as httpclient
-except ImportError:
-    import http.client as httpclient
+from urllib.request import urlopen
+import http.client as httpclient
 
 
 def toposixpath(path):
@@ -1018,10 +1011,6 @@ def enable_cluster(node_count, port, user, pswd):
             "node_count": node_count,
         }
     )
-    headers = {
-        "Authorization": basic_auth_header(user, pswd),
-        "Content-Type": "application/json",
-    }
     (status, response) = try_request(
         "127.0.0.1",
         port,
@@ -1029,7 +1018,7 @@ def enable_cluster(node_count, port, user, pswd):
         "/_cluster_setup",
         (201, 400),
         body=body,
-        headers=headers,
+        headers=setup_headers(user, pswd),
         error="Failed to run _cluster_setup",
     )
     if status == 400:
@@ -1039,65 +1028,62 @@ def enable_cluster(node_count, port, user, pswd):
 
 
 def add_node(lead_port, node_name, node_port, user, pswd):
-    conn = httpclient.HTTPConnection("127.0.0.1", lead_port)
-    conn.request(
+    body = json.dumps(
+        {
+            "action": "add_node",
+            "host": "127.0.0.1",
+            "port": node_port,
+            "name": node_name,
+            "username": user,
+            "password": pswd,
+        }
+    )
+    (status, response) = try_request(
+        "127.0.0.1",
+        lead_port,
         "POST",
         "/_cluster_setup",
-        json.dumps(
-            {
-                "action": "add_node",
-                "host": "127.0.0.1",
-                "port": node_port,
-                "name": node_name,
-                "username": user,
-                "password": pswd,
-            }
-        ),
-        {
-            "Authorization": basic_auth_header(user, pswd),
-            "Content-Type": "application/json",
-        },
+        (201, 409),
+        body=body,
+        headers=setup_headers(user, pswd),
     )
-    resp = conn.getresponse()
-    assert resp.status in (201, 409), resp.read()
-    resp.close()
+    assert status in (201, 409), response
 
 
 def set_cookie(port, user, pswd):
-    conn = httpclient.HTTPConnection("127.0.0.1", port)
-    conn.request(
+    (status, response) = try_request(
+        "127.0.0.1",
+        port,
         "POST",
         "/_cluster_setup",
-        json.dumps({"action": "receive_cookie", "cookie": generate_cookie()}),
-        {
-            "Authorization": basic_auth_header(user, pswd),
-            "Content-Type": "application/json",
-        },
+        (201,),
+        body=json.dumps({"action": "receive_cookie", "cookie": 
generate_cookie()}),
+        headers=setup_headers(user, pswd),
     )
-    resp = conn.getresponse()
-    assert resp.status == 201, resp.read()
-    resp.close()
+    assert status == 201, response
 
 
 def finish_cluster(port, user, pswd):
-    conn = httpclient.HTTPConnection("127.0.0.1", port)
-    conn.request(
+    (status, response) = try_request(
+        "127.0.0.1",
+        port,
         "POST",
         "/_cluster_setup",
-        json.dumps({"action": "finish_cluster"}),
-        {
-            "Authorization": basic_auth_header(user, pswd),
-            "Content-Type": "application/json",
-        },
+        (201, 400),
+        body=json.dumps({"action": "finish_cluster"}),
+        headers=setup_headers(user, pswd),
+        error="Failed to run _finish_cluster",
     )
-    resp = conn.getresponse()
-    # 400 for already set up'ed cluster
-    assert resp.status in (201, 400), resp.read()
-    resp.close()
+    # 400 for already set up cluster
+    assert status in (201, 400), response
 
 
-def basic_auth_header(user, pswd):
-    return "Basic " + base64.b64encode((user + ":" + pswd).encode()).decode()
+def setup_headers(user, pswd):
+    b64userpass = base64.b64encode((user + ":" + pswd).encode()).decode()
+    return {
+        "Authorization": "Basic " + b64userpass,
+        "Content-Type": "application/json",
+    }
 
 
 def generate_cookie():
@@ -1135,18 +1121,14 @@ def try_request(
 
 def create_system_databases(host, port):
     for dbname in ["_users", "_replicator", "_global_changes"]:
-        conn = httpclient.HTTPConnection(host, port)
-        conn.request("HEAD", "/" + dbname)
-        resp = conn.getresponse()
-        if resp.status == 404:
-            try_request(
-                host,
-                port,
-                "PUT",
-                "/" + dbname,
-                (201, 202, 412),
-                error="Failed to create '%s' database:\n" % dbname,
-            )
+        try_request(
+            host,
+            port,
+            "PUT",
+            "/" + dbname,
+            (201, 202, 412),
+            error="Failed to create '%s' database:\n" % dbname,
+        )
 
 
 @log(

Reply via email to