helpers.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. from __future__ import absolute_import
  2. from __future__ import unicode_literals
  3. import os
  4. from compose.config.config import ConfigDetails
  5. from compose.config.config import ConfigFile
  6. from compose.config.config import load
  7. BUSYBOX_IMAGE_NAME = 'busybox'
  8. BUSYBOX_DEFAULT_TAG = '1.31.0-uclibc'
  9. BUSYBOX_IMAGE_WITH_TAG = '{}:{}'.format(BUSYBOX_IMAGE_NAME, BUSYBOX_DEFAULT_TAG)
  10. def build_config(contents, **kwargs):
  11. return load(build_config_details(contents, **kwargs))
  12. def build_config_details(contents, working_dir='working_dir', filename='filename.yml'):
  13. return ConfigDetails(
  14. working_dir,
  15. [ConfigFile(filename, contents)],
  16. )
  17. def create_custom_host_file(client, filename, content):
  18. dirname = os.path.dirname(filename)
  19. container = client.create_container(
  20. BUSYBOX_IMAGE_WITH_TAG,
  21. ['sh', '-c', 'echo -n "{}" > {}'.format(content, filename)],
  22. volumes={dirname: {}},
  23. host_config=client.create_host_config(
  24. binds={dirname: {'bind': dirname, 'ro': False}},
  25. network_mode='none',
  26. ),
  27. )
  28. try:
  29. client.start(container)
  30. exitcode = client.wait(container)['StatusCode']
  31. if exitcode != 0:
  32. output = client.logs(container)
  33. raise Exception(
  34. "Container exited with code {}:\n{}".format(exitcode, output))
  35. container_info = client.inspect_container(container)
  36. if 'Node' in container_info:
  37. return container_info['Node']['Name']
  38. finally:
  39. client.remove_container(container, force=True)
  40. def create_host_file(client, filename):
  41. with open(filename, 'r') as fh:
  42. content = fh.read()
  43. return create_custom_host_file(client, filename, content)