From 6a77b38012c2a1fe228e29485e30cd18e977695c Mon Sep 17 00:00:00 2001 From: Giacomo Bernini Date: Mon, 5 Aug 2024 16:29:22 +0000 Subject: [PATCH 01/21] Add new directory for interconnected tests --- interconnectedTestCases/.gitkeep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 interconnectedTestCases/.gitkeep diff --git a/interconnectedTestCases/.gitkeep b/interconnectedTestCases/.gitkeep new file mode 100644 index 000000000..e69de29bb -- GitLab From a57ca20ce24b07e1af1a61048f958c121899fff9 Mon Sep 17 00:00:00 2001 From: Muhammad Umair Khan Date: Fri, 30 Aug 2024 12:02:36 +0500 Subject: [PATCH 02/21] add interconnected test case scenarios in api-test --- interconnectedTestCases/IC_TC_keywords.robot | 415 ++++++++ .../VNF Instance Creation And Query.robot | 13 + .../VNF Instance Deletion.robot | 13 + .../VNF Instance Instantiation.robot | 11 + .../VNF Instance Modification.robot | 11 + .../VNF Instance Termination.robot | 12 + .../descriptors/SOL001/VNFD/vnfd_SOL001.yaml | 165 +++ .../descriptors/SOL006/VNFD/vnfd_SOL006.yaml | 137 +++ .../environment/variables.txt | 121 +++ .../jsons/createVnfRequest.json | 5 + .../jsons/patchBodyRequest.json | 7 + .../schemas/vnfInstance.schema.json | 992 +++++++++++++++++ .../schemas/vnfInstances.schema.json | 995 ++++++++++++++++++ .../schemas/vnfPkgInfo.schema.json | 293 ++++++ 14 files changed, 3190 insertions(+) create mode 100644 interconnectedTestCases/IC_TC_keywords.robot create mode 100644 interconnectedTestCases/VNF Instance Creation And Query.robot create mode 100644 interconnectedTestCases/VNF Instance Deletion.robot create mode 100644 interconnectedTestCases/VNF Instance Instantiation.robot create mode 100644 interconnectedTestCases/VNF Instance Modification.robot create mode 100644 interconnectedTestCases/VNF Instance Termination.robot create mode 100644 interconnectedTestCases/descriptors/SOL001/VNFD/vnfd_SOL001.yaml create mode 100644 interconnectedTestCases/descriptors/SOL006/VNFD/vnfd_SOL006.yaml create mode 100644 interconnectedTestCases/environment/variables.txt create mode 100644 interconnectedTestCases/jsons/createVnfRequest.json create mode 100644 interconnectedTestCases/jsons/patchBodyRequest.json create mode 100644 interconnectedTestCases/schemas/vnfInstance.schema.json create mode 100644 interconnectedTestCases/schemas/vnfInstances.schema.json create mode 100644 interconnectedTestCases/schemas/vnfPkgInfo.schema.json diff --git a/interconnectedTestCases/IC_TC_keywords.robot b/interconnectedTestCases/IC_TC_keywords.robot new file mode 100644 index 000000000..86792ff22 --- /dev/null +++ b/interconnectedTestCases/IC_TC_keywords.robot @@ -0,0 +1,415 @@ +*** Settings *** +Library JSONSchemaLibrary schemas/ +Resource environment/variables.txt # Generic Parameters +Library OperatingSystem +Library JSONLibrary +Library Process +Library String +Library Collections +Library String +Variables descriptors/SOL001/VNFD/vnfd_SOL001.yaml +Variables descriptors/SOL006/VNFD/vnfd_SOL006.yaml +Library REST ${None} ssl_verify=${False} + +*** Keywords *** +GET Individual VNF Package + [Documentation] Test ID: 7.3.3.2.1 + ... Test title: GET Individual VNF Package + ... Test objective: The objective is to test the retrieval of an individual VNF package information perform a JSON schema validation of the collected data structure + ... Pre-conditions: One or more VNF packages are onboarded in the NFVO. + ... Reference: Clause 10.4.3.3.2 - ETSI GS NFV-SOL 003 [1] v4.5.1 + ... Config ID: Config_prod_NFVO + ... Applicability: none + ... Post-Conditions: none + GET Individual VNF Package [Keyword] + Check HTTP Response Status Code Is 200 + Check HTTP Response Body Json Schema Is vnfPkgInfo + Check HTTP Response Body vnfPkgInfo Identifier matches the requested VNF Package + Check HTTP Response Body of Individual VNF Package content against VNF Descriptor + +POST Create a new vnfInstance + [Documentation] Test ID: 7.3.1.1.1 + ... Test title: POST Create a new vnfInstance + ... Test objective: The objective is to create a new VNF instance resource + ... Pre-conditions: none + ... Reference: Clause 5.4.2.3.1 - ETSI GS NFV-SOL 003 [1] v4.5.1 + ... Config ID: Config_prod_VNFM + ... Applicability: none + ... Post-Conditions: VNF instance created + POST Create a new vnfInstance [keyword] + Check HTTP Response Status Code Is 201 + Check HTTP Response Body Json Schema Is vnfInstance + +GET information about multiple VNF instances + [Documentation] Test ID: 7.3.1.1.2 + ... Test title: GET information about multiple VNF instances + ... Test objective: The objective is to query information about multiple VNF instances + ... Pre-conditions: none + ... Reference: Clause 5.4.2.3.2 - ETSI GS NFV-SOL 003 [1] v4.5.1 + ... Config ID: Config_prod_VNFM + ... Applicability: none + ... Post-Conditions: none + GET multiple vnfInstances + Check HTTP Response Status Code Is 200 + Check HTTP Response Body Json Schema Is vnfInstances + +Get Information about an individual VNF Instance + [Documentation] Test ID: 7.3.1.2.2 + ... Test title: Get Information about an individual VNF Instance + ... Test objective: The objective is to create a new VNF instance resource + ... Pre-conditions: none + ... Reference: Clause 5.4.3.3.2 - ETSI GS NFV-SOL 003 [1] v4.5.1 + ... Config ID: Config_prod_VNFM + ... Applicability: none + ... Post-Conditions: none + GET individual vnfInstance + Check HTTP Response Header Contains ETag and Last-Modified + Check HTTP Response Status Code Is 200 + Check HTTP Response Body Json Schema Is vnfInstance + Check HTTP Response Body vnfInstance content against VNF Descriptor + +DELETE Individual VNFInstance + [Documentation] Test ID: 7.3.1.2.7 + ... Test title: DELETE Individual VNFInstance + ... Test objective: The objective is to delete a VNF instance + ... Pre-conditions: the VNF instance resource is existing + ... Reference: Clause 5.4.3.3.5 - ETSI GS NFV-SOL 003 [1] v4.5.1 + ... Config ID: Config_prod_VNFM + ... Applicability: none + ... Post-Conditions: VNFInstance deleted + DELETE individual vnfInstance [Keyword] + Check HTTP Response Status Code Is 204 + +PATCH Individual VNFInstance + [Documentation] Test ID: 7.3.1.2.4 + ... Test title: PATCH Individual VNFInstance + ... Test objective: This method modifies an individual VNF instance resource + ... Pre-conditions: an existing VNF instance resource + ... Reference: Clause 5.4.3.3.4 - ETSI GS NFV-SOL 003 [1] v4.5.1 + ... Config ID: Config_prod_VNFM + ... Applicability: none + ... Post-Conditions: VNFInstance modified + PATCH individual vnfInstance + Check HTTP Response Status Code Is 202 + Check Operation Occurrence Id existence + +Instantiate a vnfInstance + [Documentation] Test ID: 7.3.1.3.1 + ... Test title: Post Instantiate Individual VNFInstance + ... Test objective: The objective is to instantiate a VNF instance + ... Pre-conditions: VNF instance resource is in NOT INSTANTIATED state + ... Reference: Clause 5.4.4.4.1 - ETSI GS NFV-SOL 003 [1] v4.5.1 + ... Config ID: Config_prod_VNFM + ... Applicability: none + ... Post-Conditions: none + POST instantiate individual vnfInstance + Check HTTP Response Status Code Is 202 + Check HTTP Response Header Contains Location + Check Individual VNF LCM operation occurrence operationState is STARTING + +POST Terminate a vnfInstance + [Documentation] Test ID: 7.3.1.7.1 + ... Test title: POST Terminate a vnfInstance + ... Test objective: The objective is to test that POST method terminate a VNF instance + ... Pre-conditions: none + ... Reference: Clause 5.4.8.3.1 - ETSI GS NFV-SOL 003 [1] v4.5.1 + ... Config ID: Config_prod_VNFM + ... Applicability: none + ... Post-Conditions: none + POST Terminate VNF + Check HTTP Response Status Code Is 202 + Check HTTP Response Header Contains Location + Check Individual VNF LCM operation occurrence operationState is STARTING + +GET Individual VNF Package [keyword] + Log Trying to get a VNF Package present in the NFVO Catalogue + Set Headers {"Accept": "${ACCEPT_JSON}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + GET ${NFVO}/${NFVO_API_ROOT}/${NFVO_API_NAME}/${NFVO_API_MAJOR_VERSION}/vnf_packages/${vnfPackageId} + ${output}= Output response + Set Global Variable ${response} ${output} + +POST Create a new vnfInstance [keyword] + Log Create VNF instance by POST to /vnf_instances + Set Headers {"Accept":"${ACCEPT}"} + Set Headers {"Content-Type": "${CONTENT_TYPE}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + ${template}= Get File jsons/createVnfRequest.json + ${body}= Format String ${template} vnfdId=${vnfdId} + Post ${VNFM}/${VNFM_API_ROOT}/${VNFM_API_NAME}/${VNFM_API_MAJOR_VERSION}/vnf_instances ${body} + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} + Set Global Variable ${vnfid} ${outputResponse['body']['id']} + +GET multiple vnfInstances + Log Query VNF The GET method queries information about multiple VNF instances. + Set Headers {"Accept":"${ACCEPT}"} + Set Headers {"Content-Type": "${CONTENT_TYPE}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + Log Execute Query and validate response + GET ${VNFM}/${VNFM_API_ROOT}/${VNFM_API_NAME}/${VNFM_API_MAJOR_VERSION}/vnf_instances + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} + +GET individual vnfInstance + log Trying to get information about an individual VNF instance + Set Headers {"Accept":"${ACCEPT}"} + Set Headers {"Content-Type": "${CONTENT_TYPE}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + GET ${VNFM}/${VNFM_API_ROOT}/${VNFM_API_NAME}/${VNFM_API_MAJOR_VERSION}/vnf_instances/${vnfid} + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} + +DELETE individual vnfInstance [Keyword] + log Trying to delete an individual VNF instance + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + Delete ${VNFM}/${VNFM_API_ROOT}/${VNFM_API_NAME}/${VNFM_API_MAJOR_VERSION}/vnf_instances/${response['body']['id']} + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} + +PATCH individual vnfInstance [Keyword] + log Trying to modify an individual VNF instance + Set Headers {"Accept":"${ACCEPT}"} + Set Headers {"Content-Type": "${CONTENT_TYPE_PATCH}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + Run Keyword If ${check_descriptors} == 1 PARSE the Descriptor File + ${template}= Get File jsons/patchBodyRequest.json + ${body}= Format String ${template} vnfdId=${Descriptor_ID} vnfdVersion= ${Descriptor_Version} + Patch ${VNFM}/${VNFM_API_ROOT}/${VNFM_API_NAME}/${VNFM_API_MAJOR_VERSION}/vnf_instances/${response['body']['id']} ${body} + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} + +POST instantiate individual vnfInstance + Log Trying to Instantiate a vnf Instance + Set Headers {"Accept":"${ACCEPT}"} + Set Headers {"Content-Type": "${CONTENT_TYPE}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + ${body}= Get File jsons/instantiateVnfRequest.json + Post ${VNFM}/${VNFM_API_ROOT}/${VNFM_API_NAME}/${VNFM_API_MAJOR_VERSION}/vnf_instances/${response['body']['id']}/instantiate ${body} + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} + +POST Terminate VNF + Log Trying to terminate a VNF instance. + Set Headers {"Accept":"${ACCEPT}"} + Set Headers {"Content-Type": "${CONTENT_TYPE}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + ${template}= Get File jsons/terminateVnfRequest.json + ${body}= Format String ${template} terminationType=${terminationType} + Post ${VNFM}/${VNFM_API_ROOT}/${VNFM_API_ROOT}/${VNFM_API_MAJOR_VERSION}/vnf_instances/${response['body']['id']}/terminate ${body} + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} +#-----------------------------------------Individual VNF Package------------------------------ + +Check HTTP Response Body of Individual VNF Package content against VNF Descriptor + Run Keyword If ${check_descriptors} == 1 Check Individual VNF Package Content + +Check Individual VNF Package Content + PARSE the Descriptor File + Match the VNF Package Response Attributes with Descriptors +#-------------------------------------------Individual Instance------------------------ + +Check HTTP Response Body vnfInstance content against VNF Descriptor + Run Keyword If ${check_descriptors} == 1 Check Individual VNF Instance Content + +Check Individual VNF Instance Content + PARSE the Descriptor File + Match the VNF Instance Response Attributes with Descriptors +#-------------------------------------------descriptor------------------------ + +PARSE the Descriptor File + Run Keyword If '${descriptorType}'=='SOL001' Fetch Information from SOL001 descriptor file ELSE Fetch Information from SOL006 descriptor file + +Fetch Information from SOL001 descriptor file + Import Variables ${CURDIR}/descriptors/SOL001/VNFD/vnfd_SOL001.yaml + @{VDU_labels}= Create List + @{VNF_labels}= Create List + @{VirtualLink_labels}= Create List + @{CP_labels}= Create List + @{Storage_labels}= Create List + FOR ${key} IN @{node_types.keys()} + ${node_type}= Get Variable Value ${node_types['${key}']['derived_from']} + ${is_VNF}= Run Keyword And Return Status Should Be Equal As Strings ${node_type} ${tosca_type_VNF} + Run Keyword If ${is_VNF} Set Global Variable ${tosca_type_derived_from_VNF} ${key} + END + ${derived_type_is_used}= Run Keyword And Return Status Should not be empty ${tosca_type_derived_from_VNF} + Run Keyword If ${derived_type_is_used} Set Global Variable ${tosca_type_VNF} ${tosca_type_derived_from_VNF} + FOR ${key} IN @{topology_template.node_templates.keys()} + ${key_type}= Get Variable Value ${topology_template.node_templates['${key}'].type} + ${VDU_check}= Run Keyword And Return Status Should Be Equal As Strings ${key_type} ${tosca_type_VDU_compute} + ${VNF_check}= Run Keyword And Return Status Should Be Equal As Strings ${key_type} ${tosca_type_VNF} + ${Link_check}= Run Keyword And Return Status Should Be Equal As Strings ${key_type} ${tosca_type_virtual_link} + ${VDUcp_check}= Run Keyword And Return Status Should Be Equal As Strings ${key_type} ${tosca_type_VDU_cp} + ${Storage_check}= Run Keyword And Return Status Should Be Equal As Strings ${key_type} ${tosca_type_storage} + Run Keyword If ${VDU_check} Append To List ${VDU_labels} ${key} + Run Keyword If ${VNF_check} Append To List ${VNF_labels} ${key} + Run Keyword If ${VNF_check} Get VNF Attributes from SOL001 ${key} + Run Keyword If ${Link_check} Append To List ${VirtualLink_labels} ${key} + Run Keyword If ${VDUcp_check} Append To List ${CP_labels} ${key} + Run Keyword If ${Storage_check} Append To List ${Storage_labels} ${key} + END + Set Global Variable @{VDU_IDs} @{VDU_labels} + Set Global Variable @{VNF_IDs} @{VNF_labels} + Set Global Variable @{VirtualLink_IDs} @{VirtualLink_labels} + Set Global Variable @{CP_IDs} @{CP_labels} + Set Global Variable @{Storage_IDs} @{Storage_labels} + +Get VNF Attributes from SOL001 + [Arguments] ${VNF_label} + Import Variables ${CURDIR}/descriptors/SOL001/VNFD/vnfd_SOL001.yaml + ${descriptor_id}= Get Variable Value ${topology_template.node_templates['${VNF_label}'].properties.descriptor_id} + ${provider}= Get Variable Value ${topology_template.node_templates['${VNF_label}'].properties.provider} + ${product_name}= Get Variable Value ${topology_template.node_templates['${VNF_label}'].properties.product_name} + ${software_version}= Get Variable Value ${topology_template.node_templates['${VNF_label}'].properties.software_version} + ${descriptor_version}= Get Variable Value ${topology_template.node_templates['${VNF_label}'].properties.descriptor_version} + ${flavour_id}= Get Variable Value ${topology_template.node_templates['${VNF_label}'].properties.flavour_id} + Set Global Variable ${Descriptor_ID} ${descriptor_id} + Set Global Variable ${Provider} ${provider} + Set Global Variable ${Product_Name} ${product_name} + Set Global Variable ${Software_Version} ${software_version} + Set Global Variable ${Descriptor_Version} ${descriptor_version} + Set Global Variable ${Flavour_ID} ${flavour_id} + +Fetch Information from SOL006 descriptor file + Import Variables ${CURDIR}/descriptors/SOL006/VNFD/vnfd_SOL006.yaml + ${descriptor_id}= Get Variable Value ${nfv.vnfd[0].id} + ${provider}= Get Variable Value ${nfv.vnfd[0].provider} + ${product_name}= Get Variable Value ${nfv.vnfd[0]['product-name']} + ${software_version}= Get Variable Value ${nfv.vnfd[0]['software-version']} + ${descriptor_version}= Get Variable Value ${nfv.vnfd[0].version} + ${VDUcount}= Get Length ${nfv.vnfd[0].vdu} + ${extCP_count}= Get Length ${nfv.vnfd[0]['ext-cpd']} + ${virtualLink_count}= Get length ${nfv.vnfd[0]['int-virtual-link-desc']} + ${instantiation_levels}= Get Length ${nfv.vnfd[0].df['instantiation-level']} + FOR ${key} IN @{nfv.vnfd[0].keys()} + ${VDU_check}= Run Keyword And Return Status Should Be Equal As Strings ${key} vdu + Run Keyword If ${VDU_check} Get VDU IDs ${VDUcount} + ${extCP_check}= Run Keyword And Return Status Should Be Equal As Strings ${key} ext-cpd + Run Keyword If ${extCP_check} Get External CP IDs ${extCP_count} + ${virtualLink_check}= Run Keyword And Return Status Should Be Equal As Strings ${key} int-virtual-link-desc + Run Keyword If ${virtualLink_check} Get Virtual Link IDs ${virtualLink_count} + ${DF_check}= Run Keyword And Return Status Should Be Equal As Strings ${key} df + Run Keyword If ${DF_check} Get Instantiation Levels ${instantiation_levels} + END + Set Global Variable ${Descriptor_ID} ${descriptor_id} + Set Global Variable ${Provider} ${provider} + Set Global Variable ${Product_Name} ${product_name} + Set Global Variable ${Software_Version} ${software_version} + Set Global Variable ${Descriptor_Version} ${descriptor_version} + +Get VDU IDs + [Arguments] ${count} + Import Variables ${CURDIR}/descriptors/SOL006/VNFD/vnfd_SOL006.yaml + @{VDU_labels}= Create List + ${Storage_labels}= Create List + FOR ${i} IN RANGE ${count} + Append To List ${VDU_labels} ${nfv.vnfd[0].vdu[${i}]['id']} + Append To List ${Storage_labels} ${nfv.vnfd[0].vdu[${i}]['virtual-storage-desc']} + Get Internal CPs for each VDU ${i} + END + Set Global Variable ${VDU_IDs} ${VDU_labels} + Set Global Variable ${Storage_IDs} ${Storage_labels} + +Get Internal CPs for each VDU + [Arguments] ${vdu} + Import Variables ${CURDIR}/descriptors/SOL006/VNFD/vnfd_SOL006.yaml + ${count}= Get Length ${nfv.vnfd[0].vdu[${vdu}]['int-cpd']} + ${internal_CPs}= Create List + FOR ${i} IN RANGE ${count} + Append To List ${internal_CPs} ${nfv.vnfd[0].vdu[${vdu}]['int-cpd'][${i}]['id']} + END + Set Global Variable ${internalCP_IDs} ${internal_CPs} + +Get External CP IDs + [Arguments] ${count} + Import Variables ${CURDIR}/descriptors/SOL006/VNFD/vnfd_SOL006.yaml + @{external_CPs}= Create List + FOR ${i} IN RANGE ${count} + Append To List ${external_CPs} ${nfv.vnfd[0].ext_cpd[${i}].id} + END + Set Global Variable ${externalCP_IDs} ${external_CPs} + +Get Virtual Link IDs + [Arguments] ${count} + Import Variables ${CURDIR}/descriptors/SOL006/VNFD/vnfd_SOL006.yaml + ${VirtualLink_labels}= Create List + FOR ${i} IN RANGE ${count} + Append To List ${VirtualLink_labels} ${nfv.vnfd[0]['int-virtual-link-desc'][${i}]['id']} + END + Set Global Variable ${VirtualLink_IDs} ${VirtualLink_labels} + +Get Instantiation Levels + [Arguments] ${count} + Import Variables ${CURDIR}/descriptors/SOL006/VNFD/vnfd_SOL006.yaml + @{Instantiation_Levels}= Create List + FOR ${i} IN RANGE ${count} + Append To List ${Instantiation_Levels} ${nfv.vnfd[0].df['instantiation-level'][${i}]['id']} + END + Set Global Variable ${InstantiationLevel_IDs} ${Instantiation_Levels} + +Match the VNF Package Response Attributes with Descriptors + #Checking Response attributes with VNF Descriptors + Should Be Equal As Strings ${response['body']['vnfdId']} ${Descriptor_ID} + Should Be Equal As Strings ${response['body']['vnfProvider']} ${Provider} + Should Be Equal As Strings ${response['body']['vnfProductName']} ${Product_Name} + Should Be Equal As Strings ${response['body']['vnfSoftwareVersion']} ${Software_Version} + Should Be Equal As Strings ${response['body']['vnfdVersion']} ${Descriptor_Version} + +Match the VNF Instance Response Attributes with Descriptors + #Checking Response attributes with VNF Descriptors + Should Be Equal As Strings ${response['body']['vnfdId']} ${Descriptor_ID} + Should Be Equal As Strings ${response['body']['vnfProvider']} ${Provider} + Should Be Equal As Strings ${response['body']['vnfProductName']} ${Product_Name} + Should Be Equal As Strings ${response['body']['vnfSoftwareVersion']} ${Software_Version} + Should Be Equal As Strings ${response['body']['vnfdVersion']} ${Descriptor_Version} + Should Be Equal As Strings ${response['body']['instantiatedVnfInfo']['flavourId']} ${Flavour_ID} + Run Keyword If '${descriptorType}'=='SOL006'List Should Contain Value ${VDU_IDs} ${response['body']['instantiatedVnfInfo']['vnfcResourceInfo']['vduId']} + Run Keyword If '${descriptorType}'=='SOL006' List Should Contain Value ${externalCP_IDs} ${response['body']['instantiatedVnfInfo']['extCpInfo'][0]['cpdId']} + Run Keyword If '${descriptorType}'=='SOL006' List Should Contain Value ${internalCP_IDs} ${response['body']['instantiatedVnfInfo']['vnfcResourceInfo'][0]['vnfcCpInfo'][0]['cpdId']} + Run Keyword If '${descriptorType}'=='SOL001' List Should Contain Value @{CP_IDs} ${response['body']['instantiatedVnfInfo']['extCpInfo'][0]['cpdId']} + Run Keyword If '${descriptorType}'=='SOL001' List Should Contain Value @{CP_IDs} ${response['body']['instantiatedVnfInfo']['vnfcResourceInfo'][0]['vnfcCpInfo'][0]['cpdId']} + Run Keyword If '${descriptorType}'=='SOL006'List Should Contain value ${Storage_IDs} ${response['body']['instantiatedVnfInfo']['virtualStorageResourceInfo'][0]['virtualStorageDescId']} + Run Keyword If '${descriptorType}'=='SOL006'List Should Contain Value ${VirtualLink_IDs} ${response['body']['instantiatedVnfInfo']['extManagedVirtualLinkInfo'][0]['vnfVirtualLinkDescId']} +#-----------------------------------------Common------------------------------ + +Check HTTP Response Header Contains ETag and Last-Modified + Pass Execution If ${HEADER_TEST_SUPPORTED} == 0 Headers testing not supported. Skipping the Test. + Log ${response['headers']} + Should Contain ${response['headers']} Etag + Should Contain ${response['headers']} Last-Modified + Log Etag and Last-Modified Headers are present + +Check HTTP Response Body vnfPkgInfo Identifier matches the requested VNF Package + Log Going to validate pacakge info retrieved + Should Be Equal ${response['body']['id']} ${vnfPackageId} + Log Pacakge identifier as expected + +Check HTTP Response Status Code Is + [Arguments] ${expected_status} + Should Be Equal As Strings ${response['status']} ${expected_status} + Log Status code validated + +Check HTTP Response Body Json Schema Is + [Arguments] ${input} + Run Keyword If '${input}' == 'ProblemDetails' Should Contain ${response['headers']['Content-Type']} application/problem+json + ... ELSE Should Contain ${response['headers']['Content-Type']} application/json + ${schema} = Catenate SEPARATOR= ${input} .schema.json + Validate Json ${schema} ${response['body']} + Log Json Schema Validation OK + +Check Operation Occurrence Id existence + ${vnfLcmOpOccId}= Get Value From Json ${response['headers']} $..Location + Should Not Be Empty ${vnfLcmOpOccId} + +Check HTTP Response Header Contains + [Arguments] ${CONTENT_TYPE} + Should Contain ${response['headers']} ${CONTENT_TYPE} + Log Header is present + +Check Individual VNF LCM operation occurrence operationState is + [Arguments] ${status} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + ${opOccResponse}= Get ${response['headers']['Location']} + Log Validate operationState + Should Be Equal as Strings ${opOccResponse['body']['operationState']} ${status} + Log operationState validated diff --git a/interconnectedTestCases/VNF Instance Creation And Query.robot b/interconnectedTestCases/VNF Instance Creation And Query.robot new file mode 100644 index 000000000..877113387 --- /dev/null +++ b/interconnectedTestCases/VNF Instance Creation And Query.robot @@ -0,0 +1,13 @@ +*** Settings *** +Resource environment/variables.txt # Generic Parameters +Resource IC_TC_keywords.robot +Library JSONLibrary + +*** Test Cases *** + +Create a new VNF instance resource and query information about multiple and individual VNF instance​ + [Documentation] Test ID: 11.3.1 + GET Individual VNF Package + POST Create a new vnfInstance + GET information about multiple VNF instances + GET Information about an individual VNF Instance \ No newline at end of file diff --git a/interconnectedTestCases/VNF Instance Deletion.robot b/interconnectedTestCases/VNF Instance Deletion.robot new file mode 100644 index 000000000..5345b5738 --- /dev/null +++ b/interconnectedTestCases/VNF Instance Deletion.robot @@ -0,0 +1,13 @@ +*** Settings *** +Resource environment/variables.txt # Generic Parameters +Resource IC_TC_keywords.robot +Library JSONLibrary +Library REST +*** Test Cases *** + + +The objective is to delete a VNF instance + [Documentation] Test ID: 11.3.2 + GET Individual VNF Package + POST Create a new vnfInstance + DELETE Individual VNFInstance \ No newline at end of file diff --git a/interconnectedTestCases/VNF Instance Instantiation.robot b/interconnectedTestCases/VNF Instance Instantiation.robot new file mode 100644 index 000000000..e4087881e --- /dev/null +++ b/interconnectedTestCases/VNF Instance Instantiation.robot @@ -0,0 +1,11 @@ +*** Settings *** +Resource environment/variables.txt # Generic Parameters +Resource IC_TC_keywords.robot +Library JSONLibrary + +*** Test Cases *** +Instantiate a VNF instance + [Documentation] Test ID: 11.3.4 + GET Individual VNF Package + POST Create a new vnfInstance + Instantiate a vnfInstance diff --git a/interconnectedTestCases/VNF Instance Modification.robot b/interconnectedTestCases/VNF Instance Modification.robot new file mode 100644 index 000000000..13a4a284b --- /dev/null +++ b/interconnectedTestCases/VNF Instance Modification.robot @@ -0,0 +1,11 @@ +*** Settings *** +Resource environment/variables.txt # Generic Parameters +Resource IC_TC_keywords.robot +Library JSONLibrary + +*** Test Cases *** +Modify an individual VNF instance resource + [Documentation] Test ID: 11.3.3 + GET Individual VNF Package + POST Create a new vnfInstance + PATCH Individual VNFInstance diff --git a/interconnectedTestCases/VNF Instance Termination.robot b/interconnectedTestCases/VNF Instance Termination.robot new file mode 100644 index 000000000..7ea329777 --- /dev/null +++ b/interconnectedTestCases/VNF Instance Termination.robot @@ -0,0 +1,12 @@ +*** Settings *** +Resource environment/variables.txt # Generic Parameters +Resource IC_TC_keywords.robot +Library JSONLibrary + +*** Test Cases *** +Test that POST method terminate a VNF instance + [Documentation] Test ID: 11.3.5 + GET Individual VNF Package + POST Create a new vnfInstance + Instantiate a vnfInstance + POST Terminate a vnfInstance diff --git a/interconnectedTestCases/descriptors/SOL001/VNFD/vnfd_SOL001.yaml b/interconnectedTestCases/descriptors/SOL001/VNFD/vnfd_SOL001.yaml new file mode 100644 index 000000000..e770a8cd4 --- /dev/null +++ b/interconnectedTestCases/descriptors/SOL001/VNFD/vnfd_SOL001.yaml @@ -0,0 +1,165 @@ +tosca_definitions_version: tosca_simple_yaml_1_2 +description: "TST010 reference VNF-B" + +imports: + - https://forge.etsi.org/rep/nfv/SOL001/raw/v2.8.1/etsi_nfv_sol001_vnfd_types.yaml + +metadata: + descriptor_id: "VNF-B" + vendor: "ETSI TST WG" + version: "2.0" + +node_types: + tst010.vnf.simple: + derived_from: tosca.nodes.nfv.VNF + properties: + descriptor_id: + type: string + default: VNF-B + descriptor_version: + type: string + default: '1.0' + provider: + type: string + default: ETSI TST WG + product_name: + type: string + default: VNF-B + software_version: + type: string + default: '1.0' + product_info_name: + type: string + default: VNF-B + product_info_description: + type: string + default: TST010 reference VNF-B + flavour_id: + type: string + default: VNF-B_flavor + flavour_description: + type: string + default: "VNF-B flavor" + vnfm_info: + type: list + entry_schema: + type: string + default: [ 'etsivnfm:v2.3.1' ] + interfaces: + Vnflcm: + type: "tosca.interfaces.nfv.Vnflcm" + scale: + description: Invoked upon receipt of a Scale VNF request + terminate: + description: Invoked upon receipt Terminate VNF request + operate: + description: Invoked upon receipt of an Operate VNF request + requirements: + - virtual_link_right: + capability: tosca.capabilities.nfv.VirtualLinkable + relationship: tosca.relationships.nfv.VirtualLinksTo + occurrences: [0, 1] + - virtual_link_left: + capability: tosca.capabilities.nfv.VirtualLinkable + relationship: tosca.relationships.nfv.VirtualLinksTo + occurrences: [0, 1] + - virtual_link_management: + capability: tosca.capabilities.nfv.VirtualLinkable + relationship: tosca.relationships.nfv.VirtualLinksTo + occurrences: [0, 1] + - virtual_link: + capability: tosca.capabilities.nfv.VirtualLinkable + relationship: tosca.relationships.nfv.VirtualLinksTo + occurrences: [0, 0] + +topology_template: + substitution_mappings: + node_type: "tst010.vnf.simple" + requirements: + virtual_link_right: + [right, virtual_link_right] + virtual_link_management: + [management, virtual_link_management] + virtual_link_left: + [left, virtual_link_left] + node_templates: + right: + type: "tosca.nodes.nfv.VduCp" + properties: + layer_protocols: [ ipv4 ] + order: 1 + requirements: + - virtual_binding: VDU-B + management: + type: "tosca.nodes.nfv.VduCp" + properties: + layer_protocols: [ ipv4 ] + order: 0 + requirements: + - virtual_binding: VDU-B + left: + type: "tosca.nodes.nfv.VduCp" + properties: + layer_protocols: [ ipv4 ] + order: 2 + requirements: + - virtual_binding: VDU-B + vdu-b-1-vsd: + type: "tosca.nodes.nfv.Vdu.VirtualBlockStorage" + properties: + virtual_block_storage_data: + size_of_storage: 20 GB + rdma_enabled: false + sw_image_data: + name: "vdu-b-1 image" + version: "1.1" + checksum: + algorithm: "sha-224" + hash: "somehashfortst010" + container_format: "bare" + disk_format: qcow2 + min_disk: '1' + min_ram: '2' + size: '1' + VDU-B: + type: "tosca.nodes.nfv.Vdu.Compute" + properties: + name: "vdu-b-1-vcd" + description: "Description of VDU-B-1" + vdu_profile: + min_number_of_instances: 1 + max_number_of_instances: 2 + capabilities: + virtual_compute: + properties: + virtual_memory: + virtual_mem_size: 4096 MB + numa_enabled: false + virtual_cpu: + num_virtual_cpu: 2 + requirements: + - virtual_storage: vdu-b-1-vsd + + vnf-b-1_VNF: + type: "tst010.vnf.simple" + properties: + descriptor_id: "VNF-B" + descriptor_version: "2.0" + provider: "ETSI TST WG" + product_name: "VDU_VNF-B" + software_version: "2.0" + product_info_name: "VDU_VNF-B" + product_info_description: "TST010 reference VNF-A" + flavour_id: "VNF-B_flavor" + flavour_description: "VNF-B flavor" + vnfm_info: + - etsivnfm:v2.3.1 + interfaces: + Vnflcm: + type: "tosca.interfaces.nfv.Vnflcm" + scale: + implementation: scale-example.yaml + terminate: + implementation: terminate-example.yaml + operate: + implementation: operate-example.yaml \ No newline at end of file diff --git a/interconnectedTestCases/descriptors/SOL006/VNFD/vnfd_SOL006.yaml b/interconnectedTestCases/descriptors/SOL006/VNFD/vnfd_SOL006.yaml new file mode 100644 index 000000000..0ea9820f0 --- /dev/null +++ b/interconnectedTestCases/descriptors/SOL006/VNFD/vnfd_SOL006.yaml @@ -0,0 +1,137 @@ +nfv: + vnfd: + - id: VNF-B-2vdu + provider: ETSI TST WG + product_name: TST010 reference VNF-B with 2 VDUs + software_version: '2.2' + version: '2.2' + vnfm_info: ETSI VNFM + vdu: + - id: vdu-b-1 + name: VNF-B VDU 1 + int_cpd: + - id: left + layer_protocol: ethernet + - id: management + layer_protocol: ethernet + - id: internal + layer_protocol: ethernet + int_virtual_link_desc: internal-vl + virtual_compute_desc: vdu-b-1-vcd + virtual_storage_desc: vdu-b-1-vsd + sw_image_desc: vdu-b-1-image + - id: vdu-b-2 + name: VNF-B VDU 2 + int_cpd: + - id: right + layer_protocol: ethernet + - id: management + layer_protocol: ethernet + - id: internal + layer_protocol: ethernet + int_virtual_link_desc: internal-vl + virtual_compute_desc: vdu-b-2-vcd + virtual_storage_desc: vdu-b-2-vsd + sw_image_desc: vdu-b-2-image + virtual_compute_desc: + id: vdu-b-1-vcd + virtual_memory: + size: '4.0' + virtual_cpu: + num_virtual_cpu: '2' + virtual_storage_desc: + id: vdu-b-1-vsd + type_of_storage: root-storage + size_of_storage: '0' + sw_image_desc: + id: vdu-b-1-image + name: VNF-B image + version: '1.1' + checksum: + algorithm: sha-224 + hash: somehashfortst010 + container_format: bare + disk_format: qcow2 + min_disk: '1' + min_ram: '2.0' + size: '1' + image: 'http://someurl.com/VNF-B.qcow2' + virtual_compute_desc: + id: vdu-b-2-vcd + virtual_memory: + size: '6.0' + virtual_cpu: + num_virtual_cpu: '2' + virtual_storage_desc: + id: vdu-b-2-vsd + type_of_storage: root-storage + size_of_storage: '0' + sw_image_desc: + id: vdu-b-2-image + name: VNF-B-2 image + version: '1.1' + checksum: + algorithm: sha-224 + hash: somehashfortst010 + container_format: bare + disk_format: qcow2 + min_disk: '1' + min_ram: '2.0' + size: '1' + image: 'http://someurl.com/VNF-B-2.qcow2' + int_virtual_link_desc: + - id: internal-vl + flavour: + id: internal-vl-flavour + qos: + latency: '1' + packet_delay_variation: '1' + packet_loss_ratio: '0.05' + connectivity_type: + layer_protocol: ethernet + ext_cpd: + - id: ext-b-left + int_cpd: + vdu_id: vdu-b-1 + cpd: left + layer_protocol: ethernet + - id: management + int_cpd: + vdu_id: vdu-b-1 + cpd: management + layer_protocol: ethernet + - id: ext-b-right + int_cpd: + vdu_id: vdu-b-2 + cpd: right + layer_protocol: ethernet + df: + id: normal + vdu_profile: + - id: vdu-b-1 + min_number_of_instances: '1' + max_number_of_instances: '2' + - id: vdu-b-2 + min_number_of_instances: '1' + max_number_of_instances: '4' + instantiation_level: + - id: double + vdu_level: + - vdu_id: vdu-b-1 + number_of_instances: '2' + - vdu_id: vdu-b-2 + number_of_instances: '2' + - id: single + vdu_level: + - vdu_id: vdu-b-1 + number_of_instances: '1' + - vdu_id: vdu-b-2 + number_of_instances: '1' + default_instantiation_level: single + lcm_operations_configuration: + scale_vnf_to_level_op_config: + arbitrary_target_levels_supported: 'true' + terminate_vnf_op_config: + min_graceful_termination: '1' + operate_vnf_op_config: + min_graceful_stop_timeout: '1' \ No newline at end of file diff --git a/interconnectedTestCases/environment/variables.txt b/interconnectedTestCases/environment/variables.txt new file mode 100644 index 000000000..5e4a62352 --- /dev/null +++ b/interconnectedTestCases/environment/variables.txt @@ -0,0 +1,121 @@ +*** Variables *** +${NFVO_HOST}= localhost # Hostname of the NFVO +${NFVO_PORT}= 3002 # Listening port of the NFVO +${NFVO_SCHEMA}= http +${NFVO} ${NFVO_SCHEMA}://${NFVO_HOST}:${NFVO_PORT} + +${VNFM_HOST} localhost # Hostname of the VNFM +${VNFM_PORT} 3001 # Listening port of the VNFM +${VNFM_SCHEMA} http +${VNFM} ${VNFM_SCHEMA}://${VNFM_HOST}:${VNFM_PORT} + + +${ACCEPT} application/json +${ACCEPT_JSON} application/json +${CONTENT_TYPE} application/json +${AUTHORIZATION_HEADER} Authorization +${AUTHORIZATION_TOKEN} Bearer 0b79bab50daca910b000d4f1a2b675d604257e42 +${AUTH_USAGE} 1 +${CONTENT_TYPE_PATCH} application/merge-patch+json + +${NFVO_API_ROOT} +${NFVO_API_NAME} vnfpkgm +${NFVO_API_MAJOR_VERSION} v1 + +${VNFM_API_ROOT} +${VNFM_API_NAME} vnflcm +${VNFM_API_MAJOR_VERSION} v2 + +${CancelMode} GRACEFUL +${VNFM_DUPLICATION} 0 +${invalid_etag} invalid etag +${SYNC_MODE} 0 +${nextPageUri} /someuri +${original_etag} 1234 +${invalid_etag} 4321 +${ACCEPT_OCTET} application/octet-stream +${CONTENT_TYPE_OCTET} application/octet-stream +${VNFM_RANGE_OK} 1 # If 1 means that Range is supported by the VNFM +${range} bytes=0-1023 +${erroneousRange} bytes=10000000-1000000000 # Requesting a out of range number of bytes +${full_length} 2000 #Full size of the content file to be transmitted using partial downloads +${vnfPackageId} id +${instantiatedVnfInstanceId} 6fc3539c-e602-4afa-8e13-962fb5a7d81f +${anotherInstantiatedVnfInstanceId} 6fc3539c-e602-4afa-8e13-962fb5a7d81f +${notInstantiatedVnfInstanceId} 6fc3539c-e602-4afa-8e13-962fb5a7d81f +${notExistingVnfInstanceId} 6fc3539c-e602-4afa-8e13-962fb5a7d81f +${vnfInstanceId} 6fc3539c-e602-4afa-8e13-962fb5a7d81f +${subscriptionId} 6fc3539c-e602-4afa-8e13-962fb5a7d81f +${vnfInstanceId_NoSnapshotTask} no-snapshot-task-supported +${vnfSnapshotInfoId} +${vnfSnapshotInfoId_InUse} snapshotId-of-a-resource-AlreadyInUse-bySomeOther-operation +${vnfSnapshotInfoId_creationIncomplete} snapshotId-of-a-resource-whose-creation-isn't-complete +${invalidVnfSnapshotInfoId} +${vnfSnapshotPkgId} +${vnfLcmOpOccId} 6fc3539c-e602-4afa-8e13-962fb5a7d81d +${notExistingVnfLcmOpOccId} 6fc3539c-e602-4afa-8e13-962fb5a7d81d +${vnfLcmOpOccIdNotStartingProcessingRollingback} 6fc3539c-e602-4afa-8e13-962fb5a7d81d +${vnfLcmOpOccIdNotFailedTemp} 6fc3539c-e602-4afa-8e13-962fb5a7d81d +${response} {} +${json} {} +${requestedFlavour} test +${POS_filter_subscription} id=41fdd38a-3d4c-465c-83e0-f80e014425f8 +${NEG_filter_subscription} nfvId=41fdd38a-3d4c-465c-83e0-f80e014425f8 +${fields_vnfLcmOpOcc} operationParams,grantId +${POS_FILTER_vnfLcmOpOcc} id=41fdd38a-3d4c-465c-83e0-f80e014425f8 # Positive case, suing compiant fields name for filtering get request +${NEG_FILTER_vnfLcmOpOcc} nfvId=41fdd38a-3d4c-465c-83e0-f80e014425f8 # Negative case, using wrong name of field +${fields_vnfInstance} vnfInstanceDescription,vimConnectionInfo +${POS_FILTER_snapshot} id=41fdd38a-3d4c-465c-83e0-f80e014425f8 # Positive case, suing compiant fields name for filtering get request +${NEG_FILTER_snapshot} nfvId=41fdd38a-3d4c-465c-83e0-f80e014425f8 # Negative case, using wrong name of field +${fields_snapshot} vnfStateSnapshotInfo +${PAGING_SUPPORTED} 1 +${changeVnfFlavourRequest} {} +${changeVnfOperateRequest} {} +${requestedState} test +${changeVnfExtConnectivityRequest} {} +${patchBodyRequest} {} +${callback_uri} http://localhost +${callback_port} 9091 +${callback_endpoint} /endpoint +${callback_endpoint_fwd} /endpoint/check +${sleep_interval} 20s +${notification_request} [] +${notification_response} [] +${MOCK_SERVER_JAR} ../../../bin/mockserver-netty-5.5.0-jar-with-dependencies.jar +${vnfdId} VNF-B +${vnfdId_notInEnabledState} vnfdId-which-is-not-in-ENABLED-state-or-DNE +${scaletype} SCALE_OUT +${scaleAspectId} myAspect +${instantiationLevelId} myNextLevel +${newFlavourId} myFlavour_new +${healingCause} a new cause +${changeStateTo} STOPPED +${stopType} FORCEFUL +${terminationType} GRACEFUL +${HEADER_TEST_SUPPORTED} 0 +${scaleInfo} +${element} +${aspectId} +${callbackResp} localhost +${descriptorType} SOL001 +${check_descriptors} 1 +#############internal variables used for descriptor parsing################ +${tosca_type_VDU_compute} tosca.nodes.nfv.Vdu.Compute +${tosca_type_VNF} tosca.nodes.nfv.VNF +${tosca_type_virtual_link} tosca.nodes.nfv.VnfVirtualLink +${tosca_type_VDU_cp} tosca.nodes.nfv.VduCp +${tosca_type_storage} tosca.nodes.nfv.Vdu.VirtualBlockStorage +${tosca_type_derived_from_VNF} +${VDU_IDs} +${Storage_IDs} +${internalCP_IDs} +${externalCP_IDs} +${InstantiationLevel_IDs} +${CP_IDs} +${VirtualLink_IDs} +${Descriptor_IDD} VNF-B +${Providerr} ETSI TST WG +${Product_Namee} VDU_VNF-B +${Software_Versionn} 2.0 +${Descriptor_Versionn} 2.0 +${Flavour_ID} diff --git a/interconnectedTestCases/jsons/createVnfRequest.json b/interconnectedTestCases/jsons/createVnfRequest.json new file mode 100644 index 000000000..710694f38 --- /dev/null +++ b/interconnectedTestCases/jsons/createVnfRequest.json @@ -0,0 +1,5 @@ +{{ + "vnfdId": "{vnfdId}", + "vnfInstanceName": "string", + "vnfInstanceDescription": "string" +}} \ No newline at end of file diff --git a/interconnectedTestCases/jsons/patchBodyRequest.json b/interconnectedTestCases/jsons/patchBodyRequest.json new file mode 100644 index 000000000..679cc4c7f --- /dev/null +++ b/interconnectedTestCases/jsons/patchBodyRequest.json @@ -0,0 +1,7 @@ +{{ + "vnfInstanceName": "vnf string", + "vnfInstanceDescription": "string", + "vnfdId": "{vnfdId}", + "vnfdVersion":"{vnfdVersion}", + "metadata":{{}} +}} \ No newline at end of file diff --git a/interconnectedTestCases/schemas/vnfInstance.schema.json b/interconnectedTestCases/schemas/vnfInstance.schema.json new file mode 100644 index 000000000..0fb54dee1 --- /dev/null +++ b/interconnectedTestCases/schemas/vnfInstance.schema.json @@ -0,0 +1,992 @@ +{ + "description": "This type represents a VNF instance.\n", + "type": "object", + "required": [ + "id", + "vnfdId", + "vnfProvider", + "vnfProductName", + "vnfSoftwareVersion", + "vnfdVersion", + "instantiationState" + ], + "properties": { + "id": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "vnfInstanceName": { + "description": "Name of the VNF instance. This attribute can be modified with the PATCH method.\n", + "type": "string" + }, + "vnfInstanceDescription": { + "description": "Human-readable description of the VNF instance. This attribute can be modified with the PATCH method.\n", + "type": "string" + }, + "vnfdId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "vnfProvider": { + "description": "Provider of the VNF and the VNFD. The value is copied from the VNFD.\n", + "type": "string" + }, + "vnfProductName": { + "description": "Name to identify the VNF Product. The value is copied from the VNFD.\n", + "type": "string" + }, + "vnfSoftwareVersion": { + "description": "A version.\n", + "type": "string" + }, + "vnfdVersion": { + "description": "A version.\n", + "type": "string" + }, + "vnfConfigurableProperties": { + "description": "This type represents a list of key-value pairs. The order of the pairs in the list is not significant. In JSON, a set of keyvalue pairs is represented as an object. It shall comply with the provisions defined in clause 4 of IETF RFC 8259. In the following example, a list of key-value pairs with four keys (\"aString\", \"aNumber\", \"anArray\" and \"anObject\") is provided to illustrate that the values associated with different keys can be of different type.\n", + "type": "object" + }, + "vimConnectionInfo": { + "description": "Information about VIM connections to be used for managing the resources for the VNF instance. This attribute shall only be supported and present if VNF-related resource management in direct mode is applicable. This attribute can be modified with the PATCH method.\n", + "type": "array", + "items": { + "description": "This type represents parameters to connect to a VIM for managing the resources of a VNF instance. This structure is used to convey VIM-related parameters over the Or-Vnfm interface. Additional parameters for a VIM may be configured into the VNFM by means outside the scope of the present document, and bound to the identifier of that VIM.\n", + "type": "object", + "required": [ + "id", + "vimType" + ], + "properties": { + "id": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "vimId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "vimType": { + "description": "Discriminator for the different types of the VIM information. The value of this attribute determines the structure of the \"interfaceInfo\" and \"accessInfo\" attributes, based on the type of the VIM. The set of permitted values is expected to change over time as new types or versions of VIMs become available. The ETSI NFV registry of VIM-related information provides access to information about VimConnectionInfo definitions for various VIM types. The structure of the registry is defined in Annex C of SOL003.\n", + "type": "string" + }, + "interfaceInfo": { + "description": "This type represents a list of key-value pairs. The order of the pairs in the list is not significant. In JSON, a set of keyvalue pairs is represented as an object. It shall comply with the provisions defined in clause 4 of IETF RFC 8259. In the following example, a list of key-value pairs with four keys (\"aString\", \"aNumber\", \"anArray\" and \"anObject\") is provided to illustrate that the values associated with different keys can be of different type.\n", + "type": "object" + }, + "accessInfo": { + "description": "This type represents a list of key-value pairs. The order of the pairs in the list is not significant. In JSON, a set of keyvalue pairs is represented as an object. It shall comply with the provisions defined in clause 4 of IETF RFC 8259. In the following example, a list of key-value pairs with four keys (\"aString\", \"aNumber\", \"anArray\" and \"anObject\") is provided to illustrate that the values associated with different keys can be of different type.\n", + "type": "object" + }, + "extra": { + "description": "This type represents a list of key-value pairs. The order of the pairs in the list is not significant. In JSON, a set of keyvalue pairs is represented as an object. It shall comply with the provisions defined in clause 4 of IETF RFC 8259. In the following example, a list of key-value pairs with four keys (\"aString\", \"aNumber\", \"anArray\" and \"anObject\") is provided to illustrate that the values associated with different keys can be of different type.\n", + "type": "object" + } + } + } + }, + "instantiationState": { + "description": "The instantiation state of the VNF.\n", + "type": "string", + "enum": [ + "NOT_INSTANTIATED", + "INSTANTIATED" + ] + }, + "instantiatedVnfInfo": { + "description": "Information specific to an instantiated VNF instance. This attribute shall be present if the instantiateState attribute value is INSTANTIATED.\n", + "type": "object", + "required": [ + "flavourId", + "vnfState" + ], + "properties": { + "flavourId": { + "description": "An identifier that is unique within a VNF descriptor.\n", + "type": "string" + }, + "vnfState": { + "description": "STARTED: The VNF instance is up and running. STOPPED: The VNF instance has been shut down.\n", + "type": "string", + "enum": [ + "STARTED", + "STOPPED" + ] + }, + "scaleStatus": { + "description": "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. See clause B.2 for an explanation of VNF scaling.\n", + "type": "array", + "items": { + "required": [ + "aspectId", + "scaleLevel" + ], + "type": "object", + "properties": { + "aspectId": { + "description": "An identifier that is unique within a VNF descriptor.\n", + "type": "string" + }, + "scaleLevel": { + "description": "Indicates the scale level. The minimum value shall be 0 and the maximum value shall be <= maxScaleLevel as described in the VNFD.\n", + "type": "integer" + } + } + } + }, + "extCpInfo": { + "description": "Information about the external CPs exposed by the VNF instance.\n", + "type": "array", + "minItems": 1, + "items": { + "description": "This type represents information about an external CP of a VNF. It shall comply with the provisions defined in table 5.5.3.25 1.\n", + "type": "object", + "required": [ + "id", + "cpdId", + "cpProtocolInfo" + ], + "properties": { + "id": { + "description": "An identifier that is unique for the respective type within a VNF instance, but may not be globally unique.\n", + "type": "string" + }, + "cpdId": { + "description": "An identifier that is unique within a VNF descriptor.\n", + "type": "string" + }, + "cpProtocolInfo": { + "description": "Network protocol information for this CP.\n", + "type": "array", + "items": { + "description": "This type describes the protocol layer(s) that a CP uses together with protocol-related information, like addresses.\n", + "required": [ + "layerProtocol" + ], + "properties": { + "layerProtocol": { + "description": "The identifier of layer(s) and protocol(s) associated to the network address information. Permitted values: IP_OVER_ETHERNET This attribute allows to signal the addition of further types of layer and protocol in future versions of the present document in a backwards-compatible way. In the current version of the present document, only IP over Ethernet is supported.\n", + "type": "string", + "enum": [ + "IP_OVER_ETHERNET" + ] + }, + "ipOverEthernet": { + "description": "This type represents information about a network address that has been assigned.\n", + "type": "object", + "properties": { + "macAddress": { + "description": "A MAC address. Representation: string that consists of groups of two hexadecimal digits, separated by hyphens or colons.\n", + "type": "string", + "format": "MAC" + }, + "ipAddresses": { + "description": "Addresses assigned to the CP instance. Each entry represents IP addresses assigned by fixed or dynamic IP address assignment per subnet.\n", + "type": "array", + "items": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "description": "The type of the IP addresses. Permitted values: IPV4, IPV6.\n", + "type": "string", + "enum": [ + "IPV4", + "IPV6" + ] + }, + "addresses": { + "description": "Fixed addresses assigned (from the subnet defined by \"subnetId\" if provided). Exactly one of \"addresses\" or \"addressRange\" shall be present.\n", + "type": "array", + "items": { + "description": "An IPV4 or IPV6 address. Representation: In case of an IPV4 address, string that consists of four decimal integers separated by dots, each integer ranging from 0 to 255. In case of an IPV6 address, string that consists of groups of zero to four hexadecimal digits, separated by colons.\n", + "type": "string", + "format": "IP" + } + }, + "isDynamic": { + "description": "Indicates whether this set of addresses was assigned dynamically (true) or based on address information provided as input from the API consumer (false). Shall be present if \"addresses\" is present and shall be absent otherwise.\n", + "type": "boolean" + }, + "addressRange": { + "description": "An IP address range used, e.g., in case of egress connections. Exactly one of \"addresses\" or \"addressRange\" shall be present.\n", + "type": "object", + "required": [ + "minAddress", + "maxAddress" + ], + "properties": { + "minAddress": { + "description": "An IPV4 or IPV6 address. Representation: In case of an IPV4 address, string that consists of four decimal integers separated by dots, each integer ranging from 0 to 255. In case of an IPV6 address, string that consists of groups of zero to four hexadecimal digits, separated by colons.\n", + "type": "string", + "format": "IP" + }, + "maxAddress": { + "description": "An IPV4 or IPV6 address. Representation: In case of an IPV4 address, string that consists of four decimal integers separated by dots, each integer ranging from 0 to 255. In case of an IPV6 address, string that consists of groups of zero to four hexadecimal digits, separated by colons.\n", + "type": "string", + "format": "IP" + } + } + }, + "subnetId": { + "description": "An IPV4 or IPV6 address. Representation: In case of an IPV4 address, string that consists of four decimal integers separated by dots, each integer ranging from 0 to 255. In case of an IPV6 address, string that consists of groups of zero to four hexadecimal digits, separated by colons.\n", + "type": "string", + "format": "IP" + } + } + } + } + } + } + } + } + }, + "extLinkPortId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "metadata": { + "description": "This type represents a list of key-value pairs. The order of the pairs in the list is not significant. In JSON, a set of keyvalue pairs is represented as an object. It shall comply with the provisions defined in clause 4 of IETF RFC 8259. In the following example, a list of key-value pairs with four keys (\"aString\", \"aNumber\", \"anArray\" and \"anObject\") is provided to illustrate that the values associated with different keys can be of different type.\n", + "type": "object" + }, + "associatedVnfcCpId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "associatedVnfVirtualLinkId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + } + } + } + }, + "extVirtualLinkInfo": { + "description": "Information about the external VLs the VNF instance is connected to.\n", + "type": "array", + "items": { + "type": "object", + "required": [ + "id", + "resourceHandle" + ], + "properties": { + "id": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "resourceHandle": { + "required": [ + "vimConnectionId", + "resourceId" + ], + "type": "object", + "description": "This type represents the information that allows addressing a virtualised resource that is used by a VNF instance. Information about the resource is available from the VIM.\n", + "properties": { + "vimConnectionId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "resourceProviderId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "resourceId": { + "description": "An identifier maintained by the VIM or other resource provider. It is expected to be unique within the VIM instance.\n", + "type": "string" + }, + "vimLevelResourceType": { + "description": "The value set of the \"vimLevelResourceType\" attribute is within the scope of the VIM or the resource provider and can be used as information that complements the ResourceHandle. This value set is different from the value set of the \"type\" attribute in the ResourceDefinition (refer to clause 9.5.3.2 in SOL003).\n", + "type": "string" + } + } + }, + "extLinkPorts": { + "description": "Link ports of this VL.\n", + "type": "array", + "items": { + "description": "This type represents information about a link port of an external VL, i.e. a port providing connectivity for the VNF to an NS VL.\n", + "type": "object", + "required": [ + "id", + "resourceHandle" + ], + "properties": { + "id": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "resourceHandle": { + "required": [ + "vimConnectionId", + "resourceId" + ], + "type": "object", + "description": "This type represents the information that allows addressing a virtualised resource that is used by a VNF instance. Information about the resource is available from the VIM.\n", + "properties": { + "vimConnectionId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "resourceProviderId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "resourceId": { + "description": "An identifier maintained by the VIM or other resource provider. It is expected to be unique within the VIM instance.\n", + "type": "string" + }, + "vimLevelResourceType": { + "description": "The value set of the \"vimLevelResourceType\" attribute is within the scope of the VIM or the resource provider and can be used as information that complements the ResourceHandle. This value set is different from the value set of the \"type\" attribute in the ResourceDefinition (refer to clause 9.5.3.2 in SOL003).\n", + "type": "string" + } + } + }, + "cpInstanceId": { + "description": "An identifier that is unique for the respective type within a VNF instance, but may not be globally unique.\n", + "type": "string" + } + } + } + } + } + } + }, + "extManagedVirtualLinkInfo": { + "description": "External virtual links the VNF instance is connected to.\n", + "type": "array", + "items": { + "type": "object", + "required": [ + "id", + "vnfVirtualLinkDescId" + ], + "properties": { + "id": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "vnfVirtualLinkDescId": { + "description": "An identifier that is unique for the respective type within a VNF instance, but may not be globally unique.\n", + "type": "string" + }, + "networkResource": { + "required": [ + "vimConnectionId", + "resourceId" + ], + "type": "object", + "description": "This type represents the information that allows addressing a virtualised resource that is used by a VNF instance. Information about the resource is available from the VIM.\n", + "properties": { + "vimConnectionId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "resourceProviderId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "resourceId": { + "description": "An identifier maintained by the VIM or other resource provider. It is expected to be unique within the VIM instance.\n", + "type": "string" + }, + "vimLevelResourceType": { + "description": "The value set of the \"vimLevelResourceType\" attribute is within the scope of the VIM or the resource provider and can be used as information that complements the ResourceHandle. This value set is different from the value set of the \"type\" attribute in the ResourceDefinition (refer to clause 9.5.3.2 in SOL003).\n", + "type": "string" + } + } + }, + "vnfLinkPorts": { + "description": "Link ports of this VL.\n", + "type": "array", + "items": { + "type": "object", + "required": [ + "id", + "resourceHandle" + ], + "properties": { + "id": { + "description": "An identifier that is unique for the respective type within a VNF instance, but may not be globally unique.\n", + "type": "string" + }, + "resourceHandle": { + "required": [ + "vimConnectionId", + "resourceId" + ], + "type": "object", + "description": "This type represents the information that allows addressing a virtualised resource that is used by a VNF instance. Information about the resource is available from the VIM.\n", + "properties": { + "vimConnectionId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "resourceProviderId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "resourceId": { + "description": "An identifier maintained by the VIM or other resource provider. It is expected to be unique within the VIM instance.\n", + "type": "string" + }, + "vimLevelResourceType": { + "description": "The value set of the \"vimLevelResourceType\" attribute is within the scope of the VIM or the resource provider and can be used as information that complements the ResourceHandle. This value set is different from the value set of the \"type\" attribute in the ResourceDefinition (refer to clause 9.5.3.2 in SOL003).\n", + "type": "string" + } + } + }, + "cpInstanceId": { + "description": "An identifier that is unique for the respective type within a VNF instance, but may not be globally unique.\n", + "type": "string" + }, + "cpInstanceType": { + "description": "Type of the CP instance that is identified by cpInstanceId. Shall be present if \"cpInstanceId\" is present, and shall be absent otherwise. Permitted values: VNFC_CP: The link port is connected to a VNFC CP EXT_CP: The link port is associated to an external CP.\n", + "type": "string", + "enum": [ + "VNFC_CP", + "EXT_CP" + ] + } + } + } + } + } + } + }, + "monitoringParameters": { + "description": "Active monitoring parameters.\n", + "type": "array", + "items": { + "type": "object", + "required": [ + "id", + "performanceMetric" + ], + "properties": { + "id": { + "description": "An identifier that is unique within a VNF descriptor.\n", + "type": "string" + }, + "name": { + "description": "Human readable name of the monitoring parameter, as defined in the VNFD.\n", + "type": "string" + }, + "performanceMetric": { + "description": "Performance metric that is monitored. This attribute shall contain the related \"Measurement Name\" value as defined in clause 7.2 of ETSI GS NFV-IFA 027.\n", + "type": "string" + } + } + } + }, + "localizationLanguage": { + "description": "Information about localization language of the VNF (includes e.g. strings in the VNFD). The localization languages supported by a VNF can be declared in the VNFD, and localization language selection can take place at instantiation time. The value shall comply with the format defined in IETF RFC 5646.\n", + "type": "string" + }, + "vnfcResourceInfo": { + "description": "Information about the virtualised compute and storage resources used by the VNFCs of the VNF instance.\n", + "type": "array", + "items": { + "description": "This type represents the information on virtualised compute and storage resources used by a VNFC in a VNF instance.\n", + "type": "object", + "required": [ + "id", + "vduId", + "computeResource" + ], + "properties": { + "id": { + "description": "An identifier that is unique for the respective type within a VNF instance, but may not be globally unique.\n", + "type": "string" + }, + "vduId": { + "description": "An identifier that is unique within a VNF descriptor.\n", + "type": "string" + }, + "computeResource": { + "required": [ + "vimConnectionId", + "resourceId" + ], + "type": "object", + "description": "This type represents the information that allows addressing a virtualised resource that is used by a VNF instance. Information about the resource is available from the VIM.\n", + "properties": { + "vimConnectionId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "resourceProviderId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "resourceId": { + "description": "An identifier maintained by the VIM or other resource provider. It is expected to be unique within the VIM instance.\n", + "type": "string" + }, + "vimLevelResourceType": { + "description": "The value set of the \"vimLevelResourceType\" attribute is within the scope of the VIM or the resource provider and can be used as information that complements the ResourceHandle. This value set is different from the value set of the \"type\" attribute in the ResourceDefinition (refer to clause 9.5.3.2 in SOL003).\n", + "type": "string" + } + } + }, + "storageResourceIds": { + "description": "References to the VirtualStorage resources. The value refers to a VirtualStorageResourceInfo item in the VnfInstance.\n", + "type": "array", + "items": { + "description": "An identifier that is unique for the respective type within a VNF instance, but may not be globally unique.\n", + "type": "string" + } + }, + "reservationId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "vnfcCpInfo": { + "description": "CPs of the VNFC instance. Shall be present when that particular CP of the VNFC instance is associated to an external CP of the VNF instance. May be present otherwise.\n", + "type": "array", + "items": { + "type": "object", + "required": [ + "id", + "cpdId" + ], + "properties": { + "id": { + "description": "An identifier that is unique for the respective type within a VNF instance, but may not be globally unique.\n", + "type": "string" + }, + "cpdId": { + "description": "An identifier that is unique within a VNF descriptor.\n", + "type": "string" + }, + "vnfExtCpId": { + "description": "An identifier that is unique for the respective type within a VNF instance, but may not be globally unique.\n", + "type": "string" + }, + "cpProtocolInfo": { + "description": "Network protocol information for this CP.\n", + "type": "array", + "items": { + "description": "This type describes the protocol layer(s) that a CP uses together with protocol-related information, like addresses.\n", + "required": [ + "layerProtocol" + ], + "properties": { + "layerProtocol": { + "description": "The identifier of layer(s) and protocol(s) associated to the network address information. Permitted values: IP_OVER_ETHERNET This attribute allows to signal the addition of further types of layer and protocol in future versions of the present document in a backwards-compatible way. In the current version of the present document, only IP over Ethernet is supported.\n", + "type": "string", + "enum": [ + "IP_OVER_ETHERNET" + ] + }, + "ipOverEthernet": { + "description": "This type represents information about a network address that has been assigned.\n", + "type": "object", + "properties": { + "macAddress": { + "description": "A MAC address. Representation: string that consists of groups of two hexadecimal digits, separated by hyphens or colons.\n", + "type": "string", + "format": "MAC" + }, + "ipAddresses": { + "description": "Addresses assigned to the CP instance. Each entry represents IP addresses assigned by fixed or dynamic IP address assignment per subnet.\n", + "type": "array", + "items": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "description": "The type of the IP addresses. Permitted values: IPV4, IPV6.\n", + "type": "string", + "enum": [ + "IPV4", + "IPV6" + ] + }, + "addresses": { + "description": "Fixed addresses assigned (from the subnet defined by \"subnetId\" if provided). Exactly one of \"addresses\" or \"addressRange\" shall be present.\n", + "type": "array", + "items": { + "description": "An IPV4 or IPV6 address. Representation: In case of an IPV4 address, string that consists of four decimal integers separated by dots, each integer ranging from 0 to 255. In case of an IPV6 address, string that consists of groups of zero to four hexadecimal digits, separated by colons.\n", + "type": "string", + "format": "IP" + } + }, + "isDynamic": { + "description": "Indicates whether this set of addresses was assigned dynamically (true) or based on address information provided as input from the API consumer (false). Shall be present if \"addresses\" is present and shall be absent otherwise.\n", + "type": "boolean" + }, + "addressRange": { + "description": "An IP address range used, e.g., in case of egress connections. Exactly one of \"addresses\" or \"addressRange\" shall be present.\n", + "type": "object", + "required": [ + "minAddress", + "maxAddress" + ], + "properties": { + "minAddress": { + "description": "An IPV4 or IPV6 address. Representation: In case of an IPV4 address, string that consists of four decimal integers separated by dots, each integer ranging from 0 to 255. In case of an IPV6 address, string that consists of groups of zero to four hexadecimal digits, separated by colons.\n", + "type": "string", + "format": "IP" + }, + "maxAddress": { + "description": "An IPV4 or IPV6 address. Representation: In case of an IPV4 address, string that consists of four decimal integers separated by dots, each integer ranging from 0 to 255. In case of an IPV6 address, string that consists of groups of zero to four hexadecimal digits, separated by colons.\n", + "type": "string", + "format": "IP" + } + } + }, + "subnetId": { + "description": "An IPV4 or IPV6 address. Representation: In case of an IPV4 address, string that consists of four decimal integers separated by dots, each integer ranging from 0 to 255. In case of an IPV6 address, string that consists of groups of zero to four hexadecimal digits, separated by colons.\n", + "type": "string", + "format": "IP" + } + } + } + } + } + } + } + } + }, + "vnfLinkPortId": { + "description": "An identifier that is unique for the respective type within a VNF instance, but may not be globally unique.\n", + "type": "string" + }, + "metadata": { + "description": "This type represents a list of key-value pairs. The order of the pairs in the list is not significant. In JSON, a set of keyvalue pairs is represented as an object. It shall comply with the provisions defined in clause 4 of IETF RFC 8259. In the following example, a list of key-value pairs with four keys (\"aString\", \"aNumber\", \"anArray\" and \"anObject\") is provided to illustrate that the values associated with different keys can be of different type.\n", + "type": "object" + } + } + } + }, + "metadata": { + "description": "This type represents a list of key-value pairs. The order of the pairs in the list is not significant. In JSON, a set of keyvalue pairs is represented as an object. It shall comply with the provisions defined in clause 4 of IETF RFC 8259. In the following example, a list of key-value pairs with four keys (\"aString\", \"aNumber\", \"anArray\" and \"anObject\") is provided to illustrate that the values associated with different keys can be of different type.\n", + "type": "object" + } + } + } + }, + "virtualLinkResourceInfo": { + "description": "Information about the virtualised network resources used by the VLs of the VNF instance.\n", + "type": "array", + "items": { + "description": "This type represents the information that allows addressing a virtualised resource that is used by an internal VL instance in a VNF instance.\n", + "type": "object", + "required": [ + "id", + "vnfVirtualLinkDescId", + "networkResource" + ], + "properties": { + "id": { + "description": "An identifier that is unique for the respective type within a VNF instance, but may not be globally unique.\n", + "type": "string" + }, + "vnfVirtualLinkDescId": { + "description": "An identifier that is unique within a VNF descriptor.\n", + "type": "string" + }, + "networkResource": { + "required": [ + "vimConnectionId", + "resourceId" + ], + "type": "object", + "description": "This type represents the information that allows addressing a virtualised resource that is used by a VNF instance. Information about the resource is available from the VIM.\n", + "properties": { + "vimConnectionId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "resourceProviderId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "resourceId": { + "description": "An identifier maintained by the VIM or other resource provider. It is expected to be unique within the VIM instance.\n", + "type": "string" + }, + "vimLevelResourceType": { + "description": "The value set of the \"vimLevelResourceType\" attribute is within the scope of the VIM or the resource provider and can be used as information that complements the ResourceHandle. This value set is different from the value set of the \"type\" attribute in the ResourceDefinition (refer to clause 9.5.3.2 in SOL003).\n", + "type": "string" + } + } + }, + "reservationId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "vnfLinkPorts": { + "description": "Links ports of this VL. Shall be present when the linkPort is used for external connectivity by the VNF (refer to VnfLinkPortInfo). May be present otherwise.\n", + "type": "array", + "items": { + "type": "object", + "required": [ + "id", + "resourceHandle" + ], + "properties": { + "id": { + "description": "An identifier that is unique for the respective type within a VNF instance, but may not be globally unique.\n", + "type": "string" + }, + "resourceHandle": { + "required": [ + "vimConnectionId", + "resourceId" + ], + "type": "object", + "description": "This type represents the information that allows addressing a virtualised resource that is used by a VNF instance. Information about the resource is available from the VIM.\n", + "properties": { + "vimConnectionId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "resourceProviderId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "resourceId": { + "description": "An identifier maintained by the VIM or other resource provider. It is expected to be unique within the VIM instance.\n", + "type": "string" + }, + "vimLevelResourceType": { + "description": "The value set of the \"vimLevelResourceType\" attribute is within the scope of the VIM or the resource provider and can be used as information that complements the ResourceHandle. This value set is different from the value set of the \"type\" attribute in the ResourceDefinition (refer to clause 9.5.3.2 in SOL003).\n", + "type": "string" + } + } + }, + "cpInstanceId": { + "description": "An identifier that is unique for the respective type within a VNF instance, but may not be globally unique.\n", + "type": "string" + }, + "cpInstanceType": { + "description": "Type of the CP instance that is identified by cpInstanceId. Shall be present if \"cpInstanceId\" is present, and shall be absent otherwise. Permitted values: VNFC_CP: The link port is connected to a VNFC CP EXT_CP: The link port is associated to an external CP.\n", + "type": "string", + "enum": [ + "VNFC_CP", + "EXT_CP" + ] + } + } + } + }, + "metadata": { + "description": "This type represents a list of key-value pairs. The order of the pairs in the list is not significant. In JSON, a set of keyvalue pairs is represented as an object. It shall comply with the provisions defined in clause 4 of IETF RFC 8259. In the following example, a list of key-value pairs with four keys (\"aString\", \"aNumber\", \"anArray\" and \"anObject\") is provided to illustrate that the values associated with different keys can be of different type.\n", + "type": "object" + } + } + } + }, + "virtualStorageResourceInfo": { + "description": "Information on the virtualised storage resource(s) used as storage for the VNF instance.\n", + "type": "array", + "items": { + "description": "This type represents the information that allows addressing a virtualised resource that is used by a VNF instance.\n", + "type": "object", + "required": [ + "id", + "virtualStorageDescId", + "storageResource" + ], + "properties": { + "id": { + "description": "An identifier that is unique for the respective type within a VNF instance, but may not be globally unique.\n", + "type": "string" + }, + "virtualStorageDescId": { + "description": "An identifier that is unique within a VNF descriptor.\n", + "type": "string" + }, + "storageResource": { + "required": [ + "vimConnectionId", + "resourceId" + ], + "type": "object", + "description": "This type represents the information that allows addressing a virtualised resource that is used by a VNF instance. Information about the resource is available from the VIM.\n", + "properties": { + "vimConnectionId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "resourceProviderId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "resourceId": { + "description": "An identifier maintained by the VIM or other resource provider. It is expected to be unique within the VIM instance.\n", + "type": "string" + }, + "vimLevelResourceType": { + "description": "The value set of the \"vimLevelResourceType\" attribute is within the scope of the VIM or the resource provider and can be used as information that complements the ResourceHandle. This value set is different from the value set of the \"type\" attribute in the ResourceDefinition (refer to clause 9.5.3.2 in SOL003).\n", + "type": "string" + } + } + }, + "reservationId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "metadata": { + "description": "This type represents a list of key-value pairs. The order of the pairs in the list is not significant. In JSON, a set of keyvalue pairs is represented as an object. It shall comply with the provisions defined in clause 4 of IETF RFC 8259. In the following example, a list of key-value pairs with four keys (\"aString\", \"aNumber\", \"anArray\" and \"anObject\") is provided to illustrate that the values associated with different keys can be of different type.\n", + "type": "object" + } + } + } + } + } + }, + "metadata": { + "description": "This type represents a list of key-value pairs. The order of the pairs in the list is not significant. In JSON, a set of keyvalue pairs is represented as an object. It shall comply with the provisions defined in clause 4 of IETF RFC 8259. In the following example, a list of key-value pairs with four keys (\"aString\", \"aNumber\", \"anArray\" and \"anObject\") is provided to illustrate that the values associated with different keys can be of different type.\n", + "type": "object" + }, + "extensions": { + "description": "This type represents a list of key-value pairs. The order of the pairs in the list is not significant. In JSON, a set of keyvalue pairs is represented as an object. It shall comply with the provisions defined in clause 4 of IETF RFC 8259. In the following example, a list of key-value pairs with four keys (\"aString\", \"aNumber\", \"anArray\" and \"anObject\") is provided to illustrate that the values associated with different keys can be of different type.\n", + "type": "object" + }, + "_links": { + "description": "Links to resources related to this resource.\n", + "type": "object", + "required": [ + "self" + ], + "properties": { + "self": { + "description": "This type represents a link to a resource using an absolute URI.\n", + "type": "object", + "required": [ + "href" + ], + "properties": { + "href": { + "description": "String formatted according to IETF RFC 3986.\n", + "type": "string" + } + } + }, + "indicators": { + "description": "This type represents a link to a resource using an absolute URI.\n", + "type": "object", + "required": [ + "href" + ], + "properties": { + "href": { + "description": "String formatted according to IETF RFC 3986.\n", + "type": "string" + } + } + }, + "instantiate": { + "description": "This type represents a link to a resource using an absolute URI.\n", + "type": "object", + "required": [ + "href" + ], + "properties": { + "href": { + "description": "String formatted according to IETF RFC 3986.\n", + "type": "string" + } + } + }, + "terminate": { + "description": "This type represents a link to a resource using an absolute URI.\n", + "type": "object", + "required": [ + "href" + ], + "properties": { + "href": { + "description": "String formatted according to IETF RFC 3986.\n", + "type": "string" + } + } + }, + "scale": { + "description": "This type represents a link to a resource using an absolute URI.\n", + "type": "object", + "required": [ + "href" + ], + "properties": { + "href": { + "description": "String formatted according to IETF RFC 3986.\n", + "type": "string" + } + } + }, + "scaleToLevel": { + "description": "This type represents a link to a resource using an absolute URI.\n", + "type": "object", + "required": [ + "href" + ], + "properties": { + "href": { + "description": "String formatted according to IETF RFC 3986.\n", + "type": "string" + } + } + }, + "changeFlavour": { + "description": "This type represents a link to a resource using an absolute URI.\n", + "type": "object", + "required": [ + "href" + ], + "properties": { + "href": { + "description": "String formatted according to IETF RFC 3986.\n", + "type": "string" + } + } + }, + "heal": { + "description": "This type represents a link to a resource using an absolute URI.\n", + "type": "object", + "required": [ + "href" + ], + "properties": { + "href": { + "description": "String formatted according to IETF RFC 3986.\n", + "type": "string" + } + } + }, + "operate": { + "description": "This type represents a link to a resource using an absolute URI.\n", + "type": "object", + "required": [ + "href" + ], + "properties": { + "href": { + "description": "String formatted according to IETF RFC 3986.\n", + "type": "string" + } + } + }, + "changeExtConn": { + "description": "This type represents a link to a resource using an absolute URI.\n", + "type": "object", + "required": [ + "href" + ], + "properties": { + "href": { + "description": "String formatted according to IETF RFC 3986.\n", + "type": "string" + } + } + } + } + } + } + } \ No newline at end of file diff --git a/interconnectedTestCases/schemas/vnfInstances.schema.json b/interconnectedTestCases/schemas/vnfInstances.schema.json new file mode 100644 index 000000000..ae54b054f --- /dev/null +++ b/interconnectedTestCases/schemas/vnfInstances.schema.json @@ -0,0 +1,995 @@ +{ + "type": "array", + "items": { + "description": "This type represents a VNF instance.\n", + "type": "object", + "required": [ + "id", + "vnfdId", + "vnfProvider", + "vnfProductName", + "vnfSoftwareVersion", + "vnfdVersion", + "instantiationState" + ], + "properties": { + "id": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "vnfInstanceName": { + "description": "Name of the VNF instance. This attribute can be modified with the PATCH method.\n", + "type": "string" + }, + "vnfInstanceDescription": { + "description": "Human-readable description of the VNF instance. This attribute can be modified with the PATCH method.\n", + "type": "string" + }, + "vnfdId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "vnfProvider": { + "description": "Provider of the VNF and the VNFD. The value is copied from the VNFD.\n", + "type": "string" + }, + "vnfProductName": { + "description": "Name to identify the VNF Product. The value is copied from the VNFD.\n", + "type": "string" + }, + "vnfSoftwareVersion": { + "description": "A version.\n", + "type": "string" + }, + "vnfdVersion": { + "description": "A version.\n", + "type": "string" + }, + "vnfConfigurableProperties": { + "description": "This type represents a list of key-value pairs. The order of the pairs in the list is not significant. In JSON, a set of keyvalue pairs is represented as an object. It shall comply with the provisions defined in clause 4 of IETF RFC 8259. In the following example, a list of key-value pairs with four keys (\"aString\", \"aNumber\", \"anArray\" and \"anObject\") is provided to illustrate that the values associated with different keys can be of different type.\n", + "type": "object" + }, + "vimConnectionInfo": { + "description": "Information about VIM connections to be used for managing the resources for the VNF instance. This attribute shall only be supported and present if VNF-related resource management in direct mode is applicable. This attribute can be modified with the PATCH method.\n", + "type": "array", + "items": { + "description": "This type represents parameters to connect to a VIM for managing the resources of a VNF instance. This structure is used to convey VIM-related parameters over the Or-Vnfm interface. Additional parameters for a VIM may be configured into the VNFM by means outside the scope of the present document, and bound to the identifier of that VIM.\n", + "type": "object", + "required": [ + "id", + "vimType" + ], + "properties": { + "id": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "vimId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "vimType": { + "description": "Discriminator for the different types of the VIM information. The value of this attribute determines the structure of the \"interfaceInfo\" and \"accessInfo\" attributes, based on the type of the VIM. The set of permitted values is expected to change over time as new types or versions of VIMs become available. The ETSI NFV registry of VIM-related information provides access to information about VimConnectionInfo definitions for various VIM types. The structure of the registry is defined in Annex C of SOL003.\n", + "type": "string" + }, + "interfaceInfo": { + "description": "This type represents a list of key-value pairs. The order of the pairs in the list is not significant. In JSON, a set of keyvalue pairs is represented as an object. It shall comply with the provisions defined in clause 4 of IETF RFC 8259. In the following example, a list of key-value pairs with four keys (\"aString\", \"aNumber\", \"anArray\" and \"anObject\") is provided to illustrate that the values associated with different keys can be of different type.\n", + "type": "object" + }, + "accessInfo": { + "description": "This type represents a list of key-value pairs. The order of the pairs in the list is not significant. In JSON, a set of keyvalue pairs is represented as an object. It shall comply with the provisions defined in clause 4 of IETF RFC 8259. In the following example, a list of key-value pairs with four keys (\"aString\", \"aNumber\", \"anArray\" and \"anObject\") is provided to illustrate that the values associated with different keys can be of different type.\n", + "type": "object" + }, + "extra": { + "description": "This type represents a list of key-value pairs. The order of the pairs in the list is not significant. In JSON, a set of keyvalue pairs is represented as an object. It shall comply with the provisions defined in clause 4 of IETF RFC 8259. In the following example, a list of key-value pairs with four keys (\"aString\", \"aNumber\", \"anArray\" and \"anObject\") is provided to illustrate that the values associated with different keys can be of different type.\n", + "type": "object" + } + } + } + }, + "instantiationState": { + "description": "The instantiation state of the VNF.\n", + "type": "string", + "enum": [ + "NOT_INSTANTIATED", + "INSTANTIATED" + ] + }, + "instantiatedVnfInfo": { + "description": "Information specific to an instantiated VNF instance. This attribute shall be present if the instantiateState attribute value is INSTANTIATED.\n", + "type": "object", + "required": [ + "flavourId", + "vnfState" + ], + "properties": { + "flavourId": { + "description": "An identifier that is unique within a VNF descriptor.\n", + "type": "string" + }, + "vnfState": { + "description": "STARTED: The VNF instance is up and running. STOPPED: The VNF instance has been shut down.\n", + "type": "string", + "enum": [ + "STARTED", + "STOPPED" + ] + }, + "scaleStatus": { + "description": "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. See clause B.2 for an explanation of VNF scaling.\n", + "type": "array", + "items": { + "required": [ + "aspectId", + "scaleLevel" + ], + "type": "object", + "properties": { + "aspectId": { + "description": "An identifier that is unique within a VNF descriptor.\n", + "type": "string" + }, + "scaleLevel": { + "description": "Indicates the scale level. The minimum value shall be 0 and the maximum value shall be <= maxScaleLevel as described in the VNFD.\n", + "type": "integer" + } + } + } + }, + "extCpInfo": { + "description": "Information about the external CPs exposed by the VNF instance.\n", + "type": "array", + "minItems": 1, + "items": { + "description": "This type represents information about an external CP of a VNF. It shall comply with the provisions defined in table 5.5.3.25 1.\n", + "type": "object", + "required": [ + "id", + "cpdId", + "cpProtocolInfo" + ], + "properties": { + "id": { + "description": "An identifier that is unique for the respective type within a VNF instance, but may not be globally unique.\n", + "type": "string" + }, + "cpdId": { + "description": "An identifier that is unique within a VNF descriptor.\n", + "type": "string" + }, + "cpProtocolInfo": { + "description": "Network protocol information for this CP.\n", + "type": "array", + "items": { + "description": "This type describes the protocol layer(s) that a CP uses together with protocol-related information, like addresses.\n", + "required": [ + "layerProtocol" + ], + "properties": { + "layerProtocol": { + "description": "The identifier of layer(s) and protocol(s) associated to the network address information. Permitted values: IP_OVER_ETHERNET This attribute allows to signal the addition of further types of layer and protocol in future versions of the present document in a backwards-compatible way. In the current version of the present document, only IP over Ethernet is supported.\n", + "type": "string", + "enum": [ + "IP_OVER_ETHERNET" + ] + }, + "ipOverEthernet": { + "description": "This type represents information about a network address that has been assigned.\n", + "type": "object", + "properties": { + "macAddress": { + "description": "A MAC address. Representation: string that consists of groups of two hexadecimal digits, separated by hyphens or colons.\n", + "type": "string", + "format": "MAC" + }, + "ipAddresses": { + "description": "Addresses assigned to the CP instance. Each entry represents IP addresses assigned by fixed or dynamic IP address assignment per subnet.\n", + "type": "array", + "items": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "description": "The type of the IP addresses. Permitted values: IPV4, IPV6.\n", + "type": "string", + "enum": [ + "IPV4", + "IPV6" + ] + }, + "addresses": { + "description": "Fixed addresses assigned (from the subnet defined by \"subnetId\" if provided). Exactly one of \"addresses\" or \"addressRange\" shall be present.\n", + "type": "array", + "items": { + "description": "An IPV4 or IPV6 address. Representation: In case of an IPV4 address, string that consists of four decimal integers separated by dots, each integer ranging from 0 to 255. In case of an IPV6 address, string that consists of groups of zero to four hexadecimal digits, separated by colons.\n", + "type": "string", + "format": "IP" + } + }, + "isDynamic": { + "description": "Indicates whether this set of addresses was assigned dynamically (true) or based on address information provided as input from the API consumer (false). Shall be present if \"addresses\" is present and shall be absent otherwise.\n", + "type": "boolean" + }, + "addressRange": { + "description": "An IP address range used, e.g., in case of egress connections. Exactly one of \"addresses\" or \"addressRange\" shall be present.\n", + "type": "object", + "required": [ + "minAddress", + "maxAddress" + ], + "properties": { + "minAddress": { + "description": "An IPV4 or IPV6 address. Representation: In case of an IPV4 address, string that consists of four decimal integers separated by dots, each integer ranging from 0 to 255. In case of an IPV6 address, string that consists of groups of zero to four hexadecimal digits, separated by colons.\n", + "type": "string", + "format": "IP" + }, + "maxAddress": { + "description": "An IPV4 or IPV6 address. Representation: In case of an IPV4 address, string that consists of four decimal integers separated by dots, each integer ranging from 0 to 255. In case of an IPV6 address, string that consists of groups of zero to four hexadecimal digits, separated by colons.\n", + "type": "string", + "format": "IP" + } + } + }, + "subnetId": { + "description": "An IPV4 or IPV6 address. Representation: In case of an IPV4 address, string that consists of four decimal integers separated by dots, each integer ranging from 0 to 255. In case of an IPV6 address, string that consists of groups of zero to four hexadecimal digits, separated by colons.\n", + "type": "string", + "format": "IP" + } + } + } + } + } + } + } + } + }, + "extLinkPortId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "metadata": { + "description": "This type represents a list of key-value pairs. The order of the pairs in the list is not significant. In JSON, a set of keyvalue pairs is represented as an object. It shall comply with the provisions defined in clause 4 of IETF RFC 8259. In the following example, a list of key-value pairs with four keys (\"aString\", \"aNumber\", \"anArray\" and \"anObject\") is provided to illustrate that the values associated with different keys can be of different type.\n", + "type": "object" + }, + "associatedVnfcCpId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "associatedVnfVirtualLinkId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + } + } + } + }, + "extVirtualLinkInfo": { + "description": "Information about the external VLs the VNF instance is connected to.\n", + "type": "array", + "items": { + "type": "object", + "required": [ + "id", + "resourceHandle" + ], + "properties": { + "id": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "resourceHandle": { + "required": [ + "vimConnectionId", + "resourceId" + ], + "type": "object", + "description": "This type represents the information that allows addressing a virtualised resource that is used by a VNF instance. Information about the resource is available from the VIM.\n", + "properties": { + "vimConnectionId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "resourceProviderId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "resourceId": { + "description": "An identifier maintained by the VIM or other resource provider. It is expected to be unique within the VIM instance.\n", + "type": "string" + }, + "vimLevelResourceType": { + "description": "The value set of the \"vimLevelResourceType\" attribute is within the scope of the VIM or the resource provider and can be used as information that complements the ResourceHandle. This value set is different from the value set of the \"type\" attribute in the ResourceDefinition (refer to clause 9.5.3.2 in SOL003).\n", + "type": "string" + } + } + }, + "extLinkPorts": { + "description": "Link ports of this VL.\n", + "type": "array", + "items": { + "description": "This type represents information about a link port of an external VL, i.e. a port providing connectivity for the VNF to an NS VL.\n", + "type": "object", + "required": [ + "id", + "resourceHandle" + ], + "properties": { + "id": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "resourceHandle": { + "required": [ + "vimConnectionId", + "resourceId" + ], + "type": "object", + "description": "This type represents the information that allows addressing a virtualised resource that is used by a VNF instance. Information about the resource is available from the VIM.\n", + "properties": { + "vimConnectionId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "resourceProviderId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "resourceId": { + "description": "An identifier maintained by the VIM or other resource provider. It is expected to be unique within the VIM instance.\n", + "type": "string" + }, + "vimLevelResourceType": { + "description": "The value set of the \"vimLevelResourceType\" attribute is within the scope of the VIM or the resource provider and can be used as information that complements the ResourceHandle. This value set is different from the value set of the \"type\" attribute in the ResourceDefinition (refer to clause 9.5.3.2 in SOL003).\n", + "type": "string" + } + } + }, + "cpInstanceId": { + "description": "An identifier that is unique for the respective type within a VNF instance, but may not be globally unique.\n", + "type": "string" + } + } + } + } + } + } + }, + "extManagedVirtualLinkInfo": { + "description": "External virtual links the VNF instance is connected to.\n", + "type": "array", + "items": { + "type": "object", + "required": [ + "id", + "vnfVirtualLinkDescId" + ], + "properties": { + "id": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "vnfVirtualLinkDescId": { + "description": "An identifier that is unique for the respective type within a VNF instance, but may not be globally unique.\n", + "type": "string" + }, + "networkResource": { + "required": [ + "vimConnectionId", + "resourceId" + ], + "type": "object", + "description": "This type represents the information that allows addressing a virtualised resource that is used by a VNF instance. Information about the resource is available from the VIM.\n", + "properties": { + "vimConnectionId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "resourceProviderId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "resourceId": { + "description": "An identifier maintained by the VIM or other resource provider. It is expected to be unique within the VIM instance.\n", + "type": "string" + }, + "vimLevelResourceType": { + "description": "The value set of the \"vimLevelResourceType\" attribute is within the scope of the VIM or the resource provider and can be used as information that complements the ResourceHandle. This value set is different from the value set of the \"type\" attribute in the ResourceDefinition (refer to clause 9.5.3.2 in SOL003).\n", + "type": "string" + } + } + }, + "vnfLinkPorts": { + "description": "Link ports of this VL.\n", + "type": "array", + "items": { + "type": "object", + "required": [ + "id", + "resourceHandle" + ], + "properties": { + "id": { + "description": "An identifier that is unique for the respective type within a VNF instance, but may not be globally unique.\n", + "type": "string" + }, + "resourceHandle": { + "required": [ + "vimConnectionId", + "resourceId" + ], + "type": "object", + "description": "This type represents the information that allows addressing a virtualised resource that is used by a VNF instance. Information about the resource is available from the VIM.\n", + "properties": { + "vimConnectionId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "resourceProviderId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "resourceId": { + "description": "An identifier maintained by the VIM or other resource provider. It is expected to be unique within the VIM instance.\n", + "type": "string" + }, + "vimLevelResourceType": { + "description": "The value set of the \"vimLevelResourceType\" attribute is within the scope of the VIM or the resource provider and can be used as information that complements the ResourceHandle. This value set is different from the value set of the \"type\" attribute in the ResourceDefinition (refer to clause 9.5.3.2 in SOL003).\n", + "type": "string" + } + } + }, + "cpInstanceId": { + "description": "An identifier that is unique for the respective type within a VNF instance, but may not be globally unique.\n", + "type": "string" + }, + "cpInstanceType": { + "description": "Type of the CP instance that is identified by cpInstanceId. Shall be present if \"cpInstanceId\" is present, and shall be absent otherwise. Permitted values: VNFC_CP: The link port is connected to a VNFC CP EXT_CP: The link port is associated to an external CP.\n", + "type": "string", + "enum": [ + "VNFC_CP", + "EXT_CP" + ] + } + } + } + } + } + } + }, + "monitoringParameters": { + "description": "Active monitoring parameters.\n", + "type": "array", + "items": { + "type": "object", + "required": [ + "id", + "performanceMetric" + ], + "properties": { + "id": { + "description": "An identifier that is unique within a VNF descriptor.\n", + "type": "string" + }, + "name": { + "description": "Human readable name of the monitoring parameter, as defined in the VNFD.\n", + "type": "string" + }, + "performanceMetric": { + "description": "Performance metric that is monitored. This attribute shall contain the related \"Measurement Name\" value as defined in clause 7.2 of ETSI GS NFV-IFA 027.\n", + "type": "string" + } + } + } + }, + "localizationLanguage": { + "description": "Information about localization language of the VNF (includes e.g. strings in the VNFD). The localization languages supported by a VNF can be declared in the VNFD, and localization language selection can take place at instantiation time. The value shall comply with the format defined in IETF RFC 5646.\n", + "type": "string" + }, + "vnfcResourceInfo": { + "description": "Information about the virtualised compute and storage resources used by the VNFCs of the VNF instance.\n", + "type": "array", + "items": { + "description": "This type represents the information on virtualised compute and storage resources used by a VNFC in a VNF instance.\n", + "type": "object", + "required": [ + "id", + "vduId", + "computeResource" + ], + "properties": { + "id": { + "description": "An identifier that is unique for the respective type within a VNF instance, but may not be globally unique.\n", + "type": "string" + }, + "vduId": { + "description": "An identifier that is unique within a VNF descriptor.\n", + "type": "string" + }, + "computeResource": { + "required": [ + "vimConnectionId", + "resourceId" + ], + "type": "object", + "description": "This type represents the information that allows addressing a virtualised resource that is used by a VNF instance. Information about the resource is available from the VIM.\n", + "properties": { + "vimConnectionId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "resourceProviderId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "resourceId": { + "description": "An identifier maintained by the VIM or other resource provider. It is expected to be unique within the VIM instance.\n", + "type": "string" + }, + "vimLevelResourceType": { + "description": "The value set of the \"vimLevelResourceType\" attribute is within the scope of the VIM or the resource provider and can be used as information that complements the ResourceHandle. This value set is different from the value set of the \"type\" attribute in the ResourceDefinition (refer to clause 9.5.3.2 in SOL003).\n", + "type": "string" + } + } + }, + "storageResourceIds": { + "description": "References to the VirtualStorage resources. The value refers to a VirtualStorageResourceInfo item in the VnfInstance.\n", + "type": "array", + "items": { + "description": "An identifier that is unique for the respective type within a VNF instance, but may not be globally unique.\n", + "type": "string" + } + }, + "reservationId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "vnfcCpInfo": { + "description": "CPs of the VNFC instance. Shall be present when that particular CP of the VNFC instance is associated to an external CP of the VNF instance. May be present otherwise.\n", + "type": "array", + "items": { + "type": "object", + "required": [ + "id", + "cpdId" + ], + "properties": { + "id": { + "description": "An identifier that is unique for the respective type within a VNF instance, but may not be globally unique.\n", + "type": "string" + }, + "cpdId": { + "description": "An identifier that is unique within a VNF descriptor.\n", + "type": "string" + }, + "vnfExtCpId": { + "description": "An identifier that is unique for the respective type within a VNF instance, but may not be globally unique.\n", + "type": "string" + }, + "cpProtocolInfo": { + "description": "Network protocol information for this CP.\n", + "type": "array", + "items": { + "description": "This type describes the protocol layer(s) that a CP uses together with protocol-related information, like addresses.\n", + "required": [ + "layerProtocol" + ], + "properties": { + "layerProtocol": { + "description": "The identifier of layer(s) and protocol(s) associated to the network address information. Permitted values: IP_OVER_ETHERNET This attribute allows to signal the addition of further types of layer and protocol in future versions of the present document in a backwards-compatible way. In the current version of the present document, only IP over Ethernet is supported.\n", + "type": "string", + "enum": [ + "IP_OVER_ETHERNET" + ] + }, + "ipOverEthernet": { + "description": "This type represents information about a network address that has been assigned.\n", + "type": "object", + "properties": { + "macAddress": { + "description": "A MAC address. Representation: string that consists of groups of two hexadecimal digits, separated by hyphens or colons.\n", + "type": "string", + "format": "MAC" + }, + "ipAddresses": { + "description": "Addresses assigned to the CP instance. Each entry represents IP addresses assigned by fixed or dynamic IP address assignment per subnet.\n", + "type": "array", + "items": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "description": "The type of the IP addresses. Permitted values: IPV4, IPV6.\n", + "type": "string", + "enum": [ + "IPV4", + "IPV6" + ] + }, + "addresses": { + "description": "Fixed addresses assigned (from the subnet defined by \"subnetId\" if provided). Exactly one of \"addresses\" or \"addressRange\" shall be present.\n", + "type": "array", + "items": { + "description": "An IPV4 or IPV6 address. Representation: In case of an IPV4 address, string that consists of four decimal integers separated by dots, each integer ranging from 0 to 255. In case of an IPV6 address, string that consists of groups of zero to four hexadecimal digits, separated by colons.\n", + "type": "string", + "format": "IP" + } + }, + "isDynamic": { + "description": "Indicates whether this set of addresses was assigned dynamically (true) or based on address information provided as input from the API consumer (false). Shall be present if \"addresses\" is present and shall be absent otherwise.\n", + "type": "boolean" + }, + "addressRange": { + "description": "An IP address range used, e.g., in case of egress connections. Exactly one of \"addresses\" or \"addressRange\" shall be present.\n", + "type": "object", + "required": [ + "minAddress", + "maxAddress" + ], + "properties": { + "minAddress": { + "description": "An IPV4 or IPV6 address. Representation: In case of an IPV4 address, string that consists of four decimal integers separated by dots, each integer ranging from 0 to 255. In case of an IPV6 address, string that consists of groups of zero to four hexadecimal digits, separated by colons.\n", + "type": "string", + "format": "IP" + }, + "maxAddress": { + "description": "An IPV4 or IPV6 address. Representation: In case of an IPV4 address, string that consists of four decimal integers separated by dots, each integer ranging from 0 to 255. In case of an IPV6 address, string that consists of groups of zero to four hexadecimal digits, separated by colons.\n", + "type": "string", + "format": "IP" + } + } + }, + "subnetId": { + "description": "An IPV4 or IPV6 address. Representation: In case of an IPV4 address, string that consists of four decimal integers separated by dots, each integer ranging from 0 to 255. In case of an IPV6 address, string that consists of groups of zero to four hexadecimal digits, separated by colons.\n", + "type": "string", + "format": "IP" + } + } + } + } + } + } + } + } + }, + "vnfLinkPortId": { + "description": "An identifier that is unique for the respective type within a VNF instance, but may not be globally unique.\n", + "type": "string" + }, + "metadata": { + "description": "This type represents a list of key-value pairs. The order of the pairs in the list is not significant. In JSON, a set of keyvalue pairs is represented as an object. It shall comply with the provisions defined in clause 4 of IETF RFC 8259. In the following example, a list of key-value pairs with four keys (\"aString\", \"aNumber\", \"anArray\" and \"anObject\") is provided to illustrate that the values associated with different keys can be of different type.\n", + "type": "object" + } + } + } + }, + "metadata": { + "description": "This type represents a list of key-value pairs. The order of the pairs in the list is not significant. In JSON, a set of keyvalue pairs is represented as an object. It shall comply with the provisions defined in clause 4 of IETF RFC 8259. In the following example, a list of key-value pairs with four keys (\"aString\", \"aNumber\", \"anArray\" and \"anObject\") is provided to illustrate that the values associated with different keys can be of different type.\n", + "type": "object" + } + } + } + }, + "virtualLinkResourceInfo": { + "description": "Information about the virtualised network resources used by the VLs of the VNF instance.\n", + "type": "array", + "items": { + "description": "This type represents the information that allows addressing a virtualised resource that is used by an internal VL instance in a VNF instance.\n", + "type": "object", + "required": [ + "id", + "vnfVirtualLinkDescId", + "networkResource" + ], + "properties": { + "id": { + "description": "An identifier that is unique for the respective type within a VNF instance, but may not be globally unique.\n", + "type": "string" + }, + "vnfVirtualLinkDescId": { + "description": "An identifier that is unique within a VNF descriptor.\n", + "type": "string" + }, + "networkResource": { + "required": [ + "vimConnectionId", + "resourceId" + ], + "type": "object", + "description": "This type represents the information that allows addressing a virtualised resource that is used by a VNF instance. Information about the resource is available from the VIM.\n", + "properties": { + "vimConnectionId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "resourceProviderId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "resourceId": { + "description": "An identifier maintained by the VIM or other resource provider. It is expected to be unique within the VIM instance.\n", + "type": "string" + }, + "vimLevelResourceType": { + "description": "The value set of the \"vimLevelResourceType\" attribute is within the scope of the VIM or the resource provider and can be used as information that complements the ResourceHandle. This value set is different from the value set of the \"type\" attribute in the ResourceDefinition (refer to clause 9.5.3.2 in SOL003).\n", + "type": "string" + } + } + }, + "reservationId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "vnfLinkPorts": { + "description": "Links ports of this VL. Shall be present when the linkPort is used for external connectivity by the VNF (refer to VnfLinkPortInfo). May be present otherwise.\n", + "type": "array", + "items": { + "type": "object", + "required": [ + "id", + "resourceHandle" + ], + "properties": { + "id": { + "description": "An identifier that is unique for the respective type within a VNF instance, but may not be globally unique.\n", + "type": "string" + }, + "resourceHandle": { + "required": [ + "vimConnectionId", + "resourceId" + ], + "type": "object", + "description": "This type represents the information that allows addressing a virtualised resource that is used by a VNF instance. Information about the resource is available from the VIM.\n", + "properties": { + "vimConnectionId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "resourceProviderId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "resourceId": { + "description": "An identifier maintained by the VIM or other resource provider. It is expected to be unique within the VIM instance.\n", + "type": "string" + }, + "vimLevelResourceType": { + "description": "The value set of the \"vimLevelResourceType\" attribute is within the scope of the VIM or the resource provider and can be used as information that complements the ResourceHandle. This value set is different from the value set of the \"type\" attribute in the ResourceDefinition (refer to clause 9.5.3.2 in SOL003).\n", + "type": "string" + } + } + }, + "cpInstanceId": { + "description": "An identifier that is unique for the respective type within a VNF instance, but may not be globally unique.\n", + "type": "string" + }, + "cpInstanceType": { + "description": "Type of the CP instance that is identified by cpInstanceId. Shall be present if \"cpInstanceId\" is present, and shall be absent otherwise. Permitted values: VNFC_CP: The link port is connected to a VNFC CP EXT_CP: The link port is associated to an external CP.\n", + "type": "string", + "enum": [ + "VNFC_CP", + "EXT_CP" + ] + } + } + } + }, + "metadata": { + "description": "This type represents a list of key-value pairs. The order of the pairs in the list is not significant. In JSON, a set of keyvalue pairs is represented as an object. It shall comply with the provisions defined in clause 4 of IETF RFC 8259. In the following example, a list of key-value pairs with four keys (\"aString\", \"aNumber\", \"anArray\" and \"anObject\") is provided to illustrate that the values associated with different keys can be of different type.\n", + "type": "object" + } + } + } + }, + "virtualStorageResourceInfo": { + "description": "Information on the virtualised storage resource(s) used as storage for the VNF instance.\n", + "type": "array", + "items": { + "description": "This type represents the information that allows addressing a virtualised resource that is used by a VNF instance.\n", + "type": "object", + "required": [ + "id", + "virtualStorageDescId", + "storageResource" + ], + "properties": { + "id": { + "description": "An identifier that is unique for the respective type within a VNF instance, but may not be globally unique.\n", + "type": "string" + }, + "virtualStorageDescId": { + "description": "An identifier that is unique within a VNF descriptor.\n", + "type": "string" + }, + "storageResource": { + "required": [ + "vimConnectionId", + "resourceId" + ], + "type": "object", + "description": "This type represents the information that allows addressing a virtualised resource that is used by a VNF instance. Information about the resource is available from the VIM.\n", + "properties": { + "vimConnectionId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "resourceProviderId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "resourceId": { + "description": "An identifier maintained by the VIM or other resource provider. It is expected to be unique within the VIM instance.\n", + "type": "string" + }, + "vimLevelResourceType": { + "description": "The value set of the \"vimLevelResourceType\" attribute is within the scope of the VIM or the resource provider and can be used as information that complements the ResourceHandle. This value set is different from the value set of the \"type\" attribute in the ResourceDefinition (refer to clause 9.5.3.2 in SOL003).\n", + "type": "string" + } + } + }, + "reservationId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "metadata": { + "description": "This type represents a list of key-value pairs. The order of the pairs in the list is not significant. In JSON, a set of keyvalue pairs is represented as an object. It shall comply with the provisions defined in clause 4 of IETF RFC 8259. In the following example, a list of key-value pairs with four keys (\"aString\", \"aNumber\", \"anArray\" and \"anObject\") is provided to illustrate that the values associated with different keys can be of different type.\n", + "type": "object" + } + } + } + } + } + }, + "metadata": { + "description": "This type represents a list of key-value pairs. The order of the pairs in the list is not significant. In JSON, a set of keyvalue pairs is represented as an object. It shall comply with the provisions defined in clause 4 of IETF RFC 8259. In the following example, a list of key-value pairs with four keys (\"aString\", \"aNumber\", \"anArray\" and \"anObject\") is provided to illustrate that the values associated with different keys can be of different type.\n", + "type": "object" + }, + "extensions": { + "description": "This type represents a list of key-value pairs. The order of the pairs in the list is not significant. In JSON, a set of keyvalue pairs is represented as an object. It shall comply with the provisions defined in clause 4 of IETF RFC 8259. In the following example, a list of key-value pairs with four keys (\"aString\", \"aNumber\", \"anArray\" and \"anObject\") is provided to illustrate that the values associated with different keys can be of different type.\n", + "type": "object" + }, + "_links": { + "description": "Links to resources related to this resource.\n", + "type": "object", + "required": [ + "self" + ], + "properties": { + "self": { + "description": "This type represents a link to a resource using an absolute URI.\n", + "type": "object", + "required": [ + "href" + ], + "properties": { + "href": { + "description": "String formatted according to IETF RFC 3986.\n", + "type": "string" + } + } + }, + "indicators": { + "description": "This type represents a link to a resource using an absolute URI.\n", + "type": "object", + "required": [ + "href" + ], + "properties": { + "href": { + "description": "String formatted according to IETF RFC 3986.\n", + "type": "string" + } + } + }, + "instantiate": { + "description": "This type represents a link to a resource using an absolute URI.\n", + "type": "object", + "required": [ + "href" + ], + "properties": { + "href": { + "description": "String formatted according to IETF RFC 3986.\n", + "type": "string" + } + } + }, + "terminate": { + "description": "This type represents a link to a resource using an absolute URI.\n", + "type": "object", + "required": [ + "href" + ], + "properties": { + "href": { + "description": "String formatted according to IETF RFC 3986.\n", + "type": "string" + } + } + }, + "scale": { + "description": "This type represents a link to a resource using an absolute URI.\n", + "type": "object", + "required": [ + "href" + ], + "properties": { + "href": { + "description": "String formatted according to IETF RFC 3986.\n", + "type": "string" + } + } + }, + "scaleToLevel": { + "description": "This type represents a link to a resource using an absolute URI.\n", + "type": "object", + "required": [ + "href" + ], + "properties": { + "href": { + "description": "String formatted according to IETF RFC 3986.\n", + "type": "string" + } + } + }, + "changeFlavour": { + "description": "This type represents a link to a resource using an absolute URI.\n", + "type": "object", + "required": [ + "href" + ], + "properties": { + "href": { + "description": "String formatted according to IETF RFC 3986.\n", + "type": "string" + } + } + }, + "heal": { + "description": "This type represents a link to a resource using an absolute URI.\n", + "type": "object", + "required": [ + "href" + ], + "properties": { + "href": { + "description": "String formatted according to IETF RFC 3986.\n", + "type": "string" + } + } + }, + "operate": { + "description": "This type represents a link to a resource using an absolute URI.\n", + "type": "object", + "required": [ + "href" + ], + "properties": { + "href": { + "description": "String formatted according to IETF RFC 3986.\n", + "type": "string" + } + } + }, + "changeExtConn": { + "description": "This type represents a link to a resource using an absolute URI.\n", + "type": "object", + "required": [ + "href" + ], + "properties": { + "href": { + "description": "String formatted according to IETF RFC 3986.\n", + "type": "string" + } + } + } + } + } + } + } +} \ No newline at end of file diff --git a/interconnectedTestCases/schemas/vnfPkgInfo.schema.json b/interconnectedTestCases/schemas/vnfPkgInfo.schema.json new file mode 100644 index 000000000..d8327b459 --- /dev/null +++ b/interconnectedTestCases/schemas/vnfPkgInfo.schema.json @@ -0,0 +1,293 @@ +{ + "description": "This type represents the information of a VNF package.\nNOTE 1:\tIf the value of the onboardingState attribute is not equal to \"ONBOARDED\", the value of the operationalState \n attribute shall be equal to \"DISABLED\".\nNOTE 2:\tIf the value of the onboardingState attribute is not equal to \"ONBOARDED\", the value of the usageState attribute \n shall be equal to \"NOT_IN_USE\".\nNOTE 3:\tETSI GS NFV-SOL 001 specifies the structure and format of the VNFD based on TOSCA specifications.\n", + "type": "object", + "required": [ + "id", + "onboardingState", + "operationalState", + "usageState", + "vnfmInfo", + "_links" + ], + "properties": { + "id": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "vnfdId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "vnfdExtInvariantId": { + "description": "An identifier with the intention of being globally unique.\n", + "type": "string" + }, + "vnfProvider": { + "description": "A string defined in IETF RFC 8259.\n", + "type": "string" + }, + "vnfProductName": { + "description": "A string defined in IETF RFC 8259.\n", + "type": "string" + }, + "vnfSoftwareVersion": { + "description": "A version.\n", + "type": "string" + }, + "vnfdVersion": { + "description": "A version.\n", + "type": "string" + }, + "compatibleSpecificationVersions": { + "description": "Indicates which versions of the ETSI GS NFV-SOL 004 specification the package complies to, as defined in the manifest of the package. Each entry shall be formatted as defined in clause 4.3.2 of ETSI GS NFV-SOL 004.\n", + "type": "array", + "items": { + "description": "A version.\n", + "type": "string" + } + }, + "checksum": { + "description": "Cheksum description\n", + "type": "string" + }, + "packageSecurityOption": { + "description": "Signals the security option used by the package as defined in clause 5.1 of ETSI GS NFV-SOL 004. It shall be present after the VNF package content has been on-boarded and absent otherwise. Valid values: OPTION_1, OPTION_2\n", + "type": "string", + "enum": ["OPTION_1", "OPTION_2"] + }, + "signingCertificate": { + "description": "A string defined in IETF RFC 8259.\n", + "type": "string" + }, + "softwareImages": { + "description": "Information about VNF package artifacts that are software images. This attribute shall not be present before the VNF package content is on-boarded. Otherwise, this attribute shall be present unless it has been requested to be excluded per attribute selector.\n", + "type": "array", + "items": { + "description": "This type represents an artifact contained in or external to a VNF package which represents a software image..\n* NOTE 1:\tThe list of permitted values was taken from \"Container formats\" in OpenStack® documentation: \"Disk and container formats for images\"\n (Available at https://docs.openstack.org/glance/pike/user/formats.html).\n* NOTE 2:\tThe list of permitted values was adapted from \"Disk formats\" in OpenStack® documentation: \"Disk and container formats for images\"\n (Available at https://docs.openstack.org/glance/pike/user/formats.html).\n* NOTE 3: The attribute shall be present for VM-based software images referenced from a Vdu, and shall be absent\n otherwise.\n* NOTE 4: The attribute shall be present for software images referenced from a VirtualStorageDesc, and shall be absent\n otherwise.\n", + "type": "object", + "required": [ + "id", + "name", + "provider", + "version", + "checksum", + "isEncrypted", + "containerFormat", + "createdAt", + "size" + ], + "properties": { + "id": { + "description": "An identifier that is unique within a VNF descriptor.\n", + "type": "string" + }, + "name": { + "description": "A string defined in IETF RFC 8259.\n", + "type": "string" + }, + "provider": { + "description": "A string defined in IETF RFC 8259.\n", + "type": "string" + }, + "version": { + "description": "A version.\n", + "type": "string" + }, + "checksum": { + "description": "Cheksum description\n", + "type": "string" + }, + "isEncrypted": { + "description": "The Boolean is a data type having two values (true and false).\n", + "type": "boolean" + }, + "containerFormat": { + "description": "Container format indicates whether the software image is in a file format that also contains metadata about the actual software. Permitted values: - AKI: a kernel image format - AMI: a machine image format - ARI: a ramdisk image format - BARE: the image does not have a container or metadata envelope - DOCKER: docker container format - OVA: OVF package in a tarfile - OVF: OVF container format See note 1.\n", + "type": "string", + "enum": ["AKI", "AMI", "ARI", "BARE", "DOCKER", "OVA", "OVF"] + }, + "diskFormat": { + "description": "Disk format of a software image is the format of the underlying disk image. Permitted values:\n - AKI: a kernel image format\n - AMI: a machine image format\n - ARI: a ramdisk image format\n - ISO: an archive format for the data contents of an optical disc,\n such as CD-ROM\n - QCOW2: a common disk image format, which can expand dynamically\n and supports copy on write\n - RAW: an unstructured disk image format\n - VDI: a common disk image format\n - VHD: a common disk image format\n - VHDX: enhanced version of VHD format\n - VMDK: a common disk image format\nSee notes 2 and 3.\n", + "type": "string", + "enum": [ + "AKI", + "AMI", + "ISO", + "QCOW2", + "RAW", + "VDI", + "VHD", + "VHDX", + "VMDK" + ] + }, + "createdAt": { + "description": "Date-time stamp. Representation: String formatted according to IETF RFC 3339.\n", + "type": "string", + "format": "date-time" + }, + "minDisk": { + "description": "The minimal disk for this software image in bytes. See note 4.\n", + "type": "integer" + }, + "minRam": { + "description": "The minimal RAM for this software image in bytes. See note 3.\n", + "type": "integer" + }, + "size": { + "description": "Size of this software image in bytes.\n", + "type": "integer" + }, + "userMetadata": { + "description": "This type represents a list of key-value pairs. The order of the pairs in the list is not significant. In JSON, a set of keyvalue pairs is represented as an object. It shall comply with the provisions defined in clause 4 of IETF RFC 8259. In the following example, a list of key-value pairs with four keys (\"aString\", \"aNumber\", \"anArray\" and \"anObject\") is provided to illustrate that the values associated with different keys can be of different type.\n", + "type": "object" + }, + "imagePath": { + "description": "Path which identifies the image artifact and also allows to access a copy of the image artifact. For a software image contained as a file in the VNF package, this attribute shall be present, and the value of this attribute shall start with the name of the first segment in the path in the package, i.e., it shall not be prefixed by path separator characters such as \".\" and \"/\". EXAMPLE: foo/bar/m%40ster.vhd For an external software image represented as a URI in the VNF descriptor, this attribute shall be present if the image artifact has been downloaded by the NFVO and shall be absent otherwise. If present, it shall contain the artifactPath under which the image artifact can be obtained using the \"Individual artifact in a VNF package\" resource defined in clause 9.4.7. It is the responsibility of the NFVO to synthesize this path in a manner that avoids any collision of the synthesized artifact path with the paths and names of image artifacts included in the package.\n", + "type": "string" + }, + "imageUri": { + "description": "String formatted according to IETF RFC 3986.\n", + "type": "string" + } + } + } + }, + "additionalArtifacts": { + "description": "Information about VNF package artifacts contained in the VNF package that are not software images. Every local and external artifact declared in the manifest shall be included, except the software images and the files that make up the parts of the VNFD (see clause 10.4.4.3.2). Signature files and certificate files are not considered as artifacts, however, the content of the \"Licenses\" and \"Testing\" directories in the VNF package is. This attribute shall not be present before the VNF package content is on-boarded. Otherwise, this attribute shall be present if the VNF package contains additional artifacts.\n", + "type": "array", + "items": { + "description": "This type represents an artifact other than a software image which is contained in or external to a VNF package.\n", + "type": "object", + "required": ["artifactPath", "checksum", "isEncrypted"], + "properties": { + "artifactPath": { + "description": "A string defined in IETF RFC 8259.\n", + "type": "string" + }, + "artifactURI": { + "description": "URI of the artifact as defined in the VNF package manifest. Shall be present if the artifact is external to the package and shall be absent otherwise.\nEXAMPLE: https://example.com/m%40ster.sh\n", + "type": "array", + "items": { + "description": "String formatted according to IETF RFC 3986.\n", + "type": "string" + } + }, + "checksum": { + "description": "Cheksum description\n", + "type": "string" + }, + "isEncrypted": { + "description": "The Boolean is a data type having two values (true and false).\n", + "type": "boolean" + }, + "nonManoArtifactSetId": { + "description": "A string defined in IETF RFC 8259.\n", + "type": "string" + }, + "artifactClassification": { + "description": "Marks specific types of artifacts as defined in the VNF package. If none of the specific classes listed below applies, the attribute shall not be present.\nValid values: -\tHISTORY: a history artifact as per clause 4.3.3 in ETSI GS NFV-SOL 004 -\tTESTING: a testing artifact as per clause 4.3.4 in ETSI GS NFV-SOL 004 -\tLICENSE: a license artifact as per clause 4.3.5 in ETSI GS NFV-SOL 004\n", + "type": "string", + "enum": ["HISTORY", "TESTING", "LICENSE"] + }, + "metadata": { + "description": "This type represents a list of key-value pairs. The order of the pairs in the list is not significant. In JSON, a set of keyvalue pairs is represented as an object. It shall comply with the provisions defined in clause 4 of IETF RFC 8259. In the following example, a list of key-value pairs with four keys (\"aString\", \"aNumber\", \"anArray\" and \"anObject\") is provided to illustrate that the values associated with different keys can be of different type.\n", + "type": "object" + } + } + } + }, + "onboardingState": { + "description": "CREATED: The \"Individual VNF package\" resource has been created. UPLOADING: The associated VNF package content is being uploaded. PROCESSING: The associated VNF package content is being processed, e.g.,\n validation.\nONBOARDED: The associated VNF package content has been on-boarded successfully. ERROR: There was an error during upload of the VNF package content or external\n artifacts, or during VNF package processing.\n", + "type": "string", + "enum": ["CREATED", "UPLOADING", "PROCESSING", "ONBOARDED", "ERROR"] + }, + "operationalState": { + "description": "- ENABLED: The VNF package is enabled, i.e. it can be used for\n the creation of new \"Individual VNF instance\" resources.\n- DISABLED: The VNF package is disabled, i.e. it shall not be used for\n the creation of further \"Individual VNF instance\" resources\n (unless and until the VNF package is re-enabled).\n", + "type": "string", + "enum": ["ENABLED", "DISABLED"] + }, + "usageState": { + "description": "- IN_USE: \"Individual VNF instance\" resources created from this VNF package exist. - NOT_IN_USE: No \"Individual VNF instance\" resource created from this VNF package exists.\n", + "type": "string", + "enum": ["IN_USE", "NOT_IN_USE"] + }, + "vnfmInfo": { + "description": "A string defined in IETF RFC 8259.\n", + "type": "string" + }, + "userDefinedData": { + "description": "This type represents a list of key-value pairs. The order of the pairs in the list is not significant. In JSON, a set of keyvalue pairs is represented as an object. It shall comply with the provisions defined in clause 4 of IETF RFC 8259. In the following example, a list of key-value pairs with four keys (\"aString\", \"aNumber\", \"anArray\" and \"anObject\") is provided to illustrate that the values associated with different keys can be of different type.\n", + "type": "object" + }, + "onboardingFailureDetails": { + "description": "The definition of the general \"ProblemDetails\" data structure from IETF RFC 7807 is reproduced inthis structure. Compared to the general framework defined in IETF RFC 7807, the \"status\" and \"detail\" attributes are mandated to be included by the present document, to ensure that the response contains additional textual information about an error. IETF RFC 7807 foresees extensibility of the \"ProblemDetails\" type. It is possible that particular APIs in the present document, or particular implementations, define extensions to define additional attributes that provide more information about the error. The description column only provides some explanation of the meaning to Facilitate understanding of the design. For a full description, see IETF RFC 7807.\n", + "type": "object", + "required": ["status", "detail"], + "properties": { + "type": { + "description": "A URI reference according to IETF RFC 3986 that identifies the problem type. It is encouraged that the URI provides human-readable documentation for the problem (e.g. using HTML) when dereferenced. When this member is not present, its value is assumed to be \"about:blank\".\n", + "type": "string", + "format": "URI" + }, + "title": { + "description": "A short, human-readable summary of the problem type. It should not change from occurrence to occurrence of the problem, except for purposes of localization. If type is given and other than \"about:blank\", this attribute shall also be provided. A short, human-readable summary of the problem type. It SHOULD NOT change from occurrence to occurrence of the problem, except for purposes of localization (e.g., using proactive content negotiation; see [RFC7231], Section 3.4).\n", + "type": "string" + }, + "status": { + "description": "The HTTP status code for this occurrence of the problem. The HTTP status code ([RFC7231], Section 6) generated by the origin server for this occurrence of the problem.\n", + "type": "integer" + }, + "detail": { + "description": "A human-readable explanation specific to this occurrence of the problem.\n", + "type": "string" + }, + "instance": { + "description": "A URI reference that identifies the specific occurrence of the problem. It may yield further information if dereferenced.\n", + "type": "string", + "format": "URI" + } + } + }, + "_links": { + "description": "Links to resources related to this resource.\n", + "type": "object", + "required": ["self", "packageContent"], + "properties": { + "self": { + "description": "This type represents a link to a resource using an absolute URI.\n", + "type": "object", + "required": ["href"], + "properties": { + "href": { + "description": "String formatted according to IETF RFC 3986.\n", + "type": "string" + } + } + }, + "vnfd": { + "description": "This type represents a link to a resource using an absolute URI.\n", + "type": "object", + "required": ["href"], + "properties": { + "href": { + "description": "String formatted according to IETF RFC 3986.\n", + "type": "string" + } + } + }, + "packageContent": { + "description": "This type represents a link to a resource using an absolute URI.\n", + "type": "object", + "required": ["href"], + "properties": { + "href": { + "description": "String formatted according to IETF RFC 3986.\n", + "type": "string" + } + } + } + } + } + } +} -- GitLab From 5297a36df6d3c8c78881e5bd558c69fae9d0d820 Mon Sep 17 00:00:00 2001 From: "g.bernini" Date: Tue, 10 Sep 2024 10:17:49 +0200 Subject: [PATCH 03/21] renamed IC tetss --- ...Creation And Query.robot => VNFInstanceCreationAndQuery.robot} | 0 .../{VNF Instance Deletion.robot => VNFInstanceDeletion.robot} | 0 ...nstance Instantiation.robot => VNFInstanceInstantiation.robot} | 0 ... Instance Modification.robot => VNFInstanceModification.robot} | 0 ...NF Instance Termination.robot => VNFInstanceTermination.robot} | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename interconnectedTestCases/{VNF Instance Creation And Query.robot => VNFInstanceCreationAndQuery.robot} (100%) rename interconnectedTestCases/{VNF Instance Deletion.robot => VNFInstanceDeletion.robot} (100%) rename interconnectedTestCases/{VNF Instance Instantiation.robot => VNFInstanceInstantiation.robot} (100%) rename interconnectedTestCases/{VNF Instance Modification.robot => VNFInstanceModification.robot} (100%) rename interconnectedTestCases/{VNF Instance Termination.robot => VNFInstanceTermination.robot} (100%) diff --git a/interconnectedTestCases/VNF Instance Creation And Query.robot b/interconnectedTestCases/VNFInstanceCreationAndQuery.robot similarity index 100% rename from interconnectedTestCases/VNF Instance Creation And Query.robot rename to interconnectedTestCases/VNFInstanceCreationAndQuery.robot diff --git a/interconnectedTestCases/VNF Instance Deletion.robot b/interconnectedTestCases/VNFInstanceDeletion.robot similarity index 100% rename from interconnectedTestCases/VNF Instance Deletion.robot rename to interconnectedTestCases/VNFInstanceDeletion.robot diff --git a/interconnectedTestCases/VNF Instance Instantiation.robot b/interconnectedTestCases/VNFInstanceInstantiation.robot similarity index 100% rename from interconnectedTestCases/VNF Instance Instantiation.robot rename to interconnectedTestCases/VNFInstanceInstantiation.robot diff --git a/interconnectedTestCases/VNF Instance Modification.robot b/interconnectedTestCases/VNFInstanceModification.robot similarity index 100% rename from interconnectedTestCases/VNF Instance Modification.robot rename to interconnectedTestCases/VNFInstanceModification.robot diff --git a/interconnectedTestCases/VNF Instance Termination.robot b/interconnectedTestCases/VNFInstanceTermination.robot similarity index 100% rename from interconnectedTestCases/VNF Instance Termination.robot rename to interconnectedTestCases/VNFInstanceTermination.robot -- GitLab From 392b71fac213ed7846d3259b6c518a3d80f9fa95 Mon Sep 17 00:00:00 2001 From: "g.bernini" Date: Tue, 10 Sep 2024 10:53:22 +0200 Subject: [PATCH 04/21] udpated VNF instance creation and query test ID 11.3.1 --- interconnectedTestCases/IC_TC_keywords.robot | 119 ++++++++++++++++++ .../VNFInstanceCreationAndQuery.robot | 7 ++ 2 files changed, 126 insertions(+) diff --git a/interconnectedTestCases/IC_TC_keywords.robot b/interconnectedTestCases/IC_TC_keywords.robot index 86792ff22..32567303d 100644 --- a/interconnectedTestCases/IC_TC_keywords.robot +++ b/interconnectedTestCases/IC_TC_keywords.robot @@ -7,11 +7,20 @@ Library Process Library String Library Collections Library String +Library MockServerLibrary Variables descriptors/SOL001/VNFD/vnfd_SOL001.yaml Variables descriptors/SOL006/VNFD/vnfd_SOL006.yaml Library REST ${None} ssl_verify=${False} *** Keywords *** +Initialize System + Create Sessions + +Create Sessions + Start Process java -jar ${MOCK_SERVER_JAR} -serverPort ${callback_port} alias=mockInstance + Wait For Process handle=mockInstance timeout=5s on_timeout=continue + Create Mock Session ${callback_uri}:${callback_port} + GET Individual VNF Package [Documentation] Test ID: 7.3.3.2.1 ... Test title: GET Individual VNF Package @@ -107,6 +116,24 @@ Instantiate a vnfInstance Check HTTP Response Header Contains Location Check Individual VNF LCM operation occurrence operationState is STARTING +VNF Instantiation + [Documentation] Test ID: 7.3.1.26.1 + ... Test title: VNF Instantiation workflow + ... Test objective: The objective is to test the workflow for the instantiation of a VNF instance + ... Pre-conditions: VNF instance resources is already created. NFVO is subscribed to VNF LCM Operation Occurrence notifications + ... Reference: Clause 5.4.4 - ETSI GS NFV-SOL 003 [1] v4.4.1 + ... Config ID: Config_prod_VNFM + ... Applicability: NFVO is able to receive notifications from VNFM + ... Post-Conditions: VNF instance in INSTANTIATED state + Send VNF Instantiation Request + Check HTTP Response Status Code Is 202 + Check HTTP Response Header Contains Location + Check Operation Occurrence Id existence + Check Operation Notification For Instantiation STARTING + Check Operation Notification For Instantiation PROCESSING + Check Operation Notification For Instantiation COMPLETED + Check Postcondition VNF Status INSTANTIATED + POST Terminate a vnfInstance [Documentation] Test ID: 7.3.1.7.1 ... Test title: POST Terminate a vnfInstance @@ -413,3 +440,95 @@ Check Individual VNF LCM operation occurrence operationState is Log Validate operationState Should Be Equal as Strings ${opOccResponse['body']['operationState']} ${status} Log operationState validated + +Send VNF Instantiation Request + Log Instantiate a VNF Instance + Set Headers {"Accept":"${ACCEPT}"} + Set Headers {"Content-Type": "${CONTENT_TYPE}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + ${body}= Get File jsons/instantiateVnfRequest.json + Post ${VNFM_API_ROOT}/${VNFM_API_NAME}/${VNFM_API_MAJOR_VERSION}/vnf_instances/${vnfid}/instantiate ${body} + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} + +Configure Notification Status Handler + [Arguments] ${endpoint} ${status}="" + ${json}= Create Dictionary + ${value}= Run Keyword And Return Status Should Not Be Equal As Strings ${status} "" + Run Keyword If ${value} == True Set to dictionary ${json} operationState ${status} + Log Creating mock request and response to handle ${element} + ${notification_request}= Create Mock Request Matcher POST ${endpoint} body_type='JSON' body=${json} + &{headers}= Create Dictionary Content-Type=application/json + ${notification_response}= Create Mock Response status_code=${status} headers=${headers} + Create Mock Expectation ${notification_request} ${notification_response} + [Return] ${notification_request} + +Configure Notification VNF Instance Handler + [Arguments] ${endpoint} ${instanceId}="" + ${json}= Create Dictionary + ${value}= Run Keyword And Return Status Should Not Be Equal As Strings ${instanceId} "" + Run Keyword If ${value} == True Set to dictionary ${json} vnfInstanceId ${instanceId} + Log Creating mock request and response to handle ${element} + ${notification_request}= Create Mock Request Matcher POST ${endpoint} body_type='JSON' body=${json} + &{headers}= Create Dictionary Content-Type=application/json + ${notification_response}= Create Mock Response 204 headers=${headers} + Log ${notification_request} + Log ${notification_response} + Create Mock Expectation ${notification_request} ${notification_response} + [Return] ${notification_request} + +Configure Notification Forward + [Arguments] ${element} ${endpoint} ${endpoint_fwd} + ${json}= Get File schemas/${element}.schema.json + Log Creating mock HTTP forward to handle ${element} + ${notification_tmp}= Create Mock Request Matcher POST ${endpoint} body_type='JSON_SCHEMA' body=${json} + ${notification_fwd}= Create Mock Http Forward ${endpoint_fwd} + Create Mock Expectation With Http Forward ${notification_tmp} ${notification_fwd} + [Return] ${notification_tmp} + +Check Operation Notification + [Arguments] ${element} ${status}="" + ${json}= Get File schemas/${element}.schema.json + ${req1}= Configure Notification Forward ${element} ${callback_endpoint} ${callback_endpoint_fwd} + ${req2}= Configure Notification Status Handler ${callback_endpoint_fwd} ${status} + Wait Until Keyword Succeeds 12 sec 3 sec Verify Mock Expectation ${req2} + Clear Requests ${callback_endpoint} + Clear Requests ${callback_endpoint_fwd} + +Check VNF Instance Operation Notification + [Arguments] ${element} ${instance_id} + ${json}= Get File schemas/${element}.schema.json + ${req1}= Configure Notification Forward ${element} ${callback_endpoint} ${callback_endpoint_fwd} + ${req2}= Configure Notification VNF Instance Handler ${callback_endpoint_fwd} ${instance_id} + Wait Until Keyword Succeeds 12 sec 3 sec Verify Mock Expectation ${req2} + Clear Requests ${callback_endpoint} + Clear Requests ${callback_endpoint_fwd} + +Check Operation Notification For Instantiation + [Arguments] ${status} + Check Operation Notification VnfLcmOperationOccurrenceNotification ${status} + +Check Postcondition VNF Status + [Arguments] ${status} + Log Retrieve VNF Instance + Check VNF Instance ${vnfid} + Should Not Be Empty ${response} + Check HTTP Response Status Code Is 200 + Should Be Equal ${response['body']['id']} ${vnfInstanceId} + Check HTTP Response Header Contains Content-Type + Check HTTP Response Body Json Schema Is vnfInstance.schema.json + Check VNF Status ${response['body']['instantiationState']} ${status} + +Check VNF Instance + [Arguments] ${vnfid} + Set Headers {"Accept":"${ACCEPT}"} + Set Headers {"Content-Type": "${CONTENT_TYPE}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + Get ${VNFM_API_ROOT}/${VNFM_API_NAME}/${VNFM_API_MAJOR_VERSION}/vnf_instances/${vnfid} + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} + +Check VNF Status + [Arguments] ${current} ${expected} + Should Be Equal As Strings ${current} ${expected} + Log VNF Status in the correct status diff --git a/interconnectedTestCases/VNFInstanceCreationAndQuery.robot b/interconnectedTestCases/VNFInstanceCreationAndQuery.robot index 877113387..54df4c92e 100644 --- a/interconnectedTestCases/VNFInstanceCreationAndQuery.robot +++ b/interconnectedTestCases/VNFInstanceCreationAndQuery.robot @@ -7,6 +7,13 @@ Library JSONLibrary Create a new VNF instance resource and query information about multiple and individual VNF instance​ [Documentation] Test ID: 11.3.1 + ... Test title: Create a new VNF instance resource and query information about multiple and individual VNF instance​ + ... Test objective: The objective is to test the interconnected case of VNF instance resource creation and query multiple and individual resources + ... Pre-conditions: none + ... Reference: ETSI GS NFV-SOL 003 [1] v4.5.1 + ... Config ID: Config_prod_NFVO, Config_prod_VNFM + ... Applicability: none + ... Post-Conditions: none GET Individual VNF Package POST Create a new vnfInstance GET information about multiple VNF instances -- GitLab From 0e2df376c5659f7b561c5e05620b3a8f6d27fc25 Mon Sep 17 00:00:00 2001 From: "g.bernini" Date: Tue, 10 Sep 2024 10:54:05 +0200 Subject: [PATCH 05/21] udpated VNF instance modification test ID 11.3.2 --- interconnectedTestCases/VNFInstanceModification.robot | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/interconnectedTestCases/VNFInstanceModification.robot b/interconnectedTestCases/VNFInstanceModification.robot index 13a4a284b..acf9201fd 100644 --- a/interconnectedTestCases/VNFInstanceModification.robot +++ b/interconnectedTestCases/VNFInstanceModification.robot @@ -5,7 +5,14 @@ Library JSONLibrary *** Test Cases *** Modify an individual VNF instance resource - [Documentation] Test ID: 11.3.3 + [Documentation] Test ID: 11.3.2 + ... Test title: Modify an individual VNF instance resource + ... Test objective: The objective is to test the interconnected case of VNF instance resource creation and modification + ... Pre-conditions: none + ... Reference: ETSI GS NFV-SOL 003 [1] v4.5.1 + ... Config ID: Config_prod_NFVO, Config_prod_VNFM + ... Applicability: none + ... Post-Conditions: none GET Individual VNF Package POST Create a new vnfInstance PATCH Individual VNFInstance -- GitLab From 57e4a4dbd439e9dc40a9d831d92c9233fdeabd55 Mon Sep 17 00:00:00 2001 From: "g.bernini" Date: Tue, 10 Sep 2024 10:58:37 +0200 Subject: [PATCH 06/21] udpated VNF instance deletion test ID 11.3.3 and instantiation test id 11.3.4 --- interconnectedTestCases/VNFInstanceDeletion.robot | 11 +++++++++-- .../VNFInstanceInstantiation.robot | 11 ++++++++++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/interconnectedTestCases/VNFInstanceDeletion.robot b/interconnectedTestCases/VNFInstanceDeletion.robot index 5345b5738..edf74f20a 100644 --- a/interconnectedTestCases/VNFInstanceDeletion.robot +++ b/interconnectedTestCases/VNFInstanceDeletion.robot @@ -6,8 +6,15 @@ Library REST *** Test Cases *** -The objective is to delete a VNF instance - [Documentation] Test ID: 11.3.2 +Delete an individual VNF instance + [Documentation] Test ID: 11.3.3 + ... Test title: Delete an individual VNF instance + ... Test objective: The objective is to test the interconnected case of VNF instance resource creation and deletion + ... Pre-conditions: none + ... Reference: ETSI GS NFV-SOL 003 [1] v4.5.1 + ... Config ID: Config_prod_NFVO, Config_prod_VNFM + ... Applicability: none + ... Post-Conditions: none GET Individual VNF Package POST Create a new vnfInstance DELETE Individual VNFInstance \ No newline at end of file diff --git a/interconnectedTestCases/VNFInstanceInstantiation.robot b/interconnectedTestCases/VNFInstanceInstantiation.robot index e4087881e..34a6de333 100644 --- a/interconnectedTestCases/VNFInstanceInstantiation.robot +++ b/interconnectedTestCases/VNFInstanceInstantiation.robot @@ -1,4 +1,6 @@ *** Settings *** +Suite Setup Initialize System +Suite Teardown Terminate All Processes kill=true Resource environment/variables.txt # Generic Parameters Resource IC_TC_keywords.robot Library JSONLibrary @@ -6,6 +8,13 @@ Library JSONLibrary *** Test Cases *** Instantiate a VNF instance [Documentation] Test ID: 11.3.4 + ... Test title: Modify an individual VNF instance resource + ... Test objective: The objective is to test the interconnected case of VNF instance resource creation and modification + ... Pre-conditions: none + ... Reference: ETSI GS NFV-SOL 003 [1] v4.5.1 + ... Config ID: Config_prod_NFVO, Config_prod_VNFM + ... Applicability: none + ... Post-Conditions: none GET Individual VNF Package POST Create a new vnfInstance - Instantiate a vnfInstance + VNF Instantiation -- GitLab From 17fe5bb2c9835e3f5dfe590d15be4ccd92b917b8 Mon Sep 17 00:00:00 2001 From: "g.bernini" Date: Tue, 10 Sep 2024 11:05:15 +0200 Subject: [PATCH 07/21] udpated VNF instance termination test ID 11.3.5 --- interconnectedTestCases/IC_TC_keywords.robot | 42 ++++++++++++++++++- .../VNFInstanceTermination.robot | 16 +++++-- 2 files changed, 54 insertions(+), 4 deletions(-) diff --git a/interconnectedTestCases/IC_TC_keywords.robot b/interconnectedTestCases/IC_TC_keywords.robot index 32567303d..f3a68f4c5 100644 --- a/interconnectedTestCases/IC_TC_keywords.robot +++ b/interconnectedTestCases/IC_TC_keywords.robot @@ -121,7 +121,7 @@ VNF Instantiation ... Test title: VNF Instantiation workflow ... Test objective: The objective is to test the workflow for the instantiation of a VNF instance ... Pre-conditions: VNF instance resources is already created. NFVO is subscribed to VNF LCM Operation Occurrence notifications - ... Reference: Clause 5.4.4 - ETSI GS NFV-SOL 003 [1] v4.4.1 + ... Reference: Clause 5.4.4 - ETSI GS NFV-SOL 003 [1] v4.5.1 ... Config ID: Config_prod_VNFM ... Applicability: NFVO is able to receive notifications from VNFM ... Post-Conditions: VNF instance in INSTANTIATED state @@ -148,6 +148,24 @@ POST Terminate a vnfInstance Check HTTP Response Header Contains Location Check Individual VNF LCM operation occurrence operationState is STARTING +Terminate a VNF Instance + [Documentation] Test ID: 7.3.1.33.1 + ... Test title: Terminate a VNF Instance + ... Test objective: The objective is to terminate a VNF instance. + ... Pre-conditions: VNF instance in INSTANTIATED state + ... Reference: Clause 5.3.3 - ETSI GS NFV-SOL 003 [1] v4.5.1 + ... Config ID: Config_prod_VNFM + ... Applicability: NFVO is able to receive notifications from VNFM. + ... Post-Conditions: VNF instance in NOT_INSTANTIATED state + Send Terminate VNF Request + Check HTTP Response Status Code Is 202 + Check HTTP Response Header Contains Location + Check Operation Occurrence Id existence + Check Operation Notification For Terminate STARTING + Check Operation Notification For Terminate PROCESSING + Check Operation Notification For Terminate COMPLETED + Check Postcondition VNF Terminate + GET Individual VNF Package [keyword] Log Trying to get a VNF Package present in the NFVO Catalogue Set Headers {"Accept": "${ACCEPT_JSON}"} @@ -532,3 +550,25 @@ Check VNF Status [Arguments] ${current} ${expected} Should Be Equal As Strings ${current} ${expected} Log VNF Status in the correct status + +Send Terminate VNF Request + Log Trying to terminate a VNF instance. + Set Headers {"Accept":"${ACCEPT}"} + Set Headers {"Content-Type": "${CONTENT_TYPE}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + ${body}= Get File jsons/terminateVnfRequest.json + Post ${VNFM_API_ROOT}/${VNFM_API_NAME}/${VNFM_API_MAJOR_VERSION}/vnf_instances/${vnfid}/terminate ${body} + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} + +Check Operation Notification For Terminate + [Arguments] ${status} + Check Operation Notification VnfLcmOperationOccurrenceNotification ${status} + +Check Postcondition VNF Terminate + Check resource not Instantiated + +Check resource not Instantiated + Check VNF Instance ${vnfid} + Check HTTP Response Status Code Is 200 + Check VNF Status ${response['body']['instantiationState']} NOT_INSTANTIATED \ No newline at end of file diff --git a/interconnectedTestCases/VNFInstanceTermination.robot b/interconnectedTestCases/VNFInstanceTermination.robot index 7ea329777..296853569 100644 --- a/interconnectedTestCases/VNFInstanceTermination.robot +++ b/interconnectedTestCases/VNFInstanceTermination.robot @@ -1,12 +1,22 @@ *** Settings *** +Suite Setup Initialize System +Suite Teardown Terminate All Processes kill=true Resource environment/variables.txt # Generic Parameters Resource IC_TC_keywords.robot Library JSONLibrary *** Test Cases *** -Test that POST method terminate a VNF instance +Terminate an individual VNF instance [Documentation] Test ID: 11.3.5 + ... Test title: Terminate an individual VNF instance + ... Test objective: The objective is to test the interconnected case of VNF instance resource creation, instantiation and termination + ... Pre-conditions: none + ... Reference: ETSI GS NFV-SOL 003 [1] v4.5.1 + ... Config ID: Config_prod_NFVO, Config_prod_VNFM + ... Applicability: none + ... Post-Conditions: none GET Individual VNF Package POST Create a new vnfInstance - Instantiate a vnfInstance - POST Terminate a vnfInstance + VNF Instantiation + Terminate a VNF Instance + -- GitLab From ae47cad9c57129799a958e8f8f3240ea387c3e7f Mon Sep 17 00:00:00 2001 From: "g.bernini" Date: Tue, 10 Sep 2024 11:31:38 +0200 Subject: [PATCH 08/21] added interconnected test case for operation occurrences test id 11.3.6 --- interconnectedTestCases/IC_TC_keywords.robot | 63 ++++++++++++++++++- .../VNFInstanceOperationOccurrences.robot | 24 +++++++ .../environment/variables.txt | 1 + 3 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 interconnectedTestCases/VNFInstanceOperationOccurrences.robot diff --git a/interconnectedTestCases/IC_TC_keywords.robot b/interconnectedTestCases/IC_TC_keywords.robot index f3a68f4c5..e92e809b5 100644 --- a/interconnectedTestCases/IC_TC_keywords.robot +++ b/interconnectedTestCases/IC_TC_keywords.robot @@ -166,6 +166,33 @@ Terminate a VNF Instance Check Operation Notification For Terminate COMPLETED Check Postcondition VNF Terminate +GET status information about multiple VNF LCM Operation OCC + [Documentation] Test ID: 7.3.1.11.2 + ... Test title: GET status information about multiple VNF LCM Operation OCC + ... Test objective: The objective is to test that GET method retrieve Query status information about multiple VNF lifecycle management operation occurrences. + ... Pre-conditions: none + ... Reference: Clause 5.4.12.3.2 - ETSI GS NFV-SOL 003 [1] v4.4.1 + ... Config ID: Config_prod_VNFM + ... Applicability: none + ... Post-Conditions: none + GET VNF LCM Operation occurrences + Check HTTP Response Status Code Is 202 + Check HTTP Response Body Json Schema Is VnfLcmOpOccs + +Get Individual VNF LCM Operation occurrence + [Documentation] Test ID: 7.3.1.12.2 + ... Test title: Get Individual VNF LCM Operation occurrences + ... Test objective: The objective is to test that this method retrieve information about a VNF lifecycle management operation occurrence + ... Pre-conditions: none + ... Reference: Clause 5.4.13.3.2 - ETSI GS NFV-SOL 003 [1] v4.4.1 + ... Config ID: Config_prod_VNFM + ... Applicability: none + ... Post-Conditions: none + Get Individual VNF LCM Operation occurrence + Check HTTP Response Status Code Is 200 + Check HTTP Response Body Json Schema Is VnfLcmOpOcc + Check HTTP Response Body of Individual VNF LCM Operation occurrences content against VNF Descriptor + GET Individual VNF Package [keyword] Log Trying to get a VNF Package present in the NFVO Catalogue Set Headers {"Accept": "${ACCEPT_JSON}"} @@ -445,6 +472,7 @@ Check HTTP Response Body Json Schema Is Check Operation Occurrence Id existence ${vnfLcmOpOccId}= Get Value From Json ${response['headers']} $..Location Should Not Be Empty ${vnfLcmOpOccId} + Set Global Variable ${globalVnfLcmOpOccId} ${vnfLcmOpOccId} Check HTTP Response Header Contains [Arguments] ${CONTENT_TYPE} @@ -571,4 +599,37 @@ Check Postcondition VNF Terminate Check resource not Instantiated Check VNF Instance ${vnfid} Check HTTP Response Status Code Is 200 - Check VNF Status ${response['body']['instantiationState']} NOT_INSTANTIATED \ No newline at end of file + Check VNF Status ${response['body']['instantiationState']} NOT_INSTANTIATED + +GET VNF LCM Operation occurrences + Log Query status information about multiple VNF lifecycle management operation occurrences. + Set Headers {"Accept":"${ACCEPT}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + Log Execute Query and validate response + Get ${VNFM_API_ROOT}/${VNFM_API_NAME}/${VNFM_API_MAJOR_VERSION}/vnf_lcm_op_occs + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} + +Get Individual VNF LCM Operation occurrence + Log Query status information about multiple VNF lifecycle management operation occurrences. + Set Headers {"Accept":"${ACCEPT}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + Log Execute Query and validate response + Get ${VNFM_API_ROOT}/${VNFM_API_NAME}/${VNFM_API_MAJOR_VERSION}/vnf_lcm_op_occs/${globalVnfLcmOpOccId} + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} + +Check HTTP Response Body of Individual VNF LCM Operation occurrences content against VNF Descriptor + Run Keyword If ${check_descriptors} == 1 Check Individual VNF LCM Operation Occurence Content + +Check Individual VNF LCM Operation Occurence Content + PARSE the Descriptor File + Match the VNF LCM Operation Occurence Response Attributes with Descriptors + +Match the VNF LCM Operation Occurence Response Attributes with Descriptors + #Checking Response attributes with VNF Descriptors + Should Be Equal As Strings ${response['body']['changedInfo']['vnfdId']} ${Descriptor_ID} + Should Be Equal As Strings ${response['body']['changedInfo']['vnfdVersion']} ${Descriptor_Version} + List Should Contain Value ${VDU_IDs} ${response['body']['resourceChanges']['affectedVnfcs'][0]['vduId']} + List Should Contain value ${Storage_IDs} ${response['body']['resourceChanges']['affectedVirtualStorages'][0]['virtualStorageDescId']} + List Should Contain Value ${VirtualLink_IDs} ${response['body']['resourceChanges']['affectedVirtualLinks'][0]['virtualStorageDescId']} \ No newline at end of file diff --git a/interconnectedTestCases/VNFInstanceOperationOccurrences.robot b/interconnectedTestCases/VNFInstanceOperationOccurrences.robot new file mode 100644 index 000000000..b57fa38b5 --- /dev/null +++ b/interconnectedTestCases/VNFInstanceOperationOccurrences.robot @@ -0,0 +1,24 @@ +*** Settings *** +Suite Setup Initialize System +Suite Teardown Terminate All Processes kill=true +Resource environment/variables.txt # Generic Parameters +Resource IC_TC_keywords.robot +Library JSONLibrary + +*** Test Cases *** +Retrieve VNF instance Operation Occurences + [Documentation] Test ID: 11.3.6 + ... Test title: Retrieve VNF instance Operation Occurences + ... Test objective: The objective is to test the interconnected case of VNF instance resource, creation, instantiation and retrieval of information about VNF lifecycle management operation occurrences + ... Pre-conditions: none + ... Reference: ETSI GS NFV-SOL 003 [1] v4.5.1 + ... Config ID: Config_prod_NFVO, Config_prod_VNFM + ... Applicability: none + ... Post-Conditions: none + GET Individual VNF Package + POST Create a new vnfInstance + VNF Instantiation + GET status information about multiple VNF LCM Operation OCC + Get Individual VNF LCM Operation occurrence + + diff --git a/interconnectedTestCases/environment/variables.txt b/interconnectedTestCases/environment/variables.txt index 5e4a62352..0bfe1ade5 100644 --- a/interconnectedTestCases/environment/variables.txt +++ b/interconnectedTestCases/environment/variables.txt @@ -52,6 +52,7 @@ ${vnfSnapshotInfoId_InUse} snapshotId-of-a-resource-AlreadyInUse-bySomeOther- ${vnfSnapshotInfoId_creationIncomplete} snapshotId-of-a-resource-whose-creation-isn't-complete ${invalidVnfSnapshotInfoId} ${vnfSnapshotPkgId} +${globalVnfLcmOpOccId} 6fc3539c-e602-4afa-8e13-962fb5a7d81d ${vnfLcmOpOccId} 6fc3539c-e602-4afa-8e13-962fb5a7d81d ${notExistingVnfLcmOpOccId} 6fc3539c-e602-4afa-8e13-962fb5a7d81d ${vnfLcmOpOccIdNotStartingProcessingRollingback} 6fc3539c-e602-4afa-8e13-962fb5a7d81d -- GitLab From a9625a2b687d2a28638366d2fba50b2e78bfc69d Mon Sep 17 00:00:00 2001 From: "g.bernini" Date: Tue, 10 Sep 2024 11:36:28 +0200 Subject: [PATCH 09/21] added missing json request body files --- .../jsons/instantiateVnfRequest.json | 79 +++++++++++++++++++ .../jsons/terminateVnfRequest.json | 4 + 2 files changed, 83 insertions(+) create mode 100644 interconnectedTestCases/jsons/instantiateVnfRequest.json create mode 100644 interconnectedTestCases/jsons/terminateVnfRequest.json diff --git a/interconnectedTestCases/jsons/instantiateVnfRequest.json b/interconnectedTestCases/jsons/instantiateVnfRequest.json new file mode 100644 index 000000000..15624dcb5 --- /dev/null +++ b/interconnectedTestCases/jsons/instantiateVnfRequest.json @@ -0,0 +1,79 @@ +{{ + "flavourId": "myFlavour", + "instantiationLevelId": "string", + "extVirtualLinks": [ + { + "id": "string", + "vimConnectionId": "string", + "resourceProviderId": "string", + "resourceId": "string", + "extCps": [ + { + "cpdId": "string", + "cpConfig": [ + { + "cpInstanceId": "string", + "linkPortId": "string", + "cpProtocolData": [ + { + "layerProtocol": "IP_OVER_ETHERNET", + "ipOverEthernet": { + "macAddress": "string", + "ipAddresses": [ + { + "type": "IPV4", + "fixedAddresses": [ + "string" + ], + "numDynamicAddresses": 0, + "addressRange": { + "minAddress": "string", + "maxAddress": "string" + }, + "subnetId": "string" + } + ] + } + } + ] + } + ] + } + ], + "extLinkPorts": [ + { + "id": "string", + "resourceHandle": { + "vimConnectionId": "string", + "resourceProviderId": "string", + "resourceId": "string", + "vimLevelResourceType": "string" + } + } + ] + } + ], + "extManagedVirtualLinks": [ + { + "id": "string", + "virtualLinkDescId": "string", + "vimConnectionId": "string", + "resourceProviderId": "string", + "resourceId": "string" + } + ], + "vimConnectionInfo": [ + { + "id": "string", + "vimId": "string", + "vimType": "string", + "interfaceInfo": {}, + "accessInfo": {}, + "extra": {} + } + ], + "localizationLanguage": "English", + "extensions": {}, + "additionalParams": {}, + "vnfConfigurableProperties": {} + }} \ No newline at end of file diff --git a/interconnectedTestCases/jsons/terminateVnfRequest.json b/interconnectedTestCases/jsons/terminateVnfRequest.json new file mode 100644 index 000000000..bc9553a2e --- /dev/null +++ b/interconnectedTestCases/jsons/terminateVnfRequest.json @@ -0,0 +1,4 @@ +{{ + "terminationType": "{terminationType}", + "additionalParams": {{}} +}} \ No newline at end of file -- GitLab From bdf6fcc0dc4ad92b43f628eaccadb6405eef50f6 Mon Sep 17 00:00:00 2001 From: "g.bernini" Date: Tue, 10 Sep 2024 12:20:11 +0200 Subject: [PATCH 10/21] added interconnected test case for subscription creation and query test id 11.3.7 --- interconnectedTestCases/IC_TC_keywords.robot | 109 +++++++++++++++++- .../SubscriptionCreationAndQuery.robot | 22 ++++ .../environment/variables.txt | 1 + .../jsons/lccnSubscriptionRequest.json | 10 ++ 4 files changed, 139 insertions(+), 3 deletions(-) create mode 100644 interconnectedTestCases/SubscriptionCreationAndQuery.robot create mode 100644 interconnectedTestCases/jsons/lccnSubscriptionRequest.json diff --git a/interconnectedTestCases/IC_TC_keywords.robot b/interconnectedTestCases/IC_TC_keywords.robot index e92e809b5..16512a715 100644 --- a/interconnectedTestCases/IC_TC_keywords.robot +++ b/interconnectedTestCases/IC_TC_keywords.robot @@ -171,7 +171,7 @@ GET status information about multiple VNF LCM Operation OCC ... Test title: GET status information about multiple VNF LCM Operation OCC ... Test objective: The objective is to test that GET method retrieve Query status information about multiple VNF lifecycle management operation occurrences. ... Pre-conditions: none - ... Reference: Clause 5.4.12.3.2 - ETSI GS NFV-SOL 003 [1] v4.4.1 + ... Reference: Clause 5.4.12.3.2 - ETSI GS NFV-SOL 003 [1] v4.5.1 ... Config ID: Config_prod_VNFM ... Applicability: none ... Post-Conditions: none @@ -184,7 +184,7 @@ Get Individual VNF LCM Operation occurrence ... Test title: Get Individual VNF LCM Operation occurrences ... Test objective: The objective is to test that this method retrieve information about a VNF lifecycle management operation occurrence ... Pre-conditions: none - ... Reference: Clause 5.4.13.3.2 - ETSI GS NFV-SOL 003 [1] v4.4.1 + ... Reference: Clause 5.4.13.3.2 - ETSI GS NFV-SOL 003 [1] v4.5.1 ... Config ID: Config_prod_VNFM ... Applicability: none ... Post-Conditions: none @@ -193,6 +193,58 @@ Get Individual VNF LCM Operation occurrence Check HTTP Response Body Json Schema Is VnfLcmOpOcc Check HTTP Response Body of Individual VNF LCM Operation occurrences content against VNF Descriptor +POST Create a new subscription + [Documentation] Test ID: 7.3.1.17.1 + ... Test title: POST Create a new subscription + ... Test objective: The POST method creates a new subscription + ... Pre-conditions: none + ... Reference: Clause 5.4.18.3.1 - ETSI GS NFV-SOL 003 [1] v4.5.1 + ... Config ID: Config_prod_VNFM + ... Applicability: none + ... Post-Conditions: in response header Location shall not be null + Post Create subscription + Check HTTP Response Status Code Is 201 + Check HTTP Response Body Json Schema Is Subscription + +GET Subscriptions + [Documentation] Test ID: 7.3.1.17.4 + ... Test title: GET Subscriptions + ... Test objective: The objective is Get the list of active subscriptions + ... Pre-conditions: none + ... Reference: Clause 5.4.18.3.2 - ETSI GS NFV-SOL 003 [1] v4.5.1 + ... Config ID: Config_prod_VNFM + ... Applicability: none + ... Post-Conditions: none + Get subscriptions [keyword] + Check HTTP Response Status Code Is 200 + Check HTTP Response Body Json Schema Is Subscriptions + +GET Individual Subscription + [Documentation] Test ID: 7.3.1.18.2 + ... Test title: GET Individual Subscription + ... Test objective: The objective is to test the Get individual subscription + ... Pre-conditions: none + ... Reference: Clause 5.4.19.3.2 - ETSI GS NFV-SOL 003 [1] v4.5.1 + ... Config ID: Config_prod_VNFM + ... Applicability: none + ... Post-Conditions: none + Get Individual Subscription [keyword] + Check HTTP Response Status Code Is 200 + Check HTTP Response Body Json Schema Is Subscription + +DELETE an individual subscription + [Documentation] Test ID: 7.3.1.18.5 + ... Test title: DELETE an individual subscription + ... Test objective: The objective is to test that the individual subscription is succesfully deleted + ... Pre-conditions: none + ... Reference: Clause 5.4.19.3.5 - ETSI GS NFV-SOL 003 [1] v4.5.1 + ... Config ID: Config_prod_VNFM + ... Applicability: none + ... Post-Conditions: Subscription deleted from VNFM + Delete Individual subscription + Check HTTP Response Status Code Is 204 + Check Postcondition Subscription Resource is Deleted + GET Individual VNF Package [keyword] Log Trying to get a VNF Package present in the NFVO Catalogue Set Headers {"Accept": "${ACCEPT_JSON}"} @@ -632,4 +684,55 @@ Match the VNF LCM Operation Occurence Response Attributes with Descriptors Should Be Equal As Strings ${response['body']['changedInfo']['vnfdVersion']} ${Descriptor_Version} List Should Contain Value ${VDU_IDs} ${response['body']['resourceChanges']['affectedVnfcs'][0]['vduId']} List Should Contain value ${Storage_IDs} ${response['body']['resourceChanges']['affectedVirtualStorages'][0]['virtualStorageDescId']} - List Should Contain Value ${VirtualLink_IDs} ${response['body']['resourceChanges']['affectedVirtualLinks'][0]['virtualStorageDescId']} \ No newline at end of file + List Should Contain Value ${VirtualLink_IDs} ${response['body']['resourceChanges']['affectedVirtualLinks'][0]['virtualStorageDescId']} + +Post Create subscription + Log Create subscription instance by POST to ${VNFM_API_ROOT}/${VNFM_API_NAME}/${VNFM_API_MAJOR_VERSION}/subscriptions + Set Headers {"Accept":"${ACCEPT}"} + Set Headers {"Content-Type": "${CONTENT_TYPE}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + ${template}= Get File jsons/lccnSubscriptionRequest.json + ${body}= Format String ${template} callback_uri=${callback_uri}:${callback_port} callback_endpoint=${callback_endpoint} + Log Creating mock request and response to handle GET operation on notification endpoint + &{notification_request}= Create Mock Request Matcher GET ${callback_endpoint} + &{notification_response}= Create Mock Response status_code=204 + Log Issue the subscription request + Create Mock Expectation ${notification_request} ${notification_response} + Post ${VNFM_API_ROOT}/${VNFM_API_NAME}/${VNFM_API_MAJOR_VERSION}/subscriptions ${body} allow_redirects=false + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} + Set Global Variable ${globalSubscriptionId} ${outputResponse['body']['id']} + Log Verify notification endpoint is tested + Verify Mock Expectation ${notification_request} + Clear Requests ${callback_endpoint} + +Get subscriptions [keyword] + Log Get the list of active subscriptions + Set Headers {"Accept":"${ACCEPT}"} + Set Headers {"Content-Type": "${CONTENT_TYPE}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + Log Execute Query and validate response + Get ${VNFM_API_ROOT}/${VNFM_API_NAME}/${VNFM_API_MAJOR_VERSION}/subscriptions + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} + +Get Individual subscription [keyword] + log Trying to get information about an individual subscription + Set Headers {"Accept":"${ACCEPT}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + Get ${VNFM_API_ROOT}/${VNFM_API_NAME}/${VNFM_API_MAJOR_VERSION}/subscriptions/${globalSubscriptionId} + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} + +Delete Individual subscription + log Try to delete an individual subscription + Set Headers {"Accept":"${ACCEPT}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + Delete ${VNFM_API_ROOT}/${VNFM_API_NAME}/${VNFM_API_MAJOR_VERSION}/subscriptions/${globalSubscriptionId} + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} + +Check Postcondition Subscription Resource Is Deleted + Get Individual subscription [keyword] + Integer response status 404 + Log Subscription Resource deleted \ No newline at end of file diff --git a/interconnectedTestCases/SubscriptionCreationAndQuery.robot b/interconnectedTestCases/SubscriptionCreationAndQuery.robot new file mode 100644 index 000000000..802f6256a --- /dev/null +++ b/interconnectedTestCases/SubscriptionCreationAndQuery.robot @@ -0,0 +1,22 @@ +*** Settings *** +Resource environment/variables.txt # Generic Parameters +Resource IC_TC_keywords.robot +Library JSONLibrary + +*** Test Cases *** + +Create a new subscription and query information about multiple and individual subscription resources​ + [Documentation] Test ID: 11.3.7 + ... Test title: Create a new subscription and query information about multiple and individual subscription resources​ + ... Test objective: The objective is to test the interconnected case of subscription resource creation and query multiple and individual resources + ... Pre-conditions: none + ... Reference: ETSI GS NFV-SOL 003 [1] v4.5.1 + ... Config ID: Config_prod_NFVO, Config_prod_VNFM + ... Applicability: none + ... Post-Conditions: none + GET Individual VNF Package + POST Create a new subscription + GET Subscriptions + GET Individual Subscription + + diff --git a/interconnectedTestCases/environment/variables.txt b/interconnectedTestCases/environment/variables.txt index 0bfe1ade5..99ed96653 100644 --- a/interconnectedTestCases/environment/variables.txt +++ b/interconnectedTestCases/environment/variables.txt @@ -46,6 +46,7 @@ ${notInstantiatedVnfInstanceId} 6fc3539c-e602-4afa-8e13-962fb5a7d81f ${notExistingVnfInstanceId} 6fc3539c-e602-4afa-8e13-962fb5a7d81f ${vnfInstanceId} 6fc3539c-e602-4afa-8e13-962fb5a7d81f ${subscriptionId} 6fc3539c-e602-4afa-8e13-962fb5a7d81f +${globalSubscriptionId} 6fc3539c-e602-4afa-8e13-962fb5a7d81f ${vnfInstanceId_NoSnapshotTask} no-snapshot-task-supported ${vnfSnapshotInfoId} ${vnfSnapshotInfoId_InUse} snapshotId-of-a-resource-AlreadyInUse-bySomeOther-operation diff --git a/interconnectedTestCases/jsons/lccnSubscriptionRequest.json b/interconnectedTestCases/jsons/lccnSubscriptionRequest.json new file mode 100644 index 000000000..9ba2f5047 --- /dev/null +++ b/interconnectedTestCases/jsons/lccnSubscriptionRequest.json @@ -0,0 +1,10 @@ +{{ + "filter": {{ + "vnfInstanceSubscriptionFilter": {{ + "vnfdIds": [ + "6fc3539c-e602-4afa-8e13-962fb5a7d81f" + ] + }} + }}, + "callbackUri": "{callback_uri}{callback_endpoint}" +}} -- GitLab From 9f64d913e605f7b1c2288a7587369bc33873681f Mon Sep 17 00:00:00 2001 From: "g.bernini" Date: Tue, 10 Sep 2024 12:20:22 +0200 Subject: [PATCH 11/21] added interconnected test case for subscription deletion test id 11.3.8 --- .../SubscriptionDeletion.robot | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 interconnectedTestCases/SubscriptionDeletion.robot diff --git a/interconnectedTestCases/SubscriptionDeletion.robot b/interconnectedTestCases/SubscriptionDeletion.robot new file mode 100644 index 000000000..d72a16125 --- /dev/null +++ b/interconnectedTestCases/SubscriptionDeletion.robot @@ -0,0 +1,24 @@ +*** Settings *** +Resource environment/variables.txt # Generic Parameters +Resource IC_TC_keywords.robot +Library JSONLibrary + +*** Test Cases *** + +Delete individual subscription + [Documentation] Test ID: 11.3.7 + ... Test title: Delete individual subscription + ... Test objective: The objective is to test the interconnected case of subscription resource creation and deletion + ... Pre-conditions: none + ... Reference: ETSI GS NFV-SOL 003 [1] v4.5.1 + ... Config ID: Config_prod_NFVO, Config_prod_VNFM + ... Applicability: none + ... Post-Conditions: Subscription deleted from VNFM + GET Individual VNF Package + POST Create a new subscription + GET Subscriptions + GET Individual Subscription + DELETE an individual subscription + + + -- GitLab From 0128f7e84c2b2f87935a709339fd6613cc75dc2e Mon Sep 17 00:00:00 2001 From: "g.bernini" Date: Tue, 10 Sep 2024 12:26:19 +0200 Subject: [PATCH 12/21] update title test id 11.3.4 --- interconnectedTestCases/VNFInstanceInstantiation.robot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interconnectedTestCases/VNFInstanceInstantiation.robot b/interconnectedTestCases/VNFInstanceInstantiation.robot index 34a6de333..a55e78810 100644 --- a/interconnectedTestCases/VNFInstanceInstantiation.robot +++ b/interconnectedTestCases/VNFInstanceInstantiation.robot @@ -8,7 +8,7 @@ Library JSONLibrary *** Test Cases *** Instantiate a VNF instance [Documentation] Test ID: 11.3.4 - ... Test title: Modify an individual VNF instance resource + ... Test title: Instantiate a VNF instance ... Test objective: The objective is to test the interconnected case of VNF instance resource creation and modification ... Pre-conditions: none ... Reference: ETSI GS NFV-SOL 003 [1] v4.5.1 -- GitLab From 75fdd97daf7f01d85e160d4599b6d759628019f5 Mon Sep 17 00:00:00 2001 From: "g.bernini" Date: Tue, 10 Sep 2024 12:44:41 +0200 Subject: [PATCH 13/21] added interconnected test case for vnf instance scale out test id 11.3.9 --- interconnectedTestCases/IC_TC_keywords.robot | 86 ++++++++++++++++++- .../VNFInstanceScaleOut.robot | 21 +++++ .../environment/variables.txt | 2 + 3 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 interconnectedTestCases/VNFInstanceScaleOut.robot diff --git a/interconnectedTestCases/IC_TC_keywords.robot b/interconnectedTestCases/IC_TC_keywords.robot index 16512a715..0ff080314 100644 --- a/interconnectedTestCases/IC_TC_keywords.robot +++ b/interconnectedTestCases/IC_TC_keywords.robot @@ -245,6 +245,34 @@ DELETE an individual subscription Check HTTP Response Status Code Is 204 Check Postcondition Subscription Resource is Deleted +VNF Instance Scale Out + [Documentation] Test ID: 7.3.1.32.1 + ... Test title: VNF Instance Scale Out workflow + ... Test objective: The objective is to test the workflow for the scaling out a VNF instance + ... Pre-conditions: VNF instance in INSTANTIATED state (Test ID 5.4.4.1). NFVO is subscribed to VNF LCM Operation Occurrence notifications (Test ID 5.4.20.1) + ... Reference: Clause 5.4.5 - ETSI GS NFV-SOL 003 [1] v4.4.1 + ... Config ID: Config_prod_VNFM + ... Applicability: NFVO is able to receive notifications from VNFM. Scale operation is supported for the VNF (as capability in the VNFD) + ... Post-Conditions: VNF instance still in INSTANTIATED state and VNF is scaled out + Send VNF Scale Out Request + Check HTTP Response Status Code Is 202 + Check HTTP Response Header Contains Location + Check Operation Occurrence Id existence + Check Operation Notification For Scale STARTING + Check Operation Notification For Scale PROCESSING + Check Operation Notification For Scale COMPLETED + Check Postcondition VNF SCALE_OUT + +VNF Instance Scale In + Send VNF Scale In Request + Check HTTP Response Status Code Is 202 + Check HTTP Response Header Contains Location + Check Operation Occurrence Id existence + Check Operation Notification For Scale STARTING + Check Operation Notification For Scale PROCESSING + Check Operation Notification For Scale COMPLETED + Check Postcondition VNF SCALE_IN + GET Individual VNF Package [keyword] Log Trying to get a VNF Package present in the NFVO Catalogue Set Headers {"Accept": "${ACCEPT_JSON}"} @@ -735,4 +763,60 @@ Delete Individual subscription Check Postcondition Subscription Resource Is Deleted Get Individual subscription [keyword] Integer response status 404 - Log Subscription Resource deleted \ No newline at end of file + Log Subscription Resource deleted + +Send VNF Scale Out Request + Log Trying to scale a vnf Instance + Set Headers {"Accept":"${ACCEPT}"} + Set Headers {"Content-Type": "${CONTENT_TYPE}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + ${template}= Get File jsons/scaleVnfRequest.json + ${body}= Format String ${template} scaletype=${scaleOutType} scaleAspectId=${scaleAspectId} + Post ${VNFM_API_ROOT}/${VNFM_API_NAME}/${VNFM_API_MAJOR_VERSION}/vnf_instances/${vnfid}/scale ${body} + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} + +Send VNF Scale In Request + Log Trying to scale a vnf Instance + Set Headers {"Accept":"${ACCEPT}"} + Set Headers {"Content-Type": "${CONTENT_TYPE}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + ${template}= Get File jsons/scaleVnfRequest.json + ${body}= Format String ${template} scaletype=${scaleInType} scaleAspectId=${scaleAspectId} + Post ${VNFM_API_ROOT}/${VNFM_API_NAME}/${VNFM_API_MAJOR_VERSION}/vnf_instances/${vnfid}/scale ${body} + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} + +Check Postcondition VNF + [Arguments] ${operation} + Check resource instantiated + ${newScaleInfo}= Get Vnf Scale Info ${vnfInstanceId} + Compare ScaleInfos ${operation} ${scaleInfo} ${newScaleInfo} + +Compare ScaleInfos + [Arguments] ${type} ${old_scaleinfo} ${new_scaleinfo} + FOR ${element} IN ${old_scaleinfo} + ${old_level}= Set Variable If ${element.aspectId}==${aspectId} ${element.scaleLevel} + ${old_level_value}= Convert To Integer ${old_level} + END + FOR ${element} IN ${new_scaleinfo} + ${new_level}= Set Variable If ${element.aspectId}==${aspectId} ${element.scaleLevel} + ${new_level_value}= Convert To Integer ${new_level} + END + Run Keyword If ${type}==SCALE_OUT Should Be True ${old_level_value}<${new_level_value} + ... ELSE Should Be True ${old_level_value}<${new_level_value} + +Check Operation Notification For Scale + [Arguments] ${status} + Check Operation Notification VnfLcmOperationOccurrenceNotification ${status} + +Check resource Instantiated + Check VNF Instance ${vnfid} + Check HTTP Response Status Code Is 200 + Check VNF Status ${response['body']['instantiationState']} INSTANTIATED + +Get Vnf Scale Info + [Arguments] ${vnfInstanceId} + ${vnfInstance}= Check VNF Instance ${vnfid} + ${scaleInfo}= Get Value From Json ${vnfInstance} $..scaleStatus + [Return] ${scaleInfo} \ No newline at end of file diff --git a/interconnectedTestCases/VNFInstanceScaleOut.robot b/interconnectedTestCases/VNFInstanceScaleOut.robot new file mode 100644 index 000000000..fd0dd4acd --- /dev/null +++ b/interconnectedTestCases/VNFInstanceScaleOut.robot @@ -0,0 +1,21 @@ +*** Settings *** +Suite Setup Initialize System +Suite Teardown Terminate All Processes kill=true +Resource environment/variables.txt # Generic Parameters +Resource IC_TC_keywords.robot +Library JSONLibrary + +*** Test Cases *** +Scale Out a VNF instance + [Documentation] Test ID: 11.3.4 + ... Test title: Scale Out a VNF instance + ... Test objective: The objective is to test the interconnected case of VNF instance resource creation, instantiation and scale out + ... Pre-conditions: none + ... Reference: ETSI GS NFV-SOL 003 [1] v4.5.1 + ... Config ID: Config_prod_NFVO, Config_prod_VNFM + ... Applicability: none + ... Post-Conditions: none + GET Individual VNF Package + POST Create a new vnfInstance + VNF Instantiation + VNF Instance Scale Out diff --git a/interconnectedTestCases/environment/variables.txt b/interconnectedTestCases/environment/variables.txt index 99ed96653..2b71e62de 100644 --- a/interconnectedTestCases/environment/variables.txt +++ b/interconnectedTestCases/environment/variables.txt @@ -87,6 +87,8 @@ ${MOCK_SERVER_JAR} ../../../bin/mockserver-netty-5.5.0-jar-with-dependencies. ${vnfdId} VNF-B ${vnfdId_notInEnabledState} vnfdId-which-is-not-in-ENABLED-state-or-DNE ${scaletype} SCALE_OUT +${scaleOutType} SCALE_OUT +${scaleInType} SCALE_IN ${scaleAspectId} myAspect ${instantiationLevelId} myNextLevel ${newFlavourId} myFlavour_new -- GitLab From 543189aa5430e638d48cfb4cd18d24a0d54c0cc4 Mon Sep 17 00:00:00 2001 From: "g.bernini" Date: Tue, 10 Sep 2024 12:44:56 +0200 Subject: [PATCH 14/21] added interconnected test case for vnf instance scale in test id 11.3.10 --- .../VNFInstanceScaleIn.robot | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 interconnectedTestCases/VNFInstanceScaleIn.robot diff --git a/interconnectedTestCases/VNFInstanceScaleIn.robot b/interconnectedTestCases/VNFInstanceScaleIn.robot new file mode 100644 index 000000000..3b730eb21 --- /dev/null +++ b/interconnectedTestCases/VNFInstanceScaleIn.robot @@ -0,0 +1,21 @@ +*** Settings *** +Suite Setup Initialize System +Suite Teardown Terminate All Processes kill=true +Resource environment/variables.txt # Generic Parameters +Resource IC_TC_keywords.robot +Library JSONLibrary + +*** Test Cases *** +Scale In a VNF instance + [Documentation] Test ID: 11.3.4 + ... Test title: Scale In a VNF instance + ... Test objective: The objective is to test the interconnected case of VNF instance resource creation, instantiation and scale in + ... Pre-conditions: none + ... Reference: ETSI GS NFV-SOL 003 [1] v4.5.1 + ... Config ID: Config_prod_NFVO, Config_prod_VNFM + ... Applicability: none + ... Post-Conditions: none + GET Individual VNF Package + POST Create a new vnfInstance + VNF Instantiation + VNF Instance Scale In -- GitLab From 5cec604599f4bc004312e1ba423058cf7456fb24 Mon Sep 17 00:00:00 2001 From: Giacomo Bernini Date: Tue, 10 Sep 2024 12:29:31 +0000 Subject: [PATCH 15/21] Update validate.sh to validate interconnected Test Cases --- scripts/validate.sh | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/scripts/validate.sh b/scripts/validate.sh index d6beb0447..43c7379c5 100644 --- a/scripts/validate.sh +++ b/scripts/validate.sh @@ -17,6 +17,18 @@ for i in */*/*.robot ; do fi done +for i in */*.robot ; do + if [[ "$i" != *"Keywords.robot"* && "$i" != *"Keyword.robot"* ]] ; then + echo "++++ Dryrun file $i" + msg=$(robot --dryrun --output NONE --report NONE --log NONE $i 2>&1) + if [ $? != 0 ] ; then + echo "++++ Issues found in file $i" + echo "$msg" + res=1 + fi + fi +done + echo "Using git branch $1" mkdir -p /home/etsi/dev/build -- GitLab From 287927511a059fa89c23968878291d3a9682d83e Mon Sep 17 00:00:00 2001 From: Giacomo Bernini Date: Tue, 10 Sep 2024 12:37:23 +0000 Subject: [PATCH 16/21] reverted validate.sh --- scripts/validate.sh | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/scripts/validate.sh b/scripts/validate.sh index 43c7379c5..d6beb0447 100644 --- a/scripts/validate.sh +++ b/scripts/validate.sh @@ -17,18 +17,6 @@ for i in */*/*.robot ; do fi done -for i in */*.robot ; do - if [[ "$i" != *"Keywords.robot"* && "$i" != *"Keyword.robot"* ]] ; then - echo "++++ Dryrun file $i" - msg=$(robot --dryrun --output NONE --report NONE --log NONE $i 2>&1) - if [ $? != 0 ] ; then - echo "++++ Issues found in file $i" - echo "$msg" - res=1 - fi - fi -done - echo "Using git branch $1" mkdir -p /home/etsi/dev/build -- GitLab From 20fcea8f2f5f929bc68152c1b0415caebdb645ef Mon Sep 17 00:00:00 2001 From: "g.bernini" Date: Tue, 10 Sep 2024 14:53:46 +0200 Subject: [PATCH 17/21] fixed VNF instance modification test id 11.3.2 --- interconnectedTestCases/IC_TC_keywords.robot | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/interconnectedTestCases/IC_TC_keywords.robot b/interconnectedTestCases/IC_TC_keywords.robot index 0ff080314..d77d6c81b 100644 --- a/interconnectedTestCases/IC_TC_keywords.robot +++ b/interconnectedTestCases/IC_TC_keywords.robot @@ -98,7 +98,7 @@ PATCH Individual VNFInstance ... Config ID: Config_prod_VNFM ... Applicability: none ... Post-Conditions: VNFInstance modified - PATCH individual vnfInstance + PATCH individual vnfInstance [keyword] Check HTTP Response Status Code Is 202 Check Operation Occurrence Id existence @@ -188,7 +188,7 @@ Get Individual VNF LCM Operation occurrence ... Config ID: Config_prod_VNFM ... Applicability: none ... Post-Conditions: none - Get Individual VNF LCM Operation occurrence + Get Individual VNF LCM Operation occurrence [keyword] Check HTTP Response Status Code Is 200 Check HTTP Response Body Json Schema Is VnfLcmOpOcc Check HTTP Response Body of Individual VNF LCM Operation occurrences content against VNF Descriptor @@ -690,7 +690,7 @@ GET VNF LCM Operation occurrences ${outputResponse}= Output response Set Global Variable ${response} ${outputResponse} -Get Individual VNF LCM Operation occurrence +Get Individual VNF LCM Operation occurrence [keyword] Log Query status information about multiple VNF lifecycle management operation occurrences. Set Headers {"Accept":"${ACCEPT}"} Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} -- GitLab From f87b1637fe94eaa555f01c2f647eb73b4f5315f7 Mon Sep 17 00:00:00 2001 From: "g.bernini" Date: Tue, 10 Sep 2024 15:58:55 +0200 Subject: [PATCH 18/21] fixed name of keywords file --- .../{IC_TC_keywords.robot => IC_TC_Keywords.robot} | 0 interconnectedTestCases/SubscriptionCreationAndQuery.robot | 2 +- interconnectedTestCases/SubscriptionDeletion.robot | 2 +- interconnectedTestCases/VNFInstanceCreationAndQuery.robot | 2 +- interconnectedTestCases/VNFInstanceDeletion.robot | 2 +- interconnectedTestCases/VNFInstanceInstantiation.robot | 2 +- interconnectedTestCases/VNFInstanceModification.robot | 2 +- interconnectedTestCases/VNFInstanceOperationOccurrences.robot | 2 +- interconnectedTestCases/VNFInstanceScaleIn.robot | 2 +- interconnectedTestCases/VNFInstanceScaleOut.robot | 2 +- interconnectedTestCases/VNFInstanceTermination.robot | 2 +- 11 files changed, 10 insertions(+), 10 deletions(-) rename interconnectedTestCases/{IC_TC_keywords.robot => IC_TC_Keywords.robot} (100%) diff --git a/interconnectedTestCases/IC_TC_keywords.robot b/interconnectedTestCases/IC_TC_Keywords.robot similarity index 100% rename from interconnectedTestCases/IC_TC_keywords.robot rename to interconnectedTestCases/IC_TC_Keywords.robot diff --git a/interconnectedTestCases/SubscriptionCreationAndQuery.robot b/interconnectedTestCases/SubscriptionCreationAndQuery.robot index 802f6256a..ccb883126 100644 --- a/interconnectedTestCases/SubscriptionCreationAndQuery.robot +++ b/interconnectedTestCases/SubscriptionCreationAndQuery.robot @@ -1,6 +1,6 @@ *** Settings *** Resource environment/variables.txt # Generic Parameters -Resource IC_TC_keywords.robot +Resource IC_TC_Keywords.robot Library JSONLibrary *** Test Cases *** diff --git a/interconnectedTestCases/SubscriptionDeletion.robot b/interconnectedTestCases/SubscriptionDeletion.robot index d72a16125..f05827bb5 100644 --- a/interconnectedTestCases/SubscriptionDeletion.robot +++ b/interconnectedTestCases/SubscriptionDeletion.robot @@ -1,6 +1,6 @@ *** Settings *** Resource environment/variables.txt # Generic Parameters -Resource IC_TC_keywords.robot +Resource IC_TC_Keywords.robot Library JSONLibrary *** Test Cases *** diff --git a/interconnectedTestCases/VNFInstanceCreationAndQuery.robot b/interconnectedTestCases/VNFInstanceCreationAndQuery.robot index 54df4c92e..fe6f459c7 100644 --- a/interconnectedTestCases/VNFInstanceCreationAndQuery.robot +++ b/interconnectedTestCases/VNFInstanceCreationAndQuery.robot @@ -1,6 +1,6 @@ *** Settings *** Resource environment/variables.txt # Generic Parameters -Resource IC_TC_keywords.robot +Resource IC_TC_Keywords.robot Library JSONLibrary *** Test Cases *** diff --git a/interconnectedTestCases/VNFInstanceDeletion.robot b/interconnectedTestCases/VNFInstanceDeletion.robot index edf74f20a..b389f8d11 100644 --- a/interconnectedTestCases/VNFInstanceDeletion.robot +++ b/interconnectedTestCases/VNFInstanceDeletion.robot @@ -1,6 +1,6 @@ *** Settings *** Resource environment/variables.txt # Generic Parameters -Resource IC_TC_keywords.robot +Resource IC_TC_Keywords.robot Library JSONLibrary Library REST *** Test Cases *** diff --git a/interconnectedTestCases/VNFInstanceInstantiation.robot b/interconnectedTestCases/VNFInstanceInstantiation.robot index a55e78810..e8060fe09 100644 --- a/interconnectedTestCases/VNFInstanceInstantiation.robot +++ b/interconnectedTestCases/VNFInstanceInstantiation.robot @@ -2,7 +2,7 @@ Suite Setup Initialize System Suite Teardown Terminate All Processes kill=true Resource environment/variables.txt # Generic Parameters -Resource IC_TC_keywords.robot +Resource IC_TC_Keywords.robot Library JSONLibrary *** Test Cases *** diff --git a/interconnectedTestCases/VNFInstanceModification.robot b/interconnectedTestCases/VNFInstanceModification.robot index acf9201fd..a33d96c61 100644 --- a/interconnectedTestCases/VNFInstanceModification.robot +++ b/interconnectedTestCases/VNFInstanceModification.robot @@ -1,6 +1,6 @@ *** Settings *** Resource environment/variables.txt # Generic Parameters -Resource IC_TC_keywords.robot +Resource IC_TC_Keywords.robot Library JSONLibrary *** Test Cases *** diff --git a/interconnectedTestCases/VNFInstanceOperationOccurrences.robot b/interconnectedTestCases/VNFInstanceOperationOccurrences.robot index b57fa38b5..a634ecc0b 100644 --- a/interconnectedTestCases/VNFInstanceOperationOccurrences.robot +++ b/interconnectedTestCases/VNFInstanceOperationOccurrences.robot @@ -2,7 +2,7 @@ Suite Setup Initialize System Suite Teardown Terminate All Processes kill=true Resource environment/variables.txt # Generic Parameters -Resource IC_TC_keywords.robot +Resource IC_TC_Keywords.robot Library JSONLibrary *** Test Cases *** diff --git a/interconnectedTestCases/VNFInstanceScaleIn.robot b/interconnectedTestCases/VNFInstanceScaleIn.robot index 3b730eb21..83663a764 100644 --- a/interconnectedTestCases/VNFInstanceScaleIn.robot +++ b/interconnectedTestCases/VNFInstanceScaleIn.robot @@ -2,7 +2,7 @@ Suite Setup Initialize System Suite Teardown Terminate All Processes kill=true Resource environment/variables.txt # Generic Parameters -Resource IC_TC_keywords.robot +Resource IC_TC_Keywords.robot Library JSONLibrary *** Test Cases *** diff --git a/interconnectedTestCases/VNFInstanceScaleOut.robot b/interconnectedTestCases/VNFInstanceScaleOut.robot index fd0dd4acd..531ac2818 100644 --- a/interconnectedTestCases/VNFInstanceScaleOut.robot +++ b/interconnectedTestCases/VNFInstanceScaleOut.robot @@ -2,7 +2,7 @@ Suite Setup Initialize System Suite Teardown Terminate All Processes kill=true Resource environment/variables.txt # Generic Parameters -Resource IC_TC_keywords.robot +Resource IC_TC_Keywords.robot Library JSONLibrary *** Test Cases *** diff --git a/interconnectedTestCases/VNFInstanceTermination.robot b/interconnectedTestCases/VNFInstanceTermination.robot index 296853569..6afb091c3 100644 --- a/interconnectedTestCases/VNFInstanceTermination.robot +++ b/interconnectedTestCases/VNFInstanceTermination.robot @@ -2,7 +2,7 @@ Suite Setup Initialize System Suite Teardown Terminate All Processes kill=true Resource environment/variables.txt # Generic Parameters -Resource IC_TC_keywords.robot +Resource IC_TC_Keywords.robot Library JSONLibrary *** Test Cases *** -- GitLab From c8ebca94b20e726dda84176c1601df1aeeec97db Mon Sep 17 00:00:00 2001 From: "g.bernini" Date: Tue, 24 Sep 2024 15:03:13 +0200 Subject: [PATCH 19/21] updated tosca reference descriptor - resolve SOL WG comment/feedback --- .../descriptors/SOL001/VNFD/vnfd_SOL001.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interconnectedTestCases/descriptors/SOL001/VNFD/vnfd_SOL001.yaml b/interconnectedTestCases/descriptors/SOL001/VNFD/vnfd_SOL001.yaml index e770a8cd4..5d9806bd0 100644 --- a/interconnectedTestCases/descriptors/SOL001/VNFD/vnfd_SOL001.yaml +++ b/interconnectedTestCases/descriptors/SOL001/VNFD/vnfd_SOL001.yaml @@ -1,4 +1,4 @@ -tosca_definitions_version: tosca_simple_yaml_1_2 +tosca_definitions_version: tosca_simple_yaml_1_3 description: "TST010 reference VNF-B" imports: @@ -44,7 +44,7 @@ node_types: type: list entry_schema: type: string - default: [ 'etsivnfm:v2.3.1' ] + default: [ 'etsivnfm:v4.5.1' ] interfaces: Vnflcm: type: "tosca.interfaces.nfv.Vnflcm" -- GitLab From 9dc45398b632dd8516eeeea7122cdda2dbf9fe89 Mon Sep 17 00:00:00 2001 From: "g.bernini" Date: Wed, 25 Sep 2024 10:47:47 +0200 Subject: [PATCH 20/21] updated tosca reference descriptor - resolve SOL WG comment/feedback --- .../descriptors/SOL001/VNFD/vnfd_SOL001.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interconnectedTestCases/descriptors/SOL001/VNFD/vnfd_SOL001.yaml b/interconnectedTestCases/descriptors/SOL001/VNFD/vnfd_SOL001.yaml index 5d9806bd0..2ca16800d 100644 --- a/interconnectedTestCases/descriptors/SOL001/VNFD/vnfd_SOL001.yaml +++ b/interconnectedTestCases/descriptors/SOL001/VNFD/vnfd_SOL001.yaml @@ -2,7 +2,7 @@ tosca_definitions_version: tosca_simple_yaml_1_3 description: "TST010 reference VNF-B" imports: - - https://forge.etsi.org/rep/nfv/SOL001/raw/v2.8.1/etsi_nfv_sol001_vnfd_types.yaml + - https://forge.etsi.org/rep/nfv/SOL001/raw/v4.4.1/etsi_nfv_sol001_vnfd_types.yaml metadata: descriptor_id: "VNF-B" -- GitLab From 813b7638dac107b5c08d582302be594cd3b272da Mon Sep 17 00:00:00 2001 From: "g.bernini" Date: Wed, 25 Sep 2024 14:29:47 +0200 Subject: [PATCH 21/21] updated test Ids and titles to align with TST010 annex J --- interconnectedTestCases/SubscriptionDeletion.robot | 2 +- interconnectedTestCases/VNFInstanceOperationOccurrences.robot | 2 +- interconnectedTestCases/VNFInstanceScaleIn.robot | 2 +- interconnectedTestCases/VNFInstanceScaleOut.robot | 2 +- interconnectedTestCases/VNFInstanceTermination.robot | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/interconnectedTestCases/SubscriptionDeletion.robot b/interconnectedTestCases/SubscriptionDeletion.robot index f05827bb5..26f42bf91 100644 --- a/interconnectedTestCases/SubscriptionDeletion.robot +++ b/interconnectedTestCases/SubscriptionDeletion.robot @@ -6,7 +6,7 @@ Library JSONLibrary *** Test Cases *** Delete individual subscription - [Documentation] Test ID: 11.3.7 + [Documentation] Test ID: 11.3.8 ... Test title: Delete individual subscription ... Test objective: The objective is to test the interconnected case of subscription resource creation and deletion ... Pre-conditions: none diff --git a/interconnectedTestCases/VNFInstanceOperationOccurrences.robot b/interconnectedTestCases/VNFInstanceOperationOccurrences.robot index a634ecc0b..e719f6dc5 100644 --- a/interconnectedTestCases/VNFInstanceOperationOccurrences.robot +++ b/interconnectedTestCases/VNFInstanceOperationOccurrences.robot @@ -6,7 +6,7 @@ Resource IC_TC_Keywords.robot Library JSONLibrary *** Test Cases *** -Retrieve VNF instance Operation Occurences +Retrieve VNF instance Operation Occurrences [Documentation] Test ID: 11.3.6 ... Test title: Retrieve VNF instance Operation Occurences ... Test objective: The objective is to test the interconnected case of VNF instance resource, creation, instantiation and retrieval of information about VNF lifecycle management operation occurrences diff --git a/interconnectedTestCases/VNFInstanceScaleIn.robot b/interconnectedTestCases/VNFInstanceScaleIn.robot index 83663a764..7a661237b 100644 --- a/interconnectedTestCases/VNFInstanceScaleIn.robot +++ b/interconnectedTestCases/VNFInstanceScaleIn.robot @@ -7,7 +7,7 @@ Library JSONLibrary *** Test Cases *** Scale In a VNF instance - [Documentation] Test ID: 11.3.4 + [Documentation] Test ID: 11.3.10 ... Test title: Scale In a VNF instance ... Test objective: The objective is to test the interconnected case of VNF instance resource creation, instantiation and scale in ... Pre-conditions: none diff --git a/interconnectedTestCases/VNFInstanceScaleOut.robot b/interconnectedTestCases/VNFInstanceScaleOut.robot index 531ac2818..fd9c5222b 100644 --- a/interconnectedTestCases/VNFInstanceScaleOut.robot +++ b/interconnectedTestCases/VNFInstanceScaleOut.robot @@ -7,7 +7,7 @@ Library JSONLibrary *** Test Cases *** Scale Out a VNF instance - [Documentation] Test ID: 11.3.4 + [Documentation] Test ID: 11.3.9 ... Test title: Scale Out a VNF instance ... Test objective: The objective is to test the interconnected case of VNF instance resource creation, instantiation and scale out ... Pre-conditions: none diff --git a/interconnectedTestCases/VNFInstanceTermination.robot b/interconnectedTestCases/VNFInstanceTermination.robot index 6afb091c3..096a66c3f 100644 --- a/interconnectedTestCases/VNFInstanceTermination.robot +++ b/interconnectedTestCases/VNFInstanceTermination.robot @@ -6,7 +6,7 @@ Resource IC_TC_Keywords.robot Library JSONLibrary *** Test Cases *** -Terminate an individual VNF instance +Terminate a VNF instance [Documentation] Test ID: 11.3.5 ... Test title: Terminate an individual VNF instance ... Test objective: The objective is to test the interconnected case of VNF instance resource creation, instantiation and termination -- GitLab