为 hypervisor 添加通知

https://blueprints.launchpad.net/nova/+spec/hypervisor-notification

目前,计算节点状态改变时不会发送任何通知,因此外部系统无法在创建、更新或删除计算节点时收到通知。

提供此类通知有助于外部系统获取最新的计算节点状态和指标。

问题描述

用例

像 Searchlight[1] 这样的外部系统希望索引计算节点,从而使对大量计算节点的查询更快、更高效。

维护者希望在添加或删除计算节点时收到通知。

提议的变更

将为以下操作添加版本化的通知

  • ComputeNode.create

  • ComputeNode.save

  • ComputeNode.destroy

注意

只有在指定的字段(“vcpus”、“memory_mb”、“local_gb”、“vcpus_used”、“local_gb_used”、“hypervisor_hostname”、“disk_available_least”、“running_vms”、“current_workload”)发生变化时才会发送通知,以避免发送内容相同的无用通知。

备选方案

数据模型影响

不需要数据库模式更改。

以下新对象将添加到 compute_node 中,用于创建和更新

@base.NovaObjectRegistry.register
class ComputeNodeNotification(notification.NotificationBase):
    # Version 1.0: Initial version
    VERSION = '1.0'
    fields = {
        'payload': fields.ObjectField('ComputeNodePayload')
    }

@base.NovaObjectRegistry.register
class ComputeNodePayload(notification.NotificationPayloadBase):
    # Version 1.0: Initial version
    SCHEMA = {
        'id': ('compute_node', 'id'),
        'uuid': ('compute_node', 'uuid'),
        'host': ('compute_node', 'host'),
        'vcpus': ('compute_node', 'vcpus'),
        'memory_mb': ('compute_node', 'memory_mb'),
        'local_gb': ('compute_node', 'local_gb'),
        'vcpus_used': ('compute_node', 'vcpus_used'),
        'memory_mb_used': ('compute_node', 'memory_mb_used'),
        'local_gb_used': ('compute_node', 'local_gb_used'),
        'hypervisor_type': ('compute_node', 'hypervisor_type'),
        'hypervisor_version': ('compute_node', 'hypervisor_version'),
        'hypervisor_hostname': ('compute_node', 'hypervisor_hostname'),
        'free_ram_mb': ('compute_node', 'free_ram_mb'),
        'free_disk_gb': ('compute_node', 'free_disk_gb'),
        'current_workload': ('compute_node', 'current_workload'),
        'running_vms': ('compute_node', 'running_vms'),
        'disk_available_least': ('compute_node', 'disk_available_least'),
        'host_ip': ('compute_node', 'host_ip'),
    }
    VERSION = '1.0'
    fields = {
        'id': fields.IntegerField(),
        'uuid': fields.UUIDField(),
        'host': fields.StringField(nullable=True),
        'vcpus': fields.IntegerField(),
        'memory_mb': fields.IntegerField(),
        'local_gb': fields.IntegerField(),
        'vcpus_used': fields.IntegerField(),
        'memory_mb_used': fields.IntegerField(),
        'local_gb_used': fields.IntegerField(),
        'hypervisor_type': fields.StringField(),
        'hypervisor_version': fields.IntegerField(),
        'hypervisor_hostname': fields.StringField(nullable=True),
        'free_ram_mb': fields.IntegerField(nullable=True),
        'free_disk_gb': fields.IntegerField(nullable=True),
        'current_workload': fields.IntegerField(nullable=True),
        'running_vms': fields.IntegerField(nullable=True),
        'disk_available_least': fields.IntegerField(nullable=True),
        'host_ip': fields.IPAddressField(nullable=True),
    }
    def __init__(self, compute_node):
        super(ComputeNodePayload, self).__init__()
        self.populate_schema(compute_node=compute_node)

以下新对象将添加到 compute_node 中,用于删除

@base.NovaObjectRegistry.register
class ComputeNodeDeleteNotification(notification.NotificationBase):
    # Version 1.0: Initial version
    VERSION = '1.0'
    fields = {
        'payload': fields.ObjectField('ComputeNodeDeletePayload')
    }

@base.NovaObjectRegistry.register
class ComputeNodeDeletePayload(notification.NotificationPayloadBase):
    # Version 1.0: Initial version
    SCHEMA = {
        'id': ('compute_node', 'id'),
        'uuid': ('compute_node', 'uuid'),
    }
    VERSION = '1.0'
    fields = {
        'id': fields.IntegerField(),
        'uuid': fields.UUIDField(),
    }
    def __init__(self, compute_node):
        super(ComputeNodeDeletePayload, self).__init__()
        self.populate_schema(compute_node=compute_node)

NotificationBase 的定义可以在 [2] 中找到。

REST API 影响

安全影响

通知影响

将引入新的通知 compute_node.create(在创建计算节点后发送)、compute_node.update(在计算节点的非静态字段更新后发送)和 compute_node.delete(在删除计算节点后发送),优先级为 INFO,通知的有效负载将是现有 ComputeNode 版本化对象的序列化形式。

其他最终用户影响

性能影响

其他部署者影响

开发人员影响

实现

负责人

主要负责人

liyingjun

工作项

  • 在创建、更新或删除计算节点时发送新的通知。

依赖项

测试

除了单元测试,还将添加新的功能测试用例来覆盖新的通知。

文档影响

参考资料

[1]: Searchlight: https://docs.openstack.org/developer/searchlight/index.html [2]: 版本化通知: https://docs.openstack.org/developer/nova/notifications.html#versioned-notifications

历史

修订版

发布名称

描述

Newton

引入