sort_services_test.py 7.3 KB

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