Kaydet (Commit) 65fb5be4 authored tarafından Joffrey F's avatar Joffrey F

Add support for changes param in import_image* methods

Reduce code duplication in import_image* methods
Signed-off-by: 's avatarJoffrey F <joffrey@docker.com>
üst fab4a06c
import logging import logging
import os
import six import six
import warnings import warnings
...@@ -42,87 +43,79 @@ class ImageApiMixin(object): ...@@ -42,87 +43,79 @@ class ImageApiMixin(object):
return [x['Id'] for x in res] return [x['Id'] for x in res]
return res return res
def import_image(self, src=None, repository=None, tag=None, image=None): def import_image(self, src=None, repository=None, tag=None, image=None,
if src: changes=None, stream_src=False):
if isinstance(src, six.string_types): if not (src or image):
try: raise errors.DockerException(
result = self.import_image_from_file( 'Must specify src or image to import from'
src, repository=repository, tag=tag) )
except IOError: u = self._url('/images/create')
result = self.import_image_from_url(
src, repository=repository, tag=tag)
else:
result = self.import_image_from_data(
src, repository=repository, tag=tag)
elif image:
result = self.import_image_from_image(
image, repository=repository, tag=tag)
else:
raise Exception("Must specify a src or image")
return result
def import_image_from_data(self, data, repository=None, tag=None):
u = self._url("/images/create")
params = {
'fromSrc': '-',
'repo': repository,
'tag': tag
}
headers = {
'Content-Type': 'application/tar',
}
return self._result(
self._post(u, data=data, params=params, headers=headers))
def import_image_from_file(self, filename, repository=None, tag=None): params = _import_image_params(
u = self._url("/images/create") repository, tag, image,
params = { src=(src if isinstance(src, six.string_types) else None),
'fromSrc': '-', changes=changes
'repo': repository, )
'tag': tag headers = {'Content-Type': 'application/tar'}
}
headers = { if image or params.get('fromSrc') != '-': # from image or URL
'Content-Type': 'application/tar',
}
with open(filename, 'rb') as f:
return self._result( return self._result(
self._post(u, data=f, params=params, headers=headers, self._post(u, data=None, params=params)
timeout=None)) )
elif isinstance(src, six.string_types): # from file path
with open(src, 'rb') as f:
return self._result(
self._post(
u, data=f, params=params, headers=headers, timeout=None
)
)
else: # from raw data
if stream_src:
headers['Transfer-Encoding'] = 'chunked'
return self._result(
self._post(u, data=src, params=params, headers=headers)
)
def import_image_from_stream(self, stream, repository=None, tag=None): def import_image_from_data(self, data, repository=None, tag=None,
u = self._url("/images/create") changes=None):
params = { u = self._url('/images/create')
'fromSrc': '-', params = _import_image_params(
'repo': repository, repository, tag, src='-', changes=changes
'tag': tag )
} headers = {'Content-Type': 'application/tar'}
headers = {
'Content-Type': 'application/tar',
'Transfer-Encoding': 'chunked',
}
return self._result( return self._result(
self._post(u, data=stream, params=params, headers=headers)) self._post(
u, data=data, params=params, headers=headers, timeout=None
)
)
return self.import_image(
src=data, repository=repository, tag=tag, changes=changes
)
def import_image_from_url(self, url, repository=None, tag=None): def import_image_from_file(self, filename, repository=None, tag=None,
u = self._url("/images/create") changes=None):
params = { return self.import_image(
'fromSrc': url, src=filename, repository=repository, tag=tag, changes=changes
'repo': repository, )
'tag': tag
}
return self._result(
self._post(u, data=None, params=params))
def import_image_from_image(self, image, repository=None, tag=None): def import_image_from_stream(self, stream, repository=None, tag=None,
u = self._url("/images/create") changes=None):
params = { return self.import_image(
'fromImage': image, src=stream, stream_src=True, repository=repository, tag=tag,
'repo': repository, changes=changes
'tag': tag )
}
return self._result( def import_image_from_url(self, url, repository=None, tag=None,
self._post(u, data=None, params=params)) changes=None):
return self.import_image(
src=url, repository=repository, tag=tag, changes=changes
)
def import_image_from_image(self, image, repository=None, tag=None,
changes=None):
return self.import_image(
image=image, repository=repository, tag=tag, changes=changes
)
@utils.check_resource @utils.check_resource
def insert(self, image, url, path): def insert(self, image, url, path):
...@@ -246,3 +239,32 @@ class ImageApiMixin(object): ...@@ -246,3 +239,32 @@ class ImageApiMixin(object):
res = self._post(url, params=params) res = self._post(url, params=params)
self._raise_for_status(res) self._raise_for_status(res)
return res.status_code == 201 return res.status_code == 201
def is_file(src):
try:
return (
isinstance(src, six.string_types) and
os.path.isfile(src)
)
except TypeError: # a data string will make isfile() raise a TypeError
return False
def _import_image_params(repo, tag, image=None, src=None,
changes=None):
params = {
'repo': repo,
'tag': tag,
}
if image:
params['fromImage'] = image
elif src and not is_file(src):
params['fromSrc'] = src
else:
params['fromSrc'] = '-'
if changes:
params['changes'] = changes
return params
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment