project_test.py 8.5 KB

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