container_test.py 5.2 KB

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