|
8 | 8 | from docker.errors import NotFound
|
9 | 9 |
|
10 | 10 | from .config import ConfigurationError
|
11 |
| -from .config import get_service_name_from_net |
| 11 | +from .config.sort_services import get_service_name_from_net |
12 | 12 | from .const import DEFAULT_TIMEOUT
|
13 | 13 | from .const import LABEL_ONE_OFF
|
14 | 14 | from .const import LABEL_PROJECT
|
|
26 | 26 | log = logging.getLogger(__name__)
|
27 | 27 |
|
28 | 28 |
|
29 |
| -def sort_service_dicts(services): |
30 |
| - # Topological sort (Cormen/Tarjan algorithm). |
31 |
| - unmarked = services[:] |
32 |
| - temporary_marked = set() |
33 |
| - sorted_services = [] |
34 |
| - |
35 |
| - def get_service_names(links): |
36 |
| - return [link.split(':')[0] for link in links] |
37 |
| - |
38 |
| - def get_service_names_from_volumes_from(volumes_from): |
39 |
| - return [volume_from.source for volume_from in volumes_from] |
40 |
| - |
41 |
| - def get_service_dependents(service_dict, services): |
42 |
| - name = service_dict['name'] |
43 |
| - return [ |
44 |
| - service for service in services |
45 |
| - if (name in get_service_names(service.get('links', [])) or |
46 |
| - name in get_service_names_from_volumes_from(service.get('volumes_from', [])) or |
47 |
| - name == get_service_name_from_net(service.get('net'))) |
48 |
| - ] |
49 |
| - |
50 |
| - def visit(n): |
51 |
| - if n['name'] in temporary_marked: |
52 |
| - if n['name'] in get_service_names(n.get('links', [])): |
53 |
| - raise DependencyError('A service can not link to itself: %s' % n['name']) |
54 |
| - if n['name'] in n.get('volumes_from', []): |
55 |
| - raise DependencyError('A service can not mount itself as volume: %s' % n['name']) |
56 |
| - else: |
57 |
| - raise DependencyError('Circular import between %s' % ' and '.join(temporary_marked)) |
58 |
| - if n in unmarked: |
59 |
| - temporary_marked.add(n['name']) |
60 |
| - for m in get_service_dependents(n, services): |
61 |
| - visit(m) |
62 |
| - temporary_marked.remove(n['name']) |
63 |
| - unmarked.remove(n) |
64 |
| - sorted_services.insert(0, n) |
65 |
| - |
66 |
| - while unmarked: |
67 |
| - visit(unmarked[-1]) |
68 |
| - |
69 |
| - return sorted_services |
70 |
| - |
71 |
| - |
72 | 29 | class Project(object):
|
73 | 30 | """
|
74 | 31 | A collection of services.
|
@@ -96,7 +53,7 @@ def from_dicts(cls, name, service_dicts, client, use_networking=False, network_d
|
96 | 53 | if use_networking:
|
97 | 54 | remove_links(service_dicts)
|
98 | 55 |
|
99 |
| - for service_dict in sort_service_dicts(service_dicts): |
| 56 | + for service_dict in service_dicts: |
100 | 57 | links = project.get_links(service_dict)
|
101 | 58 | volumes_from = project.get_volumes_from(service_dict)
|
102 | 59 | net = project.get_net(service_dict)
|
@@ -424,7 +381,3 @@ def __init__(self, name):
|
424 | 381 |
|
425 | 382 | def __str__(self):
|
426 | 383 | return self.msg
|
427 |
| - |
428 |
| - |
429 |
| -class DependencyError(ConfigurationError): |
430 |
| - pass |
0 commit comments