Beispiel #1
0
    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]))
Beispiel #2
0
    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()
Beispiel #3
0
    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)
Beispiel #4
0
    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)
Beispiel #5
0
 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",
     })
Beispiel #6
0
 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",
     }
Beispiel #7
0
    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
Beispiel #8
0
 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"))
Beispiel #9
0
 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'))
Beispiel #10
0
    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",
        })
Beispiel #11
0
    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
Beispiel #12
0
 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'))
Beispiel #13
0
 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])
Beispiel #14
0
 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])
Beispiel #15
0
 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])
Beispiel #16
0
    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'
Beispiel #17
0
 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'])
Beispiel #18
0
    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)
Beispiel #19
0
 def test_number(self):
     container = Container.from_ps(None,
                                   self.container_dict,
                                   has_been_inspected=True)
     self.assertEqual(container.number, 1)
Beispiel #20
0
 def test_human_readable_ports_none(self):
     container = Container(None,
                           self.container_dict,
                           has_been_inspected=True)
     self.assertEqual(container.human_readable_ports, '')
Beispiel #21
0
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")
Beispiel #23
0
    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')
Beispiel #24
0
 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")
Beispiel #25
0
 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)