serialize.py 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. from __future__ import absolute_import
  2. from __future__ import unicode_literals
  3. import six
  4. import yaml
  5. from compose.config import types
  6. from compose.config.config import V1
  7. from compose.config.config import V2_0
  8. from compose.config.config import V2_1
  9. def serialize_config_type(dumper, data):
  10. representer = dumper.represent_str if six.PY3 else dumper.represent_unicode
  11. return representer(data.repr())
  12. yaml.SafeDumper.add_representer(types.VolumeFromSpec, serialize_config_type)
  13. yaml.SafeDumper.add_representer(types.VolumeSpec, serialize_config_type)
  14. def denormalize_config(config):
  15. denormalized_services = [
  16. denormalize_service_dict(service_dict, config.version)
  17. for service_dict in config.services
  18. ]
  19. services = {
  20. service_dict.pop('name'): service_dict
  21. for service_dict in denormalized_services
  22. }
  23. networks = config.networks.copy()
  24. for net_name, net_conf in networks.items():
  25. if 'external_name' in net_conf:
  26. del net_conf['external_name']
  27. version = config.version
  28. if version not in (V2_0, V2_1):
  29. version = V2_1
  30. return {
  31. 'version': version,
  32. 'services': services,
  33. 'networks': networks,
  34. 'volumes': config.volumes,
  35. }
  36. def serialize_config(config):
  37. return yaml.safe_dump(
  38. denormalize_config(config),
  39. default_flow_style=False,
  40. indent=2,
  41. width=80)
  42. def denormalize_service_dict(service_dict, version):
  43. service_dict = service_dict.copy()
  44. if 'restart' in service_dict:
  45. service_dict['restart'] = types.serialize_restart_spec(service_dict['restart'])
  46. if version == V1 and 'network_mode' not in service_dict:
  47. service_dict['network_mode'] = 'bridge'
  48. return service_dict