Library Collections
Library UtilLibrary.py
Library ClusterStateLibrary.py
+Library ./HsfJson/hsf_json.py
Resource Utils.robot
*** Variables ***
-${smc_node} /org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore
+${jolokia_conf} /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore
+${jolokia_oper} /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore
+${jolokia_read} /jolokia/read/org.opendaylight.controller
*** Keywords ***
+Create Controller Index List
+ [Documentation] Reads number of controllers and returns a list with all controllers indexes.
+ ${controller_index_list} Create List
+ ${NUM_ODL_SYSTEM}= Convert to Integer ${NUM_ODL_SYSTEM}
+ : FOR ${i} IN RANGE ${NUM_ODL_SYSTEM}
+ \ Append To List ${controller_index_list} ${i+1}
+ [Return] ${controller_index_list}
+
+Create Controller Sessions
+ [Documentation] Creates REST session to all controller instances.
+ ${NUM_ODL_SYSTEM}= Convert to Integer ${NUM_ODL_SYSTEM}
+ : FOR ${i} IN RANGE ${NUM_ODL_SYSTEM}
+ \ Log Create Session ${ODL_SYSTEM_${i+1}_IP}
+ \ RequestsLibrary.Create Session controller${i+1} http://${ODL_SYSTEM_${i+1}_IP}:${RESTCONFPORT} auth=${AUTH}
+
+Get Cluster Shard Status
+ [Arguments] ${controller_index_list} ${shard_type} ${shard}
+ [Documentation] Checks ${shard} status and returns Leader index and a list of Followers from a ${controller_index_list}.
+ ... ${shard_type} is either config or operational.
+ ${lenght}= Get Length ${controller_index_list}
+ Run Keyword If '${shard_type}' == 'config' Set Test Variable ${type} DistributedConfigDatastore
+ Run Keyword If '${shard_type}' == 'operational' Set Test Variable ${type} DistributedOperationalDatastore
+ Should Not Be Empty ${type} Wrong type, valid values are config and operational.
+ ${leader}= Set Variable 0
+ ${follower_list}= Create List
+ : FOR ${i} IN @{controller_index_list}
+ \ ${data}= Utils.Get Data From URI controller${i} ${jolokia_read}:Category=Shards,name=member-${i}-shard-${shard}-${shard_type},type=${type}
+ \ Log ${data}
+ \ ${json}= RequestsLibrary.To Json ${data}
+ \ ${status}= Get From Dictionary &{json}[value] RaftState
+ \ Log Controller ${ODL_SYSTEM_${i}_IP} is ${status} for shard ${shard}
+ \ Run Keyword If '${status}' == 'Leader' Set Test Variable ${leader} ${i}
+ \ Run Keyword If '${status}' == 'Follower' Append To List ${follower_list} ${i}
+ Should Not Be Equal ${leader} 0 No Leader elected in shard ${shard_type} ${shard}
+ Length Should Be ${follower_list} ${lenght-1} Not enough or too many Followers in shard ${shard_type} ${shard}
+ [Return] ${leader} ${follower_list}
+
+Get Cluster Entity Owner
+ [Arguments] ${controller_index_list} ${device_type} ${device}
+ [Documentation] Checks Entity Owner status for a ${device} and returns owner index and list of candidates from a ${controller_index_list}.
+ ... ${device_type} can be openflow, ovsdb, etc.
+ ${length}= Get Length ${controller_index_list}
+ ${candidates_list}= Create List
+ ${data}= Utils.Get Data From URI controller@{controller_index_list}[0] /restconf/operational/entity-owners:entity-owners
+ Log ${data}
+ ${clear_data}= Run Keyword If '${device_type}' == 'openflow' Extract OpenFlow Device Data ${data}
+ ... ELSE IF '${device_type}' == 'ovsdb' Extract Ovsdb Device Data ${data}
+ ... ELSE Fail Not recognized device type: ${device_type}
+ ${json}= RequestsLibrary.To Json ${clear_data}
+ ${entity_type_list}= Get From Dictionary &{json}[entity-owners] entity-type
+ ${entity_type_index}= Get Index From List Of Dictionaries ${entity_type_list} type ${device_type}
+ Should Not Be Equal ${entity_type_index} -1 No Entity Owner found for ${device_type}
+ ${entity_list}= Get From Dictionary @{entity_type_list}[${entity_type_index}] entity
+ ${entity_index}= Utils.Get Index From List Of Dictionaries ${entity_list} id ${device}
+ Should Not Be Equal ${entity_index} -1 Device ${device} not found in Entity Owner ${device_type}
+ ${entity_owner}= Get From Dictionary @{entity_list}[${entity_index}] owner
+ Should Not Be Empty ${entity_owner} No owner found for ${device}
+ ${owner}= Replace String ${entity_owner} member- ${EMPTY}
+ ${owner}= Convert To Integer ${owner}
+ List Should Contain Value ${controller_index_list} ${owner} Owner ${owner} not exisiting in ${controller_index_list}
+ ${entity_candidates_list}= Get From Dictionary @{entity_list}[${entity_index}] candidate
+ ${list_length}= Get Length ${entity_candidates_list}
+ : FOR ${entity_candidate} IN @{entity_candidates_list}
+ \ ${candidate}= Replace String &{entity_candidate}[name] member- ${EMPTY}
+ \ ${candidate}= Convert To Integer ${candidate}
+ \ Append To List ${candidates_list} ${candidate}
+ List Should Contain Sublist ${candidates_list} ${controller_index_list} Candidates are missing in ${candidates_list}
+ Remove Values From List ${candidates_list} ${owner}
+ [Return] ${owner} ${candidates_list}
+
+Extract OpenFlow Device Data
+ [Arguments] ${data}
+ [Documentation] Remove superfluous OpenFlow device data from Entity Owner printout.
+ ${clear_data}= Replace String ${data} /general-entity:entity[general-entity:name=' ${EMPTY}
+ ${clear_data}= Replace String ${clear_data} '] ${EMPTY}
+ Log ${clear_data}
+ [Return] ${clear_data}
+
+Extract Ovsdb Device Data
+ [Arguments] ${data}
+ [Documentation] Remove superfluous OVSDB device data from Entity Owner printout.
+ ${clear_data}= Replace String ${data} /network-topology:network-topology/network-topology:topology[network-topology:topology-id='ovsdb:1']/network-topology:node[network-topology:node-id=' ${EMPTY}
+ ${clear_data}= Replace String ${clear_data} '] ${EMPTY}
+ Log ${clear_data}
+ [Return] ${clear_data}
+
+Check Item Occurrence At URI In Cluster
+ [Arguments] ${controller_index_list} ${dictionary_item_occurrence} ${uri}
+ [Documentation] Send a GET with the supplied ${uri} to all cluster instances in ${controller_index_list}
+ ... and check for occurrences of items expressed in a dictionary ${dictionary_item_occurrence}.
+ : FOR ${i} IN @{controller_index_list}
+ \ ${data} Utils.Get Data From URI controller${i} ${uri}
+ \ Log ${data}
+ \ Utils.Check Item Occurrence ${data} ${dictionary_item_occurrence}
+
+Put And Check At URI In Cluster
+ [Arguments] ${controller_index_list} ${controller_index} ${uri} ${body}
+ [Documentation] Send a PUT with the supplied ${uri} and ${body} (json string) to a ${controller_index}
+ ... and check the data is replicated in all instances in ${controller_index_list}.
+ ${expected_body}= Hsf Json ${body}
+ Log ${body}
+ ${resp} RequestsLibrary.Put Request controller${controller_index} ${uri} data=${body} headers=${HEADERS_YANG_JSON}
+ Log ${resp.content}
+ Log ${resp.status_code}
+ ${status_code}= Convert To String ${resp.status_code}
+ Should Match Regexp ${status_code} 20(0|1)
+ : FOR ${i} IN @{controller_index_list}
+ \ ${data} Wait Until Keyword Succeeds 5s 1s Get Data From URI controller${i}
+ \ ... ${uri}
+ \ Log ${data}
+ \ ${received_body} Hsf Json ${data}
+ \ Should Be Equal ${expected_body} ${received_body}
+
+Delete And Check At URI In Cluster
+ [Arguments] ${controller_index_list} ${controller_index} ${uri}
+ [Documentation] Send a DELETE with the supplied ${uri} to a ${controller_index}
+ ... and check the data is removed from all instances in ${controller_index_list}.
+ ${resp} RequestsLibrary.Delete Request controller${controller_index} ${uri}
+ Should Be Equal As Strings ${resp.status_code} 200
+ : FOR ${i} IN @{controller_index_list}
+ \ Wait Until Keyword Succeeds 5s 1s No Content From URI controller${i} ${uri}
+
+Kill Multiple Controllers
+ [Arguments] @{controller_index_list}
+ [Documentation] Give this keyword a scalar or list of controllers to be stopped.
+ : FOR ${i} IN @{controller_index_list}
+ \ ${output}= Utils.Run Command On Controller ${ODL_SYSTEM_${i}_IP} ps axf | grep karaf | grep -v grep | awk '{print \"kill -9 \" $1}' | sh
+ \ ClusterKeywords.Controller Down Check ${ODL_SYSTEM_${i}_IP}
+
+Start Multiple Controllers
+ [Arguments] ${timeout} @{controller_index_list}
+ [Documentation] Give this keyword a scalar or list of controllers to be started.
+ : FOR ${i} IN @{controller_index_list}
+ \ ${output}= Utils.Run Command On Controller ${ODL_SYSTEM_${i}_IP} ${WORKSPACE}/${BUNDLEFOLDER}/bin/start
+ : FOR ${i} IN @{controller_index_list}
+ \ ClusterKeywords.Wait For Controller Sync ${timeout} ${ODL_SYSTEM_${i}_IP}
+
Get Controller List
[Arguments] ${exclude_controller}=${EMPTY}
[Documentation] Creates a list of all controllers minus any excluded controller.
Log ${exclude_controller}
- @{searchlist} Create List ${CONTROLLER} ${CONTROLLER1} ${CONTROLLER2}
+ @{searchlist} Create List ${ODL_SYSTEM_IP} ${ODL_SYSTEM_2_IP} ${ODL_SYSTEM_3_IP}
Remove Values From List ${searchlist} ${exclude_controller}
Log ${searchlist}
[Return] ${searchlist}
[Return] ${leader}
Expect No Leader
- [Documentation] No leader is elected in the car shard
[Arguments] ${shard_name}
+ [Documentation] No leader is elected in the car shard
${leader} GetLeader ${shard_name} ${3} ${1} ${1} ${RESTCONFPORT}
... ${CURRENT_CAR_LEADER}
Should Be Equal As Strings ${leader} None
[Arguments] ${ip}
[Documentation] Checks to see if a controller is down by verifying that the karaf process isn't present.
${cmd} = Set Variable ps axf | grep karaf | grep -v grep | wc -l
- ${response} Run Command On Remote System ${ip} ${cmd}
+ ${response} Run Command On COntroller ${ip} ${cmd}
Log Number of controller instances running: ${response}
Should Start With ${response} 0 Controller process found or there may be extra instances of karaf running on the host machine.
[Arguments] ${ip}
[Documentation] Checks if Sync Status is true.
${SyncStatus}= Get Controller Sync Status ${ip}
- Should Be Equal ${SyncStatus} ${True}
+ Should Be Equal ${SyncStatus} ${TRUE}
Controller Sync Status Should Be False
[Arguments] ${ip}
[Documentation] Checks if Sync Status is false.
${SyncStatus}= Get Controller Sync Status ${ip}
- Should Be Equal ${SyncStatus} ${False}
+ Should Be Equal ${SyncStatus} ${FALSE}
Get Controller Sync Status
[Arguments] ${controller_ip}
[Documentation] Return Sync Status.
- ${api} Set Variable /jolokia/read
- Create_Session session http://${controller_ip}:${RESTCONFPORT}${api} headers=${HEADERS} auth=${AUTH}
- ${resp}= RequestsLibrary.Get session ${smc_node}
- Log ${resp.json()}
- Log ${resp.content}
- ${json}= Set Variable ${resp.json()}
+ Create_Session session http://${controller_ip}:${RESTCONFPORT} headers=${HEADERS} auth=${AUTH}
+ ${data}= Get Data From URI session ${jolokia_conf}
+ Log ${data}
+ ${json}= To Json ${data}
${value}= Get From Dictionary ${json} value
- Log value: ${value}
- ${SyncStatus}= Get From Dictionary ${value} SyncStatus
- Log SyncSatus: ${SyncStatus}
+ ${ConfSyncStatus}= Get From Dictionary ${value} SyncStatus
+ Log Configuration Sync Status: ${ConfSyncStatus}
+ ${data}= Get Data From URI session ${jolokia_oper}
+ Log ${data}
+ ${json}= To Json ${data}
+ ${value}= Get From Dictionary ${json} value
+ ${OperSyncStatus}= Get From Dictionary ${value} SyncStatus
+ Log Operational Sync Status: ${OperSyncStatus}
+ Run Keyword If ${OperSyncStatus} and ${ConfSyncStatus} Set Test Variable ${SyncStatus} ${TRUE}
+ ... ELSE Set Test Variable ${SyncStatus} ${FALSE}
[Return] ${SyncStatus}
Clean One Or More Journals
Should Contain ${return string} Flushing chain `INPUT'
Should Contain ${return string} Flushing chain `FORWARD'
Should Contain ${return string} Flushing chain `OUTPUT'
-