Properties Group

https://blueprints.launchpad.net/heat/+spec/heat-property-group

为 Heat 资源插件添加 PropertiesGroup,用于分组属性。

问题描述

在许多 Heat 资源插件的实现中,属性会定义验证模式,但缺乏分组的概念,这对于以下原因至关重要

  • 有时,资源要求提供 PropertyA 或 PropertyB,其中一个属性是必需的。目前在 Heat 属性模式中无法定义这一点,因为开发人员无法将 required=true 设置为这两个属性,并且需要在 validate() 方法中实现逻辑,以确定是否提供了其中一个属性。

  • 某些插件支持其事物的多个版本,例如,docker 插件支持多个版本。因此,某些属性仅在特定版本中受支持。现在没有通用的声明方式来指定某些属性是给定客户端版本所必需的。

提议的变更

可以通过引入 PropertiesGroup 的概念来解决第一个问题,这有助于声明式验证,如下所示

资源类将具有 properties_groups_schema,其中包含属性组列表。每个属性组具有以下表示形式

假设有两个属性:PropertyA 和 PropertyB,并且它们已经使用适当的属性模式声明。那么属性组将通过字典中的逻辑表达式指定

properties_groups_schema = [
    {properties_group.AND: [[PropertyA], [PropertyB]]}
]

这样,逻辑表达式由一个键值对的字典组成,其值为列表类型,可以包含列表类型的属性名称或属性组逻辑表达式。字典键应等于以下运算符之一:“and”、“or”、“xor”。

属性组可以嵌套,例如

properties_groups_schema = [
    {properties_group.AND: [
        {properties_group.OR: [[PropertyA], [PropertyB]]},
        [propertyC]]}
]

在 ‘validation()’ 阶段,property_groups_schema 中的每个组将按顺序使用运算符在属性之间进行验证。这有助于实现跨依赖属性的复杂验证逻辑。

properties_groups_schema 中声明的每个组可以引用其属性列表中的其他组。因此,复杂的验证可以是

这里,每个属性条目可以定义为

[‘prp1’, ‘child_prp1’, ‘grand_child_prp1’]

即使属性条目仅包含一个项目,即

[‘prp1’]

例如,如果存在 properties_schema

properties_schema = {
    PropertyA: properties.Schema(
        properties.Schema.MAP,
        schema={
            PropertySubA: properties.Schema(properties.Schema.STRING),
            PropertySubB: properties.Schema(properties.Schema.STRING)
        }
    )
}

那么 properties_groups_schema 应该如下所示

properties_groups_schema = [
    {properties_group.AND: [[PropertyA, PropertySubA],
                            [PropertyA, PropertySubB]]}
]

此外,属性组将支持指定 client_plugin 的 API 版本,用于属性,即仅当指定的 client_plugin API 版本满足组中的版本时,属性才受支持。那么属性组将具有以下格式

properties_groups_schema = [
    {properties_group.API_VERSIONS: {
        properties_group.CLIENT_PLUGIN: <client_plugin object>,
        properties_group.VERSIONS: <list of supported versions>,
        properties_group.PROPERTIES: <list of properties entries>}
    }
]

使用 API_VERSIONS 作为属性组的示例

properties_groups_schema = [
    {properties_group.API_VERSIONS: {
        properties_group.CLIENT_PLUGIN: self.client_plugin('keystone'),
        properties_group.VERSIONS: ['1.2', '2.0'],
        properties_group.PROPERTIES: [[PropertyA], [PropertyB]]}
    }
]

Heat 引擎可以推断属性组中的这组属性仅受 1.2 和 2.0 API 版本支持,因此它可以检查当前 client_plugin 支持并相应地进行验证。

除了验证部分,所有必要的更改都将添加到文档生成器中,以便用户了解属性之间的关系。

备选方案

无。

实现

负责人

主要负责人

Kanagaraj Manickam (kanagaraj-manickam)

Peter Razumovsky <prazumovsky>

里程碑

目前由于社区缺乏兴趣而被移至待办事项列表。可用的 PoC 放置在此处

https://review.openstack.org/#/q/topic:bp/property-group

工作项

  • 定义具有给定资源所需验证逻辑的 PropertiesGroup 类

  • 更新资源验证逻辑以使用属性组进行验证

  • 使用属性组更新现有资源

  • 生成属性组文档,以便用户了解属性要求

  • 添加所需的测试用例

依赖项

无。