service_test.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. from plum 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_containers(self):
  17. foo = self.create_service('foo')
  18. bar = self.create_service('bar')
  19. foo.start()
  20. self.assertEqual(len(foo.containers()), 1)
  21. self.assertEqual(foo.containers()[0].name, '/foo_1')
  22. self.assertEqual(len(bar.containers()), 0)
  23. bar.scale(2)
  24. self.assertEqual(len(foo.containers()), 1)
  25. self.assertEqual(len(bar.containers()), 2)
  26. names = [c.name for c in bar.containers()]
  27. self.assertIn('/bar_1', names)
  28. self.assertIn('/bar_2', names)
  29. def test_up_scale_down(self):
  30. service = self.create_service('scalingtest')
  31. self.assertEqual(len(service.containers()), 0)
  32. service.start()
  33. self.assertEqual(len(service.containers()), 1)
  34. service.start()
  35. self.assertEqual(len(service.containers()), 1)
  36. service.scale(2)
  37. self.assertEqual(len(service.containers()), 2)
  38. service.scale(1)
  39. self.assertEqual(len(service.containers()), 1)
  40. service.stop()
  41. self.assertEqual(len(service.containers()), 0)
  42. service.stop()
  43. self.assertEqual(len(service.containers()), 0)
  44. def test_start_container_passes_through_options(self):
  45. db = self.create_service('db')
  46. db.start_container(environment={'FOO': 'BAR'})
  47. self.assertEqual(db.containers()[0].environment['FOO'], 'BAR')
  48. def test_start_container_inherits_options_from_constructor(self):
  49. db = self.create_service('db', environment={'FOO': 'BAR'})
  50. db.start_container()
  51. self.assertEqual(db.containers()[0].environment['FOO'], 'BAR')
  52. def test_start_container_creates_links(self):
  53. db = self.create_service('db')
  54. web = self.create_service('web', links=[db])
  55. db.start_container()
  56. web.start_container()
  57. self.assertIn('db_1', web.containers()[0].links())
  58. db.stop()
  59. web.stop()
  60. def test_start_container_builds_images(self):
  61. service = Service(
  62. name='test',
  63. client=self.client,
  64. build='tests/fixtures/simple-dockerfile',
  65. )
  66. container = service.start()
  67. container.wait()
  68. self.assertIn('success', container.logs())
  69. def test_start_container_creates_ports(self):
  70. service = self.create_service('web', ports=[8000])
  71. container = service.start_container().inspect()
  72. self.assertIn('8000/tcp', container['HostConfig']['PortBindings'])
  73. self.assertNotEqual(container['HostConfig']['PortBindings']['8000/tcp'][0]['HostPort'], '8000')
  74. def test_start_container_creates_fixed_external_ports(self):
  75. service = self.create_service('web', ports=['8000:8000'])
  76. container = service.start_container().inspect()
  77. self.assertIn('8000/tcp', container['HostConfig']['PortBindings'])
  78. self.assertEqual(container['HostConfig']['PortBindings']['8000/tcp'][0]['HostPort'], '8000')