#582 Add a timeout to xmlrpc calls to prevent the socket waiting forever
Merged by lholecek. Opened by mprahl.
xmlrpc-timeout  into  master

Download 582.patch

I filed a PR in the upstream Python repo to make this simpler, however, this will take a while if it ever gets merged. This is a workaround until that gets merged and released.

@lholecek and @vmaljulin could you please review?

rebased onto 5353fe88f70565d24e25b12908235a4922ca1e95

Can you mock the transport constructors instead to see it was called with correct timeout?

rebased onto d20f0a74a30f01ce4f98b421c6549af72f7889bc

@lholecek I addressed your comment. Here is the diff:

--- a/greenwave/tests/test_xmlrpc_server_proxy.py
+++ b/greenwave/tests/test_xmlrpc_server_proxy.py
@@ -1,5 +1,6 @@
 # SPDX-License-Identifier: GPL-2.0+
+import mock
 import pytest
 from greenwave import xmlrpc_server_proxy
@@ -13,10 +14,24 @@ from greenwave import xmlrpc_server_proxy
         ('https://localhost:5000/api', xmlrpc_server_proxy.SafeTransport, (3, 12), 12),
     ),
 )
-def test_get_server_proxy_app_context(url, expected_transport, timeout, expected_timeout, app):
+@mock.patch('greenwave.xmlrpc_server_proxy.Transport')
+@mock.patch('greenwave.xmlrpc_server_proxy.SafeTransport')
+def test_get_server_proxy_app_context(
+    mock_safe_transport,
+    mock_transport,
+    url,
+    expected_transport,
+    timeout,
+    expected_timeout,
+    app,
+):
     with app.app_context():
         app.config['REQUESTS_TIMEOUT'] = timeout
-        proxy = xmlrpc_server_proxy.get_server_proxy(url)
-    transport = proxy._ServerProxy__transport
-    assert isinstance(transport, expected_transport)
-    assert transport._timeout == expected_timeout
+        xmlrpc_server_proxy.get_server_proxy(url)
+
+    if expected_transport == xmlrpc_server_proxy.Transport:
+        mock_transport.__init__.assert_called_once_with(url, expected_timeout)
+        mock_safe_transport.__init__.assert_not_called()
+    elif expected_transport == xmlrpc_server_proxy.SafeTransport:
+        mock_safe_transport.__init__.assert_called_once_with(url, expected_timeout)
+        mock_transport.__init__.assert_not_called()
diff --git a/greenwave/xmlrpc_server_proxy.py b/greenwave/xmlrpc_server_proxy.py
index 8edf17e..543e4cc 100644
--- a/greenwave/xmlrpc_server_proxy.py
+++ b/greenwave/xmlrpc_server_proxy.py
@@ -40,7 +40,7 @@ def get_server_proxy(uri, timeout=None):
 class Transport(xmlrpc.client.Transport):
-    def __init__(self, *args, timeout=None, **kwargs):
+    def __init__(self, *args, timeout=None, **kwargs):  # pragma: no cover
         super().__init__(*args, **kwargs)
         self._timeout = timeout
@@ -51,7 +51,7 @@ class Transport(xmlrpc.client.Transport):
 class SafeTransport(xmlrpc.client.SafeTransport):
-    def __init__(self, *args, timeout=None, **kwargs):
+    def __init__(self, *args, timeout=None, **kwargs):  # pragma: no cover
         super().__init__(*args, **kwargs)
         self._timeout = timeout

Pull-Request has been merged by lholecek

Metadata