def test_containers_prefixed(self): service = Service('db', client=self.mock_client, image='foo', project='myproject') self.mock_client.containers.return_value = [ { 'Image': 'busybox', 'Id': 'OUT_1', 'Names': ['/swarm-host-1/myproject', '/swarm-host-1/foo/bar'] }, { 'Image': 'busybox', 'Id': 'OUT_2', 'Names': ['/swarm-host-1/myproject_db'] }, { 'Image': 'busybox', 'Id': 'OUT_3', 'Names': ['/swarm-host-1/db_1'] }, { 'Image': 'busybox', 'Id': 'IN_1', 'Names': [ '/swarm-host-1/myproject_db_1', '/swarm-host-1/myproject_web_1/db' ] }, ] self.assertEqual([c.id for c in service.containers()], ['IN_1'])
def test_create_container_no_build(self): self.mock_client.images.return_value = [] service = Service('foo', client=self.mock_client, build='.') service.create_container(do_build=False) self.assertFalse(self.mock_client.images.called) self.assertFalse(self.mock_client.build.called)
def test_get_volumes_from_container(self): container_id = 'aabbccddee' service = Service( 'test', volumes_from=[mock.Mock(id=container_id, spec=Container)]) self.assertEqual(service._get_volumes_from(), [container_id])
def test_pull_image_no_tag(self): service = Service('foo', client=self.mock_client, image='ababab') service.pull() self.mock_client.pull.assert_called_once_with('ababab', tag='latest', insecure_registry=False, stream=True)
def test_split_domainname_fqdn(self): service = Service('foo', hostname='name.domain.tld', client=self.mock_client) self.mock_client.containers.return_value = [] opts = service._get_container_create_options({'image': 'foo'}) self.assertEqual(opts['hostname'], 'name', 'hostname') self.assertEqual(opts['domainname'], 'domain.tld', 'domainname')
def test_create_container_with_build(self): self.mock_client.images.return_value = [] service = Service('foo', client=self.mock_client, build='.') service.build = mock.create_autospec(service.build) service.create_container(do_build=True) self.mock_client.images.assert_called_once_with(name=service.full_name) service.build.assert_called_once_with()
def test_pull_image_no_tag(self): service = Service('foo', client=self.mock_client, image='ababab') service.pull() self.mock_client.pull.assert_called_once_with( 'ababab', tag='latest', insecure_registry=False, stream=True)
def test_pull_image(self, mock_log): service = Service('foo', client=self.mock_client, image='someimage:sometag') service.pull(insecure_registry=True) self.mock_client.pull.assert_called_once_with( 'someimage', tag='sometag', insecure_registry=True, stream=True) mock_log.info.assert_called_once_with('Pulling foo (someimage:sometag)...')
def test_get_container(self, mock_container_class): container_dict = dict(Name='default_foo_2') self.mock_client.containers.return_value = [container_dict] service = Service('foo', image='foo', client=self.mock_client) container = service.get_container(number=2) self.assertEqual(container, mock_container_class.from_ps.return_value) mock_container_class.from_ps.assert_called_once_with( self.mock_client, container_dict)
def test_get_container(self, mock_container_class): container_dict = dict(Name='default_foo_2') self.mock_client.containers.return_value = [container_dict] service = Service('foo', client=self.mock_client) container = service.get_container(number=2) self.assertEqual(container, mock_container_class.from_ps.return_value) mock_container_class.from_ps.assert_called_once_with( self.mock_client, container_dict)
def test_get_volumes_from_service_container_exists(self): container_ids = ['aabbccddee', '12345'] from_service = mock.create_autospec(Service) from_service.containers.return_value = [ mock.Mock(id=container_id, spec=Container) for container_id in container_ids ] service = Service('test', volumes_from=[from_service]) self.assertEqual(service._get_volumes_from(), container_ids)
def test_containers_prefixed(self): service = Service('db', client=self.mock_client, project='myproject') self.mock_client.containers.return_value = [ {'Image': 'busybox', 'Id': 'OUT_1', 'Names': ['/swarm-host-1/myproject', '/swarm-host-1/foo/bar']}, {'Image': 'busybox', 'Id': 'OUT_2', 'Names': ['/swarm-host-1/myproject_db']}, {'Image': 'busybox', 'Id': 'OUT_3', 'Names': ['/swarm-host-1/db_1']}, {'Image': 'busybox', 'Id': 'IN_1', 'Names': ['/swarm-host-1/myproject_db_1', '/swarm-host-1/myproject_web_1/db']}, ] self.assertEqual([c.id for c in service.containers()], ['IN_1'])
def test_get_volumes_from_service_container_exists(self): container_ids = ['aabbccddee', '12345'] from_service = mock.create_autospec(Service) from_service.containers.return_value = [ mock.Mock(id=container_id, spec=Container) for container_id in container_ids ] service = Service('test', volumes_from=[from_service], image='foo') self.assertEqual(service._get_volumes_from(), container_ids)
def test_get_volumes_from_service_no_container(self): container_id = 'abababab' from_service = mock.create_autospec(Service) from_service.containers.return_value = [] from_service.create_container.return_value = mock.Mock(id=container_id, spec=Container) service = Service('test', image='foo', volumes_from=[from_service]) self.assertEqual(service._get_volumes_from(), [container_id]) from_service.create_container.assert_called_once_with()
def test_parse_environment(self): service = Service('foo', environment=['NORMAL=F1', 'CONTAINS_EQUALS=F=2', 'TRAILING_EQUALS='], client=self.mock_client, image='image_name', ) options = service._get_container_create_options({}) self.assertEqual( options['environment'], {'NORMAL': 'F1', 'CONTAINS_EQUALS': 'F=2', 'TRAILING_EQUALS': ''} )
def test_create_container_latest_is_used_when_no_tag_specified( self, mock_container): mock_container.create.side_effect = APIError( "oops", mock.Mock(status_code=404), "No such image") service = Service('foo', client=self.mock_client, image='someimage') with self.assertRaises(APIError): service.create_container() self.mock_client.pull.assert_called_once_with('someimage', tag='latest', insecure_registry=False, stream=True)
def test_env_from_multiple_files(self): service = Service('foo', env_file=['tests/fixtures/env/one.env', 'tests/fixtures/env/two.env'], client=self.mock_client, image='image_name', ) options = service._get_container_create_options({}) self.assertEqual( options['environment'], {'ONE': '2', 'TWO': '1', 'THREE': '3', 'FOO': 'baz', 'DOO': 'dah'} )
def test_get_volumes_from_service_no_container(self): container_id = 'abababab' from_service = mock.create_autospec(Service) from_service.containers.return_value = [] from_service.create_container.return_value = mock.Mock( id=container_id, spec=Container) service = Service('test', volumes_from=[from_service]) self.assertEqual(service._get_volumes_from(), [container_id]) from_service.create_container.assert_called_once_with()
def test_recreate_container(self, _): mock_container = mock.create_autospec(Container) service = Service('foo', client=self.mock_client, image='someimage') new_container = service.recreate_container(mock_container) mock_container.stop.assert_called_once_with() self.mock_client.rename.assert_called_once_with( mock_container.id, '%s_%s' % (mock_container.short_id, mock_container.name)) new_container.start.assert_called_once_with() mock_container.remove.assert_called_once_with()
def test_create_container_latest_is_used_when_no_tag_specified(self, mock_container): mock_container.create.side_effect = APIError( "oops", mock.Mock(status_code=404), "No such image") service = Service('foo', client=self.mock_client, image='someimage') with self.assertRaises(APIError): service.create_container() self.mock_client.pull.assert_called_once_with( 'someimage', tag='latest', insecure_registry=False, stream=True)
def test_resolve_environment_from_file(self): os.environ['FILE_DEF'] = 'E1' os.environ['FILE_DEF_EMPTY'] = 'E2' os.environ['ENV_DEF'] = 'E3' service = Service('foo', env_file=['tests/fixtures/env/resolve.env'], client=self.mock_client, image='image_name', ) options = service._get_container_create_options({}) self.assertEqual( options['environment'], {'FILE_DEF': 'F1', 'FILE_DEF_EMPTY': '', 'ENV_DEF': 'E3', 'NO_DEF': ''} )
def test_start_container_uses_tagged_image_if_it_exists(self): self.client.build('tests/fixtures/simple-dockerfile', tag='composetest_test') service = Service( name='test', client=self.client, build='this/does/not/exist/and/will/throw/error', project='composetest', ) container = create_and_start_container(service) container.wait() self.assertIn('success', container.logs())
def test_start_container_builds_images(self): service = Service( name='test', client=self.client, build='tests/fixtures/simple-dockerfile', project='composetest', ) container = create_and_start_container(service) container.wait() self.assertIn('success', container.logs()) self.assertEqual(len(self.client.images(name='composetest_test')), 1)
def test_create_container_from_insecure_registry( self, mock_log, mock_container): service = Service('foo', client=self.mock_client, image='someimage:sometag') mock_response = mock.Mock(Response) mock_response.status_code = 404 mock_response.reason = "Not Found" mock_container.create.side_effect = APIError( 'Mock error', mock_response, "No such image") # We expect the APIError because our service requires a # non-existent image. with self.assertRaises(APIError): service.create_container(insecure_registry=True) self.mock_client.pull.assert_called_once_with( 'someimage:sometag', insecure_registry=True, stream=True) mock_log.info.assert_called_once_with( 'Pulling image someimage:sometag...')
def test_recreate_containers_with_image_declared_volume(self): service = Service( project='composetest', name='db', client=self.client, build='tests/fixtures/dockerfile-with-volume', ) old_container = create_and_start_container(service) self.assertEqual(old_container.get('Volumes').keys(), ['/data']) volume_path = old_container.get('Volumes')['/data'] service.recreate_containers() new_container = service.containers()[0] service.start_container(new_container) self.assertEqual(new_container.get('Volumes').keys(), ['/data']) self.assertEqual(new_container.get('Volumes')['/data'], volume_path)
def test_env_nonexistent_file(self): self.assertRaises(ConfigError, lambda: Service('foo', env_file='tests/fixtures/env/nonexistent.env'))
def test_get_volumes_from_intermediate_container(self): container_id = 'aabbccddee' service = Service('test') container = mock.Mock(id=container_id, spec=Container) self.assertEqual(service._get_volumes_from(container), [container_id])
def test_config_validation(self): self.assertRaises(ConfigError, lambda: Service(name='foo', port=['8000'])) Service(name='foo', ports=['8000'])
def test_latest_is_used_when_tag_is_not_specified(self): service = Service('foo', client=self.mock_client, image='someimage') Container.create = mock.Mock() service.create_container() self.assertEqual(Container.create.call_args[1]['image'], 'someimage:latest')
def test_get_container_not_found(self): self.mock_client.containers.return_value = [] service = Service('foo', client=self.mock_client, image='foo') self.assertRaises(ValueError, service.get_container)
def test_name_validations(self): self.assertRaises(ConfigError, lambda: Service(name='')) self.assertRaises(ConfigError, lambda: Service(name=' ')) self.assertRaises(ConfigError, lambda: Service(name='/')) self.assertRaises(ConfigError, lambda: Service(name='!')) self.assertRaises(ConfigError, lambda: Service(name='\xe2')) self.assertRaises(ConfigError, lambda: Service(name='_')) self.assertRaises(ConfigError, lambda: Service(name='____')) self.assertRaises(ConfigError, lambda: Service(name='foo_bar')) self.assertRaises(ConfigError, lambda: Service(name='__foo_bar__')) Service('a', image='foo') Service('foo', image='foo')
def test_project_validation(self): self.assertRaises(ConfigError, lambda: Service('bar')) self.assertRaises(ConfigError, lambda: Service(name='foo', project='_', image='foo')) Service(name='foo', project='bar', image='foo')
def test_get_volumes_from_previous_container(self): container_id = 'aabbccddee' service = Service('test', image='foo') container = mock.Mock(id=container_id, spec=Container, image='foo') self.assertEqual(service._get_volumes_from(container), [container_id])