Skip to content

Commit

Permalink
UM using desired state to CUA and SUA (#142)
Browse files Browse the repository at this point in the history
* Using CUA for containers statuses

* Desired state check from UM

* Update manager test with desired state

* Sentence correction

* UM using SUA

* Keyword changed

* Added SUPERSEDED state
  • Loading branch information
stlachev authored Sep 11, 2023
1 parent 7639432 commit 9a02dca
Show file tree
Hide file tree
Showing 4 changed files with 86 additions and 97 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
FROM python
LABEL name="leda-tests"
RUN DEBIAN_FRONTEND=noninteractive TZ=Etc/UTC apt-get update && \
apt-get install -y --no-install-recommends iputils-ping netcat-traditional mosquitto-clients
apt-get install -y --no-install-recommends iputils-ping netcat-traditional mosquitto-clients jq
WORKDIR /root

RUN pip install robotframework robotframework-mqttlibrary robotframework-ymllib robotframework-metrics robotframework-jsonlibrary
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,56 +22,23 @@ Library JSONLibrary
Test Timeout 10 minutes

*** Variables ***
${leda.target} local
${leda.target.hostname} localhost
${leda.sshport} 2001

${broker.uri} 127.0.0.1
${broker.port} 1884
${topic_pub} selfupdate/desiredstate
${topic_pub_command} selfupdate/desiredstate/command
${topic_sub} selfupdate/desiredstatefeedback
${topic_pub_currentstate} selfupdate/currentstate/get
${topic_sub_currentstate} selfupdate/currentstate
${start_update_filename} robot-resources/start-update-example-x86.json
${download_filename} robot-resources/download-command.json
${update_filename} robot-resources/update-command.json
${activate_filename} robot-resources/activate-command.json
${cleanup_filename} robot-resources/cleanup-command.json
${get_state_filename} robot-resources/get_state.json
${topic_pub_desiredstate} vehicleupdate/desiredstate
# Used to get bundle version
${topic_sub_selfupdate} selfupdate/desiredstatefeedback
${identified_success_regex} ([.\\s\\S]*)("IDENTIFIED")([\\s\\S.]*)
${download_success_regex} ([.\\s\\S]*)("DOWNLOAD_SUCCESS")([\\s\\S.]*)
${update_success_regex} ([.\\s\\S]*)("UPDATE_SUCCESS")([\\s\\S.]*)
${activation_success_regex} ([.\\s\\S]*)("ACTIVATION_SUCCESS")([\\s\\S.]*)
${cleanup_success_regex} ([.\\s\\S]*)("COMPLETE")([\\s\\S.]*)
${sua_alive_regex} ([.\\s\\S]*)("self-update-agent")([\\s\\S.]*)

*** Test Cases ***
Wait for SUA alive
Wait Until Keyword Succeeds 5m 3s Verify SUA is alive ${broker.uri} ${broker.port} ${topic_pub_currentstate} ${topic_sub_currentstate} ${get_state_filename} ${sua_alive_regex}
Wait for SUA running
[Documentation] SUA is running upon system start
Check containers presence ${broker.uri} ${broker.port} sua
Expected containers status ${broker.uri} ${broker.port} Running sua

Self Update Test
[Documentation] Install update bundle
Log To Console \nGet Version and Start Update...
${expected_version}= Trigger to start update ${broker.uri} ${broker.port} ${topic_pub} ${topic_sub} ${start_update_filename} ${identified_success_regex}

Log To Console Download...
Execute SUA command ${broker.uri} ${broker.port} ${topic_pub_command} ${download_filename}
Connect and Subscribe to Listen ${broker.uri} ${broker.port} ${topic_sub} ${download_success_regex} 120

Log To Console Update...
Execute SUA command ${broker.uri} ${broker.port} ${topic_pub_command} ${update_filename}
Connect and Subscribe to Listen ${broker.uri} ${broker.port} ${topic_sub} ${update_success_regex} 120

Log To Console Activate...
Execute SUA command ${broker.uri} ${broker.port} ${topic_pub_command} ${activate_filename}
Connect and Subscribe to Listen ${broker.uri} ${broker.port} ${topic_sub} ${activation_success_regex} 30
${expected_version}= Trigger to start update ${broker.uri} ${broker.port} ${topic_pub_desiredstate} ${topic_sub_selfupdate} ${start_update_filename} ${identified_success_regex}

Log To Console Cleanup...
Execute SUA command ${broker.uri} ${broker.port} ${topic_pub_command} ${cleanup_filename}
Connect and Subscribe to Listen ${broker.uri} ${broker.port} ${topic_sub} ${cleanup_success_regex} 5
Check desired state ${broker.uri} ${broker.port}

Log To console Finalize
${result}= Leda Execute OK echo VERSION_ID=${expected_version} > /etc/os-release
${result_status}= Leda Execute OK rauc status --detailed --output-format=json
${json}= Evaluate json.loads("""${result_status.stdout}""")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,39 +21,24 @@ Library Process
Test Timeout 10 minutes

*** Variables ***

${sua_alive_regex} ([.\\s\\S]*)("self-update-agent")([\\s\\S.]*)
${topic_pub_currentstate} selfupdate/currentstate/get
${topic_sub_currentstate} selfupdate/currentstate
${get_state_filename} robot-resources/get_state.json

${topic_pub_desiredstate} vehicleupdate/desiredstate
${desired_state_no_containers_filename} robot-resources/desired-state-no-containers.json
${desired_state_filename} robot-resources/desired-state.json
${topic_pub_desiredstate} vehicleupdate/desiredstate
${desired_state_no_containers_filename} robot-resources/desired-state-no-containers.json
${desired_state_filename} robot-resources/desired-state.json
@{all_containers} sua feedercan seatservice-example databroker hvacservice-example cloudconnector
@{containers} sua feedercan seatservice-example databroker hvacservice-example
@{any_state_containers} cloudconnector
@{stop_containers} seatservice-example databroker feedercan hvacservice-example

*** Test Cases ***

Check containers running
[Documentation] Check containers running
Wait Until Keyword Succeeds 5m 3s Verify SUA is alive ${broker.uri} ${broker.port} ${topic_pub_currentstate} ${topic_sub_currentstate} ${get_state_filename} ${sua_alive_regex}
${result}= Check containers status ${broker.uri} ${broker.port} Running @{containers}
Should Be Empty ${result} msg=Container(s) ${result} must be Running
${result}= Check containers status ${broker.uri} ${broker.port} Any @{any_state_containers}
Should Be Empty ${result} msg=Container(s) ${result} must persist

Stop containers
[Documentation] Stop containers
Publish command from file ${broker.uri} ${broker.port} ${topic_pub_desiredstate} ${desired_state_no_containers_filename}
${result}= Check containers status ${broker.uri} ${broker.port} Stopped @{stop_containers}
Should Be Empty ${result} msg=Container(s) ${result} must be Stopped

Bring all containers running
[Documentation] Bring all containers running
Publish command from file ${broker.uri} ${broker.port} ${topic_pub_desiredstate} ${desired_state_filename}
${result}= Check containers status ${broker.uri} ${broker.port} Running @{containers}
Should Be Empty ${result} msg=Container(s) ${result} must be Running
${result}= Check containers status ${broker.uri} ${broker.port} Any @{any_state_containers}
Should Be Empty ${result} msg=Container(s) ${result} must persist
Containers are running
[Documentation] Containers are running upon system start
Check containers presence ${broker.uri} ${broker.port} @{all_containers}
Expected containers status ${broker.uri} ${broker.port} Running @{containers}

Desired state to stop containers
[Documentation] Stop containers via empty desired state
Publish from file ${broker.uri} ${broker.port} ${topic_pub_desiredstate} ${desired_state_no_containers_filename}
Check desired state ${broker.uri} ${broker.port}

Desired state to start containers
[Documentation] Containers running via full desired state
Publish from file ${broker.uri} ${broker.port} ${topic_pub_desiredstate} ${desired_state_filename}
Check desired state ${broker.uri} ${broker.port}
Original file line number Diff line number Diff line change
Expand Up @@ -25,18 +25,10 @@ Library String

*** Variables ***
${leda.sshport} 2222
${json_query} $..payload[*].softwareNodes[?(@.id=='containers:{container}')].parameters[?(@.key=='status')].value
${json_query_containers_status} $..payload[*].softwareNodes[?(@.id=='containers:{container}')].parameters[?(@.key=='status')].value

*** Keywords ***

Verify SUA is alive
[Arguments] ${broker.uri} ${broker.port} ${topic_pub} ${topic_sub} ${filename} ${payload_regex}
${message}= Get File ${filename}
Connect ${broker.uri} ${broker.port}
Publish Single topic=${topic_pub} payload=${message} hostname=${broker.uri} port=${broker.port}
Log ${payload_regex}
Subscribe And Validate ${topic_sub} qos=1 payload=${payload_regex} timeout=10

Publish until met
[Arguments] ${broker.uri} ${broker.port} ${topic_pub} ${topic_sub} ${message} ${payload_regex}
Connect ${broker.uri} ${broker.port}
Expand All @@ -55,12 +47,7 @@ Trigger to start update
Wait Until Keyword Succeeds 3m 3s Publish until met ${broker.uri} ${broker.port} ${topic_pub} ${topic_sub} ${message} ${payload_regex}
RETURN ${version_id.stdout}

Execute SUA command
[Arguments] ${broker.uri} ${broker.port} ${topic_pub} ${filename}
${message}= Get File ${filename}
Publish Single topic=${topic_pub} payload=${message} hostname=${broker.uri} port=${broker.port}

Publish command from file
Publish from file
[Arguments] ${broker.uri} ${broker.port} ${topic_pub} ${filename}
${message}= Get File ${filename}
Publish Single topic=${topic_pub} payload=${message} hostname=${broker.uri} port=${broker.port}
Expand Down Expand Up @@ -127,26 +114,37 @@ Leda Execute
Log ${result.stderr}
RETURN ${result}

View json
[Documentation] For debug purposes
[Arguments] ${message}
${command}= Format String echo '{message}' | jq .
... message=${message}
${result}= Run Process bash -c ${command} shell=True
Log to console ${result.stdout}

Check containers status
[Documentation] Checks list of containers for status (Running, Stopped and Any)
[Documentation] Checks list of containers for status (Running, Missing, Any and Stopped)
[Arguments] ${broker.uri} ${broker.port} ${status} @{list}
Connect ${broker.uri} ${broker.port}
@{listNext} Create List @{list}
TRY
WHILE ${listNext} != @{EMPTY} limit=100
Publish command from file ${broker.uri} ${broker.port}
Publish from file ${broker.uri} ${broker.port}
... containersupdate/currentstate/get
... robot-resources/update-state.json
@{messagelist}= Subscribe containersupdate/currentstate qos=1 timeout=50 limit=1
Length should be ${messagelist} 1
@{messagelist}= Subscribe containersupdate/currentstate qos=1 timeout=1 limit=1
Length should be ${messagelist} 1 msg=Cannot get current state of containers
${json_string}= Get From List ${messagelist} 0
${message}= Convert String to JSON ${json_string}
@{listCurrent} Create List @{listNext}
FOR ${container} IN @{listCurrent}
${jq}= Format String ${json_query}
${jq}= Format String ${json_query_containers_status}
... container=${container}
${result}= Get Value From Json ${message} ${jq}
IF ${result} == @{EMPTY}
IF ${result} == @{EMPTY}
IF '${status}' == 'Missing'
Remove values from list ${listNext} ${container}
END
CONTINUE
END
Length should be ${result} 1
Expand All @@ -164,3 +162,42 @@ Check containers status
END
Disconnect
RETURN ${listNext}

Expected containers status
[Documentation] Can rise an error after call to Check containers status
... Used from Wait Until Keyword Succeeds when needed
[Arguments] ${broker.uri} ${broker.port} ${status} @{list}
${result}= Check containers status ${broker.uri} ${broker.port} ${status} @{list}
Should Be Empty ${result} msg=Container(s) ${result} must be ${status}

Check containers presence
[Documentation] Checks list of containers presence in any status
[Arguments] ${broker.uri} ${broker.port} @{list}
Wait Until Keyword Succeeds 5m 30s Expected containers status ${broker.uri} ${broker.port} Any @{list}

Check desired state
[Documentation] Checks desired state. Desired state must be published, before it can be checked
[Arguments] ${broker.uri} ${broker.port} ${timeout}=120
Connect ${broker.uri} ${broker.port}
WHILE True limit=50
@{messagelist}= Subscribe vehicleupdate/desiredstatefeedback qos=1 timeout=${timeout} limit=1
Length should be ${messagelist} 1 msg=Send desired state first. No feedback found
${json_string}= Get From List ${messagelist} 0
${message}= Convert String to JSON ${json_string}
${result}= Get Value From Json ${message} $..payload['status']
${result}= Get From List ${result} 0
Unsubscribe vehicleupdate/desiredstatefeedback
Log ${result}
IF 'COMPLETED' in '${result}'
Disconnect
RETURN
ELSE IF 'FAILED' in '${result}' or 'INCOMPLETE' in '${result}' or 'SUPERSEDED' in '${result}'
Disconnect
${msg}= Get Value From Json ${message} $..payload['message']
${msg}= Get From List ${msg} 0
FAIL Desired state is ${result} (${msg})
RETURN
END
END
Disconnect
FAIL Too many attempts. Limit was reached

0 comments on commit 9a02dca

Please sign in to comment.