支持 Tacker 中的 VNF 包 (TOSCA CSAR)¶
https://blueprints.launchpad.net/tacker/+spec/tosca-csar-mgmt-driver
本文档描述了在 Tacker 中入板 VNF 包。
问题描述¶
目前,Tacker 能够使用 YAML 格式的文件入板 VNF 描述符。VNF 包尚不支持(但可以在 horizon-tacker 中使用带有 ‘csar’,云服务归档,扩展名的文件)。
云服务归档 (CSAR) 是在 TOSCA-Simple-Profile-YAML-v1.2 [1] 中描述的一种包,VNF 包在 ETSI GS NFV-SOL 004 [2] 中扩展了 CSAR 用于 NFV。TOSCA 简单配置定义以及所有附带的工件(例如脚本、二进制文件、配置文件)可以打包到一个 CSAR 文件中。
CSAR 文件是使用 ZIP 文件格式的归档文件,其结构符合 TOSCA Simple Profile YAML v1.1 规范。CSAR 文件可以具有以下两种结构之一
包含 TOSCA-Metadata 目录的 CSAR,其中包含 TOSCA.meta 元数据文件,该文件提供了一个入口信息,用于处理 CSAR 文件,如 TOSCA v1.0 规范中所定义。
包含位于归档根目录的单个 yaml (.yml 或 .yaml) 文件的 CSAR。yaml 文件是 TOSCA 定义模板,其中包含一个包含 template_name 和 template_version 元数据的元数据部分。此文件是 CSAR 入口定义文件。
VNF 包还应包含 VNFD 和许多额外的文件,这些文件对于成功部署或在 TOSCA 模板和配置中使用是必需的
提供给 TOSCA 编排器入口信息的元数据文件
VNFD 文件作为 VNF 的主要 TOSCA 定义
清单文件是决定 VNF 包完整性和有效性(就其包含的工件而言)的关键。
描述 VNF 包任何更改的更改历史文件
已发布 VNF 的许可信息
虚拟机镜像
配置工件
监控配置
测试文件
认证文件
非 MANO 工件集
VNF 包对于包含大量工件、安全敏感数据等的大多数 VNF 和 NS 来说至关重要。缺乏对 VNF 包的支持使得 Tacker 与大多数现代 VNF 描述符不兼容。
这里的目标是在 Tacker 中实现该功能,并提供用于入板和部署 VNF 包文件的接口。
提议的变更¶
为了适应此新功能,Tacker 需要进行的更改将包括以下组件的更改
Tacker API 服务:添加用于管理 VNF csar 包的新 API。
TOSCA-Parser:Tosca-parser 支持读取 CSAR 包。对解析器进行适当的更改,以根据 tosca 简单定义版本 1.2 创建拓扑模板对象。
添加新的命令以使用 python-openstackclient 支持管理 VNF csar 包。
Tacker-horizon:添加一个新的界面以支持管理 VNF csar 包。
Tacker-conductor 服务:上传和处理 vnf 包将由 tacker-conductor 服务完成。当在控制器节点上由 tacker API 服务接收到上传 VNF 包的请求时,上传和提取 CSAR 文件的责任将通过新的 RPC API 调用分配给 tacker-conductor 服务。CSAR 文件将上传到 glance 存储(在多个控制器节点部署的情况下,我们需要使 csar 文件在所有节点上可用),稍后将从 glance 存储下载并提取到可以使用新的配置选项
vnf_package_csar_path进行配置的路径中,以便后续调用以获取 VNF 包无需一遍又一遍地从 glance_store 下载 CSAR 文件。
注意
在 tacker.conf 中,将添加一个新的部分 glance_store 以配置用于存储 vnf 包 csar zip 文件的后端。如果将 default_store 设置为 filesystem 或 file,我们建议在计划在多个控制器节点上部署 tacker API 和 tacker-conductor 服务的情况下,配置 filesystem_store_datadir 选项在共享存储上。
更改包括
根据 ETSI GS NFV-SOL 005 规范 [3] 实现 VNF 包文件的两阶段入板
创建一个新的单独 VNF 包资源。
通过提供 VNF 包的内容来上传 VNF 包。
支持根据 ETSI GS NFV-SOL 005 [3] 规范获取和删除 VNF 包的新端点。
添加在 Tacker 中使用 VNF 包进行入板和部署的能力
修改 Tacker-horizon:添加一个字段以指定用户定义的数据(例如管理驱动程序),并将南向 API 更改为新的端点。
在 python-openstackclient 中添加新命令以使用新的 Tacker-server REST API。
对 Tacker-server 进行必要的更改。
+------------+ +--------------+ +---------------+
| | | | | |
| VNF | | | | Tacker |
| Package +---------> Horizon +---------> Client |--+
| | | | | | |
+------------+ +--------------+ +-------+-------+ |
| |
+--------------------------------+ | |
| Tacker | | |
| +------------+ | | |
| | <---------------|----------------------+ |
| | REST | |1. POST /vnfpkgm/v1/vnf_packages |
| | Controller | | |
| | <---------------|---------------------------------+
| +--+---------+ |2. PUT /vnfpkgm/v1/vnf_packages/{vnfPkgId}/package_content
| | |
| | |
| | +--------------------+ |
| | | NFVO Plugin | | +----------------------+
| | | +----------------+ | | | Libraries |
| +----> create_package | | | | +--------------+ |
| | | +----------------+ | | | | TOSCA | |
| | | +-------------> PARSER | |
| | | +----------------+ | | | +--------------+ |
| +----> upload_content | | | +----------------------+
| | +----------------+ | |
| +--------------------+ |
+--------------------------------+
VNF 包状态模型¶
VNF 包有三种状态,即 onboardingState、operationalState 和 usageState。
onboardingState 可以取以下值:
CREATED:已创建 VNF 包信息对象。
UPLOADING:VNF 包正在上传。
PROCESSING:VNF 包正在处理中,例如验证。
ONBOARDED:VNF 包已成功入板。
operationalState 可以取以下值:
ENABLED:VNF 包已启用。
DISABLED:VNF 包已禁用。
usageState 可以取以下值:
IN_USE:VNF 包正在使用中。
NOT_IN_USE:VNF 包未在使用中。
请参阅 ETSI GS NFV-SOL 005 [3] 图 B.2.2-1,了解这三种状态的状态转换。
上传 VNF 包内容流程¶
先决条件:已使用“onboardingState”属性等于“CREATED”创建了单独的 VNF 包资源。
如上图序列图所示,上传 VNF 包的内容包括以下步骤:
客户端向“VNF 包内容”资源发送 PUT 请求,并在有效负载主体中包含 VNF 包内容的副本。
CSAR 文件将使用 tosca-parser 进行验证。如果发现任何错误,则将引发 400 错误。
如果验证成功,NFVO 将返回“202 Accepted”响应和一个空有效负载主体。
NFVO 继续处理 VNF 包,用所需的信息填充各种数据库表。
后置条件:成功完成后,VNF 包的内容将被入板。VNF 包的状态将更改如下: “onboardingState”属性的值等于“ONBOARDED”, “operationalState”属性的值等于“ENABLED”,以及 “usageState”属性的值等于“NOT_IN_USE”。
错误处理:如果发生故障,将在响应中提供适当的错误信息。
注意
当用户使用上传的 VNF 包实例化 VNF 时,将创建镜像和风味。
当用户上传 CSAR package_contents 时,它将被提取到将使用新的配置选项 vnf_package_csar_path 进行配置的文件夹中。在此文件夹内,它将创建一个名称等于上传包的 vnfPkgId 的新文件夹。包内容详细信息将存储在数据库模式中,不包括如 数据模型影响 中所述的实际文件。CSAR 文件内容将使用 glance_store 库存储,该库支持各种存储,例如 Swift、FileSystem、HTTP、Ceph 等。CSAR 文件提取到可配置路径后,将保留在那里直到删除 vnf_package。如果 vnf_package 内容不存在于可配置路径中,它将从 glance_store 获取 csar zip 文件并提取它以供可配置路径中的进一步处理。
+----------------------------+
| Server file storage |
|----------------------------|
| |
| /var/lib/tacker/<vnfPkgId> |
| -- TOSCA-Metadata |
| -- definitions |
| -- implementations |
| -- ... |
+----------------------------+
数据模型影响¶
在 ‘tacker’ 数据库中添加以下新表。相应的模式如下详细说明:-
- vnf_packages:
id varchar(36) Pri
onboarding_state varchar(255) NOT NULL
operational_state varchar(255) NOT NULL
usage_state varchar(255) NOT NULL
created_at datetime NOT NULL
updated_at datetime NULL
deleted_at datetime NULL
deleted tinyint(1) NULL
tenant_id varchar(64) NOT NULL
algorithm varchar(64) NULL
hash text varchar(128) NULL
location_glance_store text NULL
此表将以 id 作为主键。
- vnf_packages_user_data:
id int(11) Pri, auto_increment
package_uuid varchar(36) NOT NULL
key varchar(255) NOT NULL
value varchar(255) NOT NULL
created_at datetime NOT NULL
updated_at datetime NULL
deleted_at datetime NULL
deleted tinyint(1) NULL
此表将以 id 作为主键。package_uuid 将是 vnf_packages.`id` 的外键。
- vnf_package_vnfd:
id int(11) Pri, auto_increment
package_uuid varchar(36) NOT NULL
vnfd_id varchar(36) Unique, NOT 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
created_at datetime NOT NULL
updated_at datetime NULL
deleted_at datetime NULL
deleted tinyint(1) NULL
此表将以 id 作为主键。package_uuid 将是 vnf_packages.`id` 的外键。
- 注意:
现有的 vnfd 数据库表将不会在此处使用。当 VNF 包上传时,它将读取 VNFD 文件并将基本信息存储在此表中,例如
vnf_product_name、vnf_software_version等,这些信息可以在用户查询单个 VNF 包信息时返回,而无需从 VNF 包文件中读取该特定信息
- vnf_deployment_flavours:
id varchar(36) Pri, NOT NULL
package_uuid varchar(36) NOT NULL
flavour_id varchar(255) NOT NULL
flavour_description text NOT NULL
instantiation_levels text NULL
created_at datetime NOT NULL
updated_at datetime NULL
deleted_at datetime NULL
deleted tinyint(1) NULL
此表将以 id 作为主键。package_uuid 将是 vnf_packages.`id` 的外键。
- vnf_software_images:
id varchar(36) Pri, NOT NULL
software_image_id varchar(255) NOT NULL # VDU 名称
flavour_uuid varchar(36) NOT NULL
name varchar(255) NOT NULL
provider varchar(255) NOT NULL
version varchar(255) NOT NULL
algorithm varchar(64) NOT NULL
hash text varchar(128) NOT NULL
container_format varchar(20) NOT NULL
disk_format varchar(20) NOT NULL
min_disk int(11) NOT NULL
min_ram int(11) NOT NULL
size bigint(20) NOT NULL
image_path text NOT NULL
created_at datetime NOT NULL
updated_at datetime NULL
deleted_at datetime NULL
deleted tinyint(1) NULL
此表将以 id 作为主键。flavour_uuid 将是 vnf_deployment_flavours.`id` 的外键。
- vnf_software_image_metadata:
id int(11) Pri, auto_increment
image_uuid varchar(36) NOT NULL
key varchar(255) NOT NULL
value varchar(255) NOT NULL
created_at datetime NOT NULL
updated_at datetime NULL
deleted_at datetime NULL
deleted tinyint(1) NULL
此表将以 id 作为主键。image_uuid 将是 vnf_software_images.`id 的外键。
升级 tacker 数据库到 HEAD 版本¶
tacker-db-manage --config-file /etc/tacker/tacker.conf upgrade HEAD
REST API 影响¶
将添加以下新的 RestFul API:-
资源名称 |
资源 URI |
HTTP 方法 |
含义 |
响应代码 |
|---|---|---|---|---|
VNF 包 |
/vnfpkgm/v1/vnf_packages |
GET |
查询 VNF 包信息 |
成功:200 错误:401、403 |
POST |
创建一个新的单独 VNF 包资源 |
成功:201 错误:400、401、403 |
||
单个 VNF 包 |
/vnfpkgm/v1/vnf_packages/{vnfPkgId} |
GET |
读取单个 VNF 包的信息 |
成功:200 错误:401、403、404 |
DELETE |
删除单个 VNF 包 |
成功:204 错误:401、302、404 |
||
VNF 包内容 |
/vnfpkgm/v1/vnf_packages/{vnfPkgId}/package_content |
PUT |
通过提供 VNF 包的内容来上传 VNF 包 |
成功:202 错误:401、403、404、409 |
从 URI 任务上传 VNF 包 |
/vnfpkgm/v1/vnf_packages/{vnfPkgId}/package_content /upload_from_uri |
POST |
通过提供 VNF 包的地址信息来上传 VNF 包 |
成功:202 错误:401、403、404、409 |
其他最终用户影响¶
将添加以下新的 OpenStackClient 命令以管理 VNF 包。
openstack vnf package create
openstack vnf package list
openstack vnf package show
openstack vnf package upload
openstack vnf package delete
其他部署者影响¶
api-paste.ini 中的更改¶
[composite:tacker]
/vnfpkgm/v1: vnfpkgmapi_v1
[composite:vnfpkgmapi_v1]
use = call:tacker.auth:pipeline_factory
noauth = request_id catch_errors extensions vnfpkgmapp_v1
keystone = request_id catch_errors authtoken keystonecontext extensions vnfpkgmapp_v1
[app:vnfpkgmapp_v1]
paste.app_factory = tacker.api.vnfpkgm.v1.router:VnfpkgmAPIRouter.factory
tacker.conf 中的更改¶
[DEFAULT]
vnf_package_delete_interval = 1800
[vnf_package]
vnf_package_csar_path = /var/lib/tacker/vnfpackages/
[glance_store]
default_backend = file
filesystem_store_datadir = /var/lib/tacker/csar_files
policy.json 中的更改¶
将添加以下默认策略,用于新添加的 restFul API。如果您想自定义这些策略,则必须编辑 policy.json 文件。
# Creates a vnf package.
# POST /vnf_packages
# "os_nfv_orchestration_api:vnf_packages:create": "rule:admin_or_owner"
# Show a vnf package.
# GET /vnf_packages/{vnf_package_id}
# "os_nfv_orchestration_api:vnf_packages:show": "rule:admin_or_owner"
# List all vnf packages.
# GET /vnf_packages/
# "os_nfv_orchestration_api:vnf_packages:index": "rule:admin_or_owner"
# Delete a vnf package.
# DELETE /vnf_packages/{vnf_package_id}
# "os_nfv_orchestration_api:vnf_packages:delete": "rule:admin_or_owner"
# upload a vnf package content.
# PUT /vnf_packages/{vnf_package_id}/package_content
# "os_nfv_orchestration_api:vnf_packages:upload_package_content": "rule:admin_or_owner"
# upload a vnf package content from uri.
# POST /vnf_packages/{vnf_package_id}/package_content/upload_from_uri
# "os_nfv_orchestration_api:vnf_packages:upload_from_uri": "rule:admin_or_owner"
实现¶
负责人¶
- 主要负责人
Hiroyuki Jo <hiroyuki.jo.mt@hco.ntt.co.jp>
- 其他贡献者
Tushar Patil <tushar.vitthal.patil@gmail.com> Niraj Singh <niraj.singh@nttdata.com> Neha Alhat <neha.alhat@nttdata.com>>
工作项¶
添加新的入板 REST API 端点到 Tacker-server
支持存储存储在本地文件系统中的解包 VNF 包
TOSCA-Parser:添加使用 CSAR 包作为 ToscaTemplate init 方法的参数的能力
添加新的插件以支持管理 VNF 包
Tacker-horizon 和 python-openstackclient 的更改,以使用新的 API
添加单元和功能测试用例,用于入板 VNF 包
提供用户文档和开发人员文档,解释新的入板流程
依赖项¶
无
测试¶
将添加单元和功能测试用例,用于入板 VNF 包。
文档影响¶
将添加完整的用户指南,以解释如何处理 VNF 包。