SEBA-462: Purge the tables during teardown of migration test;
Add remove service test
Change-Id: I417b3236afbfe15a008435828494f7e410e695ae
diff --git a/src/test/cord-api/Tests/XosScaleValidations/xos-remove-service.robot b/src/test/cord-api/Tests/XosScaleValidations/xos-remove-service.robot
new file mode 100644
index 0000000..62fcacc
--- /dev/null
+++ b/src/test/cord-api/Tests/XosScaleValidations/xos-remove-service.robot
@@ -0,0 +1,195 @@
+*** Settings ***
+Documentation Test remove of a service
+Library RequestsLibrary
+Library HttpLibrary.HTTP
+Library Collections
+Library String
+Library OperatingSystem
+Library DateTime
+Library ../../Framework/utils/utils.py
+Library DatabaseLibrary
+Resource ../../Framework/utils/utils.robot
+Library ../../Framework/restApi.py
+Variables ../../Properties/RestApiProperties.py
+Suite Setup Setup
+Suite Teardown Teardown
+
+*** Variables ***
+${timeout} 300s
+${repository} xosproject/simpleexampleservice-synchronizer
+${migration1} migration-test1
+${migration2} migration-test2
+${helm_chart} ~/cord/helm-charts/xos-services/simpleexampleservice
+${cleanup} ${true}
+
+*** Test Cases ***
+Ensure Clean Environment
+ [Documentation] Ensure the service is not installed and its endpoint is not being served
+ [Tags] test1
+ ${output}= Run helm ls | grep simpleexampleservice | wc -l
+ Should Be Equal As Integers ${output} 0
+ ${resp} = Get Request ${SERVER_IP} uri=/xosapi/v1/simpleexampleservice/simpleexampleservices
+ Should Be Equal As Strings ${resp.status_code} 404
+
+Install SimpleExampleService
+ [Documentation] Install version A of the service and wait for completion
+ [Tags] test2
+ Run helm install -n simpleexampleservice --set image.repository=${repository} --set image.tag=${migration1} ${helm_chart}
+ Wait Until Keyword Succeeds ${timeout} 5s Validate Service Running
+
+Verify Tables Present
+ [Documentation] Verify the tables are present
+ [Tags] test3
+ Table Must Exist simpleexampleservice_simpleexampleservice
+ Table Must Exist simpleexampleservice_simpleexampleserviceinstance
+ Table Must Exist simpleexampleservice_serviceinstancewithcompute2
+ Table Must Exist simpleexampleservice_embeddedimagenew
+ Table Must Exist simpleexampleservice_colornew
+
+Verify Migrations Present
+ [Documentation] Verify Migrations are Present
+ [Tags] test4
+ Row Count is Greater Than X SELECT * FROM django_migrations where app='simpleexampleservice' 0
+
+Create Model
+ [Documentation] Create a service model
+ [Tags] test5
+ ${model_name}= Generate Random Value string
+ ${data}= Create Dictionary name=${model_name} service_message=initial
+ ${data}= Evaluate json.dumps(${data}) json
+ ${resp}= CORD Post /xosapi/v1/simpleexampleservice/simpleexampleservices ${data}
+ ${json_content}= Evaluate json.loads('''${resp.content}''') json
+ ${model_id}= Get From Dictionary ${json_content} id
+ Set Suite Variable ${model_id}
+ Set Suite Variable ${model_name}
+
+Delete Service Synchronizer
+ [Documentation] Delete the service synchronizer
+ [Tags] test6
+ Delete Service
+ Wait Until Keyword Succeeds ${timeout} 5s Validate Service Not Running
+
+Unload Service While Dirty
+ [Documentation] Unload the service
+ [Tags] test7
+ ${data}= Create Dictionary name=simpleexampleservice version=1.1.7
+ ${data}= Evaluate json.dumps(${data}) json
+ ${resp}= Post Request ${SERVER_IP} uri=/xosapi/v1/dynamicload/unload_models data=${data}
+ Should Be Equal As Strings ${resp.status_code} 409
+
+Unload Service Automatic Cleanup
+ [Documentation] Unload the service
+ [Tags] test8
+ ${data}= Create Dictionary name=simpleexampleservice version=1.1.7 cleanup_behavior=1
+ ${data}= Evaluate json.dumps(${data}) json
+ # The first time it should delete the model, and may return a TRYAGAIN
+ ${resp}= Post Request ${SERVER_IP} uri=/xosapi/v1/dynamicload/unload_models data=${data}
+ Should Be Equal As Strings ${resp.status_code} 200
+ # Try it a second time, just in case deletion was in progress, should succeed this time
+ ${resp}= Post Request ${SERVER_IP} uri=/xosapi/v1/dynamicload/unload_models data=${data}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Verify Service Stopped
+ [Documentation] Make sure the core has stopped serving the service
+ [Tags] test9
+ Wait Until Keyword Succeeds ${timeout} 5s Validate Service Not Served
+
+Verify Tables Removed
+ [Documentation] Verify the tables have been removed
+ [Tags] test10
+ Run Keyword And Expect Error Table 'simpleexampleservice_simpleexampleservice' does not exist in the db Table Must Exist simpleexampleservice_simpleexampleservice
+ Run Keyword And Expect Error Table 'simpleexampleservice_simpleexampleserviceinstance' does not exist in the db Table Must Exist simpleexampleservice_simpleexampleserviceinstance
+ Run Keyword And Expect Error Table 'simpleexampleservice_serviceinstancewithcompute2' does not exist in the db Table Must Exist simpleexampleservice_serviceinstancewithcompute2
+ Run Keyword And Expect Error Table 'simpleexampleservice_embeddedimagenew' does not exist in the db Table Must Exist simpleexampleservice_embeddedimagenew
+ Run Keyword And Expect Error Table 'simpleexampleservice_colornew' does not exist in the db Table Must Exist simpleexampleservice_colornew
+
+Verify Migrations Removed
+ [Documentation] Verify Migrations Removed
+ [Tags] test11
+ Row Count is 0 SELECT * FROM django_migrations where app='simpleexampleservice'
+
+
+*** Keywords ***
+Setup
+ ${auth} = Create List ${XOS_USER} ${XOS_PASSWD}
+ ${HEADERS} Create Dictionary Content-Type=application/json allow_modify_feedback=True
+ Create Session ${server_ip} http://${server_ip}:${server_port} auth=${AUTH} headers=${HEADERS}
+ @{model_A_fields}= Create List service_message service_secret
+ @{model_B_fields}= Create List service_message service_secret new_field
+ @{model_B_only_fields}= Create List new_field
+
+ ${db_addr}= Run kubectl get services | grep -i xos-db | awk '{print $3}'
+ Connect To Database psycopg2 xos postgres password ${db_addr} 5432
+
+ Set Suite Variable @{model_A_fields}
+
+ Set Suite Variable @{model_B_fields}
+
+ Set Suite Variable @{model_B_only_fields}
+
+Teardown
+ [Documentation] Delete all https sessions
+ Run Keyword If ${cleanup} == ${true} Ensure Service Deleted
+ Run Keyword If ${cleanup} == ${true} Ensure Service Unloaded
+ Disconnect From Database
+ Delete All Sessions
+
+Validate Service Running
+ # wait for helm chart to be deployed
+ ${output}= Run helm ls | grep simpleexampleservice | grep -i deployed | wc -l
+ Should Be Equal As Integers ${output} 1
+ # wait for the synchronizer pod to be running
+ ${output}= Run kubectl get pods | grep simpleexampleservice | grep -i running | grep 1/1 | wc -l
+ Should Be Equal As Integers ${output} 1
+ # wait for no other synchronizer pods to be terminating
+ ${output}= Run kubectl get pods | grep simpleexampleservice | grep -i terminating | wc -l
+ Should Be Equal As Integers ${output} 0
+ # wait for the endpoint to exist
+ ${resp} = CORD Get /xosapi/v1/simpleexampleservice/simpleexampleservices
+
+Validate Service Not Running
+ # wait for helm chart to be deployed
+ ${output}= Run helm ls | grep simpleexampleservice | grep -i deployed | wc -l
+ Should Be Equal As Integers ${output} 0
+ # wait for the synchronizer pod to be not running
+ ${output}= Run kubectl get pods | grep simpleexampleservice | grep -i running | grep 1/1 | wc -l
+ # wait for no other synchronizer pods to finish terminating
+ ${output}= Run kubectl get pods | grep simpleexampleservice | grep -i terminating | wc -l
+ Should Be Equal As Integers ${output} 0
+
+Validate Service Not Served
+ # endpoint should not be served
+ ${resp} = Get Request ${SERVER_IP} uri=/xosapi/v1/simpleexampleservice/simpleexampleservices
+ Should Be Equal As Strings ${resp.status_code} 404
+ # wait for the core to be up
+ ${resp} = CORD Get /xosapi/v1/core/users
+
+Ensure Service Deleted
+ ${output}= Run helm ls | grep simpleexampleservice | grep -i deployed | wc -l
+ Run Keyword If ${output} == 1 Delete Service
+
+Delete Service
+ Log Deleating Service Helm Chart
+ ${rc}= Run And Return RC helm del --purge simpleexampleservice
+ Should Be Equal As Integers ${rc} 0
+ Log Deleted Service Helm Chart
+
+Ensure Service Unloaded
+ [Documentation] Unload the service if it is loaded.
+ Wait Until Keyword Succeeds 200s 2s CORD Get /xosapi/v1/core/users
+ ${resp}= Get Request ${SERVER_IP} uri=/xosapi/v1/dynamicload/load_status
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${jsondata}= To Json ${resp.content}
+ ${length}= Get Length ${jsondata['services']}
+ : FOR ${INDEX} IN RANGE 0 ${length}
+ \ ${dict}= Get From List ${jsondata['services']} ${INDEX}
+ \ Run Keyword If "${dict['name']}" == "simpleexampleservice" and "${dict['state']}" == "present" Unload Service
+
+Unload Service
+ [Documentation] Unload the service
+ Log Unloading Service, with table purge
+ ${data}= Create Dictionary name=simpleexampleservice version=1.1.7 cleanup_behavior=2
+ ${data}= Evaluate json.dumps(${data}) json
+ ${resp}= Post Request ${SERVER_IP} uri=/xosapi/v1/dynamicload/unload_models data=${data}
+ Should Be Equal As Strings ${resp.status_code} 200
+ Log Successfully Unloaded
diff --git a/src/test/cord-api/Tests/XosScaleValidations/xos-service-migrations.robot b/src/test/cord-api/Tests/XosScaleValidations/xos-service-migrations.robot
index 4f2bd0e..010dec2 100644
--- a/src/test/cord-api/Tests/XosScaleValidations/xos-service-migrations.robot
+++ b/src/test/cord-api/Tests/XosScaleValidations/xos-service-migrations.robot
@@ -137,8 +137,8 @@
Unload Service
[Documentation] Unload the service
- Log Unloading Service
- ${data}= Create Dictionary name=simpleexampleservice version=1.1.7
+ Log Unloading Service, with table purge
+ ${data}= Create Dictionary name=simpleexampleservice version=1.1.7 cleanup_behavior=2
${data}= Evaluate json.dumps(${data}) json
${resp}= Post Request ${SERVER_IP} uri=/xosapi/v1/dynamicload/unload_models data=${data}
Should Be Equal As Strings ${resp.status_code} 200
diff --git a/src/test/cord-api/setup_venv.sh b/src/test/cord-api/setup_venv.sh
index da7e926..b0cdf98 100755
--- a/src/test/cord-api/setup_venv.sh
+++ b/src/test/cord-api/setup_venv.sh
@@ -31,7 +31,8 @@
source "${VENVDIR}/bin/activate"
pip install --upgrade pip
pip install cryptography==2.4.2 robotframework robotframework-requests robotframework-sshlibrary \
- pexpect robotframework-httplibrary robotframework-kafkalibrary pygments pyyaml
+ pexpect robotframework-httplibrary robotframework-kafkalibrary pygments pyyaml \
+ robotframework-databaselibrary psycopg2
pip install requests tinydb
-echo "CORD-TESTER virtualenv created. Run 'source ${VENVDIR}/bin/activate'."
\ No newline at end of file
+echo "CORD-TESTER virtualenv created. Run 'source ${VENVDIR}/bin/activate'."