mirror of https://github.com/docker/docker-py.git
Merge pull request #1479 from shin-/plugin-upgrade
Add upgrade_plugin method
This commit is contained in:
commit
d59b6b99cc
|
@ -35,7 +35,7 @@ def buildImages = { ->
|
|||
}
|
||||
|
||||
def getAPIVersion = { engineVersion ->
|
||||
def versionMap = ['1.12': '1.24', '1.13': '1.25']
|
||||
def versionMap = ['1.12': '1.24', '1.13': '1.26']
|
||||
return versionMap[engineVersion.substring(0, 4)]
|
||||
}
|
||||
|
||||
|
|
12
Makefile
12
Makefile
|
@ -44,11 +44,11 @@ integration-test-py3: build-py3
|
|||
.PHONY: integration-dind
|
||||
integration-dind: build build-py3
|
||||
docker rm -vf dpy-dind || :
|
||||
docker run -d --name dpy-dind --privileged dockerswarm/dind:1.13.0 docker daemon\
|
||||
docker run -d --name dpy-dind --privileged dockerswarm/dind:1.13.1 docker daemon\
|
||||
-H tcp://0.0.0.0:2375
|
||||
docker run --rm --env="DOCKER_HOST=tcp://docker:2375" --env="DOCKER_TEST_API_VERSION=1.25"\
|
||||
docker run --rm --env="DOCKER_HOST=tcp://docker:2375" --env="DOCKER_TEST_API_VERSION=1.26"\
|
||||
--link=dpy-dind:docker docker-sdk-python py.test tests/integration
|
||||
docker run --rm --env="DOCKER_HOST=tcp://docker:2375" --env="DOCKER_TEST_API_VERSION=1.25"\
|
||||
docker run --rm --env="DOCKER_HOST=tcp://docker:2375" --env="DOCKER_TEST_API_VERSION=1.26"\
|
||||
--link=dpy-dind:docker docker-sdk-python3 py.test tests/integration
|
||||
docker rm -vf dpy-dind
|
||||
|
||||
|
@ -57,14 +57,14 @@ integration-dind-ssl: build-dind-certs build build-py3
|
|||
docker run -d --name dpy-dind-certs dpy-dind-certs
|
||||
docker run -d --env="DOCKER_HOST=tcp://localhost:2375" --env="DOCKER_TLS_VERIFY=1"\
|
||||
--env="DOCKER_CERT_PATH=/certs" --volumes-from dpy-dind-certs --name dpy-dind-ssl\
|
||||
-v /tmp --privileged dockerswarm/dind:1.13.0 docker daemon --tlsverify\
|
||||
-v /tmp --privileged dockerswarm/dind:1.13.1 docker daemon --tlsverify\
|
||||
--tlscacert=/certs/ca.pem --tlscert=/certs/server-cert.pem\
|
||||
--tlskey=/certs/server-key.pem -H tcp://0.0.0.0:2375
|
||||
docker run --rm --volumes-from dpy-dind-ssl --env="DOCKER_HOST=tcp://docker:2375"\
|
||||
--env="DOCKER_TLS_VERIFY=1" --env="DOCKER_CERT_PATH=/certs" --env="DOCKER_TEST_API_VERSION=1.25"\
|
||||
--env="DOCKER_TLS_VERIFY=1" --env="DOCKER_CERT_PATH=/certs" --env="DOCKER_TEST_API_VERSION=1.26"\
|
||||
--link=dpy-dind-ssl:docker docker-sdk-python py.test tests/integration
|
||||
docker run --rm --volumes-from dpy-dind-ssl --env="DOCKER_HOST=tcp://docker:2375"\
|
||||
--env="DOCKER_TLS_VERIFY=1" --env="DOCKER_CERT_PATH=/certs" --env="DOCKER_TEST_API_VERSION=1.25"\
|
||||
--env="DOCKER_TLS_VERIFY=1" --env="DOCKER_CERT_PATH=/certs" --env="DOCKER_TEST_API_VERSION=1.26"\
|
||||
--link=dpy-dind-ssl:docker docker-sdk-python3 py.test tests/integration
|
||||
docker rm -vf dpy-dind-ssl dpy-dind-certs
|
||||
|
||||
|
|
|
@ -195,6 +195,7 @@ class PluginApiMixin(object):
|
|||
return self._stream_helper(res, decode=True)
|
||||
|
||||
@utils.minimum_version('1.25')
|
||||
@utils.check_resource
|
||||
def remove_plugin(self, name, force=False):
|
||||
"""
|
||||
Remove an installed plugin.
|
||||
|
@ -212,3 +213,39 @@ class PluginApiMixin(object):
|
|||
res = self._delete(url, params={'force': force})
|
||||
self._raise_for_status(res)
|
||||
return True
|
||||
|
||||
@utils.minimum_version('1.26')
|
||||
@utils.check_resource
|
||||
def upgrade_plugin(self, name, remote, privileges):
|
||||
"""
|
||||
Upgrade an installed plugin.
|
||||
|
||||
Args:
|
||||
name (string): Name of the plugin to upgrade. The ``:latest``
|
||||
tag is optional and is the default if omitted.
|
||||
remote (string): Remote reference to upgrade to. The
|
||||
``:latest`` tag is optional and is the default if omitted.
|
||||
privileges (list): A list of privileges the user consents to
|
||||
grant to the plugin. Can be retrieved using
|
||||
:py:meth:`~plugin_privileges`.
|
||||
|
||||
Returns:
|
||||
An iterable object streaming the decoded API logs
|
||||
"""
|
||||
|
||||
url = self._url('/plugins/{0}/upgrade', name)
|
||||
params = {
|
||||
'remote': remote,
|
||||
}
|
||||
|
||||
headers = {}
|
||||
registry, repo_name = auth.resolve_repository_name(remote)
|
||||
header = auth.get_config_header(self, registry)
|
||||
if header:
|
||||
headers['X-Registry-Auth'] = header
|
||||
response = self._post_json(
|
||||
url, params=params, headers=headers, data=privileges,
|
||||
stream=True
|
||||
)
|
||||
self._raise_for_status(response)
|
||||
return self._stream_helper(response, decode=True)
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
from .. import errors
|
||||
from .resource import Collection, Model
|
||||
|
||||
|
||||
|
@ -96,6 +97,30 @@ class Plugin(Model):
|
|||
"""
|
||||
return self.client.api.remove_plugin(self.name, force=force)
|
||||
|
||||
def upgrade(self, remote=None):
|
||||
"""
|
||||
Upgrade the plugin.
|
||||
|
||||
Args:
|
||||
remote (string): Remote reference to upgrade to. The
|
||||
``:latest`` tag is optional and is the default if omitted.
|
||||
Default: this plugin's name.
|
||||
|
||||
Returns:
|
||||
A generator streaming the decoded API logs
|
||||
"""
|
||||
if self.enabled:
|
||||
raise errors.DockerError(
|
||||
'Plugin must be disabled before upgrading.'
|
||||
)
|
||||
|
||||
if remote is None:
|
||||
remote = self.name
|
||||
privileges = self.client.api.plugin_privileges(remote)
|
||||
for d in self.client.api.upgrade_plugin(self.name, remote, privileges):
|
||||
yield d
|
||||
self._reload()
|
||||
|
||||
|
||||
class PluginCollection(Collection):
|
||||
model = Plugin
|
||||
|
|
|
@ -35,3 +35,4 @@ Plugin objects
|
|||
.. automethod:: reload
|
||||
.. automethod:: push
|
||||
.. automethod:: remove
|
||||
.. automethod:: upgrade
|
||||
|
|
|
@ -123,6 +123,16 @@ class PluginTest(BaseAPIIntegrationTest):
|
|||
assert self.client.inspect_plugin(SSHFS)
|
||||
assert self.client.enable_plugin(SSHFS)
|
||||
|
||||
@requires_api_version('1.26')
|
||||
def test_upgrade_plugin(self):
|
||||
pl_data = self.ensure_plugin_installed(SSHFS)
|
||||
assert pl_data['Enabled'] is False
|
||||
prv = self.client.plugin_privileges(SSHFS)
|
||||
logs = [d for d in self.client.upgrade_plugin(SSHFS, SSHFS, prv)]
|
||||
assert filter(lambda x: x['status'] == 'Download complete', logs)
|
||||
assert self.client.inspect_plugin(SSHFS)
|
||||
assert self.client.enable_plugin(SSHFS)
|
||||
|
||||
def test_create_plugin(self):
|
||||
plugin_data_dir = os.path.join(
|
||||
os.path.dirname(__file__), 'testdata/dummy-plugin'
|
||||
|
|
Loading…
Reference in New Issue