sort_services_test.py 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. from __future__ import absolute_import
  2. from __future__ import unicode_literals
  3. import pytest
  4. from compose.config.errors import DependencyError
  5. from compose.config.sort_services import sort_service_dicts
  6. from compose.config.types import VolumeFromSpec
  7. class TestSortService(object):
  8. def test_sort_service_dicts_1(self):
  9. services = [
  10. {
  11. 'links': ['redis'],
  12. 'name': 'web'
  13. },
  14. {
  15. 'name': 'grunt'
  16. },
  17. {
  18. 'name': 'redis'
  19. }
  20. ]
  21. sorted_services = sort_service_dicts(services)
  22. assert len(sorted_services) == 3
  23. assert sorted_services[0]['name'] == 'grunt'
  24. assert sorted_services[1]['name'] == 'redis'
  25. assert sorted_services[2]['name'] == 'web'
  26. def test_sort_service_dicts_2(self):
  27. services = [
  28. {
  29. 'links': ['redis', 'postgres'],
  30. 'name': 'web'
  31. },
  32. {
  33. 'name': 'postgres',
  34. 'links': ['redis']
  35. },
  36. {
  37. 'name': 'redis'
  38. }
  39. ]
  40. sorted_services = sort_service_dicts(services)
  41. assert len(sorted_services) == 3
  42. assert sorted_services[0]['name'] == 'redis'
  43. assert sorted_services[1]['name'] == 'postgres'
  44. assert sorted_services[2]['name'] == 'web'
  45. def test_sort_service_dicts_3(self):
  46. services = [
  47. {
  48. 'name': 'child'
  49. },
  50. {
  51. 'name': 'parent',
  52. 'links': ['child']
  53. },
  54. {
  55. 'links': ['parent'],
  56. 'name': 'grandparent'
  57. },
  58. ]
  59. sorted_services = sort_service_dicts(services)
  60. assert len(sorted_services) == 3
  61. assert sorted_services[0]['name'] == 'child'
  62. assert sorted_services[1]['name'] == 'parent'
  63. assert sorted_services[2]['name'] == 'grandparent'
  64. def test_sort_service_dicts_4(self):
  65. services = [
  66. {
  67. 'name': 'child'
  68. },
  69. {
  70. 'name': 'parent',
  71. 'volumes_from': [VolumeFromSpec('child', 'rw', 'service')]
  72. },
  73. {
  74. 'links': ['parent'],
  75. 'name': 'grandparent'
  76. },
  77. ]
  78. sorted_services = sort_service_dicts(services)
  79. assert len(sorted_services) == 3
  80. assert sorted_services[0]['name'] == 'child'
  81. assert sorted_services[1]['name'] == 'parent'
  82. assert sorted_services[2]['name'] == 'grandparent'
  83. def test_sort_service_dicts_5(self):
  84. services = [
  85. {
  86. 'links': ['parent'],
  87. 'name': 'grandparent'
  88. },
  89. {
  90. 'name': 'parent',
  91. 'network_mode': 'service:child'
  92. },
  93. {
  94. 'name': 'child'
  95. }
  96. ]
  97. sorted_services = sort_service_dicts(services)
  98. assert len(sorted_services) == 3
  99. assert sorted_services[0]['name'] == 'child'
  100. assert sorted_services[1]['name'] == 'parent'
  101. assert sorted_services[2]['name'] == 'grandparent'
  102. def test_sort_service_dicts_6(self):
  103. services = [
  104. {
  105. 'links': ['parent'],
  106. 'name': 'grandparent'
  107. },
  108. {
  109. 'name': 'parent',
  110. 'volumes_from': [VolumeFromSpec('child', 'ro', 'service')]
  111. },
  112. {
  113. 'name': 'child'
  114. }
  115. ]
  116. sorted_services = sort_service_dicts(services)
  117. assert len(sorted_services) == 3
  118. assert sorted_services[0]['name'] == 'child'
  119. assert sorted_services[1]['name'] == 'parent'
  120. assert sorted_services[2]['name'] == 'grandparent'
  121. def test_sort_service_dicts_7(self):
  122. services = [
  123. {
  124. 'network_mode': 'service:three',
  125. 'name': 'four'
  126. },
  127. {
  128. 'links': ['two'],
  129. 'name': 'three'
  130. },
  131. {
  132. 'name': 'two',
  133. 'volumes_from': [VolumeFromSpec('one', 'rw', 'service')]
  134. },
  135. {
  136. 'name': 'one'
  137. }
  138. ]
  139. sorted_services = sort_service_dicts(services)
  140. assert len(sorted_services) == 4
  141. assert sorted_services[0]['name'] == 'one'
  142. assert sorted_services[1]['name'] == 'two'
  143. assert sorted_services[2]['name'] == 'three'
  144. assert sorted_services[3]['name'] == 'four'
  145. def test_sort_service_dicts_circular_imports(self):
  146. services = [
  147. {
  148. 'links': ['redis'],
  149. 'name': 'web'
  150. },
  151. {
  152. 'name': 'redis',
  153. 'links': ['web']
  154. },
  155. ]
  156. with pytest.raises(DependencyError) as exc:
  157. sort_service_dicts(services)
  158. assert 'redis' in exc.exconly()
  159. assert 'web' in exc.exconly()
  160. def test_sort_service_dicts_circular_imports_2(self):
  161. services = [
  162. {
  163. 'links': ['postgres', 'redis'],
  164. 'name': 'web'
  165. },
  166. {
  167. 'name': 'redis',
  168. 'links': ['web']
  169. },
  170. {
  171. 'name': 'postgres'
  172. }
  173. ]
  174. with pytest.raises(DependencyError) as exc:
  175. sort_service_dicts(services)
  176. assert 'redis' in exc.exconly()
  177. assert 'web' in exc.exconly()
  178. def test_sort_service_dicts_circular_imports_3(self):
  179. services = [
  180. {
  181. 'links': ['b'],
  182. 'name': 'a'
  183. },
  184. {
  185. 'name': 'b',
  186. 'links': ['c']
  187. },
  188. {
  189. 'name': 'c',
  190. 'links': ['a']
  191. }
  192. ]
  193. with pytest.raises(DependencyError) as exc:
  194. sort_service_dicts(services)
  195. assert 'a' in exc.exconly()
  196. assert 'b' in exc.exconly()
  197. def test_sort_service_dicts_self_imports(self):
  198. services = [
  199. {
  200. 'links': ['web'],
  201. 'name': 'web'
  202. },
  203. ]
  204. with pytest.raises(DependencyError) as exc:
  205. sort_service_dicts(services)
  206. assert 'web' in exc.exconly()
  207. def test_sort_service_dicts_depends_on_self(self):
  208. services = [
  209. {
  210. 'depends_on': ['web'],
  211. 'name': 'web'
  212. },
  213. ]
  214. with pytest.raises(DependencyError) as exc:
  215. sort_service_dicts(services)
  216. assert 'A service can not depend on itself: web' in exc.exconly()