Skip to content

Commit b474ea2

Browse files
authored
Merge pull request #1519 from shin-/2.2.0-release
2.2.0 release
2 parents 5742774 + cca9818 commit b474ea2

27 files changed

+396
-82
lines changed

Jenkinsfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ def buildImages = { ->
3535
}
3636

3737
def getAPIVersion = { engineVersion ->
38-
def versionMap = ['1.12': '1.24', '1.13': '1.25']
38+
def versionMap = ['1.12': '1.24', '1.13': '1.26']
3939
return versionMap[engineVersion.substring(0, 4)]
4040
}
4141

Makefile

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,11 @@ integration-test-py3: build-py3
4444
.PHONY: integration-dind
4545
integration-dind: build build-py3
4646
docker rm -vf dpy-dind || :
47-
docker run -d --name dpy-dind --privileged dockerswarm/dind:1.13.0 docker daemon\
48-
-H tcp://0.0.0.0:2375
49-
docker run --rm --env="DOCKER_HOST=tcp://docker:2375" --env="DOCKER_TEST_API_VERSION=1.25"\
47+
docker run -d --name dpy-dind --privileged dockerswarm/dind:1.13.1 docker daemon\
48+
-H tcp://0.0.0.0:2375 --experimental
49+
docker run --rm --env="DOCKER_HOST=tcp://docker:2375" --env="DOCKER_TEST_API_VERSION=1.26"\
5050
--link=dpy-dind:docker docker-sdk-python py.test tests/integration
51-
docker run --rm --env="DOCKER_HOST=tcp://docker:2375" --env="DOCKER_TEST_API_VERSION=1.25"\
51+
docker run --rm --env="DOCKER_HOST=tcp://docker:2375" --env="DOCKER_TEST_API_VERSION=1.26"\
5252
--link=dpy-dind:docker docker-sdk-python3 py.test tests/integration
5353
docker rm -vf dpy-dind
5454

@@ -57,14 +57,14 @@ integration-dind-ssl: build-dind-certs build build-py3
5757
docker run -d --name dpy-dind-certs dpy-dind-certs
5858
docker run -d --env="DOCKER_HOST=tcp://localhost:2375" --env="DOCKER_TLS_VERIFY=1"\
5959
--env="DOCKER_CERT_PATH=/certs" --volumes-from dpy-dind-certs --name dpy-dind-ssl\
60-
-v /tmp --privileged dockerswarm/dind:1.13.0 docker daemon --tlsverify\
60+
-v /tmp --privileged dockerswarm/dind:1.13.1 docker daemon --tlsverify\
6161
--tlscacert=/certs/ca.pem --tlscert=/certs/server-cert.pem\
62-
--tlskey=/certs/server-key.pem -H tcp://0.0.0.0:2375
62+
--tlskey=/certs/server-key.pem -H tcp://0.0.0.0:2375 --experimental
6363
docker run --rm --volumes-from dpy-dind-ssl --env="DOCKER_HOST=tcp://docker:2375"\
64-
--env="DOCKER_TLS_VERIFY=1" --env="DOCKER_CERT_PATH=/certs" --env="DOCKER_TEST_API_VERSION=1.25"\
64+
--env="DOCKER_TLS_VERIFY=1" --env="DOCKER_CERT_PATH=/certs" --env="DOCKER_TEST_API_VERSION=1.26"\
6565
--link=dpy-dind-ssl:docker docker-sdk-python py.test tests/integration
6666
docker run --rm --volumes-from dpy-dind-ssl --env="DOCKER_HOST=tcp://docker:2375"\
67-
--env="DOCKER_TLS_VERIFY=1" --env="DOCKER_CERT_PATH=/certs" --env="DOCKER_TEST_API_VERSION=1.25"\
67+
--env="DOCKER_TLS_VERIFY=1" --env="DOCKER_CERT_PATH=/certs" --env="DOCKER_TEST_API_VERSION=1.26"\
6868
--link=dpy-dind-ssl:docker docker-sdk-python3 py.test tests/integration
6969
docker rm -vf dpy-dind-ssl dpy-dind-certs
7070

docker/api/container.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -498,6 +498,9 @@ def create_host_config(self, *args, **kwargs):
498498
container, as a mapping of hostname to IP address.
499499
group_add (:py:class:`list`): List of additional group names and/or
500500
IDs that the container process will run as.
501+
init (bool): Run an init inside the container that forwards
502+
signals and reaps processes
503+
init_path (str): Path to the docker-init binary
501504
ipc_mode (str): Set the IPC mode for the container.
502505
isolation (str): Isolation technology to use. Default: `None`.
503506
links (dict or list of tuples): Either a dictionary mapping name

docker/api/daemon.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,22 @@
77

88

99
class DaemonApiMixin(object):
10+
@utils.minimum_version('1.25')
11+
def df(self):
12+
"""
13+
Get data usage information.
14+
15+
Returns:
16+
(dict): A dictionary representing different resource categories
17+
and their respective data usage.
18+
19+
Raises:
20+
:py:class:`docker.errors.APIError`
21+
If the server returns an error.
22+
"""
23+
url = self._url('/system/df')
24+
return self._result(self._get(url), True)
25+
1026
def events(self, since=None, until=None, filters=None, decode=None):
1127
"""
1228
Get real-time events from the server. Similar to the ``docker events``
@@ -54,7 +70,7 @@ def events(self, since=None, until=None, filters=None, decode=None):
5470
}
5571

5672
return self._stream_helper(
57-
self.get(self._url('/events'), params=params, stream=True),
73+
self._get(self._url('/events'), params=params, stream=True),
5874
decode=decode
5975
)
6076

docker/api/plugin.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ def push_plugin(self, name):
195195
return self._stream_helper(res, decode=True)
196196

197197
@utils.minimum_version('1.25')
198+
@utils.check_resource
198199
def remove_plugin(self, name, force=False):
199200
"""
200201
Remove an installed plugin.
@@ -212,3 +213,39 @@ def remove_plugin(self, name, force=False):
212213
res = self._delete(url, params={'force': force})
213214
self._raise_for_status(res)
214215
return True
216+
217+
@utils.minimum_version('1.26')
218+
@utils.check_resource
219+
def upgrade_plugin(self, name, remote, privileges):
220+
"""
221+
Upgrade an installed plugin.
222+
223+
Args:
224+
name (string): Name of the plugin to upgrade. The ``:latest``
225+
tag is optional and is the default if omitted.
226+
remote (string): Remote reference to upgrade to. The
227+
``:latest`` tag is optional and is the default if omitted.
228+
privileges (list): A list of privileges the user consents to
229+
grant to the plugin. Can be retrieved using
230+
:py:meth:`~plugin_privileges`.
231+
232+
Returns:
233+
An iterable object streaming the decoded API logs
234+
"""
235+
236+
url = self._url('/plugins/{0}/upgrade', name)
237+
params = {
238+
'remote': remote,
239+
}
240+
241+
headers = {}
242+
registry, repo_name = auth.resolve_repository_name(remote)
243+
header = auth.get_config_header(self, registry)
244+
if header:
245+
headers['X-Registry-Auth'] = header
246+
response = self._post_json(
247+
url, params=params, headers=headers, data=privileges,
248+
stream=True
249+
)
250+
self._raise_for_status(response)
251+
return self._stream_helper(response, decode=True)

docker/api/service.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,56 @@ def services(self, filters=None):
166166
url = self._url('/services')
167167
return self._result(self._get(url, params=params), True)
168168

169+
@utils.minimum_version('1.25')
170+
@utils.check_resource
171+
def service_logs(self, service, details=False, follow=False, stdout=False,
172+
stderr=False, since=0, timestamps=False, tail='all',
173+
is_tty=None):
174+
"""
175+
Get log stream for a service.
176+
Note: This endpoint works only for services with the ``json-file``
177+
or ``journald`` logging drivers.
178+
179+
Args:
180+
service (str): ID or name of the service
181+
details (bool): Show extra details provided to logs.
182+
Default: ``False``
183+
follow (bool): Keep connection open to read logs as they are
184+
sent by the Engine. Default: ``False``
185+
stdout (bool): Return logs from ``stdout``. Default: ``False``
186+
stderr (bool): Return logs from ``stderr``. Default: ``False``
187+
since (int): UNIX timestamp for the logs staring point.
188+
Default: 0
189+
timestamps (bool): Add timestamps to every log line.
190+
tail (string or int): Number of log lines to be returned,
191+
counting from the current end of the logs. Specify an
192+
integer or ``'all'`` to output all log lines.
193+
Default: ``all``
194+
is_tty (bool): Whether the service's :py:class:`ContainerSpec`
195+
enables the TTY option. If omitted, the method will query
196+
the Engine for the information, causing an additional
197+
roundtrip.
198+
199+
Returns (generator): Logs for the service.
200+
"""
201+
params = {
202+
'details': details,
203+
'follow': follow,
204+
'stdout': stdout,
205+
'stderr': stderr,
206+
'since': since,
207+
'timestamps': timestamps,
208+
'tail': tail
209+
}
210+
211+
url = self._url('/services/{0}/logs', service)
212+
res = self._get(url, params=params, stream=True)
213+
if is_tty is None:
214+
is_tty = self.inspect_service(
215+
service
216+
)['Spec']['TaskTemplate']['ContainerSpec'].get('TTY', False)
217+
return self._get_result_tty(True, res, is_tty)
218+
169219
@utils.minimum_version('1.24')
170220
def tasks(self, filters=None):
171221
"""

docker/client.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,10 @@ def events(self, *args, **kwargs):
155155
return self.api.events(*args, **kwargs)
156156
events.__doc__ = APIClient.events.__doc__
157157

158+
def df(self):
159+
return self.api.df()
160+
df.__doc__ = APIClient.df.__doc__
161+
158162
def info(self, *args, **kwargs):
159163
return self.api.info(*args, **kwargs)
160164
info.__doc__ = APIClient.info.__doc__

docker/constants.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import sys
22
from .version import version
33

4-
DEFAULT_DOCKER_API_VERSION = '1.24'
4+
DEFAULT_DOCKER_API_VERSION = '1.26'
55
MINIMUM_DOCKER_API_VERSION = '1.21'
66
DEFAULT_TIMEOUT_SECONDS = 60
77
STREAM_HEADER_SIZE_BYTES = 8

docker/models/containers.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -491,6 +491,9 @@ def run(self, image, command=None, stdout=True, stderr=False,
491491
group_add (:py:class:`list`): List of additional group names and/or
492492
IDs that the container process will run as.
493493
hostname (str): Optional hostname for the container.
494+
init (bool): Run an init inside the container that forwards
495+
signals and reaps processes
496+
init_path (str): Path to the docker-init binary
494497
ipc_mode (str): Set the IPC mode for the container.
495498
isolation (str): Isolation technology to use. Default: `None`.
496499
labels (dict or list): A dictionary of name-value labels (e.g.
@@ -726,7 +729,7 @@ def list(self, all=False, before=None, filters=None, limit=-1, since=None):
726729
727730
Args:
728731
all (bool): Show all containers. Only running containers are shown
729-
by default trunc (bool): Truncate output
732+
by default
730733
since (str): Show only containers created since Id or Name, include
731734
non-running ones
732735
before (str): Show only container created before Id or Name,
@@ -814,6 +817,8 @@ def prune(self, filters=None):
814817
'dns',
815818
'extra_hosts',
816819
'group_add',
820+
'init',
821+
'init_path',
817822
'ipc_mode',
818823
'isolation',
819824
'kernel_memory',

docker/models/plugins.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from .. import errors
12
from .resource import Collection, Model
23

34

@@ -96,6 +97,30 @@ def remove(self, force=False):
9697
"""
9798
return self.client.api.remove_plugin(self.name, force=force)
9899

100+
def upgrade(self, remote=None):
101+
"""
102+
Upgrade the plugin.
103+
104+
Args:
105+
remote (string): Remote reference to upgrade to. The
106+
``:latest`` tag is optional and is the default if omitted.
107+
Default: this plugin's name.
108+
109+
Returns:
110+
A generator streaming the decoded API logs
111+
"""
112+
if self.enabled:
113+
raise errors.DockerError(
114+
'Plugin must be disabled before upgrading.'
115+
)
116+
117+
if remote is None:
118+
remote = self.name
119+
privileges = self.client.api.plugin_privileges(remote)
120+
for d in self.client.api.upgrade_plugin(self.name, remote, privileges):
121+
yield d
122+
self._reload()
123+
99124

100125
class PluginCollection(Collection):
101126
model = Plugin

0 commit comments

Comments
 (0)