project_test.py 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  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 test_from_dict(self):
  10. project = Project.from_dicts('composetest', [
  11. {
  12. 'name': 'web',
  13. 'image': 'busybox:latest'
  14. },
  15. {
  16. 'name': 'db',
  17. 'image': 'busybox:latest'
  18. },
  19. ], None)
  20. self.assertEqual(len(project.services), 2)
  21. self.assertEqual(project.get_service('web').name, 'web')
  22. self.assertEqual(project.get_service('web').options['image'], 'busybox:latest')
  23. self.assertEqual(project.get_service('db').name, 'db')
  24. self.assertEqual(project.get_service('db').options['image'], 'busybox:latest')
  25. def test_from_dict_sorts_in_dependency_order(self):
  26. project = Project.from_dicts('composetest', [
  27. {
  28. 'name': 'web',
  29. 'image': 'busybox:latest',
  30. 'links': ['db'],
  31. },
  32. {
  33. 'name': 'db',
  34. 'image': 'busybox:latest',
  35. 'volumes_from': ['volume']
  36. },
  37. {
  38. 'name': 'volume',
  39. 'image': 'busybox:latest',
  40. 'volumes': ['/tmp'],
  41. }
  42. ], None)
  43. self.assertEqual(project.services[0].name, 'volume')
  44. self.assertEqual(project.services[1].name, 'db')
  45. self.assertEqual(project.services[2].name, 'web')
  46. def test_from_config(self):
  47. dicts = [
  48. {
  49. 'name': 'web',
  50. 'image': 'busybox:latest',
  51. },
  52. {
  53. 'name': 'db',
  54. 'image': 'busybox:latest',
  55. },
  56. ]
  57. project = Project.from_dicts('composetest', dicts, None)
  58. self.assertEqual(len(project.services), 2)
  59. self.assertEqual(project.get_service('web').name, 'web')
  60. self.assertEqual(project.get_service('web').options['image'], 'busybox:latest')
  61. self.assertEqual(project.get_service('db').name, 'db')
  62. self.assertEqual(project.get_service('db').options['image'], 'busybox:latest')
  63. def test_get_service(self):
  64. web = Service(
  65. project='composetest',
  66. name='web',
  67. client=None,
  68. image="busybox:latest",
  69. )
  70. project = Project('test', [web], None)
  71. self.assertEqual(project.get_service('web'), web)
  72. def test_get_services_returns_all_services_without_args(self):
  73. web = Service(
  74. project='composetest',
  75. name='web',
  76. image='foo',
  77. )
  78. console = Service(
  79. project='composetest',
  80. name='console',
  81. image='foo',
  82. )
  83. project = Project('test', [web, console], None)
  84. self.assertEqual(project.get_services(), [web, console])
  85. def test_get_services_returns_listed_services_with_args(self):
  86. web = Service(
  87. project='composetest',
  88. name='web',
  89. image='foo',
  90. )
  91. console = Service(
  92. project='composetest',
  93. name='console',
  94. image='foo',
  95. )
  96. project = Project('test', [web, console], None)
  97. self.assertEqual(project.get_services(['console']), [console])
  98. def test_get_services_with_include_links(self):
  99. db = Service(
  100. project='composetest',
  101. name='db',
  102. image='foo',
  103. )
  104. web = Service(
  105. project='composetest',
  106. name='web',
  107. image='foo',
  108. links=[(db, 'database')]
  109. )
  110. cache = Service(
  111. project='composetest',
  112. name='cache',
  113. image='foo'
  114. )
  115. console = Service(
  116. project='composetest',
  117. name='console',
  118. image='foo',
  119. links=[(web, 'web')]
  120. )
  121. project = Project('test', [web, db, cache, console], None)
  122. self.assertEqual(
  123. project.get_services(['console'], include_deps=True),
  124. [db, web, console]
  125. )
  126. def test_get_services_removes_duplicates_following_links(self):
  127. db = Service(
  128. project='composetest',
  129. name='db',
  130. image='foo',
  131. )
  132. web = Service(
  133. project='composetest',
  134. name='web',
  135. image='foo',
  136. links=[(db, 'database')]
  137. )
  138. project = Project('test', [web, db], None)
  139. self.assertEqual(
  140. project.get_services(['web', 'db'], include_deps=True),
  141. [db, web]
  142. )
  143. def test_use_volumes_from_container(self):
  144. container_id = 'aabbccddee'
  145. container_dict = dict(Name='aaa', Id=container_id)
  146. mock_client = mock.create_autospec(docker.Client)
  147. mock_client.inspect_container.return_value = container_dict
  148. project = Project.from_dicts('test', [
  149. {
  150. 'name': 'test',
  151. 'image': 'busybox:latest',
  152. 'volumes_from': ['aaa']
  153. }
  154. ], mock_client)
  155. self.assertEqual(project.get_service('test')._get_volumes_from(), [container_id])
  156. def test_use_volumes_from_service_no_container(self):
  157. container_name = 'test_vol_1'
  158. mock_client = mock.create_autospec(docker.Client)
  159. 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. ], 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. mock_client = mock.create_autospec(docker.Client)
  199. project = Project.from_dicts('test', [
  200. {
  201. 'name': 'test',
  202. 'image': 'busybox:latest',
  203. }
  204. ], mock_client)
  205. service = project.get_service('test')
  206. self.assertEqual(service._get_net(), None)
  207. self.assertNotIn('NetworkMode', service._get_container_host_config({}))
  208. def test_use_net_from_container(self):
  209. container_id = 'aabbccddee'
  210. container_dict = dict(Name='aaa', Id=container_id)
  211. mock_client = mock.create_autospec(docker.Client)
  212. mock_client.inspect_container.return_value = container_dict
  213. project = Project.from_dicts('test', [
  214. {
  215. 'name': 'test',
  216. 'image': 'busybox:latest',
  217. 'net': 'container:aaa'
  218. }
  219. ], mock_client)
  220. service = project.get_service('test')
  221. self.assertEqual(service._get_net(), 'container:' + container_id)
  222. def test_use_net_from_service(self):
  223. container_name = 'test_aaa_1'
  224. mock_client = mock.create_autospec(docker.Client)
  225. mock_client.containers.return_value = [
  226. {
  227. "Name": container_name,
  228. "Names": [container_name],
  229. "Id": container_name,
  230. "Image": 'busybox:latest'
  231. }
  232. ]
  233. project = Project.from_dicts('test', [
  234. {
  235. 'name': 'aaa',
  236. 'image': 'busybox:latest'
  237. },
  238. {
  239. 'name': 'test',
  240. 'image': 'busybox:latest',
  241. 'net': 'container:aaa'
  242. }
  243. ], mock_client)
  244. service = project.get_service('test')
  245. self.assertEqual(service._get_net(), 'container:' + container_name)