支持 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 文件可以具有以下两种结构之一

  1. 包含 TOSCA-Metadata 目录的 CSAR,其中包含 TOSCA.meta 元数据文件,该文件提供了一个入口信息,用于处理 CSAR 文件,如 TOSCA v1.0 规范中所定义。

  2. 包含位于归档根目录的单个 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 包内容流程

../../_images/0110.png

先决条件:已使用“onboardingState”属性等于“CREATED”创建了单独的 VNF 包资源。

如上图序列图所示,上传 VNF 包的内容包括以下步骤:

  1. 客户端向“VNF 包内容”资源发送 PUT 请求,并在有效负载主体中包含 VNF 包内容的副本。

  2. CSAR 文件将使用 tosca-parser 进行验证。如果发现任何错误,则将引发 400 错误。

  3. 如果验证成功,NFVO 将返回“202 Accepted”响应和一个空有效负载主体。

  4. 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_namevnf_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 包。

参考资料