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 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)]
|
return versionMap[engineVersion.substring(0, 4)]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
12
Makefile
12
Makefile
|
@ -44,11 +44,11 @@ integration-test-py3: build-py3
|
||||||
.PHONY: integration-dind
|
.PHONY: integration-dind
|
||||||
integration-dind: build build-py3
|
integration-dind: build build-py3
|
||||||
docker rm -vf dpy-dind || :
|
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
|
-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
|
--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
|
--link=dpy-dind:docker docker-sdk-python3 py.test tests/integration
|
||||||
docker rm -vf dpy-dind
|
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 --name dpy-dind-certs dpy-dind-certs
|
||||||
docker run -d --env="DOCKER_HOST=tcp://localhost:2375" --env="DOCKER_TLS_VERIFY=1"\
|
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\
|
--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\
|
--tlscacert=/certs/ca.pem --tlscert=/certs/server-cert.pem\
|
||||||
--tlskey=/certs/server-key.pem -H tcp://0.0.0.0:2375
|
--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"\
|
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
|
--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"\
|
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
|
--link=dpy-dind-ssl:docker docker-sdk-python3 py.test tests/integration
|
||||||
docker rm -vf dpy-dind-ssl dpy-dind-certs
|
docker rm -vf dpy-dind-ssl dpy-dind-certs
|
||||||
|
|
||||||
|
|
|
@ -195,6 +195,7 @@ class PluginApiMixin(object):
|
||||||
return self._stream_helper(res, decode=True)
|
return self._stream_helper(res, decode=True)
|
||||||
|
|
||||||
@utils.minimum_version('1.25')
|
@utils.minimum_version('1.25')
|
||||||
|
@utils.check_resource
|
||||||
def remove_plugin(self, name, force=False):
|
def remove_plugin(self, name, force=False):
|
||||||
"""
|
"""
|
||||||
Remove an installed plugin.
|
Remove an installed plugin.
|
||||||
|
@ -212,3 +213,39 @@ class PluginApiMixin(object):
|
||||||
res = self._delete(url, params={'force': force})
|
res = self._delete(url, params={'force': force})
|
||||||
self._raise_for_status(res)
|
self._raise_for_status(res)
|
||||||
return True
|
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
|
from .resource import Collection, Model
|
||||||
|
|
||||||
|
|
||||||
|
@ -96,6 +97,30 @@ class Plugin(Model):
|
||||||
"""
|
"""
|
||||||
return self.client.api.remove_plugin(self.name, force=force)
|
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):
|
class PluginCollection(Collection):
|
||||||
model = Plugin
|
model = Plugin
|
||||||
|
|
|
@ -35,3 +35,4 @@ Plugin objects
|
||||||
.. automethod:: reload
|
.. automethod:: reload
|
||||||
.. automethod:: push
|
.. automethod:: push
|
||||||
.. automethod:: remove
|
.. automethod:: remove
|
||||||
|
.. automethod:: upgrade
|
||||||
|
|
|
@ -123,6 +123,16 @@ class PluginTest(BaseAPIIntegrationTest):
|
||||||
assert self.client.inspect_plugin(SSHFS)
|
assert self.client.inspect_plugin(SSHFS)
|
||||||
assert self.client.enable_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):
|
def test_create_plugin(self):
|
||||||
plugin_data_dir = os.path.join(
|
plugin_data_dir = os.path.join(
|
||||||
os.path.dirname(__file__), 'testdata/dummy-plugin'
|
os.path.dirname(__file__), 'testdata/dummy-plugin'
|
||||||
|
|
Loading…
Reference in New Issue