container_test.py 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  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. assert container.dictionary == {
  37. "Id": self.container_id,
  38. "Image": "busybox:latest",
  39. "Name": "/composetest_db_1",
  40. }
  41. def test_from_ps_prefixed(self):
  42. self.container_dict['Names'] = [
  43. '/swarm-host-1' + n for n in self.container_dict['Names']
  44. ]
  45. container = Container.from_ps(
  46. None,
  47. self.container_dict,
  48. has_been_inspected=True)
  49. assert container.dictionary == {
  50. "Id": self.container_id,
  51. "Image": "busybox:latest",
  52. "Name": "/composetest_db_1",
  53. }
  54. def test_environment(self):
  55. container = Container(None, {
  56. 'Id': 'abc',
  57. 'Config': {
  58. 'Env': [
  59. 'FOO=BAR',
  60. 'BAZ=DOGE',
  61. ]
  62. }
  63. }, has_been_inspected=True)
  64. assert container.environment == {
  65. 'FOO': 'BAR',
  66. 'BAZ': 'DOGE',
  67. }
  68. def test_number(self):
  69. container = Container(None, self.container_dict, has_been_inspected=True)
  70. assert container.number == 7
  71. def test_name(self):
  72. container = Container.from_ps(None,
  73. self.container_dict,
  74. has_been_inspected=True)
  75. assert container.name == "composetest_db_1"
  76. def test_name_without_project(self):
  77. self.container_dict['Name'] = "/composetest_web_7"
  78. container = Container(None, self.container_dict, has_been_inspected=True)
  79. assert container.name_without_project == "web_7"
  80. def test_name_without_project_custom_container_name(self):
  81. self.container_dict['Name'] = "/custom_name_of_container"
  82. container = Container(None, self.container_dict, has_been_inspected=True)
  83. assert container.name_without_project == "custom_name_of_container"
  84. def test_inspect_if_not_inspected(self):
  85. mock_client = mock.create_autospec(docker.APIClient)
  86. container = Container(mock_client, dict(Id="the_id"))
  87. container.inspect_if_not_inspected()
  88. mock_client.inspect_container.assert_called_once_with("the_id")
  89. assert container.dictionary == mock_client.inspect_container.return_value
  90. assert container.has_been_inspected
  91. container.inspect_if_not_inspected()
  92. assert mock_client.inspect_container.call_count == 1
  93. def test_human_readable_ports_none(self):
  94. container = Container(None, self.container_dict, has_been_inspected=True)
  95. assert container.human_readable_ports == ''
  96. def test_human_readable_ports_public_and_private(self):
  97. self.container_dict['NetworkSettings']['Ports'].update({
  98. "45454/tcp": [{"HostIp": "0.0.0.0", "HostPort": "49197"}],
  99. "45453/tcp": [],
  100. })
  101. container = Container(None, self.container_dict, has_been_inspected=True)
  102. expected = "45453/tcp, 0.0.0.0:49197->45454/tcp"
  103. assert container.human_readable_ports == expected
  104. def test_get_local_port(self):
  105. self.container_dict['NetworkSettings']['Ports'].update({
  106. "45454/tcp": [{"HostIp": "0.0.0.0", "HostPort": "49197"}],
  107. })
  108. container = Container(None, self.container_dict, has_been_inspected=True)
  109. assert container.get_local_port(45454, protocol='tcp') == '0.0.0.0:49197'
  110. def test_get(self):
  111. container = Container(None, {
  112. "Status": "Up 8 seconds",
  113. "HostConfig": {
  114. "VolumesFrom": ["volume_id"]
  115. },
  116. }, has_been_inspected=True)
  117. assert container.get('Status') == "Up 8 seconds"
  118. assert container.get('HostConfig.VolumesFrom') == ["volume_id"]
  119. assert container.get('Foo.Bar.DoesNotExist') is None
  120. def test_short_id(self):
  121. container = Container(None, self.container_dict, has_been_inspected=True)
  122. assert container.short_id == self.container_id[:12]
  123. def test_has_api_logs(self):
  124. container_dict = {
  125. 'HostConfig': {
  126. 'LogConfig': {
  127. 'Type': 'json-file'
  128. }
  129. }
  130. }
  131. container = Container(None, container_dict, has_been_inspected=True)
  132. assert container.has_api_logs is True
  133. container_dict['HostConfig']['LogConfig']['Type'] = 'none'
  134. container = Container(None, container_dict, has_been_inspected=True)
  135. assert container.has_api_logs is False
  136. container_dict['HostConfig']['LogConfig']['Type'] = 'syslog'
  137. container = Container(None, container_dict, has_been_inspected=True)
  138. assert container.has_api_logs is False
  139. container_dict['HostConfig']['LogConfig']['Type'] = 'journald'
  140. container = Container(None, container_dict, has_been_inspected=True)
  141. assert container.has_api_logs is True
  142. container_dict['HostConfig']['LogConfig']['Type'] = 'foobar'
  143. container = Container(None, container_dict, has_been_inspected=True)
  144. assert container.has_api_logs is False
  145. class GetContainerNameTestCase(unittest.TestCase):
  146. def test_get_container_name(self):
  147. assert get_container_name({}) is None
  148. assert get_container_name({'Name': 'myproject_db_1'}) == 'myproject_db_1'
  149. assert get_container_name(
  150. {'Names': ['/myproject_db_1', '/myproject_web_1/db']}
  151. ) == 'myproject_db_1'
  152. assert get_container_name({
  153. 'Names': [
  154. '/swarm-host-1/myproject_db_1',
  155. '/swarm-host-1/myproject_web_1/db'
  156. ]
  157. }) == 'myproject_db_1'