mirror of
https://github.com/containers/podman.git
synced 2025-06-28 14:29:04 +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:
|
before_install:
|
||||||
- sudo apt-get -qq update
|
- sudo apt-get -qq update
|
||||||
- sudo apt-get -qq install btrfs-tools libdevmapper-dev libgpgme11-dev libapparmor-dev
|
- 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
|
- sudo make install.libseccomp.sudo
|
||||||
|
|
||||||
install:
|
install:
|
||||||
|
@ -36,6 +36,7 @@ RUN apt-get update && apt-get install -y \
|
|||||||
netcat \
|
netcat \
|
||||||
socat \
|
socat \
|
||||||
python3-pip \
|
python3-pip \
|
||||||
|
python3-dateutil \
|
||||||
--no-install-recommends \
|
--no-install-recommends \
|
||||||
&& apt-get clean
|
&& 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
|
# 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
|
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
|
RUN pip3 install varlink
|
||||||
|
|
||||||
COPY test/policy.json /etc/containers/policy.json
|
COPY test/policy.json /etc/containers/policy.json
|
||||||
|
@ -19,6 +19,7 @@ RUN yum -y install btrfs-progs-devel \
|
|||||||
make \
|
make \
|
||||||
ostree-devel \
|
ostree-devel \
|
||||||
python \
|
python \
|
||||||
|
python3-dateutil \
|
||||||
which\
|
which\
|
||||||
golang-github-cpuguy83-go-md2man \
|
golang-github-cpuguy83-go-md2man \
|
||||||
iptables && yum clean all
|
iptables && yum clean all
|
||||||
|
@ -20,6 +20,7 @@ RUN dnf -y install btrfs-progs-devel \
|
|||||||
make \
|
make \
|
||||||
ostree-devel \
|
ostree-devel \
|
||||||
python \
|
python \
|
||||||
|
python3-dateutil \
|
||||||
which\
|
which\
|
||||||
golang-github-cpuguy83-go-md2man \
|
golang-github-cpuguy83-go-md2man \
|
||||||
procps-ng \
|
procps-ng \
|
||||||
|
@ -53,9 +53,14 @@ class Client(object):
|
|||||||
self._client = functools.partial(_podman, uri, interface)
|
self._client = functools.partial(_podman, uri, interface)
|
||||||
|
|
||||||
# Quick validation of connection data provided
|
# Quick validation of connection data provided
|
||||||
if not System(self._client).ping():
|
try:
|
||||||
raise ValueError('Failed varlink connection "{}/{}"'.format(
|
if not System(self._client).ping():
|
||||||
uri, interface))
|
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):
|
def __enter__(self):
|
||||||
"""Return `self` upon entering the runtime context."""
|
"""Return `self` upon entering the runtime context."""
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
"""Support files for podman API implementation."""
|
"""Support files for podman API implementation."""
|
||||||
import datetime
|
import datetime
|
||||||
import re
|
|
||||||
import threading
|
import threading
|
||||||
|
from dateutil.parser import parse as dateutil_parse
|
||||||
|
|
||||||
|
|
||||||
__all__ = [
|
__all__ = [
|
||||||
'cached_property',
|
'cached_property',
|
||||||
@ -44,45 +45,11 @@ class cached_property(object):
|
|||||||
|
|
||||||
|
|
||||||
def datetime_parse(string):
|
def datetime_parse(string):
|
||||||
"""Convert timestamp to datetime.
|
"""Convert timestamps to datetime.
|
||||||
|
|
||||||
Because date/time parsing in python is still pedantically stupid,
|
tzinfo aware, if provided.
|
||||||
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
|
|
||||||
"""
|
"""
|
||||||
ts = re.compile(r'^(\d+)-(\d+)-(\d+)'
|
return dateutil_parse(string.upper(), fuzzy=True)
|
||||||
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)
|
|
||||||
|
|
||||||
|
|
||||||
def datetime_format(dt):
|
def datetime_format(dt):
|
||||||
|
@ -1,2 +1,3 @@
|
|||||||
varlink==25
|
varlink>=25
|
||||||
setuptools
|
setuptools
|
||||||
|
dateutil
|
||||||
|
@ -18,19 +18,26 @@ class TestLibs(unittest.TestCase):
|
|||||||
'2018-05-08T14:12:53.797795191-07:00',
|
'2018-05-08T14:12:53.797795191-07:00',
|
||||||
'2018-05-08T14:12:53.797795-07:00',
|
'2018-05-08T14:12:53.797795-07:00',
|
||||||
'2018-05-08T14:12:53.797795-0700',
|
'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)
|
actual = podman.datetime_parse(v)
|
||||||
self.assertEqual(actual, expected)
|
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):
|
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 [
|
for v in [
|
||||||
'1752-9-5',
|
'There is no time here.',
|
||||||
'1752-09-05',
|
|
||||||
]:
|
]:
|
||||||
with self.assertRaises(ValueError):
|
with self.assertRaises(ValueError):
|
||||||
podman.datetime_parse(v)
|
podman.datetime_parse(v)
|
||||||
|
@ -200,6 +200,11 @@ BuildArch: noarch
|
|||||||
BuildRequires: python3-devel
|
BuildRequires: python3-devel
|
||||||
BuildRequires: python3-setuptools
|
BuildRequires: python3-setuptools
|
||||||
BuildRequires: python3-varlink
|
BuildRequires: python3-varlink
|
||||||
|
|
||||||
|
Requires: python3-setuptools
|
||||||
|
Requires: python3-varlink
|
||||||
|
Requires: python3-dateutil
|
||||||
|
|
||||||
Provides: python3-%{name} = %{version}-%{release}
|
Provides: python3-%{name} = %{version}-%{release}
|
||||||
Summary: Python 3 bindings for %{name}
|
Summary: Python 3 bindings for %{name}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user