ETSI NFV SOL004 の歩き方

これは、[通信業界アドベントカレンダー 2021](https://qiita.com/advent-calendar/2021/telecom) の4日目の記事です。

* この記事に含まれるもの:
    * VNF Package の概要の解説
    * VNF Package のファイル構成の解説
    * VNF Packageに含まれるファイルの記述ルールの解説

* この記事に含まれないもの:
    * VNF Package における署名、証明書の詳細
    * PNFD の解説

<!--

「通信業界アドベントカレンダー 2021」の記事が更新されたリンクを追記予定。

ETSI NFV SOLドキュメントの理解には、下記も併せて読むことをオススメします。

* [ETSI NFV SOL001の歩き方]()
* [ETSI NFV SOL003の歩き方]()
* [ETSI NFV SOL005の歩き方]()
* [ETSI NFV SOL013の歩き方]()

-->

## ETSI NFV SOL004 とは？

ETSI NFV SOL004 には、VNF Package と PNF Descriptor (PNFD) archive の仕様が記述されています。特に VNF Package は、Virutal Network Function (VNF) をデプロイする上で欠かせないリソースである一方で、仕様の多くが Topology and Orchestration Specification for Cloud Applications (TOSCA) を参照しているため、初学者には非常に難解に感じられると思います。

本記事は、ETSI NFV SOL004 から主に VNF Package に関する重要な記述を紹介しながら、読者が VNF Package を作成できるようになることを目指します。

### リリースバージョン

本記事の執筆時 (2021/11/19) における ETSI NFV SOL004 の最新バージョンは、V3.5.1 です。2017年に初版となる V2.3.1 がリリースされ、その後、V2.4.1、V2.5.1、V2.6.1、V2.7.1、V2.8.1、V3.3.1 と更新され、2021年5月に最新バージョンの V3.5.1 が公開されています。

* [ETSI GS NFV-SOL 004 V3.5.1 (2021-05)](https://www.etsi.org/deliver/etsi_gs/NFV-SOL/001_099/004/03.05.01_60/gs_nfv-sol004v030501p.pdf)

## VNF Package とは？

### ETSI NFV における定義

VNF Package が何たるか、の仕様は ETSI NFV 003 と ETSI NFV IFA011 に記述されています。厳密な仕様そのものは後述しますが、超ざっくりとまとめると次のようなものです：

* VNFD とイメージ、その他関連ファイルで構成される
* 誰が作っても、どこのNFV基盤でも使えて、様々なVNF構成に柔軟に対応可能である

ETSI NFV 003 (Terminology for Main Concepts in NFV) では、VNF Package を下記のように説明しています。

* [ETSI GS NFV 003 V1.4.1 (2018-08)](https://www.etsi.org/deliver/etsi_gs/NFV/001_099/003/01.04.01_60/gs_nfv003v010401p.pdf)

    > **Virtualised Network Function Package (VNF Package):** archive that includes a VNFD, the software image(s) associated with the VNF, as well as additional artefacts, e.g. to check the integrity and to prove the validity of the archive 

    愚直に日本語訳すれば、「VNF に紐づく VNFD やイメージ、artefact（関連ファイル：例えば、完全性や有効性を確認するための署名や証明書）を含めたアーカイブファイル」といったところでしょうか。

ETSI NFV IFA 011 (VNF Descriptor and Packaging Specification) では、VNF Package を次のように定めています。

* [ETSI GS NFV-IFA 011 V4.2.1 (2021-05)](https://www.etsi.org/deliver/etsi_gs/nfv-ifa/001_099/011/04.02.01_60/gs_nfv-ifa011v040201p.pdf)

    > A VNF Package contains all of the required files and meta-data descriptors required to validate and instantiate a VNF. Standardized meta-data descriptors are required to:
    > • describe the NFV infrastructure resource requirements for a VNF in a service provider environment;
    > • describe design constraints and other dependencies in order for the VNF to successfully install, instantiate and terminate; and
    > • describe VNF operational behaviour including VNF lifecycle events (e.g. scaling, upgrading).

    「VNF Package は、VNF を検証し起動するために必要なすべてのファイルとメタデータファイルで構成される。メタデータファイルは、サービスプロバイダの環境下における VNF の NFV 基盤に対するリソース要件、VNF を正しくインストール・起動・停止するために必要な構成における制約や他の依存関係、スケールやアップグレード等の VNF ライフサイクルの振る舞い、を記述する。」

    > Standardized packaging and validation of VNFs is required to:
    > • provide a consistent, documented method for VNF providers to package VNFs;
    > • harmonize the service provider on-boarding process for VNFs coming from different VNF providers;
    > • ensure integrity, trust and auditability of a VNF Package;
    > • allow for a flexible and extensible VNF packaging structure that accommodates a wide variety of NFV infrastructure scenarios; and
    > • allow the packaged VNF-related meta-data to be interpreted and the packaged VNF to be instantiated in a wide variety of orchestration systems irrespective of technology choice or infrastructure environment. 

    「VNF プロバイダが 一貫性をもって VNF をパッケージ化でき、異なる VNF プロバイダから提供された VNF をサービスプロバイダが共存して運用でき、VNF Packageの完全性や信頼性および可監査性が担保でき、NFV 基盤の多様なシナリオに適用可能な柔軟性や拡張性を持ち、メタデータを使うことで多様なオーケストレーションシステムを使って VNF を起動可能な環境非依存であるような、VNF のパッケージ化および検証方法である必要がある。」というように、かなり欲張った仕様が述べられています。

本記事の主題である ETSI NFV SOL004 には VNF Package 定義が述べられておらず、VNF Package の実体である TOSCA YAML Cloud Service Archive (CSAR) の概要から記述が始まります。

### VNF Package の実体（CSAR 形式の ZIP ファイル）

VNF Package の実体は、TOSCA YAML Cloud Service Archive (CSAR) という形式のフォルダ、ファイル構成を持った ZIP ファイルです。ETSI NFV SOL004 は、VNF Package の仕様のほとんどを TOSCA の仕様を参照し、それを利用ないし拡張することで仕様を記述しています。

CSAR 形式は、TOSCA Version 1.0 の 16 章で定義され、その後、TOSCA Simple Profile in YAML（最新バージョンは 1.3）の 6 章で定義が拡張されています（TOSCA Version 1.0 と TOSCA Simple Profile in YAML は名前が似ていますが異なるドキュメントであることに注意してください）。

* [Topology and Orchestration Specification for Cloud Applications (TOSCA) Version 1.0](http://docs.oasis-open.org/tosca/TOSCA/v1.0/TOSCA-v1.0.html)
* [TOSCA Simple Profile in YAML v1.3](https://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.3/TOSCA-Simple-Profile-YAML-v1.3.html)

ETSI NFV SOL004 は、この CASR 形式の ZIP ファイルが具体的にどういうファイル構成をとりうるのか、それぞれのファイルがどのように記述されるべきか、が定められています。次章以降では、実際のETSI NFV SOL004 の章立てに沿って、重要なポイントを解説していきます。

## ETSI NFV SOL004 の解説

ドキュメントの全体像

* 1-3 章: スコープ、リファレンス、用語の整理
* 4 章: VNF Package の仕様
    * 4.1 節: CSAR の概要
    * 4.2 節: フォルダ構成
    * 4.3 節: 各ファイル構造と仕様
* 5 章: VNF Package のセキュリティ仕様
* 6 章: PNFV の仕様

### 1-3 章: スコープ、リファレンス、用語の整理

ETSI NFV ドキュメントお決まりの形式で、お決まりの内容が記述されているだけなので、詳細を確認する必要はありません。

### 4 章: VNF Package の仕様

CSAR ZIP ファイルは、2つの構成パターンのどちらかをとることができます。

1. *TOSCA-Metadata* フォルダを含むパターン
1. ルートフォルダに yaml ファイル（.yml or .yaml）を含むパターン

#### 1. *TOSCA-Metadata* フォルダを含むパターン

```plantuml
left to right direction
artifact "CSAR.zip (with TOSCA-Metadata folder)" {
  package "TOSCA-Metadata" {
    file TOSCA.meta {
      card "TOSCA-Meta-File-Version: 1.0\nCSAR-Version: 1.1\nCreated-by: 4shi1o-i1o\nEntry-Definitions: <VNFD folder>/<sample_vnf>.yaml\nETSI-Entry-Manifest: <manifest>.mf\nETSI-Entry-Change-Log: Files/<change_log>.txt\nETSI-Entry-Licenses: Files/Licenses"
    }
  }
  package "<VNFD folder>" {
    file "<sample_vnf>.yaml"
  }
  package "Files" {
    file "<change-log>.txt"
    package "Licenses" {
      file "<sample_license>"
    }
    package "images" {
      file "<sample_vnf>.img"
    }
  }
  file "<manifest>.mf" {
    card "vnfd_id: 00000000-0000-0000-0000-000000000000\nvnf_providor_id: 4shi1o-i1o-company\nvnf_product_name: sample_vnf\nvnf_release_date_time: 2021-11-19T12:00:00+09:00\nvnf_software_version: 1.0.0\nvnf_package_version: 1.0\ncompatible_specification_versions: 2.6.1, 3.3.1\nvnfm_info: tacker\n\nSource: Files/images/sample_vnf.img\nAlgorithm: SHA-256\nHash: 0...0"
  }
}
```

* */TOSCA-Metadata/TOSCA.meta* : VNF Package のメタデータを記述するファイル。
    * **TOSCA-Meta-File-Version:** *TOSCA.meta* ファイルのバージョン。まずは心を無にして "1.0" としておけば問題ありません。
    * **CSAR-Version:** "1.1" 固定。TOSCA Simple Profile in YAML（つまり簡略化した記法）を使うという宣言です。
    * **Created-by:** VNF Packageを作った人。
    * **Entry-Definitions:** この VNF Package の最上位 VNFD の yaml ファイルへのパス。TOSCA Version 1.0 では、フォルダ名が "*Definitions/*" で固定でしたが、TOSCA Simple Profile in YAML の拡張で任意のフォルダ名が許容されるようになりました。
    * **ETSI-Entry-Manifest:** ETSI NFV による拡張定義。この VNF Package のマニフェストファイル（ \<manifest\>.mf ）へのパス。
    * **ETSI-Entry-Change-Log:** ETSI NFV による拡張定義。変更履歴ファイル（ Files/<change_log>.txt ）へのパス。
    * **ETSI-Entry-Licenses:** ETSI NFV による拡張定義。ライセンスファイルのあるフォルダ（ Files/Licenses/ ）へのパス。
* *\<VNFD folder\>/\<sample_vnf\>.yaml*
    * VNFD を格納するフォルダ。VNFD を定義する yaml ファイルの構成に関する詳細は、ETSI NFV SOL001 を参照してください。
* *Files/* : 各種ファイルを配置するためのフォルダ。フォルダ名に命名規則は存在しませんが、ETSI NFV SOL004 のサンプルでは "Files" が利用されているため、本記事でも踏襲しています。このフォルダ配下のファイルは、VNFD の中で参照されます。
    * **images/:** VNF が利用するイメージファイルを配置するためのサブフォルダ。このフォルダ名にも命名規則は存在しませんが、ETSI NFV SOL004 のサンプルを踏襲しています。
* *\<manifest\>.mf* : VNFD に記述されるメタデータと、*Files/* 配下等の各種ファイルのパスとハッシュ値を記述するファイル。
    * VNFD に記述されるメタデータ: **vnfd_id** は、ETSI NFV SOL003 で記述される VNF Lifecycle Management interface を使って VNF を起動等の基本オペレーションを実行する際に指定する重要なパラメータ。それ以外は、多くの場合あまり重要ではありません。
    * *Files/* 配下等の各種ファイルのパスとハッシュ値を記述するファイル: 基本的には、VNF Package に含む各種ファイルに対して **Source, Algorithm, Hash** の key が必須です。

#### 2. ルートフォルダに yaml ファイル（.yml or .yaml）を含むパターン

このパターンは、「YANG-based VNFD」もしくは「1 つの Deployment flavour デザインしか含まない TOSCA-based VNFD」の場合のみ適用できます。言い換えれば、ほとんどの場合は使わないと思われます（YANG-based VNFD を利用しなければならない何かしらの理由があれば別ですが）。

```plantuml
left to right direction
artifact "CSAR.zip (without TOSCA-Metadata folder)" {
  file "<sample_vnf>.yaml" {
    card "tosca_definitions_version: tosca_simple_yaml_1_1\n\nmetadata:\n\ttemplate_name: sample_template\n\ttemplate_auther: 4shi1o-i1o\n\ttemplate_version: 1.1\n\n<VNFD>"
  }
  file "<sample_vnf>.mf" {
    card "vnfd_id: 00000000-0000-0000-0000-000000000000\nvnf_providor_id: 4shi1o-i1o-company\nvnf_product_name: sample_vnf\nvnf_release_date_time: 2021-11-19T12:00:00+09:00\nvnf_software_version: 1.0.0\nvnf_package_version: 1.0\ncompatible_specification_versions: 2.6.1, 3.3.1\nvnfm_info: tacker\n\nSource: images/sample.img\nAlgorithm: SHA-256\nHash: 0...0"
  }
  file "ChangeLog.txt"
  package "Licenses" {
    file "<sample_license>"
  }
}
```

### 5 章: VNF Package のセキュリティ仕様

VNF Package 全体、もしくはそれに含まれる各ファイルに対する署名と証明書に関する仕様が記述されています。VNF Package がインターネット上に公開されていたり、信用できない第三者から提供されるような状況では重要かもしれませんが、私の知る限りそのような VNF Package を使う機会は多くないと想像します。

したがって、本記事では解説を省略します。

### 6 章: PNFV の仕様

ほとんどの仕様が VNF Package の仕様を参照する、とのみ記述されています。記述量も少なく、PNF を運用するケースは多くないと想像するので、本記事では解説を省略します。

## 実際に動かしてみる with OpenStack Tacker

OpenStack Tacker は、ETSI NFV 準拠の NFVO/VNFM を実装するプロジェクトです。現在では、ETSI NFV SOL V2.6.1 および V3.3.1（の一部）の VNFM 機能を中心に開発が進められています。

主なサポート API:

* NFVO (ETSI NFV SOL005)
    * VNF Package Management interface (Server)
* VNFM (ETSI NFV SOL003)
    * VNF Lifecycle Management interface
    * VNF Lifecycle Operation Granting interface
    * VNF Package Management interface (Client)

詳細は、[OpenStack Tacker の公式ドキュメント](https://docs.openstack.org/tacker/latest/index.html) を確認してみてください。（そのうち、Tacker を使った VNF デプロイ解説記事を書くかも？）

## 参考URL

ETSI NFV ドキュメントの公式リポジトリ

* [ETSI GS NFV 003](https://www.etsi.org/deliver/etsi_gs/NFV/001_099/003/)
* [ETSI GS NFV-IFA 011](https://www.etsi.org/deliver/etsi_gs/nfv-ifa/001_099/011)
* [ETSI GS NFV-SOL 004](https://www.etsi.org/deliver/etsi_gs/NFV-SOL/001_099/004/)

ETSI Work Programme

* [GR NFV 003](https://portal.etsi.org/webapp/WorkProgram/Report_WorkItem.asp?WKI_ID=62704)
* [GS NFV-IFA 011](https://portal.etsi.org/webapp/WorkProgram/Report_WorkItem.asp?WKI_ID=54092)
* [GS NFV-SOL 004](https://portal.etsi.org/webapp/WorkProgram/Report_WorkItem.asp?WKI_ID=50617)

TOSCA

* [Topology and Orchestration Specification for Cloud Applications (TOSCA) Version 1.0](http://docs.oasis-open.org/tosca/TOSCA/v1.0/TOSCA-v1.0.html)
* [TOSCA Simple Profile in YAML v1.3](https://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.3/TOSCA-Simple-Profile-YAML-v1.3.html)

OpenStack Tacker（OpenStack 傘下の NFVO/VNFM 実装プロジェクト）

* [OpenStack Tacker Documentation](https://docs.openstack.org/tacker/latest/index.html)
    * [VNF Package for Tacker](https://docs.openstack.org/tacker/latest/user/vnf-package.html)
    * [VNFD for Tacker](https://docs.openstack.org/tacker/latest/user/vnfd-sol001.html)
    * [Getting Started with ETSI NFV-SOL Tacker](https://docs.openstack.org/tacker/latest/install/etsi_getting_started.html)
    * [Tacker Project Specifications](https://specs.openstack.org/openstack/tacker-specs/)
* [OpenStack Tacker in GitHub](https://github.com/openstack/tacker)
    * [OpenStack Tacker in OpenDev (original)](https://opendev.org/openstack/tacker)
* [launchpad for Tacker](https://launchpad.net/tacker)
* [Gerrit for Tacker](https://review.opendev.org/q/status:open+-is:wip+project:openstack/tacker)