Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions docker/api/container.py
Original file line number Diff line number Diff line change
Expand Up @@ -325,9 +325,12 @@ def stop(self, container, timeout=10):
self._raise_for_status(res)

@utils.check_resource
def top(self, container):
def top(self, container, ps_args=None):
u = self._url("/containers/{0}/top", container)
return self._result(self._get(u), True)
params = {}
if ps_args is not None:
params['ps_args'] = ps_args
return self._result(self._get(u, params=params), True)

@utils.check_resource
def unpause(self, container):
Expand Down
1 change: 1 addition & 0 deletions docs/api.md
Original file line number Diff line number Diff line change
Expand Up @@ -878,6 +878,7 @@ Display the running processes of a container.
**Params**:

* container (str): The container to inspect
* ps_args (str): An optional arguments passed to ps (e.g., aux)

**Returns** (str): The output of the top

Expand Down
29 changes: 29 additions & 0 deletions tests/fake_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -383,6 +383,33 @@ def get_fake_stats():
return status_code, response


def get_fake_top():
return 200, {
'Processes': [
[
'root',
'26501',
'6907',
'0',
'10:32',
'pts/55',
'00:00:00',
'sleep 60',
],
],
'Titles': [
'UID',
'PID',
'PPID',
'C',
'STIME',
'TTY',
'TIME',
'CMD',
],
}


def get_fake_volume_list():
status_code = 200
response = {
Expand Down Expand Up @@ -462,6 +489,8 @@ def fake_remove_volume():

'{1}/{0}/containers/3cc2351ab11b/stats'.format(CURRENT_VERSION, prefix):
get_fake_stats,
'{1}/{0}/containers/3cc2351ab11b/top'.format(CURRENT_VERSION, prefix):
get_fake_top,
'{1}/{0}/containers/3cc2351ab11b/stop'.format(CURRENT_VERSION, prefix):
post_fake_stop_container,
'{1}/{0}/containers/3cc2351ab11b/kill'.format(CURRENT_VERSION, prefix):
Expand Down
38 changes: 38 additions & 0 deletions tests/integration_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -786,6 +786,44 @@ def runTest(self):
self.client.kill(id)


class TestContainerTop(BaseTestCase):
def runTest(self):
container = self.client.create_container(
BUSYBOX, ['sleep', '60'])

id = container['Id']

self.client.start(container)
res = self.client.top(container['Id'])
print(res)
self.assertEqual(
res['Titles'],
['UID', 'PID', 'PPID', 'C', 'STIME', 'TTY', 'TIME', 'CMD']
)
self.assertEqual(len(res['Processes']), 1)
self.assertEqual(res['Processes'][0][7], 'sleep 60')
self.client.kill(id)


class TestContainerTopWithPsArgs(BaseTestCase):
def runTest(self):
container = self.client.create_container(
BUSYBOX, ['sleep', '60'])

id = container['Id']

self.client.start(container)
res = self.client.top(container['Id'], 'waux')
self.assertEqual(
res['Titles'],
['USER', 'PID', '%CPU', '%MEM', 'VSZ', 'RSS',
'TTY', 'STAT', 'START', 'TIME', 'COMMAND'],
)
self.assertEqual(len(res['Processes']), 1)
self.assertEqual(res['Processes'][0][10], 'sleep 60')
self.client.kill(id)


class TestRestart(BaseTestCase):
def runTest(self):
container = self.client.create_container(BUSYBOX, ['sleep', '9999'])
Expand Down
20 changes: 20 additions & 0 deletions tests/test.py
Original file line number Diff line number Diff line change
Expand Up @@ -1713,6 +1713,26 @@ def test_container_stats(self):
stream=True
)

def test_container_top(self):
self.client.top(fake_api.FAKE_CONTAINER_ID)

fake_request.assert_called_with(
'GET',
url_prefix + 'containers/3cc2351ab11b/top',
params={},
timeout=DEFAULT_TIMEOUT_SECONDS
)

def test_container_top_with_psargs(self):
self.client.top(fake_api.FAKE_CONTAINER_ID, 'waux')

fake_request.assert_called_with(
'GET',
url_prefix + 'containers/3cc2351ab11b/top',
params={'ps_args': 'waux'},
timeout=DEFAULT_TIMEOUT_SECONDS
)

##################
# IMAGES TESTS #
##################
Expand Down