Glance should use openstack.common.timeutils
Implements blueprint use-common-timeutils 1. Edit openstack-common.conf and import glance/openstack/common/timeutils.py 2. Replace datetime.utcnow with timeutils.utcnow 3. Replace utils.isotime with timeutils.isotime 4. Replace utils.parse_isotime with timeutils.parse_isotime 5. Replace utils.normalize_time with timeutils.normalize_time 6. Remove datetime related functions and datetime related unittests Change-Id: I014548848f738b00c670be3d372b16f47f6dee96
This commit is contained in:
parent
ac95b1f9c7
commit
bbe442dddb
@ -23,6 +23,7 @@ from glance.common import exception
|
|||||||
from glance.common import utils
|
from glance.common import utils
|
||||||
from glance.common import wsgi
|
from glance.common import wsgi
|
||||||
import glance.db.api
|
import glance.db.api
|
||||||
|
from glance.openstack.common import timeutils
|
||||||
|
|
||||||
|
|
||||||
class ImagesController(base.Controller):
|
class ImagesController(base.Controller):
|
||||||
@ -198,7 +199,7 @@ class ResponseSerializer(wsgi.JSONResponseSerializer):
|
|||||||
def _serialize_datetimes(image):
|
def _serialize_datetimes(image):
|
||||||
for (key, value) in image.iteritems():
|
for (key, value) in image.iteritems():
|
||||||
if isinstance(value, datetime.datetime):
|
if isinstance(value, datetime.datetime):
|
||||||
image[key] = utils.isotime(value)
|
image[key] = timeutils.isotime(value)
|
||||||
|
|
||||||
def create(self, response, image):
|
def create(self, response, image):
|
||||||
response.body = json.dumps({'image': self._format_image(image)})
|
response.body = json.dumps({'image': self._format_image(image)})
|
||||||
|
@ -20,7 +20,6 @@
|
|||||||
System-level utilities and helper functions.
|
System-level utilities and helper functions.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import datetime
|
|
||||||
import errno
|
import errno
|
||||||
import functools
|
import functools
|
||||||
import logging
|
import logging
|
||||||
@ -38,8 +37,6 @@ from glance.common import exception
|
|||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
TIME_FORMAT = "%Y-%m-%dT%H:%M:%S"
|
|
||||||
|
|
||||||
|
|
||||||
def chunkreadable(iter, chunk_size=65536):
|
def chunkreadable(iter, chunk_size=65536):
|
||||||
"""
|
"""
|
||||||
@ -161,32 +158,6 @@ def is_uuid_like(value):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
def isotime(at=None):
|
|
||||||
"""Stringify time in ISO 8601 format"""
|
|
||||||
if not at:
|
|
||||||
at = datetime.datetime.utcnow()
|
|
||||||
str = at.strftime(TIME_FORMAT)
|
|
||||||
tz = at.tzinfo.tzname(None) if at.tzinfo else 'UTC'
|
|
||||||
str += ('Z' if tz == 'UTC' else tz)
|
|
||||||
return str
|
|
||||||
|
|
||||||
|
|
||||||
def parse_isotime(timestr):
|
|
||||||
"""Parse time from ISO 8601 format"""
|
|
||||||
try:
|
|
||||||
return iso8601.parse_date(timestr)
|
|
||||||
except iso8601.ParseError as e:
|
|
||||||
raise ValueError(e.message)
|
|
||||||
except TypeError as e:
|
|
||||||
raise ValueError(e.message)
|
|
||||||
|
|
||||||
|
|
||||||
def normalize_time(timestamp):
|
|
||||||
"""Normalize time in arbitrary timezone to UTC"""
|
|
||||||
offset = timestamp.utcoffset()
|
|
||||||
return timestamp.replace(tzinfo=None) - offset if offset else timestamp
|
|
||||||
|
|
||||||
|
|
||||||
def safe_mkdirs(path):
|
def safe_mkdirs(path):
|
||||||
try:
|
try:
|
||||||
os.makedirs(path)
|
os.makedirs(path)
|
||||||
|
@ -35,11 +35,11 @@ from sqlalchemy.orm import sessionmaker
|
|||||||
from sqlalchemy.sql import or_, and_
|
from sqlalchemy.sql import or_, and_
|
||||||
|
|
||||||
from glance.common import exception
|
from glance.common import exception
|
||||||
from glance.common import utils
|
|
||||||
from glance.openstack.common import cfg
|
|
||||||
from glance import db
|
from glance import db
|
||||||
from glance.db import migration
|
from glance.db import migration
|
||||||
from glance.db import models
|
from glance.db import models
|
||||||
|
from glance.openstack.common import cfg
|
||||||
|
from glance.openstack.common import timeutils
|
||||||
|
|
||||||
_ENGINE = None
|
_ENGINE = None
|
||||||
_MAKER = None
|
_MAKER = None
|
||||||
@ -410,7 +410,7 @@ def image_get_all(context, filters=None, marker=None, limit=None,
|
|||||||
if 'changes-since' in filters:
|
if 'changes-since' in filters:
|
||||||
# normalize timestamp to UTC, as sqlalchemy doesn't appear to
|
# normalize timestamp to UTC, as sqlalchemy doesn't appear to
|
||||||
# respect timezone offsets
|
# respect timezone offsets
|
||||||
changes_since = utils.normalize_time(filters.pop('changes-since'))
|
changes_since = timeutils.normalize_time(filters.pop('changes-since'))
|
||||||
query = query.filter(models.Image.updated_at > changes_since)
|
query = query.filter(models.Image.updated_at > changes_since)
|
||||||
showing_deleted = True
|
showing_deleted = True
|
||||||
|
|
||||||
|
@ -20,8 +20,6 @@
|
|||||||
SQLAlchemy models for glance data
|
SQLAlchemy models for glance data
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import datetime
|
|
||||||
|
|
||||||
from sqlalchemy.orm import relationship, backref, object_mapper
|
from sqlalchemy.orm import relationship, backref, object_mapper
|
||||||
from sqlalchemy import Column, Integer, String, BigInteger
|
from sqlalchemy import Column, Integer, String, BigInteger
|
||||||
from sqlalchemy import ForeignKey, DateTime, Boolean, Text
|
from sqlalchemy import ForeignKey, DateTime, Boolean, Text
|
||||||
@ -31,6 +29,7 @@ from sqlalchemy.ext.declarative import declarative_base
|
|||||||
|
|
||||||
import glance.db.api
|
import glance.db.api
|
||||||
from glance.common import utils
|
from glance.common import utils
|
||||||
|
from glance.openstack.common import timeutils
|
||||||
|
|
||||||
BASE = declarative_base()
|
BASE = declarative_base()
|
||||||
|
|
||||||
@ -47,10 +46,10 @@ class ModelBase(object):
|
|||||||
__protected_attributes__ = set([
|
__protected_attributes__ = set([
|
||||||
"created_at", "updated_at", "deleted_at", "deleted"])
|
"created_at", "updated_at", "deleted_at", "deleted"])
|
||||||
|
|
||||||
created_at = Column(DateTime, default=datetime.datetime.utcnow,
|
created_at = Column(DateTime, default=timeutils.utcnow,
|
||||||
nullable=False)
|
nullable=False)
|
||||||
updated_at = Column(DateTime, default=datetime.datetime.utcnow,
|
updated_at = Column(DateTime, default=timeutils.utcnow,
|
||||||
nullable=False, onupdate=datetime.datetime.utcnow)
|
nullable=False, onupdate=timeutils.utcnow)
|
||||||
deleted_at = Column(DateTime)
|
deleted_at = Column(DateTime)
|
||||||
deleted = Column(Boolean, nullable=False, default=False)
|
deleted = Column(Boolean, nullable=False, default=False)
|
||||||
|
|
||||||
@ -63,7 +62,7 @@ class ModelBase(object):
|
|||||||
def delete(self, session=None):
|
def delete(self, session=None):
|
||||||
"""Delete this object"""
|
"""Delete this object"""
|
||||||
self.deleted = True
|
self.deleted = True
|
||||||
self.deleted_at = datetime.datetime.utcnow()
|
self.deleted_at = timeutils.utcnow()
|
||||||
self.save(session=session)
|
self.save(session=session)
|
||||||
|
|
||||||
def update(self, values):
|
def update(self, values):
|
||||||
|
@ -16,13 +16,13 @@
|
|||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
|
|
||||||
import datetime
|
|
||||||
import socket
|
import socket
|
||||||
import uuid
|
import uuid
|
||||||
|
|
||||||
from glance.common import exception
|
from glance.common import exception
|
||||||
from glance.openstack.common import cfg
|
from glance.openstack.common import cfg
|
||||||
from glance.openstack.common import importutils
|
from glance.openstack.common import importutils
|
||||||
|
from glance.openstack.common import timeutils
|
||||||
|
|
||||||
notifier_opts = [
|
notifier_opts = [
|
||||||
cfg.StrOpt('notifier_strategy', default='default')
|
cfg.StrOpt('notifier_strategy', default='default')
|
||||||
@ -59,7 +59,7 @@ class Notifier(object):
|
|||||||
"event_type": event_type,
|
"event_type": event_type,
|
||||||
"priority": priority,
|
"priority": priority,
|
||||||
"payload": payload,
|
"payload": payload,
|
||||||
"timestamp": str(datetime.datetime.utcnow()),
|
"timestamp": str(timeutils.utcnow()),
|
||||||
}
|
}
|
||||||
|
|
||||||
def warn(self, event_type, payload):
|
def warn(self, event_type, payload):
|
||||||
|
73
glance/openstack/common/timeutils.py
Normal file
73
glance/openstack/common/timeutils.py
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
||||||
|
|
||||||
|
# Copyright 2011 OpenStack LLC.
|
||||||
|
# All Rights Reserved.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
|
"""
|
||||||
|
Time related utilities and helper functions.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import datetime
|
||||||
|
|
||||||
|
import iso8601
|
||||||
|
|
||||||
|
|
||||||
|
TIME_FORMAT = "%Y-%m-%dT%H:%M:%S"
|
||||||
|
|
||||||
|
|
||||||
|
def isotime(at=None):
|
||||||
|
"""Stringify time in ISO 8601 format"""
|
||||||
|
if not at:
|
||||||
|
at = datetime.datetime.utcnow()
|
||||||
|
str = at.strftime(TIME_FORMAT)
|
||||||
|
tz = at.tzinfo.tzname(None) if at.tzinfo else 'UTC'
|
||||||
|
str += ('Z' if tz == 'UTC' else tz)
|
||||||
|
return str
|
||||||
|
|
||||||
|
|
||||||
|
def parse_isotime(timestr):
|
||||||
|
"""Parse time from ISO 8601 format"""
|
||||||
|
try:
|
||||||
|
return iso8601.parse_date(timestr)
|
||||||
|
except iso8601.ParseError as e:
|
||||||
|
raise ValueError(e.message)
|
||||||
|
except TypeError as e:
|
||||||
|
raise ValueError(e.message)
|
||||||
|
|
||||||
|
|
||||||
|
def normalize_time(timestamp):
|
||||||
|
"""Normalize time in arbitrary timezone to UTC"""
|
||||||
|
offset = timestamp.utcoffset()
|
||||||
|
return timestamp.replace(tzinfo=None) - offset if offset else timestamp
|
||||||
|
|
||||||
|
|
||||||
|
def utcnow():
|
||||||
|
"""Overridable version of utils.utcnow."""
|
||||||
|
if utcnow.override_time:
|
||||||
|
return utcnow.override_time
|
||||||
|
return datetime.datetime.utcnow()
|
||||||
|
|
||||||
|
|
||||||
|
utcnow.override_time = None
|
||||||
|
|
||||||
|
|
||||||
|
def set_time_override(override_time=datetime.datetime.utcnow()):
|
||||||
|
"""Override utils.utcnow to return a constant time."""
|
||||||
|
utcnow.override_time = override_time
|
||||||
|
|
||||||
|
|
||||||
|
def clear_time_override():
|
||||||
|
"""Remove the overridden time."""
|
||||||
|
utcnow.override_time = None
|
@ -27,6 +27,7 @@ from glance.common import exception
|
|||||||
from glance.common import utils
|
from glance.common import utils
|
||||||
from glance.common import wsgi
|
from glance.common import wsgi
|
||||||
from glance.openstack.common import cfg
|
from glance.openstack.common import cfg
|
||||||
|
from glance.openstack.common import timeutils
|
||||||
from glance.db import api as db_api
|
from glance.db import api as db_api
|
||||||
|
|
||||||
logger = logging.getLogger('glance.registry.api.v1.images')
|
logger = logging.getLogger('glance.registry.api.v1.images')
|
||||||
@ -167,7 +168,7 @@ class Controller(object):
|
|||||||
if 'changes-since' in filters:
|
if 'changes-since' in filters:
|
||||||
isotime = filters['changes-since']
|
isotime = filters['changes-since']
|
||||||
try:
|
try:
|
||||||
filters['changes-since'] = utils.parse_isotime(isotime)
|
filters['changes-since'] = timeutils.parse_isotime(isotime)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
raise exc.HTTPBadRequest(_("Unrecognized changes-since value"))
|
raise exc.HTTPBadRequest(_("Unrecognized changes-since value"))
|
||||||
|
|
||||||
|
@ -26,7 +26,7 @@ import tempfile
|
|||||||
import thread
|
import thread
|
||||||
import time
|
import time
|
||||||
|
|
||||||
from glance.common import utils
|
from glance.openstack.common import timeutils
|
||||||
from glance.tests import functional
|
from glance.tests import functional
|
||||||
from glance.tests.utils import execute, requires, minimal_add_command
|
from glance.tests.utils import execute, requires, minimal_add_command
|
||||||
from glance.tests.functional.store_utils import (setup_http,
|
from glance.tests.functional.store_utils import (setup_http,
|
||||||
@ -785,8 +785,8 @@ class TestBinGlance(functional.FunctionalTest):
|
|||||||
self.assertEqual(image_lines[0].split()[0], image_ids[1])
|
self.assertEqual(image_lines[0].split()[0], image_ids[1])
|
||||||
|
|
||||||
# 9. Check past changes-since
|
# 9. Check past changes-since
|
||||||
dt1 = datetime.datetime.utcnow() - datetime.timedelta(1)
|
dt1 = timeutils.utcnow() - datetime.timedelta(1)
|
||||||
iso1 = utils.isotime(dt1)
|
iso1 = timeutils.isotime(dt1)
|
||||||
cmd = "changes-since=%s" % iso1
|
cmd = "changes-since=%s" % iso1
|
||||||
exitcode, out, err = execute("%s %s" % (_index_cmd, cmd))
|
exitcode, out, err = execute("%s %s" % (_index_cmd, cmd))
|
||||||
|
|
||||||
@ -798,8 +798,8 @@ class TestBinGlance(functional.FunctionalTest):
|
|||||||
self.assertEqual(image_lines[2].split()[0], image_ids[0])
|
self.assertEqual(image_lines[2].split()[0], image_ids[0])
|
||||||
|
|
||||||
# 10. Check future changes-since
|
# 10. Check future changes-since
|
||||||
dt2 = datetime.datetime.utcnow() + datetime.timedelta(1)
|
dt2 = timeutils.utcnow() + datetime.timedelta(1)
|
||||||
iso2 = utils.isotime(dt2)
|
iso2 = timeutils.isotime(dt2)
|
||||||
cmd = "changes-since=%s" % iso2
|
cmd = "changes-since=%s" % iso2
|
||||||
exitcode, out, err = execute("%s %s" % (_index_cmd, cmd))
|
exitcode, out, err = execute("%s %s" % (_index_cmd, cmd))
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@ import tempfile
|
|||||||
|
|
||||||
import httplib2
|
import httplib2
|
||||||
|
|
||||||
from glance.common import utils
|
from glance.openstack.common import timeutils
|
||||||
from glance.tests import functional
|
from glance.tests import functional
|
||||||
from glance.tests.utils import skip_if_disabled, minimal_headers
|
from glance.tests.utils import skip_if_disabled, minimal_headers
|
||||||
|
|
||||||
@ -740,8 +740,8 @@ class TestApi(functional.FunctionalTest):
|
|||||||
self.assertEqual(image['name'], "My Image!")
|
self.assertEqual(image['name'], "My Image!")
|
||||||
|
|
||||||
# 16. GET /images with past changes-since filter
|
# 16. GET /images with past changes-since filter
|
||||||
yesterday = utils.isotime(datetime.datetime.utcnow() -
|
yesterday = timeutils.isotime(timeutils.utcnow() -
|
||||||
datetime.timedelta(1))
|
datetime.timedelta(1))
|
||||||
params = "changes-since=%s" % yesterday
|
params = "changes-since=%s" % yesterday
|
||||||
path = "http://%s:%d/v1/images?%s" % ("0.0.0.0", self.api_port, params)
|
path = "http://%s:%d/v1/images?%s" % ("0.0.0.0", self.api_port, params)
|
||||||
response, content = http.request(path, 'GET')
|
response, content = http.request(path, 'GET')
|
||||||
@ -754,7 +754,7 @@ class TestApi(functional.FunctionalTest):
|
|||||||
# '+' is wrongly decoded as a space
|
# '+' is wrongly decoded as a space
|
||||||
# TODO(eglynn): investigate '+' --> <SPACE> decoding, an artifact
|
# TODO(eglynn): investigate '+' --> <SPACE> decoding, an artifact
|
||||||
# of WSGI/webob dispatch?
|
# of WSGI/webob dispatch?
|
||||||
now = datetime.datetime.utcnow()
|
now = timeutils.utcnow()
|
||||||
hour_ago = now.strftime('%Y-%m-%dT%H:%M:%S%%2B01:00')
|
hour_ago = now.strftime('%Y-%m-%dT%H:%M:%S%%2B01:00')
|
||||||
params = "changes-since=%s" % hour_ago
|
params = "changes-since=%s" % hour_ago
|
||||||
path = "http://%s:%d/v1/images?%s" % ("0.0.0.0", self.api_port, params)
|
path = "http://%s:%d/v1/images?%s" % ("0.0.0.0", self.api_port, params)
|
||||||
@ -764,8 +764,8 @@ class TestApi(functional.FunctionalTest):
|
|||||||
self.assertEqual(len(data['images']), 3)
|
self.assertEqual(len(data['images']), 3)
|
||||||
|
|
||||||
# 17. GET /images with future changes-since filter
|
# 17. GET /images with future changes-since filter
|
||||||
tomorrow = utils.isotime(datetime.datetime.utcnow() +
|
tomorrow = timeutils.isotime(timeutils.utcnow() +
|
||||||
datetime.timedelta(1))
|
datetime.timedelta(1))
|
||||||
params = "changes-since=%s" % tomorrow
|
params = "changes-since=%s" % tomorrow
|
||||||
path = "http://%s:%d/v1/images?%s" % ("0.0.0.0", self.api_port, params)
|
path = "http://%s:%d/v1/images?%s" % ("0.0.0.0", self.api_port, params)
|
||||||
response, content = http.request(path, 'GET')
|
response, content = http.request(path, 'GET')
|
||||||
@ -774,7 +774,7 @@ class TestApi(functional.FunctionalTest):
|
|||||||
self.assertEqual(len(data['images']), 0)
|
self.assertEqual(len(data['images']), 0)
|
||||||
|
|
||||||
# one timezone east of Greenwich equates to an hour from now
|
# one timezone east of Greenwich equates to an hour from now
|
||||||
now = datetime.datetime.utcnow()
|
now = timeutils.utcnow()
|
||||||
hour_hence = now.strftime('%Y-%m-%dT%H:%M:%S-01:00')
|
hour_hence = now.strftime('%Y-%m-%dT%H:%M:%S-01:00')
|
||||||
params = "changes-since=%s" % hour_hence
|
params = "changes-since=%s" % hour_hence
|
||||||
path = "http://%s:%d/v1/images?%s" % ("0.0.0.0", self.api_port, params)
|
path = "http://%s:%d/v1/images?%s" % ("0.0.0.0", self.api_port, params)
|
||||||
|
@ -40,6 +40,7 @@ import tempfile
|
|||||||
from glance import client as glance_client
|
from glance import client as glance_client
|
||||||
from glance.common import exception
|
from glance.common import exception
|
||||||
from glance.common import utils
|
from glance.common import utils
|
||||||
|
from glance.openstack.common import timeutils
|
||||||
from glance.tests import functional
|
from glance.tests import functional
|
||||||
from glance.tests.utils import skip_if_disabled, minimal_headers
|
from glance.tests.utils import skip_if_disabled, minimal_headers
|
||||||
|
|
||||||
@ -911,8 +912,8 @@ class TestSSL(functional.FunctionalTest):
|
|||||||
self.assertEqual(image['name'], "My Image!")
|
self.assertEqual(image['name'], "My Image!")
|
||||||
|
|
||||||
# 14. GET /images with past changes-since filter
|
# 14. GET /images with past changes-since filter
|
||||||
dt1 = datetime.datetime.utcnow() - datetime.timedelta(1)
|
dt1 = timeutils.utcnow() - datetime.timedelta(1)
|
||||||
iso1 = utils.isotime(dt1)
|
iso1 = timeutils.isotime(dt1)
|
||||||
params = "changes-since=%s" % iso1
|
params = "changes-since=%s" % iso1
|
||||||
path = "https://%s:%d/v1/images?%s" % ("0.0.0.0",
|
path = "https://%s:%d/v1/images?%s" % ("0.0.0.0",
|
||||||
self.api_port, params)
|
self.api_port, params)
|
||||||
@ -922,8 +923,8 @@ class TestSSL(functional.FunctionalTest):
|
|||||||
self.assertEqual(len(data['images']), 3)
|
self.assertEqual(len(data['images']), 3)
|
||||||
|
|
||||||
# 15. GET /images with future changes-since filter
|
# 15. GET /images with future changes-since filter
|
||||||
dt2 = datetime.datetime.utcnow() + datetime.timedelta(1)
|
dt2 = timeutils.utcnow() + datetime.timedelta(1)
|
||||||
iso2 = utils.isotime(dt2)
|
iso2 = timeutils.isotime(dt2)
|
||||||
params = "changes-since=%s" % iso2
|
params = "changes-since=%s" % iso2
|
||||||
path = "https://%s:%d/v1/images?%s" % ("0.0.0.0",
|
path = "https://%s:%d/v1/images?%s" % ("0.0.0.0",
|
||||||
self.api_port, params)
|
self.api_port, params)
|
||||||
|
@ -26,6 +26,7 @@ from glance.common import exception
|
|||||||
from glance.common import utils
|
from glance.common import utils
|
||||||
from glance.db import api as db_api
|
from glance.db import api as db_api
|
||||||
from glance.db import models as db_models
|
from glance.db import models as db_models
|
||||||
|
from glance.openstack.common import timeutils
|
||||||
from glance.registry import client as rclient
|
from glance.registry import client as rclient
|
||||||
from glance.tests.unit import base
|
from glance.tests.unit import base
|
||||||
from glance.tests import utils as test_utils
|
from glance.tests import utils as test_utils
|
||||||
@ -154,8 +155,8 @@ class TestRegistryClient(base.IsolatedUnitTest):
|
|||||||
'disk_format': 'ami',
|
'disk_format': 'ami',
|
||||||
'container_format': 'ami',
|
'container_format': 'ami',
|
||||||
'is_public': False,
|
'is_public': False,
|
||||||
'created_at': datetime.datetime.utcnow(),
|
'created_at': timeutils.utcnow(),
|
||||||
'updated_at': datetime.datetime.utcnow(),
|
'updated_at': timeutils.utcnow(),
|
||||||
'deleted_at': None,
|
'deleted_at': None,
|
||||||
'deleted': False,
|
'deleted': False,
|
||||||
'checksum': None,
|
'checksum': None,
|
||||||
@ -168,8 +169,8 @@ class TestRegistryClient(base.IsolatedUnitTest):
|
|||||||
'disk_format': 'vhd',
|
'disk_format': 'vhd',
|
||||||
'container_format': 'ovf',
|
'container_format': 'ovf',
|
||||||
'is_public': True,
|
'is_public': True,
|
||||||
'created_at': datetime.datetime.utcnow(),
|
'created_at': timeutils.utcnow(),
|
||||||
'updated_at': datetime.datetime.utcnow(),
|
'updated_at': timeutils.utcnow(),
|
||||||
'deleted_at': None,
|
'deleted_at': None,
|
||||||
'deleted': False,
|
'deleted': False,
|
||||||
'checksum': None,
|
'checksum': None,
|
||||||
@ -416,7 +417,7 @@ class TestRegistryClient(base.IsolatedUnitTest):
|
|||||||
Tests that the /images registry API returns list of
|
Tests that the /images registry API returns list of
|
||||||
public images sorted by created_at in ascending order.
|
public images sorted by created_at in ascending order.
|
||||||
"""
|
"""
|
||||||
now = datetime.datetime.utcnow()
|
now = timeutils.utcnow()
|
||||||
time1 = now + datetime.timedelta(seconds=5)
|
time1 = now + datetime.timedelta(seconds=5)
|
||||||
time2 = now
|
time2 = now
|
||||||
|
|
||||||
@ -458,7 +459,7 @@ class TestRegistryClient(base.IsolatedUnitTest):
|
|||||||
Tests that the /images registry API returns list of
|
Tests that the /images registry API returns list of
|
||||||
public images sorted by updated_at in descending order.
|
public images sorted by updated_at in descending order.
|
||||||
"""
|
"""
|
||||||
now = datetime.datetime.utcnow()
|
now = timeutils.utcnow()
|
||||||
time1 = now + datetime.timedelta(seconds=5)
|
time1 = now + datetime.timedelta(seconds=5)
|
||||||
time2 = now
|
time2 = now
|
||||||
|
|
||||||
@ -814,17 +815,17 @@ class TestRegistryClient(base.IsolatedUnitTest):
|
|||||||
|
|
||||||
def test_get_image_details_with_changes_since(self):
|
def test_get_image_details_with_changes_since(self):
|
||||||
"""Tests that a detailed call can be filtered by size_min"""
|
"""Tests that a detailed call can be filtered by size_min"""
|
||||||
dt1 = datetime.datetime.utcnow() - datetime.timedelta(1)
|
dt1 = timeutils.utcnow() - datetime.timedelta(1)
|
||||||
iso1 = utils.isotime(dt1)
|
iso1 = timeutils.isotime(dt1)
|
||||||
|
|
||||||
dt2 = datetime.datetime.utcnow() + datetime.timedelta(1)
|
dt2 = timeutils.utcnow() + datetime.timedelta(1)
|
||||||
iso2 = utils.isotime(dt2)
|
iso2 = timeutils.isotime(dt2)
|
||||||
|
|
||||||
dt3 = datetime.datetime.utcnow() + datetime.timedelta(2)
|
dt3 = timeutils.utcnow() + datetime.timedelta(2)
|
||||||
iso3 = utils.isotime(dt3)
|
iso3 = timeutils.isotime(dt3)
|
||||||
|
|
||||||
dt4 = datetime.datetime.utcnow() + datetime.timedelta(3)
|
dt4 = timeutils.utcnow() + datetime.timedelta(3)
|
||||||
iso4 = utils.isotime(dt4)
|
iso4 = timeutils.isotime(dt4)
|
||||||
|
|
||||||
UUID3 = _gen_uuid()
|
UUID3 = _gen_uuid()
|
||||||
extra_fixture = {'id': UUID3,
|
extra_fixture = {'id': UUID3,
|
||||||
@ -1208,8 +1209,8 @@ class TestClient(base.IsolatedUnitTest):
|
|||||||
'disk_format': 'ami',
|
'disk_format': 'ami',
|
||||||
'container_format': 'ami',
|
'container_format': 'ami',
|
||||||
'is_public': False,
|
'is_public': False,
|
||||||
'created_at': datetime.datetime.utcnow(),
|
'created_at': timeutils.utcnow(),
|
||||||
'updated_at': datetime.datetime.utcnow(),
|
'updated_at': timeutils.utcnow(),
|
||||||
'deleted_at': None,
|
'deleted_at': None,
|
||||||
'deleted': False,
|
'deleted': False,
|
||||||
'checksum': None,
|
'checksum': None,
|
||||||
@ -1222,8 +1223,8 @@ class TestClient(base.IsolatedUnitTest):
|
|||||||
'disk_format': 'vhd',
|
'disk_format': 'vhd',
|
||||||
'container_format': 'ovf',
|
'container_format': 'ovf',
|
||||||
'is_public': True,
|
'is_public': True,
|
||||||
'created_at': datetime.datetime.utcnow(),
|
'created_at': timeutils.utcnow(),
|
||||||
'updated_at': datetime.datetime.utcnow(),
|
'updated_at': timeutils.utcnow(),
|
||||||
'deleted_at': None,
|
'deleted_at': None,
|
||||||
'deleted': False,
|
'deleted': False,
|
||||||
'checksum': None,
|
'checksum': None,
|
||||||
@ -1537,17 +1538,17 @@ class TestClient(base.IsolatedUnitTest):
|
|||||||
|
|
||||||
def test_get_image_details_with_changes_since(self):
|
def test_get_image_details_with_changes_since(self):
|
||||||
"""Tests that a detailed call can be filtered by size_min"""
|
"""Tests that a detailed call can be filtered by size_min"""
|
||||||
dt1 = datetime.datetime.utcnow() - datetime.timedelta(1)
|
dt1 = timeutils.utcnow() - datetime.timedelta(1)
|
||||||
iso1 = utils.isotime(dt1)
|
iso1 = timeutils.isotime(dt1)
|
||||||
|
|
||||||
dt2 = datetime.datetime.utcnow() + datetime.timedelta(1)
|
dt2 = timeutils.utcnow() + datetime.timedelta(1)
|
||||||
iso2 = utils.isotime(dt2)
|
iso2 = timeutils.isotime(dt2)
|
||||||
|
|
||||||
dt3 = datetime.datetime.utcnow() + datetime.timedelta(2)
|
dt3 = timeutils.utcnow() + datetime.timedelta(2)
|
||||||
iso3 = utils.isotime(dt3)
|
iso3 = timeutils.isotime(dt3)
|
||||||
|
|
||||||
dt4 = datetime.datetime.utcnow() + datetime.timedelta(3)
|
dt4 = timeutils.utcnow() + datetime.timedelta(3)
|
||||||
iso4 = utils.isotime(dt4)
|
iso4 = timeutils.isotime(dt4)
|
||||||
|
|
||||||
UUID3 = _gen_uuid()
|
UUID3 = _gen_uuid()
|
||||||
extra_fixture = {'id': UUID3,
|
extra_fixture = {'id': UUID3,
|
||||||
|
@ -24,6 +24,7 @@ from glance.common import exception
|
|||||||
from glance.common import utils
|
from glance.common import utils
|
||||||
from glance.db import api as db_api
|
from glance.db import api as db_api
|
||||||
from glance.db import models as db_models
|
from glance.db import models as db_models
|
||||||
|
from glance.openstack.common import timeutils
|
||||||
from glance.tests.unit import base
|
from glance.tests.unit import base
|
||||||
from glance.tests import utils as test_utils
|
from glance.tests import utils as test_utils
|
||||||
|
|
||||||
@ -109,7 +110,7 @@ class TestRegistryDb(BaseDBTestCase):
|
|||||||
db_api.image_create(self.adm_context, fixture)
|
db_api.image_create(self.adm_context, fixture)
|
||||||
|
|
||||||
def build_fixtures(self):
|
def build_fixtures(self):
|
||||||
t1 = datetime.datetime.utcnow()
|
t1 = timeutils.utcnow()
|
||||||
t2 = t1 + datetime.timedelta(microseconds=1)
|
t2 = t1 + datetime.timedelta(microseconds=1)
|
||||||
return build_fixtures(t1, t2)
|
return build_fixtures(t1, t2)
|
||||||
|
|
||||||
@ -204,7 +205,7 @@ class TestDBImageTags(BaseDBTestCase):
|
|||||||
class TestRegistryDbWithSameTime(TestRegistryDb):
|
class TestRegistryDbWithSameTime(TestRegistryDb):
|
||||||
|
|
||||||
def build_fixtures(self):
|
def build_fixtures(self):
|
||||||
t1 = datetime.datetime.utcnow()
|
t1 = timeutils.utcnow()
|
||||||
t2 = t1 # Same timestamp!
|
t2 = t1 # Same timestamp!
|
||||||
return build_fixtures(t1, t2)
|
return build_fixtures(t1, t2)
|
||||||
|
|
||||||
@ -267,7 +268,7 @@ class TestPagingOrder(base.IsolatedUnitTest):
|
|||||||
|
|
||||||
def build_fixtures(self):
|
def build_fixtures(self):
|
||||||
self.images = []
|
self.images = []
|
||||||
t0 = datetime.datetime.utcnow()
|
t0 = timeutils.utcnow()
|
||||||
for _ in xrange(0, self.ITEM_COUNT):
|
for _ in xrange(0, self.ITEM_COUNT):
|
||||||
tdelta = random.uniform(0, self.TIME_VALUES)
|
tdelta = random.uniform(0, self.TIME_VALUES)
|
||||||
min_disk = random.uniform(0, self.MINDISK_VALUES)
|
min_disk = random.uniform(0, self.MINDISK_VALUES)
|
||||||
|
@ -46,14 +46,6 @@ class UtilsTestCase(test_utils.BaseTestCase):
|
|||||||
self.assertFalse(utils.bool_from_string(value),
|
self.assertFalse(utils.bool_from_string(value),
|
||||||
"Got True for value: %r" % value)
|
"Got True for value: %r" % value)
|
||||||
|
|
||||||
def test_isotime(self):
|
|
||||||
dt1 = datetime.datetime(2001, 11, 10, 1, 2, 3)
|
|
||||||
self.assertEqual('2001-11-10T01:02:03Z', utils.isotime(dt1))
|
|
||||||
|
|
||||||
iso_re = re.compile(r'^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z')
|
|
||||||
now_iso = utils.isotime()
|
|
||||||
self.assertTrue(iso_re.match(now_iso) is not None)
|
|
||||||
|
|
||||||
def test_encryption(self):
|
def test_encryption(self):
|
||||||
# Check that original plaintext and unencrypted ciphertext match
|
# Check that original plaintext and unencrypted ciphertext match
|
||||||
# Check keys of the three allowed lengths
|
# Check keys of the three allowed lengths
|
||||||
|
@ -15,8 +15,6 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
import iso8601
|
|
||||||
|
|
||||||
from glance.common import utils
|
from glance.common import utils
|
||||||
from glance.tests import utils as test_utils
|
from glance.tests import utils as test_utils
|
||||||
|
|
||||||
@ -46,108 +44,3 @@ class TestUtils(test_utils.BaseTestCase):
|
|||||||
def test_is_uuid_like_fails(self):
|
def test_is_uuid_like_fails(self):
|
||||||
fixture = 'pants'
|
fixture = 'pants'
|
||||||
self.assertFalse(utils.is_uuid_like(fixture))
|
self.assertFalse(utils.is_uuid_like(fixture))
|
||||||
|
|
||||||
|
|
||||||
class TestIso8601Time(test_utils.BaseTestCase):
|
|
||||||
|
|
||||||
def _instaneous(self, timestamp, yr, mon, day, hr, min, sec, micro):
|
|
||||||
self.assertEquals(timestamp.year, yr)
|
|
||||||
self.assertEquals(timestamp.month, mon)
|
|
||||||
self.assertEquals(timestamp.day, day)
|
|
||||||
self.assertEquals(timestamp.hour, hr)
|
|
||||||
self.assertEquals(timestamp.minute, min)
|
|
||||||
self.assertEquals(timestamp.second, sec)
|
|
||||||
self.assertEquals(timestamp.microsecond, micro)
|
|
||||||
|
|
||||||
def _do_test(self, str, yr, mon, day, hr, min, sec, micro, shift):
|
|
||||||
DAY_SECONDS = 24 * 60 * 60
|
|
||||||
timestamp = utils.parse_isotime(str)
|
|
||||||
self._instaneous(timestamp, yr, mon, day, hr, min, sec, micro)
|
|
||||||
offset = timestamp.tzinfo.utcoffset(None)
|
|
||||||
self.assertEqual(offset.seconds + offset.days * DAY_SECONDS, shift)
|
|
||||||
|
|
||||||
def test_zulu(self):
|
|
||||||
str = '2012-02-14T20:53:07Z'
|
|
||||||
self._do_test(str, 2012, 02, 14, 20, 53, 7, 0, 0)
|
|
||||||
|
|
||||||
def test_zulu_micros(self):
|
|
||||||
str = '2012-02-14T20:53:07.123Z'
|
|
||||||
self._do_test(str, 2012, 02, 14, 20, 53, 7, 123000, 0)
|
|
||||||
|
|
||||||
def test_offset_east(self):
|
|
||||||
str = '2012-02-14T20:53:07+04:30'
|
|
||||||
offset = 4.5 * 60 * 60
|
|
||||||
self._do_test(str, 2012, 02, 14, 20, 53, 7, 0, offset)
|
|
||||||
|
|
||||||
def test_offset_east_micros(self):
|
|
||||||
str = '2012-02-14T20:53:07.42+04:30'
|
|
||||||
offset = 4.5 * 60 * 60
|
|
||||||
self._do_test(str, 2012, 02, 14, 20, 53, 7, 420000, offset)
|
|
||||||
|
|
||||||
def test_offset_west(self):
|
|
||||||
str = '2012-02-14T20:53:07-05:30'
|
|
||||||
offset = -5.5 * 60 * 60
|
|
||||||
self._do_test(str, 2012, 02, 14, 20, 53, 7, 0, offset)
|
|
||||||
|
|
||||||
def test_offset_west_micros(self):
|
|
||||||
str = '2012-02-14T20:53:07.654321-05:30'
|
|
||||||
offset = -5.5 * 60 * 60
|
|
||||||
self._do_test(str, 2012, 02, 14, 20, 53, 7, 654321, offset)
|
|
||||||
|
|
||||||
def test_compare(self):
|
|
||||||
zulu = utils.parse_isotime('2012-02-14T20:53:07')
|
|
||||||
east = utils.parse_isotime('2012-02-14T20:53:07-01:00')
|
|
||||||
west = utils.parse_isotime('2012-02-14T20:53:07+01:00')
|
|
||||||
self.assertTrue(east > west)
|
|
||||||
self.assertTrue(east > zulu)
|
|
||||||
self.assertTrue(zulu > west)
|
|
||||||
|
|
||||||
def test_compare_micros(self):
|
|
||||||
zulu = utils.parse_isotime('2012-02-14T20:53:07.6544')
|
|
||||||
east = utils.parse_isotime('2012-02-14T19:53:07.654321-01:00')
|
|
||||||
west = utils.parse_isotime('2012-02-14T21:53:07.655+01:00')
|
|
||||||
self.assertTrue(east < west)
|
|
||||||
self.assertTrue(east < zulu)
|
|
||||||
self.assertTrue(zulu < west)
|
|
||||||
|
|
||||||
def test_zulu_roundtrip(self):
|
|
||||||
str = '2012-02-14T20:53:07Z'
|
|
||||||
zulu = utils.parse_isotime(str)
|
|
||||||
self.assertEquals(zulu.tzinfo, iso8601.iso8601.UTC)
|
|
||||||
self.assertEquals(utils.isotime(zulu), str)
|
|
||||||
|
|
||||||
def test_east_roundtrip(self):
|
|
||||||
str = '2012-02-14T20:53:07-07:00'
|
|
||||||
east = utils.parse_isotime(str)
|
|
||||||
self.assertEquals(east.tzinfo.tzname(None), '-07:00')
|
|
||||||
self.assertEquals(utils.isotime(east), str)
|
|
||||||
|
|
||||||
def test_west_roundtrip(self):
|
|
||||||
str = '2012-02-14T20:53:07+11:30'
|
|
||||||
west = utils.parse_isotime(str)
|
|
||||||
self.assertEquals(west.tzinfo.tzname(None), '+11:30')
|
|
||||||
self.assertEquals(utils.isotime(west), str)
|
|
||||||
|
|
||||||
def test_now_roundtrip(self):
|
|
||||||
str = utils.isotime()
|
|
||||||
now = utils.parse_isotime(str)
|
|
||||||
self.assertEquals(now.tzinfo, iso8601.iso8601.UTC)
|
|
||||||
self.assertEquals(utils.isotime(now), str)
|
|
||||||
|
|
||||||
def test_zulu_normalize(self):
|
|
||||||
str = '2012-02-14T20:53:07Z'
|
|
||||||
zulu = utils.parse_isotime(str)
|
|
||||||
normed = utils.normalize_time(zulu)
|
|
||||||
self._instaneous(normed, 2012, 2, 14, 20, 53, 07, 0)
|
|
||||||
|
|
||||||
def test_east_normalize(self):
|
|
||||||
str = '2012-02-14T20:53:07-07:00'
|
|
||||||
east = utils.parse_isotime(str)
|
|
||||||
normed = utils.normalize_time(east)
|
|
||||||
self._instaneous(normed, 2012, 2, 15, 03, 53, 07, 0)
|
|
||||||
|
|
||||||
def test_west_normalize(self):
|
|
||||||
str = '2012-02-14T20:53:07+21:00'
|
|
||||||
west = utils.parse_isotime(str)
|
|
||||||
normed = utils.normalize_time(west)
|
|
||||||
self._instaneous(normed, 2012, 2, 13, 23, 53, 07, 0)
|
|
||||||
|
@ -28,6 +28,7 @@ from glance.api.v1 import images
|
|||||||
from glance.api.v1 import router
|
from glance.api.v1 import router
|
||||||
from glance.common import context
|
from glance.common import context
|
||||||
from glance.common import utils
|
from glance.common import utils
|
||||||
|
from glance.openstack.common import timeutils
|
||||||
from glance.registry.api import v1 as rserver
|
from glance.registry.api import v1 as rserver
|
||||||
from glance.db import api as db_api
|
from glance.db import api as db_api
|
||||||
from glance.db import models as db_models
|
from glance.db import models as db_models
|
||||||
@ -100,8 +101,8 @@ class TestRegistryAPI(base.IsolatedUnitTest):
|
|||||||
'disk_format': 'ami',
|
'disk_format': 'ami',
|
||||||
'container_format': 'ami',
|
'container_format': 'ami',
|
||||||
'is_public': False,
|
'is_public': False,
|
||||||
'created_at': datetime.datetime.utcnow(),
|
'created_at': timeutils.utcnow(),
|
||||||
'updated_at': datetime.datetime.utcnow(),
|
'updated_at': timeutils.utcnow(),
|
||||||
'deleted_at': None,
|
'deleted_at': None,
|
||||||
'deleted': False,
|
'deleted': False,
|
||||||
'checksum': None,
|
'checksum': None,
|
||||||
@ -116,8 +117,8 @@ class TestRegistryAPI(base.IsolatedUnitTest):
|
|||||||
'disk_format': 'vhd',
|
'disk_format': 'vhd',
|
||||||
'container_format': 'ovf',
|
'container_format': 'ovf',
|
||||||
'is_public': True,
|
'is_public': True,
|
||||||
'created_at': datetime.datetime.utcnow(),
|
'created_at': timeutils.utcnow(),
|
||||||
'updated_at': datetime.datetime.utcnow(),
|
'updated_at': timeutils.utcnow(),
|
||||||
'deleted_at': None,
|
'deleted_at': None,
|
||||||
'deleted': False,
|
'deleted': False,
|
||||||
'checksum': None,
|
'checksum': None,
|
||||||
@ -231,9 +232,9 @@ class TestRegistryAPI(base.IsolatedUnitTest):
|
|||||||
Tests that the /images registry API returns list of
|
Tests that the /images registry API returns list of
|
||||||
public images that conforms to a marker query param
|
public images that conforms to a marker query param
|
||||||
"""
|
"""
|
||||||
time1 = datetime.datetime.utcnow() + datetime.timedelta(seconds=5)
|
time1 = timeutils.utcnow() + datetime.timedelta(seconds=5)
|
||||||
time2 = datetime.datetime.utcnow() + datetime.timedelta(seconds=4)
|
time2 = timeutils.utcnow() + datetime.timedelta(seconds=4)
|
||||||
time3 = datetime.datetime.utcnow()
|
time3 = timeutils.utcnow()
|
||||||
|
|
||||||
UUID3 = _gen_uuid()
|
UUID3 = _gen_uuid()
|
||||||
extra_fixture = {'id': UUID3,
|
extra_fixture = {'id': UUID3,
|
||||||
@ -451,9 +452,9 @@ class TestRegistryAPI(base.IsolatedUnitTest):
|
|||||||
Tests that the /images registry API returns list of
|
Tests that the /images registry API returns list of
|
||||||
public images that conforms to a default sort key/dir
|
public images that conforms to a default sort key/dir
|
||||||
"""
|
"""
|
||||||
time1 = datetime.datetime.utcnow() + datetime.timedelta(seconds=5)
|
time1 = timeutils.utcnow() + datetime.timedelta(seconds=5)
|
||||||
time2 = datetime.datetime.utcnow() + datetime.timedelta(seconds=4)
|
time2 = timeutils.utcnow() + datetime.timedelta(seconds=4)
|
||||||
time3 = datetime.datetime.utcnow()
|
time3 = timeutils.utcnow()
|
||||||
|
|
||||||
UUID3 = _gen_uuid()
|
UUID3 = _gen_uuid()
|
||||||
extra_fixture = {'id': UUID3,
|
extra_fixture = {'id': UUID3,
|
||||||
@ -729,7 +730,7 @@ class TestRegistryAPI(base.IsolatedUnitTest):
|
|||||||
Tests that the /images registry API returns list of
|
Tests that the /images registry API returns list of
|
||||||
public images sorted by created_at in ascending order.
|
public images sorted by created_at in ascending order.
|
||||||
"""
|
"""
|
||||||
now = datetime.datetime.utcnow()
|
now = timeutils.utcnow()
|
||||||
time1 = now + datetime.timedelta(seconds=5)
|
time1 = now + datetime.timedelta(seconds=5)
|
||||||
time2 = now
|
time2 = now
|
||||||
|
|
||||||
@ -775,7 +776,7 @@ class TestRegistryAPI(base.IsolatedUnitTest):
|
|||||||
Tests that the /images registry API returns list of
|
Tests that the /images registry API returns list of
|
||||||
public images sorted by updated_at in descending order.
|
public images sorted by updated_at in descending order.
|
||||||
"""
|
"""
|
||||||
now = datetime.datetime.utcnow()
|
now = timeutils.utcnow()
|
||||||
time1 = now + datetime.timedelta(seconds=5)
|
time1 = now + datetime.timedelta(seconds=5)
|
||||||
time2 = now
|
time2 = now
|
||||||
|
|
||||||
@ -1257,18 +1258,18 @@ class TestRegistryAPI(base.IsolatedUnitTest):
|
|||||||
Tests that the /images/detail registry API returns list of
|
Tests that the /images/detail registry API returns list of
|
||||||
public images that have a size less than or equal to size_max
|
public images that have a size less than or equal to size_max
|
||||||
"""
|
"""
|
||||||
dt1 = datetime.datetime.utcnow() - datetime.timedelta(1)
|
dt1 = timeutils.utcnow() - datetime.timedelta(1)
|
||||||
iso1 = utils.isotime(dt1)
|
iso1 = timeutils.isotime(dt1)
|
||||||
|
|
||||||
dt2 = datetime.datetime.utcnow() + datetime.timedelta(1)
|
dt2 = timeutils.utcnow() + datetime.timedelta(1)
|
||||||
iso2 = utils.isotime(dt2)
|
iso2 = timeutils.isotime(dt2)
|
||||||
|
|
||||||
image_ts = datetime.datetime.utcnow() + datetime.timedelta(2)
|
image_ts = timeutils.utcnow() + datetime.timedelta(2)
|
||||||
hour_before = image_ts.strftime('%Y-%m-%dT%H:%M:%S%%2B01:00')
|
hour_before = image_ts.strftime('%Y-%m-%dT%H:%M:%S%%2B01:00')
|
||||||
hour_after = image_ts.strftime('%Y-%m-%dT%H:%M:%S-01:00')
|
hour_after = image_ts.strftime('%Y-%m-%dT%H:%M:%S-01:00')
|
||||||
|
|
||||||
dt4 = datetime.datetime.utcnow() + datetime.timedelta(3)
|
dt4 = timeutils.utcnow() + datetime.timedelta(3)
|
||||||
iso4 = utils.isotime(dt4)
|
iso4 = timeutils.isotime(dt4)
|
||||||
|
|
||||||
UUID3 = _gen_uuid()
|
UUID3 = _gen_uuid()
|
||||||
extra_fixture = {'id': UUID3,
|
extra_fixture = {'id': UUID3,
|
||||||
@ -1969,8 +1970,8 @@ class TestGlanceAPI(base.IsolatedUnitTest):
|
|||||||
'disk_format': 'ami',
|
'disk_format': 'ami',
|
||||||
'container_format': 'ami',
|
'container_format': 'ami',
|
||||||
'is_public': False,
|
'is_public': False,
|
||||||
'created_at': datetime.datetime.utcnow(),
|
'created_at': timeutils.utcnow(),
|
||||||
'updated_at': datetime.datetime.utcnow(),
|
'updated_at': timeutils.utcnow(),
|
||||||
'deleted_at': None,
|
'deleted_at': None,
|
||||||
'deleted': False,
|
'deleted': False,
|
||||||
'checksum': None,
|
'checksum': None,
|
||||||
@ -1983,8 +1984,8 @@ class TestGlanceAPI(base.IsolatedUnitTest):
|
|||||||
'disk_format': 'vhd',
|
'disk_format': 'vhd',
|
||||||
'container_format': 'ovf',
|
'container_format': 'ovf',
|
||||||
'is_public': True,
|
'is_public': True,
|
||||||
'created_at': datetime.datetime.utcnow(),
|
'created_at': timeutils.utcnow(),
|
||||||
'updated_at': datetime.datetime.utcnow(),
|
'updated_at': timeutils.utcnow(),
|
||||||
'deleted_at': None,
|
'deleted_at': None,
|
||||||
'deleted': False,
|
'deleted': False,
|
||||||
'checksum': None,
|
'checksum': None,
|
||||||
@ -2519,18 +2520,18 @@ class TestGlanceAPI(base.IsolatedUnitTest):
|
|||||||
Tests that the /images/detail registry API returns list of
|
Tests that the /images/detail registry API returns list of
|
||||||
public images that have a size less than or equal to size_max
|
public images that have a size less than or equal to size_max
|
||||||
"""
|
"""
|
||||||
dt1 = datetime.datetime.utcnow() - datetime.timedelta(1)
|
dt1 = timeutils.utcnow() - datetime.timedelta(1)
|
||||||
iso1 = utils.isotime(dt1)
|
iso1 = timeutils.isotime(dt1)
|
||||||
|
|
||||||
dt2 = datetime.datetime.utcnow() + datetime.timedelta(1)
|
dt2 = timeutils.utcnow() + datetime.timedelta(1)
|
||||||
iso2 = utils.isotime(dt2)
|
iso2 = timeutils.isotime(dt2)
|
||||||
|
|
||||||
image_ts = datetime.datetime.utcnow() + datetime.timedelta(2)
|
image_ts = timeutils.utcnow() + datetime.timedelta(2)
|
||||||
hour_before = image_ts.strftime('%Y-%m-%dT%H:%M:%S%%2B01:00')
|
hour_before = image_ts.strftime('%Y-%m-%dT%H:%M:%S%%2B01:00')
|
||||||
hour_after = image_ts.strftime('%Y-%m-%dT%H:%M:%S-01:00')
|
hour_after = image_ts.strftime('%Y-%m-%dT%H:%M:%S-01:00')
|
||||||
|
|
||||||
dt4 = datetime.datetime.utcnow() + datetime.timedelta(3)
|
dt4 = timeutils.utcnow() + datetime.timedelta(3)
|
||||||
iso4 = utils.isotime(dt4)
|
iso4 = timeutils.isotime(dt4)
|
||||||
|
|
||||||
UUID3 = _gen_uuid()
|
UUID3 = _gen_uuid()
|
||||||
extra_fixture = {'id': UUID3,
|
extra_fixture = {'id': UUID3,
|
||||||
@ -3011,8 +3012,8 @@ class TestImageSerializer(base.IsolatedUnitTest):
|
|||||||
'disk_format': 'vhd',
|
'disk_format': 'vhd',
|
||||||
'container_format': 'ovf',
|
'container_format': 'ovf',
|
||||||
'is_public': True,
|
'is_public': True,
|
||||||
'created_at': datetime.datetime.utcnow(),
|
'created_at': timeutils.utcnow(),
|
||||||
'updated_at': datetime.datetime.utcnow(),
|
'updated_at': timeutils.utcnow(),
|
||||||
'deleted_at': None,
|
'deleted_at': None,
|
||||||
'deleted': False,
|
'deleted': False,
|
||||||
'checksum': None,
|
'checksum': None,
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
[DEFAULT]
|
[DEFAULT]
|
||||||
|
|
||||||
# The list of modules to copy from openstack-common
|
# The list of modules to copy from openstack-common
|
||||||
modules=cfg,importutils,iniparser,setup
|
modules=cfg,importutils,iniparser,setup,timeutils
|
||||||
|
|
||||||
# The base module to hold the copy of openstack.common
|
# The base module to hold the copy of openstack.common
|
||||||
base=glance
|
base=glance
|
||||||
|
Loading…
Reference in New Issue
Block a user