diff options
author | Joffrey F <f.joffrey@gmail.com> | 2016-09-14 11:09:55 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-09-14 11:09:55 -0700 |
commit | 89afee94fdc22ff10e0070c1488d18a8fb6ab233 (patch) | |
tree | b19be492efd4be527c9d6bff1ce12cf1d5ffcbc4 | |
parent | ad350b95b12d32f636dcf1fb744fde709ac66199 (diff) | |
parent | dcd01f0f48525e4d5bb4953f1f57a7a65e424561 (diff) | |
download | docker-py-89afee94fdc22ff10e0070c1488d18a8fb6ab233.tar.gz |
Merge pull request #1213 from bfirsh/parse-json-errors
Parse JSON API errors
-rw-r--r-- | docker/errors.py | 5 | ||||
-rw-r--r-- | tests/integration/container_test.py | 4 | ||||
-rw-r--r-- | tests/integration/errors_test.py | 17 |
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) |