启用更新 VNF 参数

https://blueprints.launchpad.net/tacker/+spec/reservation-vnfm

本提案旨在支持更新已创建的 VNF 的参数。

问题描述

当前的 Tacker 仅支持更新 VNF 的 config 属性 [1],不支持更新 VNF 的 param_values。因此,如果操作员想要更新参数,则必须重新创建 VNF。本规范旨在实现参数更新,而无需重新创建 VNF。

用例

例如,某些 VNF 部署在有限的基础设施资源上,优先级不同。由于某些即将到来的活动(如音乐会、节日或体育赛事)的需求增加,更高优先级的 VNF 可能会被期望进行扩展。更高优先级 VNF 的操作员需要为其 VNF 预留资源,以防止其他 VNF 消耗所需的资源。

当前 Tacker 支持的资源预留功能 [2] 允许通过应用在预留资源时发出的 reservation-id 来在特定时期内扩展资源。由于此类大型活动通常会多次发生,操作员需要更新 reservation-id。通过引入此参数更新功能,操作员可以在不重新创建 VNF 的情况下为这些活动做好准备。

提议的变更

  • 在 vnf update 中启用参数更新。

向 openstack vnf set 命令添加新的参数 –param-file

openstack vnf set --param-file PARAM-FILE <VNF>

parameters 这里指的是 VNFD 中的输入参数。因此,用户必须在创建 VNF 之前在 VNFD 中参数化他们稍后想要更新的内容。例如,参数包括 flavor、image、network 等,如下所示。详细信息请参见 [3]

:caption: Example Parameterized VNFD
tosca_definitions_version: tosca_simple_profile_for_nfv_1_0_0

description: VNF TOSCA template with input parameters

metadata:
  template_name: sample-tosca-vnfd

topology_template:
  inputs:
    image_name:
      type: string
      description: Image Name

    flavor:
      type: string
      description: Flavor Information

    network:
      type: string
      description: management network

  node_templates:
    VDU1:
      type: tosca.nodes.nfv.VDU.Tacker
      properties:
        image: {get_input: image_name}
        flavor: {get_input: flavor}
        availability_zone: nova
        ...

    VL1:
      type: tosca.nodes.nfv.VL
      properties:
        network_name: {get_input: network}
        vendor: Tacker
        ...

参数的更新值在参数文件中描述。

:caption: Example parameter file
image_name: cirros-0.4.0-x86_64-disk
flavor: m1.tiny
network: net_mgmt
  • 内部更新过程

在参数更新时,Tacker 会使用设置 True 的现有标志来发出 Heat stack 更新,以保留不包含更新参数的堆栈资源。参数更新是否会导致堆栈资源的重新创建取决于更新的属性。例如,更新 OS::Nova::Server 资源类型的 image 属性会导致其 VM 被替换,但 name 属性不会。详细信息请参见 [4] [5]

    # run stack update
    stack_update_param = {
    'parameters': update_values,
    'existing': True}
heatclient.update(vnf_id, **stack_update_param)
  • 各种错误处理

用户可以使用 config 或参数文件,但不能同时使用两者。这是因为更新参数可能会在 VM 重新创建时导致 config 更新失败。

class UpdateVNF(command.ShowOne):
    _description = _("Update a given VNF.")

    def get_parser(self, prog_name):
        parser = super(UpdateVNF, self).get_parser(prog_name)
        group = parser.add_mutually_exclusive_group(required=True)
        group.add_argument(
            '--config-file',
            help=_('YAML file with VNF configuration'))
        group.add_argument(
            '--config',
            help=_('Specify config YAML data'))
        group.add_argument(
            '--param-file',
            help=_('Specify parameter yaml file'))
        parser.add_argument(
            _VNF,
            metavar="<VNF>",
            help=_("VNF to update (name or ID)"))
        return parser
:caption: Example error message
openstack vnf set --param-file PARAM-FILE --config CONFIG <VNF>
openstack vnf set: error: argument --config: not allowed with argument --param-file

如果 vnf set 命令传递的参数值与当前值之间没有差异,Tacker 会取消参数更新并显示警告消息。这可以防止不必要的更新过程。

# check update values
update_values = {}
for key, value in update_param_dict.items():
    if update_param_dict[key] != param_dict[key]:
        update_values[key] = value
if not update_values:
    raise vnfm.VNFUpdateInvalidInput(
        reason="WARNING: parameter is same value")
:caption: Example warning message
openstack vnf set --param-file PARAM-FILE <VNF>
WARNING: parameter is same value

备选方案

数据模型影响

REST API 影响

将“param_values”添加到 Update VNF API 的“请求参数”中。

安全影响

通知影响

其他最终用户影响

性能影响

其他部署者影响

开发人员影响

实现

负责人

主要负责人

Hiroyuki Jo <jo.hiroyuki@lab.ntt.co.jp>

工作项

  • 将“param-file”参数添加到 python-tackerclient 中的 vnf set 命令中。

  • 向 Tacker 添加一个函数,用于获取现有参数和新参数之间的差异。

  • 向 Tacker 添加一个函数,用于使用新参数调用堆栈更新

  • 单元测试

  • 功能测试

  • Update documentation

依赖项

测试

将添加单元和功能测试用例,用于通过将新参数应用于现有 VNF 来更新 VNF

文档影响

将“更新 VNF”添加到 tacker/doc/source/user/vnfm_usage_guide.rst

参考资料