diff options
| author | Joffrey F <f.joffrey@gmail.com> | 2015-04-27 11:29:05 -0700 |
|---|---|---|
| committer | Joffrey F <f.joffrey@gmail.com> | 2015-04-27 11:29:05 -0700 |
| commit | 2b153a63c86b1f9fa95f41095a0e39a89a79a5f1 (patch) | |
| tree | 33b27337b5a72972cb03cdf865d1f20d8a6f11f2 | |
| parent | 8d3dedf0727c8d621a41e100bf04396c40ff385d (diff) | |
| parent | 019751daa8df3c62eb4fa971dbe7ee671c133a1f (diff) | |
| download | docker-py-2b153a63c86b1f9fa95f41095a0e39a89a79a5f1.tar.gz | |
Merge pull request #564 from docker/check_resource_not_none
Added check_resource decorator
| -rw-r--r-- | docker/client.py | 39 | ||||
| -rw-r--r-- | docker/errors.py | 4 | ||||
| -rw-r--r-- | docker/utils/__init__.py | 3 | ||||
| -rw-r--r-- | docker/utils/decorators.py | 13 | ||||
| -rw-r--r-- | tests/test.py | 15 |
5 files changed, 69 insertions, 5 deletions
diff --git a/docker/client.py b/docker/client.py index 30e80c7..774224c 100644 --- a/docker/client.py +++ b/docker/client.py @@ -26,7 +26,7 @@ import six from .auth import auth from .unixconn import unixconn from .ssladapter import ssladapter -from .utils import utils +from .utils import utils, check_resource from . import errors from .tls import TLSConfig @@ -154,6 +154,7 @@ class Client(requests.Session): 'stream': 1 } + @check_resource def _attach_websocket(self, container, params=None): if six.PY3: raise NotImplementedError("This method is not currently supported " @@ -249,6 +250,7 @@ class Client(requests.Session): def api_version(self): return self._version + @check_resource def attach(self, container, stdout=True, stderr=True, stream=False, logs=False): if isinstance(container, dict): @@ -285,6 +287,7 @@ class Client(requests.Session): [x for x in self._multiplexed_buffer_helper(response)] ) + @check_resource def attach_socket(self, container, params=None, ws=False): if params is None: params = { @@ -398,6 +401,7 @@ class Client(requests.Session): return None, output return match.group(1), output + @check_resource def commit(self, container, repository=None, tag=None, message=None, author=None, conf=None): if isinstance(container, dict): @@ -436,6 +440,7 @@ class Client(requests.Session): x['Id'] = x['Id'][:12] return res + @check_resource def copy(self, container, resource): if isinstance(container, dict): container = container.get('Id') @@ -480,6 +485,7 @@ class Client(requests.Session): res = self._post_json(u, data=config, params=params) return self._result(res, True) + @check_resource def diff(self, container): if isinstance(container, dict): container = container.get('Id') @@ -506,6 +512,7 @@ class Client(requests.Session): params=params, stream=True), decode=decode) + @check_resource def execute(self, container, cmd, detach=False, stdout=True, stderr=True, stream=False, tty=False): if utils.compare_version('1.15', self._version) < 0: @@ -548,6 +555,7 @@ class Client(requests.Session): [x for x in self._multiplexed_buffer_helper(res)] ) + @check_resource def export(self, container): if isinstance(container, dict): container = container.get('Id') @@ -556,12 +564,14 @@ class Client(requests.Session): self._raise_for_status(res) return res.raw + @check_resource def get_image(self, image): res = self._get(self._url("/images/{0}/get".format(image)), stream=True) self._raise_for_status(res) return res.raw + @check_resource def history(self, image): res = self._get(self._url("/images/{0}/history".format(image))) return self._result(res, True) @@ -671,18 +681,20 @@ class Client(requests.Session): return self._result(self._get(self._url("/info")), True) + @check_resource def insert(self, image, url, path): if utils.compare_version('1.12', self._version) >= 0: raise errors.DeprecatedMethod( 'insert is not available for API version >=1.12' ) - api_url = self._url("/images/" + image + "/insert") + api_url = self._url("/images/{0}/insert".fornat(image)) params = { 'url': url, 'path': path } return self._result(self._post(api_url, params=params)) + @check_resource def inspect_container(self, container): if isinstance(container, dict): container = container.get('Id') @@ -690,12 +702,14 @@ class Client(requests.Session): self._get(self._url("/containers/{0}/json".format(container))), True) - def inspect_image(self, image_id): + @check_resource + def inspect_image(self, image): return self._result( - self._get(self._url("/images/{0}/json".format(image_id))), + self._get(self._url("/images/{0}/json".format(image))), True ) + @check_resource def kill(self, container, signal=None): if isinstance(container, dict): container = container.get('Id') @@ -743,6 +757,7 @@ class Client(requests.Session): self._auth_configs[registry] = req_data return self._result(response, json=True) + @check_resource def logs(self, container, stdout=True, stderr=True, stream=False, timestamps=False, tail='all'): if isinstance(container, dict): @@ -777,6 +792,7 @@ class Client(requests.Session): logs=True ) + @check_resource def pause(self, container): if isinstance(container, dict): container = container.get('Id') @@ -787,6 +803,7 @@ class Client(requests.Session): def ping(self): return self._result(self._get(self._url('/_ping'))) + @check_resource def port(self, container, private_port): if isinstance(container, dict): container = container.get('Id') @@ -884,6 +901,7 @@ class Client(requests.Session): return stream and self._stream_helper(response) \ or self._result(response) + @check_resource def remove_container(self, container, v=False, link=False, force=False): if isinstance(container, dict): container = container.get('Id') @@ -892,6 +910,7 @@ class Client(requests.Session): params=params) self._raise_for_status(res) + @check_resource def remove_image(self, image, force=False, noprune=False): if isinstance(image, dict): image = image.get('Id') @@ -899,6 +918,7 @@ class Client(requests.Session): res = self._delete(self._url("/images/" + image), params=params) self._raise_for_status(res) + @check_resource def rename(self, container, name): if utils.compare_version('1.17', self._version) < 0: raise errors.InvalidVersion( @@ -911,6 +931,7 @@ class Client(requests.Session): res = self._post(url, params=params) self._raise_for_status(res) + @check_resource def resize(self, container, height, width): if isinstance(container, dict): container = container.get('Id') @@ -920,6 +941,7 @@ class Client(requests.Session): res = self._post(url, params=params) self._raise_for_status(res) + @check_resource def restart(self, container, timeout=10): if isinstance(container, dict): container = container.get('Id') @@ -933,6 +955,7 @@ class Client(requests.Session): params={'term': term}), True) + @check_resource def start(self, container, binds=None, port_bindings=None, lxc_conf=None, publish_all_ports=False, links=None, privileged=False, dns=None, dns_search=None, volumes_from=None, network_mode=None, @@ -995,6 +1018,7 @@ class Client(requests.Session): res = self._post_json(url, data=start_config) self._raise_for_status(res) + @check_resource def stats(self, container, decode=None): if utils.compare_version('1.17', self._version) < 0: raise errors.InvalidVersion( @@ -1005,6 +1029,7 @@ class Client(requests.Session): url = self._url("/containers/{0}/stats".format(container)) return self._stream_helper(self._get(url, stream=True), decode=decode) + @check_resource def stop(self, container, timeout=10): if isinstance(container, dict): container = container.get('Id') @@ -1015,6 +1040,7 @@ class Client(requests.Session): timeout=(timeout + self.timeout)) self._raise_for_status(res) + @check_resource def tag(self, image, repository, tag=None, force=False): params = { 'tag': tag, @@ -1026,7 +1052,10 @@ class Client(requests.Session): self._raise_for_status(res) return res.status_code == 201 + @check_resource def top(self, container): + if isinstance(container, dict): + container = container.get('Id') u = self._url("/containers/{0}/top".format(container)) return self._result(self._get(u), True) @@ -1034,6 +1063,7 @@ class Client(requests.Session): url = self._url("/version", versioned_api=api_version) return self._result(self._get(url), json=True) + @check_resource def unpause(self, container): if isinstance(container, dict): container = container.get('Id') @@ -1041,6 +1071,7 @@ class Client(requests.Session): res = self._post(url) self._raise_for_status(res) + @check_resource def wait(self, container, timeout=None): if isinstance(container, dict): container = container.get('Id') diff --git a/docker/errors.py b/docker/errors.py index fb9cb5a..d15e332 100644 --- a/docker/errors.py +++ b/docker/errors.py @@ -78,3 +78,7 @@ class TLSParameterError(DockerException): "client configurations. See " "http://docs.docker.com/examples/https/ for " "API details.") + + +class NullResource(DockerException, ValueError): + pass diff --git a/docker/utils/__init__.py b/docker/utils/__init__.py index 3594b9c..81cc8a6 100644 --- a/docker/utils/__init__.py +++ b/docker/utils/__init__.py @@ -5,4 +5,5 @@ from .utils import ( create_container_config, parse_bytes, ping_registry ) # flake8: noqa -from .types import Ulimit, LogConfig # flake8: noqa
\ No newline at end of file +from .types import Ulimit, LogConfig # flake8: noqa +from .decorators import check_resource #flake8: noqa diff --git a/docker/utils/decorators.py b/docker/utils/decorators.py new file mode 100644 index 0000000..8d07f93 --- /dev/null +++ b/docker/utils/decorators.py @@ -0,0 +1,13 @@ +import docker.errors + + +def check_resource(f): + def wrapped(self, resource_id=None, *args, **kwargs): + if resource_id is None and ( + kwargs.get('container') is None and kwargs.get('image') is None + ): + raise docker.errors.NullResource( + 'image or container param is None' + ) + return f(self, resource_id, *args, **kwargs) + return wrapped diff --git a/tests/test.py b/tests/test.py index f2af58b..76c5638 100644 --- a/tests/test.py +++ b/tests/test.py @@ -669,6 +669,21 @@ class DockerClientTest(Cleanup, base.BaseTestCase): args[1]['timeout'], docker.client.DEFAULT_TIMEOUT_SECONDS ) + def test_start_container_none(self): + try: + self.client.start(container=None) + except ValueError as e: + self.assertEqual(str(e), 'image or container param is None') + else: + self.fail('Command should raise ValueError') + + try: + self.client.start(None) + except ValueError as e: + self.assertEqual(str(e), 'image or container param is None') + else: + self.fail('Command should raise ValueError') + def test_create_container_with_lxc_conf(self): try: self.client.create_container( |
