sort_services_test.py 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. from __future__ import absolute_import
  2. from __future__ import unicode_literals
  3. from compose.config.errors import DependencyError
  4. from compose.config.sort_services import sort_service_dicts
  5. from compose.config.types import VolumeFromSpec
  6. from tests import unittest
  7. class SortServiceTest(unittest.TestCase):
  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. self.assertEqual(len(sorted_services), 3)
  23. self.assertEqual(sorted_services[0]['name'], 'grunt')
  24. self.assertEqual(sorted_services[1]['name'], 'redis')
  25. self.assertEqual(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. self.assertEqual(len(sorted_services), 3)
  42. self.assertEqual(sorted_services[0]['name'], 'redis')
  43. self.assertEqual(sorted_services[1]['name'], 'postgres')
  44. self.assertEqual(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. self.assertEqual(len(sorted_services), 3)
  61. self.assertEqual(sorted_services[0]['name'], 'child')
  62. self.assertEqual(sorted_services[1]['name'], 'parent')
  63. self.assertEqual(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')]
  72. },
  73. {
  74. 'links': ['parent'],
  75. 'name': 'grandparent'
  76. },
  77. ]
  78. sorted_services = sort_service_dicts(services)
  79. self.assertEqual(len(sorted_services), 3)
  80. self.assertEqual(sorted_services[0]['name'], 'child')
  81. self.assertEqual(sorted_services[1]['name'], 'parent')
  82. self.assertEqual(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. 'net': 'container:child'
  92. },
  93. {
  94. 'name': 'child'
  95. }
  96. ]
  97. sorted_services = sort_service_dicts(services)
  98. self.assertEqual(len(sorted_services), 3)
  99. self.assertEqual(sorted_services[0]['name'], 'child')
  100. self.assertEqual(sorted_services[1]['name'], 'parent')
  101. self.assertEqual(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')]
  111. },
  112. {
  113. 'name': 'child'
  114. }
  115. ]
  116. sorted_services = sort_service_dicts(services)
  117. self.assertEqual(len(sorted_services), 3)
  118. self.assertEqual(sorted_services[0]['name'], 'child')
  119. self.assertEqual(sorted_services[1]['name'], 'parent')
  120. self.assertEqual(sorted_services[2]['name'], 'grandparent')
  121. def test_sort_service_dicts_7(self):
  122. services = [
  123. {
  124. 'net': 'container:three',
  125. 'name': 'four'
  126. },
  127. {
  128. 'links': ['two'],
  129. 'name': 'three'
  130. },
  131. {
  132. 'name': 'two',
  133. 'volumes_from': [VolumeFromSpec('one', 'rw')]
  134. },
  135. {
  136. 'name': 'one'
  137. }
  138. ]
  139. sorted_services = sort_service_dicts(services)
  140. self.assertEqual(len(sorted_services), 4)
  141. self.assertEqual(sorted_services[0]['name'], 'one')
  142. self.assertEqual(sorted_services[1]['name'], 'two')
  143. self.assertEqual(sorted_services[2]['name'], 'three')
  144. self.assertEqual(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. try:
  157. sort_service_dicts(services)
  158. except DependencyError as e:
  159. self.assertIn('redis', e.msg)
  160. self.assertIn('web', e.msg)
  161. else:
  162. self.fail('Should have thrown an DependencyError')
  163. def test_sort_service_dicts_circular_imports_2(self):
  164. services = [
  165. {
  166. 'links': ['postgres', 'redis'],
  167. 'name': 'web'
  168. },
  169. {
  170. 'name': 'redis',
  171. 'links': ['web']
  172. },
  173. {
  174. 'name': 'postgres'
  175. }
  176. ]
  177. try:
  178. sort_service_dicts(services)
  179. except DependencyError as e:
  180. self.assertIn('redis', e.msg)
  181. self.assertIn('web', e.msg)
  182. else:
  183. self.fail('Should have thrown an DependencyError')
  184. def test_sort_service_dicts_circular_imports_3(self):
  185. services = [
  186. {
  187. 'links': ['b'],
  188. 'name': 'a'
  189. },
  190. {
  191. 'name': 'b',
  192. 'links': ['c']
  193. },
  194. {
  195. 'name': 'c',
  196. 'links': ['a']
  197. }
  198. ]
  199. try:
  200. sort_service_dicts(services)
  201. except DependencyError as e:
  202. self.assertIn('a', e.msg)
  203. self.assertIn('b', e.msg)
  204. else:
  205. self.fail('Should have thrown an DependencyError')
  206. def test_sort_service_dicts_self_imports(self):
  207. services = [
  208. {
  209. 'links': ['web'],
  210. 'name': 'web'
  211. },
  212. ]
  213. try:
  214. sort_service_dicts(services)
  215. except DependencyError as e:
  216. self.assertIn('web', e.msg)
  217. else:
  218. self.fail('Should have thrown an DependencyError')