summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ironic/api/controllers/v1/base.py8
-rw-r--r--ironic/tests/api/test_chassis.py19
-rw-r--r--ironic/tests/api/test_nodes.py17
-rw-r--r--ironic/tests/api/test_ports.py16
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()