Fix cluster test headers
[integration/test.git] / csit / libraries / ClusterKeywords.robot
index 8ba9dbadf4c8aa83d523ea05293f9f329221dfbc..04ab7b613abd3c2d017e4c4aa2ccfa98c8f63a3d 100644 (file)
@@ -3,17 +3,107 @@ Library           RequestsLibrary
 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}
+    \    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}=    Get Data From URI    controller${i}    ${jolokia_read}:Category=Shards,name=member-${i}-shard-${shard}-${shard_type},type=${type}
+    \    Log    ${data}
+    \    ${json}=    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}
+
+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}    Get Data From URI    controller${i}    ${uri}
+    \    Log    ${data}
+    \    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}=    Run Command On Controller    ${ODL_SYSTEM_${i}_IP}    ps axf | grep karaf | grep -v grep | awk '{print \"kill -9 \" $1}' | sh
+    \    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}=    Run Command On Controller    ${ODL_SYSTEM_${i}_IP}    ${WORKSPACE}/${BUNDLEFOLDER}/bin/start
+    \    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}
@@ -77,7 +167,7 @@ Controller Down Check
     [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.
 
@@ -104,27 +194,32 @@ Controller Sync Status Should Be True
     [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
+    ${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
-    Log    value: ${value}
-    ${SyncStatus}=    Get From Dictionary    ${value}    SyncStatus
-    Log    SyncSatus: ${SyncStatus}
+    ${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