diff options
author | Jenkins <jenkins@review.openstack.org> | 2013-12-06 18:54:29 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2013-12-06 18:54:29 +0000 |
commit | 049cddda6716091fdcad190ca7a84fb938e61dbf (patch) | |
tree | 8e28964f80241292b7323cfe7729898b5b8621e1 | |
parent | 488bfca4de32ebc9b3c32fb0d47603e3eab26f2d (diff) | |
parent | eb941dc7bec4da1551912118d8ae9aa63d481abd (diff) | |
download | ironic-049cddda6716091fdcad190ca7a84fb938e61dbf.tar.gz |
Merge "Expose created_at/updated_at properties in the REST API"2014.1.b1
-rw-r--r-- | ironic/api/controllers/v1/base.py | 8 | ||||
-rw-r--r-- | ironic/tests/api/test_chassis.py | 19 | ||||
-rw-r--r-- | ironic/tests/api/test_nodes.py | 17 | ||||
-rw-r--r-- | ironic/tests/api/test_ports.py | 16 |
4 files changed, 57 insertions, 3 deletions
diff --git a/ironic/api/controllers/v1/base.py b/ironic/api/controllers/v1/base.py index f1215a864..2d253e277 100644 --- a/ironic/api/controllers/v1/base.py +++ b/ironic/api/controllers/v1/base.py @@ -14,12 +14,20 @@ # License for the specific language governing permissions and limitations # under the License. +import datetime + import wsme from wsme import types as wtypes class APIBase(wtypes.Base): + created_at = datetime.datetime + "The time in UTC at which the object is created" + + updated_at = datetime.datetime + "The time in UTC at which the object is updated" + def as_dict(self): """Render this object as a dict of its fields.""" return dict((k, getattr(self, k)) diff --git a/ironic/tests/api/test_chassis.py b/ironic/tests/api/test_chassis.py index 4fc50d77e..858594e80 100644 --- a/ironic/tests/api/test_chassis.py +++ b/ironic/tests/api/test_chassis.py @@ -16,9 +16,12 @@ Tests for the API /chassis/ methods. """ +import datetime + import webtest.app from ironic.common import utils +from ironic.openstack.common import timeutils from ironic.tests.api import base from ironic.tests.db import utils as dbutils @@ -136,6 +139,7 @@ class TestPatch(base.FunctionalTest): super(TestPatch, self).setUp() cdict = dbutils.get_test_chassis() self.post_json('/chassis', cdict) + self.addCleanup(timeutils.clear_time_override) def test_update_not_found(self): uuid = utils.generate_uuid() @@ -150,6 +154,8 @@ class TestPatch(base.FunctionalTest): def test_replace_singular(self): cdict = dbutils.get_test_chassis() description = 'chassis-new-description' + t1 = datetime.datetime(2000, 1, 1, 0, 0) + timeutils.set_time_override(t1) response = self.patch_json('/chassis/%s' % cdict['uuid'], [{'path': '/description', 'value': description, 'op': 'replace'}]) @@ -157,6 +163,9 @@ class TestPatch(base.FunctionalTest): self.assertEqual(response.status_code, 200) result = self.get_json('/chassis/%s' % cdict['uuid']) self.assertEqual(result['description'], description) + return_updated_at = timeutils.parse_isotime( + result['updated_at']).replace(tzinfo=None) + self.assertEqual(t1, return_updated_at) def test_replace_multi(self): extra = {"foo1": "bar1", "foo2": "bar2", "foo3": "bar3"} @@ -255,11 +264,21 @@ class TestPatch(base.FunctionalTest): class TestPost(base.FunctionalTest): + def setUp(self): + super(TestPost, self).setUp() + self.addCleanup(timeutils.clear_time_override) + def test_create_chassis(self): cdict = dbutils.get_test_chassis() + t1 = datetime.datetime(2000, 1, 1, 0, 0) + timeutils.set_time_override(t1) self.post_json('/chassis', cdict) result = self.get_json('/chassis/%s' % cdict['uuid']) self.assertEqual(cdict['uuid'], result['uuid']) + self.assertFalse(result['updated_at']) + return_created_at = timeutils.parse_isotime( + result['created_at']).replace(tzinfo=None) + self.assertEqual(t1, return_created_at) def test_create_chassis_generate_uuid(self): cdict = dbutils.get_test_chassis() diff --git a/ironic/tests/api/test_nodes.py b/ironic/tests/api/test_nodes.py index ea8e18a54..c2809887c 100644 --- a/ironic/tests/api/test_nodes.py +++ b/ironic/tests/api/test_nodes.py @@ -16,6 +16,8 @@ Tests for the API /nodes/ methods. """ +import datetime + import mock from testtools.matchers import HasLength import webtest.app @@ -25,7 +27,7 @@ from ironic.common import states from ironic.common import utils from ironic.conductor import rpcapi from ironic import objects - +from ironic.openstack.common import timeutils from ironic.tests.api import base from ironic.tests.db import utils as dbutils @@ -323,14 +325,16 @@ class TestPatch(base.FunctionalTest): def test_update_ok(self): self.mock_update_node.return_value = self.node - + self.mock_update_node.return_value.updated_at = \ + "2013-12-03T06:20:41.184720+00:00" response = self.patch_json('/nodes/%s' % self.node['uuid'], [{'path': '/instance_uuid', 'value': 'fake instance uuid', 'op': 'replace'}]) self.assertEqual(response.content_type, 'application/json') self.assertEqual(response.status_code, 200) - + self.assertEqual(self.mock_update_node.return_value.updated_at, + timeutils.parse_isotime(response.json['updated_at'])) self.mock_update_node.assert_called_once_with(mock.ANY, mock.ANY) def test_update_state(self): @@ -436,12 +440,19 @@ class TestPost(base.FunctionalTest): super(TestPost, self).setUp() cdict = dbutils.get_test_chassis() self.chassis = self.dbapi.create_chassis(cdict) + self.addCleanup(timeutils.clear_time_override) def test_create_node(self): ndict = dbutils.get_test_node() + t1 = datetime.datetime(2000, 1, 1, 0, 0) + timeutils.set_time_override(t1) self.post_json('/nodes', ndict) result = self.get_json('/nodes/%s' % ndict['uuid']) self.assertEqual(ndict['uuid'], result['uuid']) + self.assertFalse(result['updated_at']) + return_created_at = timeutils.parse_isotime( + result['created_at']).replace(tzinfo=None) + self.assertEqual(t1, return_created_at) def test_create_node_valid_extra(self): ndict = dbutils.get_test_node(extra={'foo': 123}) diff --git a/ironic/tests/api/test_ports.py b/ironic/tests/api/test_ports.py index 8dac1a722..a24605cfb 100644 --- a/ironic/tests/api/test_ports.py +++ b/ironic/tests/api/test_ports.py @@ -16,9 +16,12 @@ Tests for the API /ports/ methods. """ +import datetime + import webtest.app from ironic.common import utils +from ironic.openstack.common import timeutils from ironic.tests.api import base from ironic.tests.db import utils as dbutils @@ -119,9 +122,12 @@ class TestPatch(base.FunctionalTest): self.node = self.dbapi.create_node(ndict) self.pdict = post_get_test_port() self.post_json('/ports', self.pdict) + self.addCleanup(timeutils.clear_time_override) def test_update_byid(self): extra = {'foo': 'bar'} + t1 = datetime.datetime(2000, 1, 1, 0, 0) + timeutils.set_time_override(t1) response = self.patch_json('/ports/%s' % self.pdict['uuid'], [{'path': '/extra/foo', 'value': 'bar', @@ -130,6 +136,9 @@ class TestPatch(base.FunctionalTest): self.assertEqual(response.status_code, 200) result = self.get_json('/ports/%s' % self.pdict['uuid']) self.assertEqual(result['extra'], extra) + return_updated_at = timeutils.parse_isotime( + result['updated_at']).replace(tzinfo=None) + self.assertEqual(t1, return_updated_at) def test_update_byaddress(self): extra = {'foo': 'bar'} @@ -287,12 +296,19 @@ class TestPost(base.FunctionalTest): super(TestPost, self).setUp() ndict = dbutils.get_test_node() self.node = self.dbapi.create_node(ndict) + self.addCleanup(timeutils.clear_time_override) def test_create_port(self): pdict = post_get_test_port() + t1 = datetime.datetime(2000, 1, 1, 0, 0) + timeutils.set_time_override(t1) self.post_json('/ports', pdict) result = self.get_json('/ports/%s' % pdict['uuid']) self.assertEqual(pdict['uuid'], result['uuid']) + self.assertFalse(result['updated_at']) + return_created_at = timeutils.parse_isotime( + result['created_at']).replace(tzinfo=None) + self.assertEqual(t1, return_created_at) def test_create_port_generate_uuid(self): pdict = post_get_test_port() |