summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoffrey F <f.joffrey@gmail.com>2016-09-14 11:09:55 -0700
committerGitHub <noreply@github.com>2016-09-14 11:09:55 -0700
commit89afee94fdc22ff10e0070c1488d18a8fb6ab233 (patch)
treeb19be492efd4be527c9d6bff1ce12cf1d5ffcbc4
parentad350b95b12d32f636dcf1fb744fde709ac66199 (diff)
parentdcd01f0f48525e4d5bb4953f1f57a7a65e424561 (diff)
downloaddocker-py-89afee94fdc22ff10e0070c1488d18a8fb6ab233.tar.gz
Merge pull request #1213 from bfirsh/parse-json-errors
Parse JSON API errors
-rw-r--r--docker/errors.py5
-rw-r--r--tests/integration/container_test.py4
-rw-r--r--tests/integration/errors_test.py17
3 files changed, 23 insertions, 3 deletions
diff --git a/docker/errors.py b/docker/errors.py
index 97be802..df18d57 100644
--- a/docker/errors.py
+++ b/docker/errors.py
@@ -11,7 +11,10 @@ class APIError(requests.exceptions.HTTPError):
self.explanation = explanation
if self.explanation is None and response.content:
- self.explanation = response.content.strip()
+ try:
+ self.explanation = response.json()['message']
+ except ValueError:
+ self.explanation = response.content.strip()
def __str__(self):
message = super(APIError, self).__str__()
diff --git a/tests/integration/container_test.py b/tests/integration/container_test.py
index 27d3046..a7267ef 100644
--- a/tests/integration/container_test.py
+++ b/tests/integration/container_test.py
@@ -118,7 +118,7 @@ class CreateContainerTest(helpers.BaseTestCase):
self.client.wait(id)
with self.assertRaises(docker.errors.APIError) as exc:
self.client.remove_container(id)
- err = exc.exception.response.text
+ err = exc.exception.explanation
self.assertIn(
'You cannot remove a running container', err
)
@@ -289,7 +289,7 @@ class CreateContainerTest(helpers.BaseTestCase):
)
self.client.start(container)
- assert six.b(expected_msg) in excinfo.value.explanation
+ assert excinfo.value.explanation == expected_msg
def test_valid_no_log_driver_specified(self):
log_config = docker.utils.LogConfig(
diff --git a/tests/integration/errors_test.py b/tests/integration/errors_test.py
new file mode 100644
index 0000000..42fbae4
--- /dev/null
+++ b/tests/integration/errors_test.py
@@ -0,0 +1,17 @@
+from docker.errors import APIError
+from .. import helpers
+
+
+class ErrorsTest(helpers.BaseTestCase):
+ def test_api_error_parses_json(self):
+ container = self.client.create_container(
+ helpers.BUSYBOX,
+ ['sleep', '10']
+ )
+ self.client.start(container['Id'])
+ with self.assertRaises(APIError) as cm:
+ self.client.remove_container(container['Id'])
+ explanation = cm.exception.explanation
+ assert 'You cannot remove a running container' in explanation
+ assert '{"message":' not in explanation
+ self.client.remove_container(container['Id'], force=True)