blob: 0770577656b7752e7a61f663b1f483a67e9f18de [file] [log] [blame]
# XOS Migration Tests
#
# This test progressively migrates a service through several versions.
#
# migration1 - initial version of simpleexampleservice, with 0001 script checked in
# migration2 - add a "new_field" to the SimpleExampleService model:
# required string new_field = 3 [
# help_text = "New field to test data migration",
# db_index = False,
# default = "new_stuff"];
# migration3 - rename "new_field" to "renamed_new_field":
# required string renamed_new_field = 3 [
# help_text = "New field to test data migration",
# db_index = False,
# default = "renamed_new_stuff"];
# NOTE: Migration3 generated by xos-migrate has to be manually changed from remove+add to a rename
# migrations4 - delete "new_field"
*** Settings ***
Documentation Test migration of a Service in the core
Library RequestsLibrary
Library Collections
Library String
Library OperatingSystem
Library DateTime
Library CORDRobot
Library ImportResource resources=CORDRobot
Variables ../../Properties/RestApiProperties.py
Suite Setup Setup
Suite Teardown Teardown
*** Variables ***
${timeout} 300s
${repository} xosproject/simpleexampleservice-synchronizer
${migration1} migration-test1
${migration2} migration-test2
${migration3} migration-test3
${migration4} migration-test4
${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
Log ${resp.content}
Should Be Equal As Strings ${resp.status_code} 404
Install initial version
[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
Create Model
[Documentation] Create a service model
[Tags] test3
${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}= To Json ${resp.content}
${model_id}= Get From Dictionary ${json_content} id
Set Suite Variable ${model_id}
Set Suite Variable ${model_name}
Validate Service Version A
[Documentation] Validate fields from model in version A
[Tags] test4
${resp} = CORD Get /xosapi/v1/simpleexampleservice/simpleexampleservices/${model_id}
${jsondata} = To Json ${resp.content}
${keys}= Get Dictionary Keys ${jsondata}
: FOR ${field} IN @{model_A_fields}
\ List Should Contain Value ${keys} ${field}
: FOR ${field} IN @{model_B_only_fields}
\ List Should Not Contain Value ${keys} ${field}
: FOR ${field} IN @{model_C_only_fields}
\ List Should Not Contain Value ${keys} ${field}
Should Be Equal As Strings ${jsondata['name']} ${model_name}
Should Be Equal As Strings ${jsondata['service_message']} initial
Upgrade Service To Version B
[Documentation] Upgrade the version of the service to version B (adds a new field) and wait for completion
[Tags] test5
${rc}= Run And Return RC helm upgrade --set image.repository=${repository} --set image.tag=${migration2} --recreate-pods simpleexampleservice ${helm_chart}
Should Be Equal As Integers ${rc} 0
Wait Until Keyword Succeeds ${timeout} 5s Validate Service Running
Validate Service Version B
[Documentation] Validate fields from model in upgraded version B (2.0.0)
[Tags] test6
${resp} = CORD Get /xosapi/v1/simpleexampleservice/simpleexampleservices/${model_id}
${jsondata} = To Json ${resp.content}
${keys}= Get Dictionary Keys ${jsondata}
: FOR ${field} IN @{model_B_fields}
\ List Should Contain Value ${keys} ${field}
Should Be Equal As Strings ${jsondata['name']} ${model_name}
Should Be Equal As Strings ${jsondata['service_message']} initial
Should Be Equal As Strings ${jsondata['new_field']} new_stuff
Upgrade Service To Version C
[Documentation] Upgrade the version of the service to version C (renames a field) and wait for completion
[Tags] test7
${rc}= Run And Return RC helm upgrade --set image.repository=${repository} --set image.tag=${migration3} --recreate-pods simpleexampleservice ${helm_chart}
Should Be Equal As Integers ${rc} 0
Wait Until Keyword Succeeds ${timeout} 5s Validate Service Running
Validate Service Version C
[Documentation] Validate fields from model in upgraded version B (2.0.0)
[Tags] test8
${resp} = CORD Get /xosapi/v1/simpleexampleservice/simpleexampleservices/${model_id}
${jsondata} = To Json ${resp.content}
${keys}= Get Dictionary Keys ${jsondata}
: FOR ${field} IN @{model_C_fields}
\ List Should Contain Value ${keys} ${field}
: FOR ${field} IN @{model_B_only_fields}
\ List Should Not Contain Value ${keys} ${field}
Should Be Equal As Strings ${jsondata['name']} ${model_name}
Should Be Equal As Strings ${jsondata['service_message']} initial
Should Be Equal As Strings ${jsondata['renamed_new_field']} new_stuff
Upgrade Service To Version D
[Documentation] Upgrade the version of the service to version D (deletes a field) and wait for completion
[Tags] test9
${rc}= Run And Return RC helm upgrade --set image.repository=${repository} --set image.tag=${migration4} --recreate-pods simpleexampleservice ${helm_chart}
Should Be Equal As Integers ${rc} 0
Wait Until Keyword Succeeds ${timeout} 5s Validate Service Running
Validate Service Version D
[Documentation] Validate fields from model in version D
[Tags] test10
${resp} = CORD Get /xosapi/v1/simpleexampleservice/simpleexampleservices/${model_id}
${jsondata} = To Json ${resp.content}
${keys}= Get Dictionary Keys ${jsondata}
: FOR ${field} IN @{model_D_fields}
\ List Should Contain Value ${keys} ${field}
: FOR ${field} IN @{model_B_only_fields}
\ List Should Not Contain Value ${keys} ${field}
: FOR ${field} IN @{model_C_only_fields}
\ List Should Not Contain Value ${keys} ${field}
Should Be Equal As Strings ${jsondata['name']} ${model_name}
Should Be Equal As Strings ${jsondata['service_message']} initial
*** 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
@{model_B_fields}= Create List service_message new_field
@{model_B_only_fields}= Create List new_field
@{model_C_fields}= Create List service_message renamed_new_field
@{model_C_only_fields}= Create List renamed_new_field
@{model_D_fields}= Create List service_message
Set Suite Variable @{model_A_fields}
Set Suite Variable @{model_B_fields}
Set Suite Variable @{model_B_only_fields}
Set Suite Variable @{model_C_fields}
Set Suite Variable @{model_C_only_fields}
Set Suite Variable @{model_D_fields}
Teardown
[Documentation] Delete all https sessions
Run Keyword If ${cleanup} == ${true} Ensure Service Deleted
Run Keyword If ${cleanup} == ${true} Ensure Service Unloaded
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
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
Log ${resp.content}
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
Log ${data}
${resp}= Post Request ${SERVER_IP} uri=/xosapi/v1/dynamicload/unload_models data=${data}
Log ${resp.content}
Should Be Equal As Strings ${resp.status_code} 200
Log Successfully Unloaded