From c92c03dfc463e56a314c42fd5f6ad30cfb40bbd7 Mon Sep 17 00:00:00 2001 From: ArchiMoebius Date: Tue, 16 Aug 2022 20:50:39 -0400 Subject: [PATCH 1/5] feat: add support for floats to docker logs params since / until since the docker engine supports it Signed-off-by: Archi Moebius --- docker/api/container.py | 13 +++++++++---- docker/models/containers.py | 9 +++++---- tests/unit/api_container_test.py | 18 +++++++++++++++++- 3 files changed, 31 insertions(+), 9 deletions(-) diff --git a/docker/api/container.py b/docker/api/container.py index f600be181..d8f150d16 100644 --- a/docker/api/container.py +++ b/docker/api/container.py @@ -826,11 +826,12 @@ def logs(self, container, stdout=True, stderr=True, stream=False, tail (str or int): Output specified number of lines at the end of logs. Either an integer of number of lines or the string ``all``. Default ``all`` - since (datetime or int): Show logs since a given datetime or - integer epoch (in seconds) + since (datetime, int, or float): Show logs since a given datetime, + integer epoch (in seconds) or float (in nanoseconds) follow (bool): Follow log output. Default ``False`` - until (datetime or int): Show logs that occurred before the given - datetime or integer epoch (in seconds) + until (datetime, int, or float): Show logs that occurred before + the given datetime, integer epoch (in seconds), or + float (in nanoseconds) Returns: (generator or str) @@ -855,6 +856,8 @@ def logs(self, container, stdout=True, stderr=True, stream=False, params['since'] = utils.datetime_to_timestamp(since) elif (isinstance(since, int) and since > 0): params['since'] = since + elif (isinstance(since, float) and since > 0.0): + params['since'] = since else: raise errors.InvalidArgument( 'since value should be datetime or positive int, ' @@ -870,6 +873,8 @@ def logs(self, container, stdout=True, stderr=True, stream=False, params['until'] = utils.datetime_to_timestamp(until) elif (isinstance(until, int) and until > 0): params['until'] = until + elif (isinstance(until, float) and until > 0.0): + params['until'] = until else: raise errors.InvalidArgument( 'until value should be datetime or positive int, ' diff --git a/docker/models/containers.py b/docker/models/containers.py index 6661b213b..4508557d2 100644 --- a/docker/models/containers.py +++ b/docker/models/containers.py @@ -290,11 +290,12 @@ def logs(self, **kwargs): tail (str or int): Output specified number of lines at the end of logs. Either an integer of number of lines or the string ``all``. Default ``all`` - since (datetime or int): Show logs since a given datetime or - integer epoch (in seconds) + since (datetime, int, or float): Show logs since a given datetime, + integer epoch (in seconds) or float (in nanoseconds) follow (bool): Follow log output. Default ``False`` - until (datetime or int): Show logs that occurred before the given - datetime or integer epoch (in seconds) + until (datetime, int, or float): Show logs that occurred before + the given datetime, integer epoch (in seconds), or + float (in nanoseconds) Returns: (generator or str): Logs from the container. diff --git a/tests/unit/api_container_test.py b/tests/unit/api_container_test.py index 8f120f4d4..d7b356c44 100644 --- a/tests/unit/api_container_test.py +++ b/tests/unit/api_container_test.py @@ -1279,6 +1279,22 @@ def test_log_since(self): stream=False ) + def test_log_since_with_float(self): + ts = 809222400.000000 + with mock.patch('docker.api.client.APIClient.inspect_container', + fake_inspect_container): + self.client.logs(fake_api.FAKE_CONTAINER_ID, stream=False, + follow=False, since=ts) + + fake_request.assert_called_with( + 'GET', + url_prefix + 'containers/' + fake_api.FAKE_CONTAINER_ID + '/logs', + params={'timestamps': 0, 'follow': 0, 'stderr': 1, 'stdout': 1, + 'tail': 'all', 'since': ts}, + timeout=DEFAULT_TIMEOUT_SECONDS, + stream=False + ) + def test_log_since_with_datetime(self): ts = 809222400 time = datetime.datetime.utcfromtimestamp(ts) @@ -1301,7 +1317,7 @@ def test_log_since_with_invalid_value_raises_error(self): fake_inspect_container): with pytest.raises(docker.errors.InvalidArgument): self.client.logs(fake_api.FAKE_CONTAINER_ID, stream=False, - follow=False, since=42.42) + follow=False, since="42.42") def test_log_tty(self): m = mock.Mock() From 1175d7331f4c93d7e91f630b1f415da1dcedbad8 Mon Sep 17 00:00:00 2001 From: Rhiza <6900588+ArchiMoebius@users.noreply.github.com> Date: Thu, 18 Aug 2022 20:30:47 -0400 Subject: [PATCH 2/5] Update docker/api/container.py Co-authored-by: Milas Bowman Signed-off-by: Rhiza <6900588+ArchiMoebius@users.noreply.github.com> --- docker/api/container.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/api/container.py b/docker/api/container.py index d8f150d16..3c7be0946 100644 --- a/docker/api/container.py +++ b/docker/api/container.py @@ -877,7 +877,7 @@ def logs(self, container, stdout=True, stderr=True, stream=False, params['until'] = until else: raise errors.InvalidArgument( - 'until value should be datetime or positive int, ' + 'until value should be datetime or positive int/float, ' 'not {}'.format(type(until)) ) From 85263b7a42c00dec52a9afd3d777d4dd6468aca5 Mon Sep 17 00:00:00 2001 From: Rhiza <6900588+ArchiMoebius@users.noreply.github.com> Date: Thu, 18 Aug 2022 20:30:56 -0400 Subject: [PATCH 3/5] Update docker/api/container.py Co-authored-by: Milas Bowman Signed-off-by: Rhiza <6900588+ArchiMoebius@users.noreply.github.com> --- docker/api/container.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/api/container.py b/docker/api/container.py index 3c7be0946..15cda1828 100644 --- a/docker/api/container.py +++ b/docker/api/container.py @@ -831,7 +831,7 @@ def logs(self, container, stdout=True, stderr=True, stream=False, follow (bool): Follow log output. Default ``False`` until (datetime, int, or float): Show logs that occurred before the given datetime, integer epoch (in seconds), or - float (in nanoseconds) + float (in fractional seconds) Returns: (generator or str) From 26566babb712cc8a6e09796fee43174e4a496b18 Mon Sep 17 00:00:00 2001 From: Rhiza <6900588+ArchiMoebius@users.noreply.github.com> Date: Thu, 18 Aug 2022 20:31:04 -0400 Subject: [PATCH 4/5] Update docker/api/container.py Co-authored-by: Milas Bowman Signed-off-by: Rhiza <6900588+ArchiMoebius@users.noreply.github.com> --- docker/api/container.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/api/container.py b/docker/api/container.py index 15cda1828..bba999d70 100644 --- a/docker/api/container.py +++ b/docker/api/container.py @@ -860,7 +860,7 @@ def logs(self, container, stdout=True, stderr=True, stream=False, params['since'] = since else: raise errors.InvalidArgument( - 'since value should be datetime or positive int, ' + 'since value should be datetime or positive int/float, ' 'not {}'.format(type(since)) ) From 166306975d2c5c32fab4fd7b8443e30048465022 Mon Sep 17 00:00:00 2001 From: Rhiza <6900588+ArchiMoebius@users.noreply.github.com> Date: Thu, 18 Aug 2022 20:31:20 -0400 Subject: [PATCH 5/5] Update docker/api/container.py Co-authored-by: Milas Bowman Signed-off-by: Rhiza <6900588+ArchiMoebius@users.noreply.github.com> --- docker/api/container.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/api/container.py b/docker/api/container.py index bba999d70..ce483710c 100644 --- a/docker/api/container.py +++ b/docker/api/container.py @@ -827,7 +827,7 @@ def logs(self, container, stdout=True, stderr=True, stream=False, logs. Either an integer of number of lines or the string ``all``. Default ``all`` since (datetime, int, or float): Show logs since a given datetime, - integer epoch (in seconds) or float (in nanoseconds) + integer epoch (in seconds) or float (in fractional seconds) follow (bool): Follow log output. Default ``False`` until (datetime, int, or float): Show logs that occurred before the given datetime, integer epoch (in seconds), or