summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2012-11-29 00:21:49 +0000
committerGerrit Code Review <review@openstack.org>2012-11-29 00:21:49 +0000
commit0666348b033b1838eef37c0f7e9db0d9e7bcb03a (patch)
tree36679b024740eff51b25e883611e7fd775883b47
parent2b7583bc4d1b5673b89e1613e39dba1245f62778 (diff)
parent66e1a8b47544e225721f0ccd3a33580dde337793 (diff)
downloadnova-0666348b033b1838eef37c0f7e9db0d9e7bcb03a.tar.gz
nova-0666348b033b1838eef37c0f7e9db0d9e7bcb03a.tar.xz
nova-0666348b033b1838eef37c0f7e9db0d9e7bcb03a.zip
Merge "Convert datetimes for conductor instance_update."
-rw-r--r--nova/conductor/manager.py11
-rw-r--r--nova/conductor/rpcapi.py3
-rw-r--r--nova/tests/conductor/test_conductor.py6
3 files changed, 17 insertions, 3 deletions
diff --git a/nova/conductor/manager.py b/nova/conductor/manager.py
index 4cb6672f4..aa732b1d3 100644
--- a/nova/conductor/manager.py
+++ b/nova/conductor/manager.py
@@ -18,10 +18,13 @@ from nova import manager
from nova import notifications
from nova.openstack.common import jsonutils
from nova.openstack.common import log as logging
+from nova.openstack.common import timeutils
LOG = logging.getLogger(__name__)
+# Instead of having a huge list of arguments to instance_update(), we just
+# accept a dict of fields to update and use this whitelist to validate it.
allowed_updates = ['task_state', 'vm_state', 'expected_task_state',
'power_state', 'access_ip_v4', 'access_ip_v6',
'launched_at', 'terminated_at', 'host', 'node',
@@ -31,6 +34,9 @@ allowed_updates = ['task_state', 'vm_state', 'expected_task_state',
'default_swap_device', 'root_device_name',
]
+# Fields that we want to convert back into a datetime object.
+datetime_fields = ['launched_at', 'terminated_at']
+
class ConductorManager(manager.SchedulerDependentManager):
"""Mission: TBD"""
@@ -42,11 +48,14 @@ class ConductorManager(manager.SchedulerDependentManager):
*args, **kwargs)
def instance_update(self, context, instance_uuid, updates):
- for key in updates:
+ for key, value in updates.iteritems():
if key not in allowed_updates:
LOG.error(_("Instance update attempted for "
"'%(key)s' on %(instance_uuid)s") % locals())
raise KeyError("unexpected update keyword '%s'" % key)
+ if key in datetime_fields and isinstance(value, basestring):
+ updates[key] = timeutils.parse_strtime(value)
+
old_ref, instance_ref = self.db.instance_update_and_get_original(
context, instance_uuid, updates)
notifications.send_update(context, old_ref, instance_ref)
diff --git a/nova/conductor/rpcapi.py b/nova/conductor/rpcapi.py
index 15750da76..f73547925 100644
--- a/nova/conductor/rpcapi.py
+++ b/nova/conductor/rpcapi.py
@@ -38,10 +38,11 @@ class ConductorAPI(nova.openstack.common.rpc.proxy.RpcProxy):
default_version=self.BASE_RPC_API_VERSION)
def instance_update(self, context, instance_uuid, updates):
+ updates_p = jsonutils.to_primitive(updates)
return self.call(context,
self.make_msg('instance_update',
instance_uuid=instance_uuid,
- updates=updates))
+ updates=updates_p))
def migration_update(self, context, migration, status):
migration_p = jsonutils.to_primitive(migration)
diff --git a/nova/tests/conductor/test_conductor.py b/nova/tests/conductor/test_conductor.py
index d3c555822..3dcfe0209 100644
--- a/nova/tests/conductor/test_conductor.py
+++ b/nova/tests/conductor/test_conductor.py
@@ -25,6 +25,7 @@ from nova import db
from nova.db.sqlalchemy import models
from nova import notifications
from nova.openstack.common import jsonutils
+from nova.openstack.common import timeutils
from nova import test
@@ -156,7 +157,10 @@ class ConductorPolicyTest(test.TestCase):
conductor = conductor_api.LocalAPI()
updates = {}
for key in conductor_manager.allowed_updates:
- updates[key] = 'foo'
+ if key in conductor_manager.datetime_fields:
+ updates[key] = timeutils.utcnow()
+ else:
+ updates[key] = 'foo'
conductor.instance_update(ctxt, 'fake-instance', **updates)
def test_allowed_keys_are_real(self):