From 6f0aed334a3de69392609b6073927526b385dc6c Mon Sep 17 00:00:00 2001 From: dhanasekaran Date: Tue, 17 May 2022 14:12:40 +0200 Subject: [PATCH] Sol003 Robot test support Change-Id: Id5fb767d6bdfc87ea721cb74b9b5e392761e93b8 Signed-off-by: dhanasekaran --- requirements.in | 2 + requirements.txt | 6 + robot-systest/lib/sol003_common_lib.robot | 103 ++++++++++ .../sol003_01-vnf-lifecycle-management.json | 38 ++++ .../sol003_01-vnf-lifecycle-management.robot | 176 ++++++++++++++++++ 5 files changed, 325 insertions(+) create mode 100644 robot-systest/lib/sol003_common_lib.robot create mode 100644 robot-systest/resources/sol003_01-vnf-lifecycle-management.json create mode 100644 robot-systest/testsuite/sol003_01-vnf-lifecycle-management.robot diff --git a/requirements.in b/requirements.in index d96fffb..3d69459 100644 --- a/requirements.in +++ b/requirements.in @@ -26,5 +26,7 @@ robotframework-jsonlibrary robotframework-requests robotframework-seleniumlibrary robotframework-sshlibrary +robotframework-jsonvalidator +robotframework-yamllibrary verboselogs yq diff --git a/requirements.txt b/requirements.txt index 09bec59..659a1df 100644 --- a/requirements.txt +++ b/requirements.txt @@ -329,6 +329,8 @@ robotframework==4.1.3 # robotframework-requests # robotframework-seleniumlibrary # robotframework-sshlibrary + # robotframework-jsonvalidator + # robotframework-yamllibrary robotframework-jsonlibrary==0.3.1 # via -r requirements.in robotframework-pythonlibcore==3.0.0 @@ -339,6 +341,10 @@ robotframework-seleniumlibrary==6.0.0 # via -r requirements.in robotframework-sshlibrary==3.8.0 # via -r requirements.in +robotframework-jsonvalidator==2.0.0 + # via -r requirements.in +robotframework-yamllibrary==0.2.8 + # via -r requirements.in ruamel.yaml==0.15.100 # via charm-tools scp==0.14.2 diff --git a/robot-systest/lib/sol003_common_lib.robot b/robot-systest/lib/sol003_common_lib.robot new file mode 100644 index 0000000..795a1a3 --- /dev/null +++ b/robot-systest/lib/sol003_common_lib.robot @@ -0,0 +1,103 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License + +*** Settings *** +Documentation Library with sol003 keywords and variables . + +Library RequestsLibrary +Library JsonValidator +Library yaml +Library JSONLibrary +Library String +Library OperatingSystem +Resource %{ROBOT_DEVOPS_FOLDER}/lib/vim_lib.robot + +*** Variables *** +&{HEADERS} Content-Type=application/json Accept=application/json +&{data} username=admin password=admin project-id=admin +@{success_status_code_list} 200 201 202 204 +${descriptor_content_type_gzip} application/gzip +${auth_token_uri} /osm/admin/v1/tokens +${HOST} ${EMPTY} +${vnf_instance_uri} /osm/vnflcm/v1/vnf_instances +${vnf_instantiate_uri} /osm/vnflcm/v1/vnf_instances +${vnf_instance_lcm_ops} /osm/vnflcm/v1/vnf_lcm_op_occs + +*** Keywords *** +Get Auth Token + [Tags] auth_token + Get Hostname + Create Session osmhit ${HOST} + Log Many ${auth_token_uri} @{data} ${data} + ${resp}= Post Request osmhit ${auth_token_uri} data=${data} headers=${HEADERS} + log ${resp} + Pass Execution If ${resp.status_code} in ${success_status_code_list} Get Auth Token completed + Set Suite Variable ${token_status_code} ${resp.status_code} + ${access_token}= Get Value From Json ${resp.json()} $..id + Set Test Variable ${access_token} ${access_token[0]} + Set Test Variable ${token_response} ${resp} + sleep 2s + +Set Dockerized Host + [Arguments] ${env_host} + Set Suite Variable ${HOST} https://${env_host} + +Set Standalone Host + [Arguments] ${env_host} + Set Suite Variable ${HOST} https://${env_host}:9999 + +Read Directory + [Documentation] To Read Current Direct ory + ${Directory}= Replace String ${CURDIR} lib resources/ + ${json_path}= Set Variable ${Directory} + [Return] ${JsonPath} + +Post Api Request + [Arguments] ${PostApi} + [Documentation] Keword to Post API Request + Create Session APISession ${HOST} + &{headers} Create Dictionary Content-Type=application/json Accept=application/json Authorization=Bearer ${access_token} + ${request_response}= Post Request APISession ${PostApi} data=${updated_json_obj} headers=${headers} + Set Suite Variable ${request_response} + ${response_statuscode} Convert To String ${request_response.status_code} + Set Suite Variable ${response_statuscode} + +Get HostName + [Documentation] Keyword to get the default osm Hostname + ${nbi_host}= Get Environment Variable OSM_HOSTNAME + ${passed}= Run Keyword And Return Status Should Contain ${nbi_host} : + Run Keyword If ${passed} Set Dockerized Host ${nbi_host} + ... ELSE Set Standalone Host ${nbi_host} + +Get ID + [Arguments] ${Key} + Pass Execution If ${request_response.status_code} in ${success_status_code_list} Get Auth Token completed + ${id}= Get Value From Json ${request_response.json()} $..${Key} + Set Suite Variable ${value} ${id[0]} + [Return] ${value} + +Update Json Value + [Arguments] ${JsonInput} ${key} + ${json_path}= Read Directory + ${json_obj}= Load JSON From File ${json_path}/${JsonInput} + ${updated_json_obj} JSONLibrary.Update Value To Json ${json_obj} $..${key} ${created_vim_account_id} + Set Suite Variable ${updated_json_obj} + +Get Api Request + [Arguments] ${uri} + [Documentation] Keyword to Get API Request + Create Session Session ${HOST} + &{headers} Create Dictionary Content-Type=application/json Accept=application/json Authorization=Bearer ${access_token} + ${request_response}= Get Request Session ${uri} headers=${Headers} + Set Suite Variable ${request_response} + ${response_statuscode} Convert To String ${request_response.status_code} + Set Suite Variable ${response_statuscode} diff --git a/robot-systest/resources/sol003_01-vnf-lifecycle-management.json b/robot-systest/resources/sol003_01-vnf-lifecycle-management.json new file mode 100644 index 0000000..267dd03 --- /dev/null +++ b/robot-systest/resources/sol003_01-vnf-lifecycle-management.json @@ -0,0 +1,38 @@ +{ + "data":[ + { + "vnfdId":"hackfest_basic_metrics-vnf", + "vnfInstanceName":"sol003-instance", + "vnfInstanceDescription":"Test vnfm instance description", + "vimAccountId":"8dc2f11d-e08a-4ec7-920c-6b8a88bff1e5", + "additionalParams":{ + "virtual-link-desc":[ + { + "id":"mgmtnet", + "mgmt-network":true + } + ], + "constituent-cpd-id":"vnf-cp0-ext", + "virtual-link-profile-id":"mgmtnet" + } + }, + { + "vnfName":"sol003-instance", + "vnfDescription":"vnf package", + "vnfId":"70b47595-fafa-4f63-904b-fc3ada60eebb", + "vimAccountId":"8dc2f11d-e08a-4ec7-920c-6b8a88bff1e5" + }, + { + "type":"SCALE_OUT", + "aspectId":"vdu_autoscale", + "numberOfSteps":"1", + "additionalParams":{ + "member-vnf-index":"1" + } + }, + { + "terminationType":"GRACEFUL", + "gracefulTerminationTimeout":"5" + } + ] +} diff --git a/robot-systest/testsuite/sol003_01-vnf-lifecycle-management.robot b/robot-systest/testsuite/sol003_01-vnf-lifecycle-management.robot new file mode 100644 index 0000000..295ad3b --- /dev/null +++ b/robot-systest/testsuite/sol003_01-vnf-lifecycle-management.robot @@ -0,0 +1,176 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License + +*** Settings *** +Documentation [SOL003-01] Sol003 Api testing +Suite Teardown Run Keyword And Ignore Error Suite Cleanup +Force Tags sol003_01 cluster_sol003 daily +Library OperatingSystem +Library String +Library Collections +Library RequestsLibrary +Library yaml +Library JsonValidator +Library JSONLibrary +Resource %{ROBOT_DEVOPS_FOLDER}/lib/sol003_common_lib.robot +Resource %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot +Resource %{ROBOT_DEVOPS_FOLDER}/lib/vim_lib.robot + +*** Variables *** +${vnfd_pkg} hackfest_basic_metrics_vnf +${vnfd_name} hackfest_basic_metrics-vnf + +*** Test Cases *** +Create VNF package from JSON file descriptor + [Documentation] Test case to create a VNF Identifier + ${id}= Create VNFD '%{PACKAGES_FOLDER}/${vnfd_pkg}' + Set Suite Variable ${vnfid} ${id} + ${created_vim_account_id}= Get VIM Target ID %{VIM_TARGET} + Set Suite Variable ${created_vim_account_id} + Get Auth Token + ${json_path}= Read Directory + ${json_obj}= Load JSON From File ${json_path}/sol003_01-vnf-lifecycle-management.json + ${json_obj}= Get Variable Value ${json_obj['data'][0]} + ${updated_json_obj} JSONLibrary.Update Value To Json ${json_obj} $..vimAccountId ${created_vim_account_id} + ${updated_json_obj} JSONLibrary.Update Value To Json ${updated_json_obj} $..additionalParams.virtual-link-desc[0][id] %{VIM_MGMT_NET} + ${updated_json_obj} JSONLibrary.Update Value To Json ${updated_json_obj} $..additionalParams.virtual-link-profile-id %{VIM_MGMT_NET} + Set Test Variable ${updated_json_obj} + Post API Request ${vnf_instance_uri} + Pass Execution If ${request_response.status_code} in ${success_status_code_list} Query VNF Instance completed + ${id}= Get Value From Json ${request_response.json()} $..id + Set Suite Variable ${createid} ${id[0]} + +Instantiate VNF + [Documentation] Test case to Instantiate a VNF + Get Auth Token + ${json_path}= Read Directory + ${json_obj}= Load JSON From File ${json_path}/sol003_01-vnf-lifecycle-management.json + ${json_obj}= Get Variable Value ${json_obj['data'][1]} + ${updated_json_obj} JSONLibrary.Update Value To Json ${json_obj} $..vimAccountId ${created_vim_account_id} + ${updated_json_obj} JSONLibrary.Update Value To Json ${json_obj} $..vnfId ${createid} + Set Test Variable ${updated_json_obj} + Post API Request ${vnf_instantiate_uri}/${createid}/instantiate + Pass Execution If ${request_response.status_code} in ${success_status_code_list} Instantiate VNF Instance completed + ${id}= Get Value From Json ${request_response.json()} $..id + Set Suite Variable ${instantiateid} ${id[0]} + Sleep 12s + +Query VNF Instances + [Documentation] Test case to query VNF Instance + Get Auth Token + Get Api Request ${vnf_instance_uri} + ${value}= Get ID nsState + Should Be Equal ${value} INSTANTIATED + Pass Execution If ${request_response.status_code} in ${success_status_code_list} Query VNF Instance completed + ${id}= Get Value From Json ${request_response.json()} $.._id + Set Suite Variable ${Queryid} ${id[0]} + +Query VNF Instance ID + [Documentation] Test case to query Vnf instance ID + Get Auth Token + Get Api Request ${vnf_instance_uri}/${Queryid} + ${value}= Get ID nsState + Should Be Equal ${value} INSTANTIATED + Should Be Equal As Strings ${RequestResponse.status_code} 200 + ${id}= Get Value From Json ${request_response.json()} $.._id + Set Suite Variable ${Instanceid} ${id[0]} + +Query VNF LCM Ops + [Documentation] Test case to Query VNF LCM operation + Get Auth Token + Get Api Request ${vnf_instance_lcm_ops} + ${ID1}= Get Value From Json ${request_response.json()} $.._id + Set Suite Variable ${lcmops} ${ID1[0]} + FOR ${Index} IN RANGE 0 15 + Get Api Request ${vnf_instance_lcm_ops} + ${value}= Get ID operationState + ${status}= Run Keyword And Return Status Should Be Equal ${value} COMPLETED + Run Keyword If ${status} Exit For Loop + ... ELSE Sleep 10s + END + +Query VNF LCM Ops ID + Get Auth Token + Get Api Request ${vnf_instance_lcm_ops}/${lcmops} + ${ID1}= Get Value From Json ${request_response.json()} $.._id + Set Suite Variable ${lcmopsid} ${ID1[0]} + FOR ${Index} IN RANGE 0 15 + Get Api Request ${vnf_instance_lcm_ops}/${lcmops} + ${value}= Get ID operationState + ${status}= Run Keyword And Return Status Should Be Equal ${value} COMPLETED + Run Keyword If ${status} Exit For Loop + ... ELSE Sleep 10s + END + +Scale VNF + [Documentation] Test case to Scale out VNF + Get Auth Token + ${json_path}= Read Directory + ${updated_json_obj}= Load JSON From File ${json_path}/sol003_01-vnf-lifecycle-management.json + ${updated_json_obj}= Get Variable Value ${updated_json_obj['data'][2]} + Set Test Variable ${updated_json_obj} + Post API Request ${vnf_instance_uri}/${createid}/scale + ${value}= Get ID id + ${ID1}= Get Value From Json ${request_response.json()} $..id + Set Suite Variable ${scaleoutid} ${ID1[0]} + Get Api Request ${vnf_instance_lcm_ops}/${scaleoutid} + ${LcmopsScale}= Get Value From Json ${request_response.json()} $.._id + Set Suite Variable ${lcmopsscaleid} ${LcmopsScale[0]} + FOR ${Index} IN RANGE 0 15 + Get Api Request ${vnf_instance_lcm_ops}/${scaleoutid} + ${value}= Get ID operationState + ${status}= Run Keyword And Return Status Should Be Equal ${value} COMPLETED + Run Keyword If ${status} Exit For Loop + ... ELSE Sleep 10s + END + Pass Execution If ${request_response.status_code} in ${success_status_code_list} Scale VNF instance completed + +Terminate VNF + [Documentation] Test case to terminate the VNF + Get Auth Token + ${json_path}= Read Directory + ${updated_json_obj}= Load JSON From File ${json_path}/sol003_01-vnf-lifecycle-management.json + ${updated_json_obj}= Get Variable Value ${updated_json_obj['data'][3]} + Set Suite Variable ${updated_json_obj} + Post API Request ${vnf_instance_uri}/${createid}/terminate + ${id}= Get Value From Json ${request_response.json()} $..id + Set Suite Variable ${terminateid} ${id[0]} + Get Api Request ${vnf_instance_lcm_ops}/${terminateid} + ${LcmopsTerminate}= Get Value From Json ${request_response.json()} $.._id + Set Suite Variable ${lcmopsscaleid} ${LcmopsTerminate[0]} + FOR ${Index} IN RANGE 0 15 + Get Api Request ${vnf_instance_lcm_ops}/${terminateid} + ${value}= Get ID operationState + ${status}= Run Keyword And Return Status Should Be Equal ${value} COMPLETED + Run Keyword If ${status} Exit For Loop + ... ELSE Sleep 10s + END + Pass Execution If ${request_response.status_code} in ${success_status_code_list} Terminate VNF instance completed + +Delete VNF + [Documentation] Test case to delete VNF + Get Auth Token + Create Session APISession ${HOST} + &{Headers} Create Dictionary Content-Type=application/json Accept=application/json Authorization=Bearer ${AccessToken} + ${resp}= DELETE On Session APISession ${vnf_instance_uri}/${createid} headers=${Headers} + Pass Execution If ${resp.status_code} in ${success_status_code_list} Delete VNF Instance completed + +Delete VNF Descriptor Test + [Tags] cleanup + + Delete VNFD ${vnfd_name} + +*** Keywords *** +Suite Cleanup + [Documentation] Test Suit Cleanup: Deleting Descriptor + + Run Keyword If Any Tests Failed Delete VNFD ${vnfd_name} -- 2.17.1