Sol003 Robot test support 85/12085/2
authordhanasekaran <ragavi.d@tataelxsi.co.in>
Tue, 17 May 2022 12:12:40 +0000 (14:12 +0200)
committerdhanasekaran <ragavi.d@tataelxsi.co.in>
Fri, 20 May 2022 11:10:20 +0000 (11:10 +0000)
Change-Id: Id5fb767d6bdfc87ea721cb74b9b5e392761e93b8
Signed-off-by: dhanasekaran <ragavi.d@tataelxsi.co.in>
requirements.in
requirements.txt
robot-systest/lib/sol003_common_lib.robot [new file with mode: 0644]
robot-systest/resources/sol003_01-vnf-lifecycle-management.json [new file with mode: 0644]
robot-systest/testsuite/sol003_01-vnf-lifecycle-management.robot [new file with mode: 0644]

index d96fffb..3d69459 100644 (file)
@@ -26,5 +26,7 @@ robotframework-jsonlibrary
 robotframework-requests
 robotframework-seleniumlibrary
 robotframework-sshlibrary
+robotframework-jsonvalidator
+robotframework-yamllibrary
 verboselogs
 yq
index 09bec59..659a1df 100644 (file)
@@ -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 (file)
index 0000000..795a1a3
--- /dev/null
@@ -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 (file)
index 0000000..267dd03
--- /dev/null
@@ -0,0 +1,38 @@
+{\r
+   "data":[\r
+      {\r
+         "vnfdId":"hackfest_basic_metrics-vnf",\r
+         "vnfInstanceName":"sol003-instance",\r
+         "vnfInstanceDescription":"Test vnfm instance description",\r
+         "vimAccountId":"8dc2f11d-e08a-4ec7-920c-6b8a88bff1e5",\r
+         "additionalParams":{\r
+            "virtual-link-desc":[\r
+               {\r
+                  "id":"mgmtnet",\r
+                  "mgmt-network":true\r
+               }\r
+            ],\r
+            "constituent-cpd-id":"vnf-cp0-ext",\r
+            "virtual-link-profile-id":"mgmtnet"\r
+         }\r
+      },\r
+      {\r
+         "vnfName":"sol003-instance",\r
+         "vnfDescription":"vnf package",\r
+         "vnfId":"70b47595-fafa-4f63-904b-fc3ada60eebb",\r
+         "vimAccountId":"8dc2f11d-e08a-4ec7-920c-6b8a88bff1e5"\r
+      },\r
+      {\r
+         "type":"SCALE_OUT",\r
+         "aspectId":"vdu_autoscale",\r
+         "numberOfSteps":"1",\r
+         "additionalParams":{\r
+            "member-vnf-index":"1"\r
+         }\r
+      },\r
+      {\r
+         "terminationType":"GRACEFUL",\r
+         "gracefulTerminationTimeout":"5"\r
+      }\r
+   ]\r
+}\r
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 (file)
index 0000000..295ad3b
--- /dev/null
@@ -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}