mirror of https://github.com/docker/docker-py.git
Merge branch 'nir0s-add-stats-api-support'
This commit is contained in:
commit
21e189c923
|
|
@ -869,11 +869,22 @@ class Client(requests.Session):
|
||||||
res = self._post_json(url, data=start_config)
|
res = self._post_json(url, data=start_config)
|
||||||
self._raise_for_status(res)
|
self._raise_for_status(res)
|
||||||
|
|
||||||
|
def stats(self, container):
|
||||||
|
if utils.compare_version('1.17', self._version) < 0:
|
||||||
|
raise errors.InvalidVersion(
|
||||||
|
'Stats retrieval is not supported in API < 1.17!')
|
||||||
|
|
||||||
|
if isinstance(container, dict):
|
||||||
|
container = container.get('Id')
|
||||||
|
url = self._url("/containers/{0}/stats".format(container))
|
||||||
|
return self._stream_helper(self._get(url, stream=True))
|
||||||
|
|
||||||
def stop(self, container, timeout=10):
|
def stop(self, container, timeout=10):
|
||||||
if isinstance(container, dict):
|
if isinstance(container, dict):
|
||||||
container = container.get('Id')
|
container = container.get('Id')
|
||||||
params = {'t': timeout}
|
params = {'t': timeout}
|
||||||
url = self._url("/containers/{0}/stop".format(container))
|
url = self._url("/containers/{0}/stop".format(container))
|
||||||
|
|
||||||
res = self._post(url, params=params,
|
res = self._post(url, params=params,
|
||||||
timeout=(timeout + self.timeout))
|
timeout=(timeout + self.timeout))
|
||||||
self._raise_for_status(res)
|
self._raise_for_status(res)
|
||||||
|
|
|
||||||
21
docs/api.md
21
docs/api.md
|
|
@ -708,6 +708,27 @@ from. Optionally a single string joining container id's with commas
|
||||||
None
|
None
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## stats
|
||||||
|
|
||||||
|
The Docker API parallel to the `docker stats` command.
|
||||||
|
This will stream statistics for a specific container.
|
||||||
|
|
||||||
|
**Params**:
|
||||||
|
|
||||||
|
* container (str): The container to start
|
||||||
|
|
||||||
|
```python
|
||||||
|
>>> from docker import Client
|
||||||
|
>>> cli = Client(base_url='tcp://127.0.0.1:2375')
|
||||||
|
>>> stats_obj = cli.stats('elasticsearch')
|
||||||
|
>>> for stat in stats:
|
||||||
|
>>> print(stat)
|
||||||
|
{"read":"2015-02-11T21:47:30.49388286+02:00","network":{"rx_bytes":666052,"rx_packets":4409 ...
|
||||||
|
...
|
||||||
|
...
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
## stop
|
## stop
|
||||||
|
|
||||||
Stops a container. Similar to the `docker stop` command.
|
Stops a container. Similar to the `docker stop` command.
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
Change Log
|
Change Log
|
||||||
==========
|
==========
|
||||||
|
|
||||||
|
|
||||||
0.7.2
|
0.7.2
|
||||||
-----
|
-----
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,8 @@
|
||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
|
import fake_stat
|
||||||
|
|
||||||
CURRENT_VERSION = 'v1.17'
|
CURRENT_VERSION = 'v1.17'
|
||||||
|
|
||||||
FAKE_CONTAINER_ID = '3cc2351ab11b'
|
FAKE_CONTAINER_ID = '3cc2351ab11b'
|
||||||
|
|
@ -337,6 +339,11 @@ def post_fake_tag_image():
|
||||||
return status_code, response
|
return status_code, response
|
||||||
|
|
||||||
|
|
||||||
|
def get_fake_stats():
|
||||||
|
status_code = 200
|
||||||
|
response = fake_stat.OBJ
|
||||||
|
return status_code, response
|
||||||
|
|
||||||
# Maps real api url to fake response callback
|
# Maps real api url to fake response callback
|
||||||
prefix = 'http+unix://var/run/docker.sock'
|
prefix = 'http+unix://var/run/docker.sock'
|
||||||
fake_responses = {
|
fake_responses = {
|
||||||
|
|
@ -376,6 +383,8 @@ fake_responses = {
|
||||||
post_fake_execute,
|
post_fake_execute,
|
||||||
'{1}/{0}/exec/3cc2351ab11b/start'.format(CURRENT_VERSION, prefix):
|
'{1}/{0}/exec/3cc2351ab11b/start'.format(CURRENT_VERSION, prefix):
|
||||||
post_fake_execute_start,
|
post_fake_execute_start,
|
||||||
|
'{1}/{0}/containers/3cc2351ab11b/stats'.format(CURRENT_VERSION, prefix):
|
||||||
|
get_fake_stats,
|
||||||
'{1}/{0}/containers/3cc2351ab11b/stop'.format(CURRENT_VERSION, prefix):
|
'{1}/{0}/containers/3cc2351ab11b/stop'.format(CURRENT_VERSION, prefix):
|
||||||
post_fake_stop_container,
|
post_fake_stop_container,
|
||||||
'{1}/{0}/containers/3cc2351ab11b/kill'.format(CURRENT_VERSION, prefix):
|
'{1}/{0}/containers/3cc2351ab11b/kill'.format(CURRENT_VERSION, prefix):
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,153 @@
|
||||||
|
OBJ = {
|
||||||
|
"read": "2015-02-11T19:20:46.667237763+02:00",
|
||||||
|
"network": {
|
||||||
|
"rx_bytes": 567224,
|
||||||
|
"rx_packets": 3773,
|
||||||
|
"rx_errors": 0,
|
||||||
|
"rx_dropped": 0,
|
||||||
|
"tx_bytes": 1176,
|
||||||
|
"tx_packets": 13,
|
||||||
|
"tx_errors": 0,
|
||||||
|
"tx_dropped": 0
|
||||||
|
},
|
||||||
|
"cpu_stats": {
|
||||||
|
"cpu_usage": {
|
||||||
|
"total_usage": 157260874053,
|
||||||
|
"percpu_usage": [
|
||||||
|
52196306950,
|
||||||
|
24118413549,
|
||||||
|
53292684398,
|
||||||
|
27653469156
|
||||||
|
],
|
||||||
|
"usage_in_kernelmode": 37140000000,
|
||||||
|
"usage_in_usermode": 62140000000
|
||||||
|
},
|
||||||
|
"system_cpu_usage": 3.0881377e+14,
|
||||||
|
"throttling_data": {
|
||||||
|
"periods": 0,
|
||||||
|
"throttled_periods": 0,
|
||||||
|
"throttled_time": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"memory_stats": {
|
||||||
|
"usage": 179314688,
|
||||||
|
"max_usage": 258166784,
|
||||||
|
"stats": {
|
||||||
|
"active_anon": 90804224,
|
||||||
|
"active_file": 2195456,
|
||||||
|
"cache": 3096576,
|
||||||
|
"hierarchical_memory_limit": 1.844674407371e+19,
|
||||||
|
"inactive_anon": 85516288,
|
||||||
|
"inactive_file": 798720,
|
||||||
|
"mapped_file": 2646016,
|
||||||
|
"pgfault": 101034,
|
||||||
|
"pgmajfault": 1207,
|
||||||
|
"pgpgin": 115814,
|
||||||
|
"pgpgout": 75613,
|
||||||
|
"rss": 176218112,
|
||||||
|
"rss_huge": 12582912,
|
||||||
|
"total_active_anon": 90804224,
|
||||||
|
"total_active_file": 2195456,
|
||||||
|
"total_cache": 3096576,
|
||||||
|
"total_inactive_anon": 85516288,
|
||||||
|
"total_inactive_file": 798720,
|
||||||
|
"total_mapped_file": 2646016,
|
||||||
|
"total_pgfault": 101034,
|
||||||
|
"total_pgmajfault": 1207,
|
||||||
|
"total_pgpgin": 115814,
|
||||||
|
"total_pgpgout": 75613,
|
||||||
|
"total_rss": 176218112,
|
||||||
|
"total_rss_huge": 12582912,
|
||||||
|
"total_unevictable": 0,
|
||||||
|
"total_writeback": 0,
|
||||||
|
"unevictable": 0,
|
||||||
|
"writeback": 0
|
||||||
|
},
|
||||||
|
"failcnt": 0,
|
||||||
|
"limit": 8039038976
|
||||||
|
},
|
||||||
|
"blkio_stats": {
|
||||||
|
"io_service_bytes_recursive": [
|
||||||
|
{
|
||||||
|
"major": 8,
|
||||||
|
"minor": 0,
|
||||||
|
"op": "Read",
|
||||||
|
"value": 72843264
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"major": 8,
|
||||||
|
"minor": 0,
|
||||||
|
"op": "Write",
|
||||||
|
"value": 4096
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"major": 8,
|
||||||
|
"minor": 0,
|
||||||
|
"op": "Sync",
|
||||||
|
"value": 4096
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"major": 8,
|
||||||
|
"minor": 0,
|
||||||
|
"op": "Async",
|
||||||
|
"value": 72843264
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"major": 8,
|
||||||
|
"minor": 0,
|
||||||
|
"op": "Total",
|
||||||
|
"value": 72847360
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"io_serviced_recursive": [
|
||||||
|
{
|
||||||
|
"major": 8,
|
||||||
|
"minor": 0,
|
||||||
|
"op": "Read",
|
||||||
|
"value": 10581
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"major": 8,
|
||||||
|
"minor": 0,
|
||||||
|
"op": "Write",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"major": 8,
|
||||||
|
"minor": 0,
|
||||||
|
"op": "Sync",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"major": 8,
|
||||||
|
"minor": 0,
|
||||||
|
"op": "Async",
|
||||||
|
"value": 10581
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"major": 8,
|
||||||
|
"minor": 0,
|
||||||
|
"op": "Total",
|
||||||
|
"value": 10582
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"io_queue_recursive": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"io_service_time_recursive": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"io_wait_time_recursive": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"io_merged_recursive": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"io_time_recursive": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"sectors_recursive": [
|
||||||
|
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -29,7 +29,7 @@ import six
|
||||||
from test import Cleanup
|
from test import Cleanup
|
||||||
|
|
||||||
# FIXME: missing tests for
|
# FIXME: missing tests for
|
||||||
# export; history; import_image; insert; port; push; tag; get; load
|
# export; history; import_image; insert; port; push; tag; get; load; stats;
|
||||||
|
|
||||||
DEFAULT_BASE_URL = os.environ.get('DOCKER_HOST')
|
DEFAULT_BASE_URL = os.environ.get('DOCKER_HOST')
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1672,6 +1672,18 @@ class DockerClientTest(Cleanup, unittest.TestCase):
|
||||||
timeout=docker.client.DEFAULT_TIMEOUT_SECONDS
|
timeout=docker.client.DEFAULT_TIMEOUT_SECONDS
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def test_container_stats(self):
|
||||||
|
try:
|
||||||
|
self.client.stats(fake_api.FAKE_CONTAINER_ID)
|
||||||
|
except Exception as e:
|
||||||
|
self.fail('Command should not raise exception: {0}'.format(e))
|
||||||
|
|
||||||
|
fake_request.assert_called_with(
|
||||||
|
url_prefix + 'containers/3cc2351ab11b/stats',
|
||||||
|
timeout=60,
|
||||||
|
stream=True
|
||||||
|
)
|
||||||
|
|
||||||
##################
|
##################
|
||||||
# IMAGES TESTS #
|
# IMAGES TESTS #
|
||||||
##################
|
##################
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue