[lxc-devel] [pylxd/master] Verify client connection

rockstar on Github lxc-bot at linuxcontainers.org
Tue May 24 20:29:41 UTC 2016


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 492 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20160524/741a85f7/attachment.bin>
-------------- next part --------------
From 1aab599ab04da4e5c4ab68d7bb0bad118d2513ba Mon Sep 17 00:00:00 2001
From: Paul Hummer <paul at eventuallyanyway.com>
Date: Tue, 24 May 2016 14:26:22 -0600
Subject: [PATCH 1/2] Add validation to the `pylxd.Client` creation.

An exception is raised when the endpoint is invalid.
---
 pylxd/client.py            | 10 ++++++++++
 pylxd/exceptions.py        |  2 ++
 pylxd/tests/mock_lxd.py    |  7 +++++++
 pylxd/tests/test_client.py | 26 ++++++++++++++++++++++++++
 4 files changed, 45 insertions(+)
 create mode 100644 pylxd/exceptions.py

diff --git a/pylxd/client.py b/pylxd/client.py
index d2eb311..165e6ca 100644
--- a/pylxd/client.py
+++ b/pylxd/client.py
@@ -22,6 +22,7 @@
 import requests
 import requests_unixsocket
 
+from pylxd import exceptions
 from pylxd.container import Container
 from pylxd.image import Image
 from pylxd.operation import Operation
@@ -202,6 +203,15 @@ def __init__(self, endpoint=None, version='1.0'):
                 quote(path, safe='')))
         self.api = self.api[version]
 
+        # Verify the connection is valid.
+        try:
+            response = self.api.get()
+            if response.status_code != 200:
+                raise exceptions.ClientConnectionFailed()
+        except (requests.exceptions.ConnectionError,
+                requests.exceptions.InvalidURL):
+            raise exceptions.ClientConnectionFailed()
+
         self.containers = self.Containers(self)
         self.images = self.Images(self)
         self.operations = self.Operations(self)
diff --git a/pylxd/exceptions.py b/pylxd/exceptions.py
new file mode 100644
index 0000000..41b5400
--- /dev/null
+++ b/pylxd/exceptions.py
@@ -0,0 +1,2 @@
+class ClientConnectionFailed(Exception):
+    """An exception raised when the Client connection fails."""
diff --git a/pylxd/tests/mock_lxd.py b/pylxd/tests/mock_lxd.py
index e580ffd..9f144db 100644
--- a/pylxd/tests/mock_lxd.py
+++ b/pylxd/tests/mock_lxd.py
@@ -36,6 +36,13 @@ def profile_GET(request, context):
 
 
 RULES = [
+    # General service endpoints
+    {
+        'text': '',
+        'method': 'GET',
+        'url': r'^http://pylxd.test/1.0$',
+    },
+
     # Containers
     {
         'text': json.dumps({'metadata': [
diff --git a/pylxd/tests/test_client.py b/pylxd/tests/test_client.py
index ecd4698..512ff49 100644
--- a/pylxd/tests/test_client.py
+++ b/pylxd/tests/test_client.py
@@ -11,6 +11,16 @@
 class TestClient(unittest.TestCase):
     """Tests for pylxd.client.Client."""
 
+    def setUp(self):
+        self.patcher = mock.patch('pylxd.client._APINode.get')
+        self.get = self.patcher.start()
+
+        response = mock.MagicMock(status_code=200)
+        self.get.return_value = response
+
+    def tearDown(self):
+        self.patcher.stop()
+
     def test_create(self):
         """Client creation sets default API endpoint."""
         expected = 'http+unix://%2Fvar%2Flib%2Flxd%2Funix.socket/1.0'
@@ -37,6 +47,22 @@ def test_create_endpoint(self):
 
         self.assertEqual(expected, an_client.api._api_endpoint)
 
+    def test_connection_404(self):
+        """If the endpoint 404s, an exception is raised."""
+        response = mock.MagicMock(status_code=404)
+        self.get.return_value = response
+
+        self.assertRaises(Exception, client.Client)
+
+    def test_connection_failed(self):
+        """If the connection fails, an exception is raised."""
+        def raise_exception():
+            raise requests.exceptions.ConnectionError()
+        self.get.side_effect = raise_exception
+        self.get.return_value = None
+
+        self.assertRaises(Exception, client.Client)
+
 
 class TestAPINode(unittest.TestCase):
     """Tests for pylxd.client._APINode."""

From d1af9d4a245ae6cc60baca4080b88fd2ef8f911c Mon Sep 17 00:00:00 2001
From: Paul Hummer <paul at eventuallyanyway.com>
Date: Tue, 24 May 2016 14:28:11 -0600
Subject: [PATCH 2/2] Add `pylxd.client.Client` to `pylxd.Client`.

---
 pylxd/__init__.py | 1 +
 1 file changed, 1 insertion(+)

diff --git a/pylxd/__init__.py b/pylxd/__init__.py
index 0ba37c6..6fac57e 100644
--- a/pylxd/__init__.py
+++ b/pylxd/__init__.py
@@ -17,3 +17,4 @@
 __version__ = pbr.version.VersionInfo('pylxd').version_string()
 
 from pylxd.deprecated import api  # NOQA
+from pylxd.client import Client  # NOQA


More information about the lxc-devel mailing list