Exemplo n.º 1
0
    def test_early_stream_response(self):
        self.request_handler = self.early_response_sending_handler
        lines = []
        for i in range(0, 50):
            line = str(i).encode()
            lines += [('%x' % len(line)).encode(), line]
        lines.append(b'0')
        lines.append(b'')

        self.response = (
            b'HTTP/1.1 200 OK\r\n'
            b'Transfer-Encoding: chunked\r\n'
            b'\r\n'
        ) + b'\r\n'.join(lines)

        with APIClient(base_url="http+unix://" + self.socket_file) as client:
            for i in range(5):
                try:
                    stream = client.build(
                        path=self.build_context,
                    )
                    break
                except requests.ConnectionError as e:
                    if i == 4:
                        raise e

            assert list(stream) == [
                str(i).encode() for i in range(50)
            ]
Exemplo n.º 2
0
    def test_ctor(self):
        with pytest.raises(docker.errors.DockerException) as excinfo:
            APIClient(version=1.12)

        assert str(
            excinfo.value
        ) == 'Version parameter must be a string or None. Found float'
Exemplo n.º 3
0
    def test_read_from_socket(self):
        with APIClient(base_url=self.address) as client:
            resp = client._post(client._url('/dummy'), stream=True)
            data = client._read_from_socket(resp, stream=True, tty=True)
            results = b''.join(data)

        assert results == self.text_data
Exemplo n.º 4
0
    def test_custom_user_agent(self):
        client = APIClient(user_agent='foo/bar')
        client.version()

        assert self.mock_send.call_count == 1
        headers = self.mock_send.call_args[0][0].headers
        assert headers['User-Agent'] == 'foo/bar'
Exemplo n.º 5
0
    def test_custom_user_agent(self):
        client = APIClient(user_agent='foo/bar')
        client.version()

        self.assertEqual(self.mock_send.call_count, 1)
        headers = self.mock_send.call_args[0][0].headers
        self.assertEqual(headers['User-Agent'], 'foo/bar')
Exemplo n.º 6
0
    def test_default_user_agent(self):
        client = APIClient()
        client.version()

        self.assertEqual(self.mock_send.call_count, 1)
        headers = self.mock_send.call_args[0][0].headers
        expected = 'docker-sdk-python/%s' % docker.__version__
        self.assertEqual(headers['User-Agent'], expected)
Exemplo n.º 7
0
    def test_default_user_agent(self):
        client = APIClient()
        client.version()

        assert self.mock_send.call_count == 1
        headers = self.mock_send.call_args[0][0].headers
        expected = 'docker-sdk-python/%s' % docker.__version__
        assert headers['User-Agent'] == expected
Exemplo n.º 8
0
 def setUp(self):
     self.patcher = mock.patch.multiple(
         'docker.api.client.APIClient',
         get=fake_get,
         post=fake_post,
         put=fake_put,
         delete=fake_delete,
         _read_from_socket=fake_read_from_socket)
     self.patcher.start()
     self.client = APIClient()
Exemplo n.º 9
0
 def setUp(self):
     self.patcher = mock.patch.multiple(
         'docker.api.client.APIClient',
         get=fake_get,
         post=fake_post,
         put=fake_put,
         delete=fake_delete,
         _read_from_socket=fake_read_from_socket)
     self.patcher.start()
     self.client = APIClient(version=DEFAULT_DOCKER_API_VERSION)
Exemplo n.º 10
0
 def request(self, stream=None, tty=None, demux=None):
     assert stream is not None and tty is not None and demux is not None
     with APIClient(base_url=self.address) as client:
         if tty:
             url = client._url('/tty')
         else:
             url = client._url('/no-tty')
         resp = client._post(url, stream=True)
         return client._read_from_socket(
             resp, stream=stream, tty=tty, demux=demux)
Exemplo n.º 11
0
 def setUp(self):
     self.patcher = mock.patch.multiple(
         'docker.api.client.APIClient',
         get=fake_get,
         post=fake_post,
         put=fake_put,
         delete=fake_delete,
         _read_from_socket=fake_read_from_socket)
     self.patcher.start()
     self.client = APIClient()
     # Force-clear authconfig to avoid tampering with the tests
     self.client._cfg = {'Configs': {}}
Exemplo n.º 12
0
 def setUp(self):
     self.client = APIClient()
Exemplo n.º 13
0
    def test_url_compatibility_http_unix_triple_slash(self):
        c = APIClient(
            base_url="http+unix:///socket",
            version=DEFAULT_DOCKER_API_VERSION)

        assert self._socket_path_for_client_session(c) == '/socket'
Exemplo n.º 14
0
    def test_url_compatibility_tcp(self):
        c = APIClient(
            base_url="tcp://hostname:1234",
            version=DEFAULT_DOCKER_API_VERSION)

        assert c.base_url == "http://hostname:1234"
Exemplo n.º 15
0
 def setUp(self):
     self.client = APIClient(version=DEFAULT_DOCKER_API_VERSION)
Exemplo n.º 16
0
    def test_url_compatibility_tcp(self):
        c = APIClient(base_url="tcp://hostname:1234")

        assert c.base_url == "http://hostname:1234"
Exemplo n.º 17
0
    def test_url_compatibility_http_unix_triple_slash(self):
        c = APIClient(base_url="http+unix:///socket")

        assert self._socket_path_for_client_session(c) == '/socket'
Exemplo n.º 18
0
    def test_url_compatibility_unix(self):
        c = APIClient(base_url="unix://socket")

        assert self._socket_path_for_client_session(c) == '/socket'
Exemplo n.º 19
0
 def test_retrieve_server_version(self):
     client = APIClient(version="auto")
     assert isinstance(client._version, six.string_types)
     assert not (client._version == "auto")
     client.close()
Exemplo n.º 20
0
 def test_retrieve_server_version(self):
     client = APIClient(version="auto")
     self.assertTrue(isinstance(client._version, six.string_types))
     self.assertFalse(client._version == "auto")
     client.close()
Exemplo n.º 21
0
    async def start(self) -> None:
        if self._state.container is not None:
            # Already started or starting
            await self._state.container
            return

        self._state.container = Deferred()

        client = self._dockerClient

        imageName = f"{self.imageRepository}:{self.imageTag}"

        try:
            image = client.images.get(imageName)
        except ImageNotFound:
            self._log.info("Pulling MySQL image: {name}", name=imageName)
            image = await deferToThread(client.images.pull,
                                        self.imageRepository, self.imageTag)

        containerName = self._containerName

        self._log.info("Creating MySQL container {name}", name=containerName)

        container = client.containers.create(
            name=containerName,
            image=image.id,
            auto_remove=True,
            detach=True,
            environment=self._containerEnvironment,
            ports={3306: None},
        )

        self._log.info("Starting MySQL container {name}", name=containerName)
        container.start()

        try:
            await self._waitOnContainerLog(container,
                                           " starting as process 1 ")

            # Clean up the container before the reactor shuts down
            reactor.addSystemEventTrigger(
                "before", "shutdown",
                lambda: self._stop(container, containerName))

            apiClient = APIClient()

            netloc = apiClient.port(container.id, 3306)[0]

            self._state.host = netloc["HostIp"]
            self._state.port = int(netloc["HostPort"])

            self._log.info("MySQL container {name} ready at: {host}:{port}",
                           name=containerName,
                           host=self.host,
                           port=self.port)

            self._log.info(
                "docker exec"
                " --interactive"
                " --tty"
                " {container}"
                " mysql"
                " --host=docker.for.mac.host.internal"
                " --port={port}"
                " --user=root"
                " --password={password}"
                "",
                container=containerName,
                port=self.port,
                password=self.rootPassword,
            )

            self._state.container.callback(container)

        except Exception as e:
            self._resetContainerState()
            self._log.failure(
                "Stopping MySQL container {name} due to error: {error}",
                name=containerName,
                error=e,
            )
            container.stop()
            raise