| # 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 io |
| import tarfile |
| import tempfile |
| from distutils.version import StrictVersion |
| |
| import requests |
| import six |
| |
| |
| def 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 f |
| |
| |
| def tar(path): |
| f = tempfile.NamedTemporaryFile() |
| t = tarfile.open(mode='w', fileobj=f) |
| t.add(path, arcname='.') |
| t.close() |
| f.seek(0) |
| return f |
| |
| |
| def 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 1 |
| |
| |
| def ping(url): |
| try: |
| res = requests.get(url) |
| except Exception: |
| return False |
| else: |
| return res.status_code < 400 |
| |
| |
| def _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] |
| else: |
| result['HostPort'] = binding |
| |
| if result['HostPort'] is None: |
| result['HostPort'] = '' |
| else: |
| result['HostPort'] = str(result['HostPort']) |
| |
| return result |
| |
| |
| def 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 result |
| |
| |
| def parse_repository_tag(repo): |
| column_index = repo.rfind(':') |
| if column_index < 0: |
| return repo, "" |
| tag = repo[column_index+1:] |
| slash_index = tag.find('/') |
| if slash_index < 0: |
| return repo[:column_index], tag |
| |
| return repo, "" |