From e2ccf76880e7f2bff9be43893fbb56aa69eebc22 Mon Sep 17 00:00:00 2001 From: "Olivia.Zhan" Date: Wed, 10 Jul 2019 15:27:46 +0800 Subject: [PATCH] Add csit case for Individual VNF Package and Content Issue-ID: INT-1015 Signed-off-by: Olivia.Zhan Change-Id: I6626ff1937cc8bbfafcc5707e4bc541e1579998a --- plans/vfc-nfvo-catalog/sanity-check/testplan.txt | 2 + tests/vfc/nfvo-catalog/IndividualVNFPackage.robot | 68 +++++++++++++++ tests/vfc/nfvo-catalog/VNFPackageContent.robot | 97 ++++++++++++++++++++++ tests/vfc/nfvo-catalog/files/vgw.csar | Bin 0 -> 23182 bytes 4 files changed, 167 insertions(+) create mode 100644 tests/vfc/nfvo-catalog/IndividualVNFPackage.robot create mode 100644 tests/vfc/nfvo-catalog/VNFPackageContent.robot create mode 100644 tests/vfc/nfvo-catalog/files/vgw.csar diff --git a/plans/vfc-nfvo-catalog/sanity-check/testplan.txt b/plans/vfc-nfvo-catalog/sanity-check/testplan.txt index d6656fe7..ad6cad50 100644 --- a/plans/vfc-nfvo-catalog/sanity-check/testplan.txt +++ b/plans/vfc-nfvo-catalog/sanity-check/testplan.txt @@ -4,3 +4,5 @@ vfc/nfvo-catalog/test.robot vfc/nfvo-catalog/Subscriptions.robot vfc/nfvo-catalog/IndividualSubscription.robot vfc/nfvo-catalog/VNFPackages.robot +vfc/nfvo-catalog/IndividualVNFPackage.robot +vfc/nfvo-catalog/VNFPackageContent.robot diff --git a/tests/vfc/nfvo-catalog/IndividualVNFPackage.robot b/tests/vfc/nfvo-catalog/IndividualVNFPackage.robot new file mode 100644 index 00000000..4c35a39e --- /dev/null +++ b/tests/vfc/nfvo-catalog/IndividualVNFPackage.robot @@ -0,0 +1,68 @@ +*** Settings *** +Resource ../../common.robot +Library Collections +Library RequestsLibrary +Library OperatingSystem +Library json +Library HttpLibrary.HTTP + +*** Variables *** +${catalog_port} 8806 +${vnf_packages_url} /api/vnfpkgm/v1/vnf_packages + +#json files +${request_json} ${SCRIPTS}/../tests/vfc/nfvo-catalog/jsons/CreateVnfPkgInfoRequest.json + + +#global variables +${packageId} + +*** Test Cases *** +Create new VNF Package Resource for pre-condition + Log Create new VNF Package Resource for pre-condition + ${json_value}= json_from_file ${request_json} + ${json_string}= string_from_json ${json_value} + ${headers} Create Dictionary Content-Type=application/json Accept=application/json + Create Session web_session http://${CATALOG_IP}:${catalog_port} headers=${headers} + Set Request Body ${json_string} + ${resp}= Post Request web_session ${vnf_packages_url} ${json_string} + Should Be Equal As Strings 201 ${resp.status_code} + ${response_json} json.loads ${resp.content} + Should Be Equal As Strings CREATED ${response_json['onboardingState']} + ${packageId}= Convert To String ${response_json['id']} + Set Global Variable ${packageId} + +GET Individual VNF Package + Log GET Individual VNF Package + [Documentation] The objective is to test the retrieval of an individual VNF package information + ${headers} Create Dictionary Content-Type=application/json Accept=application/json + Create Session web_session http://${CATALOG_IP}:${catalog_port} headers=${headers} + ${resp}= Get Request web_session ${vnf_packages_url}/${packageId} + Should Be Equal As Strings 200 ${resp.status_code} + ${response_json} json.loads ${resp.content} + Should Be Equal As Strings ${packageId} ${response_json['id']} + Should Be Equal As Strings DISABLED ${response_json['operationalState']} + +PUT Individual VNF Package - Method not implemented + Log PUT Individual VNF Package - Method not implemented + [Documentation] The objective is to test that PUT method is not allowed to modify a VNF Package + ${headers} Create Dictionary Content-Type=application/json Accept=application/json + Create Session web_session http://${CATALOG_IP}:${catalog_port} headers=${headers} + ${resp}= Put Request web_session ${vnf_packages_url}/${packageId} + Should Be Equal As Strings 405 ${resp.status_code} + +POST Individual VNF Package - Method not implemented + Log POST Individual VNF Package - Method not implemented + [Documentation] The objective is to test that POST method is not allowed to create new VNF Package + ${headers} Create Dictionary Content-Type=application/json Accept=application/json + Create Session web_session http://${CATALOG_IP}:${catalog_port} headers=${headers} + ${resp}= Post Request web_session ${vnf_packages_url}/${packageId} + Should Be Equal As Strings 405 ${resp.status_code} + +DELETE Individual VNF Package + Log DELETE Individual VNF Package + [Documentation] The objective is to test the deletion of an individual VNF Package + ${headers} Create Dictionary Content-Type=application/json Accept=application/json + Create Session web_session http://${CATALOG_IP}:${catalog_port} headers=${headers} + ${resp}= Delete Request web_session ${vnf_packages_url}/${packageId} + Should Be Equal As Strings 204 ${resp.status_code} diff --git a/tests/vfc/nfvo-catalog/VNFPackageContent.robot b/tests/vfc/nfvo-catalog/VNFPackageContent.robot new file mode 100644 index 00000000..7c794b22 --- /dev/null +++ b/tests/vfc/nfvo-catalog/VNFPackageContent.robot @@ -0,0 +1,97 @@ +*** Settings *** +Resource ../../common.robot +Library Collections +Library RequestsLibrary +Library OperatingSystem +Library json +Library HttpLibrary.HTTP + +*** Variables *** +${catalog_port} 8806 +${vnf_packages_url} /api/vnfpkgm/v1/vnf_packages + +#json files +${request_json} ${SCRIPTS}/../tests/vfc/nfvo-catalog/jsons/CreateVnfPkgInfoRequest.json +${request_csar} ${SCRIPTS}/../tests/vfc/nfvo-catalog/files/vgw.csar + + +#global variables +${packageId} + +*** Test Cases *** +Create new VNF Package Resource for pre-condition + Log Create new VNF Package Resource for pre-condition + ${json_value}= json_from_file ${request_json} + ${json_string}= string_from_json ${json_value} + ${headers} Create Dictionary Content-Type=application/json Accept=application/json + Create Session web_session http://${CATALOG_IP}:${catalog_port} headers=${headers} + Set Request Body ${json_string} + ${resp}= Post Request web_session ${vnf_packages_url} ${json_string} + Should Be Equal As Strings 201 ${resp.status_code} + ${response_json} json.loads ${resp.content} + Should Be Equal As Strings CREATED ${response_json['onboardingState']} + ${packageId}= Convert To String ${response_json['id']} + Set Global Variable ${packageId} + +Upload VNF Package Content + Log Upload VNF Package Content + [Documentation] The objective is to test the upload of a VNF Package Content in Zip format. + Create Session web_session http://${CATALOG_IP}:${catalog_port} + ${headers} Create Dictionary Accept=application/json + &{fileParts}= Create Dictionary + Create Multi Part ${fileParts} file ${request_csar} + Log ${fileParts} + ${resp}= Put Request web_session ${vnf_packages_url}/${packageId}/package_content files=${fileParts} headers=${headers} + Log ${resp.status_code} + Should Be Equal As Strings 202 ${resp.status_code} + Log Received 202 Accepted as expected + +GET Individual VNF Package Content + Log GET Individual VNF Package Content + [Documentation] The objective is to test the retrieval of an individual VNF package content + ${headers} Create Dictionary Content-Type=application/json + Create Session web_session http://${CATALOG_IP}:${catalog_port} headers=${headers} + ${resp}= Get Request web_session ${vnf_packages_url}/${packageId}/package_content + Should Be Equal As Strings 200 ${resp.status_code} + +Check Postcondition + Log Check Postcondition + ${headers} Create Dictionary Content-Type=application/json Accept=application/json + Create Session web_session http://${CATALOG_IP}:${catalog_port} headers=${headers} + ${resp}= Get Request web_session ${vnf_packages_url}/${packageId} + Should Be Equal As Strings 200 ${resp.status_code} + ${response_json} json.loads ${resp.content} + Should Be Equal As Strings ONBOARDED ${response_json['onboardingState']} + +POST Individual VNF Package Content - Method not implemented + Log POST Individual VNF Package Content - Method not implemented + [Documentation] The objective is to test that POST method is not allowed to create new VNF Package content + ${headers} Create Dictionary Content-Type=application/json Accept=application/json + Create Session web_session http://${CATALOG_IP}:${catalog_port} headers=${headers} + ${resp}= Post Request web_session ${vnf_packages_url}/${packageId}/package_content + Should Be Equal As Strings 405 ${resp.status_code} + +PATCH Individual VNF Package Content - Method not implemented + Log PATCH Individual VNF Package Content - Method not implemented + [Documentation] The objective is to test that PATCH method is not allowed to update a VNF Package content + ${headers} Create Dictionary Content-Type=application/json Accept=application/json + Create Session web_session http://${CATALOG_IP}:${catalog_port} headers=${headers} + ${resp}= Patch Request web_session ${vnf_packages_url}/${packageId}/package_content + Should Be Equal As Strings 405 ${resp.status_code} + +DELETE Individual VNF Package Content - Method not implemented + Log DELETE Individual VNF Package Content - Method not implemented + [Documentation] The objective is to test that DELETE method is not allowed to delete a VNF Package content + ${headers} Create Dictionary Content-Type=application/json Accept=application/json + Create Session web_session http://${CATALOG_IP}:${catalog_port} headers=${headers} + ${resp}= Delete Request web_session ${vnf_packages_url}/${packageId}/package_content + Should Be Equal As Strings 405 ${resp.status_code} + +*** Keywords *** +Create Multi Part + [Arguments] ${addTo} ${partName} ${filePath} ${contentType}=${None} ${content}=${None} + ${fileData}= Run Keyword If '''${content}''' != '''${None}''' Set Variable ${content} + ... ELSE Get Binary File ${filePath} + ${fileDir} ${fileName}= Split Path ${filePath} + ${partData}= Create List ${fileName} ${fileData} ${contentType} + Set To Dictionary ${addTo} ${partName}=${partData} \ No newline at end of file diff --git a/tests/vfc/nfvo-catalog/files/vgw.csar b/tests/vfc/nfvo-catalog/files/vgw.csar new file mode 100644 index 0000000000000000000000000000000000000000..79e0d2012d09784fef48c89ae3ef6e0240d0f08c GIT binary patch literal 23182 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 W6)W&0VFm_1AbbKmS9nSYhz9@^r6-sG literal 0 HcmV?d00001 -- 2.16.6