summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2012-06-01 17:16:53 +0000
committerGerrit Code Review <review@openstack.org>2012-06-01 17:16:53 +0000
commit18734e9bc7eaf99caea5957618aa77e70c69db81 (patch)
treedc29e62e797d1510a8c5a49d5be695bf285d4b9d
parent44ac6e69a0a98f92584c8d3a1fec997ec653812d (diff)
parentabea7d8f797675135b4419ff07491df4ecaed829 (diff)
downloadnova-18734e9bc7eaf99caea5957618aa77e70c69db81.tar.gz
nova-18734e9bc7eaf99caea5957618aa77e70c69db81.tar.xz
nova-18734e9bc7eaf99caea5957618aa77e70c69db81.zip
Merge "Fix instance update notification publisher id"
-rw-r--r--nova/compute/api.py8
-rw-r--r--nova/notifications.py21
-rw-r--r--nova/scheduler/driver.py3
-rw-r--r--nova/scheduler/manager.py3
-rw-r--r--nova/tests/test_notifications.py33
5 files changed, 54 insertions, 14 deletions
diff --git a/nova/compute/api.py b/nova/compute/api.py
index 6e9a91a38..5bd59bcfe 100644
--- a/nova/compute/api.py
+++ b/nova/compute/api.py
@@ -607,7 +607,7 @@ class API(base.Base):
# send a state update notification for the initial create to
# show it going from non-existent to BUILDING
notifications.send_update_with_states(context, instance, None,
- vm_states.BUILDING, None, None)
+ vm_states.BUILDING, None, None, service="api")
for security_group_id in security_groups:
self.db.instance_add_security_group(elevated,
@@ -934,7 +934,8 @@ class API(base.Base):
# if task or vm state changed
old_ref, instance_ref = self.db.instance_update_and_get_original(
context, instance["id"], kwargs)
- notifications.send_update(context, old_ref, instance_ref)
+ notifications.send_update(context, old_ref, instance_ref,
+ service="api")
return dict(instance_ref.iteritems())
@@ -1284,7 +1285,8 @@ class API(base.Base):
context, instance_uuid, 'task_state', [None], task_state)
notifications.send_update_with_states(context, instance, old_vm_state,
- instance["vm_state"], old_task_state, instance["task_state"])
+ instance["vm_state"], old_task_state, instance["task_state"],
+ service="api")
properties = {
'instance_uuid': instance_uuid,
diff --git a/nova/notifications.py b/nova/notifications.py
index b7c320fbe..e83098b20 100644
--- a/nova/notifications.py
+++ b/nova/notifications.py
@@ -43,18 +43,18 @@ FLAGS = flags.FLAGS
FLAGS.register_opt(notify_state_opt)
-def send_update(context, old_instance, new_instance, host=None):
+def send_update(context, old_instance, new_instance, service=None, host=None):
"""Send compute.instance.update notification to report changes
in vm state and (optionally) task state
"""
send_update_with_states(context, new_instance, old_instance["vm_state"],
new_instance["vm_state"], old_instance["task_state"],
- new_instance["task_state"], host)
+ new_instance["task_state"], service, host)
def send_update_with_states(context, instance, old_vm_state, new_vm_state,
- old_task_state, new_task_state, host=None):
+ old_task_state, new_task_state, service=None, host=None):
"""Send compute.instance.update notification to report changes
in vm state and (optionally) task state
"""
@@ -76,14 +76,15 @@ def send_update_with_states(context, instance, old_vm_state, new_vm_state,
if fire_update:
try:
_send_instance_update_notification(context, instance, old_vm_state,
- old_task_state, new_vm_state, new_task_state, host)
+ old_task_state, new_vm_state, new_task_state, service,
+ host)
except Exception:
LOG.exception(_("Failed to send state update notification"),
instance=instance)
def _send_instance_update_notification(context, instance, old_vm_state,
- old_task_state, new_vm_state, new_task_state, host=None):
+ old_task_state, new_vm_state, new_task_state, service=None, host=None):
"""Send 'compute.instance.exists' notification to inform observers
about instance state changes"""
@@ -117,10 +118,14 @@ def _send_instance_update_notification(context, instance, old_vm_state,
image_meta_props = image_meta(system_metadata)
payload["image_meta"] = image_meta_props
- if not host:
- host = FLAGS.host
+ # if the service name (e.g. api/scheduler/compute) is not provided, default
+ # to "compute"
+ if not service:
+ service = "compute"
- notifier_api.notify(context, host, 'compute.instance.update',
+ publisher_id = notifier_api.publisher_id(service, host)
+
+ notifier_api.notify(context, publisher_id, 'compute.instance.update',
notifier_api.INFO, payload)
diff --git a/nova/scheduler/driver.py b/nova/scheduler/driver.py
index bf635ddd4..87abfde11 100644
--- a/nova/scheduler/driver.py
+++ b/nova/scheduler/driver.py
@@ -233,7 +233,8 @@ class Scheduler(object):
# update instance state and notify
(old_ref, new_instance_ref) = db.instance_update_and_get_original(
context, instance_id, values)
- notifications.send_update(context, old_ref, new_instance_ref)
+ notifications.send_update(context, old_ref, new_instance_ref,
+ service="scheduler")
src = instance_ref['host']
cast_to_compute_host(context, src, 'live_migration',
diff --git a/nova/scheduler/manager.py b/nova/scheduler/manager.py
index 470368b03..e24705a02 100644
--- a/nova/scheduler/manager.py
+++ b/nova/scheduler/manager.py
@@ -178,7 +178,8 @@ class SchedulerManager(manager.Manager):
# update instance state and notify on the transition
(old_ref, new_ref) = db.instance_update_and_get_original(context,
instance_uuid, updates)
- notifications.send_update(context, old_ref, new_ref)
+ notifications.send_update(context, old_ref, new_ref,
+ service="scheduler")
payload = dict(request_spec=request_spec,
instance_properties=properties,
diff --git a/nova/tests/test_notifications.py b/nova/tests/test_notifications.py
index a9d4f3f3b..daf96df47 100644
--- a/nova/tests/test_notifications.py
+++ b/nova/tests/test_notifications.py
@@ -54,7 +54,8 @@ class NotificationsTestCase(test.TestCase):
stub_network=True,
notification_driver='nova.notifier.test_notifier',
network_manager='nova.network.manager.FlatManager',
- notify_on_state_change="vm_and_task_state")
+ notify_on_state_change="vm_and_task_state",
+ host='testhost')
self.user_id = 'fake'
self.project_id = 'fake'
@@ -167,3 +168,33 @@ class NotificationsTestCase(test.TestCase):
self.assertEquals(vm_states.BUILDING, payload["state"])
self.assertEquals(task_states.SPAWNING, payload["old_task_state"])
self.assertEquals(None, payload["new_task_state"])
+
+ def test_update_no_service_name(self):
+ notifications.send_update_with_states(self.context, self.instance,
+ vm_states.BUILDING, vm_states.BUILDING, task_states.SPAWNING,
+ None)
+ self.assertEquals(1, len(test_notifier.NOTIFICATIONS))
+
+ # service name should default to 'compute'
+ notif = test_notifier.NOTIFICATIONS[0]
+ self.assertEquals('compute.testhost', notif['publisher_id'])
+
+ def test_update_with_service_name(self):
+ notifications.send_update_with_states(self.context, self.instance,
+ vm_states.BUILDING, vm_states.BUILDING, task_states.SPAWNING,
+ None, service="testservice")
+ self.assertEquals(1, len(test_notifier.NOTIFICATIONS))
+
+ # service name should default to 'compute'
+ notif = test_notifier.NOTIFICATIONS[0]
+ self.assertEquals('testservice.testhost', notif['publisher_id'])
+
+ def test_update_with_host_name(self):
+ notifications.send_update_with_states(self.context, self.instance,
+ vm_states.BUILDING, vm_states.BUILDING, task_states.SPAWNING,
+ None, host="someotherhost")
+ self.assertEquals(1, len(test_notifier.NOTIFICATIONS))
+
+ # service name should default to 'compute'
+ notif = test_notifier.NOTIFICATIONS[0]
+ self.assertEquals('compute.someotherhost', notif['publisher_id'])