Merge "Support LCM notification based on ETSI NFV-SOL specification"

This commit is contained in:
Zuul 2020-07-20 03:09:14 +00:00 committed by Gerrit Code Review
commit 37784e2650
1 changed files with 793 additions and 0 deletions

View File

@ -0,0 +1,793 @@
..
This work is licensed under a Creative Commons Attribution 3.0 Unported
License.
http://creativecommons.org/licenses/by/3.0/legalcode
=====================================================================
Support LCM notifications for VNF based on ETSI NFV-SOL specification
=====================================================================
https://blueprints.launchpad.net/tacker/+spec/support-etsi-nfv-specs
ETSI specifications within the NFV Architecture Framework [#etsi_nfv]_
describe the main aspects of NFV development and usage based on of the
industry needs, feedback from SDN/NFV vendors and telecom operators.
These specifications include the REST API and data model architecture
which is used by NFV users and developers in related products.
Problem description
===================
In the current Tacker implementation based on ETSI NFV-SOL,
Tacker uses its own API which describes VNF lifecycle change
notifications which is Ability to inform the receiver that
LCM operations has been changed.
However, those operations are not aligned with the current ETSI NFV
data-model. As a result, there might be lack of compatibility with
`3rd party VNFs` [#etsi_plugtest2]_, as they are developed according to ETSI
NFV specifications. Support of key ETSI NFV specifications will
significantly reduce efforts for Tacker integration into Telecom production
networks and also will simplify further development and support of future
standards.
Proposed change
===============
Introduces new interfaces to VNFM in order to notify VNF lifecycle
management operations status for VNF instances.
The operation provided through the interfaces are:
* Subscription (GET/POST/DELETE)
* Notification endpoint (POST)
* Individual Subscription (GET)
* individual VNF occurrence (GET)
1Flow of managing subscriptions
---------------------------------
* Register subscription
.. seqdiag::
seqdiag {
Client -> "tacker-server" [label = " POST /subscriptions"];
"tacker-server" -> "tacker-server"
[label = " generate subscription_id (uuid)"];
Client <-- "tacker-server" [label = " Resonse 201 Created"];
}
* Delete subscription
.. seqdiag::
seqdiag {
Client -> "tacker-server"
[label = " DELETE /subscriptions/{subscriptionId}"];
Client <-- "tacker-server" [label = " Resonse 204 No Content"];
}
* Show subscription
.. seqdiag::
seqdiag {
Client -> "tacker-server" [label = " GET /subscriptions/{subscriptionId}"];
Client <-- "tacker-server" [label = " Resonse 200 OK"];
}
* List subscription
.. seqdiag::
seqdiag {
Client -> "tacker-server" [label = " GET /subscriptions"];
"tacker-server" -> "tacker-server" [label = "request validation"];
Client <-- "tacker-server" [label = " Resonse 200 OK"];
}
* VNFM holds the Callback URL sent by consumer via "Subscription API"
in advance.
* Notify the issuer of the ID associated with the received Subscription
request.
* For the registered Subscription status, read by specifying ID, reading of
all ID data and deletion of specified ID are allowed.
2Flow of sending notifications
--------------------------------
* Depending on the progress status of the sequence, VNFM send notification
(Notify) to notify the status change and update the internal
operation_status.
Precondition: Requesting Node has subscribed previously to notifications
related to VNF lifecycle management.
* When the LCM request is accepted, the operation status is sent to the
consumer which registers subscription via "Subscription API". This will
be sent for the number of registrations.
* The following operation states can be notified:
STARTING/PROCESSING/COMPLETED/ROLLINGBACK/ROLLEDBACK/FAILED_TEMP
* STARTING state is sent from Tacker Server, and other Operation_state
notifications are sent from Tacker-Conductor.
* Modify VNF does not send STARTING state.
* NFVO which recieved notification infomation sends 204 No Content to Tacker.
3) Flow of LCM Operation with notification
------------------------------------------
* Instantiate VNF
* Scale VNF
* Heal VNF
* Terminate VNF
.. seqdiag::
seqdiag {
Client -> "tacker-server" [label = "LCM Operation Request"];
Client <-- "tacker-server" [label = "Response 202 Accepted"];
"tacker-server" ->> "tacker-conductor"
[label = "execute notification process"];
Client <- "tacker-conductor" [label = "POST {callback URI} (STARTING)"];
Client --> "tacker-conductor" [label = "Response: 204 No Content"];
"tacker-server" -> "tacker-conductor"
[label = "trriger asynchronous task"];
NFVO <- "tacker-conductor" [label = "POST /grants"];
NFVO --> "tacker-conductor" [label = "201 Created"];
"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" -> "VnfLcmDriver" [label = "execute MgmtDriver"];
"tacker-conductor" <-- "VnfLcmDriver" [label = ""];
"tacker-conductor" -> "VnfLcmDriver" [label = "execute VnfLcmDriver"];
"tacker-conductor" <-- "VnfLcmDriver" [label = ""];
"tacker-conductor" ->> "tacker-conductor"
[label = "execute notification process"];
Client <- "tacker-conductor" [label = "POST {callback URI} (COMPLETED)"];
Client --> "tacker-conductor" [label = "Response: 204 No Content"];
}
* Modify VNF
.. seqdiag::
seqdiag {
Client -> "tacker-server" [label = "LCM Operation Request"];
Client <-- "tacker-server" [label = "Response 202 Accepted"];
"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" -> "VnfLcmDriver" [label = "execute MgmtDriver"];
"tacker-conductor" <-- "VnfLcmDriver" [label = ""];
"tacker-conductor" -> "VnfLcmDriver" [label = "execute VnfLcmDriver"];
"tacker-conductor" <-- "VnfLcmDriver" [label = ""];
"tacker-conductor" ->> "tacker-conductor"
[label = "execute notification process"];
Client <- "tacker-conductor"
[label = "POST {callback URI} (COMPLETED)"];
Client --> "tacker-conductor" [label = "Response: 204 No Content"];
}
* Rollback
.. seqdiag::
seqdiag {
node_width = 100;
edge_length = 160;
Client -> "tacker-server"
[label = "POST /vnf_lcm_op_occs/{vnfLcmOpOccId}/rollback"];
Client <-- "tacker-server" [label = "Response 202 Accepted"];
"tacker-server" -> "tacker-conductor"
[label = "trriger asynchronous task"];
"tacker-conductor" ->> "tacker-conductor"
[label = "execute notification process"];
Client <- "tacker-conductor"
[label = "POST {callback URI} (ROLLING_BACK)"];
Client --> "tacker-conductor"
[label = "Response: 204 No Content"];
"tacker-conductor" -> "MgmtDriver" [label = "execute MgmtDriver"];
"tacker-conductor" <-- "MgmtDriver" [label = ""];
"tacker-conductor" -> "VnfLcmDriver" [label = "execute VnfLcmDriver"];
"tacker-conductor" <-- "VnfLcmDriver" [label = ""];
"tacker-conductor" ->> "tacker-conductor"
[label = "execute notification process"];
Client <- "tacker-conductor"
[label = "POST {callback URI} (ROLLED_BACK)"];
Client --> "tacker-conductor"
[label = "Response: 204 No Content"];
}
4) Flow of VNF instance resource with notification
--------------------------------------------------
* CereateVNFRequest
.. seqdiag::
seqdiag {
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"];
Client <-- "tacker-server" [label = " Resonse 201 Created"];
"tacker-server" ->> "tacker-conductor"
[label = "execute notification process"];
Client <- "tacker-conductor" [label = "POST {callback URI}"];
Client --> "tacker-conductor" [label = "Responce 204 No Content"];
}
* DeleteVNFRequest
.. seqdiag::
seqdiag {
Client -> "tacker-server" [label = "DELETE /vnf_instances/{vnfInstanceId} "];
"tacker-server" ->> "tacker-server"
[label = "Delete VNF instance resource"];
Client <-- "tacker-server" [label = " Resonse 204 No Content"];
"tacker-server" ->> "tacker-conductor"
[label = "execute notification process"];
Client <- "tacker-conductor" [label = "POST {callback URI}"];
Client --> "tacker-conductor" [label = "Responce 204 No Content"];
}
5Flow of Getting Operation Status
-----------------------------------
Operation status can be obtained from VNFM.
.. seqdiag::
seqdiag {
Client -> "tacker-server" [label = " GET /vnf_lcm_op_occs/{vnfLcmOpOccId}"];
Client <-- "tacker-server" [label = " Resonse 200 OK"];
}
* The transmission source node specifies the vnfLcmOpOccId issued at the time
of subscription and reads the information about the resource in the
Subscription state.
* If the VNFM information read is successful, Response 200 OK is responded.
Alternatives
------------
None
Data model impact
-----------------
Add below new tables in tacker database. The corresponding schemas are
detailed below:-
A list of added tables:
- vnf_lcm_filters
details of added table:
vnf_lcm_filters:
.. code-block:: python
id id varchar(36) Not Null
subscription_uuid subscription_uuid varchar(36) Not Null
filter filter json Not Null
vnf_instance_ids vnf_instance_ids MEDIUMBLOB
vnf_instance_ids_len vnf_instance_ids_len int
notification_types notification_types MEDIUMBLOB
notification_types_len notification_types_len int
operation_types operation_types MEDIUMBLOB
operation_types_len operation_types_len int
operation_states operation_states MEDIUMBLOB
operation_states_len operation_states_len int
This table has current status of LCM.
Table for accumulating information for each event.
vnf_lcm_op_occs:
.. code-block:: python
id id varchar(36) Not Null
operation_state operation_state varchar(16) Not Null
state_entered_time state_entered_time datetime Not Null
start_time start_time datetime Not Null
vnf_instance_id vnf_instance_id varchar(36) Not Null
operation operation varchar(16) Not Null
is_automatic_invocation is_automatic_invocation tinyint(1) Not Null
operation_params operation_params json
error error json
resource_changes resource_changes json
This table has current status of operation occurrence
vnf_lcm_subscriptions:
.. code-block:: python
id id varchar(36) Not Null
callback_uri callback_uri varchar(255) Not Null
subscription_authentication subscription_authentication json
This table has registration information of Subscription
REST API impact
---------------
The following restFul API will be added. This restFul API will be based on
ETSI NFV SOL002 [#NFV-SOL002]_ and SOL003 [#NFV-SOL003]_.
* | **Name**: Subscriptions
| **Description**: Subscribe to notifications related to VNF lifecycle
management
| **Method type**: POST
| **URL for the resource**: /vnflcm/v1/subscriptions
| **Request**:
+--------------------------+-------------+----------------------------------+
| Data type | Cardinality | Description |
+==========================+======+======+==================================+
| LccnSubscriptionRequest | 1 | Parameters for the Subscription. |
+--------------------------+-------------+----------------------------------+
.. list-table::
:header-rows: 1
* - Attribute name
- Data type
- Cardinality
- Supported in (V)
* - filter
- LifecycleChangeNotificationFilter
- 0..1
- Yes
* - callbackUri
- Uri
- 1
- Yes
* - authentication
- SubscriptionAuthentication
- 0..1
- Yes
| **Response**:
.. list-table::
:widths: 10 10 18 50
:header-rows: 1
* - Data type
- Cardinality
- Response Codes
- Description
* - LccnSubscription
- n/a
- | Success 201
| Redirection 303
| Error 4xx
- The subscription has been created successfully.
* | **Name**: List Subscriptions
| **Description**: Request to list all existing subscriptions
| **Method type**: GET
| **URL for the resource**: /vnflcm/v1/subscriptions
| **Request**:
.. list-table::
:header-rows: 1
* - Data type
- Cardinality
- Description
- Supported in (V)
* - filter
- 0..1
- Filter to list subscriptions
- No
| **Response**:
.. list-table::
:widths: 10 10 18 50
:header-rows: 1
* - Data type
- Cardinality
- Response Codes
- Description
* - LccnSubscription
- n/a
- | Success 200
| Error 400 4xx
- The list of subscriptions has been queried successfully.
* | **Name**: Query Subscriptions
| **Description**: Request to show individual subscription resource by its id
| **Method type**: GET
| **URL for the resource**: /vnflcm/v1/subscriptions/{subscriptionId}
| **Request**:
+----------------+----------------------------------+
| Name | Description |
+================+==================================+
| subscriptionId | Identifier of the subscriptions. |
+----------------+----------------------------------+
| **Response**:
.. list-table::
:widths: 10 10 18 50
:header-rows: 1
* - Data type
- Cardinality
- Response Codes
- Description
* - LccnSubscription
- n/a
- | Success 200
| Error 400 4xx
- The operation has completed successfully.
* | **Name**: Delete Subscriptions
| **Description**: Request to delete individual subscription resource by
its id
| **Method type**: DELETE
| **URL for the resource**: /vnflcm/v1/subscriptions/{subscriptionId}
| **Request**:
+----------------+----------------------------------+
| Name | Description |
+================+==================================+
| subscriptionId | Identifier of the subscriptions. |
+----------------+----------------------------------+
| **Response**:
.. list-table::
:widths: 10 10 18 50
:header-rows: 1
* - Data type
- Cardinality
- Response Codes
- Description
* - n/a
- n/a
- | Success 204
| Error 400 4xx
- The individual subscription resource has been deleted successfully.
* | **Name**: Notification endpoint
| **Description**: Send notifications related to VNF lifecycle changes
| **Method type**: POST
| **URL for the resource**: The resource URI is provided by the client when
creating the subscription.
| **Request**:
.. list-table::
:widths: 20 10 50
:header-rows: 1
* - Data type
- Cardinality
- Description
* - VnfLcmOperationOccurrenceNotification
- 1
- A notification about lifecycle changes triggered by a VNF LCM
operation occurrence.
* - VnfIdentifierCreationNotification
- 1
- A notification about lthe creation of a VNF identifier and the
related individual VNF instance resource.
* - VnfIdentifierDeletionNotification
- 1
- A notification about the deletion of a VNF identifier and the
related individual VNF instance resource.
.. list-table::
:header-rows: 1
* - Attribute name
- Data type
- Cardinality
- Supported in (V)
* - id
- Identifier
- 1
- Yes
* - notificationType
- String
- 1
- Yes
* - subscriptionId
- Identifier
- 1
- Yes
* - timeStamp
- DateTime
- 1
- Yes
* - notificationStatus
- Enum (inlined)
- 1
- Yes
* - operationState
- LcmOperationStateType
- 1
- Yes
* - vnfInstanceId
- Identifier
- 1
- Yes
* - operation
- LcmOperationType
- 1
- Yes
* - isAutomaticInvocation
- Boolean
- 1
- Yes
* - vnfLcmOpOccId
- Identifier
- 1
- Yes
* - affectedVnfcs
- AffectedVnfc
- 0..N
- Yes
* - affectedVirtualLinks
- AffectedVirtualLink
- 0..N
- Yes
* - affectedVirtualStorages
- AffectedVirtualStorage
- 0..N
- Yes
* - changedInfo
- VnfInfoModifications
- 0..1
- Yes
* - changedExtConnectivity
- ExtVirtualLinkInfo
- 0..N
- No
* - error
- ProblemDetails
- 0..1
- Yes
* - _links
- LccnLinks
- 1
- Yes
| **Response**:
.. list-table::
:widths: 12 10 18 50
:header-rows: 1
* - Data type
- Cardinality
- Response Codes
- Description
* - n/a
- n/a
- | Success 204
| Error 4xx
- The notification has been delivered successfully.
.. note:: `virtualLinkDescId`, one of the attribute contained in
affectedVirtualLinks, is removed upon SOL003 version
2.6.1. However, in order to enable Tacker to expand
a wide range of NFV compliant product, `virtualLinkDescId`
will be supported in Victoria release.
* | **Name**: Query VNF occurrence
| **Description**: Request to show individual VNF lifecycle management
operation occurrence by its id
| **Method type**: GET
| **URL for the resource**: /vnflcm/v1/vnf_lcm_op_occs/{vnfLcmOpOccId}
| **Response**:
.. list-table::
:widths: 12 10 18 50
:header-rows: 1
* - Data type
- Cardinality
- Response Codes
- Description
* - VnfLcmOpOcc
- 1
- | Success 200
| Error 4xx
- The operation has completed successfully.
.. list-table::
:header-rows: 1
* - Attribute name
- Data type
- Cardinality
- Supported in (V)
* - id
- Identifier
- 1
- Yes
* - operationState
- LcmOperationStateType
- 1
- Yes
* - stateEnteredTime
- DateTime
- 1
- Yes
* - startTime
- DateTime
- 1
- Yes
* - vnfInstanceId
- Identifier
- 1
- Yes
* - grantId
- Identifier
- 1
- No
* - operation
- LcmOperationType
- 1
- Yes
* - isAutomaticInvocation
- Boolean
- 1
- Yes
* - operationParams
- Object
- 1
- Yes
* - isCancelPending
- Boolean
- 0..N
- No
* - cancelMode
- CancelModeType
- 0..N
- No
* - error
- ProblemDetails
- 0..N
- Yes
* - resourceChanges
- Structure(inlined)
- 0..1
- Yes
* - changedInfo
- VnfInfoModifications
- 0..N
- No
* - changedExtConnectivity
- ExtVirtualLinkInfo
- 0..1
- No
* - _links
- LccnLinks
- 1
- Yes
Security impact
---------------
None
Notifications impact
--------------------
Tacker will creates a new subscription to notifications related to VNF
lifecycle changes and send notification to consumer.
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 endpoints to Tacker-server for LCM notifications interface
of VNF instances.
* Add features which Tacker consumes Rest API for Notifications
* Add new unit and functional tests.
* Change API Tacker documentation.
Dependencies
============
None
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_nfv] https://www.etsi.org/technologies-clusters/technologies/NFV
.. [#NFV-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)
.. [#NFV-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_plugtest2]
https://portal.etsi.org/Portals/0/TBpages/CTI/Docs/2nd_ETSI_NFV_Plugtests_Report_v1.0.0.pdf