summaryrefslogtreecommitdiffstats
path: root/nova/compute
diff options
context:
space:
mode:
authorKevin L. Mitchell <kevin.mitchell@rackspace.com>2012-07-25 15:31:11 -0500
committerKevin L. Mitchell <kevin.mitchell@rackspace.com>2012-07-25 15:31:34 -0500
commit82afe7ad5eac668aaefc79e16bbf2226eddde97d (patch)
tree2f6fbe30e9e5e1b1246c64027be1a4b0415cb6c7 /nova/compute
parent9a40e9e9a4538f6ba87451137bf0d6d2598f2319 (diff)
Inject instance metadata into xenstore
When using Xenserver, inject instance metadata into the xenstore, for the use of the instance. Implements blueprint xenstore-metadata. Change-Id: I88a59f1b783eaaaef6ba5efd8bd448aece2f869c
Diffstat (limited to 'nova/compute')
-rw-r--r--nova/compute/api.py10
-rw-r--r--nova/compute/manager.py12
-rw-r--r--nova/compute/rpcapi.py7
3 files changed, 27 insertions, 2 deletions
diff --git a/nova/compute/api.py b/nova/compute/api.py
index eb23a2412..e5b6fb1b3 100644
--- a/nova/compute/api.py
+++ b/nova/compute/api.py
@@ -1595,6 +1595,9 @@ class API(base.Base):
def delete_instance_metadata(self, context, instance, key):
"""Delete the given metadata item from an instance."""
self.db.instance_metadata_delete(context, instance['uuid'], key)
+ self.compute_rpcapi.change_instance_metadata(context,
+ instance=instance,
+ diff={key: ['-']})
@wrap_check_policy
def update_instance_metadata(self, context, instance,
@@ -1605,15 +1608,20 @@ class API(base.Base):
`metadata` argument will be deleted.
"""
+ orig = self.get_instance_metadata(context, instance)
if delete:
_metadata = metadata
else:
- _metadata = self.get_instance_metadata(context, instance)
+ _metadata = orig.copy()
_metadata.update(metadata)
self._check_metadata_properties_quota(context, _metadata)
self.db.instance_metadata_update(context, instance['uuid'],
_metadata, True)
+ diff = utils.diff_dict(orig, _metadata)
+ self.compute_rpcapi.change_instance_metadata(context,
+ instance=instance,
+ diff=diff)
return _metadata
def get_instance_faults(self, context, instances):
diff --git a/nova/compute/manager.py b/nova/compute/manager.py
index ecebf2d9c..e19a4ec90 100644
--- a/nova/compute/manager.py
+++ b/nova/compute/manager.py
@@ -235,7 +235,7 @@ def _get_additional_capabilities():
class ComputeManager(manager.SchedulerDependentManager):
"""Manages the running instances from creation to destruction."""
- RPC_API_VERSION = '1.2'
+ RPC_API_VERSION = '1.3'
def __init__(self, compute_driver=None, *args, **kwargs):
"""Load configuration options and connect to the hypervisor."""
@@ -1327,6 +1327,16 @@ class ComputeManager(manager.SchedulerDependentManager):
@exception.wrap_exception(notifier=notifier, publisher_id=publisher_id())
@checks_instance_lock
@wrap_instance_fault
+ def change_instance_metadata(self, context, instance_uuid, diff):
+ """Update the metadata published to the instance."""
+ instance_ref = self.db.instance_get_by_uuid(context, instance_uuid)
+ LOG.debug(_("Changing instance metadata according to %(diff)r") %
+ locals(), instance=instance_ref)
+ self.driver.change_instance_metadata(context, instance_ref, diff)
+
+ @exception.wrap_exception(notifier=notifier, publisher_id=publisher_id())
+ @checks_instance_lock
+ @wrap_instance_fault
def confirm_resize(self, context, instance_uuid, migration_id):
"""Destroys the source instance."""
migration_ref = self.db.migration_get(context, migration_id)
diff --git a/nova/compute/rpcapi.py b/nova/compute/rpcapi.py
index 332b8153e..e637c9f64 100644
--- a/nova/compute/rpcapi.py
+++ b/nova/compute/rpcapi.py
@@ -57,6 +57,7 @@ class ComputeAPI(nova.openstack.common.rpc.proxy.RpcProxy):
1.0 - Initial version.
1.1 - Adds get_host_uptime()
1.2 - Adds check_can_live_migrate_[destination|source]
+ 1.3 - Adds change_instance_metadata()
'''
BASE_RPC_API_VERSION = '1.0'
@@ -375,6 +376,12 @@ class ComputeAPI(nova.openstack.common.rpc.proxy.RpcProxy):
instance_uuid=instance['uuid']),
topic=_compute_topic(self.topic, ctxt, None, instance))
+ def change_instance_metadata(self, ctxt, instance, diff):
+ self.cast(ctxt, self.make_msg('change_instance_metadata',
+ instance_uuid=instance['uuid'], diff=diff),
+ topic=_compute_topic(self.topic, ctxt, None, instance),
+ version='1.3')
+
class SecurityGroupAPI(nova.openstack.common.rpc.proxy.RpcProxy):
'''Client side of the security group rpc API.