From 9703f9bc0a008f4c4a51fc18553f2d03276b96b8 Mon Sep 17 00:00:00 2001 From: yangyan Date: Mon, 25 Sep 2017 15:59:50 +0800 Subject: [PATCH] Add vfc document template Add vfc document template Issue-ID: VFC-447 Change-Id: Ia8b0a80f202865ae8437dfbfe41f6e288cb0661b Signed-off-by: yangyan --- .../NSLCM_API}/NSLCM_API_Specification_v0.1.rst | 2 +- docs/APIs/NSLCM_API/index.rst | 7 + docs/APIs/VNFLCM_API/VNFLCM_API.rst | 1465 ++++++++++++++++++++ docs/APIs/VNFLCM_API/VNFM_API.png | Bin 0 -> 53033 bytes docs/APIs/VNFLCM_API/index.rst | 7 + docs/APIs/VNFMDriver_API/VNFM_Driver_API.rst | 599 ++++++++ docs/APIs/VNFMDriver_API/index.rst | 7 + docs/APIs/index.rst | 43 + docs/architecture.rst | 18 + docs/components.png | Bin 0 -> 6381 bytes docs/delivery.rst | 13 + docs/index.rst | 31 +- docs/installation.rst | 14 + docs/logging.rst | 14 + docs/offeredapis.rst | 43 + docs/vfc-arc.png | Bin 0 -> 71929 bytes 16 files changed, 2255 insertions(+), 8 deletions(-) rename docs/{ => APIs/NSLCM_API}/NSLCM_API_Specification_v0.1.rst (95%) create mode 100644 docs/APIs/NSLCM_API/index.rst create mode 100644 docs/APIs/VNFLCM_API/VNFLCM_API.rst create mode 100644 docs/APIs/VNFLCM_API/VNFM_API.png create mode 100644 docs/APIs/VNFLCM_API/index.rst create mode 100644 docs/APIs/VNFMDriver_API/VNFM_Driver_API.rst create mode 100644 docs/APIs/VNFMDriver_API/index.rst create mode 100644 docs/APIs/index.rst create mode 100644 docs/architecture.rst create mode 100644 docs/components.png create mode 100644 docs/delivery.rst create mode 100644 docs/installation.rst create mode 100644 docs/logging.rst create mode 100644 docs/offeredapis.rst create mode 100644 docs/vfc-arc.png diff --git a/docs/NSLCM_API_Specification_v0.1.rst b/docs/APIs/NSLCM_API/NSLCM_API_Specification_v0.1.rst similarity index 95% rename from docs/NSLCM_API_Specification_v0.1.rst rename to docs/APIs/NSLCM_API/NSLCM_API_Specification_v0.1.rst index b6992b1e..4be4162d 100644 --- a/docs/NSLCM_API_Specification_v0.1.rst +++ b/docs/APIs/NSLCM_API/NSLCM_API_Specification_v0.1.rst @@ -2,7 +2,7 @@ :depth: 1 .. -NL LCM API +NS LCM API ========== { diff --git a/docs/APIs/NSLCM_API/index.rst b/docs/APIs/NSLCM_API/index.rst new file mode 100644 index 00000000..ffbf0756 --- /dev/null +++ b/docs/APIs/NSLCM_API/index.rst @@ -0,0 +1,7 @@ +NSLCM API +--------- + +.. toctree:: + :titlesonly: + +.. literalinclude:: NSLCM_API_Specification_v0.1.rst \ No newline at end of file diff --git a/docs/APIs/VNFLCM_API/VNFLCM_API.rst b/docs/APIs/VNFLCM_API/VNFLCM_API.rst new file mode 100644 index 00000000..9b277d4b --- /dev/null +++ b/docs/APIs/VNFLCM_API/VNFLCM_API.rst @@ -0,0 +1,1465 @@ +.. contents:: + :depth: 3 +.. + + **VNFM API** + **V0.1** + +**1 Scope** +============= + + The scope of the present document is to describe the VNFM exposed + API specification over Or-Vnfm Reference Point. + +**2 Terms, Definitions and Abbreviations** +=========================================== + + For the purposes of the present document, the following + abbreviations apply: + ++------------------------+-----------------------------------------------------+ +| **Abbreviation** | | ++========================+=====================================================+ +| NFVO | Network Functions Virtualization Orchestrator | ++------------------------+-----------------------------------------------------+ +| VNFM | Virtual Network Function Manager | ++------------------------+-----------------------------------------------------+ +| VNF | Virtual Network Function | ++------------------------+-----------------------------------------------------+ +Table 2-1 abbreviations + +**3. Interfaces provided by VNFM** (Or-Vnfm/Ve-Vnfm-vnf) +========================================================== + + Interfaces use RESTful API and the format is as follows: + http(s)://[hostname][:port]/gvnfmapi/lcm/v1/[……] + +|image0| + + + **{apiRoot} is** http(s)://[hostname][:port]/gvnfmapi + +**3.1 Create VNF Identifier** +----------------------------- + ++---------------------+--------------------------------------------------------------+ +| If Definition | Description | ++=====================+==============================================================+ +| URI | http(s)://[hostname][:port]/gvnfmapi/lcm/v1/vnf\_instances | ++---------------------+--------------------------------------------------------------+ +| Operation | POST | ++---------------------+--------------------------------------------------------------+ +| Direction | NFVO->VNFMLCM | ++---------------------+--------------------------------------------------------------+ + +**3.1.1 Request** + ++---------------------------+-------------+---------------+------------------+-------------------------------------------------------------------------------------+ +| Parameter | Qualifier | Cardinality | Content | Description | ++===========================+=============+===============+==================+=====================================================================================+ +| vnfdId | M | 1 | Identifier | Identifier that identifies the VNFD which defines the VNF instance to be created. | ++---------------------------+-------------+---------------+------------------+-------------------------------------------------------------------------------------+ +| vnfInstanceName | M | 1 | String | Human-readable name of the VNF instance to be created. | ++---------------------------+-------------+---------------+------------------+-------------------------------------------------------------------------------------+ +| vnfInstanceDescription | O | 0..1 | String | Human-readable description of the VNF instance to be created. | ++---------------------------+-------------+---------------+------------------+-------------------------------------------------------------------------------------+ + + { + "vnfdId": "zte\_vFW\_51610", + "vnfInstanceName": "vFW\_01", + " vnfInstanceDescription": " vFW in Nanjing TIC Edge" + } + +**3.1.2 Response** + ++-----------------+-------------+---------------+------------------+-----------------------------------------+ +| Parameter | Qualifier | Cardinality | Content | Description | ++=================+=============+===============+==================+=========================================+ +| vnfInstanceId | M | 1 | Identifier | VNF instance identifier just created. | ++-----------------+-------------+---------------+------------------+-----------------------------------------+ + + { + "vnfInstanceId": "1" + } + +**3.1.3 Response Code** + ++-----------+-----------------------+-----------------------------------------------------------+ +| Code | Meaning | Description | ++===========+=======================+===========================================================+ +| 201 | Created | A VNF Instance identifier was created successfully. | ++-----------+-----------------------+-----------------------------------------------------------+ +| 4xx/5xx | | | ++-----------+-----------------------+-----------------------------------------------------------+ + +**3.2 Delete VNF Identifier** +----------------------------- + ++---------------------+------------------------------------------------------------------------------+ +| If Definition | Description | ++=====================+==============================================================================+ +| URI | http(s)://[hostname][:port]/gvnfmapi/lcm/v1/vnf\_instances/{vnfInstanceId} | ++---------------------+------------------------------------------------------------------------------+ +| Operation | DELETE | ++---------------------+------------------------------------------------------------------------------+ +| Direction | NFVO->VNFMLCM | ++---------------------+------------------------------------------------------------------------------+ + +**3.2.1 Request** + ++-------------+-------------+---------------+---------------+---------------+ +| Parameter | Qualifier | Cardinality | Content | Description | ++=============+=============+===============+===============+===============+ +| n/a | | | | | ++-------------+-------------+---------------+---------------+---------------+ + +**3.2.2 Response** + ++-------------+-------------+---------------+---------------+---------------+ +| Parameter | Qualifier | Cardinality | Content | Description | ++=============+=============+===============+===============+===============+ +| n/a | | | | | ++-------------+-------------+---------------+---------------+---------------+ + +**3.2.3 Response Code** + ++--------+-----------+-------------------+ +| Code | Meaning | Description | ++--------+-----------+-------------------+ + ++-----------+-----------------------+----------------------------------------------------------------------------------------------+ +| 204 | No Content | The VNF instance resource and the associated VNF identifier were deleted successfully. | ++===========+=======================+==============================================================================================+ +| 4xx/5xx | | | ++-----------+-----------------------+----------------------------------------------------------------------------------------------+ + +3.3 Instantiate VNF +------------------- + ++---------------------+-------------------------------------------------------------------------------------------+ +| If Definition | Description | ++=====================+===========================================================================================+ +| URI | http(s)://[hostname][:port]/gvnfmapi/lcm/v1/vnf_instances/{vnfInstanceId}/instantiate | ++---------------------+-------------------------------------------------------------------------------------------+ +| Operation | POST | ++---------------------+-------------------------------------------------------------------------------------------+ +| Direction | NFVO->VNFMLCM | ++---------------------+-------------------------------------------------------------------------------------------+ + +3.3.1 **Request** + ++--------------------+-----------+-------------+---------------------+---------------------------------------------------------------+ +| Parameter | Qualifier | Cardinality | Content | Description | ++====================+===========+=============+=====================+===============================================================+ +| flavourId | M | 1 | IdentifierInV nfd | Identifier of the VNF deployment flavour to be instantiated. | ++--------------------+-----------+-------------+---------------------+---------------------------------------------------------------+ +| instantiation | O | 0..1 | IdentifierInVnfd | Identifier of the instantiation | +| LevelId | | | | level of the deployment | +| | | | | flavour to be instantiated. If | +| | | | | not present, the default | +| | | | | instantiation level as | +| | | | | declared in the VNFD is | +| | | | | instantiated. | +| | | | | | +| | | | | Reserved | ++--------------------+-----------+-------------+---------------------+---------------------------------------------------------------+ +| extVirtualLinks | O | 0..N | ExtVirtualLin kData | Information about external VLs to connect the VNF to. | ++--------------------+-----------+-------------+---------------------+---------------------------------------------------------------+ +| extManagedVirtualL | O | 0..N | ExtManaged | Information about internal | +| inks | | | VirtualLinkData | VLs that are managed by | +| | | | | other entities than the VNFM. | +| | | | | | +| | | | | Reserved | ++--------------------+-----------+-------------+---------------------+---------------------------------------------------------------+ +| localization | O | 0..1 | String | Localization language of the VNF to be instantiated can be | +| Language | | | | declared in the VNFD. The value shall comply with the format | +| | | | | defined in IETF RFC 5646 [6]. | +| | | | | | +| | | | | Reserved | ++--------------------+-----------+-------------+---------------------+---------------------------------------------------------------+ +| additionalParams | O | 0..N | KeyValuePair | Additional input parameters for the instantiation process, | +| | | | | specific to the VNF being instantiated. | ++--------------------+-----------+-------------+---------------------+---------------------------------------------------------------+ + +**ExtVirtualLinkData:** + ++------------------+-----------+-------------+-----------------+----------------------------------------------------------------------------------+ +| Attribute | Qualifier | Cardinality | Content | Description | ++==================+===========+=============+=================+==================================================================================+ +| vlInstanceId | O | 0..1 | Identifier | Identifier of the VL instance. | ++------------------+-----------+-------------+-----------------+----------------------------------------------------------------------------------+ +| vim | CM | 0..1 | VimInfo | Information about the VIM that manages this resource. | +| | | | | This attribute shall be supported and present if VNF-related resource management | +| | | | | in direct mode is applicable. | ++------------------+-----------+-------------+-----------------+----------------------------------------------------------------------------------+ +| resourceProvider | CM | 0..1 | Identifier | Identifies the entity responsible for the management of this resource. | +| Id | | | | This attribute shall be present if | +| | | | | VNF-related resource management in indirect mode is applicable. | +| | | | | | +| | | | | Reserved | ++------------------+-----------+-------------+-----------------+----------------------------------------------------------------------------------+ +| resourceId | M | 1 | IdentifierInVim | The identifier of the resource in the scope of the VIM or the resource provider. | ++------------------+-----------+-------------+-----------------+----------------------------------------------------------------------------------+ +| extCps | M | 1..N | VnfExtCpData | External CPs of the VNF to be connected to this external VL. | ++------------------+-----------+-------------+-----------------+----------------------------------------------------------------------------------+ + + + **VimInfo:** ++-----------------+-----------+-------------+--------------+------------------------------------------------------------------------------------------------------------------------------------------+ +| Attribute | Qualifier | Cardinality | Content | Description | ++=================+===========+=============+==============+==========================================================================================================================================+ +| vimInfoId | M | 1 | Identifier | The identifier of this VimInfo instance, for the purpose of referencing it from other information elements. | ++-----------------+-----------+-------------+--------------+------------------------------------------------------------------------------------------------------------------------------------------+ +| vimId | M | 1 | Identifier | The identifier of the VIM. | ++-----------------+-----------+-------------+--------------+------------------------------------------------------------------------------------------------------------------------------------------+ +| interfaceInfo | M | 0..N | KeyValuePair | Information about the interface to the VIM, including VIM provider type, API version, and protocol type. | ++-----------------+-----------+-------------+--------------+------------------------------------------------------------------------------------------------------------------------------------------+ +| accessInfo | M | 0..N | KeyValuePair | Authentication credentials for accessing the VIM. Examples may include those to support different authentication schemes, e.g., OAuth, | +| | | | | Token, etc. | ++-----------------+-----------+-------------+--------------+------------------------------------------------------------------------------------------------------------------------------------------+ +| interface | M | 1 | String | Information about the interface endpoint. An example is a URL. | +| Endpoint | | | | Token, etc. | ++-----------------+-----------+-------------+--------------+------------------------------------------------------------------------------------------------------------------------------------------+ + + **interfaceInfo:** ++------------------+---------------+--------------------------------------+ +| **Key Define** | **Content** | **Description** | ++==================+===============+======================================+ +| vimType | String | The type of the VIM. | ++------------------+---------------+--------------------------------------+ +| apiVersion | String | The Version of the api of the VIM. | ++------------------+---------------+--------------------------------------+ +| protocolType | String | http https | ++------------------+---------------+--------------------------------------+ + + **accessInfo:** ++------------------+---------------+--------------------------+ +| **Key Define** | **Content** | **Description** | ++==================+===============+==========================+ +| tenant | String | Tenant Name of tenant | ++------------------+---------------+--------------------------+ +| username | String | Username for login | ++------------------+---------------+--------------------------+ +| password | String | Password of login user | ++------------------+---------------+--------------------------+ + + **VnfExtCpData:** + ++------------------------+---------------------+-----------------------+--------------------+-----------------------------------------------------------+ +| **Attribute** | **Qualifier** | **Cardinality** | **Content** | **Description** | ++========================+=====================+=======================+====================+===========================================================+ +| cpdId | M | 1 | IdentifierInVnfd | The identifier of the CPD in the VNFD. | ++------------------------+---------------------+-----------------------+--------------------+-----------------------------------------------------------+ +| addresses | O | 0..N | NetworkAddress | List of (fixed) network addresses that | +| | | | | need to be configured on the CP. This attribute shall | +| | | | | be present if fixed addresses need to be configured. | ++------------------------+---------------------+-----------------------+--------------------+-----------------------------------------------------------+ +| numDynamicAddre sses | O | 0..1 | Integer | Number of network addresses to be assigned dynamically. | +| | | | | This attribute shall be present if dynamic | +| | | | | addresses need to be configured. | +| | | | | Reserved | ++------------------------+---------------------+-----------------------+--------------------+-----------------------------------------------------------+ + + **NetworkAddress:** + ++-----------------+---------------------+-----------------------+-------------------+---------------------------------------------------------------------------------------------------------------+ +| **Attribute** | **Qualifier** | **Cardinality** | **Content** | **Description** | ++=================+=====================+=======================+===================+===============================================================================================================+ +| addressType | M | 1 | Enum | Describes the type of the address to be assigned to the CP instantiated from the parent CPD. | +| | | | | | +| | | | | Permitted values: | +| | | | | | +| | | | | - MAC | +| | | | | | +| | | | | - IP | ++-----------------+---------------------+-----------------------+-------------------+---------------------------------------------------------------------------------------------------------------+ +| l2AddressData | CM | 0..1 | String | Provides the information on the MAC addresses to be assigned to the CP(s) instantiated from the parent CPD. | +| | | | | | +| | | | | Shall be present when the addressType is MAC address. | ++-----------------+---------------------+-----------------------+-------------------+---------------------------------------------------------------------------------------------------------------+ +| l3AddressData | CM | 0..1 | L3AddressData | Provides the information on the IP addresses to be assigned to the CP instantiated from the parent CPD. | +| | | | | | +| | | | | Shall be present when the addressType is IP address. | ++-----------------+---------------------+-----------------------+-------------------+---------------------------------------------------------------------------------------------------------------+ + + **L3AddressData:** + ++-----------------+---------------------+-----------------------+-------------------+-----------------------+ +| **Attribute** | **Qualifier** | **Cardinality** | **Content** | **Description** | ++=================+=====================+=======================+===================+=======================+ +| iPAddressType | M | 1 | ENUM | IP address type. | +| | | | | | +| | | | | Permitted values: | +| | | | | | +| | | | | - IPv4 | +| | | | | | +| | | | | - IPv6 | ++-----------------+---------------------+-----------------------+-------------------+-----------------------+ +| iPAddress | M | 1 | String | IP address | ++-----------------+---------------------+-----------------------+-------------------+-----------------------+ + + { + + "flavourId": "flavour\_1", + "instantiationLevelId":"instantiationLevel\_1", + "extVirtualLinks": [ + { + "vlInstanceId": "1", + "vim": { + "vimInfoId": "1", + "vimId": "1", + "interfaceInfo": { + "vimType": "vim", + "apiVersion": "v2", + "protocolType": "http" + }, + "accessInfo": { + "tenant": "tenant\_vCPE", + "username": "vCPE", + "password": "vCPE\_321" + }, + "interfaceEndpoint": "http://10.43.21.105:80/" + }, + "resourceId": "1246", + "extCps": [ + { + "cpdId": "11", "addresses": [ + { + "addressType": "MAC", + "l2AddressData": "00:f3:43:20:a2:a3" + }, + { + "addressType": "IP", + "l3AddressData": { + "iPAddressType": "IPv4", + "iPAddress": "192.168.104.2" + } + } + ], + "numDynamicAddresses": 0 + } + ] + } + ], + + "localizationLanguage": "en\_US", "additionalParams": {...} + } + +**3.3.2 Response** + ++-------------+-------------+---------------+------------------+---------------------------------------------------------+ +| Parameter | Qualifier | Cardinality | Content | Description | ++=============+=============+===============+==================+=========================================================+ +| vnfLcOpId | M | 1 | Identifier | Identifier of the VNF lifecycle operation occurrence. | ++-------------+-------------+---------------+------------------+---------------------------------------------------------+ + + { + + "vnfLcOpId": "1" + + } + + **3.3.3 Response Code** ++-----------+-----------------------+------------------------------------------------------------------------------------------+ +| Code | Meaning | Description | ++===========+=======================+==========================================================================================+ +| 202 | Accepted | The request is accepted for processing, but the processing has not been completed. | ++-----------+-----------------------+------------------------------------------------------------------------------------------+ +| 4xx/5xx | | | ++-----------+-----------------------+------------------------------------------------------------------------------------------+ + +**3.4 Terminate VNF** +--------------------- + ++---------------------+-----------------------------------------------------------------------------------------+ +| If Definition | Description | ++=====================+=========================================================================================+ +| URI | http(s)://[hostname][:port]/gvnfmapi/lcm/v1/vnf\_instances/{vnfInstanceId}/term inate | ++---------------------+-----------------------------------------------------------------------------------------+ +| Operation | POST | ++---------------------+-----------------------------------------------------------------------------------------+ +| Direction | NFVO->VNFMLCM | ++---------------------+-----------------------------------------------------------------------------------------+ + +**3.4.1 Request** + ++-------------------+-------------+---------------+---------------+-------------------------------------------------------------------------+ +| Parameter | Qualifier | Cardinality | Content | Description | ++===================+=============+===============+===============+=========================================================================+ +| terminationType | M | 1 | Enum | Indicates whether forceful or graceful termination is requested. | +| | | | | | +| | | | | Permitted values: | +| | | | | | +| | | | | - FORCEFUL: The VNFM | +| | | | | will shut down the VNF and release the resources immediately | +| | | | | after accepting the request. | +| | | | | - GRACEFUL: The VNFM | +| | | | | | +| | | | | will first arrange to take the VNF out of service after accepting | +| | | | | the request. Once the operation is successful or once the timer | +| | | | | value specified in the | +| | | | | “gracefulTerminationTime out” attribute expires, the VNFM will shut | +| | | | | down the VNF and release the resources. | ++-------------------+-------------+---------------+---------------+-------------------------------------------------------------------------+ +| graceful | O | 0..1 | Integer | This attribute is only | +| Termination | | | | applicable in case of graceful | +| Timeout | | | | 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. | +| | | | | If not given and the | +| | | | | "terminationType" | +| | | | | attribute is set to | +| | | | | "GRACEFUL", it is expected | +| | | | | that the VNFM waits for | +| | | | | the successful taking out of | +| | | | | service of the VNF, no | +| | | | | matter how long it takes, | +| | | | | before shutting down the | +| | | | | VNF and releasing the | +| | | | | resources. | ++-------------------+-------------+---------------+---------------+-------------------------------------------------------------------------+ + { + "terminationType": "GRACEFUL", + "gracefulTerminationTimeout": 120 + } + +**3.4.2 Response** + ++-------------+-------------+---------------+------------------+---------------------------------------------------------+ +| Parameter | Qualifier | Cardinality | Content | Description | ++=============+=============+===============+==================+=========================================================+ +| vnfLcOpId | M | 1 | Identifier | Identifier of the VNF lifecycle operation occurrence. | ++-------------+-------------+---------------+------------------+---------------------------------------------------------+ + + { + "vnfLcOpId": "2" + } + +**3.4.3 Response Code** + ++-----------+-----------------------+------------------------------------------------------------------------------------------+ +| Code | Meaning | Description | ++===========+=======================+==========================================================================================+ +| 202 | Accepted | The request is accepted for processing, but the processing has not been completed. | ++-----------+-----------------------+------------------------------------------------------------------------------------------+ +| 4xx/5xx | | | ++-----------+-----------------------+------------------------------------------------------------------------------------------+ + +**3.5 Query multiple VNF** +--------------------------- ++---------------------+--------------------------------------------------------------+ +| If Definition | Description | ++=====================+==============================================================+ +| URI | http(s)://[hostname][:port]/gvnfmapi/lcm/v1/vnf\_instances | ++---------------------+--------------------------------------------------------------+ +| Operation | GET | ++---------------------+--------------------------------------------------------------+ +| Direction | NFVO->VNFMLCM | ++---------------------+--------------------------------------------------------------+ + +**3.5.1 Request** + ++-------------+-------------+---------------+---------------+---------------+ +| Parameter | Qualifier | Cardinality | Content | Description | ++=============+=============+===============+===============+===============+ +| n/a | | | | | ++-------------+-------------+---------------+---------------+---------------+ + +**3.5.2 Response** + ++--------------------+-------------+---------------+------------------------+--------------------------------------------------------------------------------------+ +| Parameter | Qualifier | Cardinality | Content | Description | ++====================+=============+===============+========================+======================================================================================+ +| vnfInstanceInfos | M | 0..N | VnfInstanceI nfo | Returned if information about zero or more VNF instances was queried successfully. | ++--------------------+-------------+---------------+------------------------+--------------------------------------------------------------------------------------+ ++--------------------+-------------+---------------+------------------------+--------------------------------------------------------------------------------------+ + + **VnfInstanceInfo:** + ++----------------------------------+----------+------------+----------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------+ +| Attribute | Qualifier|Cardinality | Content | Description | ++==================================+==========+============+============================+=======================================================================================================================================================+ +| vnfInstanceId | M | 1 | Identifier | VNF instance identifier. | ++----------------------------------+----------+------------+----------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------+ +| vnfInstanceName | M | 1 | String | VNF instance name. | ++----------------------------------+----------+------------+----------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------+ +| vnfInstanceDescr iption | M | 1 | String | Human-readable description of the VNF instance. | ++----------------------------------+----------+------------+----------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------+ +| onboardedVnfPk gInfoId | M | 1 | Identifier | Identifier of information held by the NFVO about the specific VNF Package on which the VNF is based. This identifier was allocated by the NFVO. | ++----------------------------------+----------+------------+----------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------+ +| vnfdId | M | 1 | Identifier | Identifier of the VNFD on which the VNF instance is based. | ++----------------------------------+----------+------------+----------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------+ +| vnfdVersion | M | 1 | Identifier | Identifies the version of the VNFD. The value is copied from the VNFD. | ++----------------------------------+----------+------------+----------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------+ +| vnfSoftwareVersi on | M | 1 | String | Software version of the VNF. | +| | | | | | +| | | | | The value is copied from the VNFD. | ++----------------------------------+----------+------------+----------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------+ +| vnfProvider | M | 1 | String | Name of the person or company providing the VNF. | +| | | | | | +| | | | | The value is copied from the VNFD. | ++----------------------------------+----------+------------+----------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------+ +| vnfProductName | M | 1 | String | Name to identify the VNF Product. The value is copied from the VNFD. | ++----------------------------------+----------+------------+----------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------+ +| vnfConfigurableP roperties | O | 0..N | KeyValuePair | Current values of the configurable properties of the VNF instance. | +| | | | | | +| | | | | Configurable properties as declared in the VNFD. | ++----------------------------------+----------+------------+----------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------+ +| instantiationState | M | 1 | Enum | The instantiation state of the VNF. | +| | | | | | +| | | | | Permitted values: | +| | | | | | +| | | | | - NOT\_INSTANTIATED: The VNF | +| | | | | | +| | | | | instance is terminated or not instantiated. | +| | | | | | +| | | | | - INSTANTIATED: The VNF instance is instantiated. | ++----------------------------------+----------+------------+----------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------+ +| instantiatedVnfInf o | CM | 0..1 | InstantiatedVnf Info | Information specific to an instantiated VNF instance. | +| | | | | | +| | | | | This attribute shall be present if the instantiateState attribute value is INSTANTIATED. | ++----------------------------------+----------+------------+----------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------+ +| metadata | O | 0..N | KeyValuePair | Additional metadata describing the VNF instance. | +| | | | | | +| | | | | This attribute can be modified with the Modify VNF information operation. | ++----------------------------------+----------+------------+----------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------+ +| extensions | O | 0..N | KeyValuePair | VNF-specific attributes. | +| | | | | | +| | | | | This attribute can be modified with the Modify VNF information operation. | ++----------------------------------+----------+------------+----------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------+ + + **InstantiatedVnfInfo:** + ++------------------------------+-----------+------------+------------------------------+------------------------------------------------------------------------------------------------------------------------+ +| Attribute | Qualifier | Cardinality| Content | Description | ++==============================+===========+============+==============================+========================================================================================================================+ +| flavourId | M | 1 | IdentifierInVnfd | Identifier of the VNF deployment flavour to be instantiated. | +| | | | | | +| | | | | Reserved | ++------------------------------+-----------+------------+------------------------------+------------------------------------------------------------------------------------------------------------------------+ +| vnfState | M | 1 | ENUM | State of the VNF instance. | +| | | | | | +| | | | | Permitted values: | +| | | | | | +| | | | | - STARTED: The VNF instance is up and running. | +| | | | | | +| | | | | - STOPPED: The VNF instance has been shut down. | ++------------------------------+-----------+------------+------------------------------+------------------------------------------------------------------------------------------------------------------------+ +| scaleStatus | O | 0..N | ScaleInfo | Scale status of the VNF, one entry per aspect. Represents for every scaling aspect how "big" the VNF has been scaled | +| | | | | | +| | | | | w.r.t. that aspect. | +| | | | | | +| | | | | This attribute shall be present if the VNF supports scaling. | ++------------------------------+-----------+------------+------------------------------+------------------------------------------------------------------------------------------------------------------------+ +| extCpInfo | O | 0..N | CpInfo | Information about the external CPs exposed by the VNF instance. | ++------------------------------+-----------+------------+------------------------------+------------------------------------------------------------------------------------------------------------------------+ +| extVirtualLink | O | 0..N | ExtVirtualLinkI nfo | Information about the external VLs the VNF instance is connected to. | ++------------------------------+-----------+------------+------------------------------+------------------------------------------------------------------------------------------------------------------------+ +| extManagedVirtu alLink | O | 0..N | extManagedVir tualLinkInfo | Information about the externally-managed internal VLs of the VNF instance. | +| | | | | | +| | | | | Reserved | ++------------------------------+-----------+------------+------------------------------+------------------------------------------------------------------------------------------------------------------------+ +| monitoringParam eters | O | 0..N | MonitoringPar ameter | Active monitoring parameters. | +| | | | | | +| | | | | Reserved | ++------------------------------+-----------+------------+------------------------------+------------------------------------------------------------------------------------------------------------------------+ +| localizationLangu age | O | 0..1 | String | Localization language of the VNF to be instantiated. | +| | | | | | +| | | | | The value shall comply with the format defined in IETF RFC 5646 [6]. | ++------------------------------+-----------+------------+------------------------------+------------------------------------------------------------------------------------------------------------------------+ +| vimInfo | CM | 0..N | VimInfo | Information about VIM(s) managing resources for the VNF instance. | +| | | | | | +| | | | | This attribute shall be supported and present if VNF-related resource management in direct mode is applicable. | ++------------------------------+-----------+------------+------------------------------+------------------------------------------------------------------------------------------------------------------------+ +| vnfcResourceInfo | CM | 0..N | VnfcResourceI nfo | Information about the virtualised compute and storage resource(s) used by the VNFCs of the VNF instance. | +| | | | | | +| | | | | This attribute shall be supported and present if VNF-related resource management in direct mode is applicable. | ++------------------------------+-----------+------------+------------------------------+------------------------------------------------------------------------------------------------------------------------+ +| virtualLinkResourceInfo | CM | 0..N | VirtualLinkRes ourceInfo | Information about the virtualised network resource(s) used by the VLs of the VNF instance. | +| | | | | | +| | | | | This attribute shall be supported and present if VNF-related resource management in direct mode is applicable. | ++------------------------------+-----------+------------+------------------------------+------------------------------------------------------------------------------------------------------------------------+ +| virtualStorageResourceInfo | CM | 0..N | VirtualStorage ResourceInfo | Information about the virtualised storage resource(s) used as storage for the VNF instance. | +| | | | | | +| | | | | This attribute shall be supported and present if VNF-related resource management in direct mode is applicable. | ++------------------------------+-----------+------------+------------------------------+------------------------------------------------------------------------------------------------------------------------+ + +**ScaleInfo:** + ++------------------+-------------+--------------------+--------------------+-------------------------------------------------------------------------------------------------------------------------------------+ +| Attribute | Qualifier | Cardinalit y | Content | Description | ++==================+=============+====================+====================+=====================================================================================================================================+ +| aspectId | M | 1 | IdentifierInVnfd | Identifier of the scaling aspect. | ++------------------+-------------+--------------------+--------------------+-------------------------------------------------------------------------------------------------------------------------------------+ +| scaleLevel | M | 1 | Integer | Indicates the scale level. The minimum value shall be 0 and the maximum value shall be <= maxScaleLevel as described in the VNFD. | ++------------------+-------------+--------------------+--------------------+-------------------------------------------------------------------------------------------------------------------------------------+ ++------------------+-------------+--------------------+--------------------+-------------------------------------------------------------------------------------------------------------------------------------+ + + **CpInfo:** + ++--------------------+-------------+--------------------+--------------------+------------------------------------------------------------------+ +| Attribute | Qualifier | Cardinalit y | Content | Description | ++====================+=============+====================+====================+==================================================================+ +| cpInstanceId | M | 1 | Identifier | Identifier of the CP instance. | ++--------------------+-------------+--------------------+--------------------+------------------------------------------------------------------+ +| cpdId | M | 1 | IdentifierInVnfd | Identifier of the CPD, in the VNFD. | ++--------------------+-------------+--------------------+--------------------+------------------------------------------------------------------+ +| addresses | O | 0..N | NetworkAddre ss | List of network addresses that have been configured on the CP. | ++--------------------+-------------+--------------------+--------------------+------------------------------------------------------------------+ + + **ExtVirtualLinkInfo:** + ++------------------------+-------------+--------------------+-------------------+-------------------------------------------------+ +| Attribute | Qualifier | Cardinalit y | Content | Description | ++========================+=============+====================+===================+=================================================+ +| extVirtualLinkId | M | 1 | Identifier | Identifier of the external VL. | ++------------------------+-------------+--------------------+-------------------+-------------------------------------------------+ +| resourceHandle | M | 1 | ResourceHand le | Identifier of the resource realizing this VL. | ++------------------------+-------------+--------------------+-------------------+-------------------------------------------------+ +| linkPorts | O | 0..N | VnfLinkPort | Link ports of this VL. | ++------------------------+-------------+--------------------+-------------------+-------------------------------------------------+ + + **ResourceHandle:** + ++---------------------+------------+------------+-------------------+--------------------------------------------------------------------------------------------------------+ +| Attribute | Qualifier | Cardinality| Content | Description | ++=====================+============+============+===================+========================================================================================================+ +| vimId | CM | 0..1 | Identifier | Identifier of the VimInfo information element defining the VIM who manages the resource. | +| | | | | | +| | | | | This attribute shall be present if | +| | | | | | +| | | | | VNF-related resource management in direct mode is applicable. | +| | | | | | +| | | | | The value refers to a vimInfo item in the VnfInstance. | ++---------------------+------------+------------+-------------------+--------------------------------------------------------------------------------------------------------+ +| resourceProviderId | CM | 0..1 | Identifier | Identifier of the entity responsible for the management of the resource. | +| | | | | | +| | | | | This attribute shall be present when VNF-related resource management in indirect mode is applicable. | +| | | | | | +| | | | | Reserved | ++---------------------+------------+------------+-------------------+--------------------------------------------------------------------------------------------------------+ +| resourceId | M | 1 | IdentifierInVim | Identifier of the resource in the scope of the VIM or the resource provider. | ++---------------------+------------+------------+-------------------+--------------------------------------------------------------------------------------------------------+ + + **VnfLinkPort:** + ++----------------------+-------------+--------------------+-------------------+------------------------------------------------------------------------------------------------+ +| Attribute | Qualifier | Cardinalit y | Content | Description | ++======================+=============+====================+===================+================================================================================================+ +| resourceHandle | M | 1 | ResourceHand le | Identifier of the virtualised network resource realizing this link port. | ++----------------------+-------------+--------------------+-------------------+------------------------------------------------------------------------------------------------+ +| cpInstanceId | M | 1 | IdentifierInVnf | External CP of the VNF to be connected to this link port. | +| | | | | | +| | | | | There shall be at most one link port associated with any external connection point instance. | +| | | | | | +| | | | | The value refers to an extCpInfo item in the VnfInstance. | ++----------------------+-------------+--------------------+-------------------+------------------------------------------------------------------------------------------------+ ++----------------------+-------------+--------------------+-------------------+------------------------------------------------------------------------------------------------+ + + **VnfcResourceInfo:** + ++-----------------------+------------+------------+--------------------+---------------------------------------------------------------------------------------------------------------------+ +| Attribute | Qualifier | Cardinality| Content | Description | ++=======================+============+============+====================+=====================================================================================================================+ +| vnfcInstanceId | M | 1 | IdentifierInVnf | Identifier of this VNFC instance. | ++-----------------------+------------+------------+--------------------+---------------------------------------------------------------------------------------------------------------------+ +| vduId | M | 1 | IdentifierInVnfd | Reference to the applicable Vdu information element in the VNFD. | ++-----------------------+------------+------------+--------------------+---------------------------------------------------------------------------------------------------------------------+ +| computeResourc e | M | 1 | ResourceHand le | Reference to the VirtualCompute resource. | ++-----------------------+------------+------------+--------------------+---------------------------------------------------------------------------------------------------------------------+ +| storageResourceI ds | M | 1..N | IdentifierInVnf | Reference(s) to the VirtualStorage resource(s). | +| | | | | | +| | | | | The value refers to a VirtualStorageResourceInfo item in the VnfInstance. | ++-----------------------+------------+------------+--------------------+---------------------------------------------------------------------------------------------------------------------+ +| reservationId | O | 0..1 | Identifier | The reservation identifier applicable to the resource. It shall be present when an applicable reservation exists. | +| | | | | | +| | | | | Reserved | ++-----------------------+------------+------------+--------------------+---------------------------------------------------------------------------------------------------------------------+ + + **VirtualStorageResourceInfo:** + ++---------------------------------+-------------+--------------------+--------------------+---------------------------------------------------------------------------------------------------------------------+ +| Attribute | Qualifier | Cardinalit y | Content | Description | ++=================================+=============+====================+====================+=====================================================================================================================+ +| virtualStorageInst anceId | M | 1 | IdentifierInVnf | Identifier of this virtual storage resource instance. | ++---------------------------------+-------------+--------------------+--------------------+---------------------------------------------------------------------------------------------------------------------+ +| virtualStorageDe scId | M | 1 | IdentifierInVnfd | Identifier of the VirtualStorageDesc in the VNFD. | ++---------------------------------+-------------+--------------------+--------------------+---------------------------------------------------------------------------------------------------------------------+ +| storageResource | M | 1 | ResourceHand le | Reference to the VirtualStorage resource. | ++---------------------------------+-------------+--------------------+--------------------+---------------------------------------------------------------------------------------------------------------------+ +| reservationId | M | 0..1 | Identifier | The reservation identifier applicable to the resource. It shall be present when an applicable reservation exists. | +| | | | | | +| | | | | Reserved | ++---------------------------------+-------------+--------------------+--------------------+---------------------------------------------------------------------------------------------------------------------+ + + **VirtualLinkResourceInfo:** + ++------------------------------+-----------+--------------+--------------------+---------------------------------------------------------------------------------------------------------------------+ +| Attribute | Qualifier | Cardinality | Content | Description | ++==============================+===========+==============+====================+=====================================================================================================================+ +| virtualLinkInstanceId | M | 1 | IdentifierInVnf | Identifier of this VL instance. | ++------------------------------+-----------+--------------+--------------------+---------------------------------------------------------------------------------------------------------------------+ +| virtualLinkDescId | M | 1 | IdentifierInVnfd | Identifier of the Virtual Link Descriptor (VLD) in the VNFD. | ++------------------------------+-----------+--------------+--------------------+---------------------------------------------------------------------------------------------------------------------+ +| networkResource | M | 1 | ResourceHand le | Reference to the VirtualNetwork resource. | ++------------------------------+-----------+--------------+--------------------+---------------------------------------------------------------------------------------------------------------------+ +| reservationId | M | 0..1 | Identifier | The reservation identifier applicable to the resource. It shall be present when an applicable reservation exists. | +| | | | | | +| | | | | Reserved | ++------------------------------+-----------+--------------+--------------------+---------------------------------------------------------------------------------------------------------------------+ + + [ + + { + + "vnfInstanceId": "1", + "vnfInstanceName": "vFW\_01", + "vnfInstanceDescription": "vFW in Nanjing TIC Edge", + "onboardedVnfPkgInfoId": "1", + "vnfdId": "zte\_vFW\_51610", + "vnfdVersion": "V1.0", + "vnfSoftwareVersion": "V1.0", + "vnfProvider": "ZTE", + "vnfProductName": "vFW", + "vnfConfigurableProperties": {...}, + "instantiationState": "INSTANTIATED", + "instantiatedVnfInfo": { + "flavourId": "1", + "vnfState": "STARTED", + "scaleStatus": [ + { + "aspectId": "aspect1", + "scaleLevel": 1 + } + ], + "extCpInfo": [ + { + "cpInstanceId": "1", + "cpdId": "1", "addresses": [ + { + "addressType": "MAC", + "l2AddressData": "00:f3:43:20:a2:a3" + }, + { + "addressType": "IP", + "l3AddressData": { + "iPAddressType": "IPv4", + "address": "192.168.104.2" + } + } + ] + } + ], + "extVirtualLink": [ + { + "extVirtualLinkId": "extvl1", + "resourceHandle": { + "vimId": "1", + "resourceId": "1111" + }, + + "linkPorts": [ + { + "resourceHandle": + { + "vimId": "1", + "resourceId": "2121" + }, + "cpInstanceId": "1" + } + ] + } + ], + + "monitoringParameters": {...}, + "localizationLanguage": "en\_US", + "vimInfo": [ + { + "vimInfoId": "1", + "vimId": "1", + "interfaceInfo": { + "vimType": "vim", + "apiVersion": "v2", + "protocolType": "http" + }, + "accessInfo": { + "tenant": "tenant\_vCPE", + "username": "vCPE", + "password": "vCPE\_321" + }, + + "interfaceEndpoint": "http://10.43.21.105:80/" + } + ], + "vnfcResourceInfo": [ + { + "vnfcInstanceId": "vm1", + "vduId": "vdu1", + "computeResource": { + "vimId": "1", + "resourceId": "3333" + }, + "storageResourceIds": [ "storage1" + ] + } + ], + "virtualLinkResourceInfo": [ + { + "virtualLinkInstanceId": "vl01", + "virtualLinkDescId": "vl01", + "networkResource": { + "vimId": "1", + "resourceId": "4444" + } + } + ], + "virtualStorageResourceInfo": [ + { + "virtualStorageInstanceId": "storage1", + "virtualStorageDescId":"storage1", + "storageResource": { + "vimId": "1", + "resourceId": "555" + } + } + ] + }, + "metadata": {...}, + "extensions": {...} + } +] + +**3.5.3 Response Code** + ++-----------+-----------------------+----------------------------------+ +| Code | Meaning | Description | ++===========+=======================+==================================+ +| 200 | Ok | The request has succeeded. | ++-----------+-----------------------+----------------------------------+ +| 4xx/5xx | | | ++-----------+-----------------------+----------------------------------+ + +**3.6 Query single VNF** +------------------------ ++---------------------+------------------------------------------------------------------------------+ +| If Definition | Description | ++=====================+==============================================================================+ +| URI | http(s)://[hostname][:port]/gvnfmapi/lcm/v1/vnf_instances/{vnfInstanceId} | ++---------------------+------------------------------------------------------------------------------+ +| Operation | GET | ++---------------------+------------------------------------------------------------------------------+ +| Direction | NFVO->VNFMLCM | ++---------------------+------------------------------------------------------------------------------+ + +**3.6.1 Request** + ++-------------+-------------+---------------+---------------+---------------+ +| Parameter | Qualifier | Cardinality | Content | Description | ++=============+=============+===============+===============+===============+ +| n/a | | | | | ++-------------+-------------+---------------+---------------+---------------+ + +**3.6.2 Response** + ++-------------------+-------------+---------------+------------------------+---------------------------------------+ +| Parameter | Qualifier | Cardinality | Content | Description | ++===================+=============+===============+========================+=======================================+ +| vnfInstanceInfo | M | 1 | VnfInstanceI nfo | The information of the VNF instance | ++-------------------+-------------+---------------+------------------------+---------------------------------------+ ++-------------------+-------------+---------------+------------------------+---------------------------------------+ + +**3.6.3 Response Code** + ++-----------+-----------------------+----------------------------------+ +| Code | Meaning | Description | ++===========+=======================+==================================+ +| 200 | Ok | The request has succeeded. | ++-----------+-----------------------+----------------------------------+ +| 4xx/5xx | | | ++-----------+-----------------------+----------------------------------+ + + { + + "vnfInstanceId": "1", + "vnfInstanceName": "vFW\_01", + "vnfInstanceDescription": "vFW in Nanjing TIC Edge", + "onboardedVnfPkgInfoId": "1", + "vnfdId": "zte\_vFW\_51610", + "vnfdVersion": "V1.0", + "vnfSoftwareVersion": "V1.0", + "vnfProvider": "ZTE", + "vnfProductName": "vFW", + "vnfConfigurableProperties": {...}, + "instantiationState": "INSTANTIATED", + "instantiatedVnfInfo": { + "flavourId": "1", + "vnfState": "STARTED", + "scaleStatus": [ + { + "aspectId": "aspect1", + "scaleLevel": 1 + } + ], + + "extCpInfo": [ + { + "cpInstanceId": "1", + "cpdId": "1", "addresses": [ + { + "addressType": "MAC", + "l2AddressData": "00:f3:43:20:a2:a3" + }, + + { + "addressType": "IP", + "l3AddressData": { + "iPAddressType": "IPv4", + "address": "192.168.104.2" + } + } + ] + } + ], + + "extVirtualLink": [ + { + "extVirtualLinkId": "extvl1", + "resourceHandle": { + "vimId": "1", + "resourceId": "1111" + }, + "linkPorts": [ + { + "resourceHandle": + { + "vimId": "1", + "resourceId": "2121" + }, + "cpInstanceId": "1" + } + ] + } + ], + + "monitoringParameters": {...}, + "localizationLanguage": "en\_US", + "vimInfo": [ + { + "vimInfoId": "1", + "vimId": "1", + "interfaceInfo": { + "vimType": "vim", + "apiVersion": "v2", + "protocolType": "http" + }, + "accessInfo": { + "tenant": "tenant\_vCPE", + "username": "vCPE", + "password": "vCPE\_321" + }, + "interfaceEndpoint": "http://10.43.21.105:80/" + } + ], + + "vnfcResourceInfo": [ + { + "vnfcInstanceId": "vm1", + "vduId": "vdu1", + "computeResource": { + "vimId": "1", + "resourceId": "3333" + }, + + "storageResourceIds": [ "storage1" + ] + } + ], + + "virtualLinkResourceInfo": [ + { + "virtualLinkInstanceId": "vl01", + "virtualLinkDescId": "vl01", + "networkResource": { + "vimId": "1", + "resourceId": "4444" + } + } + ], + + "virtualStorageResourceInfo": [ + { + "virtualStorageInstanceId": "storage1", + "virtualStorageDescId": "storage1", + "storageResource": { + "vimId": "1", + "resourceId": "555" + } + } + ] + }, + "metadata": {...}, + "extensions": {...} + } + +**3.7 Get Operation Status** +------------------------------ ++---------------------+-------------------------------------------------------------------------------------------------+ +| If Definition | Description | ++=====================+=================================================================================================+ +| URI | http(s)://[hostname][:port]/gvnfmapi/lcm/v1/vnf\_lc\_ops/{vnfLcOpId}&response Id={responseId} | ++---------------------+-------------------------------------------------------------------------------------------------+ +| Operation | GET | ++---------------------+-------------------------------------------------------------------------------------------------+ +| Direction | NFVO->GVNFM | ++---------------------+-------------------------------------------------------------------------------------------------+ + +**3.7.1 Request** + + None + +**3.7.2 Response** + ++--------------------+-------------+---------------+-----------+----------------------------------------------------------------------------------+ +| Parameter | Qualifier | Cardinality | Content | Description | ++====================+=============+===============+===========+==================================================================================+ +| vnfLcOpId | M | 1 | String | Identifier of a VNF lifecycle operation occurrence | ++--------------------+-------------+---------------+-----------+----------------------------------------------------------------------------------+ +| vnfInstanceId | M | 1 | String | Identifier of the VNF instance to which the operation applies | ++--------------------+-------------+---------------+-----------+----------------------------------------------------------------------------------+ +| lcmOperationType | M | 1 | ENUM | Type of the actual LCM operation represented by this lcm operation occurrence. | +| | | | | | +| | | | | Permitted values: | ++--------------------+-------------+---------------+-----------+----------------------------------------------------------------------------------+ +| | | | | - INSTANTIATE:the | +| | | | | | +| | | | | Instantiate VNF LCM operation. | +| | | | | | +| | | | | - SCALE: the Scale VNF LCM operation. | +| | | | | | +| | | | | - SCALE\_TO\_LEVEL: the | +| | | | | | +| | | | | Scale VNF to Level LCM operation. | +| | | | | | +| | | | | - CHANGE\_FLAVOUR: | +| | | | | | +| | | | | the Change VNF Flavour LCM operation. | +| | | | | | +| | | | | - TERMINATE: the | +| | | | | | +| | | | | Terminate VNF LCM operation. | +| | | | | | +| | | | | - HEAL: the Heal VNF LCM operation. | +| | | | | | +| | | | | - OPERATE: the Operate VNF LCM operation. | +| | | | | | +| | | | | - CHANGE\_EXT\_VLS: the | +| | | | | | +| | | | | Change VNF external VLs LCM operation. (Reserved) | ++--------------------+-------------+---------------+-----------+----------------------------------------------------------------------------------+ +| startTime | M | 1 | String | Date-time of the start of the operation. | +| | | | | | +| | | | | Representation: String formatted according to RFC 3339 [13] | ++--------------------+-------------+---------------+-----------+----------------------------------------------------------------------------------+ +| responseDescriptor | M | 1 | VnfLcOp | Including:responseId,progress,statusstatusDescription | +| | | | Response | | +| | | | Descriptor| ,errorCode,responseHistoryList | ++--------------------+-------------+---------------+-----------+----------------------------------------------------------------------------------+ + + **VnfLcOpResponseDescriptor:** + ++---------------------------+-----------------+--------------------+---------------+-----------------------------------------------------------+ +| Attribute | Qualifier | Cardinalit y | Content | Description | ++===========================+=================+====================+===============+===========================================================+ +| responseId | M | 1 | Integer | Response Identifier | ++---------------------------+-----------------+--------------------+---------------+-----------------------------------------------------------+ +| progress | M | 1 | Integer | progress (1-100) | ++---------------------------+-----------------+--------------------+---------------+-----------------------------------------------------------+ +| lcmOperationS tatus | M | 1 | ENUM | Status of a VNF lifecycle operation occurrence | +| | | | | | +| | | | | Permitted values: | +| | | | | | +| | | | | - STARTING: The operation is starting.. | +| | | | | | +| | | | | - PROCESSING: The operation is | +| | | | | currently in execution. | +| | | | | | +| | | | | - COMPLETED: The operation has completed successfully. | +| | | | | | +| | | | | - FAILED: The operation has failed and it cannot be | +| | | | | retried or rolled back, as it is determined | +| | | | | that such action won't succeed. | +| | | | | - FAILED\_TEMP: The operation has failed and execution | +| | | | | has stopped, but the execution of the | +| | | | | operation is not considered to be closed. | +| | | | | (Reserved) | +| | | | | - ROLLING\_BACK: The operation is currently being rolled | +| | | | | back. (Reserved) | +| | | | | | +| | | | | - ROLLED\_BACK: The state of the VNF prior to the | +| | | | | original operation invocation has been | +| | | | | restored as closely as possible. (Reserved) | ++---------------------------+-----------------+--------------------+---------------+-----------------------------------------------------------+ +| statusDescripti on | O | 0..1 | String | Status Description of a VNF lifecycle operation | +| | | | | occurrence | ++---------------------------+-----------------+--------------------+---------------+-----------------------------------------------------------+ +| errorCode | O | 0..1 | Integer | Errorcode | ++---------------------------+-----------------+--------------------+---------------+-----------------------------------------------------------+ +| responseHistor yList | O | 0..N | VnfLcOpDetail | History Response Messages from the requested | +| | | | | responseId to lastest one. | ++---------------------------+-----------------+--------------------+---------------+-----------------------------------------------------------+ + + **VnfLcOpDetail:** + ++---------------------------+-----------------+--------------------+---------------+-----------------------------------------------------------+ +| Attribute | Qualifier | Cardinalit y | Content | Description | ++===========================+=================+====================+===============+===========================================================+ +| responseId | M | 1 | Integer | Response Identifier | ++---------------------------+-----------------+--------------------+---------------+-----------------------------------------------------------+ +| progress | M | 1 | Integer | progress (1-100) | ++---------------------------+-----------------+--------------------+---------------+-----------------------------------------------------------+ +| lcmOperationS tatus | M | 1 | ENUM | Status of a VNF lifecycle operation occurrence | +| | | | | | +| | | | | Permitted values: | +| | | | | | +| | | | | - STARTING: The operation is starting.. | +| | | | | | +| | | | | - PROCESSING: The operation is currently in execution. | +| | | | | | +| | | | | - COMPLETED: The operation has completed successfully. | +| | | | | | +| | | | | - FAILED: The operation has failed and it | +| | | | | cannot be retried or rolled back, as it is | +| | | | | determined that such action won't succeed. | +| | | | | | +| | | | | | +| | | | | - FAILED\_TEMP: The operation has failed and execution | +| | | | | has stopped, but the execution of the operation | +| | | | | is not considered to be closed. (Reserved) | +| | | | | | +| | | | | - ROLLING\_BACK: The operation is currently being | +| | | | | rolled back. (Reserved) | +| | | | | | +| | | | | | +| | | | | - ROLLED\_BACK: The state of the VNF prior to the | +| | | | | original operation invocation has been restored | +| | | | | as closely as possible. (Reserved) | +| | | | | | ++---------------------------+-----------------+--------------------+---------------+-----------------------------------------------------------+ +| statusDescription | O | 0..1 | String | Status Description of a VNF lifecycle operation occurrence| ++---------------------------+-----------------+--------------------+---------------+-----------------------------------------------------------+ +| errorCode | O | 0..1 | Integer | Errorcode | ++---------------------------+-----------------+--------------------+---------------+-----------------------------------------------------------+ + + { + + "vnfLcOpId": "1234566", + + "vnfInstanceId": "1", + "lcmOperationType": "INSTANTIATE", + + "startTime": "2017-01-01T12:00:27.87+00:20", + + "responseDescriptor": { + "responseId": 3, + "progress": 40, + "lcmOperationStatus": "PROCESSING", + "statusDescription": "OMC VMs are decommissioned in VIM", + "errorCode": null, + "responseHistoryList": [ + { + "responseId": 1, + "progress": 40, + "lcmOperationStatus": "PROCESSING", + "statusDescription": "OMC VMs are decommissioned in VIM", + "errorCode": null + }, + { + "responseId": 2, + "progress": 41, + "lcmOperationStatus": "PROCESSING", + "statusDescription": "OMC VMs are decommissioned in VIM", + "errorCode": null + } + ] + } + } + +**3.7.3 Response Code** + ++-----------+-----------------------+----------------------------------+ +| Code | Meaning | Description | ++===========+=======================+==================================+ +| 200 | Ok | The request has succeeded. | ++-----------+-----------------------+----------------------------------+ +| 4xx/5xx | | | ++-----------+-----------------------+----------------------------------+ + +**4.Interfaces provided by VNF**\ (Ve-Vnfm-vnf) +=============================================== + +**4.1 Set Initial Configuration** +----------------------------- + ++---------------------+---------------------------------------------+ +| If Definition | Description | ++=====================+=============================================+ +| URI | http(s)://[hostname][:port]/configuration | ++---------------------+---------------------------------------------+ +| Operation | POST | ++---------------------+---------------------------------------------+ +| Direction | VNFM->VNF | ++---------------------+---------------------------------------------+ + + **4.1.1Request** + ++-------------------------+-------------+---------------+--------------------------+------------------------------------------------------------------------------+ +| Parameter | Qualifier | Cardinality | Content | Description | ++=========================+=============+===============+==========================+==============================================================================+ +| vnfInstanceId | M | 1 | Identifier | Identifier of the VNF instance which the VNF to set initial configuration. | ++-------------------------+-------------+---------------+--------------------------+------------------------------------------------------------------------------+ +| vnfConfigurationData | O | 0..1 | VnfConfigur ation | Configuration data for the VNF instance. | ++-------------------------+-------------+---------------+--------------------------+------------------------------------------------------------------------------+ +| vnfcConfigurationData | O | 0..N | VnfcConfigu ration | Configuration data for VNFC instances. | ++-------------------------+-------------+---------------+--------------------------+------------------------------------------------------------------------------+ + +**VnfConfiguration:** + ++-----------------------+-----------------+--------------------+----------------------------------+------------------------------------------------------------------------------+ +| Attribute | Qualifier | Cardinalit y | Content | Description | ++=======================+=================+====================+==================================+==============================================================================+ +| cp | O | 0..N | CpConfiguratio n | External CPs | ++-----------------------+-----------------+--------------------+----------------------------------+------------------------------------------------------------------------------+ +| vnfSpecificData | O | 0..1 | VnfConfigurabl eProperties | Configuration object containing values of VNF configurable properties. | ++-----------------------+-----------------+--------------------+----------------------------------+------------------------------------------------------------------------------+ + +**CpConfiguration:** + ++-----------------+-------------+--------------------+--------------+-------------------------------------------------------------------------------------------------------+ +| Attribute | Qualifier | Cardinalit y | Content | Description | ++=================+=============+====================+==============+=======================================================================================================+ +| cpId | M | 1 | Identifier | Uniquely identifies a CP instance within the namespace of a specific VNF instance or VNFC instance. | ++-----------------+-------------+--------------------+--------------+-------------------------------------------------------------------------------------------------------+ +| cpdId | M | 1 | Identifier | Uniquely identifies a type of CP instance within the namespace of a VNFD. | ++-----------------+-------------+--------------------+--------------+-------------------------------------------------------------------------------------------------------+ +| cpAddress | M | 1..N | CpAddress | Address and Port assigned to the CP. | ++-----------------+-------------+--------------------+--------------+-------------------------------------------------------------------------------------------------------+ + + **CpAddress:** + ++--------------------------+-------------+--------------------+-------------------+-----------------------------------------------------------------------------------------------------------------------------------------------+ +| Attribute | Qualifier | Cardinalit y | Content | Description | ++==========================+=============+====================+===================+===============================================================================================================================================+ +| address | M | 0..N | NetworkAddre ss | The address assigned to the CP instance (e.g. IP address, MAC address, etc.). It shall be provided for configuring a fixed address. | ++--------------------------+-------------+--------------------+-------------------+-----------------------------------------------------------------------------------------------------------------------------------------------+ +| useDynamicAddress | M | 0..1 | ENUM | It determines whether an address shall be assigned dynamically. It shall be provided if a dynamic address needs to be configured on the CP. | +| | | | | | +| | | | | A cardinality of "0" indicates that no dynamic address needs to be configured on the CP. | +| | | | | | +| | | | | Permitted values: | +| | | | | | +| | | | | - TRUE | +| | | | | | +| | | | | - FALSE | ++--------------------------+-------------+--------------------+-------------------+-----------------------------------------------------------------------------------------------------------------------------------------------+ +| port | M | 0..1 | Not specified | The port assigned to the CP instance (e.g. IP port number, Ethernet port number, etc.). | +| | | | | | +| | | | | Reserved | ++--------------------------+-------------+--------------------+-------------------+-----------------------------------------------------------------------------------------------------------------------------------------------+ + + **VnfConfigurableProperties:** + ++--------------------+-----------+--------------+--------+-----------------------------------------------------------------------------------------------+ +| Attribute | Qualifier | Cardinality | Content| Description | ++====================+===========+==============+========+===============================================================================================+ +| autoScalable | O | 0..1 | ENUM | It permits to enable (TRUE) / disable (FALSE) the auto-scaling functionality. | +| | | | | | +| | | | | A cardinality of "0" indicates that configuring this present VNF property is not supported. | +| | | | | | +| | | | | Permitted values: | +| | | | | | +| | | | | - TRUE | +| | | | | | +| | | | | - FALSE | ++--------------------+-----------+--------------+--------+-----------------------------------------------------------------------------------------------+ +| autoHealable | O | 0..1 | ENUM | It permits to enable (TRUE) / disable (FALSE) the auto-healing functionality. | +| | | | | | +| | | | | A cardinality of "0" indicates that configuring this present VNF property is not supported. | +| | | | | | +| | | | | Permitted values: | +| | | | | | +| | | | | - TRUE | +| | | | | | +| | | | | - FALSE | ++--------------------+-----------+--------------+--------+-----------------------------------------------------------------------------------------------+ + +**VnfcConfiguration:** + ++------------------------+-------------+--------------------+--------------------+----------------------------------------------------------------------------------------+ +| Attribute | Qualifier | Cardinalit y | Content | Description | ++========================+=============+====================+====================+========================================================================================+ +| vnfcId | M | 1 | Identifier | Uniquely identifies a VNFC instance within the namespace of a specific VNF instance. | ++------------------------+-------------+--------------------+--------------------+----------------------------------------------------------------------------------------+ +| cp | O | 0..N | CpConfiguratio n | Internal CPs. | ++------------------------+-------------+--------------------+--------------------+----------------------------------------------------------------------------------------+ +| vnfcSpecificData | O | 0..1 | KeyValuePair | Configuration object containing values of VNFC configurable properties | ++------------------------+-------------+--------------------+--------------------+----------------------------------------------------------------------------------------+ + + { + + "vnfInstanceId": "1", + "vnfConfigurationData": { + "cp": [ + { + "cpId": "cp-1", + "cpdId": "cpd-a", + "cpAddress": [ + { + "addresses": [ + { + "addressType": "MAC", + "l2AddressData": "00:f3:43:20:a2:a3" + }, + { + "addressType": "IP", + "l3AddressData": { + "iPAddressType": "IPv4", + "iPAddress": "192.168.104.2" + } + } + ], + "useDynamicAddress": "FALSE" + } + ] + } + ], + "vnfSpecificData": { + "autoScalable": "FALSE", + "autoHealable": "FALSE" + } + }, + "vnfcConfigurationData": + { + "vnfcId": "vnfc-1", + "cp": [ + { + "cpId": "cp-11", + "cpdId": "cpd-1a", + "cpAddress": [ + { + "addresses": [ + { + "addressType": "MAC", + "l2AddressData": "00:f3:43:21:a2:a3" + }, + { + "addressType": "IP", + "l3AddressData": { + "iPAddressType": "IPv4", + "iPAddress": "192.168.105.2" + } + } + ], + "useDynamicAddress": "FALSE" + } + ] + } + ], + "vnfcSpecificData": {} + } + } + + + **4.1.2 Response** ++-----------------------+-------------+---------------+-------------------+---------------------------------+ +| Parameter | Qualifier | Cardinality | Content | Description | ++=======================+=============+===============+===================+=================================+ +| vnfConfigurationData | O | 0..1 | VnfConfiguration | Correspond to the | +| | | | | vnfConfigurationData in the | +| | | | | input information elements of | +| | | | | the SetInitialConfiguration | +| | | | | operation if it has. | ++-----------------------+-------------+---------------+-------------------+---------------------------------+ +| vnfcConfigurationDa | O | 0..N | VnfConfiguration | Correspond to the | +| ta | | | | vnfcConfigurationData in the | +| | | | | input information elements of | +| | | | | the SetInitialConfiguration | +| | | | | operation if it has. | ++-----------------------+-------------+---------------+-------------------+---------------------------------+ + + { + "vnfConfigurationData": { + "cp": [ + { + "cpId": "cp-1", + "cpdId": "cpd-a", "cpAddress": [ + { + "addresses": [ + { + "addressType": "MAC", + "l2AddressData": "00:f3:43:20:a2:a3" + }, + { + "addressType": "IP", + "l3AddressData": { + "iPAddressType": "IPv4", + "iPAddress": "192.168.104.2" + } + } + ], + "useDynamicAddress": "FALSE" + } + ] + } + ], + "vnfSpecificData": { + "autoScalable": "FALSE", + "autoHealable": "FALSE", + … + } + }, + "vnfcConfigurationData": { + "vnfcId": "vnfc-1", + "cp": [ + { + "cpId": "cp-11", + "cpdId": "cpd-1a", + "cpAddress": [ + { + "addresses": [ + { + "addressType": "MAC", + "l2AddressData": "00:f3:43:21:a2:a3" + }, + { + "addressType": "IP", + "l3AddressData": { + "iPAddressType": "IPv4", + "iPAddress": "192.168.105.2" + } + } + ], + "useDynamicAddress": "FALSE" + } + ] + } + ], + "vnfcSpecificData": {…} + } + } + + **4.1.3Response Code** + ++-----------+-----------------------+-----------------------------------------------------------+ +| Code | Meaning | Description | ++===========+=======================+===========================================================+ +| 201 | Created | A VNF Instance identifier was created successfully. | ++-----------+-----------------------+-----------------------------------------------------------+ +| 4xx/5xx | | | ++-----------+-----------------------+-----------------------------------------------------------+ + +.. |image0| image:: VNFM_API.png + :width: 5.07047in + :height: 5.63208in \ No newline at end of file diff --git a/docs/APIs/VNFLCM_API/VNFM_API.png b/docs/APIs/VNFLCM_API/VNFM_API.png new file mode 100644 index 0000000000000000000000000000000000000000..b267abc27b1b7f0ccb73296e5a31dbb95ec2e542 GIT binary patch literal 53033 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 q9MSyruat>3NHvuIHar2%&8u?& literal 0 HcmV?d00001 diff --git a/docs/APIs/VNFLCM_API/index.rst b/docs/APIs/VNFLCM_API/index.rst new file mode 100644 index 00000000..34c09905 --- /dev/null +++ b/docs/APIs/VNFLCM_API/index.rst @@ -0,0 +1,7 @@ +VNF LCM API +--------- + +.. toctree:: + :titlesonly: + + VNFLCM_API \ No newline at end of file diff --git a/docs/APIs/VNFMDriver_API/VNFM_Driver_API.rst b/docs/APIs/VNFMDriver_API/VNFM_Driver_API.rst new file mode 100644 index 00000000..f8f1514a --- /dev/null +++ b/docs/APIs/VNFMDriver_API/VNFM_Driver_API.rst @@ -0,0 +1,599 @@ +.. contents:: + :depth: 3 +.. +**VNFM Driver API** +**V0.1** + +**1. Scope** +============== +The scope of the present document is to describe the VNFM Driver exposed API specification. + +**2. Terms, Definitions and Abbreviations** +============================================= + +For the purposes of the present document, the following abbreviations apply: + ++-------------+-----------------------------------------------+ +|Abbreviation | | ++-------------+-----------------------------------------------+ +|NFVO |Network Functions Virtualization Orchestrator | ++-------------+-----------------------------------------------+ +|VNFM |Virtual Network Function Manager | ++-------------+-----------------------------------------------+ +|VNF |Virtual Network Function | ++-------------+-----------------------------------------------+ + +Table 2-1 abbreviations + + +**3. Interfaces provided by VNFM Driver** +=========================================== + +Interfaces use RESTful API and the format is as follows: +http(s)://[hostname][:port]/api/{vnfmtype}/v1/{vnfm_id}/[……] +R1 vnfmtype: +zte-vnfm +fw-vnfm +juju + +**3.1 Instantiate VNF** +------------------------ + ++--------------+--------------------------------------------------------------+ +|If Definition | Description | ++==============+==============================================================+ +|URI | http(s)://[hostname][:port]/api/{vnfmtype}/v1/{vnfmid}/vnfs | ++--------------+--------------------------------------------------------------+ +|Operation | POST | ++--------------+--------------------------------------------------------------+ +|Direction | NSLCM->VNFMDriver | ++--------------+--------------------------------------------------------------+ + +**3.1.1 Request** + ++-----------------------+------------+-------------+----------+------------------------------+ +| Parameter | Qualifier | Cardinality | Content | Description | ++=======================+============+=============+==========+==============================+ +| vnfInstanceName | M | 1 | String | Human-readable name of the | +| | | | | VNF instance to be created. | ++-----------------------+------------+-------------+----------+------------------------------+ +| vnfPackageId | M | 1 | String | VNF packageId | ++-----------------------+------------+-------------+----------+------------------------------+ +| vnfDescriptorId | M | 1 | String | Information sufficient to | +| | | | | identify the VNF Descriptor | +| | | | | which defines the VNF to | +| | | | | be created. | ++-----------------------+------------+-------------+----------+------------------------------+ +| flavourId | M | 0..1 | String | Reserved | ++-----------------------+------------+-------------+----------+------------------------------+ +|vnfInstanceDescription | M | 0..1 | String | Human-readable | +| | | | | description of the VNF | +| | | | | instance to be created. | ++-----------------------+------------+-------------+----------+------------------------------+ +| extVirtualLink | M | 0..N | String | References to external | +| | | | | virtual links to connect the | +| | | | | VNF to. | ++-----------------------+------------+-------------+----------+------------------------------+ +| additionalParam | M | 0..N | String |Additional parameters | +| | | | |passed by the NFVO as | +| | | | |input to the instantiation | +| | | | |process, specific to the | +| | | | |VNF being instantiated. | ++-----------------------+------------+-------------+----------+------------------------------+ + +**ExtVirtualLinkData:** + ++--------------+------------+-------------+----------+----------------------------------------+ +| Attribute | Qualifier | Cardinality | Content | Description | ++==============+============+=============+==========+========================================+ +| vlInstanceId | M | 0..1 | String | Identifier of the VL instance | ++--------------+------------+-------------+----------+----------------------------------------+ +| vim | CM | 0..1 | VimInfo | Information about the VIM that | +| | | | | manages this resource. | +| | | | | This attribute shall be supported | +| | | | | and present if VNF-related resource | +| | | | | management in direct applicable. | ++--------------+------------+-------------+----------+----------------------------------------+ +| networkId | M | 1 | String | The network UUID of VIM | ++--------------+------------+-------------+----------+----------------------------------------+ +| cpdId | M | 0..1 | String | Identifier of the external CPD in VNFD | ++--------------+------------+-------------+----------+----------------------------------------+ + +**VimInfo:** + ++------------------+------------+-------------+--------------+------------------------------------------------+ +| Attribute | Qualifier | Cardinality | Content | Description | ++==================+============+=============+==============+================================================+ +| vimInfoId | M | 1 | Identifier | The identifier of this VimInfo instance, | +| | | | | for the purpose of referencing it from | +| | | | | other information elements. | ++------------------+------------+-------------+--------------+------------------------------------------------+ +| vimId | M | 1 | Identifier | The identifier of the VIM. | ++------------------+------------+-------------+--------------+------------------------------------------------+ +| interfaceInfo | M | 0..N | KeyValuePair | Information about the interface to the | +| | | | | VIM, including VIM provider type, API | +| | | | | version, and protocol type. | ++------------------+------------+-------------+--------------+------------------------------------------------+ +| accessInfo | M | 0..N | KeyValuePair | Authentication credentials for accessing the | +| | | | | VIM. Examples may include those to support | +| | | | | different authentication schemes, e.g., OAuth, | +| | | | | Token, etc. | ++------------------+------------+-------------+--------------+------------------------------------------------+ +|interfaceEndpoint | M | 1 | String | Information about the interface endpoint. An | +| | | | | example is a URL. | ++------------------+------------+-------------+--------------+------------------------------------------------+ + + +**interfaceInfo:** + ++--------------+------------+-------------+----------+-------------------------------+ +| Attribute | Qualifier | Cardinality | Content | Description | ++==============+============+=============+==========+===============================+ +| vimType | M | 1 | String | vim | ++--------------+------------+-------------+----------+-------------------------------+ +| apiVersion | M | 1 | String | | ++--------------+------------+-------------+----------+-------------------------------+ +| protocolType | M | 1 | String | http, https | ++--------------+------------+-------------+----------+-------------------------------+ + + +**accessInfo:** + ++--------------+------------+-------------+----------+-------------------------------+ +| Attribute | Qualifier | Cardinality | Content | Description | ++==============+============+=============+==========+===============================+ +| tenant | M | 1 | String | Tenant Name of tenant | ++--------------+------------+-------------+----------+-------------------------------+ +| username | M | 1 | String | Username for login | ++--------------+------------+-------------+----------+-------------------------------+ +| password | M | 1 | String | Password of login user | ++--------------+------------+-------------+----------+-------------------------------+ + +{ + "vnfInstanceName":"vFW", + "vnfPackageId":"1", + "vnfDescriptorId":"1", + "vnfInstanceDescription":"vFW_1", + "extVirtualLinkLink":[ + { + "vlInstanceId":"1", + "resourceId":"1246" , + " cpdId":"11111", + "vim": + { + "vimInfoId":"1", + "vimid":"1", + "interfaceInfo":{ + "vimType":"vim", + "apiVersion":"v2", + "protocolType":"http" + } + "accessInfo":{ + "tenant":"tenant_vCPE", + "username":"vCPE", + "password":"vCPE_321" + } + "interfaceEndpoint":"http://10.43.21.105:80/" + } + } + ] + "additionalParam":{ + …… + } +} + + +**3.1.2 Response** + ++--------------+------------+-------------+-----------+-------------------------------+ +| Parameter | Qualifier | Cardinality | Content | Description | ++==============+============+=============+===========+===============================+ +| jobId | M | 1 | Identifier| Tenant Name of tenant | +| | | | | operation occurrence. | +| | | | | | +| | | | | [lifecycleOperationOccurren | +| | | | | ceId] | ++--------------+------------+-------------+-----------+-------------------------------+ +| password | M | 1 | String | Password of login user | ++--------------+------------+-------------+-----------+-------------------------------+ + +{ + "jobId":"1", + "vnfInstanceId":"1" +} + +**3.2 Terminate VNF** +----------------------- + ++---------------+------------------------------------------------------------------+ +| IF Definition | Description | ++===============+==================================================================+ +| URI | http(s)://[hostname][:port]/api/{vnfmtype}/v1/{vnfmid}/vnfs/ | +| | {vnfInstanceId}/terminate | ++---------------+------------------------------------------------------------------+ +| Operation | POST | ++---------------+------------------------------------------------------------------+ +| Direction | NSLCM->VNFMDriver | ++---------------+------------------------------------------------------------------+ + +**3.2.1 Request** + ++-----------------+------------+-------------+-----------+----------------------------------+ +| Parameter | Qualifier | Cardinality | Content | Description | ++=================+============+=============+===========+==================================+ +| terminationType | M | 1 | Enum | Signals whether forceful or | +| | | | | graceful termination is | +| | | | | requested. | +| | | | | In case of forceful termination, | +| | | | | the VNF is shut down | +| | | | | immediately, and resources are | +| | | | | released. Note that if the VNF | +| | | | | is still in service, this may | +| | | | | adversely impact network | +| | | | | service, and therefore, operator | +| | | | | policies apply to determine if | +| | | | | forceful termination is allowed | +| | | | | in the particular situation. | +| | | | | | +| | | | | In case of graceful termination, | +| | | | | the VNFM first arranges to take | +| | | | | the VNF out of service (by | +| | | | | means out of scope of the | +| | | | | present specification, e.g. | +| | | | | involving interaction with EM, | +| | | | | if required). Once this was | +| | | | | successful, or after a timeout, | +| | | | | the VNFM shuts down the VNF | +| | | | | and releases the resources. | ++-----------------+------------+-------------+-----------+----------------------------------+ +| graceful | M | 0..1 | Time | The time interval (second) to | +| Termination | | | Duration | wait for the VNF to be taken out | +| Timeout | | | | of service during graceful | +| | | | | termination, before shutting | +| | | | | down the VNF and releasing the | +| | | | | resources. | +| | | | | If not given, it is expected | +| | | | | that the VNFM waits for the | +| | | | | successful taking out of service | +| | | | | of the VNF, no matter how long | +| | | | | it takes, before shutting down | +| | | | | the VNF and releasing the | +| | | | | resources (see note). | +| | | | | | +| | | | | Minimum timeout or timeout | +| | | | | range are specified by the VNF | +| | | | | Provider (e.g. defined in the | +| | | | | VNFD or communicated by | +| | | | | other means). | +| | | | | | +| | | | | Not relevant in case of forceful | +| | | | | termination. | ++-----------------+------------+-------------+-----------+----------------------------------+ + +{ + "vnfInstanceId":"1", + "terminationType":"graceful", + "gracefulTerminationTimeout":"60" +} + +**3.2.2 Response** + ++--------------+------------+-------------+-----------+--------------------------------+ +| Parameter | Qualifier | Cardinality | Content | Description | ++==============+============+=============+===========+================================+ +| jobId | M | 1 | Identifier| Identifier of the VNF lifecycle| +| | | | | operation occurrence. | +| | | | | | +| | | | | [lifecycleOperationOccurren | +| | | | | ceId] | ++--------------+------------+-------------+-----------+--------------------------------+ + +{ + "jobId":"1" +} + + +**3.3 Query VNF** +------------------ + ++---------------+------------------------------------------------------------------+ +| IF Definition | Description | ++===============+==================================================================+ +| URI | http(s)://[hostname][:port]/api/{vnfmtype}/v1/{vnfmid}/vnfs/ | +| | {vnfInstanceId} | ++---------------+------------------------------------------------------------------+ +| Operation | GET | ++---------------+------------------------------------------------------------------+ +| Direction | NSLCM->VNFMDriver | ++---------------+------------------------------------------------------------------+ + +**3.3.1 Request** + +VNF filter: vnfInstanceId via url [R1] + +**3.3.2 Response** + ++--------------+------------+-------------+-----------+---------------------------------+ +| Parameter | Qualifier | Cardinality | Content | Description | ++==============+============+=============+===========+=================================+ +| vnfInfo | M | o..N | vnfInfo | The information items about the | +| | | | | selected VNF instance(s) that | +| | | | | are returned. | +| | | | | | +| | | | | If attributeSelector is present,| +| | | | | only the attributes listed in | +| | | | | attributeSelector will be | +| | | | | returned for the selected | +| | | | | VNF instance(s). | +| | | | | See note. | ++--------------+------------+-------------+-----------+---------------------------------+ + +**VnfInfo Table** + ++-----------------+------------+-------------+----------+---------------------------------+ +| Attribute | Qualifier | Cardinality | Content | Description | ++=================+============+=============+==========+=================================+ +| vnfInstanceId | M | 1 | String | VNF instance identifier. | ++-----------------+------------+-------------+----------+---------------------------------+ +| vnfInstanceName | M | o..1 | String | VNF instance name. See note. | ++-----------------+------------+-------------+----------+---------------------------------+ +| vnfInstance | M | o..1 | String | Human-readable description of | +| Description | | | | the VNF instance. | ++-----------------+------------+-------------+----------+---------------------------------+ +| vnfdId | M | 1 | String | Identifier of the VNFD on which | +| | | | | the VNF instance is based. | ++-----------------+------------+-------------+----------+---------------------------------+ +| vnfPackageId | M | o..1 | String | Identifier of the VNF Package | +| | | | | used to manage the lifecycle of | +| | | | | the VNF instance. See note. | +| | | | | Shall be present for an | +| | | | | instantiated VNF instance. | ++-----------------+------------+-------------+----------+---------------------------------+ +| version | M | 1 | String | Version of the VNF. | ++-----------------+------------+-------------+----------+---------------------------------+ +| vnfProvider | M | 1 | String | Name of the person or company | +| | | | | providing the VNF. | ++-----------------+------------+-------------+----------+---------------------------------+ +| vnfType | M | 1 | String | VNF Application Type | ++-----------------+------------+-------------+----------+---------------------------------+ +| vnfStatus | M | 1 | Enum | The instantiation state of the | +| | | | | VNF. Possible values: | +| | | | | INACTIVE (Vnf is terminated or | +| | | | | not instantiated ), | +| | | | | ACTIVE (Vnf is instantiated). | +| | | | | [instantiationState] | ++-----------------+------------+-------------+----------+---------------------------------+ + +{ + "vnfInfo": + { + "nfInstanceId":"1", + "vnfInstanceName":"vFW", + "vnfInstanceDescription":"vFW in Nanjing TIC Edge", + "vnfdId":"1", + "vnfPackageId":"1", + "version":"V1.1", + "vnfProvider":"ZTE", + "vnfType":"vFW", + "vnfStatus":" ACTIVE", + } +} + +**3.4 Get operation status** +----------------------------- + ++---------------+------------------------------------------------------------------+ +| IF Definition | Description | ++===============+==================================================================+ +| URI | http(s)://[hostname][:port]/api/{vnfmtype} | +| | /v1/{vnfmid}/jobs/{jobid}&responseId={ responseId } | ++---------------+------------------------------------------------------------------+ +| Operation | GET | ++---------------+------------------------------------------------------------------+ +| Direction | NSLCM->VNFMDriver | ++---------------+------------------------------------------------------------------+ + +**3.4.1 Request** + + None + +**3.4.2 Response** + ++--------------------+------------+-------------+-------------+---------------------------------+ +| Parameter | Qualifier | Cardinality | Content | Description | ++====================+============+=============+=============+=================================+ +| jobId | M | 1 | String | Job ID | ++--------------------+------------+-------------+-------------+---------------------------------+ +| responseDescriptor | M | 1 | - | Including: | +| | | | | vnfStatus, statusDescription, | +| | | | | errorCode,progress, | +| | | | | responseHistoryList, responseId | ++--------------------+------------+-------------+-------------+---------------------------------+ +| status | M | 1 | String | JOB status | +| | | | | started | +| | | | | processing | +| | | | | finished | +| | | | | error | ++--------------------+------------+-------------+-------------+---------------------------------+ +| progress | M | 1 | Integer | progress (1-100) | ++--------------------+------------+-------------+-------------+---------------------------------+ +| statusDescription | M | 1 | String | Progress Description | ++--------------------+------------+-------------+-------------+---------------------------------+ +| errorCode | M | 1 | Integer | Errorcode | ++--------------------+------------+-------------+-------------+---------------------------------+ +| responseId | M | 1 | Integer | Response Identifier | ++--------------------+------------+-------------+-------------+---------------------------------+ +| response | M | o..N | ArrayList<> | History Response Messages | +| HistoryList | | | | from the requested | +| | | | | responseId to lastest one. | +| | | | | Including fields: | +| | | | | vnfStatus, | +| | | | | statusDescription, | +| | | | | errorCode, | +| | | | | progress, | +| | | | | responseId | ++--------------------+------------+-------------+-------------+---------------------------------+ + +{ + "jobId" : "1234566", + "responseDescriptor" : { + "progress" : "40", + "status" : "proccessing", + "statusDescription" : "OMC VMs are decommissioned in VIM", + "errorCode" : null, + "responseId" : "42", + "responseHistoryList" : [{ + "progress" : "40", + "status" : "proccessing", + "statusDescription" : "OMC VMs are decommissioned in VIM", + "errorCode" : null, + "responseId" : "1" + }, { + "progress" : "41", + "status" : "proccessing", + "statusDescription" : "OMC VMs are decommissioned in VIM", + "errorCode" : null, + "responseId" : "2" + } + ] + } +} + +**3.5 Scale VNF** +------------------ + ++---------------+------------------------------------------------------------------+ +| IF Definition | Description | ++===============+==================================================================+ +| URI | http(s)://[hostname][:port]/api/{vnfmtype}/v1/{vnfmid}/vnfs/ | +| | {vnfInstanceId}/scale | ++---------------+------------------------------------------------------------------+ +| Operation | POST | ++---------------+------------------------------------------------------------------+ +| Direction | NSLCM->VNFMDriver | ++---------------+------------------------------------------------------------------+ + +**3.5.1 Request** + ++---------------+------------+-------------+-------------+---------------------------------------------+ +| Parameter | Qualifier | Cardinality | Content | Description | ++===============+============+=============+=============+=============================================+ +| type | M | 1 | Enum | Defines the type of the scale operation | +| | | | | requested (scale out, scale in). The set of | +| | | | | types actually supported depends on the | +| | | | | capabilities of the VNF being managed, as | +| | | | | declared in the VNFD. See note 1. | ++---------------+------------+-------------+-------------+---------------------------------------------+ +| aspectId | M | 1 | Identifier | Identifies the aspect of the VNF that is | +| | | | | requested to be scaled, as declared in the | ++---------------+------------+-------------+-------------+---------------------------------------------+ +| numberOfSteps | M | 1 | Integer | Number of scaling steps to be executed as | +| | | | | part of this ScaleVnf operation. It shall | +| | | | | be a positive number. | +| | | | | Defaults to 1. | +| | | | | The VNF Provider defines in the VNFD | +| | | | | whether or not a particular VNF supports | +| | | | | performing more than one step at a time. | +| | | | | Such a property in the VNFD applies for all | ++--------------------+------------+-------------+-------------+----------------------------------------+ +| additional | M | 1 |KeyValuePair | Additional parameters passed by the NFVO | +| Param | | | | as input to the scaling proccess, specific | +| | | | | to the VNF being scaled. | +| | | | | Reserved | ++---------------+------------+-------------+-------------+---------------------------------------------+ +| NOTE 1: ETSI GS NFV-IFA 010 [2] specifies that the lifecycle management operations that expand | +| or contract a VNF instance include scale in, scale out, scale up and scale down. Vertical | +| scaling (scale up, scale down) is not supported in the present document. | +| SCALE_IN designates scaling in. | +| SCALE_OUT 1 designates scaling out. | +| NOTE 2: A scaling step is the smallest unit by which a VNF can be scaled w.r.t a particular scaling | +| aspect. | ++------------------------------------------------------------------------------------------------------+ + +{ + "vnfInstanceId":"5", + "type":" SCALE_OUT", + "aspectId":"101", + "numberOfSteps":"1", + "additionalParam":{ + …… + } +} + +**3.5.2 Response** + ++--------------------+------------+-------------+-------------+---------------------------------+ +| Parameter | Qualifier | Cardinality | Content | Description | ++====================+============+=============+=============+=================================+ +| jobId | M | 1 | String | The identifier of the VNF | +| | | | | lifecycle operation occurrence. | ++--------------------+------------+-------------+-------------+---------------------------------+ + +{ + "jobId":"1" +} + +**3.6 Heal VNF** +------------------ + ++---------------+------------------------------------------------------------------+ +| IF Definition | Description | ++===============+==================================================================+ +| URI | http(s)://[hostname][:port]/api/{vnfmtype}/v1/{vnfmid}/vnfs | +| | {vnfInstanceId}/heal | ++---------------+------------------------------------------------------------------+ +| Operation | POST | ++---------------+------------------------------------------------------------------+ +| Direction | NSLCM->VNFMDriver | ++---------------+------------------------------------------------------------------+ + +**3.6.1 Request** + ++--------------------+------------+-------------+-------------+---------------------------------+ +| Parameter | Qualifier | Cardinality | Content | Description | ++====================+============+=============+=============+=================================+ +| action | M | 1 | String | Indicates the action to be done | +| | | | | upon the given virtual machine. | +| | | | | Only "vmReset" is supported | +| | | | | currently. | ++--------------------+------------+-------------+-------------+---------------------------------+ +| affectedvm | M | 1 | AffectedVm | Defines the information of | +| | | | | virtual machines. | ++--------------------+------------+-------------+-------------+---------------------------------+ + +**AffectedVm** + ++--------------------+------------+-------------+-------------+---------------------------------+ +| Parameter | Qualifier | Cardinality | Content | Description | ++====================+============+=============+=============+=================================+ +| vimid | M | 1 | String | Defines the UUID of virtual | +| | | | | machine. | ++--------------------+------------+-------------+-------------+---------------------------------+ +| vduid | M | 1 | String | Defines the id of vdu. | ++--------------------+------------+-------------+-------------+---------------------------------+ +| vmname | M | 1 | | Defines the name of virtual | +| | | | | machines. | ++--------------------+------------+-------------+-------------+---------------------------------+ + +{ + "action": "vmReset", + "affectedvm": + { + "vmid": "804cca71-9ae9-4511-8e30-d1387718caff", + "vduid": "vdu_100", + "vmname": "ZTE_SSS_111_PP_2_L" + }, +} + +**3.6.2 Response** + ++--------------------+------------+-------------+-------------+---------------------------------+ +| Parameter | Qualifier | Cardinality | Content | Description | ++====================+============+=============+=============+=================================+ +| jobId | M | 1 | Identifier | The identifier of the VNF | +| | | | | healing operation occurrence. | ++--------------------+------------+-------------+-------------+---------------------------------+ + +{ + "jobId":"1" +} diff --git a/docs/APIs/VNFMDriver_API/index.rst b/docs/APIs/VNFMDriver_API/index.rst new file mode 100644 index 00000000..cf017587 --- /dev/null +++ b/docs/APIs/VNFMDriver_API/index.rst @@ -0,0 +1,7 @@ +VNFM Driver API +--------------- + +.. toctree:: + :titlesonly: + + VNFM_Driver_API \ No newline at end of file diff --git a/docs/APIs/index.rst b/docs/APIs/index.rst new file mode 100644 index 00000000..b05bede2 --- /dev/null +++ b/docs/APIs/index.rst @@ -0,0 +1,43 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. +.. http://creativecommons.org/licenses/by/4.0 + + +VF-C Offered APIs +================= +List VF-C APIs offered. + + +NS LCM API +---------- + +Network services lifecycle management APIs + + +.. toctree:: + :maxdepth: 1 + + NSLCM_API/index + + +VNFM Driver API +--------------- + +VNFM Driver component northbound APIs + +.. toctree:: + :maxdepth: 1 + + VNFMDriver_API/index + + + +VNF LCM API +----------- + +VNF lifecycle management APIs + +.. toctree:: + :maxdepth: 1 + + VNFLCM_API/index + diff --git a/docs/architecture.rst b/docs/architecture.rst new file mode 100644 index 00000000..20ac2118 --- /dev/null +++ b/docs/architecture.rst @@ -0,0 +1,18 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. +.. http://creativecommons.org/licenses/by/4.0 + + +VF-C Architecture +----------------- +Following is the VF-C architecture. + + +|image0| + +.. |image0| image:: vfc-arc.png + :width: 5.97047in + :height: 5.63208in + +VF-C includes two components: NFVO and GVNFM + +VF-C has many dependencies with other projects,such as SO,Policy,A&AI,SDC,DCAE,Multi-cloud and so on. \ No newline at end of file diff --git a/docs/components.png b/docs/components.png new file mode 100644 index 0000000000000000000000000000000000000000..253e63bf1f37bc80dff525e360092052835855a4 GIT binary patch literal 6381 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 literal 0 HcmV?d00001 diff --git a/docs/delivery.rst b/docs/delivery.rst new file mode 100644 index 00000000..f31d396e --- /dev/null +++ b/docs/delivery.rst @@ -0,0 +1,13 @@ +VF-C Delivery +-------- +VF-C includs the following components in R1. + +|image0| + +.. |image0| image:: components.png + :width: 5.97047in + :height: 5.63208in + + + + diff --git a/docs/index.rst b/docs/index.rst index c8ea0959..8311287b 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,7 +1,24 @@ -NSLCM API ---------- - -.. toctree:: - :titlesonly: - - NSLCM_API_Specification_v0.1 \ No newline at end of file +.. This work is licensed under a Creative Commons Attribution 4.0 International License. +.. http://creativecommons.org/licenses/by/4.0 + +.. _vfc_index: + +ONAP VF-C +========= + +As part of the integration between OpenECOMP and OPEN-O, VF-C leverages ETSI NFV MANO architecture and information model as a reference, and implements life cycle management and FCAPS of VNF and NS. + +* support NS and VNF lifecycle management based on the ONAP tosca and yang data model and workflow +* support integration with multi VNFMs via drivers, which include vendors VNFM and generic VNFM +* support integration with multi VNFs via generic VNFM, which does not provide VNFM function +* support integration with multi VIMS via Multi-VIM, which include the opensource and commercial VIMs +* support microservice architecture and model driven resource orchestration and management + + +.. toctree:: + :maxdepth: 1 + + architecture.rst + delivery.rst + APIs/index + installation.rst diff --git a/docs/installation.rst b/docs/installation.rst new file mode 100644 index 00000000..efdf8167 --- /dev/null +++ b/docs/installation.rst @@ -0,0 +1,14 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. +.. http://creativecommons.org/licenses/by/4.0 + +VF-C Installation +------------ +Describe the environment and steps to install VF-C components. + + +Environment ++++++++++++ + + +Steps ++++++ diff --git a/docs/logging.rst b/docs/logging.rst new file mode 100644 index 00000000..8d480e28 --- /dev/null +++ b/docs/logging.rst @@ -0,0 +1,14 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. +.. http://creativecommons.org/licenses/by/4.0 + +Logging & Diagnostic Information +-------------------------------- +Description of how to interact with and diagnose problems with the components +as delivered. + +Where to Access Information ++++++++++++++++++++++++++++ + + +Error / Warning Messages +++++++++++++++++++++++++ diff --git a/docs/offeredapis.rst b/docs/offeredapis.rst new file mode 100644 index 00000000..79af6645 --- /dev/null +++ b/docs/offeredapis.rst @@ -0,0 +1,43 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. +.. http://creativecommons.org/licenses/by/4.0 + + +VF-C Offered APIs +================= +List VF-C APIs offered. + + +NS LCM API +---------- + +Network services lifecycle management APIs + + +.. toctree:: + :maxdepth: 1 + + APIs/NSLCM_API/index + + +VNFM Driver API +--------------- + +VNFM Driver component northbound APIs + +.. toctree:: + :maxdepth: 1 + + APIs/VNFMDriver_API/index + + + +VNF LCM API +----------- + +VNF lifecycle management APIs + +.. toctree:: + :maxdepth: 1 + + APIs/VNFLCM_API/index + diff --git a/docs/vfc-arc.png b/docs/vfc-arc.png new file mode 100644 index 0000000000000000000000000000000000000000..561488b2f556a40197161392d5a651c6aa5f3643 GIT binary patch literal 71929 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 literal 0 HcmV?d00001 -- 2.16.6