project_test.py 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  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. )
  76. console = Service(
  77. project='composetest',
  78. name='console',
  79. )
  80. project = Project('test', [web, console], None)
  81. self.assertEqual(project.get_services(), [web, console])
  82. def test_get_services_returns_listed_services_with_args(self):
  83. web = Service(
  84. project='composetest',
  85. name='web',
  86. )
  87. console = Service(
  88. project='composetest',
  89. name='console',
  90. )
  91. project = Project('test', [web, console], None)
  92. self.assertEqual(project.get_services(['console']), [console])
  93. def test_get_services_with_include_links(self):
  94. db = Service(
  95. project='composetest',
  96. name='db',
  97. )
  98. web = Service(
  99. project='composetest',
  100. name='web',
  101. links=[(db, 'database')]
  102. )
  103. cache = Service(
  104. project='composetest',
  105. name='cache'
  106. )
  107. console = Service(
  108. project='composetest',
  109. name='console',
  110. links=[(web, 'web')]
  111. )
  112. project = Project('test', [web, db, cache, console], None)
  113. self.assertEqual(
  114. project.get_services(['console'], include_deps=True),
  115. [db, web, console]
  116. )
  117. def test_get_services_removes_duplicates_following_links(self):
  118. db = Service(
  119. project='composetest',
  120. name='db',
  121. )
  122. web = Service(
  123. project='composetest',
  124. name='web',
  125. links=[(db, 'database')]
  126. )
  127. project = Project('test', [web, db], None)
  128. self.assertEqual(
  129. project.get_services(['web', 'db'], include_deps=True),
  130. [db, web]
  131. )
  132. def test_use_volumes_from_container(self):
  133. container_id = 'aabbccddee'
  134. container_dict = dict(Name='aaa', Id=container_id)
  135. mock_client = mock.create_autospec(docker.Client)
  136. mock_client.inspect_container.return_value = container_dict
  137. project = Project.from_dicts('test', [
  138. {
  139. 'name': 'test',
  140. 'image': 'busybox:latest',
  141. 'volumes_from': ['aaa']
  142. }
  143. ], mock_client)
  144. self.assertEqual(project.get_service('test')._get_volumes_from(), [container_id])
  145. def test_use_volumes_from_service_no_container(self):
  146. container_name = 'test_vol_1'
  147. mock_client = mock.create_autospec(docker.Client)
  148. mock_client.containers.return_value = [
  149. {
  150. "Name": container_name,
  151. "Names": [container_name],
  152. "Id": container_name,
  153. "Image": 'busybox:latest'
  154. }
  155. ]
  156. project = Project.from_dicts('test', [
  157. {
  158. 'name': 'vol',
  159. 'image': 'busybox:latest'
  160. },
  161. {
  162. 'name': 'test',
  163. 'image': 'busybox:latest',
  164. 'volumes_from': ['vol']
  165. }
  166. ], mock_client)
  167. self.assertEqual(project.get_service('test')._get_volumes_from(), [container_name])
  168. @mock.patch.object(Service, 'containers')
  169. def test_use_volumes_from_service_container(self, mock_return):
  170. container_ids = ['aabbccddee', '12345']
  171. mock_return.return_value = [
  172. mock.Mock(id=container_id, spec=Container)
  173. for container_id in container_ids]
  174. project = Project.from_dicts('test', [
  175. {
  176. 'name': 'vol',
  177. 'image': 'busybox:latest'
  178. },
  179. {
  180. 'name': 'test',
  181. 'image': 'busybox:latest',
  182. 'volumes_from': ['vol']
  183. }
  184. ], None)
  185. self.assertEqual(project.get_service('test')._get_volumes_from(), container_ids)
  186. def test_use_net_from_container(self):
  187. container_id = 'aabbccddee'
  188. container_dict = dict(Name='aaa', Id=container_id)
  189. mock_client = mock.create_autospec(docker.Client)
  190. mock_client.inspect_container.return_value = container_dict
  191. project = Project.from_dicts('test', [
  192. {
  193. 'name': 'test',
  194. 'image': 'busybox:latest',
  195. 'net': 'container:aaa'
  196. }
  197. ], mock_client)
  198. service = project.get_service('test')
  199. self.assertEqual(service._get_net(), 'container:'+container_id)
  200. def test_use_net_from_service(self):
  201. container_name = 'test_aaa_1'
  202. mock_client = mock.create_autospec(docker.Client)
  203. mock_client.containers.return_value = [
  204. {
  205. "Name": container_name,
  206. "Names": [container_name],
  207. "Id": container_name,
  208. "Image": 'busybox:latest'
  209. }
  210. ]
  211. project = Project.from_dicts('test', [
  212. {
  213. 'name': 'aaa',
  214. 'image': 'busybox:latest'
  215. },
  216. {
  217. 'name': 'test',
  218. 'image': 'busybox:latest',
  219. 'net': 'container:aaa'
  220. }
  221. ], mock_client)
  222. service = project.get_service('test')
  223. self.assertEqual(service._get_net(), 'container:'+container_name)