基于 ETSI NFV-SOL 规范的 VNF REST API

https://blueprints.launchpad.net/tacker/+spec/support-etsi-nfv-specs

NFV 架构框架内的 ETSI 规范 [1] 描述了基于行业需求、SDN/NFV 厂商和电信运营商反馈的 NFV 开发和使用的主要方面。这些规范包括 REST API 和数据模型架构,供 NFV 用户和开发人员在相关产品中使用。

问题描述

目前,Tacker 使用其自身的 API,该 API 描述了基于 ETSI NFV MANO 标准的组件的 CRUD 操作。

然而,这些操作与当前的 ETSI NFV 数据模型不一致。因此,可能与根据 ETSI NFV 规范开发的 第三方 VNF [2] 缺乏兼容性。此外,与普遍接受的规范的不匹配给与第三方 ETSI 兼容系统集成带来了额外的复杂性,从而增加了棕地部署的时间和精力。ETSI NVF 规范不仅描述了 MANO 的内部逻辑,还与 VIM、SDN 控制器、VNF、EMS 和 OSS 等第三方系统交互,并且被市场上多个供应商积极使用。支持关键的 ETSI NFV 规范将大大减少 Tacker 集成到电信生产网络的工作量,并简化未来标准的进一步开发和支持。

提议的变更

引入一个新的接口,用于调用针对 VNFM 的 VNF 实例的 VNF 生命周期管理操作。

通过此接口提供的操作包括

  • 创建 VNF 标识符

  • 查询 VNF

  • 列出 VNF 标识符

  • 删除 VNF 标识符

  • 实例化 VNF

  • 修复 VNF

  • 终止 VNF

1) VNF 实例资源创建流程

../../_images/0111.png

该过程包括以下步骤,如图所示

  • Consumer 向“VNF 实例”资源发送 POST 请求,并在有效负载主体中包含一种名为“CreateVnfRequest”的数据结构。

  • VNFM 在 NOT_INSTANTIATED 状态下创建一个新的 VNF 实例资源,以及关联的 VNF 实例标识符。VNF 实例资源中的某些属性来自“CreateVnfRequest”中提供的 VNF 包。

  • VNFM 返回一个 201 Created 响应,其中包含 VNFM 刚刚创建的 VNF 实例资源的表示形式,并在“Location”HTTP 标头中提供新创建资源的 URI。

注意

VNF 实例资源需要提前注册 VNF 包。并且 VNF 包中的 VNFD 必须符合 NFV-SOL001

前置条件:成功完成,VNF 实例资源已在“NOT_INSTANTIATED”状态下创建。

2) VNF 实例实例化流程

../../_images/026.png

该过程包括以下步骤,如图所示

  1. 在 VNF 的预实例化过程中,VNFM 将使用 Glance 客户端创建 VNFD 中给定的部署 flavor 中描述的镜像。根据 ETSI NFV 文档,NFVO 应持有镜像信息并直接向 VIM 注册镜像,然后 NFVO 应通过 Grant API 向 VNFM 提供镜像 ID,但在 U 发布版中,VNFM 将直接向 VIM 注册镜像。

  2. Openstack 驱动程序将使用 Heat 创建堆栈,并等待其状态变为 CREATE_COMPLETE

  3. VnfLcmDriver 将更新 DB,将 instantiatedState 设置为 INSTANTIATED,vnf_state 设置为 STARTED,并相应地将 vnf 包 usage_state 设置为 IN_USE

注意

假定外部网络(例如 extVirtualLinks、extLinkPorts 和 extManagedVirtualLinks)由客户创建。根据 ETSI NFV 文档,这些网络应由 NFVO 创建,但是,与 NFVO 相关的函数将是未来的工作。因此,Tacker 不会创建外部网络。

3) VNF 实例修复流程

先决条件:VNF 实例处于“INSTANTIATED”状态。

../../_images/033.png

该过程包括以下步骤,如图所示

  1. Consumer 向“HEAL VNF 实例”资源发送 POST 请求。

  2. OpenstackDriver 将根据 HEAL 请求向 HEAT 发送请求以将资源标记为不健康。

  3. OpenstackDriver 将向 HEAT 发送请求以更新堆栈。

  4. OpenstackDriver 将向 HEAT 发送请求以获取堆栈的更新资源数据。

  5. VnfLcmDriver 将更新 DB 中的更新资源详细信息。

后置条件:VNF 实例处于“INSTANTIATED”状态,并且已修复。

4) VNF 实例终止流程

../../_images/042.png

该过程包括以下步骤,如图所示

  1. Consumer 向“Terminate VNF 实例”资源发送 POST 请求。

  2. OpenstackDriver 将使用 Heat 删除堆栈。

  3. 在实例化期间创建的镜像将被删除。

前置条件:“instantiationState”应设置为“NOT_INSTANTIATED”。

5) VNF 实例资源删除流程

前置条件:VNF 实例处于 NOT_INSTANTIATED 状态。

../../_images/052.png

该过程包括以下步骤,如图所示

  1. Consumer 向“Individual VNF 实例”资源发送 DELETE 请求。

  2. VNFM 删除 VNF 实例资源和关联的 VNF 实例标识符。

  3. VNFM 返回一个“204 No Content”响应,其中包含一个空有效负载主体。

前置条件:VNF 实例资源已删除。

错误处理:如果“Individual VNF 实例”资源不在

NOT_INSTANTIATED 状态,VNFM 将拒绝删除请求。

支持 SOL001 VNFD TOSCA 服务模板的子集

我们计划提供在 NFV-SOL001 中定义的 VNFD TOSCA 服务模板的有限支持

支持的数据类型

  1. tosca.datatypes.nfv.ConnectivityType

  2. tosca.datatypes.nfv.VirtualMemory

  3. tosca.datatypes.nfv.VirtualCpu

  4. tosca.datatypes.nfv.VduProfile

  5. tosca.datatypes.nfv.VlProfile

  6. tosca.datatypes.nfv.InstantiationLevel

  7. tosca.datatypes.nfv.VduLevel

  8. tosca.datatypes.nfv.ScaleInfo

  9. tosca.datatypes.nfv.ScalingAspect

  10. tosca.datatypes.nfv.LinkBitrateRequirements

  11. tosca.datatypes.nfv.VnfAdditionalConfigurableProperties

  12. tosca.datatypes.nfv.SwImageData

  13. tosca.datatypes.nfv.VirtualBlockStorageData

  14. tosca.datatypes.nfv.VirtualLinkBitrateLevel

  15. tosca.datatypes.nfv.ChecksumData

支持的工件类型

  1. tosca.artifacts.nfv.SwImage

支持的能力类型

  1. tosca.capabilities.nfv.VirtualBindable

  2. tosca.capabilities.nfv.VirtualLinkable

  3. tosca.capabilities.nfv.VirtualCompute

  4. tosca.capabilities.nfv.VirtualStorage

支持的接口类型

  1. tosca.interfaces.nfv.Vnflcm

支持的节点类型

  1. tosca.nodes.nfv.VNF

  2. tosca.nodes.nfv.Vdu.Compute

  3. tosca.nodes.nfv.Vdu.VirtualBlockStorage

  4. tosca.nodes.nfv.VduCp

  5. tosca.nodes.nfv.VnfVirtualLink

支持的策略类型

  1. tosca.policies.nfv.InstantiationLevels

  2. tosca.policies.nfv.VduInstantiationLevels

  3. tosca.policies.nfv.VirtualLinkInstantiationLevels

  4. tosca.policies.nfv.ScalingAspects

  5. tosca.policies.nfv.VduScalingAspectsDeltas

  6. tosca.policies.nfv.VduInitialDelta

添加 task_state 以对 VNF 实例执行原子操作

vnf_instances db 表中添加 task_state,引入 task_state 的主要目的是允许以原子方式对 VNF 执行操作。这意味着,如果您正在实例化 VNF,在操作完成之前,它不会允许您执行相同的操作或任何其他操作。如果用户在完成之前的请求之前尝试再次实例化它,它将以 400 错误拒绝该请求。

task_state 的类型

  • INSTANTIATING:在用户调用 instantiate API 时设置。VNF 完全实例化后,它将被设置为 None。如果 VNF 实例化失败,则它将被设置为 ERROR

  • HEALING:在用户调用 heal API 时设置。VNF 完全修复后,它将被设置为 None。如果 VNF 修复失败,则它将被设置为 ERROR

  • TERMINATING:在用户调用 terminate API 时设置。VNF 完全终止后,它将被设置为 None。如果 VNF 终止失败,则它将被设置为 ERROR

  • ERROR:用户将无法对 task_stateERROR 的 VNF 执行任何操作。操作员需要手动修复所有此类问题。我们计划在未来使用定期任务修复处于这种状态的 VNF。

备选方案

数据模型影响

在 ‘tacker’ 数据库中添加以下新表。相应的模式如下详细说明:-

vnf_instances:

id uuid

vnfd_id uuid

vnf_instance_name varchar(255) NULL

vnf_instance_description varchar(1024) NULL

vnf_provider varchar(255) NOT NULL

vnf_product_name varchar(255) NOT NULL

vnf_software_version varchar(255) NOT NULL

vnfd_version varchar(255) NOT NULL

instantiation_state varchar(255) NOT NULL

task_state varchar(255) NULL

vim_connection_info json NULL

tenant_id varchar(64) NOT NULL

created_at datetime NOT NULL

updated_at datetime NULL

deleted_at datetime NULL

deleted tinyint(1) NULL

此表将以 id 作为主键。vnfd_id 将是 vnf_package_vnfd.`vnfd_id` 的外键。

vnf_instantiated_info:

id int(11)

vnf_instance_id uuid

flavour_id varchar(255) NOT NULL

ext_cp_info json NOT NULL

ext_virtual_link_info json NULL

ext_managed_virtual_link_info json NULL

vnfc_resource_info json NULL

vnf_virtual_link_resource_info json NULL

virtual_storage_resource_info json NULL

vnf_state varchar(255) NOT NULL

instance_id varchar(255) NOT NULL

instantiation_level_id varchar(255) NULL

additional_params json NULL

created_at datetime NOT NULL

updated_at datetime NULL

deleted_at datetime NULL

deleted tinyint(1) NULL

此表将以 id 作为主键。vnf_instance_id 将是 vnf_instances.`id` 的外键。flavour_Id 将是 vnf_deployment_flavours.`flavour_id` 的外键。

vnf_resources:

id uuid

vnf_instance_id uuid

resource_name varchar(255) NULL

resource_type Integer NOT NULL

resource_identifier text NOT NULL

resource_status text NOT NULL

created_at datetime NOT NULL

updated_at datetime NULL

deleted_at datetime NULL

deleted tinyint(1) NULL

此表将以 id 作为主键。vnf_instance_Id 将是 vnf_instances.`id` 的外键。

注意

对于 vim_connection_infoext_cp_infoext_virtual_link_infoext_managed_virtual_link_infovnfc_resource_infovnf_virtual_link_resource_infovirtual_storage_resource_info 列的 json 数据类型,将包含 json 数据。在将数据保存到 DB 时,版本对象将被序列化并存储为 json,在从 DB 检索它时,json 数据将被反序列化以创建版本对象。

REST API 影响

将添加以下 restFul API

  • 名称: 创建 VNF 标识符
    描述: 创建新的 VNF 实例资源
    方法类型: POST
    资源的 URL:/vnflcm/v1/vnf_instances
    请求:

    数据类型

    基数

    描述

    CreateVnfRequest

    1

    VNF 创建参数。

    属性名称

    数据类型

    基数

    在 (U) 中支持

    vnfdId

    标识符

    1

    vnfInstanceName

    字符串

    0..1

    vnfInstanceDescription

    字符串

    0..1

    metadata

    KeyValuePairs

    0..1

    响应:

    数据类型

    基数

    响应代码

    描述

    VnfInstance

    1

    成功 201 错误 400 401 403

    已成功创建 VNF 实例标识符。

  • 名称:查询 VNF
    描述:通过其 id 请求现有 VNF 实例资源
    方法类型: GET
    资源的 URL:/vnflcm/v1/vnf_instances/{vnfInstanceId}
    此资源的资源 URI 变量:

    名称

    描述

    vnfInstanceId

    VNF 实例的标识符。

    响应:

    数据类型

    基数

    响应代码

    描述

    VnfInstance

    1

    成功:200 错误:401、403 404

    成功查询了单个 VNF 实例的信息。

  • 名称:列出 VNF 实例
    描述:请求列出所有现有的 VNF 实例
    方法类型: GET
    资源的 URL:/vnflcm/v1/vnf_instances
    响应:

    数据类型

    基数

    响应代码

    描述

    VnfInstance

    0..N

    成功:200 错误:401、403

    成功查询了零个或多个 VNF 实例的信息。

    属性名称

    数据类型

    基数

    在 (U) 中支持

    id

    标识符

    1

    vnfInstanceName

    字符串

    0..1

    vnfInstanceDescription

    字符串

    0..1

    vnfdId

    标识符

    1

    vnfProvider

    字符串

    1

    vnfProductName

    字符串

    1

    vnfSoftwareVersion

    版本

    1

    vnfdVersion

    版本

    1

    vnfConfigurableProperties

    KeyValuePairs

    0..1

    vimConnectionInfo

    VimConnectionInfo

    0..N -> 0..1

    instantiationState

    Enum

    1

    instantiatedVnfInfo

    结构

    0..1

    >flavourId

    IdentifierInVnfd

    1

    >vnfState

    VnfOperationalStateType

    1

    >scaleStatus

    ScaleInfo

    0..N

    >extCpInfo

    VnfExtCpInfo

    1..N

    >extVirtualLinkInfo

    ExtVirtualLinkInfo

    0..N

    >extManagedVirtualLinkInfo

    ExtManagedVirtualLinkInfo

    0..N

    >monitoringParameters

    MonitoringParameter

    0..N

    >localizationLanguage

    字符串

    0..1

    >vnfcResourceInfo

    VnfcResourceInfo

    0..N

    >vnfVirtualLinkResourceInfo

    VnfVirtualLinkResourceInfo

    0..N

    >virtualStorageResourceInfo

    VirtualStorageResourceInfo

    0..N

    metadata

    KeyValuePairs

    0..1

    extensions

    KeyValuePairs

    0..1

    _links

    结构

    1

    >self

    链接

    1

    >indicators

    链接

    0..1

    >instantiate

    链接

    0..1

    >terminate

    链接

    0..1

    >scale

    链接

    0..1

    >scaleToLevel

    链接

    0..1

    >changeFlavour

    链接

    0..1

    >heal

    链接

    0..1

    >operate

    链接

    0..1

    >changeExtConn

    链接

    0..1

  • 名称:删除 VNF 实例
    描述:通过其 id 请求删除 VNF 实例资源
    方法类型:DELETE
    资源的 URL:/vnflcm/v1/vnf_instances/{vnfInstanceId}
    此资源的资源 URI 变量:

    名称

    描述

    vnfInstanceId

    VNF 实例的标识符。

    响应:

    数据类型

    基数

    响应代码

    描述

    n/a

    成功:204 错误:401、403 404

    VNF 实例资源和关联的 VNF 标识符已成功删除。

  • 名称:实例化 VNF 任务
    描述: 此任务资源表示“实例化 VNF”操作。客户端可以使用此资源来实例化 VNF 实例。
    方法类型: POST
    资源的 URL:/vnflcm/v1/vnf_instances/{vnfInstanceId}/instantiate
    此资源的资源 URI 变量:

    名称

    定义

    vnfInstanceId

    要实例化的 VNF 实例的标识符。

    请求:

    数据类型

    基数 | 描述

    InstantiateVnfRequest

    1 | 传递给实例化任务的参数。

    属性名称

    数据类型

    基数

    在 (U) 中支持

    描述

    flavourId

    IdentifierInVnfd

    1

    要实例化的 VNF 部署 flavor 的标识符。

    instantiationLevelId

    IdentifierInVnfd

    0..1

    要实例化的部署 flavor 的实例化级别的标识符。如果未提供,则实例化 VNFD 中声明的默认实例化级别。

    extVirtualLinks

    ExtVirtualLinkData

    0..N

    有关连接到 VNF 的外部 VL 的信息。

    vimConnectionInfo

    VimConnectionInfo

    0..N -> 0..1

    用于管理 VNF 实例资源的 VIM 连接信息。在 U 发布版中,仅接受 0..1 VIMConnectionInfo。

    additionalParams

    KeyValuePairs

    0..1

    用于实例化过程的附加输入参数,特定于正在实例化的 VNF。

    extManagedVirtualLinks

    ExtManagedVirtualLinkData

    0..N

    localizationLanguage

    字符串

    0..1

    extensions

    KeyValuePairs

    0..1

    响应:

    数据类型

    基数

    响应代码

    描述

    n/a

    成功:202 错误:400、401 403、404、409

    请求已被接受处理,但处理尚未完成。

  • 名称:修复 VNF 任务
    描述:请求修复 VNF 实例
    方法类型: POST
    资源的 URL:/vnflcm/v1/vnf_instances/{vnfInstanceId}/heal
    此资源的资源 URI 变量:

    名称

    描述

    vnfInstanceId

    要修复的 VNF 实例的标识符。

    请求:

    数据类型

    基数

    描述

    HealVnfRequest

    1

    修复 VNF 操作的参数。

    属性名称

    数据类型

    基数

    在 (U) 中支持

    描述

    vnfcInstanceId

    标识符

    0..N

    cause

    字符串

    0..1

    additionalParams

    KeyValuePairs

    0..1

    响应:

    数据类型

    基数

    响应代码

    描述

    n/a

    n/a

    成功:202 错误:401、403 404、409

    请求已被接受处理,但处理尚未完成。

  • 名称: 终止 VNF 任务
    描述: 此任务资源表示“终止 VNF”操作。客户端可以使用此资源来终止 VNF 实例。
    方法类型: POST
    资源的 URL:/vnflcm/v1/vnf_instances/{vnfInstanceId}/terminate
    此资源的资源 URI 变量:

    名称

    描述

    vnfInstanceId

    要终止的 VNF 实例的标识符。

    请求:

    数据类型

    基数 | 描述

    TerminateVnfRequest | 1 | 传递给终止 VNF 任务的参数。

    属性名称

    数据类型

    可能的值

    基数

    支持

    描述

    terminationType

    Enum (内联)

    FORCEFUL GRACEFUL

    1

    指示请求强制终止还是优雅终止。FORCEFUL:VNFM 将立即关闭 VNF 并释放资源。GRACEFUL:VNFM 将首先安排将 VNF 退出服务。一旦完成退出服务操作,它将等待 gracefulTerminationTimeout 中指定的时间,然后 VNFM 将关闭 VNF 并释放资源。

    additionalParams

    KeyValuePairs

    0..1

    终止过程的附加参数,特定于正在终止的 VNF。

    gracefulTerminationTimeout

    Integer

    0..1

    此属性仅在优雅终止的情况下适用。它定义了在关闭 VNF 并释放资源之前等待 VNF 退出服务的时间。单位是秒。

    响应:

    数据类型

    基数

    响应代码

    描述

    n/a

    成功:202 错误:400、401 403、404、409

    请求已被接受处理,但处理尚未完成。

  • 未来工作

    1. 扩展 VNF 任务

    2. 操作 VNF 任务

    3. VNF LCM 操作发生情况

    4. 单个 VNF LCM 操作发生情况

安全影响

通知影响

其他最终用户影响

在 Tacker-server 中添加新的 OSC 命令以调用 VNF 实例的 VNF 生命周期管理 API。

名称

方法

URI

CLI Openstack

列出 vnf 实例

GET

/vnflcm/v1/vnf_instances

vnflcm list

创建 vnf 实例

POST

/vnflcm/v1/vnf_instances | vnflcm list

vnflcm create

获取 vnf 实例

GET

/vnflcm/v1/vnf_instances/{vnfInstanceID}

vnflcm show

删除 vnf 实例

DELETE

/vnflcm/v1/vnf_instances/{vnfInstanceID}

vnflcm delete

实例化 vnf 任务

POST

/vnflcm/v1/vnf_instances/{vnfInstanceID}/instantiate

vnflcm instantiate

修复 vnf 任务

POST

/vnflcm/v1/vnf_instances/{vnfInstanceID}/heal

vnflcm heal

终止 vnf 任务

POST

/vnflcm/v1/vnf_instances/{vnfInstanceID}/terminate

vnflcm terminate

性能影响

其他部署者影响

先前创建的 VNF 将不允许使用新引入的 API 进行管理。

开发人员影响

实现

负责人

主要负责人

Keiko Kuriu <keiko.kuriu.wa@hco.ntt.co.jp>

其他贡献者

Hiroyuki Jo <hiroyuki.jo.mt@hco.ntt.co.jp>

Tushar Patil <tushar.vitthal.patil@gmail.com>

Nitin Uikey <nitin.uikey@nttdata.com>

Ajay Parja <Ajay.Parja@nttdata.com>

Shubham Potale <Shubham.Potale@nttdata.com>

工作项

  • 为 VNF 实例的 VNF 生命周期管理添加新的 REST API 端点到 Tacker-server。

  • 修改 Heat-translator 以翻译 Tosca 模板版本 1.2 中引入的新节点类型。

  • 修改 python-tackerclient 以添加新的 OSC 命令,用于调用 VNF 实例的 RESTful API 进行 VNF 生命周期管理。

  • 添加后处理以提取有关 API 请求主体的相关信息。

  • 添加新的单元和功能测试。

  • 更改 API Tacker 文档。

依赖项

测试

将为 VNF 实例的 VNF 生命周期管理添加单元和功能测试用例。

文档影响

将添加完整的用户指南,以说明如何使用示例调用 VNF 实例的 VNF 生命周期管理。

参考资料