| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 | # Copyright 2013 dotCloud inc.#    Licensed under the Apache License, Version 2.0 (the "License");#    you may not use this file except in compliance with the License.#    You may obtain a copy of the License at#        http://www.apache.org/licenses/LICENSE-2.0#    Unless required by applicable law or agreed to in writing, software#    distributed under the License is distributed on an "AS IS" BASIS,#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.#    See the License for the specific language governing permissions and#    limitations under the License.import ioimport tarfileimport tempfilefrom distutils.version import StrictVersionimport requestsfrom fig.packages import sixdef mkbuildcontext(dockerfile):    f = tempfile.NamedTemporaryFile()    t = tarfile.open(mode='w', fileobj=f)    if isinstance(dockerfile, io.StringIO):        dfinfo = tarfile.TarInfo('Dockerfile')        if six.PY3:            raise TypeError('Please use io.BytesIO to create in-memory '                            'Dockerfiles with Python 3')        else:            dfinfo.size = len(dockerfile.getvalue())    elif isinstance(dockerfile, io.BytesIO):        dfinfo = tarfile.TarInfo('Dockerfile')        dfinfo.size = len(dockerfile.getvalue())    else:        dfinfo = t.gettarinfo(fileobj=dockerfile, arcname='Dockerfile')    t.addfile(dfinfo, dockerfile)    t.close()    f.seek(0)    return fdef tar(path):    f = tempfile.NamedTemporaryFile()    t = tarfile.open(mode='w', fileobj=f)    t.add(path, arcname='.')    t.close()    f.seek(0)    return fdef compare_version(v1, v2):    """Compare docker versions    >>> v1 = '1.9'    >>> v2 = '1.10'    >>> compare_version(v1, v2)    1    >>> compare_version(v2, v1)    -1    >>> compare_version(v2, v2)    0    """    s1 = StrictVersion(v1)    s2 = StrictVersion(v2)    if s1 == s2:        return 0    elif s1 > s2:        return -1    else:        return 1def ping(url):    try:        res = requests.get(url)    except Exception:        return False    else:        return res.status_code < 400def _convert_port_binding(binding):    result = {'HostIp': '', 'HostPort': ''}    if isinstance(binding, tuple):        if len(binding) == 2:            result['HostPort'] = binding[1]            result['HostIp'] = binding[0]        elif isinstance(binding[0], six.string_types):            result['HostIp'] = binding[0]        else:            result['HostPort'] = binding[0]    elif isinstance(binding, dict):        if 'HostPort' in binding:            result['HostPort'] = binding['HostPort']            if 'HostIp' in binding:                result['HostIp'] = binding['HostIp']        else:            raise ValueError(binding)    else:        result['HostPort'] = binding    if result['HostPort'] is None:        result['HostPort'] = ''    else:        result['HostPort'] = str(result['HostPort'])    return resultdef convert_port_bindings(port_bindings):    result = {}    for k, v in six.iteritems(port_bindings):        key = str(k)        if '/' not in key:            key = key + '/tcp'        if isinstance(v, list):            result[key] = [_convert_port_binding(binding) for binding in v]        else:            result[key] = [_convert_port_binding(v)]    return resultdef convert_volume_binds(binds):    result = []    for k, v in binds.items():        if isinstance(v, dict):            result.append('%s:%s:%s' % (                k, v['bind'], 'ro' if v.get('ro', False) else 'rw'            ))        else:            result.append('%s:%s:rw' % (k, v))    return resultdef parse_repository_tag(repo):    column_index = repo.rfind(':')    if column_index < 0:        return repo, None    tag = repo[column_index+1:]    slash_index = tag.find('/')    if slash_index < 0:        return repo[:column_index], tag    return repo, None
 |