实现 Tacker VNF 转发图

https://blueprints.launchpad.net/tacker/+spec/tacker-vnffg

本文档描述了将 VNF 转发图 (VNFFG) 功能引入 Tacker 的计划。目前,Tacker 允许管理 VNFs;本文档的目的是也包括管理通过有序 VNFs 路径的网络流量。

问题描述

NFV 社区普遍希望能够编排和管理通过 VNFs 的流量,也称为服务功能链 (SFC) [1]。NFV 的用户不仅希望能够创建 VNFs,还希望能够定义 SFC 以引导 VNFs 之间的流量。在 ETSI MANO 的上下文中 [9],SFC 结构是更大的 VNFs 图 (VNFFG) 的一部分,该图定义了 VNFs 在图中的连接方式以及通过该图流动的网络流量路径。

目标是在编排中能够通过逻辑和抽象结构定义一个图,同时能够将该图渲染到覆盖网络作为 SFC。下一步是能够对应该通过该 SFC 流动的租户流量进行分类。VNFs、SFC 以及流量的分类组合被描述为 VNF 转发图 (VNFFG)。

VNFFG 可能很复杂,具有通过图的多个路径。目前 Tacker VNFFG 将依赖于渲染图的 SFC 实现只能创建单路径 SFC。为了解决这个问题,Tacker VNFFG 可以能够解析多路径图为多个单路径 SFC,从而创建更大的 VNFFG。可以将此功能视为“链优化”,通过收集有关图的所有定义路径的信息,并将路径的公共部分分解为单个链。这是 VNFFG 编排的关键部分,但由于所需的逻辑复杂性,将作为后续规范处理。本文档解决了 Tacker 为了使用单个 SFC 编排通过 VNFFG 的完整路径所需的更改。

此外,VNF 也可以能够在进入图后重新分类流量。例如,能够进行 L7 深度包检测 (DPI) 的 VNF 根据数据包有效负载确定通过图的下一个路径应该被修改。为了实现此功能,VNFM 和网络服务 (NS) 扩展之间需要某种类型的协调,这超出了此 VNFFG 规范的范围(但将来可能会与此功能集成)。

提议的变更

为了适应此新功能,Tacker 需要进行的高级更改包括对 Tacker 客户端、Horizon 和服务器的更改。更改包括

  • 在 tacker-horizon 中添加一个 VNFFG 选项卡,用户可以在其中从已经创建的 VNFs 创建图,以及一个分类子选项卡来声明进入该图的流量。这些输入可以通过多种方式实现,包括 (1) TOSCA VNF 转发图描述符 (VNFFGD) [8],以及 (2) 一个简单的下拉菜单,按顺序链接 VNFs,然后定义租户的分类方案。VNFFG 使用 yaml 模板作为输入来描述网络功能以及它们如何连接 [8]。这类似于 Tacker VNFM 中 VNFD 的工作方式。本文档建议首先通过 (1) 实现 VNFFG 创建。

  • Tacker 客户端也需要类似的更改,以允许将 VNFFG CRUD 调用传递给 Tacker 服务器。

  • Tacker 服务器需要更新 NFVO 扩展和插件,以便集成 VNFFG 资源和功能。

  • 需要编写 ‘vnffg’ 的驱动程序。创建 SFC 的已知驱动程序是 networking-sfc [3] (基于 Neutron 的 SFC) 和 OpenDaylight SFC [4]。将支持 networking-sfc 驱动程序 [10] 作为 VNFFG 插件。OpenDaylight 功能和驱动程序将在 networking-sfc 项目中作为 networking-sfc 的驱动程序单独解决。networking-sfc 驱动程序将处理 SFC 和分类 CRUD 操作。

+---------------------------------------------+
|              Client Application             |
+-----------+---------------------+-----------+
            | Tacker VNFFG API    | Tacker VNFM API
+-----------|---------------------|-----------+
|           v                     v           |
|  +-----------------+    +----------------+  |
|  |      Tacker     |    |    Tacker      |  |
|  | NFVO Extension  |<-->| VNFM Extension |  |
|  |   Plugin/DB     |    |   Plugin       |  |
|  +--------+--------+    +----------------+  |
|           |                                 |
|         +==========================+        |
|         |     networking-sfc       |        |
|         |     Port Chain Driver    |        |
|         +==========================+        |
| Tacker Server        |                      |
+----------------------|----------------------+
                       | Port Chain API
+----------------------|----------------------+
| Neutron Server       v                      |
|            +-------------------+            |
|            | networking-sfc    |            |
|            | Port Chain Plugin |            |
|            +-------------------+            |
+---------------------------------------------+

备选方案

数据模型影响

数据模型影响包括创建 ‘vnffgd’、‘vnffgd_nfp’、‘vnffg’、‘vnffg_nfp’、‘vnffg_chain’ 和 ‘vnffg_classifier’ 表。‘vnffgd’ 表将保存由 TOSCA 定义的所有当前定义的 VNFFGD 模板,而关联的表 ‘vnffgd_nfp’ 将保存与该 VNFFGD 关联的网络转发路径 (NFP)。

‘vnffg’ 表将保存相关的 VNFFG 实例创建属性,以及保存在 ‘vnffg_nfp’ 表中的关联 NFP,以及在 ‘vnffg_chain’ 和 ‘vnffg_classifier’ 表中创建的关联 SFC 和分类器的引用。另一个表 ‘acl_match_criteria’ 将保存映射到 ‘vnffg_classifier’ 中创建的分类器的匹配标准条目。

在 VNFM 中,VNFD 模板需要添加以下 TOSCA 属性

tosca.nodes.nfv.VNF:
  properties:
    nsh_aware:
      type: boolean
      required: false
      description: Does this VNF support IETF NSH

tosca.nodes.nfv.CP:
  properties:
    sfc_encapsulation:
      type: string
      required: false
      description: Identifies the method of encapsulation for NSH/SFC
      constraints:
        - [vxlan_gpe, ethernet, mpls]

这些属性将允许 VNFFG 指示 SFC 提供程序 VNF 是否是网络服务标头 (NSH) [1] 感知,以及在传输数据包时使用哪种封装。NSH 是一种 IETF 协议,它逐跳传递有关 SFC 的信息。NSH 标头添加到遍历链的每个数据包,并包含有关该链的属性,以便当数据包到达链中的下一个 VNF 时,VNF 能够确定该数据包属于哪个链,以及该数据包之前遍历了链中的多少个节点。

REST API 影响

需要创建 VNFFGD 以实例化 VNFFG。创建 VNFFGD 的方法遵循 TOSCA 模板方案。该格式需要在一个或多个组中定义一个或多个 VNFFG,以及一个或多个关联的“Forwarding_paths”。示例

Forwarding_path1:
  type: tosca.nodes.nfv.FP
  id: 51
  description: creates path (CP11->CP12->CP32)
  properties:
    policy:
      type: ACL
      criteria:
        - neutron_net_name: tenant1_net
        - dest_port_range: 80-1024
        - ip_proto: tcp
        - ip_dest: 192.168.1.2
  requirements:
    - forwarder: VNF1
      capability: CP11
    - forwarder: VNF1
      capability: CP12
    - forwarder: VNF3
      capability: CP32

groups:
  VNFFG1:
    type: tosca.groups.nfv.VNFFG
    description: HTTP to Corporate Net
    properties:
      vendor: tacker
      version: 1.0
      number_of_endpoints: 5
      dependent_virtual_link: [VL1,VL2,VL3]
      connection_point: [CP11,CP12,CP32]
      constituent_vnfs: [VNF1,VNF3]
    members: [Forwarding_path1]

VNFs、连接点 (CPs) 和虚拟链路 (VLs) 在 VNFD 模板中描述。由于此依赖关系,要验证 VNFFGD,需要先创建 VNFD 模板。在 TOSCA 中,VL 实际上应该在网络服务 (NS) 模板中定义,以及作为抽象结构定义的 VNF。此外,TOSCA 规范为每个抽象 VNF 定义了一个“capability”对象,该对象通过替换映射解析为特定的 CP(作为 VNF 外部类型 CP 公开)。“capability”对象和抽象 VNF 对象组合构成了网络转发路径 (NFP) 中的“forwarders”。但是,NS 超出了本文档的范围,将在后续规范中解决。因此,本文档采用更简单直接的方法,将路径“forwarder”定义为与 VNFD 名称关联的 CP。上述 yaml 中的“forwarder”键指定 VNFD 名称,而“capability”键引用该 VNF 的外部 CP。

VNFFG 创建的基本方法是通过实例化创建的 VNFFGD 来完成。VNFFG 创建的默认行为依赖于选择抽象 VNF 类型。VNFFGD 包含一个或多个 NFP,每个 NFP 包含用于路径的转发器列表。“forwarder”中的 requirements 引用要在路径中使用的 VNFD 名称。在 VNFFG 创建时,NFVO 插件将查询 VNFM 以查找与每个 NFP 的相应 VNFD 存在的可用 VNF 实例。对于此规范的第一次迭代,如果对于给定的 VNFD 存在多个 VNF,则选择算法将是随机的,但将来可能会增强。允许 VNF 成为多个路径的一部分,但不允许成为多个 VNFFG 的一部分。可以使用 ‘–vnf-mapping’ 参数指定要在图中使用的 VNF 实例(已通过 VNFM 创建)。该参数将映射 <VNFD>:<VNF 实例 ID/NAME>。例如,如果使用上述“Forwarding_path1” yaml 输入作为示例,它包含 VNF1 和 VNF3 VNFD。因此,如果从这些 VNFD 生成了两个实例,VNF1Test 和 VNF3Test,则该参数将如下所示 ‘–vnf-mapping VNF1:VNF1Test,VNF3:VNF3Test’,以便指示 NFVO 专门使用这些 VNF 实例(而不是搜索)。

自动生成与现有 VNFD 匹配的所需类型(但不存在)的 VNF 实例的可能性超出了本文档的范围,但将来可能会通过 NS 扩展支持。

转发路径元素 (nfv.FP) 的 TOSCA 输入定义了通过图的路径。VNFFGD 可以包含通过 VNFFG 的多个路径 (NFP)。多个 NFP 通过在 VNFFG 定义中将其列为目标与 VNFFG 关联。此规范的初始实现将专注于为每个路径创建一个链和分类器。如前所述,此功能可以发展为将图中的常见路径优化为合并的链,但这超出了初始规范的范围。路径的分类器定义为策略,如上面的示例所示,而链在 requirements 下列出。requirements 中的 CP 映射到 VNFD 中必须定义为具有 ‘forwarding’ capability 的虚拟端口。VNFFG 将查询 VNFM 以获取给定 CP 的 neutron-port ID。VNFM 然后将调用其 Heat 驱动程序以查找信息。这将是新的行为和 VNFM 需要的更改。如果为每个 VNF 在转发路径中提供单个 CP,则将其视为该 VNF 的入口和出口端口。如果为每个 VNF 在转发路径中提供两个序数 CP,则第一个将被解释为 VNF 的入口端口,而第二个是出口。

将添加一个额外的参数 ‘–symmetrical’,以自动为 VNFFG 中列为目标的路径创建反向路径。反向路径也可以在 VNFFGD 中定义,但为了方便起见,可以使用 –symmetrical 代替。

示例 CLI 调用

创建 VNFFGD

tacker vnffgd-create --name VNFFG1 --vnffgd-file ./test-vnffgd.yaml

tacker vnffgd-create --name VNFFG1 --vnffgd <raw vnffgd TOSCA>

创建 VNFFG(其中 testVNF1 和 testVNF2 是 VNF 实例)

tacker vnffg-create --name myvnffg --vnfm_mapping VNF1:testVNF2,
VNF2:testVNF1 --symmetrical True --vnffgd-name VNFFG1

tacker vnffg-create --name myvnffg --vnfm_mapping VNF1:testVNF2,
VNF2:testVNF1 --symmetrical True --vnffgd-id
65056908-1946-11e6-b6ba-3e1d05defe78

列出 vnffg 的转发路径,这将列出关联的链和分类器

tacker vnffg-show myvnffg
+--------------------+-------------------------------------------------------+
| Field              | Value                                                 |
+--------------------+-------------------------------------------------------+
| forwarding_paths   | Forwarding_path1                                      |
| id                 | 19233232-d3e2-4c47-a94d-d1b1ab9889e5                  |
| name               | myvnffg                                               |
| tenant_id          | 0b324885958c42ad939e7d636abe2352                      |
| vnffgd_id          | 5279690a-2153-11e6-b67b-9e71128cae77                  |
| vnf_mapping        | [{VNFD1:testVNF1}, {VNFD2:testVNF2}]                  |
| status             | ACTIVE                                                |
+--------------------+-------------------------------------------------------+

查看与特定转发路径关联的链和分类器

tacker vnffg-show myvnffg --nfp Forwarding_path1
+--------------------+-------------------------------------------------------+
| Field              | Value                                                 |
+--------------------+-------------------------------------------------------+
| chain_id           | b8ad61b1-5fac-48ab-9231-dc7d5de6ad4d                  |
| classifier_id      | 0a52a0d9-2a1f-4019-94c3-5401c4af5d36                  |
| id                 | 19233232-d3e2-4c47-a94d-d1b1ab9889e5                  |
| name               | Forwarding-path1                                      |
| tenant_id          | 0b324885958c42ad939e7d636abe2352                      |
| path_id            | 200                                                   |
| symmetrical        | false                                                 |
| vnffg_id           | 19233232-d3e2-4c47-a94d-d1b1ab9889e5                  |
+--------------------+-------------------------------------------------------+

显示链本身

tacker vnffg-show --sfc b8ad61b1-5fac-48ab-9231-dc7d5de6ad4d
+--------------+--------------------------------------+
| Field        | Value                                |
+--------------+--------------------------------------+
| chain        | 0a52a0d9-2a1f-4019-94c3-5401c4af5d36 |
| id           | b8ad61b1-5fac-48ab-9231-dc7d5de6ad4d |
| path_id      | 181                                  |
| nfp_id       | 19233232-d3e2-4c47-a94d-d1b1ab9889e5 |
| status       | PENDING_CREATE                       |
| symmetrical  | False                                |
| tenant_id    | 0b324885958c42ad939e7d636abe2352     |
+--------------+--------------------------------------+

显示分类器本身

tacker vnffg-show --classifier 0a52a0d9-2a1f-4019-94c3-5401c4af5d36
+--------------------+-------------------------------------------------------+
| Field              | Value                                                 |
+--------------------+-------------------------------------------------------+
| acl_match_criteria | {"source_port": 2005, "protocol": 6, "dest_port": 80} |
| chain_id           | b8ad61b1-5fac-48ab-9231-dc7d5de6ad4d                  |
| id                 | 0a52a0d9-2a1f-4019-94c3-5401c4af5d36                  |
| nfp_id             | 19233232-d3e2-4c47-a94d-d1b1ab9889e5                  |
| status             | PENDING_CREATE                                        |
| tenant_id          | 0b324885958c42ad939e7d636abe2352                      |
+--------------------+-------------------------------------------------------+

/vnffgd

+----------------------------------------------------------------------------+
|Attribute     |Type   |Access  |Default   |Validation/ |Description         |
|Name          |       |        |Value     |Conversion  |                    |
+----------------------------------------------------------------------------+
|id            |string |RO, All |generated |N/A         |identity            |
|              |(UUID) |        |          |            |                    |
+----------------------------------------------------------------------------+
|name          |string |RW, All |None      |string      |human+readable      |
|              |       |        |(required)|            |name                |
+----------------------------------------------------------------------------+
|description   |string |RW, All |''        |string      |description of      |
|              |       |        |          |            |VNFFGD              |
+----------------------------------------------------------------------------+
|attributes    |dict   |RW, All |None      |template/   |VNFFGD template     |
|              |       |        |          |dict        |                    |
+----------------------------------------------------------------------------+
|tenant_id     |string |RW, All |None      |string      |project id to       |
|              |       |        |(required)|            |launch VNFFGD       |
+----------------------------------------------------------------------------+

+----------------------------------------------------------------------------+
|REST Calls    |Type  |Expected  |Body Data  |Description                    |
|              |      |Response  |Schema     |                               |
+----------------------------------------------------------------------------+
|create_vnffgd |post  |200 OK    |schema 1   |Creates VNFFGD                 |
|              |      |          |           |                               |
+----------------------------------------------------------------------------+
|delete_vnffgd |delete|200 OK    |None       |Deletes VNFFG by name or ID    |
|              |      |          |           |                               |
+----------------------------------------------------------------------------+
|show_vnffgd   |get   |200 OK    |None       |Returns output of specific     |
|              |      |          |           |VNFFG ID, including associated |
|              |      |          |           |chains and classifiers         |
+----------------------------------------------------------------------------+
|list_vnffgds  |get   |200 OK    |None       |Returns list of configured     |
|              |      |          |           |VNFFGD Names/IDs               |
+----------------------------------------------------------------------------+

+----------------------------------------------------------------------------+
|REST Call     |Type  |Negative  |Response Message |Scenario                 |
|Failures      |      |Response  |                 |                         |
+----------------------------------------------------------------------------+
|create_vnffgd |post  |404 Not   |VNFD does not    |Declared VNFD in an NFP  |
|              |      |Found     |exist            |specified in VNFFGD      |
|              |      |          |                 |does not exist           |
+----------------------------------------------------------------------------+
|create_vnffgd |post  |404 Not   |Connection Point |Specified CP does not    |
|              |      |Found     |for VNF does not |exist for defined VNFD   |
|              |      |          |exist            |in NFP                   |
+----------------------------------------------------------------------------+
|create_vnffgd |post  |409       |Connection Point |CP defined in VNFFGD     |
|              |      |Conflict  |does not have    |maps to a VNFD, but lacks|
|              |      |          |forwarding       |forwarding capability    |
|              |      |          |capability       |                         |
+----------------------------------------------------------------------------+
|delete_vnffgd |delete|403       |VNFFG Create     |VNFFG already being      |
|              |      |Forbidden |in progress      |created by a request     |
+----------------------------------------------------------------------------+

/vnffg

+----------------------------------------------------------------------------+
|Attribute     |Type   |Access  |Default   |Validation/ |Description         |
|Name          |       |        |Value     |Conversion  |                    |
+----------------------------------------------------------------------------+
|id            |string |RO, All |generated |N/A         |identity            |
|              |(UUID) |        |          |            |                    |
+----------------------------------------------------------------------------+
|name          |string |RW, All |None      |string      |human+readable      |
|              |       |        |(required)|            |name                |
+----------------------------------------------------------------------------+
|description   |string |RW, All |''        |string      |description of      |
|              |       |        |          |            |VNFFG               |
+----------------------------------------------------------------------------+
|vnffgd_id     |string |RO, All |None      |uuid        |VNFFGD to use to    |
|              |(UUID) |        |(required)|            |create this VNFFG   |
+----------------------------------------------------------------------------+
|tenant_id     |string |RW, All |None      |string      |project id to       |
|              |       |        |(required)|            |launch VNFFG        |
+----------------------------------------------------------------------------+
|status        |string |RO, All |generated |string      |current state       |
|              |       |        |          |            |of VNFFG            |
+----------------------------------------------------------------------------+
|vnf_mapping   |list   |RW, All |None      |list        |Mapping of VNFD name|
|              |       |        |          |            |to VNF instances to |
|              |       |        |          |            |use in VNFFG        |
+----------------------------------------------------------------------------+
|forwarding_   |list   |RO, All |None      |list        |List of associated  |
|paths         |       |        |          |            |NFPs                |
+----------------------------------------------------------------------------+


+----------------------------------------------------------------------------+
|REST Calls    |Type  |Expected  |Body Data  |Description                    |
|              |      |Response  |Schema     |                               |
+----------------------------------------------------------------------------+
|create_vnffg  |post  |200 OK    |schema 1   |Creates VNFFG and triggers     |
|              |      |          |           |underlying chain and           |
|              |      |          |           |classifier creation            |
+----------------------------------------------------------------------------+
|update_vnffg  |put   |200 OK    |schema 1   |Updates VNFFG by name or ID    |
|              |      |          |           |                               |
+----------------------------------------------------------------------------+
|delete_vnffg  |delete|200 OK    |None       |Deletes VNFFG by name or ID    |
|              |      |          |           |                               |
+----------------------------------------------------------------------------+
|show_vnffg    |get   |200 OK    |None       |Returns output of specific     |
|              |      |          |           |VNFFG ID, including associated |
|              |      |          |           |chains and classifiers         |
+----------------------------------------------------------------------------+
|list_vnffgs   |get   |200 OK    |None       |Returns list of configured     |
|              |      |          |           |VNFFG Names/IDs                |
+----------------------------------------------------------------------------+


+----------------------------------------------------------------------------+
|REST Call     |Type  |Negative  |Response Message |Scenario                 |
|Failures      |      |Response  |                 |                         |
+----------------------------------------------------------------------------+
|create_vnffg  |post  |404 Not   |VNF does not     |No VNFs exist with       |
|              |      |Found     |exist            |declared instance when   |
|              |      |          |                 |using vnf_mapping        |
+----------------------------------------------------------------------------+
|create_vnffg  |post  |500       |Failed to create |Failed to create         |
|              |      |Internal  |SFC              |chain with underlying    |
|              |      |Server    |                 |driver                   |
|              |      |Error     |                 |                         |
+----------------------------------------------------------------------------+
|create_vnffg  |post  |500       |Failed to create |Failed to create         |
|              |      |Internal  |Classifier       |classifier with          |
|              |      |Server    |                 |underlying driver        |
|              |      |Error     |                 |                         |
+----------------------------------------------------------------------------+
|update_vnffg  |put   |404 Not   |VNFFG does not   |No VNFFG exists with     |
|              |      |Found     |exist            |provided Name/ID         |
+----------------------------------------------------------------------------+
|delete_vnffg  |delete|403       |VNFFG Update     |VNFFG already being      |
|              |      |Forbidden |in progress      |updated by a request     |
+----------------------------------------------------------------------------+

允许用户访问并显示 vnffg 的 nfp 资源:/vnffg/nfp

+----------------------------------------------------------------------------+
|Attribute     |Type   |Access  |Default   |Validation/ |Description         |
|Name          |       |        |Value     |Conversion  |                    |
+----------------------------------------------------------------------------+
|id            |string |RO, All |generated |N/A         |identity            |
|              |(UUID) |        |          |            |                    |
+----------------------------------------------------------------------------+
|name          |string |RO, All |''        |string      |human+readable      |
|              |       |        |          |            |name                |
+----------------------------------------------------------------------------+
|vnffg_id      |string |RO, All |generated |uuid        |Associated VNFFG ID |
|              |(UUID) |        |          |            |                    |
+----------------------------------------------------------------------------+
|tenant_id     |string |RO, All |None      |string      |project id to       |
|              |       |        |(required)|            |for this NFP        |
+----------------------------------------------------------------------------+
|status        |string |RO, All |generated |string      |current state       |
|              |       |        |          |            |of the NFP          |
+----------------------------------------------------------------------------+
|classifier_id |string |RO, All |None      |string      |ID of associated    |
|              |       |        |          |            |classifier          |
+----------------------------------------------------------------------------+
|chain_id      |string |RO, All |None      |string      |ID of associated    |
|              |       |        |          |            |chain               |
+----------------------------------------------------------------------------+
|path_id       |integer|RO, All |nfv.FP ID |string      |Path ID described   |
|              |       |        |          |            |in VNFFGD           |
+--------------+-------+--------+----------+---------------------------------+
|symmetrical   |bool   |RO, All |True      |bool        |Path allows         |
|              |       |        |          |            |reverse traffic     |
+----------------------------------------------------------------------------+

+----------------------------------------------------------------------------+
|REST Calls    |Type  |Expected  |Body Data  |Description                    |
|              |      |Response  |Schema     |                               |
+----------------------------------------------------------------------------+
|show_nfp      |get   |200 OK    |None       | Returns output of specific    |
|              |      |          |           | forwarding_path for a VNFFG   |
+----------------------------------------------------------------------------+
|list_nfps     |get   |200 OK    |None       |Returns list of configured     |
|              |      |          |           |NFPs fora specific VNFFG       |
+----------------------------------------------------------------------------+
+----------------------------------------------------------------------------+
|REST Call     |Type  |Negative  |Response Message |Scenario                 |
|Failures      |      |Response  |                 |                         |
+----------------------------------------------------------------------------+
|show_nfp      |get   |404 Not   |Instance         |No NFP exists            |
|              |      |Found     |Not Found        |with provided Name/ID    |
|              |      |          |                 |provided Name/ID         |
+----------------------------------------------------------------------------+

允许用户访问并显示链资源,如渲染所示:/vnffg/chain

+----------------------------------------------------------------------------+
|Attribute     |Type   |Access  |Default   |Validation/ |Description         |
|Name          |       |        |Value     |Conversion  |                    |
+----------------------------------------------------------------------------+
|id            |string |RO, All |generated |N/A         |identity            |
|              |(UUID) |        |          |            |                    |
+----------------------------------------------------------------------------+
|tenant_id     |string |RO, All |None      |string      |project id to       |
|              |       |        |(required)|            |launch SFC          |
+----------------------------------------------------------------------------+
|status        |string |RO, All |generated |string      |current state       |
|              |       |        |          |            |of SFC              |
+----------------------------------------------------------------------------+
|symmetrical   |bool   |RO, All |True      |bool        |Chain allows        |
|              |       |        |          |            |reverse traffic     |
+----------------------------------------------------------------------------+
|chain         |list   |RO, All |None      |list        |SFC Chain as list of|
|              |       |        |          |            |ordered VNF name/IDs|
+----------------------------------------------------------------------------+
|path_id       |integer|RO, All |generated |string      |NFP/SFC Path ID     |
|              |       |        |          |            |(e.g. NSH SPI)      |
+--------------+-------+--------+----------+---------------------------------+
|nfp_id        |string |RO, All |None      |string      |Associated NFP      |
|              |(UUID) |        |          |            |ID                  |
+--------------+-------+--------+----------+---------------------------------+

+----------------------------------------------------------------------------+
|REST Calls    |Type  |Expected  |Body Data  |Description                    |
|              |      |Response  |Schema     |                               |
+----------------------------------------------------------------------------+
|show_chain    |get   |200 OK    |None       | Returns output of specific    |
|              |      |          |           | chain                         |
+----------------------------------------------------------------------------+

+----------------------------------------------------------------------------+
|REST Call     |Type  |Negative  |Response Message |Scenario                 |
|Failures      |      |Response  |                 |                         |
+----------------------------------------------------------------------------+
|show_chain    |get   |404 Not   |Instance         |No chain exists          |
|              |      |Found     |Not Found        |with provided Name/ID    |
|              |      |          |                 |provided Name/ID         |
+----------------------------------------------------------------------------+

允许用户访问并显示分类器信息,如渲染所示:/vnffg/classifier

+----------------------------------------------------------------------------+
|Attribute     |Type   |Access  |Default   |Validation/ |Description         |
|Name          |       |        |Value     |Conversion  |                    |
+----------------------------------------------------------------------------+
|id            |string |RO, All |generated |N/A         |identity            |
|              |(UUID) |        |          |            |                    |
+----------------------------------------------------------------------------+
|tenant_id     |string |RO, All |None      |string      |project id to       |
|              |       |        |(required)|            |create Classifier   |
+----------------------------------------------------------------------------+
|status        |string |RO, All |generated |string      |current state       |
|              |       |        |          |            |of Classifier       |
+----------------------------------------------------------------------------+
|match         |dict   |RO, All |True      |acl_dict    |Match criteria      |
|              |       |        |          |            |(see supported list)|
+----------------------------------------------------------------------------+
|chain_id      |string |RO, All |None      |string      |SFC Chain to        |
|              |(UUID) |        |          |(UUID)      |classify on         |
+----------------------------------------------------------------------------+
|nfp_id        |string |RO, All |None      |string      |Associated NFP      |
|              |(UUID) |        |          |            |ID                  |
+--------------+-------+--------+----------+---------------------------------+

+----------------------------------------------------------------------------+
|REST Calls    |Type  |Expected  |Body Data  |Description                    |
|              |      |Response  |Schema     |                               |
+----------------------------------------------------------------------------+
|show_         |get   |200 OK    |None       | Returns output of specific    |
|classifier    |      |          |           | classifier                    |
+----------------------------------------------------------------------------+

+----------------------------------------------------------------------------+
|REST Call     |Type  |Negative  |Response Message |Scenario                 |
|Failures      |      |Response  |                 |                         |
+----------------------------------------------------------------------------+
|show_         |get   |404 Not   |Instance         |No classifier exists     |
|classifier    |      |Found     |Not Found        |with provided Name/ID    |
|              |      |          |                 |provided Name/ID         |
+----------------------------------------------------------------------------+

模式定义

  • 模式 1:此模式描述了 VNFFG SFC 请求的典型主体

{u'vnffg': {u'attributes': {vnffgd: <VNFFGD>}, u'name': u'test_vnffg',
  u'vnf_mapping': {u'VNF1': u'c0f0500e-4dc4-4321-a188-40a6ecfea0ea',
  u'VNF2': u'9d1c6854-bb71-4a99-934d-7bef3222d0bb'}, u'symmetrical':
  u'True'}}

分类器匹配标准

支持的匹配属性列表如下,用于分类。这些用作模式 2 中“match”列表中指定的键=值对。OpenDaylight 支持的匹配标准包括 IETF ACL 模型 [5]。此外,networking-sfc 项目已通过相应的规范 [6] 传递了支持的分类器匹配标准。Tacker SFC 分类器将把两者聚合到这些支持的属性中。在从以下可用属性创建/更新分类器时,应指定至少一个匹配标准属性

+----------------------------------------------+
|Attribute     |Description                    |
|              |                               |
+----------------------------------------------+
|eth_type      |Specifies Ethernet frame type  |
|              |See IEEE 802.3                 |
+----------------------------------------------+
|eth_src       |Ethernet source address        |
|              |                               |
+----------------------------------------------+
|eth_dst       |Ethernet destination address   |
|              |                               |
+----------------------------------------------+
|vlan_id       |VLAN ID                        |
|              |                               |
+----------------------------------------------+
|vlan_pcp      |VLAN Priority                  |
|              |                               |
+----------------------------------------------+
|mpls_label    |MPLS Label                     |
|              |                               |
+----------------------------------------------+
|mpls_tc       |MPLS Traffic Class             |
|              |                               |
+----------------------------------------------+
|ip_dscp       |IP DSCP (6 bits in ToS field)  |
|              |                               |
+----------------------------------------------+
|ip_ecn        |IP ECN (2 bits in ToS field)   |
|              |                               |
+----------------------------------------------+
|ip_src_prefix |IP source address prefix       |
|              |                               |
+----------------------------------------------+
|ip_dst_prefix |IP destination address prefix  |
|              |                               |
+----------------------------------------------+
|ip_proto      |IP protocol number or name     |
|              |                               |
+----------------------------------------------+
|tcp_src       |Source TCP port range          |
|              |                               |
+----------------------------------------------+
|tcp_dest      |Destination TCP port range     |
|              |                               |
+----------------------------------------------+
|udp_src       |Source UDP port range          |
|              |                               |
+----------------------------------------------+
|udp_dest      |Destination UDP port range     |
|              |                               |
+----------------------------------------------+
|sctp_src      |SCTP source port               |
|              |                               |
+----------------------------------------------+
|sctp_dest     |SCTP destination port          |
|              |                               |
+----------------------------------------------+
|icmpv4_type   |ICMP type                      |
|              |                               |
+----------------------------------------------+
|icmpv4_code   |ICMP code                      |
|              |                               |
+----------------------------------------------+
|arp_op        |ARP opcode                     |
|              |                               |
+----------------------------------------------+
|arp_spa       |ARP source ipv4 address        |
|              |                               |
+----------------------------------------------+
|arp_tpa       |ARP target ipv4 address        |
|              |                               |
+----------------------------------------------+
|arp_sha       |ARP source hardware address    |
|              |                               |
+----------------------------------------------+
|arp_tha       |ARP target hardware address    |
|              |                               |
+----------------------------------------------+
|ipv6_src      |IPv6 source address            |
|              |                               |
+----------------------------------------------+
|ipv6_dst      |IPv6 destination address       |
|              |                               |
+----------------------------------------------+
|ipv6_flabel   |IPv6 Flow Label                |
|              |                               |
+----------------------------------------------+
|icmpv6_type   |ICMPv6 type                    |
|              |                               |
+----------------------------------------------+
|icmpv6_code   |ICMPv6 code                    |
|              |                               |
+----------------------------------------------+
|ipv6_nd_target|Target address for ND          |
|              |                               |
+----------------------------------------------+
|ipv6_nd_sll   |Source link-layer for ND       |
|              |                               |
+----------------------------------------------+
|ipv6_nd_tll   |Target link-layer for ND       |
|              |                               |
+----------------------------------------------+
|neutron_src   |Neutron source port            |
|_port         |                               |
+----------------------------------------------+
|neutron_dst   |Neutron destination port       |
|_port         |                               |
+----------------------------------------------+
|tenant_id     |OpenStack Tenant ID            |
|              |                               |
+----------------------------------------------+
|neutron_net   |Neutron Network ID             |
|_id           |                               |
+----------------------------------------------+

注意:OpenDaylight 能够根据 tenant_id 和 neutron_net_id 进行分类。这意味着可以创建匹配多个租户的分类器。Networking-sfc 依赖于基于角色的访问控制 (RBAC) 来跨租户共享分类器 [7]。Networking-sfc 将处理这种类型的匹配,以确保通过 RBAC 可以匹配多个租户/租户网络。

安全影响

通知影响

其他最终用户影响

将对 python-tackerclient 进行更改,以便最终用户管理 VNFFG。更改将涉及向 python-tackerclient 添加新的 VNFFG shell 扩展,以便允许 CRUD 操作。

还将通过 tacker-horizon 插件对 Horizon 进行更改。这些更改将允许用户通过 Horizon 中的新选项卡指定 VNFFG(类似于用于 VNF 管理的设计)。

性能影响

其他部署者影响

将向 Tackers 配置文件添加新的配置。新的配置将包括使用“networking-sfc”VNFFG 驱动程序。

在使用 networking-sfc 作为 SFC 驱动程序时,OpenStack 的配置影响将需要更改 Neutron 配置。

使用 OpenDaylight 的配置影响包括修改 Neutron 配置以及避免 Swift 和 OpenDaylight 在端口 8080 上的潜在端口冲突。OpenDaylight 使用 ML2 插件,并且 OpenDaylight 配置必须存在于 ML2 配置文件中。

开发人员影响

实现

负责人

主要负责人

trozet

其他贡献者

工作项

  1. 向 Tacker-server NFVO 插件添加新的插件功能 ‘vnffg’

  2. 端口和修改 ‘plugin’ 用于 vnffg

  3. 端口和修改 tackerclient API

  4. 向 tackerclient 添加 shell 扩展

  5. 使用新的界面修改 tacker_horizon 以创建 VNFFG

  6. 为以上所有内容添加单元测试

  7. 添加 REST api 文档

  8. 添加 devref 以记录 VNFFG 的工作方式

依赖项

Tacker VNFFG/SFC 依赖于 networking-sfc 能够创建 SFC 和分类器。Networking-sfc 已经支持通过 OpenvSwitch (OVS) 驱动程序创建链和分类器。如前所述,另一种 SFC 方法是使用 OpenDaylight,以及网络服务标头协议和传输介质,例如 VXLAN+GPE。

NSH 用于携带 SFC 信息并为链提供安全性 [1]。NSH 不是传输协议。因此,它不能是数据包的外部标头,而必须由另一个协议封装。目前有多种方法可以做到这一点,包括使用 VXLAN+GPE 或以太网作为封装方法。

OpenvSwitch 目前具有来自 Cisco [2] 和 Intel 的非官方补丁,以提供 NSH。前者允许使用 VXLAN+GPE NSH 启用的 OVS,而后者允许使用以太网 NSH 封装(但仅适用于 DPDK)。

NSH 标头必须转发到 VNF VM 本身,以便 VNF 能够递减 NSH 标头并确保链的可靠性。Tacker SFC 工作依赖于解决此 OVS 问题,以便 VNF VM 能够接收 NSH 数据包。

此方法周围的依赖关系包括 networking-sfc 包含一个可用的 OpenDaylight 驱动程序。更下游的依赖关系包括 OpenDaylight SFC 和 OpenvSwitch。

此外,可能存在对 tosca-parser 的依赖。在解析 VNFFG 和本文档中定义的相关的 VNFD 添加时,可能需要一些额外的支持。

测试

目前,尚未向 Tacker 添加 tempest 测试,并将跟踪为单独的活动。最终,该活动将在 OPNFV SFC 中进行,以利用他们的 Functest 和 CI 团队进行测试。

文档影响

将向 Tacker 仓库添加新的 VNFFG API 文档。

参考资料