def test_duplicate_containers(self): service = self.create_service('web') options = service._get_container_create_options({}, 1) original = Container.create(service.client, **options) self.assertEqual(set(service.containers(stopped=True)), set([original])) self.assertEqual(set(service.duplicate_containers()), set()) options['name'] = 'temporary_container_name' duplicate = Container.create(service.client, **options) self.assertEqual(set(service.containers(stopped=True)), set([original, duplicate])) self.assertEqual(set(service.duplicate_containers()), set([duplicate]))
def test_net_from_container(self): net_container = Container.create( self.client, image='busybox:latest', name='composetest_net_container', command='top' ) net_container.start() project = Project.from_dicts( name='composetest', service_dicts=config.from_dictionary({ 'web': { 'image': 'busybox:latest', 'net': 'container:composetest_net_container' }, }), client=self.client, ) project.up() web = project.get_service('web') self.assertEqual(web._get_net(), 'container:' + net_container.id) project.kill() project.remove_stopped()
def test_net_from_container(self): net_container = Container.create( self.client, image='busybox:latest', name='composetest_net_container', command='top', labels={LABEL_PROJECT: 'composetest'}, ) net_container.start() project = Project.from_dicts( name='composetest', service_dicts=build_service_dicts({ 'web': { 'image': 'busybox:latest', 'net': 'container:composetest_net_container' }, }), client=self.client, ) project.up() web = project.get_service('web') self.assertEqual(web.net.mode, 'container:' + net_container.id)
def test_net_from_container_v1(self): def get_project(): return Project.from_config( name='composetest', config_data=build_config({ 'web': { 'image': 'busybox:latest', 'net': 'container:composetest_net_container' }, }), client=self.client, ) with pytest.raises(ConfigurationError) as excinfo: get_project() assert "container 'composetest_net_container' which does not exist" in excinfo.exconly() net_container = Container.create( self.client, image='busybox:latest', name='composetest_net_container', command='top', labels={LABEL_PROJECT: 'composetest'}, ) net_container.start() project = get_project() project.up() web = project.get_service('web') self.assertEqual(web.network_mode.mode, 'container:' + net_container.id)
def test_from_ps(self): container = Container.from_ps(None, self.container_dict, has_been_inspected=True) self.assertEqual(container.dictionary, { "Id": "abc", "Image":"busybox:latest", "Name": "/composetest_db_1", })
def test_from_ps(self): container = Container.from_ps(None, self.container_dict, has_been_inspected=True) assert container.dictionary == { "Id": self.container_id, "Image": "busybox:latest", "Name": "/composetest_db_1", }
def test_build_failed(self): self.base_dir = "tests/fixtures/simple-failing-dockerfile" self.dispatch(["build", "simple"], returncode=1) labels = ["com.docker.compose.test_failing_image=true"] containers = [ Container.from_ps(self.project.client, c) for c in self.project.client.containers(all=True, filters={"label": labels}) ] assert len(containers) == 1
def test_create_container_with_volumes_from(self): volume_service = self.create_service("data") volume_container_1 = volume_service.create_container() volume_container_2 = Container.create( self.client, image="busybox:latest", command=["top"], labels={LABEL_PROJECT: "composetest"} ) host_service = self.create_service("host", volumes_from=[volume_service, volume_container_2]) host_container = host_service.create_container() host_service.start_container(host_container) self.assertIn(volume_container_1.id, host_container.get("HostConfig.VolumesFrom")) self.assertIn(volume_container_2.id, host_container.get("HostConfig.VolumesFrom"))
def test_create_container_with_volumes_from(self): volume_service = self.create_service('data') volume_container_1 = volume_service.create_container() volume_container_2 = Container.create(self.client, image='busybox:latest', command=["/bin/sleep", "300"]) host_service = self.create_service('host', volumes_from=[volume_service, volume_container_2]) host_container = host_service.create_container() host_service.start_container(host_container) self.assertIn(volume_container_1.id, host_container.get('HostConfig.VolumesFrom')) self.assertIn(volume_container_2.id, host_container.get('HostConfig.VolumesFrom'))
def test_from_ps_prefixed(self): self.container_dict['Names'] = ['/swarm-host-1' + n for n in self.container_dict['Names']] container = Container.from_ps(None, self.container_dict, has_been_inspected=True) self.assertEqual(container.dictionary, { "Id": "abc", "Image":"busybox:latest", "Name": "/composetest_db_1", })
def test_build_failed_forcerm(self): self.base_dir = 'tests/fixtures/simple-failing-dockerfile' self.dispatch(['build', '--force-rm', 'simple'], returncode=1) labels = ["com.docker.compose.test_failing_image=true"] containers = [ Container.from_ps(self.project.client, c) for c in self.project.client.containers( all=True, filters={"label": labels}) ] assert not containers
def test_create_container_with_volumes_from(self): volume_service = self.create_service('data') volume_container_1 = volume_service.create_container() volume_container_2 = Container.create( self.client, image='busybox:latest', command=["top"], labels={LABEL_PROJECT: 'composetest'}, ) host_service = self.create_service('host', volumes_from=[volume_service, volume_container_2]) host_container = host_service.create_container() host_service.start_container(host_container) self.assertIn(volume_container_1.id, host_container.get('HostConfig.VolumesFrom')) self.assertIn(volume_container_2.id, host_container.get('HostConfig.VolumesFrom'))
def test_volumes_from_container(self): data_container = Container.create( self.client, image="busybox:latest", volumes=["/var/data"], name="composetest_data_container", labels={LABEL_PROJECT: "composetest"}, ) project = Project.from_dicts( name="composetest", service_dicts=build_service_dicts( {"db": {"image": "busybox:latest", "volumes_from": ["composetest_data_container"]}} ), client=self.client, ) db = project.get_service("db") self.assertEqual(db.volumes_from, [data_container])
def test_volumes_from_container(self): data_container = Container.create( self.client, image='busybox:latest', volumes=['/var/data'], name='composetest_data_container', ) project = Project.from_config( name='composetest', config={ 'db': { 'image': 'busybox:latest', 'volumes_from': ['composetest_data_container'], }, }, client=self.client, ) db = project.get_service('db') self.assertEqual(db.volumes_from, [data_container])
def test_volumes_from_container(self): data_container = Container.create( self.client, image='busybox:latest', volumes=['/var/data'], name='composetest_data_container', labels={LABEL_PROJECT: 'composetest'}, ) project = Project.from_dicts( name='composetest', service_dicts=config.from_dictionary({ 'db': { 'image': 'busybox:latest', 'volumes_from': ['composetest_data_container'], }, }), client=self.client, ) db = project.get_service('db') self.assertEqual(db.volumes_from, [data_container])
def _make_events_generator(self, project, color_fn, color_fns): class FakeContainer(object): name_without_project = "events" prefix = color_fn(self._generate_prefix(FakeContainer())).encode('utf-8') # Attach to container before log printer starts running events_generator = project.client.events(decode=True) for event in events_generator: status = event.get("status") container_id = event.get("id") if status in ('start',): container = Container.from_id(project.client, container_id) proj_name = container.labels.get(LABEL_PROJECT) if proj_name == project.name: color_fn = next(color_fns) new_gen = self._make_log_generator(container, color_fn) self.mux.add_reader(new_gen) yield prefix + `event` + '\n'
def test_volumes_from_container(self): data_container = Container.create( self.client, image='busybox:latest', volumes=['/var/data'], name='composetest_data_container', labels={LABEL_PROJECT: 'composetest'}, ) project = Project.from_config( name='composetest', config_data=build_config({ 'db': { 'image': 'busybox:latest', 'volumes_from': ['composetest_data_container'], }, }), client=self.client, ) db = project.get_service('db') self.assertEqual(db._get_volumes_from(), [data_container.id + ':rw'])
def test_net_from_container(self): net_container = Container.create( self.client, image="busybox:latest", name="composetest_net_container", command="top", labels={LABEL_PROJECT: "composetest"}, ) net_container.start() project = Project.from_dicts( name="composetest", service_dicts=build_service_dicts( {"web": {"image": "busybox:latest", "net": "container:composetest_net_container"}} ), client=self.client, ) project.up() web = project.get_service("web") self.assertEqual(web.net.mode, "container:" + net_container.id)
def test_number(self): container = Container.from_ps(None, self.container_dict, has_been_inspected=True) self.assertEqual(container.number, 1)
def test_human_readable_ports_none(self): container = Container(None, self.container_dict, has_been_inspected=True) self.assertEqual(container.human_readable_ports, '')
def get_container_from_id(client, container_id): """ return the docker container from a given id """ return Container.from_id(client, container_id)
def test_name(self): container = Container.from_ps(None, self.container_dict, has_been_inspected=True) self.assertEqual(container.name, "composetest_db_1")
def test_run_service_with_restart_always(self, mock_container_create): mock_client = mock.create_autospec(docker.APIClient) mock_client.api_version = DEFAULT_DOCKER_API_VERSION mock_client._general_configs = {} mock_container_create.return_value = Container(mock_client, { 'Id': '37b35e0ba80d91009d37e16f249b32b84f72bda269985578ed6c75a0a13fcaa8', 'Name': 'composetest_service_37b35', 'Config': { 'Labels': { LABEL_SERVICE: 'service', } }, }, has_been_inspected=True) project = Project.from_config( name='composetest', client=mock_client, config_data=build_config( {'service': { 'image': 'busybox', 'restart': 'always', }}), ) command = TopLevelCommand(project) command.run({ 'SERVICE': 'service', 'COMMAND': None, '-e': [], '--label': [], '--user': None, '--no-deps': None, '--detach': True, '-T': None, '--entrypoint': None, '--service-ports': None, '--use-aliases': None, '--publish': [], '--volume': [], '--rm': None, '--name': None, '--workdir': None, }) # NOTE: The "run" command is supposed to be a one-off tool; therefore restart policy "no" # (the default) is enforced despite explicit wish for "always" in the project # configuration file assert not mock_client.create_host_config.call_args[1].get( 'restart_policy') command = TopLevelCommand(project) command.run({ 'SERVICE': 'service', 'COMMAND': None, '-e': [], '--label': [], '--user': None, '--no-deps': None, '--detach': True, '-T': None, '--entrypoint': None, '--service-ports': None, '--use-aliases': None, '--publish': [], '--volume': [], '--rm': True, '--name': None, '--workdir': None, }) assert not mock_client.create_host_config.call_args[1].get( 'restart_policy')
def test_name_without_project(self): container = Container.from_ps(None, self.container_dict, has_been_inspected=True) self.assertEqual(container.name_without_project, "db_1")
def test_net_container(self): container_id = 'abcd' net = ContainerNet(Container(None, {'Id': container_id})) self.assertEqual(net.id, container_id) self.assertEqual(net.mode, 'container:' + container_id) self.assertEqual(net.service_name, None)