From a11c11430a1025e616aedaa1335ede88128d4a20 Mon Sep 17 00:00:00 2001 From: Antonis Kalipetis Date: Fri, 9 Oct 2015 11:55:51 +0000 Subject: [PATCH 1/5] Add suport for non-stream stats of containers Adds one more flag to the `stats` method for streaming responses. Keeps default as streamed response for backwards compatibility. Signed-off-by: Antonis Kalipetis --- docker/api/container.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/docker/api/container.py b/docker/api/container.py index 142bd0f6..569b340a 100644 --- a/docker/api/container.py +++ b/docker/api/container.py @@ -344,9 +344,14 @@ class ContainerApiMixin(object): @utils.minimum_version('1.17') @utils.check_resource - def stats(self, container, decode=None): + def stats(self, container, decode=None, stream=True): url = self._url("/containers/{0}/stats", container) - return self._stream_helper(self._get(url, stream=True), decode=decode) + if stream: + return self._stream_helper(self._get(url, stream=True), + decode=decode) + else: + return self._result(self._get(url, params={'stream': False}), + json=True) @utils.check_resource def stop(self, container, timeout=10): From 019a365a0243046888ad03a10eeb9a00ffff6eaa Mon Sep 17 00:00:00 2001 From: Antonis Kalipetis Date: Fri, 9 Oct 2015 11:57:37 +0000 Subject: [PATCH 2/5] Enhance docs for stats method Signed-off-by: Antonis Kalipetis --- docs/api.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/api.md b/docs/api.md index 2aa70b5b..1e9a19c1 100644 --- a/docs/api.md +++ b/docs/api.md @@ -873,6 +873,8 @@ This will stream statistics for a specific container. * container (str): The container to stream statistics for * decode (bool): If set to true, stream will be decoded into dicts on the fly. False by default. +* stream (bool): If set to false, only the current stats will be returned + instead of a stream. True by default. ```python >>> from docker import Client From 192391a5a850904420d6ba2e90b06558d8e07d3a Mon Sep 17 00:00:00 2001 From: Antonis Kalipetis Date: Thu, 22 Oct 2015 10:28:04 +0000 Subject: [PATCH 3/5] Add integration test for stats no-stream Signed-off-by: Antonis Kalipetis --- tests/integration/container_test.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/tests/integration/container_test.py b/tests/integration/container_test.py index 04a0ef54..73510f1f 100644 --- a/tests/integration/container_test.py +++ b/tests/integration/container_test.py @@ -989,3 +989,20 @@ class PauseTest(api_test.BaseTestCase): self.assertEqual(state['Running'], True) self.assertIn('Paused', state) self.assertEqual(state['Paused'], False) + + +class GetContainerStatsTest(BaseTestCase): + @requires_api_version('1.19') + def test_get_container_stats_no_stream(self): + container = self.client.create_container( + BUSYBOX, ['sleep', '60'], + ) + self.tmp_containers.append(container) + self.client.start(container) + response = self.client.stats(container, stream=0) + self.client.kill(container) + + self.assertEquals(type(response), dict) + for key in ['read', 'network', 'precpu_stats', 'cpu_stats', + 'memory_stats', 'blkio_stats']: + self.assertIn(key, response) From 5cfd2da448f5f7659aa25e9fab4296502da9afd0 Mon Sep 17 00:00:00 2001 From: Antonis Kalipetis Date: Thu, 22 Oct 2015 14:05:55 +0000 Subject: [PATCH 4/5] Add test for streaming stats Also, fix typo in non-streaming stats. Signed-off-by: Antonis Kalipetis --- tests/integration/container_test.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/tests/integration/container_test.py b/tests/integration/container_test.py index 73510f1f..22179005 100644 --- a/tests/integration/container_test.py +++ b/tests/integration/container_test.py @@ -991,7 +991,7 @@ class PauseTest(api_test.BaseTestCase): self.assertEqual(state['Paused'], False) -class GetContainerStatsTest(BaseTestCase): +class GetContainerStatsTest(api_test.BaseTestCase): @requires_api_version('1.19') def test_get_container_stats_no_stream(self): container = self.client.create_container( @@ -1002,7 +1002,21 @@ class GetContainerStatsTest(BaseTestCase): response = self.client.stats(container, stream=0) self.client.kill(container) - self.assertEquals(type(response), dict) + self.assertEqual(type(response), dict) for key in ['read', 'network', 'precpu_stats', 'cpu_stats', 'memory_stats', 'blkio_stats']: self.assertIn(key, response) + + @requires_api_version('1.17') + def test_get_container_stats_stream(self): + container = self.client.create_container( + BUSYBOX, ['sleep', '60'], + ) + self.tmp_containers.append(container) + self.client.start(container) + stream = self.client.stats(container) + for chunk in stream: + self.assertEqual(type(chunk), dict) + for key in ['read', 'network', 'precpu_stats', 'cpu_stats', + 'memory_stats', 'blkio_stats']: + self.assertIn(key, chunk) From 7e2ec1ac6b49af1e98fe693051f61d73ba6d8f28 Mon Sep 17 00:00:00 2001 From: Antonis Kalipetis Date: Thu, 22 Oct 2015 14:06:45 +0000 Subject: [PATCH 5/5] Add EditorConfig to the repo. Signed-off-by: Antonis Kalipetis --- .editorconfig | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..d7f2776a --- /dev/null +++ b/.editorconfig @@ -0,0 +1,11 @@ +root = true + +[*] +indent_style = space +indent_size = 4 +insert_final_newline = true +trim_trailing_whitespace = true +max_line_length = 80 + +[*.md] +trim_trailing_whitespace = false