diff --git a/watcher/decision_engine/model/collector/nova.py b/watcher/decision_engine/model/collector/nova.py index efd7be30f..157f3b841 100644 --- a/watcher/decision_engine/model/collector/nova.py +++ b/watcher/decision_engine/model/collector/nova.py @@ -158,6 +158,7 @@ class NovaClusterDataModelCollector(base.BaseClusterDataModelCollector): nova.LegacyInstanceDeletedEnd(self), nova.LegacyLiveMigratedEnd(self), nova.LegacyInstanceResizeConfirmEnd(self), + nova.LegacyInstanceRebuildEnd(self), ] def get_audit_scope_handler(self, audit_scope): diff --git a/watcher/decision_engine/model/notification/nova.py b/watcher/decision_engine/model/notification/nova.py index 090e14219..4ba6afaf5 100644 --- a/watcher/decision_engine/model/notification/nova.py +++ b/watcher/decision_engine/model/notification/nova.py @@ -497,3 +497,30 @@ class LegacyInstanceResizeConfirmEnd(UnversionedNotificationEndpoint): instance = self.get_or_create_instance(instance_uuid, node_uuid) self.legacy_update_instance(instance, payload) + + +class LegacyInstanceRebuildEnd(UnversionedNotificationEndpoint): + + @property + def filter_rule(self): + """Nova compute.instance.rebuild.end filter""" + return filtering.NotificationFilter( + publisher_id=self.publisher_id_regex, + event_type='compute.instance.rebuild.end', + ) + + def info(self, ctxt, publisher_id, event_type, payload, metadata): + ctxt.request_id = metadata['message_id'] + ctxt.project_domain = event_type + LOG.info("Event '%(event)s' received from %(publisher)s " + "with metadata %(metadata)s" % + dict(event=event_type, + publisher=publisher_id, + metadata=metadata)) + LOG.debug(payload) + + instance_uuid = payload['instance_id'] + node_uuid = payload.get('node') + instance = self.get_or_create_instance(instance_uuid, node_uuid) + + self.legacy_update_instance(instance, payload) diff --git a/watcher/tests/decision_engine/model/notification/data/scenario3_legacy_instance-rebuild-end.json b/watcher/tests/decision_engine/model/notification/data/scenario3_legacy_instance-rebuild-end.json new file mode 100644 index 000000000..8e2b793aa --- /dev/null +++ b/watcher/tests/decision_engine/model/notification/data/scenario3_legacy_instance-rebuild-end.json @@ -0,0 +1,59 @@ +{ + "event_type": "compute.instance.rebuild.end", + "payload": { + "state_description": "", + "availability_zone": "nova", + "terminated_at": "", + "ephemeral_gb": 0, + "instance_type_id": 5, + "deleted_at": "", + "fixed_ips": [ + { + "version": 4, + "vif_mac": "fa:16:3e:78:e1:a0", + "floating_ips": [], + "label": "test-net", + "meta": {}, + "address": "192.168.200.16", + "type": "fixed" + } + ], + "instance_id": "73b09e16-35b7-4922-804e-e8f5d9b740fc", + "display_name": "INSTANCE_0", + "reservation_id": "r-jmbnz8nc", + "hostname": "INSTANCE_1", + "state": "active", + "progress": "", + "launched_at": "2017-09-13T06:10:42.751392", + "metadata": {}, + "node": "Node_1", + "ramdisk_id": "", + "access_ip_v6": null, + "disk_gb": 20, + "access_ip_v4": null, + "kernel_id": "", + "image_name": "", + "host": "Node_1", + "user_id": "0c1add55e6d149108deedee780fdb540", + "image_ref_url": "http://10.21.1.16:9292/images/886eae2b-b41f-4340-acd1-a1b926671b0a", + "cell_name": "", + "root_gb": 20, + "tenant_id": "b18faa9487864b20b61386438b7ae2ce", + "created_at": "2017-09-11 09:48:05+00:00", + "memory_mb": 2048, + "instance_type": "m1.small", + "vcpus": 1, + "image_meta": { + "min_disk": "20", + "container_format": "bare", + "min_ram": "0", + "disk_format": "raw", + "base_image_ref": "886eae2b-b41f-4340-acd1-a1b926671b0a" + }, + "architecture": null, + "os_type": null, + "instance_flavor_id": "2" + }, + "priority": "INFO", + "publisher_id": "compute.Node_1" +} diff --git a/watcher/tests/decision_engine/model/notification/test_nova_notifications.py b/watcher/tests/decision_engine/model/notification/test_nova_notifications.py index 11b5b5a82..a49d60a7f 100644 --- a/watcher/tests/decision_engine/model/notification/test_nova_notifications.py +++ b/watcher/tests/decision_engine/model/notification/test_nova_notifications.py @@ -545,3 +545,27 @@ class TestLegacyNovaNotifications(NotificationTestCase): node = compute_model.get_node_by_instance_uuid(instance0_uuid) self.assertEqual('Node_1', node.uuid) self.assertEqual(element.InstanceState.ACTIVE.value, instance0.state) + + def test_legacy_instance_rebuild_end(self): + compute_model = self.fake_cdmc.generate_scenario_3_with_2_nodes() + self.fake_cdmc.cluster_data_model = compute_model + handler = novanotification.LegacyLiveMigratedEnd(self.fake_cdmc) + + instance0_uuid = '73b09e16-35b7-4922-804e-e8f5d9b740fc' + instance0 = compute_model.get_instance_by_uuid(instance0_uuid) + + node = compute_model.get_node_by_instance_uuid(instance0_uuid) + self.assertEqual('Node_0', node.uuid) + + message = self.load_message( + 'scenario3_legacy_instance-rebuild-end.json') + handler.info( + ctxt=self.context, + publisher_id=message['publisher_id'], + event_type=message['event_type'], + payload=message['payload'], + metadata=self.FAKE_METADATA, + ) + node = compute_model.get_node_by_instance_uuid(instance0_uuid) + self.assertEqual('Node_1', node.uuid) + self.assertEqual(element.InstanceState.ACTIVE.value, instance0.state)