service_test.py 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. from fig import Service
  2. from .testcases import DockerClientTestCase
  3. class ServiceTest(DockerClientTestCase):
  4. def test_name_validations(self):
  5. self.assertRaises(ValueError, lambda: Service(name=''))
  6. self.assertRaises(ValueError, lambda: Service(name=' '))
  7. self.assertRaises(ValueError, lambda: Service(name='/'))
  8. self.assertRaises(ValueError, lambda: Service(name='!'))
  9. self.assertRaises(ValueError, lambda: Service(name='\xe2'))
  10. self.assertRaises(ValueError, lambda: Service(name='_'))
  11. self.assertRaises(ValueError, lambda: Service(name='____'))
  12. self.assertRaises(ValueError, lambda: Service(name='foo_bar'))
  13. self.assertRaises(ValueError, lambda: Service(name='__foo_bar__'))
  14. Service('a')
  15. Service('foo')
  16. def test_project_validation(self):
  17. self.assertRaises(ValueError, lambda: Service(name='foo', project='_'))
  18. Service(name='foo', project='bar')
  19. def test_containers(self):
  20. foo = self.create_service('foo')
  21. bar = self.create_service('bar')
  22. foo.start_container()
  23. self.assertEqual(len(foo.containers()), 1)
  24. self.assertEqual(foo.containers()[0].name, 'figtest_foo_1')
  25. self.assertEqual(len(bar.containers()), 0)
  26. bar.start_container()
  27. bar.start_container()
  28. self.assertEqual(len(foo.containers()), 1)
  29. self.assertEqual(len(bar.containers()), 2)
  30. names = [c.name for c in bar.containers()]
  31. self.assertIn('figtest_bar_1', names)
  32. self.assertIn('figtest_bar_2', names)
  33. def test_containers_one_off(self):
  34. db = self.create_service('db')
  35. container = db.create_container(one_off=True)
  36. self.assertEqual(db.containers(stopped=True), [])
  37. self.assertEqual(db.containers(one_off=True, stopped=True), [container])
  38. def test_project_is_added_to_container_name(self):
  39. service = self.create_service('web')
  40. service.start_container()
  41. self.assertEqual(service.containers()[0].name, 'figtest_web_1')
  42. def test_start_stop(self):
  43. service = self.create_service('scalingtest')
  44. self.assertEqual(len(service.containers(stopped=True)), 0)
  45. service.create_container()
  46. self.assertEqual(len(service.containers()), 0)
  47. self.assertEqual(len(service.containers(stopped=True)), 1)
  48. service.start()
  49. self.assertEqual(len(service.containers()), 1)
  50. self.assertEqual(len(service.containers(stopped=True)), 1)
  51. service.stop(timeout=1)
  52. self.assertEqual(len(service.containers()), 0)
  53. self.assertEqual(len(service.containers(stopped=True)), 1)
  54. service.stop(timeout=1)
  55. self.assertEqual(len(service.containers()), 0)
  56. self.assertEqual(len(service.containers(stopped=True)), 1)
  57. def test_kill_remove(self):
  58. service = self.create_service('scalingtest')
  59. service.start_container()
  60. self.assertEqual(len(service.containers()), 1)
  61. service.remove_stopped()
  62. self.assertEqual(len(service.containers()), 1)
  63. service.kill()
  64. self.assertEqual(len(service.containers()), 0)
  65. self.assertEqual(len(service.containers(stopped=True)), 1)
  66. service.remove_stopped()
  67. self.assertEqual(len(service.containers(stopped=True)), 0)
  68. def test_create_container_with_one_off(self):
  69. db = self.create_service('db')
  70. container = db.create_container(one_off=True)
  71. self.assertEqual(container.name, 'figtest_db_run_1')
  72. def test_create_container_with_one_off_when_existing_container_is_running(self):
  73. db = self.create_service('db')
  74. db.start()
  75. container = db.create_container(one_off=True)
  76. self.assertEqual(container.name, 'figtest_db_run_1')
  77. def test_start_container_passes_through_options(self):
  78. db = self.create_service('db')
  79. db.start_container(environment={'FOO': 'BAR'})
  80. self.assertEqual(db.containers()[0].environment['FOO'], 'BAR')
  81. def test_start_container_inherits_options_from_constructor(self):
  82. db = self.create_service('db', environment={'FOO': 'BAR'})
  83. db.start_container()
  84. self.assertEqual(db.containers()[0].environment['FOO'], 'BAR')
  85. def test_start_container_creates_links(self):
  86. db = self.create_service('db')
  87. web = self.create_service('web', links=[db])
  88. db.start_container()
  89. web.start_container()
  90. self.assertIn('figtest_db_1', web.containers()[0].links())
  91. db.stop(timeout=1)
  92. web.stop(timeout=1)
  93. def test_start_container_builds_images(self):
  94. service = Service(
  95. name='test',
  96. client=self.client,
  97. build='tests/fixtures/simple-dockerfile',
  98. project='figtest',
  99. )
  100. container = service.start_container()
  101. container.wait()
  102. self.assertIn('success', container.logs())
  103. self.assertEqual(len(self.client.images(name='figtest_test')), 1)
  104. def test_start_container_uses_tagged_image_if_it_exists(self):
  105. self.client.build('tests/fixtures/simple-dockerfile', tag='figtest_test')
  106. service = Service(
  107. name='test',
  108. client=self.client,
  109. build='this/does/not/exist/and/will/throw/error',
  110. project='figtest',
  111. )
  112. container = service.start_container()
  113. container.wait()
  114. self.assertIn('success', container.logs())
  115. def test_start_container_creates_ports(self):
  116. service = self.create_service('web', ports=[8000])
  117. container = service.start_container().inspect()
  118. self.assertIn('8000/tcp', container['HostConfig']['PortBindings'])
  119. self.assertNotEqual(container['HostConfig']['PortBindings']['8000/tcp'][0]['HostPort'], '8000')
  120. def test_start_container_creates_fixed_external_ports(self):
  121. service = self.create_service('web', ports=['8000:8000'])
  122. container = service.start_container().inspect()
  123. self.assertIn('8000/tcp', container['HostConfig']['PortBindings'])
  124. self.assertEqual(container['HostConfig']['PortBindings']['8000/tcp'][0]['HostPort'], '8000')