fixing xos service api test generation
Change-Id: If1ba209cb09c4c3f6cc6e55fe3a2f6908b5ad0be
diff --git a/Jenkinsfile/verify-api-tests-JenkinsFile b/Jenkinsfile/verify-api-tests-JenkinsFile
index 958ab92..a32a60b 100644
--- a/Jenkinsfile/verify-api-tests-JenkinsFile
+++ b/Jenkinsfile/verify-api-tests-JenkinsFile
@@ -72,7 +72,8 @@
docker exec -i \$CORE_CONTAINER /bin/bash -c "xosgenx --target /opt/xos/lib/xos-genx/xosgenx/targets/./xosapitests.xtarget /opt/xos/core/models/core.xproto" > ~/cord/test/cord-tester/src/test/cord-api/Tests/XOSCoreAPITests.robot
SERVICES=\$(docker exec -i \$CORE_CONTAINER /bin/bash -c "cd /opt/xos/dynamic_services/;find -name '*.xproto'" | awk -F[//] '{print \$2}')
export testname=_service_api.robot
- for i in \$SERVICES; do bash -c "docker exec -i \$CORE_CONTAINER /bin/bash -c 'xosgenx --target /opt/xos/lib/xos-genx/xosgenx/targets/./xosapitests.xtarget /opt/xos/dynamic_services/\$i/\$i.xproto'" > ~/cord/test/cord-tester/src/test/cord-api/Tests/\$i\$testname; done
+ for i in \$SERVICES; do bash -c "docker exec -i \$CORE_CONTAINER /bin/bash -c 'xosgenx --target /opt/xos/lib/xos-genx/xosgenx/targets/./xosserviceapitests.xtarget /opt/xos/dynamic_services/\$i/\$i.xproto'" > ~/cord/test/cord-tester/src/test/cord-api/Tests/\$i\$testname; done
+ for i in \$SERVICES; do bash -c "docker exec -i \$CORE_CONTAINER /bin/bash -c 'xosgenx --target /opt/xos/lib/xos-genx/xosgenx/targets/./xoslibrary.xtarget /opt/xos/dynamic_services/\$i/\$i.xproto'" > ~/cord/test/cord-tester/src/test/cord-api/Tests/$\i_library.robot; done
"""
}
catch(error) { currentBuild.result = 'FAILURE' }
@@ -106,7 +107,7 @@
sed -i \"s/^\\(PASSWD = \\).*/\\1\'\$(cat ~/cord/build/platform-install/credentials/xosadmin@opencord.org)\'/\" RestApiProperties.py
cd ~/cord/test/cord-tester/src/test/cord-api/Tests
pybot -d Log -T -e TenantWithContainer -e Port -e ControllerImages -e ControllerNetwork -e ControllerSlice -e ControllerUser XOSCoreAPITests.robot || true
- for i in \$SERVICES; do bash -c "pybot -d Log -T -e AddressManagerServiceInstance -v xos_service:\$i \$i\$testname"; sleep 2; done || true
+ for i in \$SERVICES; do bash -c "pybot -d Log -T -e AddressManagerServiceInstance -v TESTLIBRARY:\$i_library \$i\$testname"; sleep 2; done || true
"""
}
catch(error) { currentBuild.result = 'FAILURE' }
diff --git a/src/test/cord-api/Tests/targets/xosapitests.xtarget b/src/test/cord-api/Tests/targets/xosapitests.xtarget
index 1eb7158..53a58ce 100644
--- a/src/test/cord-api/Tests/targets/xosapitests.xtarget
+++ b/src/test/cord-api/Tests/targets/xosapitests.xtarget
@@ -213,4 +213,4 @@
\ Run Keyword And Ignore Error CORD Delete /xosapi/v1/${xos_service}/${dependent_{{ m.name | lower }}_ids[0]} ${dependent_{{ m.name | lower }}_ids[${INDEX}]}
{% endif %}
{% endfor -%}
- Delete All Sessions
+ Delete All Sessions
\ No newline at end of file
diff --git a/src/test/cord-api/Tests/targets/xoslibrary.xtarget b/src/test/cord-api/Tests/targets/xoslibrary.xtarget
new file mode 100644
index 0000000..fb98677
--- /dev/null
+++ b/src/test/cord-api/Tests/targets/xoslibrary.xtarget
@@ -0,0 +1,180 @@
+*** Settings ***
+Documentation Setup and Teardown Functionality for XOS API Tests
+Library Collections
+Library String
+Library OperatingSystem
+Library XML
+Library RequestsLibrary
+Library HttpLibrary.HTTP
+Library ../Framework/utils/utils.py
+Library ../Framework/restApi.py
+Variables ../Properties/RestApiProperties.py
+
+*** Keywords ***
+Verify API Functionality
+ [Arguments] ${type} ${endpoint} ${data}=${EMPTY} ${data_id}=${EMPTY} ${key}=${EMPTY}
+ Run Keyword If "${type}" == "RETRIEVE" CORD Get ${endpoint} ${data_id} ${data} ${key}
+ Run Keyword If "${type}" == "CREATE" CORD Post ${endpoint} ${data}
+ Run Keyword If "${type}" == "UPDATE" CORD Put ${endpoint} ${data} ${data_id}
+ Run Keyword If "${type}" == "DELETE" CORD Delete ${endpoint} ${data_id}
+
+CORD Get
+ [Documentation] Make a GET call to the CORD controller
+ [Arguments] ${service} ${id} ${value} ${key}
+ ${resp}= Get Request ${SERVER_IP} ${service}/${id}
+ Log ${resp.content}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${updated_value}= Run Keyword If '${key}' != 'null' Get Json Value ${resp.content} /${key}
+ ${updated_value}= Run Keyword If '${key}' != 'null' Remove String ${updated_value} "
+ Run Keyword If '${key}' != 'null' Should Contain "${value}" ${updated_value}
+ [Return] ${resp}
+
+CORD Post
+ [Documentation] Make a POST call to the CORD controller
+ [Arguments] ${service} ${data}
+ ${data}= Evaluate json.dumps(${data}) json
+ ${resp}= Post Request ${SERVER_IP} uri=${service} data=${data}
+ Log ${resp.content}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${id}= Get Json Value ${resp.content} /id
+ Set Suite Variable ${id}
+ [Return] ${resp}
+
+CORD Put
+ [Documentation] Make a PUT call to the CORD controller
+ [Arguments] ${service} ${data} ${data_id}
+ ${data}= Evaluate json.dumps(${data}) json
+ ${resp}= Put Request ${SERVER_IP} uri=${service}/${data_id} data=${data}
+ Log ${resp.content}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${id}= Get Json Value ${resp.content} /id
+ Set Suite Variable ${id}
+ [Return] ${resp}
+
+CORD Delete
+ [Documentation] Make a DELETE call to the CORD controller
+ [Arguments] ${service} ${data_id}
+ ${resp}= Delete Request ${SERVER_IP} uri=${service}/${data_id}
+ Log ${resp.content}
+ Should Be Equal As Strings ${resp.status_code} 200
+ [Return] ${resp}
+
+Generate JSON Data
+ {% for m in proto.messages %}
+ {%- if m.name not in ['XOSBase'] -%}
+ {% autoescape false %}
+ {% endautoescape %}
+ ${json_{{ m.name | lower }}_1}= Set Variable { }
+ ${json_{{ m.name | lower }}_updated_1}= Set Variable { }
+ ${json_{{ m.name | lower}}_updated_key}= Set Variable null
+ Set Suite Variable ${json_{{ m.name | lower}}_updated_key}
+ # set required fields for {{ m.name | lower }} object
+ {% for f in m.fields + xproto_base_fields(m, proto.message_table) -%}
+ {% if f.modifier == "required" -%}
+ {% if f.options.blank == "False" -%}
+ {% if not f.options.default -%}
+ {% if f.link -%}
+ ${tmp_{{ f.options.model | lower }}_id}= Create {{ f.options.model }}
+ ${json_{{ m.name | lower }}_1}= Set Json Value ${json_{{ m.name | lower }}_1} /{{ f.name }}_id ${tmp_{{ f.options.model | lower }}_id}
+ {% else -%}
+ ${json_{{ m.name | lower}}_{{ f.name }}_1}= Generate Random Value {{ f.type }}
+ ${json_{{ m.name | lower }}_1}= Set Json Value ${json_{{ m.name | lower }}_1} /{{ f.name }} "${json_{{ m.name | lower }}_{{ f.name }}_1}"
+ {% if loop.index0 == 0 -%}
+ ${json_{{ m.name | lower}}_updated_key}= Set Variable {{ f.name }}
+ ${json_{{ m.name | lower}}_{{ f.name }}_updated_1}= Generate Random Value {{ f.type }}
+ ${json_{{ m.name | lower }}_updated_1}= Set Json Value ${json_{{ m.name | lower }}_updated__1} /{{ f.name }} "${json_{{ m.name | lower }}_{{ f.name }}_updated_1}"
+ {% endif -%}
+ {% endif -%}
+ {% endif -%}
+ {% endif -%}
+ {% endif -%}
+ {% endfor -%}
+ {% if m.name == "Site" -%}
+ ${json_{{ m.name | lower}}_login_base_tmp}= Set Variable testloginbase
+ ${json_{{ m.name | lower}}_1}= Set Json Value ${json_{{ m.name | lower }}_1} /login_base "${json_{{ m.name | lower }}_login_base_tmp}"
+ {% endif -%}
+ {% if m.name == "Slice" -%}
+ ${json_{{ m.name | lower}}_name}= Generate Random Slice Name
+ ${json_{{ m.name | lower}}_1}= Set Json Value ${json_{{ m.name | lower }}_1} /name "${json_{{ m.name | lower }}_name}"
+ ${json_{{ m.name | lower}}_name_updated_1}= Generate Random Slice Name
+ ${json_{{ m.name | lower}}_updated_1}= Set Json Value ${json_{{ m.name | lower }}_updated_1} /name "${json_{{ m.name | lower}}_name_updated_1}"
+ {% endif -%}
+ ${json_{{ m.name | lower }}_1}= To JSON ${json_{{ m.name | lower }}_1}
+ ${json_{{ m.name | lower }}_updated_1}= To JSON ${json_{{ m.name | lower }}_updated_1}
+ Set Suite Variable ${json_{{ m.name | lower }}_1}
+ Set Suite Variable ${json_{{ m.name | lower }}_updated_1}
+ {% endif -%}
+ {% endfor %}
+
+{% for m in proto.messages %}
+{%- if m.name not in ['XOSBase'] -%}
+Create {{ m.name }}
+ ##Creating {{ m.name | lower }} object
+ ${json_{{ m.name | lower }}_tmp}= Set Variable { }
+ # set required fields for {{ m.name | lower }} object
+ {% for f in m.fields + xproto_base_fields(m, proto.message_table) -%}
+ {% if f.link -%}
+ {% if f.modifier == "required" -%}
+ {% if f.options.blank == "False" -%}
+ # create dependent {{ f.options.model }}
+ ${dependent_{{ f.options.model | lower }}_id}= Create {{ f.options.model }}
+ ${json_{{ m.name | lower}}_tmp}= Set Json Value ${json_{{ m.name | lower }}_tmp} /{{ f.name }}_id ${dependent_{{ f.options.model | lower }}_id}
+ {% endif -%}
+ {% endif -%}
+ {% else -%}
+ {% if f.modifier == "required" -%}
+ {% if f.options.blank == "False" -%}
+ {% if not f.options.default -%}
+ ${json_{{ m.name | lower}}_{{ f.name }}_tmp}= Generate Random Value {{ f.type }}
+ ${json_{{ m.name | lower}}_tmp}= Set Json Value ${json_{{ m.name | lower }}_tmp} /{{ f.name }} "${json_{{ m.name | lower}}_{{ f.name }}_tmp}"
+ {% endif -%}
+ {% endif -%}
+ {% endif -%}
+ {% endif -%}
+ {% endfor -%}
+ {% if m.name == "Site" -%}
+ ${json_{{ m.name | lower}}_login_base_tmp}= Set Variable testloginbase
+ ${json_{{ m.name | lower}}_tmp}= Set Json Value ${json_{{ m.name | lower }}_tmp} /login_base "${json_{{ m.name | lower }}_login_base_tmp}"
+ {% endif -%}
+ {% if m.name == "Slice" -%}
+ ${json_{{ m.name | lower}}_name}= Generate Random Slice Name
+ ${json_{{ m.name | lower}}_tmp}= Set Json Value ${json_{{ m.name | lower }}_tmp} /name "${json_{{ m.name | lower }}_name}"
+ {% endif -%}
+ {% if m.name == "Network" -%}
+ ${json_{{ m.name | lower}}_tmp}= Set Json Value ${json_{{ m.name | lower }}_tmp} /permit_all_slices true
+ {% endif -%}
+ ${json_{{ m.name | lower }}_tmp}= To JSON ${json_{{ m.name | lower }}_tmp}
+ ${resp}= CORD Post /xosapi/v1/{{ xproto_unquote(m.options.app_label) }}/{{ m.name | lower}}s ${json_{{ m.name | lower }}_tmp}
+ ${id_{{ m.name | lower }}_tmp}= Get Json Value ${resp.content} /id
+ Append To List ${dependent_{{ m.name | lower }}_ids} ${id_{{ m.name | lower }}_tmp}
+ [Return] ${id_{{ m.name | lower }}_tmp}
+{% endif -%}
+{% endfor -%}
+
+Setup Tests
+ [Documentation] Find all dependent objects per model and create them and store them for later use
+ {% for m in proto.messages %}
+ {%- if m.name not in ['XOSBase'] -%}
+ ${model}= Set Variable {{ m.name | lower }}s
+ @{dependent_{{ m.name | lower }}_ids}= Create List ${model}
+ Set Suite Variable @{dependent_{{ m.name | lower }}_ids}
+ {% endif -%}
+ {% endfor -%}
+ @{dependent_models}= Create List
+ Set Suite Variable ${dependent_models}
+ ${auth} = Create List ${XOS_USER} ${XOS_PASSWD}
+ ${HEADERS} Create Dictionary Content-Type=application/json
+ Create Session ${SERVER_IP} http://${SERVER_IP}:${SERVER_PORT} auth=${AUTH} headers=${HEADERS}
+ Generate JSON Data
+
+Teardown Tests
+ [Documentation] Delete all dependent objects created in Setup
+ {% for m in proto.messages %}
+ {%- if m.name not in ['XOSBase'] -%}
+ ${len}= Get Length ${dependent_{{ m.name | lower }}_ids}
+ : FOR ${INDEX} IN RANGE 1 ${len}
+ \ Run Keyword And Ignore Error CORD Delete /xosapi/v1/{{ xproto_unquote(m.options.app_label) }}/${dependent_{{ m.name | lower }}_ids[0]} ${dependent_{{ m.name | lower }}_ids[${INDEX}]}
+ {% endif -%}
+ {% endfor -%}
+ Delete All Sessions
+
diff --git a/src/test/cord-api/Tests/targets/xosserviceapitests.xtarget b/src/test/cord-api/Tests/targets/xosserviceapitests.xtarget
new file mode 100644
index 0000000..62a78e4
--- /dev/null
+++ b/src/test/cord-api/Tests/targets/xosserviceapitests.xtarget
@@ -0,0 +1,61 @@
+
+*** Settings ***
+Documentation Test Suite for XOS APIs
+Suite Setup Setup
+Suite Teardown Teardown
+Test Template Verify API Functionality
+Library Collections
+Library String
+Library OperatingSystem
+Library XML
+Library RequestsLibrary
+Library HttpLibrary.HTTP
+Library ../Framework/utils/utils.py
+Library ../Framework/restApi.py
+Resource XOSApiTestLibrary.robot
+Variables ../Properties/RestApiProperties.py
+
+*** Variables ***
+${xos_service} core
+
+*** Test Cases *** TYPE API
+{% for m in proto.messages %}
+{%- if xproto_unquote(m.options.app_label) != "core" -%}
+{%- if m.name not in ['XOSBase'] -%}
+{%- if m.name not in ['ServiceMonitoringAgentInfo', 'XOS'] -%}
+{% autoescape false %}
+{% endautoescape %}
+Create {{ m.name }} CREATE /xosapi/v1/{{ xproto_unquote(m.options.app_label) }}/{{ m.name | lower}}s ${json_{{ m.name | lower}}_1}
+ [Tags] {{ m.name }}
+
+Update {{ m.name }} UPDATE /xosapi/v1/{{ xproto_unquote(m.options.app_label) }}/{{ m.name | lower}}s ${json_{{ m.name | lower}}_updated_1} ${id}
+ [Tags] {{ m.name }}
+
+Get {{ m.name }} RETRIEVE /xosapi/v1/{{ xproto_unquote(m.options.app_label) }}/{{ m.name | lower}}s ${json_{{ m.name | lower}}_updated_1} ${id} ${json_{{ m.name | lower}}_updated_key}
+ [Tags] {{ m.name }}
+
+Delete {{ m.name }} DELETE /xosapi/v1/{{ xproto_unquote(m.options.app_label) }}/{{ m.name | lower}}s data_id=${id}
+ [Tags] {{ m.name }}
+{% else %}
+Create {{ m.name }} CREATE /xosapi/v1/{{ xproto_unquote(m.options.app_label) }}/{{ m.name | lower}}es ${json_{{ m.name | lower}}_1}
+ [Tags] {{ m.name }}
+
+Update {{ m.name }} UPDATE /xosapi/v1/{{ xproto_unquote(m.options.app_label) }}/{{ m.name | lower}}es ${json_{{ m.name | lower}}_updated_1} ${id}
+ [Tags] {{ m.name }}
+
+Get {{ m.name }} RETRIEVE /xosapi/v1/{{ xproto_unquote(m.options.app_label) }}/{{ m.name | lower}}es ${json_{{ m.name | lower}}_updated_1} ${id} ${json_{{ m.name | lower}}_updated_key}
+ [Tags] {{ m.name }}
+
+Delete {{ m.name }} DELETE /xosapi/v1/{{ xproto_unquote(m.options.app_label) }}/{{ m.name | lower}}es data_id=${id}
+ [Tags] {{ m.name }}
+{% endif -%}
+{% endif -%}
+{% endif -%}
+{% endfor %}
+
+*** Keywords ***
+Setup
+ Setup Tests
+
+Teardown
+ Teardown Tests