summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Washenberger <mark.washenberger@rackspace.com>2011-03-18 16:06:43 -0400
committerMark Washenberger <mark.washenberger@rackspace.com>2011-03-18 16:06:43 -0400
commit2f4c1802c7e482a447d348f049ff429b3d1a640c (patch)
treef3ee3c8443ab287d4cb14037247af8ddefe08c07
parent2f1a1d293915cde6e15c85e0bb43fb21ae26f7b0 (diff)
fix date formatting in images controller show
-rw-r--r--nova/api/openstack/images.py6
-rw-r--r--nova/tests/api/openstack/fakes.py20
-rw-r--r--nova/tests/api/openstack/test_images.py46
3 files changed, 43 insertions, 29 deletions
diff --git a/nova/api/openstack/images.py b/nova/api/openstack/images.py
index 98f0dd96b..94e05823e 100644
--- a/nova/api/openstack/images.py
+++ b/nova/api/openstack/images.py
@@ -143,6 +143,7 @@ class Controller(wsgi.Controller):
image = self._service.show(req.environ['nova.context'], image_id)
_convert_image_id_to_hash(image)
+ self._format_image_dates(image)
return dict(image=image)
def delete(self, req, id):
@@ -164,3 +165,8 @@ class Controller(wsgi.Controller):
# Users may not modify public images, and that's all that
# we support for now.
raise faults.Fault(exc.HTTPNotFound())
+
+ def _format_image_dates(self, image):
+ for attr in ['created_at', 'updated_at', 'deleted_at']:
+ if image[attr] is not None:
+ image[attr] = image[attr].strftime('%Y-%m-%dT%H:%M:%SZ')
diff --git a/nova/tests/api/openstack/fakes.py b/nova/tests/api/openstack/fakes.py
index 15f8a5b56..9573cf128 100644
--- a/nova/tests/api/openstack/fakes.py
+++ b/nova/tests/api/openstack/fakes.py
@@ -15,6 +15,7 @@
# License for the specific language governing permissions and limitations
# under the License.
+import copy
import datetime
import json
import random
@@ -151,22 +152,23 @@ def stub_out_glance(stubs, initial_fixtures=None):
for f in self.fixtures]
def fake_get_images_detailed(self):
- return self.fixtures
+ return copy.deepcopy(self.fixtures)
def fake_get_image_meta(self, image_id):
- for f in self.fixtures:
- if f['id'] == image_id:
- return f
+ image = self._find_image(image_id)
+ if image:
+ return copy.deepcopy(image)
raise glance_exc.NotFound
def fake_add_image(self, image_meta, data=None):
+ image_meta = copy.deepcopy(image_meta)
id = ''.join(random.choice(string.letters) for _ in range(20))
image_meta['id'] = id
self.fixtures.append(image_meta)
return image_meta
def fake_update_image(self, image_id, image_meta, data=None):
- f = self.fake_get_image_meta(image_id)
+ f = self._find_image(image_id)
if not f:
raise glance_exc.NotFound
@@ -174,7 +176,7 @@ def stub_out_glance(stubs, initial_fixtures=None):
return f
def fake_delete_image(self, image_id):
- f = self.fake_get_image_meta(image_id)
+ f = self._find_image(image_id)
if not f:
raise glance_exc.NotFound
@@ -183,6 +185,12 @@ def stub_out_glance(stubs, initial_fixtures=None):
##def fake_delete_all(self):
## self.fixtures = []
+ def _find_image(self, image_id):
+ for f in self.fixtures:
+ if f['id'] == image_id:
+ return f
+ return None
+
GlanceClient = glance_client.Client
fake = FakeGlanceClient(initial_fixtures)
diff --git a/nova/tests/api/openstack/test_images.py b/nova/tests/api/openstack/test_images.py
index 47dd11e5b..b771966f1 100644
--- a/nova/tests/api/openstack/test_images.py
+++ b/nova/tests/api/openstack/test_images.py
@@ -21,7 +21,7 @@ and as a WSGI layer
"""
import json
-import datetime
+import datetime as dt
import shutil
import tempfile
@@ -177,13 +177,13 @@ class ImageControllerWithGlanceServiceTest(test.TestCase):
"""Test of the OpenStack API /images application controller"""
# Registered images at start of each test.
-
+ now = dt.datetime.utcnow()
IMAGE_FIXTURES = [
{'id': '23g2ogk23k4hhkk4k42l',
'imageId': '23g2ogk23k4hhkk4k42l',
'name': 'public image #1',
- 'created_at': datetime.datetime.utcnow().isoformat(),
- 'updated_at': datetime.datetime.utcnow().isoformat(),
+ 'created_at': now.isoformat(),
+ 'updated_at': now.isoformat(),
'deleted_at': None,
'deleted': False,
'is_public': True,
@@ -192,8 +192,8 @@ class ImageControllerWithGlanceServiceTest(test.TestCase):
{'id': 'slkduhfas73kkaskgdas',
'imageId': 'slkduhfas73kkaskgdas',
'name': 'public image #2',
- 'created_at': datetime.datetime.utcnow().isoformat(),
- 'updated_at': datetime.datetime.utcnow().isoformat(),
+ 'created_at': now.isoformat(),
+ 'updated_at': now.isoformat(),
'deleted_at': None,
'deleted': False,
'is_public': True,
@@ -235,20 +235,20 @@ class ImageControllerWithGlanceServiceTest(test.TestCase):
res = req.get_response(fakes.wsgi_app())
res_dict = json.loads(res.body)
- def _is_equivalent_subset(x, y):
- if set(x) <= set(y):
- for k, v in x.iteritems():
- if x[k] != y[k]:
- if x[k] == 'active' and y[k] == 'available':
- continue
- return False
- return True
- return False
-
- for image in res_dict['images']:
- for image_fixture in self.IMAGE_FIXTURES:
- if _is_equivalent_subset(image, image_fixture):
- break
- else:
- self.assertEquals(1, 2, "image %s not in fixtures!" %
- str(image))
+ for image in self.IMAGE_FIXTURES:
+ expected = {
+ 'id': abs(hash(image['imageId'])),
+ 'name': image['name'],
+ 'status': 'active',
+ }
+ self.assertTrue(expected in res_dict['images'])
+
+ def test_show_image(self):
+ expected = self.IMAGE_FIXTURES[0]
+ id = abs(hash(expected['id']))
+ expected_time = self.now.strftime('%Y-%m-%dT%H:%M:%SZ')
+ req = webob.Request.blank('/v1.0/images/%s' % id)
+ res = req.get_response(fakes.wsgi_app())
+ actual = json.loads(res.body)['image']
+ self.assertEqual(expected_time, actual['created_at'])
+ self.assertEqual(expected_time, actual['updated_at'])