Enhance VNF LCM API based on ETSI NFV-SOL specification

This spec aim to implement remaining VNF LCM API features
that are not implemented in Ussuri release.

* Support remaining API message-body attributes
* Support "vnfPkgId" to related LCM APIs
* Enable URI query parameters based on NFV-SOL v2.4.1

Blueprint: support-etsi-nfv-specs
Change-Id: Icc79264fa7bfd207a51f83319cfbaa5b1bb87a21
This commit is contained in:
Keiko Kuriu 2020-05-29 14:59:00 +09:00
parent 96f0c20269
commit af974a0a42

View File

@ -0,0 +1,824 @@
..
This work is licensed under a Creative Commons Attribution 3.0 Unported
License.
http://creativecommons.org/licenses/by/3.0/legalcode
==========================================
Enhance VNF lifecycle management in Tacker
==========================================
https://blueprints.launchpad.net/tacker/+spec/support-etsi-nfv-specs
This specification describes enhancement of VNF lifecycle management in
Tacker.
Problem description
===================
In Ussuri release, we have added limited support of VNF lifecycle management as
defined in ETSI NFV SOL 002 [#etsi_sol002]_ and SOL 003 [#etsi_sol003]_.
Tacker should support more attributes to compliant ETSI NFV SOL specification
and expand a wide range of use cases.
Proposed change
===============
For backward compatibility, VNFM supports following features:
* to set vnfPkgId to related APIs.
This parameter was present upon SOL003 version 2.4.1 [#etsi_sol003_v241]_ ,
but it is removed upon SOL003 version 2.6.1.
- Create VNF Identifier(Response)
- Query VNF(Response)
- List VNF Instances(Response)
- Modify VNF Instances(Request)
* to support attribute filtering
In order to get vnfPkgId, VNFM support Attribute based filtering
1) vnfPkgId support
-------------------
1-1) Flow of Create VNF Request
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. seqdiag::
seqdiag {
Client; NFVO; tacker-server; tacker-conductor;
Client -> "tacker-server" [label = "POST /vnf_instances/"];
"tacker-server" ->> "tacker-server"
[label = "Create VNF instance resource"];
"tacker-server" -> "tacker-conductor"
[label = "execute vnf_package list process{filter}"];
NFVO <- "tacker-conductor"
[label = "GET /vnf_packages/ with attribute filter(vnfdId)"];
NFVO --> "tacker-conductor" [label = "Response 200 OK with VnfPkgInfo"];
"tacker-server" <<- "tacker-conductor" [label = "(VnfPkgInfo)"];
"tacker-server" ->> "tacker-server"
[label = "Update VNF instance resource(VnfPkgInfo)"];
"tacker-server" -> "tacker-conductor"
[label = "execute vnf_package content process{vnfPkgId}"];
NFVO <- "tacker-conductor"
[label = "GET /vnf_packages/{vnfPkgId}/package_content "];
NFVO --> "tacker-conductor"
[label = "Response 200 OK with VNF package file"];
"tacker-server" <<- "tacker-conductor"
[label = "(VNF package content file)"];
"tacker-server" ->> "tacker-server"
[label = "Store received package file"];
"tacker-server" -> "tacker-conductor"
[label = "execute vnf_package vnfd process{vnfPkgId}"];
NFVO <- "tacker-conductor"
[label =
"GET /vnf_packages/{vnfPkgId}/vnfd
with 'Accept' header contains 'text/plain'"];
NFVO --> "tacker-conductor" [label = "Response 200 OK with VNFD contents"];
"tacker-server" <<- "tacker-conductor" [label = "(VNFD)"];
"tacker-server" ->> "tacker-server"
[label = "Update VNF instance resource(VNFD)"];
"tacker-server" -> "tacker-conductor"
[label = "execute vnf_package artifact process{vnfPkgId}"];
NFVO <- "tacker-conductor"
[label = "GET /vnf_packages/{vnfPkgId}/artifacts/{artifactPath}"];
NFVO --> "tacker-conductor" [label = "Response 200 OK with artifact file"];
"tacker-server" <<- "tacker-conductor" [label = "(artifact file)"];
"tacker-server" ->> "tacker-server"
[label = "Store received package file"];
Client <- "tacker-server" [label = " Resonse 201 Created(vnfPkgId)"];
"tacker-server" ->> "tacker-conductor"
[label = "execute notification process"];
Client <- "tacker-conductor" [label = "POST {callback URI}"];
Client --> "tacker-conductor" [label = "Responce 204 No Content"];
}
VNFM sends a GET request filtered by "vnfdId" to NFVO in order to query
information of the VNF packages to get "vnfPkgId" because the APIs to get VNF
packages using "vnfdId" is not supported.
Since the VNF package needs to be obtained from NFVO, the obtained "vnfPkgId"
is saved in the DB and used as an argument of getting VNF package request from
VNFM.
After that, VNFM starts the information collection sequence enabled by the
configuration and collects the content/VNFD/artifact.
These GET requests, "VNF package content" , "VNFD in an individual VNF package"
and "Individual VNF package artifact", can be configured to execute or
not for each API. After successfully obtaining the target VNF package,
VNFM returns a 201 Created response containing "vnfPkgId" attribute
in the payload body.
1-2) Flow of Query VNF Request
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. seqdiag::
seqdiag {
Client -> "tacker-server" [label = " GET /vnf_instantces/{vnfInstanceId}"];
Client <-- "tacker-server" [label = " Resonse 200 OK (vnfPkgId)"];
}
VNFM returns a "200 OK" response that includes "vnfPkgId" in the payload body.
1-3) Flow of List VNF Request
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. seqdiag::
seqdiag {
Client -> "tacker-server" [label = " GET /vnf_instantces"];
Client <-- "tacker-server" [label = " Resonse 200 OK (vnfPkgId)"];
}
VNFM returns a "200 OK" response that includes "vnfPkgId" in the payload body.
1-4) Flow of Modify VNF Request
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. seqdiag::
seqdiag {
Client; NFVO; tacker-server; tacker-conductor;
Client -> "tacker-server"
[label = "PATCH /vnf_instances/{vnfInstanceId} (vnfPkgId)"];
Client <-- "tacker-server" [label = "Response 202 Accepted"];
"tacker-server" -> "tacker-conductor"
[label = "execute Individual vnf_package process{vnfPkgId}"];
NFVO <- "tacker-conductor"
[label = "GET /vnf_packages/ with attribute filter(vnfdId)"];
NFVO --> "tacker-conductor" [label = "Response 200 OK with VnfPkgInfo"];
"tacker-server" <<- "tacker-conductor" [label = "(VnfPkgInfo)"];
"tacker-server" ->> "tacker-server"
[label = "Update VNF instance resource(VnfPkgInfo , vnfPkgId)"];
"tacker-server" -> "tacker-conductor"
[label = "execute vnf_package content process{vnfPkgId}"];
NFVO <- "tacker-conductor"
[label = "GET /vnf_packages/{vnfPkgId}/package_content "];
NFVO --> "tacker-conductor"
[label = "Response 200 OK with VNF package file"];
"tacker-server" <<- "tacker-conductor"
[label = "(VNF package content file)"];
"tacker-server" ->> "tacker-server"
[label = "Store received package file"];
"tacker-server" -> "tacker-conductor"
[label = "execute vnf_package vnfd process{vnfPkgId}"];
NFVO <- "tacker-conductor"
[label =
"GET /vnf_packages/{vnfPkgId}/vnfd
with 'Accept' header contains 'text/plain'"];
NFVO --> "tacker-conductor" [label = "Response 200 OK with VNFD contents"];
"tacker-server" <<- "tacker-conductor" [label = "(VNFD)"];
"tacker-server" ->> "tacker-server"
[label = "Update VNF instance resource(VNFD)"];
"tacker-server" -> "tacker-conductor"
[label = "execute vnf_package artifact process{vnfPkgId}"];
NFVO <- "tacker-conductor"
[label = "GET /vnf_packages/{vnfPkgId}/artifacts/{artifactPath}"];
NFVO --> "tacker-conductor" [label = "Response 200 OK with artifact file"];
"tacker-server" <<- "tacker-conductor" [label = "(artifact file)"];
"tacker-server" ->> "tacker-server"
[label = "Store received package file"];
"tacker-server" -> "tacker-conductor"
[label = "trriger asynchronous task"];
"tacker-conductor" ->> "tacker-conductor"
[label = "execute notification process"];
Client <- "tacker-conductor" [label = "POST {callback URI} (PROCESSING)"];
Client --> "tacker-conductor" [label = "Response: 204 No Content"];
"tacker-conductor" ->> "tacker-conductor" [label = "VNF Modification"];
"tacker-conductor" ->> "tacker-conductor"
[label = "execute notification process"];
Client <- "tacker-conductor" [label = "POST {callback URI} (COMPLETED)"];
Client --> "tacker-conductor" [label = "Response: 204 No Content"];
}
Client sends a modify VNF Information request which includes "vnfPkgId"
attribute.
After that, start the information collection sequence enabled by the
configuration and collect the content/VNFD/artifact.
These GET requests, "VNF package content" , "VNFD in an individual VNF package"
and "Individual VNF package artifact", can be configured to execute or
not for each API. VNFM will continue to modify VNF information after
collecting all VNF package information correctly.
2) Support of Attribute based filtering
---------------------------------------
For an enhancement of LCM support with attribute based filering feature,
the filter specification defined in SOL013 [#etsi_sol013]_ section 5.2.2 will be supported in
Victoria release.
This feature can operate below:
* vnf_instances(GET)
Operators for attribute-based filtering
.. list-table::
:header-rows: 1
* - Operator with parameters
- Meaning
* - eq,<attrName>,<value>
- Attribute equal to <value>
* - neq,<attrName>,<value>
- Attribute not equal to <value>
* - in,<attrName>,<value>[,<value>]*
- Attribute equal to one of the values in the list ("in set"
relationship)
* - nin,<attrName>,<value>[,<value>]*
- Attribute not equal to any of the values in the list
("not in set" relationship)
* - gt,<attrName>,<value>
- Attribute greater than <value>
* - gte,<attrName>,<value>
- Attribute greater than or equal to <value>
* - lt,<attrName>,<value>
- Attribute less than <value>
* - lte,<attrName>,<value>
- Attribute less than or equal to <value>
* - cont,<attrName>,<value>[,<value>]*
- String attribute contains (at least) one of the values in the list
* - ncont,<attrName>,<value>[,<value>]*
- String attribute does not contain any of the values in the list
Applicability of the operators to data types
+-----------+----------+----------+----------+-------------+----------+
| Operator | String | Number | DateTime | Enumeration | Boolean |
+===========+==========+==========+==========+=============+==========+
| eq | x | x | | x | x |
+-----------+----------+----------+----------+-------------+----------+
| neq | x | x | | x | x |
+-----------+----------+----------+----------+-------------+----------+
| in | x | x | | x | |
+-----------+----------+----------+----------+-------------+----------+
| nin | x | x | | x | |
+-----------+----------+----------+----------+-------------+----------+
| gt | x | x | x | | |
+-----------+----------+----------+----------+-------------+----------+
| gte | x | x | x | | |
+-----------+----------+----------+----------+-------------+----------+
| lt | x | x | x | | |
+-----------+----------+----------+----------+-------------+----------+
| lte | x | x | x | | |
+-----------+----------+----------+----------+-------------+----------+
| cont | x | | | | |
+-----------+----------+----------+----------+-------------+----------+
| ncont | x | | | | |
+-----------+----------+----------+----------+-------------+----------+
The Above tables defines which operators are applicable for which data types.
All combinations marked with a "x" shall be supported.
Alternatives
------------
None
Data model impact
-----------------
Modify below tables in tacker database. The corresponding schemas are
detailed below:-
vnf_instances::
vnf_pkg_id vnf_pkg_id varchar(36)
vnf_metadata vnf_metadata json
REST API impact (needs to be updated)
-------------------------------------
The following attributes of restFul API will be added. These attributes are
based on ETSI NFV SOL002 [#etsi_sol002]_ and SOL003 [#etsi_sol003]_.
* | **Name**: Create VNF Identifier
| **Description**: Creates a new VNF instance resource
| **Method type**: POST
| **URL for the resource**: /vnflcm/v1/vnf_instances
| **Request**:
+------------------+-------------+------------------------------+
| Data type | Cardinality | Description |
+==================+======+======+==============================+
| CreateVnfRequest | 1 | The VNF creation parameters. |
+------------------+-------------+------------------------------+
.. list-table::
:header-rows: 1
* - Attribute name
- Data type
- Cardinality
- Support in Victoria
* - vnfdId
- Identifier
- 1
- Already supported in Ussuri
* - vnfInstanceName
- String
- 0..1
- Already supported in Ussuri
* - vnfInstanceDescription
- String
- 0..1
- Already supported in Ussuri
* - metadata
- KeyValuePairs
- 0..1
- Yes
| **Response**:
.. list-table::
:widths: 10 10 18 50
:header-rows: 1
* - Data type
- Cardinality
- Response Codes
- Description
* - VnfInstance
- 1
- | Success 201
| Error 400 401 403
- VNF instance identifier was created successfully.
* | **Name**: Query VNF
| **Description**: Request to existing VNF instance resource by its id
| **Method type**: GET
| **URL for the resource**: /vnflcm/v1/vnf_instances/{vnfInstanceId}
| **Resource URI variables for this resource**:
+---------------+---------------------------------+
| Name | Description |
+===============+=================================+
| vnfInstanceId | Identifier of the VNF instance. |
+---------------+---------------------------------+
| **Response**:
.. list-table::
:widths: 10 10 18 50
:header-rows: 1
* - Data type
- Cardinality
- Response Codes
- Description
* - VnfInstance
- 1
- | Success: 200
| Error: 401 403 404
- Information about an individual VNF instance was queried successfully.
* | **Name**: List VNF Instances
| **Description**: Request to list all existing VNF instances
| **Method type**: GET
| **URL for the resource**: /vnflcm/v1/vnf_instances
| **Response**:
.. list-table::
:widths: 10 10 18 50
:header-rows: 1
* - Data type
- Cardinality
- Response Codes
- Description
* - VnfInstance
- 0..N
- | Success: 200
| Error: 401 403
- Information about zero or more VNF instances was queried successfully.
.. list-table::
:header-rows: 1
* - Attribute name
- Data type
- Cardinality
- Support in Victoria
* - id
- Identifier
- 1
- Already supported in Ussuri
* - vnfInstanceName
- String
- 0..1
- Already supported in Ussuri
* - vnfInstanceDescription
- String
- 0..1
- Already supported in Ussuri
* - vnfdId
- Identifier
- 1
- Already supported in Ussuri
* - vnfProvider
- String
- 1
- Already supported in Ussuri
* - vnfProductName
- String
- 1
- Already supported in Ussuri
* - vnfSoftwareVersion
- Version
- 1
- Already supported in Ussuri
* - vnfdVersion
- Version
- 1
- Already supported in Ussuri
* - vnfPkgId
- Identifier
- 1
- Yes
* - vnfConfigurableProperties
- KeyValuePairs
- 0..1
- No
* - vimConnectionInfo
- VimConnectionInfo
- 0..N -> 0..1
- Yes
* - instantiationState
- Enum
- 1
- Already supported in Ussuri
* - instantiatedVnfInfo
- Structure
- 0..1
- Already supported in Ussuri
* - >flavourId
- IdentifierInVnfd
- 1
- Already supported in Ussuri
* - >vnfState
- VnfOperationalStateType
- 1
- Already supported in Ussuri
* - >scaleStatus
- ScaleInfo
- 0..N
- Yes
* - >extCpInfo
- VnfExtCpInfo
- 1..N
- Already supported in Ussuri
* - >extVirtualLinkInfo
- ExtVirtualLinkInfo
- 0..N
- Already supported in Ussuri
* - >extManagedVirtualLinkInfo
- ExtManagedVirtualLinkInfo
- 0..N
- Already supported in Ussuri
* - >monitoringParameters
- MonitoringParameter
- 0..N
- No
* - >localizationLanguage
- String
- 0..1
- No
* - >vnfcResourceInfo
- VnfcResourceInfo
- 0..N
- Already supported in Ussuri
* - >vnfVirtualLinkResourceInfo
- VnfVirtualLinkResourceInfo
- 0..N
- Already supported in Ussuri
* - >virtualStorageResourceInfo
- VirtualStorageResourceInfo
- 0..N
- Already supported in Ussuri
* - >vnfcInfo
- VnfcInfo
- 0..N
- Yes
* - metadata
- KeyValuePairs
- 0..1
- No
* - extensions
- KeyValuePairs
- 0..1
- No
* - _links
- Structure
- 1
- Already supported in Ussuri
* - >self
- Link
- 1
- Already supported in Ussuri
* - >indicators
- Link
- 0..1
- No
* - >instantiate
- Link
- 0..1
- Already supported in Ussuri
* - >terminate
- Link
- 0..1
- Already supported in Ussuri
* - >scale
- Link
- 0..1
- Yes
* - >scaleToLevel
- Link
- 0..1
- No
* - >changeFlavour
- Link
- 0..1
- No
* - >heal
- Link
- 0..1
- Already supported in Ussuri
* - >operate
- Link
- 0..1
- No
* - >changeExtConn
- Link
- 0..1
- No
.. Already supported in Ussuri:: vnfPkgId
* | **Name**: Instantiate VNF task
| **Description**: This task resource represents the "Instantiate VNF"
operation. The client can use this resource to instantiate a VNF instance.
| **Method type**: POST
| **URL for the resource**: /vnflcm/v1/vnf_instances/{vnfInstanceId}/instantiate
| **Resource URI variables for this resource**:
+---------------+--------------------------------------------------------+
| Name | Definition |
+===============+========================================================+
| vnfInstanceId | The identifier of the VNF instance to be instantiated. |
+---------------+--------------------------------------------------------+
| **Request**:
.. list-table::
:header-rows: 1
* - Data type
- Cardinality
- Description
* - InstantiateVnfRequest
- 1
- Parameters passed to instantiate task.
.. list-table::
:widths: 10 10 10 10 40
:header-rows: 1
* - Attribute name
- Data type
- Cardinality
- Support in Victoria
- Description
* - flavourId
- IdentifierInVnfd
- 1
- Already supported in Ussuri
- Identifier of the VNF deployment flavour to be instantiated.
* - instantiationLevelId
- IdentifierInVnfd
- 0..1
- Already supported in Ussuri
- Identifier of the instantiation level of the deployment flavour to be
instantiated. If not present, the default instantiation level as
declared in the VNFD is instantiated.
* - extVirtualLinks
- ExtVirtualLinkData
- 0..N
- Already supported in Ussuri
- Information about external VLs to connect the VNF to.
* - vimConnectionInfo
- VimConnectionInfo
- 0..N -> 0..1
- Already supported in Ussuri
- Information about VIM connections to be used for managing the
resources for the VNF instance. In U release, only 0..1
VIMConnectionInfo will be accepted.
* - additionalParams
- KeyValuePairs
- 0..1
- Already supported in Ussuri
- Additional params for instantiation process, specific to the VNF
being instantiated.
* - extManagedVirtualLinks
- ExtManagedVirtualLinkData
- 0..N
- Already supported in Ussuri
-
* - localizationLanguage
- String
- 0..1
- No
-
* - extensions
- KeyValuePairs
- 0..1
- No
-
| **Response**:
.. list-table::
:widths: 12 10 28 50
:header-rows: 1
* - Data type
- Cardinality
- Response Codes
- Description
* - n/a
-
- | Success: 202
| Error: 400, 401, 403, 404, 409
- The request was accepted for processing, but the processing has
not been completed.
* | **Name**: Terminate VNF task
| **Description**: This task resource represents the "Terminate VNF"
operation. The client can use this resource to terminate a VNF instance.
| **Method type**: POST
| **URL for the resource**:
/vnflcm/v1/vnf_instances/{vnfInstanceId}/terminate
| **Resource URI variables for this resource**:
+---------------+------------------------------------------------------+
| Name | Description |
+===============+======================================================+
| vnfInstanceId | The identifier of the VNF instance to be terminated. |
+---------------+------------------------------------------------------+
| **Request**:
.. list-table::
:header-rows: 1
* - Data type
- Cardinality
- Description
* - TerminateVnfRequest
- 1
- Parameters passed to Terminate VNF task.
.. list-table::
:widths: 10 10 10 10 10 40
:header-rows: 1
* - Attribute name
- Data type
- Possible values
- Cardinality
- Support
- Description
* - terminationType
- Enum (inlined)
- FORCEFUL
GRACEFUL
- 1
- Already supported in Ussuri
- | Indicates whether forceful or graceful termination is requested.
| - FORCEFUL: The VNFM will shut down the VNF and release the
resources immediately.
| - GRACEFUL: The VNFM will first arrange to take the VNF out of
service. Once the operation of taking the VNF out of service
finishes, it will wait for the period as specified in the
gracefulTerminationTimeout and then VNFM will shutdown the VNF
and release the resources.
* - additionalParams
- KeyValuePairs
-
- 0..1
- Yes
- Additional parameters to the termination process, specific to the VNF
being terminated.
* - gracefulTerminationTimeout
- Integer
-
- 0..1
- Already supported in Ussuri
- This attribute is only applicable in case of graceful termination.
It defines the time to wait for the VNF to be taken out of service
before shutting down the VNF and releasing the resources. The unit
is seconds.
| **Response**:
.. list-table::
:widths: 10 10 30 50
:header-rows: 1
* - Data type
- Cardinality
- Response Codes
- Description
* - n/a
-
- | Success: 202
| Error: 400, 401, 403, 404, 409
- The request was accepted for processing, but the processing has
not been completed.
Security impact
---------------
None
Notifications impact
--------------------
None
Other end user impact
---------------------
None
Performance Impact
------------------
None
Other deployer impact
---------------------
The previously created VNFs will not be allowed to be managed using the newly
introduced APIs.
Developer impact
----------------
None
Implementation
==============
Assignee(s)
-----------
Primary assignee:
Keiko Kuriu <keiko.kuriu.wa@hco.ntt.co.jp>
Work Items
----------
* Add new REST API attributes to Tacker-server.
* Add new unit and functional tests.
* Change API Tacker documentation.
Dependencies
============
"Modify VNF" refered in "Proposed change" is ETSI SOL based API proposed
in the spec [#modify_spec]_.
Testing
========
Unit and functional test cases will be added for VNF lifecycle management
of VNF instances.
Documentation Impact
====================
Complete user guide will be added to explain how to invoke VNF lifecycle
management of VNF instances with examples.
References
==========
.. [#etsi_sol002]
https://www.etsi.org/deliver/etsi_gs/NFV-SOL/001_099/002/02.06.01_60/gs_nfv-sol002v020601p.pdf
(Chapter 5: VNF Lifecycle Management interface)
.. [#etsi_sol003]
https://www.etsi.org/deliver/etsi_gs/NFV-SOL/001_099/003/02.06.01_60/gs_nfv-sol003v020601p.pdf
(Chapter 5: VNF Lifecycle Management interface)
.. [#etsi_sol003_v241]
https://www.etsi.org/deliver/etsi_gs/NFV-SOL/001_099/003/02.04.01_60/gs_nfv-sol003v020401p.pdf
(Chapter 5: VNF Lifecycle Management interface)
.. [#etsi_sol013]
https://www.etsi.org/deliver/etsi_gs/NFV-SOL/001_099/013/02.06.01_60/gs_nfv-sol013v020601p.pdf
(Chapter 5: Result set control)
.. [#modify_spec] https://review.opendev.org/#/c/731697/