Heat 支持状态使用指南

Heat 允许为每个资源、属性和特性使用一个名为 support_status 的特殊选项,用于描述对象的当前状态:当前状态、该状态生效的时间、以及有关对象状态的任何其他信息。本指南详细描述了资源、属性和特性的状态生命周期。

支持状态选项及其参数

可以使用 SupportStatus 类指定对象的支持状态,该类具有以下选项:

status:
对象的当前状态。允许的值:
  • SUPPORTED。状态参数的默认值。所有具有此状态的对象都可用且可使用。

  • DEPRECATED。具有此状态的对象可用,但建议不要在代码或模板中使用它。通常,可以在消息中引用新的对象,该对象可以替代弃用的资源。

  • HIDDEN。弃用过程的最后一步。包含此状态的旧堆栈将继续运行。某些功能对于具有此状态的资源将被禁用(资源类型列表、资源类型显示和资源类型模板)。具有 HIDDEN 状态的资源不包含在文档中。一个已知限制是可以使用 HIDDEN 资源创建新的堆栈。有关删除和弃用过程的更多详细信息,请参见下文。

  • UNSUPPORTED。具有 UNSUPPORTED 状态的资源不受 Heat 团队支持,即用户可以使用它,但它可能会出现问题。

substitute_class:

为对象分配替代类。如果用继承(或扩展)自替代类的新的对象替换对象,将优雅地将对象转移到新的类类型(无需调用更新替换)。

版本:

当前状态生效的发布名称。该参数是可选的,但应在指定或更改 SupportStatus 时定义或更改。它用于更好地了解对象处于当前状态的发布版本。.. 注意

Since Liberty release mark looks like 5.0.0 instead of 2015.2.
message:

有关对象状态的任何其他信息,例如 '使用 属性 new_property 代替。'

previous_status:

一个选项,允许显示对象的先前状态(如果有)。这对于显示对象的完整生命周期很有帮助。previous_status 的类型是 SupportStatus。

资源、属性和特性的生命周期

本节描述了资源、属性和特性等对象的生命周期。所有这些对象都具有相同的生命周期

UNSUPPORTED -> SUPPORTED -> DEPRECATED -> HIDDEN
                                      \
                                       -> UNSUPPORTED

其中 UNSUPPORTED 是可选的。

对象创建过程

在创建对象时,有必要添加支持状态。因此,新对象应包含一个 support_status 参数,该参数等于带有对象版本定义的 SupportStatus 类,并且可能包含 substitute_class 或一些消息。此参数允许用户了解从哪个 OpenStack 版本开始可用和可以使用该对象。

对象弃用过程

当某个对象变得过时时,用户应该知道这一点,因此需要在对象的 support_status 中添加有关弃用的信息。 SupportStatus 的状态必须等于 DEPRECATED。如果没有 version 参数,则需要添加一个带有当前版本的参数,否则将当前状态移动到 previous_status,并将当前版本作为值添加到 version。如果新对象替换了旧对象,那么将有关新对象的一些信息添加到旧对象的 support_status 消息中会是一个好主意,例如“使用属性 new_property 代替”。如果旧对象可以直接由新对象替换,则应将 substitute_class 添加到旧对象的 support_status 中。

对象删除过程

至少经过一个完整的发布周期后,应隐藏弃用的对象,并且 support_status 状态应等于 HIDDEN。HIDDEN 状态表示从文档和 resource-type-list CLI 命令的结果中隐藏对象(如果对象是资源)。此外,使用此类资源的 resource-type-show 命令将引发 NotSupported 异常。

隐藏而不是删除过时资源或属性的目的是确保用户可以继续操作现有的堆栈 - 替换或删除违规资源,或删除整个堆栈。应采取措施确保这些操作能够成功,例如,通过将隐藏资源类型的实现替换为等效于 OS::Heat::None 的实现(当底层 API 不再存在时),为资源类型提供 substitute_class,或添加属性转换规则。

在编写代码时使用支持状态

在添加新对象或添加替代某些旧对象(例如,OS::Neutron::RouterInterface 中的属性 subnet 代替 subnet_id)时,有一些关于添加对象时间的信息(从哪个版本开始可用或不可用)。本节描述了在创建/弃用/删除资源、属性和特性期间的 SupportStatus。请注意,SupportStatus 位于 support.py 中,因此需要导入 support。为了指定状态,请使用 support 常量名称,例如 support.SUPPORTED。所有常量名称在上面的部分中描述。

创建期间使用支持状态

support_status 选项可用于整个资源

class ResourceWithType(resource.Resource):

    support_status=support.SupportStatus(
        version='5.0.0',
        message=_('Optional message')
    )

要为属性或特性定义 support_status,请执行以下步骤:

PROPERTY: properties.Schema(
    ...
    support_status=support.SupportStatus(
        version='5.0.0',
        message=_('Optional message')
    )
)

属性模式的相同 support_status 定义。

请注意,在这种情况下,SupportStatus 的状态参数使用默认值,等于 SUPPORTED。

在弃用和隐藏期间使用支持状态

当弃用或隐藏资源/属性/特性的时候,请执行以下步骤:

  1. 如果对象中存在一些 support_status,则添加 previous_status 参数,其中包含当前的 SupportStatus 值,并更改所有其他参数以获取当前的 statusversion 以及可能存在的 substitute_classmessage

  2. 如果不存在 support_status 选项,则添加一个新的选项,其中状态等于当前状态,version 等于当前版本说明,并且可选地添加一些消息。

资源弃用期间使用支持状态如下所示:

class ResourceWithType(resource.Resource):

    support_status=support.SupportStatus(
        status=support.DEPRECATED,
        version='5.0.0',
        substitute_class=SubstituteResourceWithType,
        message=_('Optional message'),
        previous_status=support.SupportStatus(version='2014.2')
    )

属性(或特性)弃用期间使用支持状态如下所示:

ATTRIBUTE: attributes.Schema(
    ...
    support_status=support.SupportStatus(
        status=support.DEPRECATED,
        version='5.0.0',
        message=_('Optional message like: Use attribute new_attr'),
        previous_status=support.SupportStatus(
            version='2014.2',
            message=_('Feature available since 2014.2'))
    )
)

属性模式的相同 support_status 定义。

请注意,在隐藏对象时,状态应等于 support.HIDDEN,而不是 support.DEPRECATED。此外,具有 DEPRECATED 状态的 SupportStatus 应该移动到 previous_status,例如:

support.SupportStatus(
    status=support.HIDDEN,
    version='6.0.0',
    message=_('Some message'),
    previous_status=support.SupportStatus(
        status=support.DEPRECATED,
        version='2015.1',
        substitute_class=SubstituteResourceWithType,
        previous_status=support.SupportStatus(version='2014.2')
    )
)

在隐藏属性时,如果某个隐藏属性有替代属性,请使用翻译机制将属性从旧属性转换为新属性。请参见下文,如何使用此机制。

隐藏属性的翻译机制

有时属性会变得过时并被另一个属性替换。为此有一个翻译机制。机制用于以下情况:

  1. 如果 properties_schema 中有两个属性,其类型为 STRING、INTEGER、NUMBER 或 BOOLEAN。

  2. 如果存在两个属性:一个在 LIST 或 MAP 属性子模式中,另一个在顶级模式中。

  3. 如果 LIST 属性中有两个属性。

  4. 如果存在非 LIST 属性和 LIST 属性,该 LIST 属性旨在替换非 LIST 属性。

  5. 如果存在包含某些实体(例如 subnet)的名称或 ID 的 STRING 属性,并且应将其解析为实体的 ID。

该机制具有规则并执行这些规则。要定义规则,调用 TranslationRule 类,并指定 translation_path - 属性模式中受影响属性的路径列表;value - 将添加到指定参数的属性中的值;value_name - 用于情况 4 的旧属性名称;value_path - 用于获取值的属性模式中的路径列表。TranslationRule 支持以下规则:

  • ADD。此规则允许将一些值添加到 LIST 类型的属性。只有 LIST 类型的才能添加到此类属性。禁止用于其他情况,并会返回错误。

  • REPLACE。此规则允许将一些属性值替换为另一个值。用于所有类型的属性。请注意,如果属性具有列表类型,则将在需要时将值替换为列表的所有元素。如果该属性中的元素需要由该属性的另一个元素的值替换,则必须定义 value_name

  • DELETE。此规则允许删除一些属性。如果属性具有列表类型,则删除会影响列表中的所有值。

  • RESOLVE - 此规则允许使用客户端和 finder 函数解析一些属性。查找器可能需要额外的 entity 键。

具有一些隐藏属性(可以由新的属性替换)的每个资源都必须重载 translation_rules 方法,该方法应返回 TranslationRules 列表,例如:

def translation_rules(self, properties):
     rules = [
       translation.TranslationRule(
         properties,
         translation.TranslationRule.REPLACE,
         translation_path=[self.NETWORKS, self.NETWORK_ID],
         value_name=self.NETWORK_UUID),
       translation.TranslationRule(
         properties,
         translation.TranslationRule.RESOLVE,
         translation_path=[self.FLAVOR],
         client_plugin=self.client_plugin('nova'),
         finder='find_flavor_by_name_or_id')]
     return rules