project_test.py 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. from __future__ import unicode_literals
  2. from .. import unittest
  3. from compose.service import Service
  4. from compose.project import Project
  5. from compose.container import Container
  6. import mock
  7. import docker
  8. class ProjectTest(unittest.TestCase):
  9. def setUp(self):
  10. self.mock_client = mock.create_autospec(docker.Client)
  11. def test_from_dict(self):
  12. project = Project.from_dicts('composetest', [
  13. {
  14. 'name': 'web',
  15. 'image': 'busybox:latest'
  16. },
  17. {
  18. 'name': 'db',
  19. 'image': 'busybox:latest'
  20. },
  21. ], None)
  22. self.assertEqual(len(project.services), 2)
  23. self.assertEqual(project.get_service('web').name, 'web')
  24. self.assertEqual(project.get_service('web').options['image'], 'busybox:latest')
  25. self.assertEqual(project.get_service('db').name, 'db')
  26. self.assertEqual(project.get_service('db').options['image'], 'busybox:latest')
  27. def test_from_dict_sorts_in_dependency_order(self):
  28. project = Project.from_dicts('composetest', [
  29. {
  30. 'name': 'web',
  31. 'image': 'busybox:latest',
  32. 'links': ['db'],
  33. },
  34. {
  35. 'name': 'db',
  36. 'image': 'busybox:latest',
  37. 'volumes_from': ['volume']
  38. },
  39. {
  40. 'name': 'volume',
  41. 'image': 'busybox:latest',
  42. 'volumes': ['/tmp'],
  43. }
  44. ], None)
  45. self.assertEqual(project.services[0].name, 'volume')
  46. self.assertEqual(project.services[1].name, 'db')
  47. self.assertEqual(project.services[2].name, 'web')
  48. def test_from_config(self):
  49. dicts = [
  50. {
  51. 'name': 'web',
  52. 'image': 'busybox:latest',
  53. },
  54. {
  55. 'name': 'db',
  56. 'image': 'busybox:latest',
  57. },
  58. ]
  59. project = Project.from_dicts('composetest', dicts, None)
  60. self.assertEqual(len(project.services), 2)
  61. self.assertEqual(project.get_service('web').name, 'web')
  62. self.assertEqual(project.get_service('web').options['image'], 'busybox:latest')
  63. self.assertEqual(project.get_service('db').name, 'db')
  64. self.assertEqual(project.get_service('db').options['image'], 'busybox:latest')
  65. def test_get_service(self):
  66. web = Service(
  67. project='composetest',
  68. name='web',
  69. client=None,
  70. image="busybox:latest",
  71. )
  72. project = Project('test', [web], None)
  73. self.assertEqual(project.get_service('web'), web)
  74. def test_get_services_returns_all_services_without_args(self):
  75. web = Service(
  76. project='composetest',
  77. name='web',
  78. image='foo',
  79. )
  80. console = Service(
  81. project='composetest',
  82. name='console',
  83. image='foo',
  84. )
  85. project = Project('test', [web, console], None)
  86. self.assertEqual(project.get_services(), [web, console])
  87. def test_get_services_returns_listed_services_with_args(self):
  88. web = Service(
  89. project='composetest',
  90. name='web',
  91. image='foo',
  92. )
  93. console = Service(
  94. project='composetest',
  95. name='console',
  96. image='foo',
  97. )
  98. project = Project('test', [web, console], None)
  99. self.assertEqual(project.get_services(['console']), [console])
  100. def test_get_services_with_include_links(self):
  101. db = Service(
  102. project='composetest',
  103. name='db',
  104. image='foo',
  105. )
  106. web = Service(
  107. project='composetest',
  108. name='web',
  109. image='foo',
  110. links=[(db, 'database')]
  111. )
  112. cache = Service(
  113. project='composetest',
  114. name='cache',
  115. image='foo'
  116. )
  117. console = Service(
  118. project='composetest',
  119. name='console',
  120. image='foo',
  121. links=[(web, 'web')]
  122. )
  123. project = Project('test', [web, db, cache, console], None)
  124. self.assertEqual(
  125. project.get_services(['console'], include_deps=True),
  126. [db, web, console]
  127. )
  128. def test_get_services_removes_duplicates_following_links(self):
  129. db = Service(
  130. project='composetest',
  131. name='db',
  132. image='foo',
  133. )
  134. web = Service(
  135. project='composetest',
  136. name='web',
  137. image='foo',
  138. links=[(db, 'database')]
  139. )
  140. project = Project('test', [web, db], None)
  141. self.assertEqual(
  142. project.get_services(['web', 'db'], include_deps=True),
  143. [db, web]
  144. )
  145. def test_use_volumes_from_container(self):
  146. container_id = 'aabbccddee'
  147. container_dict = dict(Name='aaa', Id=container_id)
  148. self.mock_client.inspect_container.return_value = container_dict
  149. project = Project.from_dicts('test', [
  150. {
  151. 'name': 'test',
  152. 'image': 'busybox:latest',
  153. 'volumes_from': ['aaa']
  154. }
  155. ], self.mock_client)
  156. self.assertEqual(project.get_service('test')._get_volumes_from(), [container_id])
  157. def test_use_volumes_from_service_no_container(self):
  158. container_name = 'test_vol_1'
  159. self.mock_client.containers.return_value = [
  160. {
  161. "Name": container_name,
  162. "Names": [container_name],
  163. "Id": container_name,
  164. "Image": 'busybox:latest'
  165. }
  166. ]
  167. project = Project.from_dicts('test', [
  168. {
  169. 'name': 'vol',
  170. 'image': 'busybox:latest'
  171. },
  172. {
  173. 'name': 'test',
  174. 'image': 'busybox:latest',
  175. 'volumes_from': ['vol']
  176. }
  177. ], self.mock_client)
  178. self.assertEqual(project.get_service('test')._get_volumes_from(), [container_name])
  179. @mock.patch.object(Service, 'containers')
  180. def test_use_volumes_from_service_container(self, mock_return):
  181. container_ids = ['aabbccddee', '12345']
  182. mock_return.return_value = [
  183. mock.Mock(id=container_id, spec=Container)
  184. for container_id in container_ids]
  185. project = Project.from_dicts('test', [
  186. {
  187. 'name': 'vol',
  188. 'image': 'busybox:latest'
  189. },
  190. {
  191. 'name': 'test',
  192. 'image': 'busybox:latest',
  193. 'volumes_from': ['vol']
  194. }
  195. ], None)
  196. self.assertEqual(project.get_service('test')._get_volumes_from(), container_ids)
  197. def test_net_unset(self):
  198. project = Project.from_dicts('test', [
  199. {
  200. 'name': 'test',
  201. 'image': 'busybox:latest',
  202. }
  203. ], self.mock_client)
  204. service = project.get_service('test')
  205. self.assertEqual(service._get_net(), None)
  206. self.assertNotIn('NetworkMode', service._get_container_host_config({}))
  207. def test_use_net_from_container(self):
  208. container_id = 'aabbccddee'
  209. container_dict = dict(Name='aaa', Id=container_id)
  210. self.mock_client.inspect_container.return_value = container_dict
  211. project = Project.from_dicts('test', [
  212. {
  213. 'name': 'test',
  214. 'image': 'busybox:latest',
  215. 'net': 'container:aaa'
  216. }
  217. ], self.mock_client)
  218. service = project.get_service('test')
  219. self.assertEqual(service._get_net(), 'container:' + container_id)
  220. def test_use_net_from_service(self):
  221. container_name = 'test_aaa_1'
  222. self.mock_client.containers.return_value = [
  223. {
  224. "Name": container_name,
  225. "Names": [container_name],
  226. "Id": container_name,
  227. "Image": 'busybox:latest'
  228. }
  229. ]
  230. project = Project.from_dicts('test', [
  231. {
  232. 'name': 'aaa',
  233. 'image': 'busybox:latest'
  234. },
  235. {
  236. 'name': 'test',
  237. 'image': 'busybox:latest',
  238. 'net': 'container:aaa'
  239. }
  240. ], self.mock_client)
  241. service = project.get_service('test')
  242. self.assertEqual(service._get_net(), 'container:' + container_name)