Skip to content

Commit 48ac772

Browse files
committed
Add upgrade_plugin method
Signed-off-by: Joffrey F <joffrey@docker.com>
1 parent f387ae4 commit 48ac772

File tree

5 files changed

+79
-7
lines changed

5 files changed

+79
-7
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: 6 additions & 6 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\
47+
docker run -d --name dpy-dind --privileged dockerswarm/dind:1.13.1 docker daemon\
4848
-H tcp://0.0.0.0:2375
49-
docker run --rm --env="DOCKER_HOST=tcp://docker:2375" --env="DOCKER_TEST_API_VERSION=1.25"\
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\
6262
--tlskey=/certs/server-key.pem -H tcp://0.0.0.0:2375
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/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/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

tests/integration/api_plugin_test.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,16 @@ def test_install_plugin(self):
123123
assert self.client.inspect_plugin(SSHFS)
124124
assert self.client.enable_plugin(SSHFS)
125125

126+
@requires_api_version('1.26')
127+
def test_upgrade_plugin(self):
128+
pl_data = self.ensure_plugin_installed(SSHFS)
129+
assert pl_data['Enabled'] is False
130+
prv = self.client.plugin_privileges(SSHFS)
131+
logs = [d for d in self.client.upgrade_plugin(SSHFS, SSHFS, prv)]
132+
assert filter(lambda x: x['status'] == 'Download complete', logs)
133+
assert self.client.inspect_plugin(SSHFS)
134+
assert self.client.enable_plugin(SSHFS)
135+
126136
def test_create_plugin(self):
127137
plugin_data_dir = os.path.join(
128138
os.path.dirname(__file__), 'testdata/dummy-plugin'

0 commit comments

Comments
 (0)