container_test.py 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  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_dict = {
  11. "Id": "abc",
  12. "Image": "busybox:latest",
  13. "Command": "top",
  14. "Created": 1387384730,
  15. "Status": "Up 8 seconds",
  16. "Ports": None,
  17. "SizeRw": 0,
  18. "SizeRootFs": 0,
  19. "Names": ["/composetest_db_1", "/composetest_web_1/db"],
  20. "NetworkSettings": {
  21. "Ports": {},
  22. },
  23. "Config": {
  24. "Labels": {
  25. "com.docker.compose.project": "composetest",
  26. "com.docker.compose.service": "web",
  27. "com.docker.compose.container-number": 7,
  28. },
  29. }
  30. }
  31. def test_from_ps(self):
  32. container = Container.from_ps(None,
  33. self.container_dict,
  34. has_been_inspected=True)
  35. self.assertEqual(
  36. container.dictionary,
  37. {
  38. "Id": "abc",
  39. "Image": "busybox:latest",
  40. "Name": "/composetest_db_1",
  41. })
  42. def test_from_ps_prefixed(self):
  43. self.container_dict['Names'] = ['/swarm-host-1' + n for n in self.container_dict['Names']]
  44. container = Container.from_ps(None,
  45. self.container_dict,
  46. has_been_inspected=True)
  47. self.assertEqual(container.dictionary, {
  48. "Id": "abc",
  49. "Image": "busybox:latest",
  50. "Name": "/composetest_db_1",
  51. })
  52. def test_environment(self):
  53. container = Container(None, {
  54. 'Id': 'abc',
  55. 'Config': {
  56. 'Env': [
  57. 'FOO=BAR',
  58. 'BAZ=DOGE',
  59. ]
  60. }
  61. }, has_been_inspected=True)
  62. self.assertEqual(container.environment, {
  63. 'FOO': 'BAR',
  64. 'BAZ': 'DOGE',
  65. })
  66. def test_number(self):
  67. container = Container(None, self.container_dict, has_been_inspected=True)
  68. self.assertEqual(container.number, 7)
  69. def test_name(self):
  70. container = Container.from_ps(None,
  71. self.container_dict,
  72. has_been_inspected=True)
  73. self.assertEqual(container.name, "composetest_db_1")
  74. def test_name_without_project(self):
  75. self.container_dict['Name'] = "/composetest_web_7"
  76. container = Container(None, self.container_dict, has_been_inspected=True)
  77. self.assertEqual(container.name_without_project, "web_7")
  78. def test_name_without_project_custom_container_name(self):
  79. self.container_dict['Name'] = "/custom_name_of_container"
  80. container = Container(None, self.container_dict, has_been_inspected=True)
  81. self.assertEqual(container.name_without_project, "custom_name_of_container")
  82. def test_inspect_if_not_inspected(self):
  83. mock_client = mock.create_autospec(docker.Client)
  84. container = Container(mock_client, dict(Id="the_id"))
  85. container.inspect_if_not_inspected()
  86. mock_client.inspect_container.assert_called_once_with("the_id")
  87. self.assertEqual(container.dictionary,
  88. mock_client.inspect_container.return_value)
  89. self.assertTrue(container.has_been_inspected)
  90. container.inspect_if_not_inspected()
  91. self.assertEqual(mock_client.inspect_container.call_count, 1)
  92. def test_human_readable_ports_none(self):
  93. container = Container(None, self.container_dict, has_been_inspected=True)
  94. self.assertEqual(container.human_readable_ports, '')
  95. def test_human_readable_ports_public_and_private(self):
  96. self.container_dict['NetworkSettings']['Ports'].update({
  97. "45454/tcp": [{"HostIp": "0.0.0.0", "HostPort": "49197"}],
  98. "45453/tcp": [],
  99. })
  100. container = Container(None, self.container_dict, has_been_inspected=True)
  101. expected = "45453/tcp, 0.0.0.0:49197->45454/tcp"
  102. self.assertEqual(container.human_readable_ports, expected)
  103. def test_get_local_port(self):
  104. self.container_dict['NetworkSettings']['Ports'].update({
  105. "45454/tcp": [{"HostIp": "0.0.0.0", "HostPort": "49197"}],
  106. })
  107. container = Container(None, self.container_dict, has_been_inspected=True)
  108. self.assertEqual(
  109. container.get_local_port(45454, protocol='tcp'),
  110. '0.0.0.0:49197')
  111. def test_get(self):
  112. container = Container(None, {
  113. "Status": "Up 8 seconds",
  114. "HostConfig": {
  115. "VolumesFrom": ["volume_id"]
  116. },
  117. }, has_been_inspected=True)
  118. self.assertEqual(container.get('Status'), "Up 8 seconds")
  119. self.assertEqual(container.get('HostConfig.VolumesFrom'), ["volume_id"])
  120. self.assertEqual(container.get('Foo.Bar.DoesNotExist'), None)
  121. class GetContainerNameTestCase(unittest.TestCase):
  122. def test_get_container_name(self):
  123. self.assertIsNone(get_container_name({}))
  124. self.assertEqual(get_container_name({'Name': 'myproject_db_1'}), 'myproject_db_1')
  125. self.assertEqual(get_container_name({'Names': ['/myproject_db_1', '/myproject_web_1/db']}), 'myproject_db_1')
  126. self.assertEqual(
  127. get_container_name({
  128. 'Names': [
  129. '/swarm-host-1/myproject_db_1',
  130. '/swarm-host-1/myproject_web_1/db'
  131. ]
  132. }),
  133. 'myproject_db_1'
  134. )