Skip to content

Commit 033e160

Browse files
Added has_image method to client-side Docker manager (fixes #316) (#317)
* added head method to API * added has_image to client-side Docker manager * added HEAD /docker/images/:name * bug fix: bad var name * updated changelog * bug fix: use .get and catch error
1 parent c55bf9d commit 033e160

File tree

4 files changed

+34
-1
lines changed

4 files changed

+34
-1
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
* Added `__contains__` to client- and server-side `BugManager`.
66
* Added `__delitem__` to client- and server-side `BugManager`.
7+
* Added `head` method to client API interface.
8+
* Added `has_image` method to client-side Docker manager.
79

810

911
## 2.1.23 (2019-02-28)

bugzoo/client/api.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
from ..exceptions import ConnectionFailure, UnexpectedResponse, BugZooException
1515

1616
logger = logging.getLogger(__name__) # type: logging.Logger
17+
logger.setLevel(logging.DEBUG)
1718

1819
__all__ = ['APIClient']
1920

@@ -109,6 +110,11 @@ def put(self, path: str, **kwargs) -> requests.Response:
109110
logger.debug('PUT: %s', url)
110111
return requests.put(url, **kwargs)
111112

113+
def head(self, path: str, **kwargs) -> requests.Response:
114+
url = self._url(path)
115+
logger.debug('HEAD: %s', url)
116+
return requests.head(url, **kwargs)
117+
112118
def patch(self, path: str, data, **kwargs ) -> requests.Response:
113119
url = self._url(path)
114120
logger.debug('PATCH: %s', url)

bugzoo/client/dockerm.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from .api import APIClient
66

77
logger = logging.getLogger(__name__) # type: logging.Logger
8+
logger.setLevel(logging.DEBUG)
89

910

1011
class DockerManager(object):
@@ -14,14 +15,26 @@ class DockerManager(object):
1415
def __init__(self, api: APIClient) -> None:
1516
self.__api = api
1617

18+
def has_image(self, name: str) -> bool:
19+
"""
20+
Determines whether the server has a Docker image with a given name.
21+
"""
22+
path = "docker/images/{}".format(name)
23+
r = self.__api.head(path)
24+
if r.status_code == 204:
25+
return True
26+
elif r.status_code == 404:
27+
return False
28+
self.__api.handle_erroneous_response(r)
29+
1730
def delete_image(self, name: str) -> None:
1831
"""
1932
Deletes a Docker image with a given name.
2033
2134
Parameters:
2235
name: the name of the Docker image.
2336
"""
24-
logger.info("deleting Docker image: %s", name)
37+
logger.debug("deleting Docker image: %s", name)
2538
path = "docker/images/{}".format(name)
2639
response = self.__api.delete(path)
2740
if response.status_code != 204:

bugzoo/server/__init__.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -580,6 +580,18 @@ def docker_images(name: str):
580580
return UnexpectedServerError.from_exception(ex), 500
581581

582582

583+
@app.route('/docker/images/<path:name>', methods=['GET', 'HEAD'])
584+
@throws_errors
585+
def has_docker_image(name: str):
586+
try:
587+
daemon.docker.images.get(name)
588+
return '', 204
589+
except docker.errors.ImageNotFound:
590+
return '', 404
591+
except Exception as ex:
592+
return UnexpectedServerError.from_exception(ex), 500
593+
594+
583595
@app.route('/bugs/<uid>', methods=['DELETE'])
584596
@throws_errors
585597
def deregister_bug(uid: str):

0 commit comments

Comments
 (0)