container_test.py 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. from __future__ import absolute_import
  2. from __future__ import unicode_literals
  3. import docker
  4. from .. import mock
  5. from .. import unittest
  6. from compose.container import Container
  7. from compose.container import get_container_name
  8. class ContainerTest(unittest.TestCase):
  9. def setUp(self):
  10. self.container_id = "abcabcabcbabc12345"
  11. self.container_dict = {
  12. "Id": self.container_id,
  13. "Image": "busybox:latest",
  14. "Command": "top",
  15. "Created": 1387384730,
  16. "Status": "Up 8 seconds",
  17. "Ports": None,
  18. "SizeRw": 0,
  19. "SizeRootFs": 0,
  20. "Names": ["/composetest_db_1", "/composetest_web_1/db"],
  21. "NetworkSettings": {
  22. "Ports": {},
  23. },
  24. "Config": {
  25. "Labels": {
  26. "com.docker.compose.project": "composetest",
  27. "com.docker.compose.service": "web",
  28. "com.docker.compose.container-number": 7,
  29. },
  30. }
  31. }
  32. def test_from_ps(self):
  33. container = Container.from_ps(None,
  34. self.container_dict,
  35. has_been_inspected=True)
  36. self.assertEqual(
  37. container.dictionary,
  38. {
  39. "Id": self.container_id,
  40. "Image": "busybox:latest",
  41. "Name": "/composetest_db_1",
  42. })
  43. def test_from_ps_prefixed(self):
  44. self.container_dict['Names'] = [
  45. '/swarm-host-1' + n for n in self.container_dict['Names']
  46. ]
  47. container = Container.from_ps(
  48. None,
  49. self.container_dict,
  50. has_been_inspected=True)
  51. self.assertEqual(container.dictionary, {
  52. "Id": self.container_id,
  53. "Image": "busybox:latest",
  54. "Name": "/composetest_db_1",
  55. })
  56. def test_environment(self):
  57. container = Container(None, {
  58. 'Id': 'abc',
  59. 'Config': {
  60. 'Env': [
  61. 'FOO=BAR',
  62. 'BAZ=DOGE',
  63. ]
  64. }
  65. }, has_been_inspected=True)
  66. self.assertEqual(container.environment, {
  67. 'FOO': 'BAR',
  68. 'BAZ': 'DOGE',
  69. })
  70. def test_number(self):
  71. container = Container(None, self.container_dict, has_been_inspected=True)
  72. self.assertEqual(container.number, 7)
  73. def test_name(self):
  74. container = Container.from_ps(None,
  75. self.container_dict,
  76. has_been_inspected=True)
  77. self.assertEqual(container.name, "composetest_db_1")
  78. def test_name_without_project(self):
  79. self.container_dict['Name'] = "/composetest_web_7"
  80. container = Container(None, self.container_dict, has_been_inspected=True)
  81. self.assertEqual(container.name_without_project, "web_7")
  82. def test_name_without_project_custom_container_name(self):
  83. self.container_dict['Name'] = "/custom_name_of_container"
  84. container = Container(None, self.container_dict, has_been_inspected=True)
  85. self.assertEqual(container.name_without_project, "custom_name_of_container")
  86. def test_inspect_if_not_inspected(self):
  87. mock_client = mock.create_autospec(docker.Client)
  88. container = Container(mock_client, dict(Id="the_id"))
  89. container.inspect_if_not_inspected()
  90. mock_client.inspect_container.assert_called_once_with("the_id")
  91. self.assertEqual(container.dictionary,
  92. mock_client.inspect_container.return_value)
  93. self.assertTrue(container.has_been_inspected)
  94. container.inspect_if_not_inspected()
  95. self.assertEqual(mock_client.inspect_container.call_count, 1)
  96. def test_human_readable_ports_none(self):
  97. container = Container(None, self.container_dict, has_been_inspected=True)
  98. self.assertEqual(container.human_readable_ports, '')
  99. def test_human_readable_ports_public_and_private(self):
  100. self.container_dict['NetworkSettings']['Ports'].update({
  101. "45454/tcp": [{"HostIp": "0.0.0.0", "HostPort": "49197"}],
  102. "45453/tcp": [],
  103. })
  104. container = Container(None, self.container_dict, has_been_inspected=True)
  105. expected = "45453/tcp, 0.0.0.0:49197->45454/tcp"
  106. self.assertEqual(container.human_readable_ports, expected)
  107. def test_get_local_port(self):
  108. self.container_dict['NetworkSettings']['Ports'].update({
  109. "45454/tcp": [{"HostIp": "0.0.0.0", "HostPort": "49197"}],
  110. })
  111. container = Container(None, self.container_dict, has_been_inspected=True)
  112. self.assertEqual(
  113. container.get_local_port(45454, protocol='tcp'),
  114. '0.0.0.0:49197')
  115. def test_get(self):
  116. container = Container(None, {
  117. "Status": "Up 8 seconds",
  118. "HostConfig": {
  119. "VolumesFrom": ["volume_id"]
  120. },
  121. }, has_been_inspected=True)
  122. self.assertEqual(container.get('Status'), "Up 8 seconds")
  123. self.assertEqual(container.get('HostConfig.VolumesFrom'), ["volume_id"])
  124. self.assertEqual(container.get('Foo.Bar.DoesNotExist'), None)
  125. def test_short_id(self):
  126. container = Container(None, self.container_dict, has_been_inspected=True)
  127. assert container.short_id == self.container_id[:12]
  128. def test_has_api_logs(self):
  129. container_dict = {
  130. 'HostConfig': {
  131. 'LogConfig': {
  132. 'Type': 'json-file'
  133. }
  134. }
  135. }
  136. container = Container(None, container_dict, has_been_inspected=True)
  137. assert container.has_api_logs is True
  138. container_dict['HostConfig']['LogConfig']['Type'] = 'none'
  139. container = Container(None, container_dict, has_been_inspected=True)
  140. assert container.has_api_logs is False
  141. container_dict['HostConfig']['LogConfig']['Type'] = 'syslog'
  142. container = Container(None, container_dict, has_been_inspected=True)
  143. assert container.has_api_logs is False
  144. container_dict['HostConfig']['LogConfig']['Type'] = 'journald'
  145. container = Container(None, container_dict, has_been_inspected=True)
  146. assert container.has_api_logs is True
  147. container_dict['HostConfig']['LogConfig']['Type'] = 'foobar'
  148. container = Container(None, container_dict, has_been_inspected=True)
  149. assert container.has_api_logs is False
  150. class GetContainerNameTestCase(unittest.TestCase):
  151. def test_get_container_name(self):
  152. self.assertIsNone(get_container_name({}))
  153. self.assertEqual(get_container_name({'Name': 'myproject_db_1'}), 'myproject_db_1')
  154. self.assertEqual(
  155. get_container_name({'Names': ['/myproject_db_1', '/myproject_web_1/db']}),
  156. 'myproject_db_1')
  157. self.assertEqual(
  158. get_container_name({
  159. 'Names': [
  160. '/swarm-host-1/myproject_db_1',
  161. '/swarm-host-1/myproject_web_1/db'
  162. ]
  163. }),
  164. 'myproject_db_1'
  165. )