diff options
30 files changed, 1709 insertions, 0 deletions
diff --git a/tests/so/orchestration/assets/templates/aai/add_customer_required_fields.template b/tests/so/orchestration/assets/templates/aai/add_customer_required_fields.template new file mode 100644 index 00000000..1e008102 --- /dev/null +++ b/tests/so/orchestration/assets/templates/aai/add_customer_required_fields.template @@ -0,0 +1,5 @@ +{ + "global-customer-id": "${global_customer_id}", + "subscriber-name": "${subscriber_name}", + "subscriber-type": "${subscriber_type}" +}
\ No newline at end of file diff --git a/tests/so/orchestration/assets/templates/aai/service_model.template b/tests/so/orchestration/assets/templates/aai/service_model.template new file mode 100644 index 00000000..bc31dece --- /dev/null +++ b/tests/so/orchestration/assets/templates/aai/service_model.template @@ -0,0 +1,14 @@ +{ + "model-invariant-id": "${modelInvariantId}", + "model-type": "${modelType}", + "model-vers": { + "model-ver": [ + { + "model-version-id": "${modelVersionId}", + "model-name": "${modelName}", + "model-version": "${modelVersion}", + "model-description": "${modelDescription}" + } + ] + } +}
\ No newline at end of file diff --git a/tests/so/orchestration/assets/templates/aai/service_subscription_required_fields.template b/tests/so/orchestration/assets/templates/aai/service_subscription_required_fields.template new file mode 100644 index 00000000..29503028 --- /dev/null +++ b/tests/so/orchestration/assets/templates/aai/service_subscription_required_fields.template @@ -0,0 +1,3 @@ +{ + "service-type": "${service_type}" +}
\ No newline at end of file diff --git a/tests/so/orchestration/assets/templates/bpmn-infra/aLaCarte/Create/ServiceInstance.template b/tests/so/orchestration/assets/templates/bpmn-infra/aLaCarte/Create/ServiceInstance.template new file mode 100644 index 00000000..a573a77f --- /dev/null +++ b/tests/so/orchestration/assets/templates/bpmn-infra/aLaCarte/Create/ServiceInstance.template @@ -0,0 +1,35 @@ +{ + "requestDetails": { + "requestInfo": { + "productFamilyId": "${productFamilyId}", + "instanceName": "${instanceName}", + "source": "VID", + "suppressRollback": false, + "requestorId": "ROBOT" + }, + "modelInfo": { + "modelType": "${serviceInstModelType}", + "modelInvariantId": "${serviceInstModelInvariantId}", + "modelVersionId": "${serviceInstModelNameVersionId}", + "modelName": "${serviceInstModelName}", + "modelVersion": "${serviceInstModelVersion}" + }, + "project": { + "projectName": "${projectName}" + }, + "owningEntity": { + "owningEntityId": "${owningEntityId}", + "owningEntityName": "${owningEntityName}" + }, + "requestParameters": { + "testApi": "${testApi}", + "userParams": [], + "subscriptionServiceType": "${serviceType}", + "aLaCarte": ${aLaCarteFlag} + }, + "subscriberInfo": { + "globalSubscriberId": "${subscriberId}", + "subscriberName": "${subscriberId}" + } + } +}
\ No newline at end of file diff --git a/tests/so/orchestration/assets/templates/bpmn-infra/aLaCarte/Create/VfModule.template b/tests/so/orchestration/assets/templates/bpmn-infra/aLaCarte/Create/VfModule.template new file mode 100644 index 00000000..6a5f6d67 --- /dev/null +++ b/tests/so/orchestration/assets/templates/bpmn-infra/aLaCarte/Create/VfModule.template @@ -0,0 +1,56 @@ +{ + "requestDetails": { + "requestInfo": { + "instanceName": "${vfModuleName}", + "source": "VID", + "suppressRollback": false, + "requestorId": "az2016" + }, + "modelInfo": { + "modelType": "${vfModelType}", + "modelInvariantId": "${vfModelInvariantId}", + "modelVersionId": "${vfModelversionId}", + "modelName": "${vfModelName}", + "modelVersion": "${vfModelVersion}", + "modelCustomizationId": "${vfModelCustomizationId}" + }, + "requestParameters": { + "testApi": "${testApi}", + "aLaCarte": "${alaCarte}", + "userParams": [] + }, + "cloudConfiguration": { + "lcpCloudRegionId": "${vfLcpCloudRegionId}", + "tenantId": "${vfTenantId}", + "cloudOwner": "${cloudOwner}" + }, + "relatedInstanceList": [ + { + "relatedInstance": { + "instanceId": "${serviceInstanceId}", + "modelInfo": { + "modelType": "${serviceInstModelType}", + "modelInvariantId": "${serviceInstModelInvariantId}", + "modelVersionId": "${serviceInstModelNameVersionId}", + "modelName": "${serviceInstModelName}", + "modelVersion": "${serviceInstModelVersion}" + } + } + }, + { + "relatedInstance": { + "instanceId": "${vnfId}", + "modelInfo": { + "modelType": "${vnfModelType}", + "modelName": "${vnfModelName}", + "modelInvariantId": "${vnfModelInvariantId}", + "modelVersion": "${vnfModelVersion}", + "modelVersionId": "${vnfModelversionId}", + "modelCustomizationName": "${vnfModelCustomizationName}", + "modelCustomizationId": "${vnfModelcustomizationId}" + } + } + } + ] + } +}
\ No newline at end of file diff --git a/tests/so/orchestration/assets/templates/bpmn-infra/aLaCarte/Create/VfModuleWithVolume.template b/tests/so/orchestration/assets/templates/bpmn-infra/aLaCarte/Create/VfModuleWithVolume.template new file mode 100644 index 00000000..424d526a --- /dev/null +++ b/tests/so/orchestration/assets/templates/bpmn-infra/aLaCarte/Create/VfModuleWithVolume.template @@ -0,0 +1,69 @@ +{ + "requestDetails": { + "requestInfo": { + "instanceName": "${vfModuleName}", + "source": "VID", + "suppressRollback": false, + "requestorId": "az2016" + }, + "modelInfo": { + "modelType": "${vfModelType}", + "modelInvariantId": "${vfModelInvariantId}", + "modelVersionId": "${vfModelversionId}", + "modelName": "${vfModelName}", + "modelVersion": "${vfModelVersion}", + "modelCustomizationId": "${vfModelCustomizationId}" + }, + "requestParameters": { + "testApi": "${testApi}", + "aLaCarte": "${alaCarte}", + "userParams": [] + }, + "cloudConfiguration": { + "lcpCloudRegionId": "${vfLcpCloudRegionId}", + "cloudOwner": "${cloudOwner}", + "tenantId": "${vfTenantId}" + }, + "relatedInstanceList": [ + { + "relatedInstance": { + "instanceId": "${serviceInstanceId}", + "modelInfo": { + "modelType": "${serviceInstModelType}", + "modelInvariantId": "${serviceInstModelInvariantId}", + "modelVersionId": "${serviceInstModelNameVersionId}", + "modelName": "${serviceInstModelName}", + "modelVersion": "${serviceInstModelVersion}" + } + } + }, + { + "relatedInstance": { + "instanceId": "${vnfId}", + "modelInfo": { + "modelType": "${vnfModelType}", + "modelName": "${vnfModelName}", + "modelInvariantId": "${vnfModelInvariantId}", + "modelVersion": "${vnfModelVersion}", + "modelVersionId": "${vnfModelversionId}", + "modelCustomizationName": "${vnfModelCustomizationName}", + "modelCustomizationId": "${vnfModelcustomizationId}" + } + } + }, + { + "relatedInstance": { + "instanceId": "${volumeGroupId}", + "modelInfo": { + "modelType": "${volumeGroupModelType}", + "modelName": "${volumeGroupModelName}", + "modelInvariantId": "${volumeGroupModelInvariantId}", + "modelVersion": "${volumeGroupModelVersion}", + "modelVersionId": "${volumeGroupModelversionId}", + "modelCustomizationId": "${volumeGroupModelCustomizationId}" + } + } + } + ] + } +}
\ No newline at end of file diff --git a/tests/so/orchestration/assets/templates/bpmn-infra/aLaCarte/Create/Vnf.json b/tests/so/orchestration/assets/templates/bpmn-infra/aLaCarte/Create/Vnf.json new file mode 100644 index 00000000..7e11dbe7 --- /dev/null +++ b/tests/so/orchestration/assets/templates/bpmn-infra/aLaCarte/Create/Vnf.json @@ -0,0 +1,49 @@ +{ + "requestDetails": { + "requestInfo": { + "instanceName": "${vnfInstanceName}", + "source": "VID", + "suppressRollback": false, + "productFamilyId": "${productfamilyid}", + "requestorId": "ROBOT" + }, + "modelInfo": { + "modelType": "${vnfModelType}", + "modelInvariantId": "${vnfModelInvariantId}", + "modelName": "${vnfModelName}", + "modelVersionId": "${vnfModelversionId}", + "modelVersion": "${vnfModelVersion}", + "modelCustomizationName": "${vnfModelCustomizationName}", + "modelCustomizationId": "${vnfModelcustomizationId}" + }, + "requestParameters": { + "testApi": "${testApi}", + "userParams": [] + }, + "cloudConfiguration": { + "lcpCloudRegionId": "${vnfLcpCloudRegionid}", + "cloudOwner": "${cloudOwner}", + "tenantId": "${vnfTenantId}" + }, + "platform": { + "platformName": "${platformName}" + }, + "lineOfBusiness": { + "lineOfBusinessName": "${lineOfBusinessName}" + }, + "relatedInstanceList": [ + { + "relatedInstance": { + "instanceId": "${serviceInstanceId}", + "modelInfo": { + "modelType": "${serviceInstModelType}", + "modelInvariantId": "${serviceInstModelInvariantId}", + "modelVersionId": "${serviceInstModelNameVersionId}", + "modelName": "${serviceInstModelName}", + "modelVersion": "${serviceInstModelVersion}" + } + } + } + ] + } +}
\ No newline at end of file diff --git a/tests/so/orchestration/assets/templates/bpmn-infra/aLaCarte/Create/VolumeGroup.template b/tests/so/orchestration/assets/templates/bpmn-infra/aLaCarte/Create/VolumeGroup.template new file mode 100644 index 00000000..d117e28d --- /dev/null +++ b/tests/so/orchestration/assets/templates/bpmn-infra/aLaCarte/Create/VolumeGroup.template @@ -0,0 +1,56 @@ +{ + "requestDetails": { + "modelInfo": { + "modelType": "${volumeGroupModelType}", + "modelVersion": "${volumeGroupModelVersion}", + "modelName": "${volumeGroupModelName}", + "modelInvariantId": "${volumeGroupModelInvariantId}", + "modelVersionId": "${volumeGroupModelVersionId}", + "modelCustomizationId": "${volumeGroupModelCustomizationId}" + }, + "requestInfo": { + "instanceName": "${volumeGroupName}", + "source": "VID", + "suppressRollback": true, + "requestorId": "sk720x" + }, + "requestParameters": { + "testApi": "${testApi}", + "aLaCarte": "${alaCarte}", + "userParams": [] + }, + "cloudConfiguration": { + "lcpCloudRegionId": "${volumeGroupLcpCloudRegionId}", + "cloudOwner": "${cloudOwner}", + "tenantId": "${volumeGroupTenantId}" + }, + "relatedInstanceList": [ + { + "relatedInstance": { + "instanceId": "${serviceInstanceId}", + "modelInfo": { + "modelType": "${serviceInstModelType}", + "modelInvariantId": "${serviceInstModelInvariantId}", + "modelVersionId": "${serviceInstModelNameVersionId}", + "modelName": "${serviceInstModelName}", + "modelVersion": "${serviceInstModelVersion}" + } + } + }, + { + "relatedInstance": { + "instanceId": "${vnfId}", + "modelInfo": { + "modelType": "${vnfModelType}", + "modelName": "${vnfModelName}", + "modelInvariantId": "${vnfModelInvariantId}", + "modelVersion": "${vnfModelVersion}", + "modelVersionId": "${vnfModelversionId}", + "modelCustomizationName": "${vnfModelCustomizationName}", + "modelCustomizationId": "${vnfModelcustomizationId}" + } + } + } + ] + } +}
\ No newline at end of file diff --git a/tests/so/orchestration/assets/templates/bpmn-infra/aLaCarte/Delete/ServiceInstance.template b/tests/so/orchestration/assets/templates/bpmn-infra/aLaCarte/Delete/ServiceInstance.template new file mode 100644 index 00000000..531af177 --- /dev/null +++ b/tests/so/orchestration/assets/templates/bpmn-infra/aLaCarte/Delete/ServiceInstance.template @@ -0,0 +1,20 @@ +{ + "requestDetails": { + "modelInfo": { + "modelType": "service", + "modelInvariantId": "${serviceInstModelInvariantId}", + "modelVersionId": "${serviceInstModelNameVersionId}", + "modelName": "${serviceInstModelName}", + "modelVersion":"1.0" + }, + "requestInfo": { + "source": "VID", + "requestorId": "ROBOT" + }, + "requestParameters": { + "testApi": "${testApi}", + "userParams": [], + "aLaCarte": "${aLaCarteFlag}" + } + } +}
\ No newline at end of file diff --git a/tests/so/orchestration/assets/templates/bpmn-infra/aLaCarte/Delete/VfModule.template b/tests/so/orchestration/assets/templates/bpmn-infra/aLaCarte/Delete/VfModule.template new file mode 100644 index 00000000..ee227e08 --- /dev/null +++ b/tests/so/orchestration/assets/templates/bpmn-infra/aLaCarte/Delete/VfModule.template @@ -0,0 +1,26 @@ +{ + "requestDetails": { + "modelInfo": { + "modelType": "${vfModelType}", + "modelInvariantId": "${vfModelInvariantId}", + "modelVersionId": "${vfModelversionId}", + "modelName": "${vfModelName}", + "modelVersion": "${vfModelVersion}", + "modelCustomizationId": "${vfModelCustomizationId}" + }, + "requestParameters": { + "testApi": "${testApi}", + "aLaCarte": "${alaCarte}", + "userParams": [] + }, + "requestInfo": { + "source": "VID", + "requestorId": "az2016" + }, + "cloudConfiguration": { + "lcpCloudRegionId": "${vfLcpCloudRegionId}", + "tenantId": "${vfTenantId}", + "cloudOwner": "${cloudOwner}" + } + } +}
\ No newline at end of file diff --git a/tests/so/orchestration/assets/templates/bpmn-infra/aLaCarte/Delete/Vnf.template b/tests/so/orchestration/assets/templates/bpmn-infra/aLaCarte/Delete/Vnf.template new file mode 100644 index 00000000..fc553952 --- /dev/null +++ b/tests/so/orchestration/assets/templates/bpmn-infra/aLaCarte/Delete/Vnf.template @@ -0,0 +1,25 @@ +{ + "requestDetails":{ + "modelInfo":{ + "modelType":"${vnfModelType}", + "modelInvariantId":"${vnfModelInvariantId}", + "modelNameVersionId":"${vnfModelversionId}", + "modelName":"${vnfModelName}", + "modelCustomizationName":"${vnfModelCustomizationName}", + "modelVersion":"${vnfModelVersion}" + }, + "requestInfo":{ + "source":"VID", + "requestorId":"ROBOT" + }, + "cloudConfiguration":{ + "lcpCloudRegionId":"${vnfLcpCloudRegionid}", + "tenantId":"${vnfTenantId}", + "cloudOwner": "${cloudOwner}" + }, + "requestParameters": { + "testApi": "${testApi}", + "userParams": [] + } + } +}
\ No newline at end of file diff --git a/tests/so/orchestration/assets/templates/bpmn-infra/aLaCarte/Delete/VolumeGroup.template b/tests/so/orchestration/assets/templates/bpmn-infra/aLaCarte/Delete/VolumeGroup.template new file mode 100644 index 00000000..b5a495f2 --- /dev/null +++ b/tests/so/orchestration/assets/templates/bpmn-infra/aLaCarte/Delete/VolumeGroup.template @@ -0,0 +1,26 @@ +{ + "requestDetails": { + "modelInfo": { + "modelType": "${volumeGroupModelType}", + "modelInvariantId": "${volumeGroupModelInvariantId}", + "modelVersionId": "${volumeGroupModelVersionId}", + "modelName": "${volumeGroupModelName}", + "modelVersion": "${volumeGroupModelVersion}", + "modelCustomizationId": "${volumeGroupModelCustomizationId}" + }, + "requestParameters": { + "testApi": "${testApi}", + "aLaCarte": "${alaCarte}", + "userParams": [] + }, + "requestInfo": { + "source": "VID", + "requestorId": "sk720x" + }, + "cloudConfiguration": { + "lcpCloudRegionId": "${volumeGroupLcpCloudRegionId}", + "tenantId": "${volumeGroupTenantId}", + "cloudOwner": "${cloudOwner}" + } + } +}
\ No newline at end of file diff --git a/tests/so/orchestration/assets/templates/gr-api/CreateAAIInventory.json b/tests/so/orchestration/assets/templates/gr-api/CreateAAIInventory.json new file mode 100644 index 00000000..5dd23235 --- /dev/null +++ b/tests/so/orchestration/assets/templates/gr-api/CreateAAIInventory.json @@ -0,0 +1,245 @@ +{ + "vserver-id": "92272b67-d23f-42ca-87fa-7b06a9ec81f3", + "vserver-name": "tsbc0005vm002", + "vserver-name2": "tsbc0005vm002", + "vserver-selflink": "https://test.com:8774/v2/0422ffb57ba042c0800a29dc85ca70f8/servers/92272b67-d23f-42ca-87fa-7b06a9ec81f3", + "in-maint": false, + "is-closed-loop-disabled": false, + "l-interfaces": { + "l-interface": [ + { + "interface-name": "tsbc0005v_tsbc0005vm002_mgmt_port_1", + "selflink": "https://test.com:9696/v2.0/ports/07f5b14c-147a-4d14-8c94-a9e94dbc097b", + "interface-id": "07f5b14c-147a-4d14-8c94-a9e94dbc097b", + "macaddr": "02:07:f5:b1:4c:14", + "network-name": "GRP-27529-T-IST-05E-dyh3b_TIPFR_OAMP_NSD_TSBC0_net_1", + "is-port-mirrored": false, + "in-maint": false, + "is-ip-unnumbered": false, + "l3-interface-ipv4-address-list": [ + { + "l3-interface-ipv4-address": "1.2.2.2", + "l3-interface-ipv4-prefix-length": 28, + "is-floating": false, + "neutron-network-id": "cae2ade2-9f44-40fa-b124-18b101ff9aa0", + "neutron-subnet-id": "1f954922-6e9c-4a64-9d78-62e869ba8c77" + } + ], + "vlans" : { + "vlan": [ + { + "in-maint": false, + "is-ip-unnumbered": false, + "is-private": false, + "vlan-id-inner": 0, + "vlan-id-outer": 141, + "vlan-interface": "oamfw_oam_direct1_0_port141" + } + ] + } + }, + { + "interface-name": "tsbc0005v_tsbc0005vm002_role1_port_0", + "selflink": "https://test.com:9696/v2.0/ports/0594a2f2-7ea4-42eb-abc2-48ea49677fca", + "interface-id": "0594a2f2-7ea4-42eb-abc2-48ea49677fca", + "macaddr": "02:05:94:a2:f2:7e", + "network-name": "GRP-27529-T-IST-05E-dyh3b_TIPFR-UNTR-ROLE1-PARNT_net_1", + "is-port-mirrored": false, + "in-maint": false, + "is-ip-unnumbered": false, + "l-interfaces": { + "l-interface": [ + { + "interface-name": "tsbc0005v_tsbc0005vm002_subint_untrusted_role1_81", + "interface-id": "2bbfa345-33bb-495a-94b2-fb514ee1cffc", + "macaddr": "02:05:94:a2:f2:7e", + "network-name": "GRP-27529-T-IST-05E-dyh3b_TIPFR_UNTR_VSE_ROLE10_net_1", + "is-port-mirrored": false, + "in-maint": false, + "is-ip-unnumbered": false + } + ] + }, + "l3-interface-ipv4-address-list": [ + { + "l3-interface-ipv4-address": "172.26.0.36", + "l3-interface-ipv4-prefix-length": 27, + "is-floating": false, + "neutron-network-id": "49bd2c8c-808d-4783-a1c5-5d9ae0c6a9fa", + "neutron-subnet-id": "8d073a94-b1b9-493a-8fc1-cf92abcba466" + } + ], + "vlans" : { + "vlan": [ + { + "in-maint": false, + "is-ip-unnumbered": false, + "is-private": false, + "vlan-id-inner": 0, + "vlan-id-outer": 256, + "vlan-interface": "oamfw_oam_direct1_0_port141" + } + ] + } + }, + { + "interface-name": "tsbc0005v_tsbc0005vm002_service1_port_0", + "selflink": "https://test.com:9696/v2.0/ports/27391d94-33af-474a-927d-d409249e8fd3", + "interface-id": "27391d94-33af-474a-927d-d409249e8fd3", + "macaddr": "02:27:39:1d:94:33", + "network-name": "GRP-27529-T-IST-05E-dyh3b_TIPFR-UNTR-CUS-PARNT_net_1", + "is-port-mirrored": false, + "in-maint": false, + "is-ip-unnumbered": false, + "l-interfaces": { + "l-interface": [ + { + "interface-name": "tsbc0005v_tsbc0005vm002_subint_untrusted_service1_101", + "interface-id": "d54dfd09-75c6-4e04-b204-909455b8f933", + "macaddr": "02:27:39:1d:94:33", + "network-name": "GRP-27529-T-IST-05E_int_SUB-INTERFACE_net_006", + "is-port-mirrored": false, + "in-maint": false, + "is-ip-unnumbered": false + }, + { + "interface-name": "tsbc0005v_tsbc0005vm002_subint_untrusted_service1_103", + "interface-id": "f7a998c0-8939-4b07-bf4a-0862e9c325e1", + "macaddr": "02:27:39:1d:94:33", + "network-name": "GRP-27529-T-IST-05E_int_SUB-INTERFACE_net_008", + "is-port-mirrored": false, + "in-maint": false, + "is-ip-unnumbered": false + }, + { + "interface-name": "tsbc0005v_tsbc0005vm002_subint_untrusted_service1_102", + "interface-id": "621c1fea-60b8-44ee-aede-c01b8b1aaa70", + "macaddr": "02:27:39:1d:94:33", + "network-name": "GRP-27529-T-IST-05E_int_SUB-INTERFACE_net_007", + "is-port-mirrored": false, + "in-maint": false, + "is-ip-unnumbered": false + } + ] + }, + "l3-interface-ipv4-address-list": [ + { + "l3-interface-ipv4-address": "172.26.0.5", + "l3-interface-ipv4-prefix-length": 27, + "is-floating": false, + "neutron-network-id": "7acdc0c3-eff2-4ecb-8722-a3451711027c", + "neutron-subnet-id": "4c4cc70a-7f31-41a6-a50f-5390d80fd127" + } + ], + "vlans" : { + "vlan": [ + { + "in-maint": false, + "is-ip-unnumbered": false, + "is-private": false, + "vlan-id-inner": 0, + "vlan-id-outer": 574, + "vlan-interface": "oamfw_oam_direct1_0_port141" + } + ] + } + }, + { + "interface-name": "tsbc0005v_tsbc0005vm002_int_ha_port_0", + "selflink": "https://test.com:9696/v2.0/ports/00bb8407-650e-48b5-b919-33b88d6f8fe3", + "interface-id": "00bb8407-650e-48b5-b919-33b88d6f8fe3", + "macaddr": "02:00:bb:84:07:65", + "network-name": "tsbc0005v_int_ha_net", + "is-port-mirrored": false, + "in-maint": false, + "is-ip-unnumbered": false, + "l3-interface-ipv4-address-list": [ + { + "l3-interface-ipv4-address": "172.26.1.27", + "l3-interface-ipv4-prefix-length": 26, + "is-floating": false, + "neutron-network-id": "de0a1ec5-8685-4de5-999c-a791bd48c9d8", + "neutron-subnet-id": "1151932c-935d-4cdc-b134-f58bebed9bf1" + } + ], + "vlans" : { + "vlan": [ + { + "in-maint": false, + "is-ip-unnumbered": false, + "is-private": false, + + "vlan-id-inner": 0, + "vlan-id-outer": 654, + "vlan-interface": "oamfw_oam_direct1_0_port141" + } + ] + } + }, + { + "interface-name": "tsbc0005v_tsbc0005vm002_mgmt_port_0", + "selflink": "https://test.com:9696/v2.0/ports/8d93f63e-e972-48c7-ad98-b2122da47315", + "interface-id": "8d93f63e-e972-48c7-ad98-b2122da47315", + "macaddr": "02:8d:93:f6:3e:e9", + "network-name": "GRP-27529-T-IST-05E-dyh3b_TIPFR_OAMP_NSD_TSBC0_net_1", + "is-port-mirrored": false, + "in-maint": false, + "is-ip-unnumbered": false, + "l3-interface-ipv4-address-list": [ + { + "l3-interface-ipv4-address": "1.2.2.2", + "l3-interface-ipv4-prefix-length": 28, + "is-floating": false, + "neutron-network-id": "cae2ade2-9f44-40fa-b124-18b101ff9aa0", + "neutron-subnet-id": "1f954922-6e9c-4a64-9d78-62e869ba8c77" + } + ], + "vlans" : { + "vlan": [ + { + "in-maint": false, + "is-ip-unnumbered": false, + "is-private": false, + + "vlan-id-inner": 0, + "vlan-id-outer": 123, + "vlan-interface": "oamfw_oam_direct1_0_port141" + } + ] + } + }, + { + "interface-name": "tsbc0005v_tsbc0005vm002_trusted_port", + "selflink": "https://test.com:9696/v2.0/ports/d2f51f82-0ec2-4581-bd1a-d2a82073e52b", + "interface-id": "d2f51f82-0ec2-4581-bd1a-d2a82073e52b", + "macaddr": "02:d2:f5:1f:82:0e", + "network-name": "GRP-27529-T-IST-05E-dyh3b_TIPFR_TRST_VIF_TSBC0_net_1", + "is-port-mirrored": false, + "in-maint": false, + "is-ip-unnumbered": false, + "l3-interface-ipv4-address-list": [ + { + "l3-interface-ipv4-address": "1.2.2.2", + "l3-interface-ipv4-prefix-length": 28, + "is-floating": false, + "neutron-network-id": "4f35d575-a4f2-4020-8322-3eb138e7f258", + "neutron-subnet-id": "d476da9d-bf9b-49e1-aec9-fee99b863f30" + } + ], + "vlans" : { + "vlan": [ + { + "in-maint": false, + "is-ip-unnumbered": false, + "is-private": false, + + "vlan-id-inner": 0, + "vlan-id-outer": 965, + "vlan-interface": "oamfw_oam_direct1_0_port141" + } + ] + } + } + ] + } +}
\ No newline at end of file diff --git a/tests/so/orchestration/assets/templates/gr-api/PhysicalServerCreate.json b/tests/so/orchestration/assets/templates/gr-api/PhysicalServerCreate.json new file mode 100644 index 00000000..c0f0ea53 --- /dev/null +++ b/tests/so/orchestration/assets/templates/gr-api/PhysicalServerCreate.json @@ -0,0 +1,111 @@ +{ + "hostname": "rdm52r19c001", + "equip-type": "rack server", + "equip-vendor": "DELL", + "equip-model": "SVR - R740XD - AIC 25GB AC - 44 CORE - 384GB RAM - 4 X 480GB SSD - 6 X 2.4TB HDD - 2 X 1GB - 4 X 10GB X710 - 4 X 25GB (INTEL XXV710) - NBD", + "fqdn": "test.com", + "inv-status": "Configuration", + "in-maint": false, + "prov-status": "PREPROV", + "host-profile": "ns-hp1", + "role": "Application", + "function": "Node", + "p-interfaces": + { + "p-interface": + [ + { + "interface-name": "p7/1", + "speed-value": "25", + "speed-units": "GE", + "port-description": "25GE_rdm521928el1_et-0/0/1:1_[ckt-id]_[fac-id]_[CBB][NCOPS]", + "interface-role": "OAM", + "interface-type": "BUNDLE-MEMBER", + "prov-status": "PREPROV", + "in-maint": false + }, + + { + "interface-name": "p2/2", + "speed-value": "25", + "speed-units": "GE", + "port-description": "25GE_rdm521929el1_et-0/0/1:1_[ckt-id]_[fac-id]_[CBB][NCOPS]", + "interface-role": "OAM", + "interface-type": "BUNDLE-MEMBER", + "prov-status": "PREPROV", + "in-maint": false + }, + + { + "interface-name": "p7/2", + "speed-value": "25", + "speed-units": "GE", + "port-description": "25GE_rdm521929el1_et-0/0/0:1_[ckt-id]_[fac-id]_[CBB][NCOPS]", + "interface-role": "APPLICATION", + "interface-type": "PHYSICAL", + "prov-status": "PREPROV", + "in-maint": false, + "sriov-pfs": + { + "sriov-pf": + [ + { + "pf-pci-id": "0000:5e:00.0" + } + ] + } + }, + { + "interface-name": "p2/1", + "speed-value": "25", + "speed-units": "GE", + "port-description": "25GE_rdm521928el1_et-0/0/0:1_[ckt-id]_[fac-id]_[CBB][NCOPS]", + "interface-role": "APPLICATION", + "interface-type": "PHYSICAL", + "prov-status": "PREPROV", + "in-maint": false, + "sriov-pfs": + { + "sriov-pf": + [ + { + "pf-pci-id": "0000:5e:01.0" + } + ] + } + }, + { + "interface-name": "P1", + "speed-value": "1", + "speed-units": "GE", + "port-description": "1GE_rdm520019sx2_GigabitEthernet1/0/3_[ckt-id]_[fac-id]_[CBB][NCOPS]", + "interface-role": "PXE", + "interface-type": "PHYSICAL", + "prov-status": "PREPROV", + "in-maint": false + }, + + { + "interface-name": "R", + "speed-value": "1", + "speed-units": "GE", + "port-description": "1GE_rdm520019sx2_GigabitEthernet1/0/4_[ckt-id]_[fac-id]_[CBB][NCOPS]", + "interface-role": "IPMI", + "interface-type": "PHYSICAL", + "prov-status": "PREPROV", + "in-maint": false + } + ] + }, + "lag-interfaces": + { + "lag-interface": + [ + { + "interface-name": "bond1", + "prov-status": "PREPROV", + "in-maint": false + } + ] + } +}
\ No newline at end of file diff --git a/tests/so/orchestration/assets/templates/setup_cloud_region.json b/tests/so/orchestration/assets/templates/setup_cloud_region.json new file mode 100644 index 00000000..cc5d8575 --- /dev/null +++ b/tests/so/orchestration/assets/templates/setup_cloud_region.json @@ -0,0 +1,10 @@ +{ + "cloud-owner": "${cloudOwner}", + "cloud-region-id": "${cloudRegionId}", + "cloud-type": "${cloudType}", + "owner-defined-type": "${ownerDefinedType}", + "cloud-region-version": "${cloudRegionVersion}", + "cloud-zone": "${cloudZone}", + "complex-name": "${complexName}", + "sriov-automation": "${sriovAutomation}" +}
\ No newline at end of file diff --git a/tests/so/orchestration/assets/templates/setup_tenant.json b/tests/so/orchestration/assets/templates/setup_tenant.json new file mode 100644 index 00000000..e615edef --- /dev/null +++ b/tests/so/orchestration/assets/templates/setup_tenant.json @@ -0,0 +1,4 @@ +{ + "tenant-id": "${tenantId}", + "tenant-name": "${tenantName}" +}
\ No newline at end of file diff --git a/tests/so/orchestration/data/bpmn-infra/aLaCarte/ServiceInstance.csv b/tests/so/orchestration/data/bpmn-infra/aLaCarte/ServiceInstance.csv new file mode 100644 index 00000000..a3468c83 --- /dev/null +++ b/tests/so/orchestration/data/bpmn-infra/aLaCarte/ServiceInstance.csv @@ -0,0 +1,2 @@ +uniqueKey,productFamilyId,instanceName,serviceInstModelInvariantId,serviceInstModelDescription,serviceInstModelType,serviceInstModelNameVersionId,serviceInstModelVersion,serviceInstModelName,owningEntityId,owningEntityName,projectName,serviceType,aLaCarteFlag,subscriberId,sync_response,orch_response,testApi,distributionFilePath,dlpFlag +TC_1,a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb,Robot_SI,944862ae-bb65-4429-8330-a6c9170d6672,Demo,service,d88da85c-d9e8-4f73-b837-3a72a431622b,1,Vf servername-Service,c3f57fa8-ac7d-11e8-98d0-529269fb1459,SO_Test-Network_2.0-1806 & GR_API OE SO_Test200,GR_API_OE_SO_Test200,Robot_Test_Service_Type,true,Robot_Test_Subscriber_ID,202,COMPLETE,GR_API,tests/so/orchestration/assets/templates/sdc_notif_container.json,false diff --git a/tests/so/orchestration/resources/SoKeywords.robot b/tests/so/orchestration/resources/SoKeywords.robot new file mode 100644 index 00000000..f9f68984 --- /dev/null +++ b/tests/so/orchestration/resources/SoKeywords.robot @@ -0,0 +1,103 @@ +*** Settings *** +Library StringTemplater +Library Collections +Library RequestsLibrary +Library HttpLibrary.HTTP +Library OperatingSystem +Library BuiltIn +Library String +Library XML +Resource common/Variables.robot +Resource SoVariables.robot +Resource global_properties.robot +Resource so_interface.robot + +***Variables*** +${SO_REST_URL} ${GLOBAL_SO_SERVER_PROTOCOL}://${GLOBAL_INJECTED_SO_IP_ADDR}:${GLOBAL_SO_SERVER_PORT} + +*** Keywords *** +Wait To Poll + [Documentation] Sleep the execution for the specified time (in seconds). + Sleep ${POLL_WAIT_TIME} + +Poll Orchestration Request + [Documentation] Poll the service orchestration request for the completion. Uses MAX_POLL_COUNT to specify the maximum number of polling attempts. + [Arguments] ${request_id} + : FOR ${INDEX} IN RANGE 1 ${MAX_POLL_COUNT} + \ Log 'Poll Count :' + \ Log ${INDEX} + \ ${orchestration_request_response}= Get Orchestration Request Status ${request_id} + + # First check request status code + \ ${orch_request_status_code}= Set Variable ${orchestration_request_response.status_code} + \ ${orchestration_failure_message}= Run Keyword If ${orch_request_status_code} != ${HTTP_OK} Catenate Error Code ${orch_request_status_code} + \ ${request_completion_status}= Run Keyword If ${orch_request_status_code} != ${HTTP_OK} Set Variable '${ORCH_REQUEST_FAILED}' + \ Exit For Loop If ${orch_request_status_code} != ${HTTP_OK} + + # Get Status of Orchestration request + \ Log ${orchestration_request_response.content} + \ ${request_completion_status} Get Json Value ${orchestration_request_response.content} /request/requestStatus/requestState + \ ${orchestration_status_message}= Run Keyword If ${request_completion_status} != '${ORCH_REQUEST_IN_PROGRESS}' Get Json Value ${orchestration_request_response.content} /request/requestStatus/statusMessage + \ Log ${request_completion_status} + + # Check for FAILED status + \ ${orchestration_failure_message}= Run Keyword If ${request_completion_status} == '${ORCH_REQUEST_FAILED}' Set Variable ${orchestration_status_message} + \ Exit For Loop If ${request_completion_status} == '${ORCH_REQUEST_FAILED}' + + # Check for COMPLETE status + \ Exit For Loop If ${request_completion_status} == '${ORCH_REQUEST_COMPLETE}' + + # Check for MAX NO OF POLL count, and exit if it has reached the maximum poll count + \ ${orchestration_failure_message}= Run Keyword If ${INDEX} == ${MaxPollCount}-1 Set Variable ${TIME_OUT_MESSAGE} + \ Exit For Loop If ${INDEX} == ${MaxPollCount}-1 + \ Wait To Poll + LOG ${orchestration_failure_message} + ${request_completion_status} Get Substring ${request_completion_status} 1 -1 + [Return] ${request_completion_status} ${orchestration_failure_message} + +Get Orchestration Request Status + [Documentation] Get the status of the orchestrated service request. + [Arguments] ${request_id} + + ${url}= Catenate SEPARATOR=/ ${SO_ORCHESTRATION_REQUESTS_URI} ${request_id} + ${orchestration_request_response} Run SO Get Request ${url} + [Return] ${orchestration_request_response} + +Get Orchestration Request Status with parameters + [Documentation] Get the status of the orchestrated service request. + [Arguments] ${request_id} ${parameter} + + ${url}= Catenate ${SO_ORCHESTRATION_REQUESTS_URI}/${request_id}?${parameter} + ${orchestration_request_response} Run SO Get Request ${url} + [Return] ${orchestration_request_response} + +Get ExtSystemErrorSource + [Documentation] Return ExtSystemErrorSource from Get Orchestration Request + [Arguments] ${request_id} + + ${orchestration_request_response} Get Orchestration Request Status with parameters ${request_id} format=statusdetail + ${orchestration_request_response_json} Parse Json ${orchestration_request_response.content} + ${extSystemErrorSource} Convert to String ${orchestration_request_response_json['request']['requestStatus']['extSystemErrorSource']} + + [Return] ${extSystemErrorSource} + +Get RollbackExtSystemErrorSource + [Documentation] Return ExtSystemErrorSource from Get Orchestration Request + [Arguments] ${request_id} + + ${orchestration_request_response} Get Orchestration Request Status with parameters ${request_id} format=statusdetail + ${orchestration_request_response_json} Parse Json ${orchestration_request_response.content} + ${rollbackExtSystemErrorSource} Convert to String ${orchestration_request_response_json['request']['requestStatus']['rollbackExtSystemErrorSource']} + + [Return] ${rollbackExtSystemErrorSource} + +Get FlowStatus + [Documentation] Return Flow Status from Get Orchestration Request + [Arguments] ${request_id} + + ${orchestration_request_response} Get Orchestration Request Status with parameters ${request_id} format=statusdetail + ${orchestration_request_response_json} Parse Json ${orchestration_request_response.content} + Log ${orchestration_request_response_json} + ${flow_status} Convert to String ${orchestration_request_response_json['request']['requestStatus']['flowStatus']} + + [Return] ${flow_status}
\ No newline at end of file diff --git a/tests/so/orchestration/resources/SoVariables.robot b/tests/so/orchestration/resources/SoVariables.robot new file mode 100644 index 00000000..b3ea9098 --- /dev/null +++ b/tests/so/orchestration/resources/SoVariables.robot @@ -0,0 +1,67 @@ +*** Variables *** +### Orchestration Polling Properties ### +${POLL_WAIT_TIME} 5 +${MEGA_POLL_WAIT_TIME} 5 +${MAX_POLL_COUNT} 72 + +### Common Properties ### +${VNFS} vnfs +${VFMODULES} vfModules +${SO_REST_URI} /onap/so/infra/serviceInstantiation/v7/serviceInstances +${SO_ORCHESTRATION_REQUESTS_URI} /onap/so/infra/orchestrationRequests/v7 +${SO_HEALTHCHECK_URI} /manage/health + +${SO_AUDIT_REST_URI} /audit/v1/services/ + +### Layer3 Properties ### +&{SO_LAYER3_HEADERS} Content-Type=application/xml Accept=application/xml Authorization=Basic YXBpaEJwbW46Y2FtdW5kYS1SMTUxMiE= +### Service Properties ### +${SO_REST_URI_CREATE_SERVICE} ${SO_REST_URI} +${SO_REST_URI_DELETE_SERVICE} ${SO_REST_URI} + +### VNF Module Properties ### +${SO_REST_URI_CREATE_VFMODULE} ${SO_REST_URI}/<SERVICEINSTANCEID>/vnfs/<VNFINSTANCEID>/vfModules +${SO_REST_URI_DELETE_VFMODULE} ${SO_REST_URI}/<SERVICEINSTANCEID>/vnfs/<VNFINSTANCEID>/vfModules/<VFMODULEINSTANCEID> +### Messages ### +${TIME_OUT_MESSAGE} No Successful response within specified time +${ORCH_FAILURE_MESSAGE} Orchestration request has failed + +##### VF SPECIFIC PROPERTIES ##### +${INVALID_SERVICE_ID_MSG} "Error parsing request.${SPACE}${SPACE}No valid serviceInstanceId is specified" +${INVALID_VNF_INST_ID_MSG} "Error parsing request.${SPACE}${SPACE}No valid vnfInstanceId is specified" +${DELETE_VNF_FAIL_MSG} "Can't Delete Generic Vnf. Generic Vnf is still in use." + +##### NETWORK SPECIFIC PROPERTIES ##### +${INVALID_NW_INST_ID_MSG} "Error parsing request.${SPACE}${SPACE}No valid networkInstanceId is specified" +${INV_MODEL_NAME_MSG} "Received error from Network Adapter: Unknown Network Type: CONTRAIL_INTERNAL" +${BLANK_MODEL_NAME_MSG} "Error parsing request.${SPACE}${SPACE}No valid modelName is specified" +${INV_REGION_ID_MSG} "Received error from Network Adapter: Cloud Site [RegionTwo] not found" +${BLANK_REGION_ID_MSG} "Error parsing request.${SPACE}${SPACE}No valid lcpCloudRegionId is specified" +${INV_TENANT_MSG} "Received error from Network Adapter: 404 Not Found: " +${BLANK_TENANT_ID_MSG} "Error parsing request.${SPACE}${SPACE}No valid tenantId is specified" +${INV_SOURCE_MSG} "Recipe does not exist in catalog DB" +${BLANK_SOURCE_MSG} "Error parsing request.${SPACE}${SPACE}No valid source is specified" +${BLANK_INVAR_ID_MSG} "Error parsing request.${SPACE}${SPACE}No valid modelInvariantId is specified" +${BLANK_VER_ID_MSG} "Error parsing request.${SPACE}${SPACE}No valid modelVersionId is specified" +${BLANK_REQ_ID_MSG} "Error parsing request.${SPACE}${SPACE}No valid requestorId is specified" + +### Orchestration Constants ### +${ORCH_REQUEST_COMPLETE} COMPLETE +${ORCH_REQUEST_COMPLETED} COMPLETED +${ORCH_REQUEST_FAILED} FAILED +${ORCH_REQUEST_IN_PROGRESS} IN_PROGRESS + +### MODEL TYPE ### +${MODEL_TYPE_SERVICE} service +${MODEL_TYPE_VNF} vnf +${MODEL_TYPE_VFMODULE} vfModule +${MODEL_TYPE_VOLUME_GROUP} volumeGroup +${MODEL_TYPE_NETWORK} network +${INV_MODEL_TYPE_VNF} vnf1 +${INVALID_MODEL_TYPE} INVALID_MODEL_TYPE +${INVALID_SERVICE_MODEL_NAME} INVALID_SERVICE_MODEL +${INVALID_VFMODULE_MODEL_NAME} INVALID_VFMODULE_MODEL +${INVALID_CLOUD_REGION_ID} INVALID_CLR + +### CLOUD DATA ### +${TENANT_ID} 22eb191dd41a4f3c9be370fc638322f4
\ No newline at end of file diff --git a/tests/so/orchestration/resources/aai/aai_interface.robot b/tests/so/orchestration/resources/aai/aai_interface.robot new file mode 100644 index 00000000..67e828d2 --- /dev/null +++ b/tests/so/orchestration/resources/aai/aai_interface.robot @@ -0,0 +1,91 @@ +*** Settings *** +Documentation The main interface for interacting with A&AI. It handles low level stuff like managing the http request library and A&AI required fields +Library RequestsLibrary +Library UUID +Library HTTPUtils +Resource ../global_properties.robot + +*** Variables *** +${AAI_HEALTH_PATH} /aai/util/echo?action=long +${VERSIONED_INDEX_PATH} /aai/v14 +${AAI_FRONTEND_ENDPOINT} ${GLOBAL_AAI_SERVER_PROTOCOL}://${GLOBAL_INJECTED_AAI1_IP_ADDR}:${GLOBAL_AAI_SERVER_PORT} + +*** Keywords *** +Run A&AI Health Check + [Documentation] Runs an A&AI health check + :FOR ${i} IN RANGE 20 + \ ${resp}= Run A&AI Get Request ${AAI_HEALTH_PATH} + \ Log Received response from so ${resp.json()} + \ Log Received response from so status ${resp.status_code} + \ ${exit_loop}= Evaluate ${resp.status_code} == 200 + \ Exit For Loop If ${exit_loop} + \ Sleep 15s + +Run A&AI Get Request + [Documentation] Runs an A&AI get request + [Arguments] ${data_path} + Disable Warnings + Create Session aai ${AAI_FRONTEND_ENDPOINT} + ${uuid}= Generate UUID + ${headers}= Create Dictionary Authorization=Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA== Accept=application/json Content-Type=application/json X-TransactionId=Test X-FromAppId=SO + ${resp}= Get Request aai ${data_path} headers=${headers} + Log Received response from aai ${resp.text} + [Return] ${resp} + +Run A&AI Put Request + [Documentation] Runs an A&AI put request + [Arguments] ${data_path} ${data} + Disable Warnings + Create Session aai ${AAI_FRONTEND_ENDPOINT} + ${uuid}= Generate UUID + ${headers}= Create Dictionary Authorization=Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA== Accept=application/json Content-Type=application/json X-TransactionId=Test X-FromAppId=SO + ${resp}= Put Request aai ${data_path} data=${data} headers=${headers} + Log Received response from aai ${resp.text} + [Return] ${resp} + +Run A&AI Post Request + [Documentation] Runs an A&AI Post request + [Arguments] ${data_path} ${data} + Disable Warnings + Create Session aai ${AAI_FRONTEND_ENDPOINT} + ${uuid}= Generate UUID + ${headers}= Create Dictionary Authorization=Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA== Accept=application/json Content-Type=application/json X-TransactionId=${GLOBAL_APPLICATION_ID}-${uuid} X-FromAppId=${GLOBAL_APPLICATION_ID} + ${resp}= Post Request aai ${data_path} data=${data} headers=${headers} + Log Received response from aai ${resp.text} + [Return] ${resp} + +Run A&AI Patch Request + [Documentation] Runs an A&AI Post request + [Arguments] ${data_path} ${data} + Disable Warnings + Log ${data} + Create Session aai ${AAI_FRONTEND_ENDPOINT} + ${uuid}= Generate UUID + ${headers}= Create Dictionary Accept=application/json Content-Type=application/merge-patch+json X-TransactionId=${GLOBAL_APPLICATION_ID}-${uuid} X-FromAppId=${GLOBAL_APPLICATION_ID} X-HTTP-Method-Override=PATCH + ${resp}= Post Request aai ${data_path} data=${data} headers=${headers} + Log Received response from aai ${resp.text} + [Return] ${resp} + +Run A&AI Delete Request + [Documentation] Runs an A&AI delete request + [Arguments] ${data_path} ${resource_version} + Disable Warnings + Create Session aai ${AAI_FRONTEND_ENDPOINT} + ${uuid}= Generate UUID + ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=${GLOBAL_APPLICATION_ID}-${uuid} X-FromAppId=${GLOBAL_APPLICATION_ID} + ${resp}= Delete Request aai ${data_path}?resource-version=${resource_version} headers=${headers} + Log Received response from aai ${resp.text} + [Return] ${resp} + +Delete A&AI Entity + [Documentation] Deletes an entity in A&AI + [Arguments] ${uri} + ${get_resp}= Run A&AI Get Request ${VERSIONED_INDEX PATH}${uri} + Run Keyword If '${get_resp.status_code}' == '200' Delete A&AI Entity Exists ${uri} ${get_resp.json()['resource-version']} + +Delete A&AI Entity Exists + [Documentation] Deletes an A&AI entity + [Arguments] ${uri} ${resource_version_id} + ${put_resp}= Run A&AI Delete Request ${VERSIONED_INDEX PATH}${uri} ${resource_version_id} + Should Be Equal As Strings ${put_resp.status_code} 204 + diff --git a/tests/so/orchestration/resources/aai/service_instance.robot b/tests/so/orchestration/resources/aai/service_instance.robot new file mode 100644 index 00000000..bdf45475 --- /dev/null +++ b/tests/so/orchestration/resources/aai/service_instance.robot @@ -0,0 +1,191 @@ +*** Settings *** +Documentation Validate A&AI Serivce Instance +... +... Validate A&AI Serivce Instance + +Resource aai_interface.robot +Library Collections +Library OperatingSystem +Library RequestsLibrary +Library JSONUtils +Library HttpLibrary.HTTP +Library StringTemplater +Resource ../json_templater.robot +Resource ../aai/aai_interface.robot +Resource ../properties/cloudRegion.robot +*** Variables *** +${INDEX PATH} /aai/v15 +${GENERIC_QUERY_PATH} /search/generic-query? +${SYSTEM USER} robot-ete +${CUSTOMER SPEC PATH} /business/customers/customer/ +${SERVICE SUBSCRIPTIONS} /service-subscriptions/service-subscription/ +${SERVICE_INSTANCE_QUERY} /service-instances?service-instance-name= +${SERVCE INSTANCE TEMPLATE} robot/assets/templates/aai/service_subscription.template +${vnf_orch_update_json} robot/assets/templates/aai/vnf_orch_update.template +${GENERIC_VNF_PATH_TEMPLATE} /network/generic-vnfs/generic-vnf/\${vnf_id}/vf-modules/vf-module/\${vf_module_id} +${GENERIC_VNF_QUERY_TEMPLATE} /network/generic-vnfs/generic-vnf/\${vnf_id}/vf-modules/vf-module?vf-module-name=\${vf_module_name} +${VLB_CLOSED_LOOP_HACK_BODY} robot/assets/templates/aai/vlb_closed_loop_hack.template +${ROOT_CLOUD_PATH} /cloud-infrastructure/cloud-regions/cloud-region +#*************** Test Case Variables ************* +${VLB_CLOSED_LOOP_DELETE} +${VLB_CLOSED_LOOP_VNF_ID} + + +*** Keywords *** +Validate Service Instance + [Documentation] Query and Validates A&AI Service Instance + [Arguments] ${service_instance_name} ${service_type} ${customer_name} ${orchestration_status} + ${cust_resp}= Run A&AI Get Request ${INDEX PATH}/business/customers?subscriber-name=${customer_name} + ${resp}= Run A&AI Get Request ${INDEX PATH}${CUSTOMER SPEC PATH}${cust_resp.json()['customer'][0]['global-customer-id']}${SERVICE SUBSCRIPTIONS}${service_type}${SERVICE_INSTANCE_QUERY}${service_instance_name} + Dictionary Should Contain Value ${resp.json()['service-instance'][0]} ${service_instance_name} + Dictionary Should Contain Value ${resp.json()['service-instance'][0]} ${orchestration_status} + +Validate Service Instance By Id + [Documentation] Query and Validates A&AI Service Instance + [Arguments] ${service_instance_id} + ${resp}= Run A&AI Get Request ${INDEX PATH}/nodes/service-instances/service-instance/${service_instance_id}?depth=0&nodes-only + Should Be Equal As Strings ${resp.status_code} 200 + +Delete Service Instance by Id + [Documentation] Delete passed service in A&AI + [Arguments] ${service_instance_id} + ${resp}= Run A&AI Get Request ${INDEX PATH}/nodes/service-instances/service-instance/${service_instance_id} + Run Keyword If '${resp.status_code}' == '200' Run A&AI Delete Request ${INDEX PATH}/nodes/service-instances/service-instance/${service_instance_id} ${resp.json()['resource-version']} + +Validate Customer By Id + [Documentation] Query and Validates A&AI Service Instance + [Arguments] ${customer_id} ${status_code} + ${cust_resp}= Run A&AI Get Request ${INDEX PATH}/business/customers/customer/${customer_id} + Should Be Equal As Strings ${cust_resp.status_code} ${status_code} + +Validate Generic VNF + [Documentation] Query and Validates A&AI Service Instance + [Arguments] ${vnf_name} ${vnf_type} ${service_instance_id} + ${generic_vnf}= Run A&AI Get Request ${INDEX PATH}/network/generic-vnfs/generic-vnf?vnf-name=${vnf_name} + Dictionary Should Contain Value ${generic_vnf.json()} ${vnf_name} + ${returned_vnf_type}= Get From Dictionary ${generic_vnf.json()} vnf-type + Should Contain ${returned_vnf_type} ${vnf_type} + ${vnf_id}= Get From Dictionary ${generic_vnf.json()} vnf-id + ${generic_vnf}= Run A&AI Get Request ${INDEX PATH}/network/generic-vnfs/generic-vnf/${vnf_id}?depth=all + [Return] ${generic_vnf.json()} + +Delete Vnf by Id + [Documentation] Delete passed service in A&AI + [Arguments] ${vnf_id} + ${resp}= Run A&AI Get Request ${INDEX PATH}/network/generic-vnfs/generic-vnf/${vnf_id} + + Run Keyword If '${resp.status_code}'=='200' Run A&AI Delete Request ${INDEX PATH}/network/generic-vnfs/generic-vnf/${vnf_id} ${resp.json()['resource-version']} + +Delete Volume Group by Id + [Documentation] Delete passed service in A&AI + [Arguments] ${volume_group_instance_id} + ${resp}= Run A&AI Get Request ${INDEX PATH}${ROOT_CLOUD_PATH}/${cloud_owner}/${cloud_region_id}/volume-groups/volume-group/${volume_group_instance_id} + + Run Keyword If '${resp.status_code}'=='200' Run A&AI Delete Request ${INDEX PATH}${ROOT_CLOUD_PATH}/${cloud_owner}/${cloud_region_id}/volume-groups/volume-group/${volume_group_instance_id} ${resp.json()['resource-version']} + +Validate Tenant By Name + [Documentation] Query and Validates A&AI Service Instance + [Arguments] ${tenant_name} ${cloud_owner} ${cloud_region} ${response_code} + ${tenants}= Run A&AI Get Request ${INDEX PATH}/cloud-infrastructure/cloud-regions/cloud-region/${cloud_owner}/${cloud_region}/tenants?tenant-name=${tenant_name} + Should Be Equal As Strings ${tenants.status_code} ${response_code} + Run Keyword If '${response_code}'=='200' Dictionary Should Contain Value ${tenants.json()['tenant'][0]} ${tenant_name} + +Validate Line of Business + [Arguments] ${vnf_id} @{Lobs} + :FOR ${ELEMENT} IN @{Lobs} + \ ${response} Run A&AI Get Request ${INDEX PATH}/network/generic-vnfs/generic-vnf/${vnf_id}/related-to/lines-of-business?line-of-business-name=${ELEMENT} + \ Should Be Equal As Strings ${response.status_code} 200 + +Validate Platform + [Arguments] ${vnf_id} @{platforms} + :FOR ${platform} IN @{platforms} + \ ${response} Run A&AI Get Request ${INDEX PATH}/network/generic-vnfs/generic-vnf/${vnf_id}/related-to/platforms?platform-name=${platform} + \ Should Be Equal As Strings ${response.status_code} 200 + + +Validate Owning Entity By Name + [Arguments] ${owning_entity_name} + ${oe_resp}= Run A&AI Get Request ${INDEX PATH}/business/owning-entities?owning-entity-name=${owning_entity_name} + Should Be Equal As Strings ${oe_resp.json()['owning-entity'][0]['owning-entity-name']} ${owning_entity_name} + + + +VLB Closed Loop Hack + [Arguments] ${service} ${generic_vnf} ${closedloop_vf_module} + Return From Keyword If '${service}' != 'vLB' + ${vnf_id}= Get From Dictionary ${generic_vnf} vnf-id + ${vf_modules}= Get From Dictionary ${generic_vnf} vf-modules + ${list}= Get From Dictionary ${vf_modules} vf-module + ${vfmodule}= Get From List ${list} 0 + ${persona_model_id}= Get From Dictionary ${closedloop_vf_module} invariantUUID + ${persona_model_version}= Get From Dictionary ${closedloop_vf_module} version + ${dummy}= Catenate dummy_${vnf_id} + ${dict}= Create Dictionary vnf_id=${vnf_id} vf_module_id=${dummy} persona_model_id=${persona_model_id} persona_model_version=${persona_model_version} + ${datapath}= Template String ${GENERIC_VNF_PATH_TEMPLATE} ${dict} + ${data}= Fill JSON Template File ${VLB_CLOSED_LOOP_HACK_BODY} ${dict} + ${put_resp}= Run A&AI Put Request ${INDEX PATH}${datapath} ${data} + ${status_string}= Convert To String ${put_resp.status_code} + Should Match Regexp ${status_string} ^(201|412)$ + Set Test Variable ${VLB_CLOSED_LOOP_DELETE} ${datapath} + Set Test Variable ${VLB_CLOSED_LOOP_VNF_ID} ${vnf_id} + +VLB Closed Loop Hack Update + [Documentation] Update the A&AI vDNS scaling vf module to have persona-model-version 1 rather than 1.0 + [Arguments] ${stack_name} + ${dict}= Create Dictionary vnf_id=${VLB_CLOSED_LOOP_VNF_ID} vf_module_name=${stack_name} + ${query}= Template String ${GENERIC_VNF_QUERY_TEMPLATE} ${dict} + ${get_resp}= Run A&AI Get Request ${INDEX_PATH}${query} + ${json}= Set Variable ${get_resp.json()} + Set to Dictionary ${json} persona-model-version 1 + ${vf_module_id}= Get From Dictionary ${json} vf-module-id + Set to Dictionary ${dict} vf_module_id=${vf_module_id} + ${uri}= Template String ${GENERIC_VNF_PATH_TEMPLATE} ${dict} + ${resp}= Run A&AI Put Request ${INDEX_PATH}${uri} ${json} + ${get_resp}= Run A&AI Get Request ${INDEX_PATH}${query} + +Teardown VLB Closed Loop Hack + Return From Keyword If ' ${VLB_CLOSED_LOOP_DELETE}' == '' + Delete A&AI Entity ${VLB_CLOSED_LOOP_DELETE} + +Validate VF Module + [Documentation] Query and Validates A&AI Service Instance + [Arguments] ${vf_module_name} ${stack_type} + Run Keyword If '${stack_type}'=='vLB' Validate vLB Stack ${vf_module_name} + Run Keyword If '${stack_type}'=='vFW' Validate Firewall Stack ${vf_module_name} + Run Keyword If '${stack_type}'=='vVG' Validate vVG Stack ${vf_module_name} + +*** Keywords *** +Create AAI Service Instance + [Documentation] Query and Validates A&AI Service Instance + [Arguments] ${customer_id} ${service_type} ${service_instance_id} ${service_instance_name} + ${json_string}= Catenate { "service-type": "VDNS" , "service-subscriptions":[{"service-instance-id":"instanceid123","service-instance-name":"VDNS"}]} + ${put_resp}= Run A&AI Put Request ${INDEX PATH}${CUSTOMER SPEC PATH}${CUSTOMER ID}${SERVICE SUBSCRIPTIONS}/{service_type} ${json_string} + Should Be Equal As Strings ${put_resp.status_code} 201 + [Return] ${put_resp.status_code} + +Validate Service Instance Not Exist + [Arguments] ${service_instance_name} ${service_type} ${customer_name} + ${cust_resp}= Run A&AI Get Request ${INDEX PATH}/business/customers?subscriber-name=${customer_name} + ${resp}= Run A&AI Get Request ${INDEX PATH}${CUSTOMER SPEC PATH}${cust_resp.json()['customer'][0]['global-customer-id']}${SERVICE SUBSCRIPTIONS}${service_type}${SERVICE_INSTANCE_QUERY}${service_instance_name} + Should Be Equal As Strings ${resp.status_code} 404 + +Validate Service Instance Not Exist By Id + [Arguments] ${service_instance_id} + ${resp}= Run A&AI Get Request ${INDEX PATH}/nodes/service-instances/service-instance/${service_instance_id}?depth=0&nodes-only + Should Be Equal As Strings ${resp.status_code} 404 + +Validate Customer Not Exist + [Documentation] Query and Validates A&AI Service Instance + [Arguments] ${customer_name} + ${cust_resp}= Run A&AI Get Request ${INDEX PATH}/business/customers?subscriber-name=${customer_name} + Should Be Equal As Strings ${cust_resp.status_code} 404 + +Validate Owning Entity + [Arguments] ${owning_entity_id} ${status_code} + ${oe_resp}= Run A&AI Get Request ${INDEX PATH}/business/owning-entities/owning-entity/${owning_entity_id} + Should Be Equal As Strings ${oe_resp.status_code} ${status_code} + +Validate Project + [Arguments] ${project_name} ${status_code} + ${proj_resp}= Run A&AI Get Request ${INDEX PATH}/business/projects/project/${project_name} + Should Be Equal As Strings ${proj_resp.status_code} ${status_code} diff --git a/tests/so/orchestration/resources/bpmn-infra/aLaCarte/Create/ServiceInstance.robot b/tests/so/orchestration/resources/bpmn-infra/aLaCarte/Create/ServiceInstance.robot new file mode 100644 index 00000000..bab0b327 --- /dev/null +++ b/tests/so/orchestration/resources/bpmn-infra/aLaCarte/Create/ServiceInstance.robot @@ -0,0 +1,172 @@ +*** Settings *** +Library Collections +Library RequestsLibrary +Library HttpLibrary.HTTP +Library OperatingSystem +Library BuiltIn +Library String +Library CSVLibrary +Resource ../../../json_templater.robot +Resource ../../../SoKeywords.robot +Resource ../../../common/SoVariables.robot +Resource ../../../so_interface.robot +Resource ../../../aai/service_instance.robot +Resource ../../../common/Variables.robot +Resource ../../../properties/tenant.robot +Resource ../../../properties/cloudRegion.robot + +*** Variables *** +${data_file} ../../../../data/bpmn-infra/aLaCarte/ServiceInstance.csv +${create_customer_template_file} tests/so/orchestration/assets/templates/aai/add_customer_required_fields.template +${create_service_subscription_template_file} tests/so/orchestration/assets/templates/aai/service_subscription_required_fields.template +${create_service_model_template_file} tests/so/orchestration/assets/templates/aai/service_model.template +${serviceInstanceDictionary} +${serv_inst_id} +${serv_inst_tc_code} +${SUBSCRIBER_TYPE} CUST +${EXPECTED_ORCHESTRATION_STATUS} Active +${tenant_json} tests/so/orchestration/assets/templates/setup_tenant.json +${cloud_region_json} tests/so/orchestration/assets/templates/setup_cloud_region.json +${NOT_APPLICABLE} NA + +*** Keywords *** + +Setup GR Create Service Instance + [Arguments] ${serv_inst_tc_code} + ${serviceInstanceDictionary} Read CSV Data And Create Dictionary ${CURDIR}/${data_file} + Set Suite Variable ${serviceInstanceDictionary} + Set Suite Variable ${serv_inst_tc_code} + + Setup Cloud Region + Setup Tenant in AAI + + ${create_service_instance_data} Get From Dictionary ${serviceInstanceDictionary} ${serv_inst_tc_code} + + ${SUBSCRIBER_ID} Get From Dictionary ${create_service_instance_data} subscriberId + Setup Customer ${SUBSCRIBER_ID} + ${SUBSCRIPTION_SERVICE_TYPE} Get From Dictionary ${create_service_instance_data} serviceType + Setup Service Subscription ${SUBSCRIBER_ID} ${SUBSCRIPTION_SERVICE_TYPE} + + Setup Service Model in A&AI ${serviceInstanceDictionary} ${serv_inst_tc_code} + +Teardown GR Create Service Instance + [Arguments] ${service_instance_id} + Delete Service Instance by Id ${service_instance_id} + + +Setup Cloud Region + [Documentation] Setup the cloud region in AAI + + ${cloud_region_data} Create Dictionary cloudOwner=${cloudOwner} cloudRegionId=${cloudRegionId} cloudType=${cloudType} + ... ownerDefinedType=${ownerDefinedType} cloudRegionVersion=${cloudRegionVersion} cloudZone=${cloudZone} + ... complexName=${complexName} sriovAutomation=${sriovAutomation} + ${create_cloud_region_json} Fill JSON Template File ${cloud_region_json} ${cloud_region_data} + Run A&AI Put Request ${VERSIONED_INDEX_PATH}/cloud-infrastructure/cloud-regions/cloud-region/${cloudOwner}/${cloudRegionId} ${create_cloud_region_json} + + ${json}= OperatingSystem.Get File tests/so/orchestration/assets/templates/gr-api/PhysicalServerCreate.json + ${returned_json}= To Json ${json} + Run A&AI Put Request aai/v14/cloud-infrastructure/pservers/pserver/rdm52r19c001 ${returned_json} + +Setup Tenant in AAI + [Documentation] Setup the tenant in AAI + + ${tenant_data} Create Dictionary tenantId=${aai_tenant_Id} tenantName=${aai_tenant_name} + ${create_tenant_json} Fill JSON Template File ${tenant_json} ${tenant_data} + Run A&AI Put Request ${VERSIONED_INDEX_PATH}/cloud-infrastructure/cloud-regions/cloud-region/${cloudOwner}/${cloudRegionId}/tenants/tenant/${aai_tenant_Id} ${create_tenant_json} + +Setup Customer + [Documentation] Creates customer for use in tests + [Arguments] ${SUBSCRIBER_ID} + + ${create_customer_data} Create Dictionary global_customer_id=${SUBSCRIBER_ID} subscriber_name=${SUBSCRIBER_ID} subscriber_type=${SUBSCRIBER_TYPE} + Set Suite Variable ${create_customer_data} + ${create_customer_json} Fill JSON Template File ${create_customer_template_file} ${create_customer_data} + + Run A&AI Put Request ${VERSIONED_INDEX_PATH}/business/customers/customer/${SUBSCRIBER_ID} ${create_customer_json} + +Setup Service Subscription + [Documentation] Creates service subscription for use in tests + [Arguments] ${SUBSCRIBER_ID} ${SUBSCRIPTION_SERVICE_TYPE} + ${create_service_subscription_data} Create Dictionary service_type=${SUBSCRIPTION_SERVICE_TYPE} + Set Suite Variable ${create_service_subscription_data} + ${create_service_subscription_json} Fill JSON Template File ${create_service_subscription_template_file} ${create_service_subscription_data} + + Run A&AI Put Request ${VERSIONED_INDEX_PATH}/business/customers/customer/${SUBSCRIBER_ID}/service-subscriptions/service-subscription/${SUBSCRIPTION_SERVICE_TYPE} ${create_service_subscription_json} + +Setup Service Model in A&AI + [Arguments] ${serviceeDictionary} ${serv_inst_tc_code} + + ${create_service_instance_data} Get From Dictionary ${serviceInstanceDictionary} ${serv_inst_tc_code} + ${modelInvariantId} Get From Dictionary ${create_service_instance_data} serviceInstModelInvariantId + ${modelVersionId} Get From Dictionary ${create_service_instance_data} serviceInstModelNameVersionId + ${modelName} Get From Dictionary ${create_service_instance_data} serviceInstModelName + ${modelType} Get From Dictionary ${create_service_instance_data} serviceInstModelType + ${modelVersion} Get From Dictionary ${create_service_instance_data} serviceInstModelVersion + ${modelDescription} Get From Dictionary ${create_service_instance_data} serviceInstModelDescription + Setup Model in AAI ${modelInvariantId} ${modelType} ${modelVersionId} ${modelName} ${modelVersion} ${modelDescription} + +Setup Model in AAI + [Documentation] Setup Model in AAI for use in tests + [Arguments] ${modelInvariantId} ${modelType} ${modelVersionId} ${modelName} ${modelVersion} ${modelDescription} + ${create_service_model_data} Create Dictionary modelInvariantId=${modelInvariantId} modelType=${modelType} modelVersionId=${modelVersionId} + ... modelName=${modelName} modelVersion=${modelVersion} modelDescription=${modelDescription} + ${create_service_model_json} Fill JSON Template File ${create_service_model_template_file} ${create_service_model_data} + + Run A&AI Put Request ${VERSIONED_INDEX_PATH}/service-design-and-creation/models/model/${modelInvariantId} ${create_service_model_json} + + +Create Service Instance + [Documentation] Test Template for CreateServiceInstanceInfra + [Arguments] ${serv_inst_tc_code} ${payload_template} + log in create si sub + Log ${serv_inst_tc_code} + Log ${payload_template} + ${create_service_instance_data} Get From Dictionary ${serviceInstanceDictionary} ${serv_inst_tc_code} + Log create si data + Log ${create_service_instance_data} + Log ${CURDIR}/${payload_template} + Log ${create_service_instance_data} + Log ready to fill + ${service_body}= Fill JSON Template File ${CURDIR}/${payload_template} ${create_service_instance_data} + Log got service body + Log ${service_body} + Log after service body + ${serv_inst_id} ${request_id} ${request_completion_status} ${status_code} Invoke Create Service Instance Flow ${service_body} + [Return] ${serv_inst_id} ${request_id} ${request_completion_status} ${status_code} ${service_body} + + + +Invoke Create Service Instance Flow + [Documentation] Create Service Instance + [Arguments] ${service_body} + log invoking + ${create_service_response} Run SO Post request ${SO_REST_URI_CREATE_SERVICE} ${service_body} + log retunred ${create_service_response} + Return From Keyword If ${create_service_response.status_code} != ${HTTP_ACCEPTED} ${EMPTY} ${EMPTY} ${EMPTY} ${create_service_response.status_code} + ${request_id_string} Get Json Value ${create_service_response.content} /requestReferences/requestId + ${request_id} Get Substring ${request_id_string} 1 -1 + ${instance_id_string} Get Json Value ${create_service_response.content} /requestReferences/instanceId + ${instance_id} Get Substring ${instance_id_string} 1 -1 + Log ${instance_id} + ${request_completion_status} ${orchestration_failure_message} Run Keyword If ${create_service_response.status_code} == ${HTTP_ACCEPTED} + ... Poll Orchestration Request ${request_id} + + [Return] ${instance_id} ${request_id} ${request_completion_status} ${create_service_response.status_code} + + Invoke Delete Service Instance Flow + [Documentation] Delete a service instance. + [Arguments] ${service_body} ${service_instance} + + ${delete_service_response} Run SO Delete request ${SO_REST_URI_DELETE_SERVICE}/${service_instance} data=${service_body} + + Return From Keyword If ${delete_service_response.status_code} != ${HTTP_ACCEPTED} ${EMPTY} ${EMPTY} ${EMPTY} ${delete_service_response.status_code} + + ${request_id_string} Get Json Value ${delete_service_response.content} /requestReferences/requestId + ${request_id} Get Substring ${request_id_string} 1 -1 + ${instance_id_string} Get Json Value ${delete_service_response.content} /requestReferences/instanceId + ${instance_id} Get Substring ${instance_id_string} 1 -1 + + ${request_completion_status} ${orchestration_failure_message} Run Keyword If ${delete_service_response.status_code} == ${HTTP_ACCEPTED} + ... Poll Orchestration Request ${request_id} + + [Return] ${instance_id} ${request_id} ${request_completion_status} ${delete_service_response.status_code} diff --git a/tests/so/orchestration/resources/common/SoVariables.robot b/tests/so/orchestration/resources/common/SoVariables.robot new file mode 100644 index 00000000..3bdfdc64 --- /dev/null +++ b/tests/so/orchestration/resources/common/SoVariables.robot @@ -0,0 +1,68 @@ +*** Variables *** +### Orchestration Polling Properties ### +${POLL_WAIT_TIME} 5 +${MEGA_POLL_WAIT_TIME} 5 +${MAX_POLL_COUNT} 72 + +### Common Properties ### +${VNFS} vnfs +${VFMODULES} vfModules +${SO_REST_URI} /onap/so/infra/serviceInstantiation/v7/serviceInstances +${SO_ORCHESTRATION_REQUESTS_URI} /onap/so/infra/orchestrationRequests/v7 +${SO_HEALTHCHECK_URI} /manage/health + +### Layer3 Properties ### +&{SO_LAYER3_HEADERS} Content-Type=application/xml Accept=application/xml Authorization=Basic YXBpaEJwbW46Y2FtdW5kYS1SMTUxMiE= +### Service Properties ### +${SO_REST_URI_CREATE_SERVICE} ${SO_REST_URI} +${SO_REST_URI_DELETE_SERVICE} ${SO_REST_URI} + +### VNF Module Properties ### +${SO_REST_URI_CREATE_VFMODULE} ${SO_REST_URI}/<SERVICEINSTANCEID>/vnfs/<VNFINSTANCEID>/vfModules +${SO_REST_URI_DELETE_VFMODULE} ${SO_REST_URI}/<SERVICEINSTANCEID>/vnfs/<VNFINSTANCEID>/vfModules/<VFMODULEINSTANCEID> +### Messages ### +${TIME_OUT_MESSAGE} No Successful response within specified time +${ORCH_FAILURE_MESSAGE} Orchestration request has failed + +##### VF SPECIFIC PROPERTIES ##### +${INVALID_SERVICE_ID_MSG} "Error parsing request.${SPACE}${SPACE}No valid serviceInstanceId is specified" +${INVALID_VNF_INST_ID_MSG} "Error parsing request.${SPACE}${SPACE}No valid vnfInstanceId is specified" +${DELETE_VNF_FAIL_MSG} "Can't Delete Generic Vnf. Generic Vnf is still in use." + +##### NETWORK SPECIFIC PROPERTIES ##### +${INVALID_NW_INST_ID_MSG} "Error parsing request.${SPACE}${SPACE}No valid networkInstanceId is specified" +${INV_MODEL_NAME_MSG} "Received error from Network Adapter: Unknown Network Type: CONTRAIL_INTERNAL" +${BLANK_MODEL_NAME_MSG} "Error parsing request.${SPACE}${SPACE}No valid modelName is specified" +${INV_REGION_ID_MSG} "Received error from Network Adapter: Cloud Site [RegionTwo] not found" +${BLANK_REGION_ID_MSG} "Error parsing request.${SPACE}${SPACE}No valid lcpCloudRegionId is specified" +${INV_TENANT_MSG} "Received error from Network Adapter: 404 Not Found: " +${BLANK_TENANT_ID_MSG} "Error parsing request.${SPACE}${SPACE}No valid tenantId is specified" +${INV_SOURCE_MSG} "Recipe does not exist in catalog DB" +${BLANK_SOURCE_MSG} "Error parsing request.${SPACE}${SPACE}No valid source is specified" +${BLANK_INVAR_ID_MSG} "Error parsing request.${SPACE}${SPACE}No valid modelInvariantId is specified" +${BLANK_VER_ID_MSG} "Error parsing request.${SPACE}${SPACE}No valid modelVersionId is specified" +${BLANK_REQ_ID_MSG} "Error parsing request.${SPACE}${SPACE}No valid requestorId is specified" + +### Orchestration Constants ### +${ORCH_REQUEST_COMPLETE} COMPLETE +${ORCH_REQUEST_COMPLETED} COMPLETED +${ORCH_REQUEST_FAILED} FAILED +${ORCH_REQUEST_IN_PROGRESS} IN_PROGRESS + +### MODEL TYPE ### +${MODEL_TYPE_SERVICE} service +${MODEL_TYPE_VNF} vnf +${MODEL_TYPE_VFMODULE} vfModule +${MODEL_TYPE_VOLUME_GROUP} volumeGroup +${MODEL_TYPE_NETWORK} network +${INV_MODEL_TYPE_VNF} vnf1 +${INVALID_MODEL_TYPE} INVALID_MODEL_TYPE +${INVALID_SERVICE_MODEL_NAME} INVALID_SERVICE_MODEL +${INVALID_VFMODULE_MODEL_NAME} INVALID_VFMODULE_MODEL +${INVALID_CLOUD_REGION_ID} INVALID_CLR + + +### CLOUD DATA ### +${TENANT_ID} 22eb191dd41a4f3c9be370fc638322f4 + + diff --git a/tests/so/orchestration/resources/common/Variables.robot b/tests/so/orchestration/resources/common/Variables.robot new file mode 100644 index 00000000..a6ee32b2 --- /dev/null +++ b/tests/so/orchestration/resources/common/Variables.robot @@ -0,0 +1,15 @@ +*** Variables *** +### HTTP response Codes ### +${HTTP_OK} 200 +${HTTP_ACCEPTED} 202 +${HTTP_NO_CONTENT} 204 +${HTTP_BAD_REQUEST} 400 +${HTTP_BAD_GATEWAY} 502 +${HTTP_RESOURCE_NOT_FOUND} 404 +${INTERNAL_SERVER_ERROR} 500 +${METHOD_NOT_ALLOWED} 405 + +###TRUE FLASE##### +${TRUE_VALUE} true +${FALSE_VALUE} false + diff --git a/tests/so/orchestration/resources/global_properties.robot b/tests/so/orchestration/resources/global_properties.robot new file mode 100644 index 00000000..a4a0f44d --- /dev/null +++ b/tests/so/orchestration/resources/global_properties.robot @@ -0,0 +1,74 @@ +*** Settings *** +Documentation store all properties that can change or are used in multiple places here +... format is all caps with underscores between words and prepended with GLOBAL +... make sure you prepend them with GLOBAL so that other files can easily see it is from this file. + + +*** Variables *** +${GLOBAL_APPLICATION_ID} robot-ete +${GLOBAL_SELENIUM_BROWSER} chrome +${GLOBAL_SELENIUM_BROWSER_CAPABILITIES} Create Dictionary +${GLOBAL_SELENIUM_DELAY} 0 +${GLOBAL_SELENIUM_BROWSER_IMPLICIT_WAIT} 5 +${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT} 15 +${GLOBAL_OPENSTACK_HEAT_SERVICE_TYPE} orchestration +${GLOBAL_OPENSTACK_CINDER_SERVICE_TYPE} volume +${GLOBAL_OPENSTACK_NOVA_SERVICE_TYPE} compute +${GLOBAL_OPENSTACK_NEUTRON_SERVICE_TYPE} network +${GLOBAL_OPENSTACK_GLANCE_SERVICE_TYPE} image +${GLOBAL_OPENSTACK_KEYSTONE_SERVICE_TYPE} identity +${GLOBAL_OPENSTACK_STACK_DEPLOYMENT_TIMEOUT} 600s +${GLOBAL_AAI_CLOUD_OWNER} CloudOwner +${GLOBAL_AAI_CLOUD_OWNER_DEFINED_TYPE} OwnerType +${GLOBAL_AAI_COMPLEX_NAME} clli1 +${GLOBAL_AAI_PHYSICAL_LOCATION_ID} clli1 +${GLOBAL_BUILD_NUMBER} 0 +${GLOBAL_VID_UI_TIMEOUT_SHORT} 20s +${GLOBAL_VID_UI_TIMEOUT_MEDIUM} 60s +${GLOBAL_VID_UI_TIMEOUT_LONG} 120s +${GLOBAL_VM_PRIVATE_KEY} ${EXECDIR}/robot/assets/keys/robot_ssh_private_key.pvt +${GLOBAL_AAI_ZONE_ID} nova1 +${GLOBAL_AAI_ZONE_NAME} nova +${GLOBAL_AAI_DESIGN_TYPE} integration +${GLOBAL_AAI_ZONE_CONTEXT} labs +${GLOBAL_AAI_SERVER_PROTOCOL} http +${GLOBAL_INJECTED_AAI1_IP_ADDR} localhost +${GLOBAL_AAI_SERVER_PORT} 9900 +${GLOBAL_AAI_USERNAME} test +${GLOBAL_AAI_PASSWORD} test +${GLOBAL_INJECTED_OPENSTACK_TENANT_ID} test +${GLOBAL_INJECTED_OPENSTACK_USERNAME} test +${GLOBAL_INJECTED_OPENSTACK_PASSWORD} test +${GLOBAL_INJECTED_KEYSTONE} test +${GLOBAL_PACKET_GENERATOR_PORT} test +${GLOBAL_PACKET_GENERATOR_USERNAME} test +${GLOBAL_PACKET_GENERATOR_PASSWORD} test +${GLOBAL_SERVICE_TEMPLATE_MAPPING} test +${GLOBAL_DNS_TRAFFIC_DURATION} test +${GLOBAL_INJECTED_NETWORK} test +${GLOBAL_SO_SERVER_PROTOCOL} http +${GLOBAL_INJECTED_SO_IP_ADDR} localhost +${GLOBAL_SO_SERVER_PORT} 8080 +${GLOBAL_SO_ASDC_PORT} 8085 +${GLOBAL_SO_CATALOG_PORT} 8082 +${GLOBAL_SO_CAMUNDA_PORT} 8081 +${GLOBAL_SO_SIMULATOR_PORT} 10000 +${resourceLocation} /app/csar/ +${GLOBAL_SO_CATDB_API_URI} aaaa + +${GLOBAL_INJECTED_PROPERTIES} None +${GLOBAL_INJECTED_ARTIFACTS_VERSION} None +${GLOBAL_INJECTED_PUBLIC_NET_ID} None +${GLOBAL_INJECTED_CLOUD_ENV} None +${GLOBAL_INJECTED_SCRIPT_VERSION} None +${GLOBAL_INJECTED_VM_IMAGE_NAME} None +${GLOBAL_INJECTED_VM_FLAVOR} None +${GLOBAL_PRELOAD_PARAMETERS} None + +${GLOBAL_SDNGC_USERNAME} admin +${GLOBAL_SDNGC_PASSWORD} admin +${GLOBAL_SDNGC_SERVER_PROTOCOL} https +#${GLOBAL_INJECTED_SDNC_IP_ADDR} +${GLOBAL_INJECTED_SDNC_IP_ADDR} aaaa +${GLOBAL_SDNGC_REST_PORT} 8443 +${GLOBAL_SDNGC_ADMIN_PORT} 8443
\ No newline at end of file diff --git a/tests/so/orchestration/resources/json_templater.robot b/tests/so/orchestration/resources/json_templater.robot new file mode 100644 index 00000000..0dd88b90 --- /dev/null +++ b/tests/so/orchestration/resources/json_templater.robot @@ -0,0 +1,42 @@ +*** Settings *** +Documentation This resource is filling out json string templates and returning the json back +Library RequestsLibrary +Library StringTemplater +Library OperatingSystem +Library CSVLibrary +Library Collections +Resource global_properties.robot + +*** Keywords *** +Fill JSON Template + [Documentation] Runs substitution on template to return a filled in json + [Arguments] ${json} ${arguments} + ${returned_string}= Template String ${json} ${arguments} + Log ${returned_string} + ${returned_json}= To Json ${returned_string} + [Return] ${returned_json} + +Fill JSON Template File + [Documentation] Runs substitution on template to return a filled in json + [Arguments] ${json_file} ${arguments} + ${json}= OperatingSystem.Get File ${json_file} + ${returned_json}= Fill JSON Template ${json} ${arguments} + [Return] ${returned_json} + +Read CSV Data And Create Dictionary + [Documentation] Read CSV Data And Create Dictionary + [Arguments] ${file} + + ${status} Run Keyword And Return Status Variable Should Exist ${file} + ${csv_file} = set variable if ${status}==True ${file} + LOG ${csv_file} + ${dictionary} Create Dictionary + ${dictionary_list} read csv file to associative ${csv_file} + + ${dict_count} Get Length ${dictionary_list} + : FOR ${row_num} IN RANGE 0 ${dict_count} + \ Log ${dictionary_list[${row_num}]} + \ ${dict_key} Get From Dictionary ${dictionary_list[${row_num}]} uniqueKey + \ Set To Dictionary ${dictionary} ${dict_key} ${dictionary_list[${row_num}]} + + [Return] ${dictionary}
\ No newline at end of file diff --git a/tests/so/orchestration/resources/properties/cloudRegion.robot b/tests/so/orchestration/resources/properties/cloudRegion.robot new file mode 100644 index 00000000..b38f4285 --- /dev/null +++ b/tests/so/orchestration/resources/properties/cloudRegion.robot @@ -0,0 +1,13 @@ +*** Settings *** +Documentation Properties for CloudRegion + + +*** Variables *** +${cloudOwner} CloudOwner +${cloudRegionId} regionOne +${cloudType} openstack +${ownerDefinedType} LCP +${cloudRegionVersion} 3.0.3 +${cloudZone} TEST1 +${complexName} regionOne +${sriovAutomation} false
\ No newline at end of file diff --git a/tests/so/orchestration/resources/properties/tenant.robot b/tests/so/orchestration/resources/properties/tenant.robot new file mode 100644 index 00000000..2e1ae75d --- /dev/null +++ b/tests/so/orchestration/resources/properties/tenant.robot @@ -0,0 +1,7 @@ +*** Settings *** +Documentation Properties for Tenant + + +*** Variables *** +${aai_tenant_Id} 0422ffb57ba042c0800a29dc85ca70f8 +${aai_tenant_Name} tenantName
\ No newline at end of file diff --git a/tests/so/orchestration/resources/so_interface.robot b/tests/so/orchestration/resources/so_interface.robot new file mode 100644 index 00000000..6db22bf2 --- /dev/null +++ b/tests/so/orchestration/resources/so_interface.robot @@ -0,0 +1,76 @@ +*** Settings *** +Documentation The main interface for interacting with SO. It handles low level stuff like managing the http request library and SO required fields +Library RequestsLibrary +Library UUID +Library OperatingSystem +Library Collections +Library HTTPUtils +Resource global_properties.robot +Resource json_templater.robot +*** Variables *** +${SO_ENDPOINT} ${GLOBAL_SO_SERVER_PROTOCOL}://${GLOBAL_INJECTED_SO_IP_ADDR}:${GLOBAL_SO_SERVER_PORT} +${CATALOG_DB_ENDPOINT} ${GLOBAL_SO_SERVER_PROTOCOL}://${GLOBAL_INJECTED_SO_IP_ADDR}:${GLOBAL_SO_CATALOG_PORT} +${CAMUNDA_DB_ENDPOINT} ${GLOBAL_SO_SERVER_PROTOCOL}://${GLOBAL_INJECTED_SO_IP_ADDR}:${GLOBAL_SO_CAMUNDA_PORT} +${SIMULATOR_ENDPOINT} ${GLOBAL_SO_SERVER_PROTOCOL}://${GLOBAL_INJECTED_SO_IP_ADDR}:${GLOBAL_SO_SIMULATOR_PORT} + +*** Keywords *** + +Run SO Get Request + [Documentation] Runs an SO get request + [Arguments] ${full_path} ${accept}=application/json ${endPoint}=${SO_ENDPOINT} + Disable Warnings + Log Creating session ${SO_ENDPOINT} + ${session}= Create Session so ${SO_ENDPOINT} + ${uuid}= Generate UUID + ${uuidstring}= Convert To String ${uuid} + &{headers}= Create Dictionary Authorization=Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA== Content-Type=application/json Accept=application/json + ${resp}= Get Request so ${full_path} headers=${headers} + Log Received response from so ${resp.text} + [Return] ${resp} + +Poll SO Get Request + [Documentation] Runs an SO get request until a certain status is received. valid values are COMPLETE + [Arguments] ${data_path} ${status} + Disable Warnings + Log Creating session ${SO_ENDPOINT} + ${session}= Create Session so ${SO_ENDPOINT} + ${uuid}= Generate UUID + ${uuidstring}= Convert To String ${uuid} + &{headers}= Create Dictionary Authorization=Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA== Content-Type=application/json Accept=application/json + #do this until it is done + :FOR ${i} IN RANGE 20 + \ ${resp}= Get Request so ${data_path} headers=${headers} + \ Should Not Contain ${resp.text} FAILED + \ Log ${resp.json()['request']['requestStatus']['requestState']} + \ ${exit_loop}= Evaluate "${resp.json()['request']['requestStatus']['requestState']}" == "${status}" + \ Exit For Loop If ${exit_loop} + \ Sleep 15s + Log Received response from so ${resp.text} + [Return] ${resp} + +Run SO Post request + [Documentation] Runs an SO post request + [Arguments] ${data_path} ${data} + Disable Warnings + Log Creating session ${SO_ENDPOINT} + ${session}= Create Session so ${SO_ENDPOINT} + ${uuid}= Generate UUID + ${uuidstring}= Convert To String ${uuid} + &{headers}= Create Dictionary Authorization=Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA== Content-Type=application/json Accept=application/json + ${resp}= Post Request so ${data_path} data=${data} headers=${headers} + Log Received response from so ${resp.text} + [Return] ${resp} + + +Run SO Delete request + [Documentation] Runs an SO Delete request + [Arguments] ${data_path} ${data} + Disable Warnings + Log Creating session ${SO_ENDPOINT} + ${session}= Create Session so ${SO_ENDPOINT} + ${uuid}= Generate UUID + ${uuidstring}= Convert To String ${uuid} + &{headers}= Create Dictionary Authorization=Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA== Content-Type=application/json Accept=application/json + ${resp}= Delete Request so ${data_path} ${data} headers=${headers} + Log Received response from so ${resp.text} + [Return] ${resp} diff --git a/tests/so/orchestration/testsuites/bpmn-infra/aLaCarte/Create/ServiceInstantiationTest.robot b/tests/so/orchestration/testsuites/bpmn-infra/aLaCarte/Create/ServiceInstantiationTest.robot new file mode 100644 index 00000000..c4edba1b --- /dev/null +++ b/tests/so/orchestration/testsuites/bpmn-infra/aLaCarte/Create/ServiceInstantiationTest.robot @@ -0,0 +1,34 @@ +*** Settings *** +Documentation Testing Create Generic ALaCarte Service Instance flow +Resource ../../../../resources/bpmn-infra/aLaCarte/Create/ServiceInstance.robot +Resource ../../../../resources/common/Variables.robot +Resource ../../../../resources/common/SoVariables.robot +Resource ../../../../resources/aai/service_instance.robot + +*** Variables *** +${serv_inst_id} shouldOverWrite +${create_service_instance_template_file} ../../../../assets/templates/bpmn-infra/aLaCarte/Create/ServiceInstance.template + +*** Settings *** +*** Test Cases *** +Create and Delete Service Alacarte GR_API + [Tags] Smoke Sanity + [Setup] Setup GR Create Service Instance TC_1 + log starting create SI + ${serv_inst_id} ${request_id} ${request_completion_status} ${status_code} ${service_body} Create Service Instance TC_1 ${create_service_instance_template_file} + Should Be Equal As Strings ${status_code} 202 + Should Be Equal As Strings ${request_completion_status} COMPLETE + log validating SI + Validate Service Instance Robot_SI Robot_Test_Service_Type Robot_Test_Subscriber_ID Active + Validate Owning Entity c3f57fa8-ac7d-11e8-98d0-529269fb1459 200 + Validate Project GR_API_OE_SO_Test200 200 + + log starting delete SI + ${instance_id} ${delete_si_request_id} ${request_completion_status} ${delete_service_response.status_code} Invoke Delete Service Instance Flow ${service_body} ${serv_inst_id} + Should Be Equal As Strings ${delete_service_response.status_code} 202 + Should Be Equal As Strings ${request_completion_status} COMPLETE + Validate Service Instance Not Exist By Id ${serv_inst_id} + Validate Owning Entity c3f57fa8-ac7d-11e8-98d0-529269fb1459 200 + Validate Project GR_API_OE_SO_Test200 200 + + [Teardown] Teardown GR Create Service Instance ${serv_inst_id}
\ No newline at end of file |