Add documents for enhance operations in V2

This patch provides Tacker documents for enhance operations(heal,
scale, update, changeextconn) in V2-API. The specification about new
API is added to API Reference. Also, update operation is added to
Tacker Use Cases Guide and CLI Reference.

This patch also includes changes to the user data script.

Implements: blueprint support-nfv-solv3-change-external-connectivity
Implements: blueprint support-nfv-solv3-heal-vnf
Implements: blueprint support-nfv-solv3-modify-vnf
Implements: blueprint support-nfv-solv3-scale-vnf
Change-Id: I6adefc59903a4c8305a66c224c086af4b86812df
This commit is contained in:
Tetsuro Kaneko 2022-03-01 16:13:52 +09:00
parent 61cb57a8b9
commit cabb474908
22 changed files with 1583 additions and 223 deletions

View File

@ -170,6 +170,19 @@ affected_vnfcs_vdu_id:
in: body
required: true
type: string
all:
description: |
Defines whether network resources and storage resources are included
in the heal target.
in: body
required: false
type: boolean
aspect_id:
description: |
Identifier of the scaling aspect.
in: body
required: true
type: string
authentication:
description: |
Authentication parameters to configure the use of
@ -268,6 +281,125 @@ callback_uri:
in: body
required: true
type: string
cause:
description: |
Indicates the reason why a healing procedure is required.
in: body
required: false
type: string
change_ext_vnf_connectivity_additional_params:
description: |
Additional parameters passed by the NFVO as input to the process,
specific to the VNF of which the external connectivity is changed,
as declared in the VNFD as part of "ChangeExtVnfConnectivityOpConfig".
in: body
required: false
type: key value pairs
change_ext_vnf_connectivity_ext_virtual_links:
description: |
Information about external VLs to change.
in: body
required: true
type: array
changed_ext_connectivity:
description: |
Information about changed external connectivity,
if applicable.
in: body
required: false
type: object
changed_ext_connectivity_id:
description: |
Identifier of the external VL and the related external VL
information instance. The identifier is assigned by the
NFV-MANO entity that manages this VL instance.
in: body
required: false
type: string
changed_info:
description: |
Information about the changed VNF instance information,
including VNF configurable properties, if applicable.
in: body
required: false
type: object
changed_info_extensions:
description: |
If present, this attribute signals modifications of the
"extensions" attribute in "VnfInstance".
in: body
required: false
type: key value pairs
changed_info_metadata:
description: |
If present, this attribute signals modifications of the
"metadata" attribute in "VnfInstance".
in: body
required: false
type: key value pairs
changed_info_vim_connection_info:
description: |
If present, this attribute signals modifications of certain
entries in the "vimConnectionInfo" attribute array in "VnfInstance".
in: body
required: false
type: array
changed_info_vnf_configurable_properties:
description: |
If present, this attribute signals modifications of the
"vnfConfigurableProperties" attribute in "VnfInstance".
in: body
required: false
type: key value pairs
changed_info_vnf_instance_description:
description: |
If present, this attribute signals modifications of the
"vnfInstanceDescription" attribute in "VnfInstance".
in: body
required: false
type: string
changed_info_vnf_instance_name:
description: |
If present, this attribute signals modifications of the
"vnfInstanceName" attribute in "VnfInstance".
in: body
required: false
type: string
changed_info_vnf_product_name:
description: |
If present, this attribute signals modifications of the
"vnfProductName" attribute in "VnfInstance".
in: body
required: false
type: string
changed_info_vnf_provider:
description: |
If present, this attribute signals modifications of the
"vnfProvider" attribute in "VnfInstance".
in: body
required: false
type: string
changed_info_vnf_software_version:
description: |
If present, this attribute signals modifications of the
"vnfSoftwareVersion" attribute in "VnfInstance".
in: body
required: false
type: string
changed_info_vnfd_id:
description: |
If present, this attribute signals modifications of the
"vnfdId" attribute in "VnfInstance".
in: body
required: false
type: string
changed_info_vnfd_version:
description: |
If present, this attribute signals modifications of the
"vnfdVersion" attribute in "VnfInstance".
in: body
required: false
type: string
cp_config:
description: |
List of instance data that need to be configured on the CP instances
@ -275,6 +407,15 @@ cp_config:
in: body
required: true
type: map
cp_instance_id:
description: |
Identifier of the external Connection Point instance to which this set of
configuration parameters is requested to be applied.
Shall be present if this instance has already been created.
in: body
required: false
type: string
cp_protocol_data:
description: |
Parameters for configuring the network protocols on the link port that
@ -629,6 +770,14 @@ grant_id:
in: body
required: false
type: string
heal_additional_params:
description: |
Additional parameters passed by the NFVO as input to the healing process,
specific to the VNF being healed, as declared in the VNFD as part of
"HealVnfOpConfig".
in: body
required: false
type: key value pairs
instantiated_vnf_info:
description: |
Information specific to an instantiated VNF instance. This attribute shall
@ -760,6 +909,14 @@ num_dynamic_addresses:
in: body
required: false
type: int
number_of_steps:
description: |
Number of scaling steps to be executed as part of this
Scale VNF operation. It shall be a positive number and the
default value shall be 1.
in: body
required: false
type: int
operation:
description: |
Type of the actual LCM operation represented by this
@ -859,6 +1016,25 @@ resource_provider_id:
in: body
required: false
type: string
scale_additional_params:
description: |
Additional parameters passed by the NFVO as input to the
scaling process, specific to the VNF being scaled, as
declared in the VNFD as part of "ScaleVnfOpConfig".
in: body
required: false
type: key value pairs
scale_type:
description: |
Indicates the type of the scale operation requested.
Permitted values:
SCALE_OUT: adding additional VNFC instances to the VNF to increase capacity.
SCALE_IN: removing VNFC instances from the VNF in order to release unused capacity.
in: body
required: true
type: string
segmentation_id:
description: |
Identification of the network segment to which
@ -982,7 +1158,7 @@ vim_connection_info_vim_type:
The set of permitted values is expected to change over time as new
types or versions of VIMs become available.
in: body
required: false
required: true
type: string
virtual_storage_resource_info:
description: |
@ -1124,6 +1300,51 @@ vnf_instance_terminate_request_additional_params:
in: body
required: false
type: key value pairs
vnf_instance_update_configurable_properties:
description: |
Modifications of the "vnfConfigurableProperties" attribute in
"VnfInstance". If present, these modifications shall be applied
according to the rules of JSON Merge Patch.
in: body
required: false
type: key value pairs
vnf_instance_update_extensions:
description: |
Modifications of the "extensions" attribute in "VnfInstance".
If present, these modifications shall be applied according to the
rules of JSON Merge Patch.
in: body
required: false
type: key value pairs
vnf_instance_update_request_description:
description: |
New value of the "vnfInstanceDescription" attribute in
"VnfInstance".
in: body
required: false
type: string
vnf_instance_update_request_metadata:
description: |
Modifications of the "metadata" attribute in
"VnfInstance". If present, these modifications shall be
applied according to the rules of JSON Merge Patch.
in: body
required: false
type: key value pairs
vnf_instance_update_request_name:
description: |
New value of the "vnfInstanceName" attribute in
"VnfInstance".
in: body
required: false
type: string
vnf_instance_update_request_vnfd_id:
description: |
New value of the "vnfdId" attribute in "VnfInstance".
The value "null" is not permitted.
in: body
required: false
type: string
vnf_instance_vim_connection_info:
description: |
Information about VIM connections to be used for managing the resources
@ -1347,6 +1568,12 @@ vnf_virtual_link_resource_info_vnf_virtual_link_desc_id:
in: body
required: true
type: string
vnfc_configurable_properties:
description: |
Changes of the configurable properties of the VNFC instance.
in: body
required: true
type: key value pairs
vnfc_cp_info_cpd_id:
description: |
Identifier of the VDU CPD, cpdId, in the VNFD.
@ -1378,6 +1605,21 @@ vnfc_info_id:
in: body
required: true
type: string
vnfc_info_modifications:
description: |
This attribute signals modifications of certain entries in the
"vnfcInfo" attribute array in the "instantiatedVnfInfo" attribute of
"VnfInstance".
in: body
required: false
type: array
vnfc_info_modifications_id:
description: |
Identifier of the VNFC instance of which the information is to be
modified.
in: body
required: true
type: string
vnfc_info_vdu_id:
description: |
Reference to the applicable VDU information element in the VNFD.
@ -1414,6 +1656,12 @@ vnfc_resource_info_id:
in: body
required: true
type: string
vnfc_resource_info_ids:
description: |
List of VNFC instances requiring a healing action.
in: body
required: false
type: array
vnfc_resource_info_vdu_id:
description: |
Reference to the applicable VDU in the VNFD.

View File

@ -0,0 +1,195 @@
{
"additionalParams": {
"dummy-key": "dummy-value"
},
"extVirtualLinks": [
{
"extCps": [
{
"cpConfig": {
"VDU1_CP1": {
"cpProtocolData": [
{
"ipOverEthernet": {
"ipAddresses": [
{
"numDynamicAddresses": 1,
"subnetId": "9df49e05-4288-48d3-bbb5-9ae902d98506",
"type": "IPV4"
}
]
},
"layerProtocol": "IP_OVER_ETHERNET"
}
],
"parentCpConfigId": "6274c3fa-1cec-41cc-add2-fc8808793cf7"
}
},
"cpdId": "VDU1_CP1"
},
{
"cpConfig": {
"VDU2_CP1-1": {
"cpProtocolData": [
{
"ipOverEthernet": {
"ipAddresses": [
{
"numDynamicAddresses": 1,
"subnetId": "9df49e05-4288-48d3-bbb5-9ae902d98506",
"type": "IPV4"
}
]
},
"layerProtocol": "IP_OVER_ETHERNET"
}
],
"linkPortId": "315a2b77-8076-49df-84fe-45579faf4085",
"parentCpConfigId": "99f8ba42-3619-4fbd-81a5-999c3767237b"
}
},
"cpdId": "VDU2_CP1-1"
},
{
"cpConfig": {
"VDU2_CP1-2": {
"cpProtocolData": [
{
"ipOverEthernet": {
"ipAddresses": [
{
"numDynamicAddresses": 1,
"subnetId": "9df49e05-4288-48d3-bbb5-9ae902d98506",
"type": "IPV4"
}
]
},
"layerProtocol": "IP_OVER_ETHERNET"
}
],
"linkPortId": "63e41d9c-2b34-45e9-be79-13bdf9f8b3a3",
"parentCpConfigId": "3b55b051-c5cb-41cf-bc0e-ea71e95d2636"
}
},
"cpdId": "VDU2_CP1-2"
}
],
"extLinkPorts": [
{
"id": "315a2b77-8076-49df-84fe-45579faf4085",
"resourceHandle": {
"resourceId": "1cb1fb17-1a8f-4052-8599-ec6858da3659"
}
},
{
"id": "63e41d9c-2b34-45e9-be79-13bdf9f8b3a3",
"resourceHandle": {
"resourceId": "dummy-id"
}
}
],
"id": "38a38351-fbed-4637-8dcd-01ca1f69d4bb",
"resourceId": "bbe38e96-8395-4b7f-a7da-67058922df1c",
"resourceProviderId": "Company",
"vimConnectionId": "defb2f96-5670-4bef-8036-27bf61267fc1"
},
{
"extCps": [
{
"cpConfig": {
"VDU1_CP2": {
"cpProtocolData": [
{
"ipOverEthernet": {
"ipAddresses": [
{
"numDynamicAddresses": 1,
"subnetId": "775cdf14-a942-4358-a3f2-60ad423f6ad2",
"type": "IPV4"
}
]
},
"layerProtocol": "IP_OVER_ETHERNET"
}
],
"parentCpConfigId": "c09646b2-8a91-4af3-8260-71cfa865a5b1"
}
},
"cpdId": "VDU1_CP2"
},
{
"cpConfig": {
"VDU2_CP2": {
"cpProtocolData": [
{
"ipOverEthernet": {
"ipAddresses": [
{
"fixedAddresses": [
"100.100.100.12"
],
"subnetId": "775cdf14-a942-4358-a3f2-60ad423f6ad2",
"type": "IPV4"
},
{
"numDynamicAddresses": 1,
"subnetId": "15cd2e7e-add5-42cd-b790-2fe734fcc7dc",
"type": "IPV6"
}
],
"macAddress": "fa:16:3e:fa:22:75"
},
"layerProtocol": "IP_OVER_ETHERNET"
}
],
"parentCpConfigId": "40820a06-be32-4ea1-ae38-5f164c8de178"
}
},
"cpdId": "VDU2_CP2"
}
],
"id": "97a82200-328a-44f6-98cb-bfdf27c359c1",
"resourceId": "b47d25bd-f1d8-4136-b7e7-ac8754977661",
"resourceProviderId": "Company",
"vimConnectionId": "defb2f96-5670-4bef-8036-27bf61267fc1"
}
],
"vimConnectionInfo": {
"vim1": {
"accessInfo": {
"password": "devstack",
"project": "nfv",
"projectDomain": "Default",
"region": "RegionOne",
"userDomain": "Default",
"username": "nfv_user"
},
"extra": {
"new-key": "new-val"
},
"interfaceInfo": {
"endpoint": "http://localhost/identity/v3"
},
"vimId": "defb2f96-5670-4bef-8036-27bf61267fc1",
"vimType": "ETSINFV.OPENSTACK_KEYSTONE.V_3"
},
"vim2": {
"accessInfo": {
"password": "dummy_password",
"project": "dummy_project",
"projectDomain": "Default",
"region": "RegionOne",
"userDomain": "Default",
"username": "dummy_user"
},
"extra": {
"dummy-key": "dummy-val"
},
"interfaceInfo": {
"endpoint": "http://localhost/identity/v3"
},
"vimId": "c8dbc7c0-a4f4-4bff-8075-4cb555e63b7b",
"vimType": "ETSINFV.OPENSTACK_KEYSTONE.V_3"
}
}
}

View File

@ -1,7 +1,7 @@
{
"_links": {
"self": {
"href": "http://127.0.0.1:9890/v2/vnflcm/subscriptions/084cf869-d787-4c1a-b43b-405a25ed98da"
"href": "http://127.0.0.1:9890/vnflcm/v2/subscriptions/084cf869-d787-4c1a-b43b-405a25ed98da"
}
},
"callbackUri": "http://127.0.0.1/",

View File

@ -1,10 +1,10 @@
{
"_links": {
"instantiate": {
"href": "http://127.0.0.1:9890/v2/vnflcm/vnf_instances/99e2bae9-45d3-4ca1-83f4-34d44ca25bee/instantiate"
"href": "http://127.0.0.1:9890/vnflcm/v2/vnf_instances/99e2bae9-45d3-4ca1-83f4-34d44ca25bee/instantiate"
},
"self": {
"href": "http://127.0.0.1:9890/v2/vnflcm/vnf_instances/99e2bae9-45d3-4ca1-83f4-34d44ca25bee"
"href": "http://127.0.0.1:9890/vnflcm/v2/vnf_instances/99e2bae9-45d3-4ca1-83f4-34d44ca25bee"
}
},
"extensions": {},

View File

@ -1,19 +1,19 @@
{
"_links": {
"fail": {
"href": "http://127.0.0.1:9890/v2/vnflcm/vnf_lcm_op_occs/9b475d28-5acb-4c3b-95dd-fec2b2319643/fail"
"href": "http://127.0.0.1:9890/vnflcm/v2/vnf_lcm_op_occs/9b475d28-5acb-4c3b-95dd-fec2b2319643/fail"
},
"retry": {
"href": "http://127.0.0.1:9890/v2/vnflcm/vnf_lcm_op_occs/9b475d28-5acb-4c3b-95dd-fec2b2319643/retry"
"href": "http://127.0.0.1:9890/vnflcm/v2/vnf_lcm_op_occs/9b475d28-5acb-4c3b-95dd-fec2b2319643/retry"
},
"rollback": {
"href": "http://127.0.0.1:9890/v2/vnflcm/vnf_lcm_op_occs/9b475d28-5acb-4c3b-95dd-fec2b2319643/rollback"
"href": "http://127.0.0.1:9890/vnflcm/v2/vnf_lcm_op_occs/9b475d28-5acb-4c3b-95dd-fec2b2319643/rollback"
},
"self": {
"href": "http://127.0.0.1:9890/v2/vnflcm/vnf_lcm_op_occs/9b475d28-5acb-4c3b-95dd-fec2b2319643"
"href": "http://127.0.0.1:9890/vnflcm/v2/vnf_lcm_op_occs/9b475d28-5acb-4c3b-95dd-fec2b2319643"
},
"vnfInstance": {
"href": "http://127.0.0.1:9890/v2/vnflcm/vnf_instances/10ed068e-1284-48f2-9b6e-1c443ace9cc6"
"href": "http://127.0.0.1:9890/vnflcm/v2/vnf_instances/10ed068e-1284-48f2-9b6e-1c443ace9cc6"
}
},
"error": {

View File

@ -0,0 +1,7 @@
{
"cause": "healing",
"additionalParams": {
"all": false
},
"vnfcInstanceId": ["c51c98dc-b918-4681-a9eb-4f32a57c4e08"]
}

View File

@ -2,7 +2,7 @@
{
"_links": {
"self": {
"href": "http://127.0.0.1:9890/v2/vnflcm/subscriptions/cd87e3d6-9bbe-4ad1-bb21-0f5c3e4e777d"
"href": "http://127.0.0.1:9890/vnflcm/v2/subscriptions/cd87e3d6-9bbe-4ad1-bb21-0f5c3e4e777d"
}
},
"callbackUri": "http://127.0.0.1/",

View File

@ -1,11 +1,20 @@
[
{
"_links": {
"changeExtConn": {
"href": "http://127.0.0.1:9890/vnflcm/v2/vnf_instances/99e2bae9-45d3-4ca1-83f4-34d44ca25bee/change_ext_conn"
},
"heal": {
"href": "http://127.0.0.1:9890/vnflcm/v2/vnf_instances/99e2bae9-45d3-4ca1-83f4-34d44ca25bee/heal"
},
"scale": {
"href": "http://127.0.0.1:9890/vnflcm/v2/vnf_instances/99e2bae9-45d3-4ca1-83f4-34d44ca25bee/scale"
},
"self": {
"href": "http://127.0.0.1:9890/v2/vnflcm/vnf_instances/99e2bae9-45d3-4ca1-83f4-34d44ca25bee"
"href": "http://127.0.0.1:9890/vnflcm/v2/vnf_instances/99e2bae9-45d3-4ca1-83f4-34d44ca25bee"
},
"terminate": {
"href": "http://127.0.0.1:9890/v2/vnflcm/vnf_instances/99e2bae9-45d3-4ca1-83f4-34d44ca25bee/terminate"
"href": "http://127.0.0.1:9890/vnflcm/v2/vnf_instances/99e2bae9-45d3-4ca1-83f4-34d44ca25bee/terminate"
}
},
"extensions": {},

View File

@ -3,19 +3,19 @@
{
"_links": {
"fail": {
"href": "http://127.0.0.1:9890/v2/vnflcm/vnf_lcm_op_occs/a790879c-05f9-4475-9c90-1677452d3eb5/fail"
"href": "http://127.0.0.1:9890/vnflcm/v2/vnf_lcm_op_occs/a790879c-05f9-4475-9c90-1677452d3eb5/fail"
},
"retry": {
"href": "http://127.0.0.1:9890/v2/vnflcm/vnf_lcm_op_occs/a790879c-05f9-4475-9c90-1677452d3eb5/retry"
"href": "http://127.0.0.1:9890/vnflcm/v2/vnf_lcm_op_occs/a790879c-05f9-4475-9c90-1677452d3eb5/retry"
},
"rollback": {
"href": "http://127.0.0.1:9890/v2/vnflcm/vnf_lcm_op_occs/a790879c-05f9-4475-9c90-1677452d3eb5/rollback"
"href": "http://127.0.0.1:9890/vnflcm/v2/vnf_lcm_op_occs/a790879c-05f9-4475-9c90-1677452d3eb5/rollback"
},
"self": {
"href": "http://127.0.0.1:9890/v2/vnflcm/vnf_lcm_op_occs/a790879c-05f9-4475-9c90-1677452d3eb5"
"href": "http://127.0.0.1:9890/vnflcm/v2/vnf_lcm_op_occs/a790879c-05f9-4475-9c90-1677452d3eb5"
},
"vnfInstance": {
"href": "http://127.0.0.1:9890/v2/vnflcm/vnf_instances/e00f0d64-d7a3-459b-8a51-b402d5344296"
"href": "http://127.0.0.1:9890/vnflcm/v2/vnf_instances/e00f0d64-d7a3-459b-8a51-b402d5344296"
}
},
"grantId": "30bdaa69-ef80-4545-9298-428b70ce8e4a",
@ -163,19 +163,19 @@
{
"_links": {
"fail": {
"href": "http://127.0.0.1:9890/v2/vnflcm/vnf_lcm_op_occs/fdd8bdf4-8f7b-4237-99d3-c87c0910571d/fail"
"href": "http://127.0.0.1:9890/vnflcm/v2/vnf_lcm_op_occs/fdd8bdf4-8f7b-4237-99d3-c87c0910571d/fail"
},
"retry": {
"href": "http://127.0.0.1:9890/v2/vnflcm/vnf_lcm_op_occs/fdd8bdf4-8f7b-4237-99d3-c87c0910571d/retry"
"href": "http://127.0.0.1:9890/vnflcm/v2/vnf_lcm_op_occs/fdd8bdf4-8f7b-4237-99d3-c87c0910571d/retry"
},
"rollback": {
"href": "http://127.0.0.1:9890/v2/vnflcm/vnf_lcm_op_occs/fdd8bdf4-8f7b-4237-99d3-c87c0910571d/rollback"
"href": "http://127.0.0.1:9890/vnflcm/v2/vnf_lcm_op_occs/fdd8bdf4-8f7b-4237-99d3-c87c0910571d/rollback"
},
"self": {
"href": "http://127.0.0.1:9890/v2/vnflcm/vnf_lcm_op_occs/fdd8bdf4-8f7b-4237-99d3-c87c0910571d"
"href": "http://127.0.0.1:9890/vnflcm/v2/vnf_lcm_op_occs/fdd8bdf4-8f7b-4237-99d3-c87c0910571d"
},
"vnfInstance": {
"href": "http://127.0.0.1:9890/v2/vnflcm/vnf_instances/c256d5c2-f29e-474c-bced-cbc6d9e2b00b"
"href": "http://127.0.0.1:9890/vnflcm/v2/vnf_instances/c256d5c2-f29e-474c-bced-cbc6d9e2b00b"
}
},
"grantId": "3aa7d8cd-6f85-4d7f-859a-eb26481157e6",

View File

@ -0,0 +1,8 @@
{
"additionalParams": {
"dummy-key": "dummy-value"
},
"aspectId": "VDU1_scale",
"numberOfSteps": 1,
"type": "SCALE_OUT"
}

View File

@ -1,7 +1,7 @@
{
"_links": {
"self": {
"href": "http://127.0.0.1:9890/v2/vnflcm/subscriptions/cd87e3d6-9bbe-4ad1-bb21-0f5c3e4e777d"
"href": "http://127.0.0.1:9890/vnflcm/v2/subscriptions/cd87e3d6-9bbe-4ad1-bb21-0f5c3e4e777d"
}
},
"callbackUri": "http://127.0.0.1/",

View File

@ -1,10 +1,19 @@
{
"_links": {
"changeExtConn": {
"href": "http://127.0.0.1:9890/vnflcm/v2/vnf_instances/99e2bae9-45d3-4ca1-83f4-34d44ca25bee/change_ext_conn"
},
"heal": {
"href": "http://127.0.0.1:9890/vnflcm/v2/vnf_instances/99e2bae9-45d3-4ca1-83f4-34d44ca25bee/heal"
},
"scale": {
"href": "http://127.0.0.1:9890/vnflcm/v2/vnf_instances/99e2bae9-45d3-4ca1-83f4-34d44ca25bee/scale"
},
"self": {
"href": "http://127.0.0.1:9890/v2/vnflcm/vnf_instances/99e2bae9-45d3-4ca1-83f4-34d44ca25bee"
"href": "http://127.0.0.1:9890/vnflcm/v2/vnf_instances/99e2bae9-45d3-4ca1-83f4-34d44ca25bee"
},
"terminate": {
"href": "http://127.0.0.1:9890/v2/vnflcm/vnf_instances/99e2bae9-45d3-4ca1-83f4-34d44ca25bee/terminate"
"href": "http://127.0.0.1:9890/vnflcm/v2/vnf_instances/99e2bae9-45d3-4ca1-83f4-34d44ca25bee/terminate"
}
},
"extensions": {},

View File

@ -1,19 +1,19 @@
{
"_links": {
"fail": {
"href": "http://127.0.0.1:9890/v2/vnflcm/vnf_lcm_op_occs/a790879c-05f9-4475-9c90-1677452d3eb5/fail"
"href": "http://127.0.0.1:9890/vnflcm/v2/vnf_lcm_op_occs/a790879c-05f9-4475-9c90-1677452d3eb5/fail"
},
"retry": {
"href": "http://127.0.0.1:9890/v2/vnflcm/vnf_lcm_op_occs/a790879c-05f9-4475-9c90-1677452d3eb5/retry"
"href": "http://127.0.0.1:9890/vnflcm/v2/vnf_lcm_op_occs/a790879c-05f9-4475-9c90-1677452d3eb5/retry"
},
"rollback": {
"href": "http://127.0.0.1:9890/v2/vnflcm/vnf_lcm_op_occs/a790879c-05f9-4475-9c90-1677452d3eb5/rollback"
"href": "http://127.0.0.1:9890/vnflcm/v2/vnf_lcm_op_occs/a790879c-05f9-4475-9c90-1677452d3eb5/rollback"
},
"self": {
"href": "http://127.0.0.1:9890/v2/vnflcm/vnf_lcm_op_occs/a790879c-05f9-4475-9c90-1677452d3eb5"
"href": "http://127.0.0.1:9890/vnflcm/v2/vnf_lcm_op_occs/a790879c-05f9-4475-9c90-1677452d3eb5"
},
"vnfInstance": {
"href": "http://127.0.0.1:9890/v2/vnflcm/vnf_instances/e00f0d64-d7a3-459b-8a51-b402d5344296"
"href": "http://127.0.0.1:9890/vnflcm/v2/vnf_instances/e00f0d64-d7a3-459b-8a51-b402d5344296"
}
},
"grantId": "f848dd6c-6393-4104-8bfe-df764a042563",

View File

@ -0,0 +1,48 @@
{
"extensions": {
"dummy-key": "dummy-value"
},
"metadata": {
"dummy-key": "dummy-value"
},
"vimConnectionInfo": {
"vim2": {
"accessInfo": {
"password": "dummy_password",
"project": "dummy_project",
"projectDomain": "Default",
"region": "RegionOne",
"userDomain": "Default",
"username": "dummy_user"
},
"extra": {
"dummy-key": "dummy-val"
},
"interfaceInfo": {
"endpoint": "http://127.0.0.1/identity/v3"
},
"vimId": "ac2d2ece-5e49-4b15-b92d-b681e9c096d8",
"vimType": "ETSINFV.OPENSTACK_KEYSTONE.V_3"
}
},
"vnfConfigurableProperties": {
"dummy-key": "dummy-value"
},
"vnfInstanceDescription": "new description",
"vnfInstanceName": "new name",
"vnfcInfoModifications": [
{
"id": "VDU1-07dfd58c-b147-4d4f-8cd6-d55f41280bb9",
"vnfcConfigurableProperties": {
"dummy-key": "dummy-value"
}
},
{
"id": "VDU1-20637c67-9fbe-4c31-b975-6bc4bcd8c35a",
"vnfcConfigurableProperties": {
"dummy-key": "dummy-value"
}
}
],
"vnfdId": "5f846f98-849c-4df0-b57e-fabe9db2beff"
}

View File

@ -220,6 +220,48 @@ Request Example
.. literalinclude:: samples/vnflcm/terminate-vnf-instance-request.json
:language: javascript
Heal a VNF instance (v2)
========================
.. rest_method:: POST /vnflcm/v2/vnf_instances/{vnfInstanceId}/heal
This task resource represents the "Heal VNF" operation. The client can use
this resource to request healing a VNF instance.
The POST method heals a VNF instance.
Response Codes
--------------
.. rest_status_code:: success status.yaml
- 202
.. rest_status_code:: error status.yaml
- 400
- 401
- 404
- 406
- 409
- 422
Request Parameters
------------------
.. rest_parameters:: parameters_vnflcm.yaml
- vnfInstanceId: vnf_instance_id
- cause: cause
- additionalParams: heal_additional_params
- all: all
- vnfcInstanceId: vnfc_resource_info_ids
Request Example
---------------
.. literalinclude:: samples/vnflcm/heal-vnf-instance-request.json
:language: javascript
Delete a VNF instance (v2)
==========================
@ -554,6 +596,191 @@ Response Example
.. literalinclude:: samples/vnflcm/list-vnf-instance-response.json
:language: javascript
Scale a VNF instance (v2)
=========================
.. rest_method:: POST /vnflcm/v2/vnf_instances/{vnfInstanceId}/scale
This task resource represents the "Scale VNF" operation. The client can use
this resource to request scaling a VNF instance.
The POST method scales a VNF instance.
Response Codes
--------------
.. rest_status_code:: success status.yaml
- 202
.. rest_status_code:: error status.yaml
- 400
- 401
- 404
- 406
- 409
- 422
Request Parameters
------------------
.. rest_parameters:: parameters_vnflcm.yaml
- vnfInstanceId: vnf_instance_id
- type: scale_type
- aspectId: aspect_id
- numberOfSteps: number_of_steps
- additionalParams: scale_additional_params
Request Example
---------------
.. literalinclude:: samples/vnflcm/scale-vnf-instance-request.json
:language: javascript
Update a VNF instance (v2)
==========================
.. rest_method:: PATCH vnflcm/v2/vnf_instances/{vnfInstanceId}
Changes to the VNF configurable properties are applied to the configuration
in the VNF instance, and are reflected in the representation of this resource.
Other changes are applied to the VNF instance information managed by the VNFM,
and are reflected in the representation of this resource.
According to the ETSI NFV SOL document, there is no API request/response
specification for Etag yet, and transactions using Etag are not defined
by standardization. Therefore, the Yoga release does not support
`Error Code: 412 Precondition Failed`. Once a standard specification
for this is established, it will be installed on the tacker.
This method modifies an "Individual VNF instance".
Response Codes
--------------
.. rest_status_code:: success status.yaml
- 202
.. rest_status_code:: error status.yaml
- 400
- 401
- 404
- 406
- 409
- 422
Request Parameters
------------------
.. rest_parameters:: parameters_vnflcm.yaml
- vnfInstanceId: vnf_instance_id
- vnfInstanceName: vnf_instance_update_request_name
- vnfInstanceDescription: vnf_instance_update_request_description
- vnfdId: vnf_instance_update_request_vnfd_id
- vnfConfigurableProperties: vnf_instance_update_configurable_properties
- metadata: vnf_instance_update_request_metadata
- extensions: vnf_instance_update_extensions
- vimConnectionInfo: vnf_instance_vim_connection_info
- vimId: vim_connection_info_vim_id
- vimType: vim_connection_info_vim_type
- interfaceInfo: vim_connection_info_interface_info
- accessInfo: vim_connection_info_access_info
- extra: vim_connection_info_extra
- vnfcInfoModifications: vnfc_info_modifications
- id: vnfc_info_modifications_id
- vnfcConfigurableProperties: vnfc_configurable_properties
.. note::
All attribute does not support "null" in JSON Merge Patch.
For attribute whose Type is "key value pairs", the key is deleted by
specifying null. (The attribute itself cannot be deleted.)
Request Example
---------------
.. literalinclude:: samples/vnflcm/update-vnf-instance-request.json
:language: javascript
Change External VNF Connectivity (v2)
=====================================
.. rest_method:: POST /vnflcm/v2/vnf_instances/{vnfInstanceId}/change_ext_conn
This task resource represents the "Change external VNF connectivity" operation.
The client can use this resource to change the external connectivity of a VNF instance.
The POST method changes the external connectivity of a VNF instance.
Response Codes
--------------
.. rest_status_code:: success status.yaml
- 202
.. rest_status_code:: error status.yaml
- 400
- 401
- 404
- 406
- 409
- 422
Request Parameters
------------------
.. rest_parameters:: parameters_vnflcm.yaml
- vnfInstanceId: vnf_instance_id
- extVirtualLinks: change_ext_vnf_connectivity_ext_virtual_links
- id: ext_virtual_links_id
- vimConnectionId: vim_connection_id
- resourceProviderId: resource_provider_id
- resourceId: ext_virtual_links_resource_id
- extCps: ext_cps
- cpdId: cpd_id
- cpConfig: cp_config
- parentCpConfigId: parent_cp_config_id
- linkPortId: link_port_id
- cpProtocolData: cp_protocol_data
- layerProtocol: layer_protocol
- ipOverEthernet: ip_over_ethernet
- macAddress: mac_address
- segmentationId: segmentation_id
- ipAddresses: ip_addresses
- type: ip_address_type
- fixedAddresses: fixed_addresses
- numDynamicAddresses: num_dynamic_addresses
- addressRange: address_range
- minAddress: min_address
- maxAddress: max_address
- subnetId: subnet_id
- extLinkPorts: ext_link_ports
- id: ext_link_port_id
- resourceHandle: ext_link_port_resource_handle
- vimConnectionId: vim_connection_id
- resourceProviderId: resource_provider_id
- resourceId: resource_handle_resource_id
- vimLevelResourceType: resource_handle_vim_level_resource_type
- vimConnectionInfo: vnf_instance_vim_connection_info
- vimId: vim_connection_info_vim_id
- vimType: vim_connection_info_vim_type
- interfaceInfo: vim_connection_info_interface_info
- accessInfo: vim_connection_info_access_info
- extra: vim_connection_info_extra
- additionalParams: change_ext_vnf_connectivity_additional_params
Request Example
---------------
.. literalinclude:: samples/vnflcm/change-ext-conn-request.json
:language: javascript
Show VNF LCM operation occurrence (v2)
======================================
@ -631,6 +858,59 @@ Response Parameters
- vimConnectionId: vim_connection_id
- resourceId: resource_handle_resource_id
- vimLevelResourceType: resource_handle_vim_level_resource_type
- changedInfo: changed_info
- vnfInstanceName: changed_info_vnf_instance_name
- vnfInstanceDescription: changed_info_vnf_instance_description
- vnfConfigurableProperties: changed_info_vnf_configurable_properties
- metadata: changed_info_metadata
- extensions: changed_info_extensions
- vimConnectionInfo: changed_info_vim_connection_info
- vimId: vim_connection_info_vim_id
- vimType: vim_connection_info_vim_type
- interfaceInfo: vim_connection_info_interface_info
- accessInfo: vim_connection_info_access_info
- extra: vim_connection_info_extra
- vnfdId: changed_info_vnfd_id
- vnfProvider: changed_info_vnf_provider
- vnfProductName: changed_info_vnf_product_name
- vnfSoftwareVersion: changed_info_vnf_software_version
- vnfdVersion: changed_info_vnfd_version
- vnfcInfoModifications: vnfc_info_modifications
- id: vnfc_info_modifications_id
- vnfcConfigurableProperties: vnfc_configurable_properties
- changedExtConnectivity: changed_ext_connectivity
- id: changed_ext_connectivity_id
- resourceHandle: resource_handle
- vimConnectionId: vim_connection_id
- resourceProviderId: resource_provider_id
- resourceId: resource_handle_resource_id
- vimLevelResourceType: resource_handle_vim_level_resource_type
- extLinkPorts: ext_link_ports
- id: ext_link_port_id
- resourceHandle: resource_handle
- vimConnectionId: vim_connection_id
- resourceProviderId: resource_provider_id
- resourceId: resource_handle_resource_id
- vimLevelResourceType: resource_handle_vim_level_resource_type
- cpInstanceId: cp_instance_id
- currentVnfExtCpData: current_vnf_ext_cp_data
- cpdId: cpd_id
- cpConfig: cp_config
- parentCpConfigId: parent_cp_config_id
- linkPortId: link_port_id
- cpProtocolData: cp_protocol_data
- layerProtocol: layer_protocol
- ipOverEthernet: ip_over_ethernet
- macAddress: mac_address
- segmentationId: segmentation_id
- ipAddresses: ip_addresses
- type: ip_address_type
- fixedAddresses: fixed_addresses
- numDynamicAddresses: num_dynamic_addresses
- addressRange: address_range
- minAddress: min_address
- maxAddress: max_address
- subnetId: subnet_id
- _links: vnf_instance_links
Response Example
@ -727,6 +1007,59 @@ Response Parameters
- vimConnectionId: vim_connection_id
- resourceId: resource_handle_resource_id
- vimLevelResourceType: resource_handle_vim_level_resource_type
- changedInfo: changed_info
- vnfInstanceName: changed_info_vnf_instance_name
- vnfInstanceDescription: changed_info_vnf_instance_description
- vnfConfigurableProperties: changed_info_vnf_configurable_properties
- metadata: changed_info_metadata
- extensions: changed_info_extensions
- vimConnectionInfo: changed_info_vim_connection_info
- vimId: vim_connection_info_vim_id
- vimType: vim_connection_info_vim_type
- interfaceInfo: vim_connection_info_interface_info
- accessInfo: vim_connection_info_access_info
- extra: vim_connection_info_extra
- vnfdId: changed_info_vnfd_id
- vnfProvider: changed_info_vnf_provider
- vnfProductName: changed_info_vnf_product_name
- vnfSoftwareVersion: changed_info_vnf_software_version
- vnfdVersion: changed_info_vnfd_version
- vnfcInfoModifications: vnfc_info_modifications
- id: vnfc_info_modifications_id
- vnfcConfigurableProperties: vnfc_configurable_properties
- changedExtConnectivity: changed_ext_connectivity
- id: changed_ext_connectivity_id
- resourceHandle: resource_handle
- vimConnectionId: vim_connection_id
- resourceProviderId: resource_provider_id
- resourceId: resource_handle_resource_id
- vimLevelResourceType: resource_handle_vim_level_resource_type
- extLinkPorts: ext_link_ports
- id: ext_link_port_id
- resourceHandle: resource_handle
- vimConnectionId: vim_connection_id
- resourceProviderId: resource_provider_id
- resourceId: resource_handle_resource_id
- vimLevelResourceType: resource_handle_vim_level_resource_type
- cpInstanceId: cp_instance_id
- currentVnfExtCpData: current_vnf_ext_cp_data
- cpdId: cpd_id
- cpConfig: cp_config
- parentCpConfigId: parent_cp_config_id
- linkPortId: link_port_id
- cpProtocolData: cp_protocol_data
- layerProtocol: layer_protocol
- ipOverEthernet: ip_over_ethernet
- macAddress: mac_address
- segmentationId: segmentation_id
- ipAddresses: ip_addresses
- type: ip_address_type
- fixedAddresses: fixed_addresses
- numDynamicAddresses: num_dynamic_addresses
- addressRange: address_range
- minAddress: min_address
- maxAddress: max_address
- subnetId: subnet_id
- _links: vnf_instance_links
Response Example
@ -786,6 +1119,7 @@ Response Codes
- 404
- 406
- 409
- 422
Request Parameters
------------------
@ -841,6 +1175,59 @@ Response Parameters
- vimConnectionId: vim_connection_id
- resourceId: resource_handle_resource_id
- vimLevelResourceType: resource_handle_vim_level_resource_type
- changedInfo: changed_info
- vnfInstanceName: changed_info_vnf_instance_name
- vnfInstanceDescription: changed_info_vnf_instance_description
- vnfConfigurableProperties: changed_info_vnf_configurable_properties
- metadata: changed_info_metadata
- extensions: changed_info_extensions
- vimConnectionInfo: changed_info_vim_connection_info
- vimId: vim_connection_info_vim_id
- vimType: vim_connection_info_vim_type
- interfaceInfo: vim_connection_info_interface_info
- accessInfo: vim_connection_info_access_info
- extra: vim_connection_info_extra
- vnfdId: changed_info_vnfd_id
- vnfProvider: changed_info_vnf_provider
- vnfProductName: changed_info_vnf_product_name
- vnfSoftwareVersion: changed_info_vnf_software_version
- vnfdVersion: changed_info_vnfd_version
- vnfcInfoModifications: vnfc_info_modifications
- id: vnfc_info_modifications_id
- vnfcConfigurableProperties: vnfc_configurable_properties
- changedExtConnectivity: changed_ext_connectivity
- id: changed_ext_connectivity_id
- resourceHandle: resource_handle
- vimConnectionId: vim_connection_id
- resourceProviderId: resource_provider_id
- resourceId: resource_handle_resource_id
- vimLevelResourceType: resource_handle_vim_level_resource_type
- extLinkPorts: ext_link_ports
- id: ext_link_port_id
- resourceHandle: resource_handle
- vimConnectionId: vim_connection_id
- resourceProviderId: resource_provider_id
- resourceId: resource_handle_resource_id
- vimLevelResourceType: resource_handle_vim_level_resource_type
- cpInstanceId: cp_instance_id
- currentVnfExtCpData: current_vnf_ext_cp_data
- cpdId: cpd_id
- cpConfig: cp_config
- parentCpConfigId: parent_cp_config_id
- linkPortId: link_port_id
- cpProtocolData: cp_protocol_data
- layerProtocol: layer_protocol
- ipOverEthernet: ip_over_ethernet
- macAddress: mac_address
- segmentationId: segmentation_id
- ipAddresses: ip_addresses
- type: ip_address_type
- fixedAddresses: fixed_addresses
- numDynamicAddresses: num_dynamic_addresses
- addressRange: address_range
- minAddress: min_address
- maxAddress: max_address
- subnetId: subnet_id
- _links: vnf_instance_links
Response Example

View File

@ -183,7 +183,8 @@ Result:
| | '3091f046-de63-44c8-ad23-f86128409b27', 'cpdId': 'CP1', 'vnfExtCpId': None, 'vnfLinkPortId': '3b667826-336c-4919-889e-e6c63d959ee6'}]}]' |
| Instantiation State | INSTANTIATED |
| Links | heal=href=/vnflcm/v1/vnf_instances/725f625e-f6b7-4bcd-b1b7-7184039fde45/heal, self=href=/vnflcm/v1/vnf_instances/725f625e-f6b7-4bcd-b1b7-7184039fde45, |
| | terminate=href=/vnflcm/v1/vnf_instances/725f625e-f6b7-4bcd-b1b7-7184039fde45/terminate |
| | terminate=href=/vnflcm/v1/vnf_instances/725f625e-f6b7-4bcd-b1b7-7184039fde45/terminate, |
| | changeExtConn=href=/vnflcm/v1/vnf_instances/725f625e-f6b7-4bcd-b1b7-7184039fde45/change_ext_conn |
| VIM Connection Info | [] |
| VNF Instance Description | None |
| VNF Instance Name | None |
@ -331,7 +332,43 @@ Help:
List of VNFC instances requiring a healing action.
8. Scale VNF
8. Update VNF
^^^^^^^^^^^^^
.. code-block:: console
$ openstack vnflcm update VNF_INSTANCE_ID --I sample_param_file.json
Result:
.. code-block:: console
Update vnf:725f625e-f6b7-4bcd-b1b7-7184039fde45
Help:
.. code-block:: console
$ openstack vnflcm update --help
usage: openstack vnflcm update [-h] [--I <param-file>] <vnf-instance>
Update VNF Instance
positional arguments:
<vnf-instance>
VNF instance ID to update.
optional arguments:
-h, --help show this help message and exit
--I <param-file>
Specify update request parameters in a json file.
This command is provided by the python-tackerclient plugin.
9. Scale VNF
^^^^^^^^^^^^
The `worker_instance` is the ID for the target scaling group.
@ -378,8 +415,8 @@ Help:
Identifier of the scaling aspect.
9. Change External VNF Connectivity
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
10. Change External VNF Connectivity
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. code-block:: console
@ -411,7 +448,7 @@ Help:
-h, --help show this help message and exit
10. Rollback VNF Lifecycle Management Operation
11. Rollback VNF Lifecycle Management Operation
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The `VNF_LCM_OP_OCC_ID` is the ID for the target lifecycle temporary failed.
@ -442,7 +479,7 @@ Help:
-h, --help show this help message and exit
11. Retry
12. Retry
^^^^^^^^^
The `VNF_LCM_OP_OCC_ID` is the ID for the target lifecycle temporary failed.
@ -475,7 +512,7 @@ Help:
-h, --help show this help message and exit
12. Fail
13. Fail
^^^^^^^^
The `VNF_LCM_OP_OCC_ID` is the ID for the target lifecycle temporary failed.
@ -603,7 +640,7 @@ Help:
-h, --help show this help message and exit
13. List LCM Operation Occurrences
14. List LCM Operation Occurrences
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. code-block:: console
@ -650,7 +687,7 @@ Help:
tacker server will throw bad request error
14. Show LCM Operation Occurrence
15. Show LCM Operation Occurrence
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. code-block:: console
@ -714,7 +751,7 @@ Help:
-h, --help show this help message and exit
15. Show VNF LCM API versions
16. Show VNF LCM API versions
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. code-block:: console

View File

@ -64,6 +64,17 @@ Container
etsi_cnf_healing
Update
^^^^^^
VM
~~
.. toctree::
:maxdepth: 1
etsi_vnf_update
Change External VNF Connectivity
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

View File

@ -281,6 +281,14 @@ Rollback VNF LCM Operation
-
- X
.. note::
| In some cases, Rollback of Change external connectivity cannot recover
the IP address and Port Id of virtual resources.
| If the operation fails before performing VIM processing: updating stack,
the IP address and Port Id will be recovered by its rollback operation.
| Otherwise, dynamic IP address and Port Id are not recovered
by rollback operation.
This manual describes the following operations as use cases for
rollback operations.

View File

@ -64,185 +64,188 @@ Result:
.. code-block:: console
+--------------------------+-------------------------------------------------------------------------------------------+
| Field | Value |
+--------------------------+-------------------------------------------------------------------------------------------+
| ID | 9e086f34-b3c9-4986-b5e5-609a5ac4c1f9 |
| Instantiated Vnf Info | { |
| | "flavourId": "simple", |
| | "vnfState": "STARTED", |
| | "extCpInfo": [ |
| | { |
| | "id": "241e6022-c9be-4ad6-b7a7-ecb32de20475", |
| | "cpdId": "CP1", |
| | "extLinkPortId": null, |
| | "associatedVnfcCpId": "b07ba349-1366-4d14-91e9-07842cdfa7ab", |
| | "cpProtocolInfo": [ |
| | { |
| | "layerProtocol": "IP_OVER_ETHERNET" |
| | } |
| | ] |
| | } |
| | ], |
| | "extVirtualLinkInfo": [ |
| | { |
| | "id": "net0", |
| | "resourceHandle": { |
| | "vimConnectionId": null, |
| | "resourceId": "1948231e-bbf0-4ff9-a692-40f8d6d5c90d", |
| | "vimLevelResourceType": null |
| | } |
| | } |
| | ], |
| | "vnfcResourceInfo": [ |
| | { |
| | "id": "b07ba349-1366-4d14-91e9-07842cdfa7ab", |
| | "vduId": "VDU1", |
| | "computeResource": { |
| | "vimConnectionId": "13bef9df-7c54-4b37-9da0-1256953e7f60", |
| | "resourceId": "794b9460-d799-4398-98a4-413fb04d2051", |
| | "vimLevelResourceType": "OS::Nova::Server" |
| | }, |
| | "storageResourceIds": [], |
| | "vnfcCpInfo": [ |
| | { |
| | "id": "f7297196-a024-4a90-9393-aadeb7de1fb3", |
| | "cpdId": "CP1", |
| | "vnfExtCpId": null, |
| | "vnfLinkPortId": "cf733c70-8dc2-46b8-8d76-2ebd0bb5bd07", |
| | "cpProtocolInfo": [ |
| | { |
| | "layerProtocol": "IP_OVER_ETHERNET" |
| | } |
| | ] |
| | }, |
| | { |
| | "id": "f3851831-ed25-4e73-b913-6725085c7484", |
| | "cpdId": "CP2", |
| | "vnfExtCpId": null, |
| | "vnfLinkPortId": "8cc28f47-ee72-420e-b4e8-26913d60bf55" |
| | } |
| | ] |
| | }, |
| | { |
| | "id": "aae43bc1-a54e-46e8-9371-59c1ef5fc84d", |
| | "vduId": "VDU2", |
| | "computeResource": { |
| | "vimConnectionId": "13bef9df-7c54-4b37-9da0-1256953e7f60", |
| | "resourceId": "20e10aed-16e9-4f7c-ad0c-1e885cc1200e", |
| | "vimLevelResourceType": "OS::Nova::Server" |
| | }, |
| | "storageResourceIds": [ |
| | "21703823-33b3-4f06-a52c-28b455146a4a" |
| | ], |
| | "vnfcCpInfo": [ |
| | { |
| | "id": "d0088ed3-1639-4f3b-a369-3baae7e86540", |
| | "cpdId": "CP3", |
| | "vnfExtCpId": null, |
| | "vnfLinkPortId": "d5fe9f7b-f50d-49dc-a3c8-ded2843005e4" |
| | } |
| | ] |
| | } |
| | ], |
| | "vnfVirtualLinkResourceInfo": [ |
| | { |
| | "id": "45588051-a413-41a0-a55c-b31fb50fb351", |
| | "vnfVirtualLinkDescId": "internalVL2", |
| | "networkResource": { |
| | "vimConnectionId": "13bef9df-7c54-4b37-9da0-1256953e7f60", |
| | "resourceId": "f45802ae-7fff-4c6e-b62f-3d55baec4c6b", |
| | "vimLevelResourceType": "OS::Neutron::Net" |
| | }, |
| | "vnfLinkPorts": [ |
| | { |
| | "id": "8cc28f47-ee72-420e-b4e8-26913d60bf55", |
| | "resourceHandle": { |
| | "vimConnectionId": "13bef9df-7c54-4b37-9da0-1256953e7f60", |
| | "resourceId": "e020ad8f-3f85-4d13-98c1-3ea476bf2d1a", |
| | "vimLevelResourceType": "OS::Neutron::Port" |
| | }, |
| | "cpInstanceId": "f3851831-ed25-4e73-b913-6725085c7484" |
| | }, |
| | { |
| | "id": "d5fe9f7b-f50d-49dc-a3c8-ded2843005e4", |
| | "resourceHandle": { |
| | "vimConnectionId": "13bef9df-7c54-4b37-9da0-1256953e7f60", |
| | "resourceId": "8f1588e5-4410-40eb-84ee-28336a6a0212", |
| | "vimLevelResourceType": "OS::Neutron::Port" |
| | }, |
| | "cpInstanceId": "d0088ed3-1639-4f3b-a369-3baae7e86540" |
| | } |
| | ] |
| | }, |
| | { |
| | "id": "66f3fa97-4046-4fa4-b1ff-19295501021f", |
| | "vnfVirtualLinkDescId": "net0", |
| | "networkResource": { |
| | "vimConnectionId": null, |
| | "resourceId": "1948231e-bbf0-4ff9-a692-40f8d6d5c90d", |
| | "vimLevelResourceType": "OS::Neutron::Net" |
| | }, |
| | "vnfLinkPorts": [ |
| | { |
| | "id": "cf733c70-8dc2-46b8-8d76-2ebd0bb5bd07", |
| | "resourceHandle": { |
| | "vimConnectionId": "13bef9df-7c54-4b37-9da0-1256953e7f60", |
| | "resourceId": "1db39a17-bbae-4074-8623-8a8026b51647", |
| | "vimLevelResourceType": "OS::Neutron::Port" |
| | }, |
| | "cpInstanceId": "f7297196-a024-4a90-9393-aadeb7de1fb3" |
| | } |
| | ] |
| | } |
| | ], |
| | "virtualStorageResourceInfo": [ |
| | { |
| | "id": "21703823-33b3-4f06-a52c-28b455146a4a", |
| | "virtualStorageDescId": "VirtualStorage", |
| | "storageResource": { |
| | "vimConnectionId": "13bef9df-7c54-4b37-9da0-1256953e7f60", |
| | "resourceId": "c6231ea2-6a90-4ba4-b38b-778a5d7110ee", |
| | "vimLevelResourceType": "OS::Cinder::Volume" |
| | } |
| | } |
| | ], |
| | "vnfcInfo": [ |
| | { |
| | "id": "4c999b33-3004-4b44-a826-49d07f5becb9", |
| | "vduId": "VDU1", |
| | "vnfcState": "STARTED" |
| | }, |
| | { |
| | "id": "d8f83af0-1b4d-4f57-b53c-fd028849be8f", |
| | "vduId": "VDU2", |
| | "vnfcState": "STARTED" |
| | } |
| | ], |
| | "additionalParams": {} |
| | } |
| Instantiation State | INSTANTIATED |
| Links | { |
| | "self": { |
| | "href": "/vnflcm/v1/vnf_instances/9e086f34-b3c9-4986-b5e5-609a5ac4c1f9" |
| | }, |
| | "terminate": { |
| | "href": "/vnflcm/v1/vnf_instances/9e086f34-b3c9-4986-b5e5-609a5ac4c1f9/terminate" |
| | }, |
| | "heal": { |
| | "href": "/vnflcm/v1/vnf_instances/9e086f34-b3c9-4986-b5e5-609a5ac4c1f9/heal" |
| | } |
| | } |
| VIM Connection Info | [] |
| VNF Instance Description | None |
| VNF Instance Name | vnf-9e086f34-b3c9-4986-b5e5-609a5ac4c1f9 |
| VNF Product Name | Sample VNF |
| VNF Provider | Company |
| VNF Software Version | 1.0 |
| VNFD ID | b1bb0ce7-ebca-4fa7-95ed-4840d70a1177 |
| VNFD Version | 1.0 |
| vnfPkgId | |
+--------------------------+-------------------------------------------------------------------------------------------+
+--------------------------+-------------------------------------------------------------------------------------------------+
| Field | Value |
+--------------------------+-------------------------------------------------------------------------------------------------+
| ID | 9e086f34-b3c9-4986-b5e5-609a5ac4c1f9 |
| Instantiated Vnf Info | { |
| | "flavourId": "simple", |
| | "vnfState": "STARTED", |
| | "extCpInfo": [ |
| | { |
| | "id": "241e6022-c9be-4ad6-b7a7-ecb32de20475", |
| | "cpdId": "CP1", |
| | "extLinkPortId": null, |
| | "associatedVnfcCpId": "b07ba349-1366-4d14-91e9-07842cdfa7ab", |
| | "cpProtocolInfo": [ |
| | { |
| | "layerProtocol": "IP_OVER_ETHERNET" |
| | } |
| | ] |
| | } |
| | ], |
| | "extVirtualLinkInfo": [ |
| | { |
| | "id": "net0", |
| | "resourceHandle": { |
| | "vimConnectionId": null, |
| | "resourceId": "1948231e-bbf0-4ff9-a692-40f8d6d5c90d", |
| | "vimLevelResourceType": null |
| | } |
| | } |
| | ], |
| | "vnfcResourceInfo": [ |
| | { |
| | "id": "b07ba349-1366-4d14-91e9-07842cdfa7ab", |
| | "vduId": "VDU1", |
| | "computeResource": { |
| | "vimConnectionId": "13bef9df-7c54-4b37-9da0-1256953e7f60", |
| | "resourceId": "794b9460-d799-4398-98a4-413fb04d2051", |
| | "vimLevelResourceType": "OS::Nova::Server" |
| | }, |
| | "storageResourceIds": [], |
| | "vnfcCpInfo": [ |
| | { |
| | "id": "f7297196-a024-4a90-9393-aadeb7de1fb3", |
| | "cpdId": "CP1", |
| | "vnfExtCpId": null, |
| | "vnfLinkPortId": "cf733c70-8dc2-46b8-8d76-2ebd0bb5bd07", |
| | "cpProtocolInfo": [ |
| | { |
| | "layerProtocol": "IP_OVER_ETHERNET" |
| | } |
| | ] |
| | }, |
| | { |
| | "id": "f3851831-ed25-4e73-b913-6725085c7484", |
| | "cpdId": "CP2", |
| | "vnfExtCpId": null, |
| | "vnfLinkPortId": "8cc28f47-ee72-420e-b4e8-26913d60bf55" |
| | } |
| | ] |
| | }, |
| | { |
| | "id": "aae43bc1-a54e-46e8-9371-59c1ef5fc84d", |
| | "vduId": "VDU2", |
| | "computeResource": { |
| | "vimConnectionId": "13bef9df-7c54-4b37-9da0-1256953e7f60", |
| | "resourceId": "20e10aed-16e9-4f7c-ad0c-1e885cc1200e", |
| | "vimLevelResourceType": "OS::Nova::Server" |
| | }, |
| | "storageResourceIds": [ |
| | "21703823-33b3-4f06-a52c-28b455146a4a" |
| | ], |
| | "vnfcCpInfo": [ |
| | { |
| | "id": "d0088ed3-1639-4f3b-a369-3baae7e86540", |
| | "cpdId": "CP3", |
| | "vnfExtCpId": null, |
| | "vnfLinkPortId": "d5fe9f7b-f50d-49dc-a3c8-ded2843005e4" |
| | } |
| | ] |
| | } |
| | ], |
| | "vnfVirtualLinkResourceInfo": [ |
| | { |
| | "id": "45588051-a413-41a0-a55c-b31fb50fb351", |
| | "vnfVirtualLinkDescId": "internalVL2", |
| | "networkResource": { |
| | "vimConnectionId": "13bef9df-7c54-4b37-9da0-1256953e7f60", |
| | "resourceId": "f45802ae-7fff-4c6e-b62f-3d55baec4c6b", |
| | "vimLevelResourceType": "OS::Neutron::Net" |
| | }, |
| | "vnfLinkPorts": [ |
| | { |
| | "id": "8cc28f47-ee72-420e-b4e8-26913d60bf55", |
| | "resourceHandle": { |
| | "vimConnectionId": "13bef9df-7c54-4b37-9da0-1256953e7f60", |
| | "resourceId": "e020ad8f-3f85-4d13-98c1-3ea476bf2d1a", |
| | "vimLevelResourceType": "OS::Neutron::Port" |
| | }, |
| | "cpInstanceId": "f3851831-ed25-4e73-b913-6725085c7484" |
| | }, |
| | { |
| | "id": "d5fe9f7b-f50d-49dc-a3c8-ded2843005e4", |
| | "resourceHandle": { |
| | "vimConnectionId": "13bef9df-7c54-4b37-9da0-1256953e7f60", |
| | "resourceId": "8f1588e5-4410-40eb-84ee-28336a6a0212", |
| | "vimLevelResourceType": "OS::Neutron::Port" |
| | }, |
| | "cpInstanceId": "d0088ed3-1639-4f3b-a369-3baae7e86540" |
| | } |
| | ] |
| | }, |
| | { |
| | "id": "66f3fa97-4046-4fa4-b1ff-19295501021f", |
| | "vnfVirtualLinkDescId": "net0", |
| | "networkResource": { |
| | "vimConnectionId": null, |
| | "resourceId": "1948231e-bbf0-4ff9-a692-40f8d6d5c90d", |
| | "vimLevelResourceType": "OS::Neutron::Net" |
| | }, |
| | "vnfLinkPorts": [ |
| | { |
| | "id": "cf733c70-8dc2-46b8-8d76-2ebd0bb5bd07", |
| | "resourceHandle": { |
| | "vimConnectionId": "13bef9df-7c54-4b37-9da0-1256953e7f60", |
| | "resourceId": "1db39a17-bbae-4074-8623-8a8026b51647", |
| | "vimLevelResourceType": "OS::Neutron::Port" |
| | }, |
| | "cpInstanceId": "f7297196-a024-4a90-9393-aadeb7de1fb3" |
| | } |
| | ] |
| | } |
| | ], |
| | "virtualStorageResourceInfo": [ |
| | { |
| | "id": "21703823-33b3-4f06-a52c-28b455146a4a", |
| | "virtualStorageDescId": "VirtualStorage", |
| | "storageResource": { |
| | "vimConnectionId": "13bef9df-7c54-4b37-9da0-1256953e7f60", |
| | "resourceId": "c6231ea2-6a90-4ba4-b38b-778a5d7110ee", |
| | "vimLevelResourceType": "OS::Cinder::Volume" |
| | } |
| | } |
| | ], |
| | "vnfcInfo": [ |
| | { |
| | "id": "4c999b33-3004-4b44-a826-49d07f5becb9", |
| | "vduId": "VDU1", |
| | "vnfcState": "STARTED" |
| | }, |
| | { |
| | "id": "d8f83af0-1b4d-4f57-b53c-fd028849be8f", |
| | "vduId": "VDU2", |
| | "vnfcState": "STARTED" |
| | } |
| | ], |
| | "additionalParams": {} |
| | } |
| Instantiation State | INSTANTIATED |
| Links | { |
| | "self": { |
| | "href": "/vnflcm/v1/vnf_instances/9e086f34-b3c9-4986-b5e5-609a5ac4c1f9" |
| | }, |
| | "terminate": { |
| | "href": "/vnflcm/v1/vnf_instances/9e086f34-b3c9-4986-b5e5-609a5ac4c1f9/terminate" |
| | }, |
| | "heal": { |
| | "href": "/vnflcm/v1/vnf_instances/9e086f34-b3c9-4986-b5e5-609a5ac4c1f9/heal" |
| | }, |
| | "changeExtConn": { |
| | "href": "/vnflcm/v1/vnf_instances/9e086f34-b3c9-4986-b5e5-609a5ac4c1f9/change_ext_conn" |
| | } |
| | } |
| VIM Connection Info | [] |
| VNF Instance Description | None |
| VNF Instance Name | vnf-9e086f34-b3c9-4986-b5e5-609a5ac4c1f9 |
| VNF Product Name | Sample VNF |
| VNF Provider | Company |
| VNF Software Version | 1.0 |
| VNFD ID | b1bb0ce7-ebca-4fa7-95ed-4840d70a1177 |
| VNFD Version | 1.0 |
| vnfPkgId | |
+--------------------------+-------------------------------------------------------------------------------------------------+
.. note::
The value set for 'VNF Instance Name' corresponds to 'Stack Name'
@ -270,6 +273,43 @@ There are two main methods for VNF healing.
For more information on VNFC, see `NFV-SOL002 v2.6.1`_.
The client can specify the target resources for healing
with two parameters in the API request.
- *vnfcInstanceId* is a list which indicates VNFC instances
for which a healing action is requested.
- *all* indicates whether network resources and storage resources
are included in the heal target. This is set in the attribute
of *additionalParams*.
With the combination of these parameters,
Tacker supports the following patterns of healing.
- Pattern A. *vnfcInstanceId* is included in the request.
- Pattern A-1. *all = False* is included in the request or *all* is not
included in the request.
- Only specified VNFC instances are healed.
- Pattern A-2. *all = True* are included in the request.
- Specified VNFC instances and storage resources are healed.
- Pattern B. *vnfcInstanceId* is not included in the request.
- Pattern B-1. *all = False* is included in the request or *all* is not
included in the request.
- All VNFC instances included in the VNF instance are healed.
- Pattern B-2. *all = True* are included in the request.
- All resources included in the VNF instance are healed.
It includes VNFC instances, network resources, and storage resources
but not external virtual networks.
.. note::
*all* option is not supported by the version 1 API.
How to Heal of the Entire VNF
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@ -29,6 +29,11 @@ The diagram below shows an overview of the VNF scaling.
.. figure:: ../_images/etsi_vnf_scaling.png
:align: left
.. note:: Scale API version 1 supports is_reverse option.
Scale-in operation with this option deletes VNF from the last
registered VM. Scale API version 2 does not support this option
because it deletes VM in this order by default.
Prerequisites
-------------

View File

@ -0,0 +1,129 @@
=======================
ETSI NFV-SOL VNF Update
=======================
This document describes how to update VNF in Tacker.
Prerequisites
-------------
The following packages should be installed:
* tacker
* python-tackerclient
A default VIM should be registered according to
:doc:`../cli/cli-legacy-vim`.
The VNF Package(sample_vnf_pkg.zip) used below is prepared
by referring to :doc:`./vnf-package`.
Execute before "Instantiate VNF" in the procedure of
:doc:`./etsi_vnf_deployment_as_vm_with_tosca`.
VNF Update Procedures
---------------------
As mentioned in Prerequisites, the VNF must be created
before performing update.
Details of CLI commands are described in
:doc:`../cli/cli-etsi-vnflcm`.
For update VNF instance, you need to prepare a JSON-formatted definition file.
.. code-block:: json
{
"vnfInstanceName": "sample"
}
.. note:: sample_param_file.json contains the VNF name as an example.
How to Update VNF
~~~~~~~~~~~~~~~~~
Execute Update CLI command and check the name of VNF instance before
and after update. This is to confirm that the name of VNF instance has
changed after update.
See `Heat CLI reference`_. for details on Heat CLI commands.
VNF instance name before update:
.. code-block:: console
$ openstack vnflcm show VNF_INSTANCE_ID -c 'VNF Instance Name'
Result:
.. code-block:: console
+-------------------+-------+
| Field | Value |
+-------------------+-------+
| VNF Instance Name | None |
+-------------------+-------+
Update VNF can be executed by the following CLI command.
.. code-block:: console
$ openstack vnflcm update VNF_INSTANCE_ID --I sample_param_file.json
Result:
.. code-block:: console
Update vnf:c64ea0fd-a90c-4754-95f4-dc0751db519d
.. note::
Create a parameter file that describes the resource information to be
changed in advance.
.. note::
If the *vnfdId* is not changed by update operation, the current value
shall be updated using the request parameter.
If the *vnfdId* is requested to be changed by update operation, the
current values of *metadata*, *extension*, and *vnfConfigurableProperties*
are cleared and the changed request parameters are applied.
Current Tacker only refers *metadata*, *extension* and
*vnfConfigurableProperties* specified in the API request. It means that
Tacker does not refer the value of these parameters specified in VNFD.
.. note::
The update operation can change the vimConnectionInfo associated with an
existing VNF instance.
Even if instantiate operation and update operation specify multiple
vimConnectionInfo associated with one VNF instance, only one of them will
be used for life cycle management operations.
It is not possible to delete the key of registered vimConnectionInfo.
VNF instance name after operation:
.. code-block:: console
$ openstack vnflcm show VNF_INSTANCE_ID -c 'VNF Instance Name'
Result:
.. code-block:: console
+-------------------+---------+
| Field | Value |
+-------------------+---------+
| VNF Instance Name | sample |
+-------------------+---------+
You can confirm that the VNF Instance Name has been changed
by the update operation.
.. _Heat CLI reference : https://docs.openstack.org/python-openstackclient/latest/cli/plugin-commands/heat.html

View File

@ -31,10 +31,7 @@ Any file name and class name are acceptable.
userdata class must inherit "userdata_utils.AbstractUserData",
then functions have to be implemented.
Since latest Tacker supports userdata script for only instantiating vnf,
**def instantiate(req, inst, grant_req, grant, tmp_csar_dir)**
only can be implemented.
Followings are the requirement of **def instantiate()**
Followings are requirements for methods supported by latest Tacker.
Input of instantiate()
----------------------
@ -79,6 +76,181 @@ Following shows sample output.
return fields
Input of scale()
----------------
The function can use the following input data.
The details of data types are defined in ETSI NFV SOL documents.
- req: InstantiateVnfRequest
- inst: VnfInstance
- grant_req: GrantRequest
- grant: Grants
- tmp_csar_dir: the temporary path of csar expanded by Tacker.
Output of scale()
-----------------
The function must return the following structure.
Data are for update stack API in HEAT.
The requirements of HEAT API are described in
`reference of Orchestration Service API v1
"PATCH /v1/{tenant_id}/stacks/{stack_name}/{stack_id}"`_
fields = {'parameters': {'nfv': {'VDU': new_vdus}}}
- parameters: Input parameters for Heat API.
Following shows sample output.
.. code-block:: python
fields = {'parameters': {'nfv': {'VDU': new_vdus}}}
return fields
Input of scale_rollback()
-------------------------
The function can use the following input data.
The details of data types are defined in ETSI NFV SOL documents.
- req: InstantiateVnfRequest
- inst: VnfInstance
- grant_req: GrantRequest
- grant: Grants
- tmp_csar_dir: the temporary path of csar expanded by Tacker.
Output of scale_rollback()
--------------------------
The function must return the following structure.
Data are for update stack API in HEAT.
The requirements of HEAT API are described in
`reference of Orchestration Service API v1
"PATCH /v1/{tenant_id}/stacks/{stack_name}/{stack_id}"`_
fields = {'parameters': {'nfv': {'VDU': new_vdus}}}
- parameters: Input parameters for Heat API.
Following shows sample output.
.. code-block:: python
fields = {'parameters': {'nfv': {'VDU': new_vdus}}}
return fields
Input of change_ext_conn_rollback()
-----------------------------------
The function can use the following input data.
The details of data types are defined in ETSI NFV SOL documents.
- req: InstantiateVnfRequest
- inst: VnfInstance
- grant_req: GrantRequest
- grant: Grants
- tmp_csar_dir: the temporary path of csar expanded by Tacker.
Output of change_ext_conn_rollback()
------------------------------------
The function must return the following structure.
Data are for update stack API in HEAT.
The requirements of HEAT API are described in
`reference of Orchestration Service API v1
"PATCH /v1/{tenant_id}/stacks/{stack_name}/{stack_id}"`_
fields = {'parameters': {'nfv': {'CP': new_cps}}}
- parameters: Input parameters for Heat API.
Following shows sample output.
.. code-block:: python
fields = {'parameters': {'nfv': {'CP': new_cps}}}
return fields
Input of change_ext_conn()
--------------------------
The function can use the following input data.
The details of data types are defined in ETSI NFV SOL documents.
- req: InstantiateVnfRequest
- inst: VnfInstance
- grant_req: GrantRequest
- grant: Grants
- tmp_csar_dir: the temporary path of csar expanded by Tacker.
Output of change_ext_conn()
---------------------------
The function must return the following structure.
Data are for update stack API in HEAT.
The requirements of HEAT API are described in
`reference of Orchestration Service API v1
"PATCH /v1/{tenant_id}/stacks/{stack_name}/{stack_id}"`_
fields = {'parameters': {'nfv': {'CP': new_cps}}}
- parameters: Input parameters for Heat API.
Following shows sample output.
.. code-block:: python
fields = {'parameters': {'nfv': {'CP': new_cps}}}
return fields
Input of heal()
---------------
The function can use the following input data.
The details of data types are defined in ETSI NFV SOL documents.
- req: InstantiateVnfRequest
- inst: VnfInstance
- grant_req: GrantRequest
- grant: Grants
- tmp_csar_dir: the temporary path of csar expanded by Tacker.
Output of heal()
----------------
The function must return the following structure.
Data are for update stack API in HEAT.
The requirements of HEAT API are described in
`reference of Orchestration Service API v1
"PATCH /v1/{tenant_id}/stacks/{stack_name}/{stack_id}"`_
fields = {'parameters': {'nfv': {}}}
- parameters: Input parameters for Heat API.
Following shows sample output.
.. code-block:: python
fields = {'parameters': {'nfv': {}}}
return fields
Sample userdata script
======================
@ -179,6 +351,30 @@ Get zone id of VDU.
It returns **zone id**.
def get_current_capacity(vdu_name, inst)
----------------------------------------
Get desired capacity.
**vdu_name**: the name of VDU
, **inst**: VnfInstance
It returns **desired capacity**.
def get_param_capacity(vdu_name, inst, grant_req)
-------------------------------------------------
Refer to addResources and removeResources in the grant request
and get desired capacity.
**vdu_name**: the name of VDU
, **inst**: VnfInstance
, **grant_req**: GrantRequest
It returns **desired capacity**.
def _get_fixed_ips_from_extcp(extcp)
------------------------------------
@ -213,6 +409,28 @@ Get fixed IP addresses of CP.
It returns fixed IP address of CP.
def get_param_network_from_inst(cp_name, inst)
----------------------------------------------
Get network resourceId from VnfInstance.
**cp_name**: the name of CP
, **inst**: VnfInstance
It returns network resourceId from VnfInstance.
def get_param_fixed_ips_from_inst(cp_name, inst)
------------------------------------------------
Get fixed IP address of CP from VnfInstance.
**cp_name**: the name of CP
, **inst**: VnfInstance
It returns fixed IP address of CP from VnfInstance.
def apply_ext_managed_vls(hot_dict, req, grant)
-----------------------------------------------
@ -305,5 +523,6 @@ It returns the result of json_merge_patch (IETF RFC 7396).
.. _ETSI NFV-SOL VNF Deployment as VM with LCM Operation User Data: https://docs.openstack.org/tacker/latest/user/etsi_vnf_deployment_as_vm_with_user_data.html
.. _VNF Package manual: https://docs.openstack.org/tacker/latest/user/vnf-package.html
.. _reference of Orchestration Service API v1 "POST /v1/{tenant_id}/stacks": https://docs.openstack.org/api-ref/orchestration/v1/?expanded=create-stack-detail#create-stack
.. _reference of Orchestration Service API v1 "PATCH /v1/{tenant_id}/stacks/{stack_name}/{stack_id}": https://docs.openstack.org/api-ref/orchestration/v1/?expanded=update-stack-patch-detail#update-stack-patch
.. _**Vnfd** class: ../../../tacker/sol_refactored/common/vnfd_utils.py
.. _ETSI NFV SOL003: https://www.etsi.org/deliver/etsi_gs/NFV-SOL/001_099/003/03.03.01_60/gs_NFV-SOL003v030301p.pdf