基于 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 实例资源创建流程¶
该过程包括以下步骤,如图所示
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 实例实例化流程¶
该过程包括以下步骤,如图所示
在 VNF 的预实例化过程中,VNFM 将使用 Glance 客户端创建 VNFD 中给定的部署 flavor 中描述的镜像。根据 ETSI NFV 文档,NFVO 应持有镜像信息并直接向 VIM 注册镜像,然后 NFVO 应通过 Grant API 向 VNFM 提供镜像 ID,但在
U发布版中,VNFM 将直接向 VIM 注册镜像。Openstack 驱动程序将使用 Heat 创建堆栈,并等待其状态变为 CREATE_COMPLETE。
VnfLcmDriver 将更新 DB,将 instantiatedState 设置为
INSTANTIATED,vnf_state 设置为STARTED,并相应地将 vnf 包 usage_state 设置为IN_USE。
注意
假定外部网络(例如 extVirtualLinks、extLinkPorts 和 extManagedVirtualLinks)由客户创建。根据 ETSI NFV 文档,这些网络应由 NFVO 创建,但是,与 NFVO 相关的函数将是未来的工作。因此,Tacker 不会创建外部网络。
3) VNF 实例修复流程¶
先决条件:VNF 实例处于“INSTANTIATED”状态。
该过程包括以下步骤,如图所示
Consumer 向“HEAL VNF 实例”资源发送 POST 请求。
OpenstackDriver 将根据 HEAL 请求向 HEAT 发送请求以将资源标记为不健康。
OpenstackDriver 将向 HEAT 发送请求以更新堆栈。
OpenstackDriver 将向 HEAT 发送请求以获取堆栈的更新资源数据。
VnfLcmDriver 将更新 DB 中的更新资源详细信息。
后置条件:VNF 实例处于“INSTANTIATED”状态,并且已修复。
4) VNF 实例终止流程¶
该过程包括以下步骤,如图所示
Consumer 向“Terminate VNF 实例”资源发送 POST 请求。
OpenstackDriver 将使用 Heat 删除堆栈。
在实例化期间创建的镜像将被删除。
前置条件:“instantiationState”应设置为“NOT_INSTANTIATED”。
5) VNF 实例资源删除流程¶
前置条件:VNF 实例处于 NOT_INSTANTIATED 状态。
该过程包括以下步骤,如图所示
Consumer 向“Individual VNF 实例”资源发送 DELETE 请求。
VNFM 删除 VNF 实例资源和关联的 VNF 实例标识符。
VNFM 返回一个“204 No Content”响应,其中包含一个空有效负载主体。
前置条件:VNF 实例资源已删除。
- 错误处理:如果“Individual VNF 实例”资源不在
NOT_INSTANTIATED 状态,VNFM 将拒绝删除请求。
支持 SOL001 VNFD TOSCA 服务模板的子集¶
我们计划提供在 NFV-SOL001 中定义的 VNFD TOSCA 服务模板的有限支持
支持的数据类型¶
tosca.datatypes.nfv.ConnectivityType
tosca.datatypes.nfv.VirtualMemory
tosca.datatypes.nfv.VirtualCpu
tosca.datatypes.nfv.VduProfile
tosca.datatypes.nfv.VlProfile
tosca.datatypes.nfv.InstantiationLevel
tosca.datatypes.nfv.VduLevel
tosca.datatypes.nfv.ScaleInfo
tosca.datatypes.nfv.ScalingAspect
tosca.datatypes.nfv.LinkBitrateRequirements
tosca.datatypes.nfv.VnfAdditionalConfigurableProperties
tosca.datatypes.nfv.SwImageData
tosca.datatypes.nfv.VirtualBlockStorageData
tosca.datatypes.nfv.VirtualLinkBitrateLevel
tosca.datatypes.nfv.ChecksumData
支持的工件类型¶
tosca.artifacts.nfv.SwImage
支持的能力类型¶
tosca.capabilities.nfv.VirtualBindable
tosca.capabilities.nfv.VirtualLinkable
tosca.capabilities.nfv.VirtualCompute
tosca.capabilities.nfv.VirtualStorage
支持的接口类型¶
tosca.interfaces.nfv.Vnflcm
支持的节点类型¶
tosca.nodes.nfv.VNF
tosca.nodes.nfv.Vdu.Compute
tosca.nodes.nfv.Vdu.VirtualBlockStorage
tosca.nodes.nfv.VduCp
tosca.nodes.nfv.VnfVirtualLink
支持的策略类型¶
tosca.policies.nfv.InstantiationLevels
tosca.policies.nfv.VduInstantiationLevels
tosca.policies.nfv.VirtualLinkInstantiationLevels
tosca.policies.nfv.ScalingAspects
tosca.policies.nfv.VduScalingAspectsDeltas
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_state为ERROR的 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_info、ext_cp_info、ext_virtual_link_info、ext_managed_virtual_link_info、vnfc_resource_info、vnf_virtual_link_resource_info、virtual_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
请求已被接受处理,但处理尚未完成。
未来工作
扩展 VNF 任务
操作 VNF 任务
VNF LCM 操作发生情况
单个 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 生命周期管理。
参考资料¶
https://portal.etsi.org/Portals/0/TBpages/CTI/Docs/2nd_ETSI_NFV_Plugtests_Report_v1.0.0.pdf