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'."