project.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. from .service import Service
  2. def sort_service_dicts(services):
  3. # Sort in dependency order
  4. def cmp(x, y):
  5. x_deps_y = y['name'] in x.get('links', [])
  6. y_deps_x = x['name'] in y.get('links', [])
  7. if x_deps_y and not y_deps_x:
  8. return 1
  9. elif y_deps_x and not x_deps_y:
  10. return -1
  11. return 0
  12. return sorted(services, cmp=cmp)
  13. class Project(object):
  14. """
  15. A collection of services.
  16. """
  17. def __init__(self, name, services, client):
  18. self.name = name
  19. self.services = services
  20. self.client = client
  21. @classmethod
  22. def from_dicts(cls, name, service_dicts, client):
  23. """
  24. Construct a ServiceCollection from a list of dicts representing services.
  25. """
  26. project = cls(name, [], client)
  27. for service_dict in sort_service_dicts(service_dicts):
  28. # Reference links by object
  29. links = []
  30. if 'links' in service_dict:
  31. for service_name in service_dict.get('links', []):
  32. links.append(project.get_service(service_name))
  33. del service_dict['links']
  34. project.services.append(Service(client=client, project=name, links=links, **service_dict))
  35. return project
  36. @classmethod
  37. def from_config(cls, name, config, client):
  38. dicts = []
  39. for service_name, service in config.items():
  40. service['name'] = service_name
  41. dicts.append(service)
  42. return cls.from_dicts(name, dicts, client)
  43. def get_service(self, name):
  44. for service in self.services:
  45. if service.name == name:
  46. return service
  47. def create_containers(self):
  48. """
  49. Returns a list of (service, container) tuples,
  50. one for each service with no running containers.
  51. """
  52. containers = []
  53. for service in self.services:
  54. if len(service.containers()) == 0:
  55. containers.append((service, service.create_container()))
  56. return containers
  57. def kill_and_remove(self, tuples):
  58. for (service, container) in tuples:
  59. container.kill()
  60. container.remove()
  61. def start(self, **options):
  62. for service in self.services:
  63. service.start(**options)
  64. def stop(self, **options):
  65. for service in self.services:
  66. service.stop(**options)
  67. def containers(self, *args, **kwargs):
  68. l = []
  69. for service in self.services:
  70. for container in service.containers(*args, **kwargs):
  71. l.append(container)
  72. return l