mirror of
https://github.com/containers/podman.git
synced 2025-06-28 06:18:57 +08:00
Add support for Zulu timestamp parsing
- Improve error message when podman varlink service is not running Signed-off-by: Jhon Honce <jhonce@redhat.com> Closes: #800 Approved by: rhatdan
This commit is contained in:
@ -9,7 +9,7 @@ services:
|
||||
before_install:
|
||||
- sudo apt-get -qq update
|
||||
- sudo apt-get -qq install btrfs-tools libdevmapper-dev libgpgme11-dev libapparmor-dev
|
||||
- sudo apt-get -qq install autoconf automake bison e2fslibs-dev libfuse-dev libtool liblzma-dev gettext python3-setuptools
|
||||
- sudo apt-get -qq install autoconf automake bison e2fslibs-dev libfuse-dev libtool liblzma-dev gettext python3-setuptools python3-dateutil
|
||||
- sudo make install.libseccomp.sudo
|
||||
|
||||
install:
|
||||
|
@ -36,6 +36,7 @@ RUN apt-get update && apt-get install -y \
|
||||
netcat \
|
||||
socat \
|
||||
python3-pip \
|
||||
python3-dateutil \
|
||||
--no-install-recommends \
|
||||
&& apt-get clean
|
||||
|
||||
@ -115,7 +116,7 @@ COPY cni/87-podman-bridge.conflist /etc/cni/net.d/87-podman-bridge.conflist
|
||||
# Make sure we have some policy for pulling images
|
||||
RUN mkdir -p /etc/containers && curl https://raw.githubusercontent.com/projectatomic/registries/master/registries.fedora -o /etc/containers/registries.conf
|
||||
|
||||
# Install python3 pip module
|
||||
# Install python3 varlink module from pypi
|
||||
RUN pip3 install varlink
|
||||
|
||||
COPY test/policy.json /etc/containers/policy.json
|
||||
|
@ -19,6 +19,7 @@ RUN yum -y install btrfs-progs-devel \
|
||||
make \
|
||||
ostree-devel \
|
||||
python \
|
||||
python3-dateutil \
|
||||
which\
|
||||
golang-github-cpuguy83-go-md2man \
|
||||
iptables && yum clean all
|
||||
|
@ -20,6 +20,7 @@ RUN dnf -y install btrfs-progs-devel \
|
||||
make \
|
||||
ostree-devel \
|
||||
python \
|
||||
python3-dateutil \
|
||||
which\
|
||||
golang-github-cpuguy83-go-md2man \
|
||||
procps-ng \
|
||||
|
@ -53,9 +53,14 @@ class Client(object):
|
||||
self._client = functools.partial(_podman, uri, interface)
|
||||
|
||||
# Quick validation of connection data provided
|
||||
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."""
|
||||
|
@ -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.
|
||||
"""Convert timestamps 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())
|
||||
|
||||
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):
|
||||
|
@ -1,2 +1,3 @@
|
||||
varlink==25
|
||||
varlink>=25
|
||||
setuptools
|
||||
dateutil
|
||||
|
@ -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)
|
||||
|
@ -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}
|
||||
|
||||
|
Reference in New Issue
Block a user