summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Lamar <brian.lamar@rackspace.com>2011-03-28 13:04:02 -0400
committerBrian Lamar <brian.lamar@rackspace.com>2011-03-28 13:04:02 -0400
commit23bed216dbbd512e733ecf6065105b2d20703531 (patch)
tree9f4f4ae7b259f64ea8108f07897bf3a7369dddf4
parent4aad5721bff628ef8b34e0c536e0e2415f2b63f4 (diff)
downloadnova-23bed216dbbd512e733ecf6065105b2d20703531.tar.gz
nova-23bed216dbbd512e733ecf6065105b2d20703531.tar.xz
nova-23bed216dbbd512e733ecf6065105b2d20703531.zip
Added MUCH more flexiable iso8601 parser dep for added stability.
-rw-r--r--nova/image/glance.py8
-rw-r--r--nova/tests/api/openstack/test_images.py69
-rw-r--r--nova/tests/image/test_glance.py50
-rw-r--r--tools/pip-requires1
4 files changed, 54 insertions, 74 deletions
diff --git a/nova/image/glance.py b/nova/image/glance.py
index f0f1ecf57..c08e2e0e8 100644
--- a/nova/image/glance.py
+++ b/nova/image/glance.py
@@ -20,6 +20,8 @@ from __future__ import absolute_import
import datetime
+import iso8601
+
from glance.common import exception as glance_exception
from nova import exception
@@ -230,8 +232,4 @@ def _parse_glance_iso8601_timestamp(timestamp):
"""
Parse a subset of iso8601 timestamps into datetime objects
"""
- GLANCE_FMT = "%Y-%m-%dT%H:%M:%S"
- ISO_FMT = "%Y-%m-%dT%H:%M:%S.%f"
- # FIXME(sirp): Glance is not returning in ISO format, we should fix Glance
- # to do so, and then switch to parsing it here
- return datetime.datetime.strptime(timestamp, GLANCE_FMT)
+ return iso8601.parse_date(timestamp).replace(tzinfo=None)
diff --git a/nova/tests/api/openstack/test_images.py b/nova/tests/api/openstack/test_images.py
index 88dd8f506..1cdccadd6 100644
--- a/nova/tests/api/openstack/test_images.py
+++ b/nova/tests/api/openstack/test_images.py
@@ -197,73 +197,6 @@ class GlanceImageServiceTest(test.TestCase,
image_metas = self.service.detail(self.context)
self.assertDictMatch(image_metas[0], expected)
- def test_image_valid_date_format(self):
- """
- Ensure 'created_at', 'updated_at', and 'deleted_at' can be valid
- ISO strings.
- """
- fixture = {
- 'name': 'test image',
- 'is_public': False,
- 'properties': {
- 'instance_id': '42',
- 'user_id': '1',
- },
- }
-
- valid_dates = ['2010-10-11T10:30:22', '2012-12-21T00:00:00']
-
- for date in valid_dates:
- fixture["created_at"] = date
- fixture["updated_at"] = date
- fixture["deleted_at"] = date
- image_id = self.service.create(self.context, fixture)['id']
- self.assertDictMatch(self.sent_to_glance['metadata'], fixture)
-
- def test_image_invalid_date_format(self):
- """
- Ensure `created_at`, `modified_at` can't be invalid dates.
- """
- fixture = {
- 'name': 'test image',
- 'is_public': False,
- 'properties': {
- 'instance_id': '42',
- 'user_id': '1',
- },
- }
-
- invalid_dates = ['Not a date.', 4]
-
- for date in invalid_dates:
- fixture["created_at"] = date
- fixture["updated_at"] = date
- fixture["deleted_at"] = date
- self.assertRaises((TypeError, ValueError), self.service.create,
- self.context, fixture)
-
- def test_image_blank_date_format(self):
- """
- Ensure `created_at`, `modified_at` can be blank dates.
- """
- fixture = {
- 'name': 'test image',
- 'is_public': False,
- 'properties': {
- 'instance_id': '42',
- 'user_id': '1',
- },
- }
-
- blank_dates = [None, '']
-
- for date in blank_dates:
- fixture["created_at"] = date
- fixture["updated_at"] = date
- fixture["deleted_at"] = date
- image_id = self.service.create(self.context, fixture)['id']
- self.assertDictMatch(self.sent_to_glance['metadata'], fixture)
-
def test_create_without_instance_id(self):
"""
Ensure we can create an image without having to specify an
@@ -302,8 +235,6 @@ class ImageControllerWithGlanceServiceTest(test.TestCase):
FLAGS.image_service = self.orig_image_service
super(ImageControllerWithGlanceServiceTest, self).tearDown()
-
-
def test_get_image_index(self):
req = webob.Request.blank('/v1.0/images')
res = req.get_response(fakes.wsgi_app())
diff --git a/nova/tests/image/test_glance.py b/nova/tests/image/test_glance.py
index d03aa9cc8..dfdce7584 100644
--- a/nova/tests/image/test_glance.py
+++ b/nova/tests/image/test_glance.py
@@ -57,6 +57,7 @@ class NullWriter(object):
class BaseGlanceTest(unittest.TestCase):
NOW_GLANCE_FORMAT = "2010-10-11T10:30:22"
NOW_DATETIME = datetime.datetime(2010, 10, 11, 10, 30, 22)
+ NOW_ISO_FORMAT = "2010-10-11T10:30:22.000000"
def setUp(self):
# FIXME(sirp): we can probably use stubs library here rather than
@@ -74,6 +75,10 @@ class BaseGlanceTest(unittest.TestCase):
self.assertEqual(image_meta['updated_at'], None)
self.assertEqual(image_meta['deleted_at'], None)
+ def assertDateTimesBlank(self, image_meta):
+ self.assertEqual(image_meta['updated_at'], '')
+ self.assertEqual(image_meta['deleted_at'], '')
+
class TestGlanceImageServiceProperties(BaseGlanceTest):
def test_show_passes_through_to_client(self):
@@ -108,33 +113,65 @@ class TestGetterDateTimeNoneTests(BaseGlanceTest):
image_meta = self.service.show(self.context, 'image1')
self.assertDateTimesEmpty(image_meta)
+ def test_show_handles_blank_datetimes(self):
+ self.client.images = self._make_blank_datetime_fixtures()
+ image_meta = self.service.show(self.context, 'image1')
+ self.assertDateTimesBlank(image_meta)
+
def test_detail_handles_none_datetimes(self):
self.client.images = self._make_none_datetime_fixtures()
image_meta = self.service.detail(self.context)[0]
self.assertDateTimesEmpty(image_meta)
+ def test_detail_handles_blank_datetimes(self):
+ self.client.images = self._make_blank_datetime_fixtures()
+ image_meta = self.service.detail(self.context)[0]
+ self.assertDateTimesBlank(image_meta)
+
def test_get_handles_none_datetimes(self):
self.client.images = self._make_none_datetime_fixtures()
writer = NullWriter()
image_meta = self.service.get(self.context, 'image1', writer)
self.assertDateTimesEmpty(image_meta)
+ def test_get_handles_blank_datetimes(self):
+ self.client.images = self._make_blank_datetime_fixtures()
+ writer = NullWriter()
+ image_meta = self.service.get(self.context, 'image1', writer)
+ self.assertDateTimesBlank(image_meta)
+
def test_show_makes_datetimes(self):
self.client.images = self._make_datetime_fixtures()
image_meta = self.service.show(self.context, 'image1')
self.assertDateTimesFilled(image_meta)
+ def test_show_makes_datetimes_iso(self):
+ self.client.images = self._make_iso_fixtures()
+ image_meta = self.service.show(self.context, 'image1')
+ self.assertDateTimesFilled(image_meta)
+
def test_detail_makes_datetimes(self):
self.client.images = self._make_datetime_fixtures()
image_meta = self.service.detail(self.context)[0]
self.assertDateTimesFilled(image_meta)
+ def test_detail_makes_datetimes_iso(self):
+ self.client.images = self._make_iso_fixtures()
+ image_meta = self.service.detail(self.context)[0]
+ self.assertDateTimesFilled(image_meta)
+
def test_get_makes_datetimes(self):
self.client.images = self._make_datetime_fixtures()
writer = NullWriter()
image_meta = self.service.get(self.context, 'image1', writer)
self.assertDateTimesFilled(image_meta)
+ def test_get_makes_datetimes_iso(self):
+ self.client.images = self._make_iso_fixtures()
+ writer = NullWriter()
+ image_meta = self.service.get(self.context, 'image1', writer)
+ self.assertDateTimesFilled(image_meta)
+
def _make_datetime_fixtures(self):
fixtures = {'image1': {'name': 'image1', 'is_public': True,
'created_at': self.NOW_GLANCE_FORMAT,
@@ -142,12 +179,25 @@ class TestGetterDateTimeNoneTests(BaseGlanceTest):
'deleted_at': self.NOW_GLANCE_FORMAT}}
return fixtures
+ def _make_iso_fixtures(self):
+ fixtures = {'image1': {'name': 'image1', 'is_public': True,
+ 'created_at': self.NOW_ISO_FORMAT,
+ 'updated_at': self.NOW_ISO_FORMAT,
+ 'deleted_at': self.NOW_ISO_FORMAT}}
+ return fixtures
+
def _make_none_datetime_fixtures(self):
fixtures = {'image1': {'name': 'image1', 'is_public': True,
'updated_at': None,
'deleted_at': None}}
return fixtures
+ def _make_blank_datetime_fixtures(self):
+ fixtures = {'image1': {'name': 'image1', 'is_public': True,
+ 'updated_at': '',
+ 'deleted_at': ''}}
+ return fixtures
+
class TestMutatorDateTimeTests(BaseGlanceTest):
"""Tests create(), update()"""
diff --git a/tools/pip-requires b/tools/pip-requires
index 4ab9644d8..5cd80d1f4 100644
--- a/tools/pip-requires
+++ b/tools/pip-requires
@@ -31,3 +31,4 @@ netaddr
sphinx
glance
suds==0.4
+iso8601