From 5f0d4b10e9b5ea18e91090e82ddfb22f63b06635 Mon Sep 17 00:00:00 2001 From: Jhon Honce Date: Mon, 21 May 2018 16:31:36 -0700 Subject: Add support for Zulu timestamp parsing - Improve error message when podman varlink service is not running Signed-off-by: Jhon Honce Closes: #800 Approved by: rhatdan --- contrib/python/podman/client.py | 11 ++++++--- contrib/python/podman/libs/__init__.py | 43 ++++------------------------------ contrib/python/requirements.txt | 3 ++- contrib/python/test/test_libs.py | 19 ++++++++++----- contrib/spec/podman.spec.in | 5 ++++ 5 files changed, 33 insertions(+), 48 deletions(-) (limited to 'contrib') diff --git a/contrib/python/podman/client.py b/contrib/python/podman/client.py index 8a1acdd9b..c6112aae8 100644 --- a/contrib/python/podman/client.py +++ b/contrib/python/podman/client.py @@ -53,9 +53,14 @@ class Client(object): self._client = functools.partial(_podman, uri, interface) # Quick validation of connection data provided - if not System(self._client).ping(): - raise ValueError('Failed varlink connection "{}/{}"'.format( - uri, interface)) + try: + if not System(self._client).ping(): + raise ValueError('Failed varlink connection "{}/{}"'.format( + uri, interface)) + except FileNotFoundError: + raise ValueError('Failed varlink connection "{}/{}".' + ' Is podman service running?'.format( + uri, interface)) def __enter__(self): """Return `self` upon entering the runtime context.""" diff --git a/contrib/python/podman/libs/__init__.py b/contrib/python/podman/libs/__init__.py index ab8fb94a8..7285921d7 100644 --- a/contrib/python/podman/libs/__init__.py +++ b/contrib/python/podman/libs/__init__.py @@ -1,7 +1,8 @@ """Support files for podman API implementation.""" import datetime -import re import threading +from dateutil.parser import parse as dateutil_parse + __all__ = [ 'cached_property', @@ -44,45 +45,11 @@ class cached_property(object): def datetime_parse(string): - """Convert timestamp to datetime. - - Because date/time parsing in python is still pedantically stupid, - we rip the input string apart throwing out the stop characters etc; - then rebuild a string strptime() can parse. Igit! - - - Python >3.7 will address colons in the UTC offset. - - There is no ETA on microseconds > 6 digits. - - And giving an offset and timezone name... - - # match: 2018-05-08T14:12:53.797795191-07:00 - # match: 2018-05-08T18:24:52.753227-07:00 - # match: 2018-05-08 14:12:53.797795191 -0700 MST - # match: 2018-05-09T10:45:57.576002 (python isoformat()) + """Convert timestamps to datetime. - Some people, when confronted with a problem, think “I know, - I'll use regular expressions.” Now they have two problems. - -- Jamie Zawinski + tzinfo aware, if provided. """ - ts = re.compile(r'^(\d+)-(\d+)-(\d+)' - r'[ T]?(\d+):(\d+):(\d+).(\d+)' - r' *([-+][\d:]{4,5})? *') - - x = ts.match(string) - if x is None: - raise ValueError('Unable to parse {}'.format(string)) - - # converting everything to int() not worth the readablity hit - igit_proof = '{}T{}.{}{}'.format( - '-'.join(x.group(1, 2, 3)), - ':'.join(x.group(4, 5, 6)), - x.group(7)[0:6], - x.group(8).replace(':', '') if x.group(8) else '', - ) - - format = '%Y-%m-%dT%H:%M:%S.%f' - if x.group(8): - format += '%z' - return datetime.datetime.strptime(igit_proof, format) + return dateutil_parse(string.upper(), fuzzy=True) def datetime_format(dt): diff --git a/contrib/python/requirements.txt b/contrib/python/requirements.txt index f5d264ddb..368a095b2 100644 --- a/contrib/python/requirements.txt +++ b/contrib/python/requirements.txt @@ -1,2 +1,3 @@ -varlink==25 +varlink>=25 setuptools +dateutil diff --git a/contrib/python/test/test_libs.py b/contrib/python/test/test_libs.py index e2160fc30..202bed1d8 100644 --- a/contrib/python/test/test_libs.py +++ b/contrib/python/test/test_libs.py @@ -18,19 +18,26 @@ class TestLibs(unittest.TestCase): '2018-05-08T14:12:53.797795191-07:00', '2018-05-08T14:12:53.797795-07:00', '2018-05-08T14:12:53.797795-0700', - '2018-05-08 14:12:53.797795191 -0700 MST' + '2018-05-08 14:12:53.797795191 -0700 MST', ]: actual = podman.datetime_parse(v) self.assertEqual(actual, expected) - podman.datetime_parse(datetime.datetime.now().isoformat()) + expected = datetime.datetime.strptime( + '2018-05-08T14:12:53.797795-0000', '%Y-%m-%dT%H:%M:%S.%f%z') + for v in [ + '2018-05-08T14:12:53.797795191Z', + '2018-05-08T14:12:53.797795191z', + ]: + actual = podman.datetime_parse(v) + self.assertEqual(actual, expected) + + actual = podman.datetime_parse(datetime.datetime.now().isoformat()) + self.assertIsNotNone(actual) def test_parse_fail(self): - # chronologist humor: '1752-09-05T12:00:00.000000-0000' also not - # handled correctly by python for my locale. for v in [ - '1752-9-5', - '1752-09-05', + 'There is no time here.', ]: with self.assertRaises(ValueError): podman.datetime_parse(v) diff --git a/contrib/spec/podman.spec.in b/contrib/spec/podman.spec.in index 2c2b098c6..51926870c 100644 --- a/contrib/spec/podman.spec.in +++ b/contrib/spec/podman.spec.in @@ -200,6 +200,11 @@ BuildArch: noarch BuildRequires: python3-devel BuildRequires: python3-setuptools BuildRequires: python3-varlink + +Requires: python3-setuptools +Requires: python3-varlink +Requires: python3-dateutil + Provides: python3-%{name} = %{version}-%{release} Summary: Python 3 bindings for %{name} -- cgit v1.2.3-54-g00ecf