command.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. from __future__ import absolute_import
  2. from __future__ import unicode_literals
  3. import logging
  4. import os
  5. import re
  6. import ssl
  7. import six
  8. from . import verbose_proxy
  9. from .. import config
  10. from ..const import API_VERSIONS
  11. from ..project import Project
  12. from .docker_client import docker_client
  13. from .utils import get_version_info
  14. log = logging.getLogger(__name__)
  15. def project_from_options(project_dir, options):
  16. return get_project(
  17. project_dir,
  18. get_config_path_from_options(options),
  19. project_name=options.get('--project-name'),
  20. verbose=options.get('--verbose'),
  21. )
  22. def get_config_path_from_options(options):
  23. file_option = options.get('--file')
  24. if file_option:
  25. return file_option
  26. config_files = os.environ.get('COMPOSE_FILE')
  27. if config_files:
  28. return config_files.split(os.pathsep)
  29. return None
  30. def get_client(verbose=False, version=None, tls_version=None):
  31. client = docker_client(version=version, tls_version=tls_version)
  32. if verbose:
  33. version_info = six.iteritems(client.version())
  34. log.info(get_version_info('full'))
  35. log.info("Docker base_url: %s", client.base_url)
  36. log.info("Docker version: %s",
  37. ", ".join("%s=%s" % item for item in version_info))
  38. return verbose_proxy.VerboseProxy('docker', client)
  39. return client
  40. def get_project(project_dir, config_path=None, project_name=None, verbose=False):
  41. config_details = config.find(project_dir, config_path)
  42. project_name = get_project_name(config_details.working_dir, project_name)
  43. config_data = config.load(config_details)
  44. api_version = os.environ.get(
  45. 'COMPOSE_API_VERSION',
  46. API_VERSIONS[config_data.version])
  47. compose_tls_version = os.environ.get(
  48. 'COMPOSE_TLS_VERSION',
  49. None)
  50. tls_version = None
  51. if compose_tls_version:
  52. tls_version = ssl.getattr("PROTOCOL_{}".format(compose_tls_version))
  53. client = get_client(verbose=verbose, version=api_version, tls_version=tls_version)
  54. return Project.from_config(project_name, config_data, client)
  55. def get_project_name(working_dir, project_name=None):
  56. def normalize_name(name):
  57. return re.sub(r'[^a-z0-9]', '', name.lower())
  58. project_name = project_name or os.environ.get('COMPOSE_PROJECT_NAME')
  59. if project_name:
  60. return normalize_name(project_name)
  61. project = os.path.basename(os.path.abspath(working_dir))
  62. if project:
  63. return normalize_name(project)
  64. return 'default'