--- /dev/null
+{
+ "requestDetails":{
+ "modelInfo":{
+ "modelInvariantId": "{{service_model_invariant_uuid}}",
+ "modelVersionId":"{{service_model_uuid}}",
+ "modelName":"{{service_model_name}}",
+ "modelType":"service",
+ "modelVersion":"1.0"
+ },
+ "owningEntity":{
+ "owningEntityId":"{{owningEntityId}}",
+ "owningEntityName":"{{owningEntityName}}"
+ },
+ "subscriberInfo":{
+ "globalSubscriberId":"{{full_customer_name}}"
+ },
+ "requestInfo":{
+ "instanceName":"{{service_name}}",
+ "productFamilyId":"{{productFamilyId}}",
+ "source":"VID",
+ "suppressRollback": False,
+ "requestorId":"demo"
+ },
+ "requestParameters":{
+ "subscriptionServiceType":"{{service}}",
+ "aLaCarte": False,
+ "userParams":[
+ {
+ "service":{
+ "modelInfo":{
+ "modelVersionId":"{{service_model_uuid}}",
+ "modelName":"{{service_model_name}}",
+ "modelType":"service"
+ },
+ "instanceName":"{{service_name}}",
+ "instanceParams":[
+ ],
+ "resources":{
+ "pnfs":[
+ {
+ "modelInfo":{
+ "modelCustomizationName":"{{nf_resource_name}}",
+ "modelCustomizationId":"{{nf_resource_uuid}}",
+ "modelInvariantId":"{{nf_model_invariant_uuid}}",
+ "modelVersionId":"{{nf_model_uuid}}",
+ "modelName":"{{nf_model_name}}",
+ "modelType":"pnf",
+ "modelVersion":"1.0"
+ },
+ "platform":{
+ "platformName":"{{platformName}}"
+ },
+ "lineOfBusiness":{
+ "lineOfBusinessName":"{{lineOfBusinessName}}"
+ },
+ "productFamilyId":"{{productFamilyId}}",
+ "instanceParams":[],
+ "instanceName":"{{nf_instance_name}}"
+ },
+ ]
+ }
+ }
+ },
+ {
+ "Homing_Solution":"none"
+ }
+ ]
+ }
+ }
+}
\ No newline at end of file
[Documentation] Deletes a customer in A&AI
[Arguments] ${customer_id} ${resource_version_id}
${put_resp}= AAI.Run Delete Request ${AAI_FRONTEND_ENDPOINT} ${INDEX PATH}${ROOT_CUSTOMER_PATH}${customer_id} ${resource_version_id} auth=${GLOBAL_AAI_AUTHENTICATION}
- Should Be Equal As Strings ${put_resp.status_code} 204
\ No newline at end of file
+ Should Be Equal As Strings ${put_resp.status_code} 204
+
+Get OwningEntity Id
+ [Documentation] Returns OwningEntity Id based on OwningEntity name
+ [Arguments] ${name}
+ ${resp}= AAI.Run Get Request ${AAI_FRONTEND_ENDPOINT} /aai/v11/business/owning-entities auth=${GLOBAL_AAI_AUTHENTICATION}
+ @{list}= Copy List ${resp.json['owning-entity']}
+ :FOR ${map} IN @{list}
+ \ ${owning_entity_name}= Run Keyword And Ignore Error Get From Dictionary ${map} owning-entity-name
+ \ ${owning_entity_id}= Run Keyword And Ignore Error Get From Dictionary ${map} owning-entity-id
+ \ ${id} Run Keyword If '${owning_entity_name}' == '${name}' Set Variable ${owning_entity_id}
+ [Return] ${id}
\ No newline at end of file
Run Keyword If '${status}' == 'PASS' Update Service Dictionary ${dict} ${resp.json()}
[Return] ${dict}
+Get Service Id
+ [Documentation] Gets a service id in A&AI
+ [Arguments] ${service_description}
+ ${resp}= AAI.Run Get Request ${AAI_FRONTEND_ENDPOINT} ${INDEX PATH}${ROOT_SERVICE_PATH} auth=${GLOBAL_AAI_AUTHENTICATION}
+ @{list}= Copy List ${resp.json['service']}
+ :FOR ${map} IN @{list}
+ \ ${service_type}= Run Keyword And Ignore Error Get From Dictionary ${map} service-description
+ \ ${service_id}= Run Keyword And Ignore Error Get From Dictionary ${map} service-id
+ \ ${id} Run Keyword If '${service_type}' == '${service_description}' Set Variable ${service_id}
+ [Return] ${id}
+
Update Service Dictionary
[Arguments] ${dict} ${json}
@{list}= Copy List ${json['service']}
... ELSE Get Regexp Matches ${zip} ${service}_(.*)\.zip 1
# Need to be able to distribute preload for vFWCL vFWSNK and vFWDT vFWSNK to prepend service to vnf_type
\ ${resource_type_string}= Set Variable If len(${resource_type_match})==0 ${service} ${service}${resource_type_match[0]}
- \ Set To Dictionary ${resource_types} ${resource_type_string} ${loop_catalog_resource_id}
+ \ Set To Dictionary ${resource_types} ${resource_type_string} ${loop_catalog_resource_id}
\ Append To List ${catalog_resource_ids} ${loop_catalog_resource_id}
ServiceMapping.Set Directory default ${GLOBAL_SERVICE_MAPPING_DIRECTORY}
Get Generic NeutronNet UUID
[Documentation] Look up the UUID of the Generic NeutronNetwork Resource
- ${resp}= SDC.Run Get Request ${SDC_BE_ENDPOINT} ${SDC_CATALOG_RESOURCES_QUERY_PATH}/Generic%20NeutronNet/resourceVersion/1.0 ${SDC_DESIGNER_USER_ID} auth=${GLOBAL_SDC_AUTHENTICATION}
- [Return] ${resp.json()['allVersions']['1.0']}
+ ${json}= Get Resource Catalog Generic%20NeutronNet
+ [Return] ${json['allVersions']['1.0']}
Get AllottedResource UUID
[Documentation] Look up the UUID of the Allotted Resource
# if this fails then the AllottedResource template got deleted from SDC by mistake
- ${resp}= SDC.Run Get Request ${SDC_BE_ENDPOINT} ${SDC_CATALOG_RESOURCES_QUERY_PATH}/AllottedResource/resourceVersion/1.0 ${SDC_DESIGNER_USER_ID} auth=${GLOBAL_SDC_AUTHENTICATION}
- [Return] ${resp.json()['allVersions']['1.0']}
+ ${json}= Get Resource Catalog AllottedResource
+ [Return] ${json['allVersions']['1.0']}
+
+Get Resource Catalog
+ [Arguments] ${resource_name}
+ ${resp}= SDC.Run Get Request ${SDC_BE_ENDPOINT} ${SDC_CATALOG_RESOURCES_QUERY_PATH}/${resource_name}/resourceVersion/1.0 ${SDC_DESIGNER_USER_ID} auth=${GLOBAL_SDC_AUTHENTICATION}
+ [Return] ${resp.json()}
Loop Over Check Catalog Service Distributed
[Arguments] ${catalog_service_id}
${resp}= SDC.Run Post Request ${SDC_BE_ONBOARD_ENDPOINT} ${SDC_VENDOR_LICENSE_MODEL_PATH} ${data} ${SDC_DESIGNER_USER_ID} auth=${GLOBAL_SDC_AUTHENTICATION}
Should Be Equal As Strings ${resp.status_code} 200
[Return] ${resp.json()['itemId']} ${resp.json()['version']['id']}
-
+
Get SDC License Model
[Documentation] gets an SDC license model by its id
[Arguments] ${id} ${version_id}=0.1
[Return] ${resp.json()}
Get Service Catalog
- [Arguments] ${service_name}
+ [Arguments] ${service_name}
${resp}= SDC.Run Get Request ${SDC_BE_ENDPOINT} ${SDC_CATALOG_SERVICES_PATH}/serviceName/${service_name}/serviceVersion/1.0 ${SDC_DESIGNER_USER_ID} auth=${GLOBAL_SDC_AUTHENTICATION}
[Return] ${resp.json()}
${resp}= SDC.Run Get Request ${SDC_BE_ENDPOINT} ${SDC_CATALOG_SERVICES_PATH}${SDC_CATALOG_SERVICE_DISTRIBUTION_PATH}/${catalog_service_distribution_id} ${SDC_DESIGNER_USER_ID} auth=${GLOBAL_SDC_AUTHENTICATION}
Should Be Equal As Strings ${resp.status_code} 200
[Return] ${resp.json()}
-
+
Run SDC Health Check
[Documentation] Runs a SDC health check
${resp}= SDC.Run Get Request ${SDC_FE_ENDPOINT} ${SDC_HEALTH_CHECK_PATH} user=${None}
Set Input Parameter
- [Arguments] ${service_uuid} ${component_uuid} ${input} ${input_type} ${input_value}
+ [Arguments] ${service_uuid} ${component_uuid} ${input} ${input_type} ${input_value}
${resp}= SDC.Run Post Request ${SDC_BE_ENDPOINT} ${SDC_CATALOG_SERVICES_PATH}/${service_uuid}/resourceInstance/${component_uuid}/inputs {"constraints":[],"name":"${input['name']}","parentUniqueId":"${input['parentUniqueId']}","password":false,"required":false,"schema":{"property":{}},"type":"${input_type}","uniqueId":"${input['uniqueId']}","value":"${input_value}","definition":false,"toscaPresentation":{"ownerId":"${input['ownerId']}"}} ${SDC_DESIGNER_USER_ID} auth=${GLOBAL_SDC_AUTHENTICATION}
Should Be Equal As Strings ${resp.status_code} 200
--- /dev/null
+*** Settings ***
+Documentation Creates a macro service recipe in SO Catalog DB
+
+Library OperatingSystem
+Library Collections
+Library ONAPLibrary.SO WITH NAME SO
+Library ONAPLibrary.Templating WITH NAME Templating
+Resource ../global_properties.robot
+
+*** Variables ***
+${CREATE_SERVICE_PATH} /onap/so/infra/serviceInstantiation/v7/serviceInstances
+
+${SYSTEM USER} robot-ete
+${CREATE_PNF_SERVICE_GR_API} so/create_pnf_service_building_block.jinja
+
+*** Keywords ***
+Create PNF Service Using GR Api
+ [Documentation] Creates a PNF service using GR Api
+ [Arguments] ${arguments}
+ Templating.Create Environment so ${GLOBAL_TEMPLATE_FOLDER}
+ ${data}= Templating.Apply Template so ${CREATE_PNF_SERVICE_GR_API} ${arguments}
+ ${auth}= Create List ${GLOBAL_SO_USERNAME} ${GLOBAL_SO_PASSWORD}
+ ${request_id} ${service_instance_id} SO.Run Create Request ${GLOBAL_SO_ENDPOINT} ${CREATE_SERVICE_PATH} ${data} auth=${auth}
+ [Return] ${request_id} ${service_instance_id}
\ No newline at end of file
Resource ../openstack/neutron_interface.robot
Resource ../sdc_interface.robot
Resource vnf_orchestration_test_template.robot
+Resource ../so/create_service_instance.robot
Library ONAPLibrary.Openstack
*** Keywords ***
-Orchestrate PNF
+Orchestrate PNF Macro Flow
[Documentation] Use ONAP to Orchestrate a PNF Macro service.
- [Arguments] ${customer_name} ${service} ${product_family} ${pnf_correlation_id} ${tenant_id} ${tenant_name} ${service_model_type} ${project_name}=Project-Demonstration ${owning_entity}=OE-Demonstration
+ [Arguments] ${customer_name} ${service} ${product_family} ${pnf_correlation_id} ${tenant_id} ${tenant_name} ${service_model_type} ${project_name}=Project-Demonstration ${owning_entity}=OE-Demonstration
${lcp_region}= Set Variable ${GLOBAL_INJECTED_REGION}
${uuid}= Generate UUID4
${full_customer_name}= Catenate ${customer_name}_${uuid}
- ${list}= Create List
${service_name}= Catenate Service_Ete_Name${uuid}
${service_type}= Set Variable ${service}
Create Customer For PNF ${full_customer_name} ${full_customer_name} INFRA ${service_type} ${GLOBAL_AAI_CLOUD_OWNER} ${tenant_id} ${GLOBAL_INJECTED_REGION}
Wait Until Keyword Succeeds 60s 20s Validate Service Instance ${service_instance_id} ${service} ${full_customer_name}
[Return] ${service_instance_id} ${request_id} ${full_customer_name}
+Orchestrate PNF Building Block Flow
+ [Documentation] Use ONAP to Orchestrate a PNF using GR api
+ [Arguments] ${service_model_name} ${customer_name} ${service} ${product_family} ${pnf_correlation_id} ${project_name}=Project-Demonstration ${owning_entity}=OE-Demonstration ${lineOfBusinessName}=LOB-Demonstration ${platformName}=Platform-Demonstration
+ ${service_ctalog_json}= Get Service Catalog ${service_model_name}
+ ${service_model_uuid}= Set Variable ${json_resp["uuid"]}
+ ${service_model_invariant_uuid }= Set Variable ${json_resp["invariantUUID"]}
+ ${nf_resource_name}= Set Variable ${json_resp["componentInstances"][0]["name"]}
+ ${nf_resource_uuid}= Set Variable ${json_resp["componentInstances"][0]["customizationUUID"]}
+ ${componentName}= Set Variable ${json_resp["componentInstances"][0]["componentName"]}
+ ${resource_ctalog_json}= Get Resource Catalog ${componentName}
+ ${nf_model_invariant_uuid}= Set Variable ${json_resp["invariantUUID"]}
+ ${nf_model_uuid}= Set Variable ${json_resp["uuid]}
+ ${nf_model_name}= Set Variable ${json_resp["name"]}
+ ${productFamilyId}= Get Service Id ${product_family}
+ ${owningEntityId}= Get Owning Entity Id ${owningEntityName}
+ ${uuid}= Generate UUID4
+ ${full_customer_name}= Catenate ${customer_name}_${uuid}
+ ${service_name}= Catenate Service_Ete_Name${uuid}
+ ${service_type}= Set Variable ${service}
+ Create Customer For PNF ${full_customer_name} ${full_customer_name} INFRA ${service_type} ${GLOBAL_AAI_CLOUD_OWNER} ${tenant_id} ${GLOBAL_INJECTED_REGION}
+ ${arguments}= Create Dictionary service_model_invariant_uuid=${service_model_invariant_uuid}
+ Set To Dictionary ${arguments} service_model_uuid ${service_model_uuid}
+ Set To Dictionary ${arguments} service_model_name ${service_model_name}
+ Set To Dictionary ${arguments} owningEntityId ${owningEntityId}
+ Set To Dictionary ${arguments} owningEntityName ${owningEntityName}
+ Set To Dictionary ${arguments} full_customer_name ${full_customer_name}
+ Set To Dictionary ${arguments} service_name ${service_name}
+ Set To Dictionary ${arguments} productFamilyId ${productFamilyId}
+ Set To Dictionary ${arguments} service ${service}
+ Set To Dictionary ${arguments} nf_resource_name ${nf_resource_name}
+ Set To Dictionary ${arguments} nf_resource_uuid ${nf_resource_uuid}
+ Set To Dictionary ${arguments} nf_model_invariant_uuid ${nf_model_invariant_uuid}
+ Set To Dictionary ${arguments} nf_model_uuid ${nf_model_uuid}
+ Set To Dictionary ${arguments} nf_model_name ${nf_model_name}
+ Set To Dictionary ${arguments} platformName ${platformName}
+ Set To Dictionary ${arguments} lineOfBusinessName ${lineOfBusinessName}
+ Set To Dictionary ${arguments} productFamilyId ${productFamilyId}
+ Set To Dictionary ${arguments} nf_instance_name ${pnf_correlation_id}
+ ${request_id} ${service_instance_id}= Create PNF Service Using GR Api ${arguments}
+ Wait Until Keyword Succeeds 60s 20s Validate Service Instance ${service_instance_id} ${service} ${full_customer_name}
+ Check PNF orchestration status in A&AI ${pnf_correlation_id} register
+ [Return] ${service_instance_id} ${request_id}
+
Create Customer For PNF
[Documentation] PNF Orchestration Test setup....
*** Settings ***
Documentation PNF Registration Handler (PRH) test cases
Resource ../aai/aai_interface.robot
+Resource ../aai/create_customer.robot
Resource ../sdc_interface.robot
Resource ../mr_interface.robot
Resource ../so/add_service_recipe.robot
Should Be Equal As Strings ${json_resp["pnf-name"]} ${PNF_entry_dict.correlation_id}
Log PNF integration request in A&AI has been verified and contains all necessary entries
+Check PNF orchestration status in A&AI
+ [Documentation] Query PNF A&AI updated entry
+ [Arguments] ${PNF_entry_dict} ${status}
+ ${get_resp}= AAI.Run Get Request ${AAI_FRONTEND_ENDPOINT} /aai/v11/network/pnfs/pnf/${pnf_correlation_id} auth=${GLOBAL_AAI_AUTHENTICATION}
+ Should Be Equal As Strings ${get_resp.status_code} 200
+ ${json_resp}= Set Variable ${get_resp.json()}
+ Should Be Equal As Strings ${status} ${PNF_entry_dict.orchestrationStatus}
+
Check VES_PNFREG_OUTPUT topic presence in MR
[Documentation] Verify if unauthenticated.VES_PNFREG_OUTPUT topic is present in MR
${get_resp}= Run MR Get Request ${DMAAP_MESSAGE_ROUTER_UNAUTHENTICATED_VES_PNFREG_OUTPUT_PATH}
${so_status}= Set Variable ${so_status_request_data['request']['requestStatus']['requestState']}
Should Be Equal As Strings ${so_status} ${so_expected_status}
-
Instantiate PNF_macro service and succesfully registrate PNF template
[Documentation] Test case template for design, create, instantiate PNF/macro service and succesfully registrate PNF
- [Arguments] ${service_name} ${PNF_entry_dict} ${pnf_correlation_id} ${service}=pNF ${product_family}=pNF ${customer_name}=ETE_Customer
+ [Arguments] ${service_name} ${PNF_entry_dict} ${pnf_correlation_id} ${service}=pNF ${product_family}=pNF ${customer_name}=ETE_Customer ${building_block_flow}=false
Log To Console \nDistributing TOSCA Based PNF Model
${catalog_service_name} ${catalog_resource_name} ${vf_modules} ${catalog_resources} ${catalog_resource_ids} ${catalog_service_id} Model Distribution For Directory ${service} ${service_name} cds=False instantiationType=Macro resourceType=PNF
${UUID}= Get Service Model Parameter from SDC Service Catalog ${service_name} uuid
- Log To Console Creating Service Recipe for TOSCA Based PNF Model
- ${service_recipe_id}= Add Service Recipe ${UUID} mso/async/services/CreateVcpeResCustService_simplified
+ ${service_recipe_id}= Run Keyword If "${building_block_flow}"=='false' Add Service Recipe ${UUID} mso/async/services/CreateVcpeResCustService_simplified
Inventory Tenant If Not Exists CloudOwner ${region} SharedNode OwnerType v1 CloudZone ${tenant_id} ${tenant_name}
Load OwningEntity project Project-${customer_name}
Load OwningEntity owningEntity OE-${customer_name}
- ${service_instance_id} ${request_id} ${full_customer_name} Orchestrate PNF ${customer_name} ${service} ${product_family} ${pnf_correlation_id} ${tenant_id} ${tenant_name} ${service_name} Project-${customer_name} OE-${customer_name}
+ Load OwningEntity lineOfBusiness LOB-${customer_name}
+ Load OwningEntity platform Platform-${customer_name}
+ ${service_instance_id} ${request_id} ${full_customer_name} Run Keyword If "${building_block_flow}"=='false' Orchestrate PNF Macro Flow ${customer_name} ${service} ${product_family} ${pnf_correlation_id} ${tenant_id} ${tenant_name} ${service_name} Project-${customer_name} OE-${customer_name}
+ ... ELSE Orchestrate PNF Building Block Flow ${service_model_name} ${customer_name} ${service} ${product_family} ${pnf_correlation_id} ${project_name}=Project-Demonstration ${owning_entity}=OE-Demonstration ${lineOfBusinessName}=LOB-Demonstration ${platformName}=Platform-Demonstration
Wait Until Keyword Succeeds 120s 40s Send and verify VES integration request in SO and A&AI ${request_id} ${PNF_entry_dict}
- [Teardown] Instantiate PNF_macro service Teardown ${catalog_service_id} ${catalog_resource_ids} ${PNF_entry_dict} ${service_instance_id} ${service_recipe_id}
-
+ Run Keyword If "${building_block_flow}"=='true' Check PNF orchestration status in A&AI ${pnf_correlation_id} registered
+ [Teardown] Instantiate PNF_macro service Teardown ${catalog_service_id} ${catalog_resource_ids} ${PNF_entry_dict} ${service_instance_id} ${service_recipe_id} ${building_block_flow}
Send and verify VES integration request in SO and A&AI
[Documentation] Gets service status and compares with expected status
Wait Until Keyword Succeeds 30s 10s Check SO service completition status ${request_id} COMPLETE
Instantiate PNF_macro service Teardown
- [Arguments] ${catalog_service_id} ${catalog_resource_ids} ${PNF_entry_dict} ${service_instance_id} ${service_recipe_id}
+ [Arguments] ${catalog_service_id} ${catalog_resource_ids} ${PNF_entry_dict} ${service_instance_id} ${service_recipe_id} ${building_block_flow}
Teardown Models ${catalog_service_id} ${catalog_resource_ids}
- Delete Service Recipe ${service_recipe_id}
+ Run Keyword If "${building_block_flow}"=='false' Delete Service Recipe ${service_recipe_id}
Cleanup PNF entry in A&AI ${PNF_entry_dict}
\ No newline at end of file
Resource ../resources/test_templates/pnf_registration_without_SO_template.robot
Library String
-
+
*** Test Cases ***
... Next service is instantied with random PNF id. VES integration event is send with this PNF ID.
... At the end of the service is checked in terms
... - service completion
- ... - PNF entry update about information form VES event
+ ... - PNF entry update about information from VES event
[Tags] pnf_registrate ete
${pnf_correlation_id}= Generate Random String 20 [LETTERS][NUMBERS]
${PNF_entry_dict}= Create Dictionary correlation_id=${pnf_correlation_id} PNF_IPv4_address=13.13.13.13 PNF_IPv6_address=2001:0db8:0:0:0:0:1428:57ab
${PNF_service_model}= Set Variable Demo_pNF_${pnf_correlation_id}
Instantiate PNF_macro service and succesfully registrate PNF template ${PNF_service_model} ${PNF_entry_dict} ${pnf_correlation_id}
+
+
+Instantiate PNF service (using building blocks) and succesfully registrate PNF
+ [Documentation]
+ ... This test case creates TOSCA csar software package for PNF. Imports it as VSP package.
+ ... Cretaes PNF resource, cretaes Macro service, attach PNF resource and distributes it.
+ ... Next service is instantied with random PNF id. VES integration event is send with this PNF ID.
+ ... At the end of the service is checked in terms
+ ... - service completion
+ ... - PNF entry update about information from VES event
+ ... - PNF orchestration status
+ [Tags] pnf_registrate_gr_api
+ ${pnf_correlation_id}= Generate Random String 20 [LETTERS][NUMBERS]
+ ${PNF_entry_dict}= Create Dictionary correlation_id=${pnf_correlation_id} PNF_IPv4_address=13.13.13.13 PNF_IPv6_address=2001:0db8:0:0:0:0:1428:57ab
+ ${PNF_service_model}= Set Variable Demo_pNF_${pnf_correlation_id}
+ Instantiate PNF service (using building blocks) and succesfully registrate PNF template ${PNF_service_model} ${PNF_entry_dict} ${pnf_correlation_id} true
\ No newline at end of file