Add entity owner leader isolation-rejoin test
[integration/test.git] / csit / libraries / ClusterManagement.robot
index 16713a3b3ef9f09ded73aef9b6e3ca9af070e74b..aeedca7971d3257943646efebcc13e5da771e519 100644 (file)
@@ -16,9 +16,6 @@ Documentation     Resource housing Keywords common to several suites for cluster
 ...
 ...               odl-jolokia is assumed to be installed.
 ...
-...               Keywords which run commands on ODL systems do not preserve active SSH session.
-...               TODO: Should they?
-...
 ...               Keywords are ordered from friendly ones to fiddly ones.
 ...               TODO: Figure out more deterministic but still user-friendly ordering.
 ...
@@ -32,10 +29,10 @@ Resource          ${CURDIR}/TemplatedRequests.robot    # for Get_As_Json_From_Ur
 Resource          ${CURDIR}/Utils.robot    # for Run_Command_On_Controller
 
 *** Variables ***
+${JAVA_HOME}      ${EMPTY}    # releng/builder scripts should provide correct value
 ${JOLOKIA_CONF_SHARD_MANAGER_URI}    jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore
 ${JOLOKIA_OPER_SHARD_MANAGER_URI}    jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore
 ${JOLOKIA_READ_URI}    jolokia/read/org.opendaylight.controller
-${KARAF_HOME}     ${WORKSPACE}${/}${BUNDLEFOLDER}
 ${RESTCONF_MODULES_DIR}    ${CURDIR}/../variables/restconf/modules
 
 *** Keywords ***
@@ -45,7 +42,8 @@ ClusterManagement_Setup
     ${already_done} =    BuiltIn.Get_Variable_Value    \${ClusterManagement__has_setup_run}    False
     BuiltIn.Return_From_Keyword_If    ${already_done}
     BuiltIn.Set_Suite_Variable    \${ClusterManagement__has_setup_run}    True
-    ${status}    ${possibly_int_of_members} =    BuiltIn.Run_Keyword_And_Ignore_Error    BuiltIn.Convert_To_Integer    ${NUM_ODL_SYSTEM}
+    ${cluster_size} =    BuiltIn.Get_Variable_Value    \${NUM_ODL_SYSTEM}    1
+    ${status}    ${possibly_int_of_members} =    BuiltIn.Run_Keyword_And_Ignore_Error    BuiltIn.Convert_To_Integer    ${cluster_size}
     ${int_of_members} =    BuiltIn.Set_Variable_If    '${status}' != 'PASS'    ${1}    ${possibly_int_of_members}
     ClusterManagement__Compute_Derived_Variables    int_of_members=${int_of_members}
 
@@ -53,7 +51,7 @@ Kill_Members_From_List_Or_All
     [Arguments]    ${member_index_list}=${EMPTY}    ${confirm}=True
     [Documentation]    If the list is empty, kill all ODL instances. Otherwise, kill members based on present indices.
     ...    If \${confirm} is True, sleep 1 second and verify killed instances are not there anymore.
-    ${command} =    BuiltIn.Set_Variable    ps axf | grep karaf | grep -v grep | awk '{print \"kill -9 \" $1}' | sh
+    ${command} =    BuiltIn.Set_Variable    ps axf | grep java | grep karaf | awk '{print \"kill -9 \" $1}' | sh
     Run_Command_On_List_Or_All    command=${command}    member_index_list=${member_index_list}
     BuiltIn.Return_From_Keyword_If    not ${confirm}
     # TODO: Convert to WUKS with configurable timeout if it turns out 1 second is not enough.
@@ -62,6 +60,38 @@ Kill_Members_From_List_Or_All
     : FOR    ${index}    IN    @{index_list}
     \    Verify_Karaf_Is_Not_Running_On_Member    member_index=${index}
 
+Isolate_Member_From_List_Or_All
+    [Arguments]    ${isolate_member_index}    ${member_index_list}=${EMPTY}
+    [Documentation]    If the list is empty, isolate member from all ODL instances. Otherwise, isolate member based on present indices.
+    ${index_list} =    ClusterManagement__Given_Or_Internal_Index_List    given_list=${member_index_list}
+    ${source} =    Get From Dictionary    ${ClusterManagement__index_to_ip_mapping}    ${isolate_member_index}
+    : FOR    ${index}    IN    @{index_list}
+    \    ${destination} =    Get From Dictionary    ${ClusterManagement__index_to_ip_mapping}    ${index}
+    \    ${command} =    BuiltIn.Set_Variable    sudo /sbin/iptables -I OUTPUT -p all --source ${source} --destination ${destination} -j DROP
+    \    Run Keyword If    "${index}" != "${isolate_member_index}"    Run_Command_On_Member    command=${command}    member_index=${isolate_member_index}
+    ${command} =    BuiltIn.Set_Variable    sudo /sbin/iptables -L -n
+    ${output} =    Run_Command_On_Member    command=${command}    member_index=${isolate_member_index}
+    Log    ${output}
+
+Rejoin_Member_From_List_Or_All
+    [Arguments]    ${rejoin_member_index}    ${member_index_list}=${EMPTY}
+    [Documentation]    If the list is empty, rejoin member from all ODL instances. Otherwise, rejoin member based on present indices.
+    ${index_list} =    ClusterManagement__Given_Or_Internal_Index_List    given_list=${member_index_list}
+    ${source} =    Get From Dictionary    ${ClusterManagement__index_to_ip_mapping}    ${rejoin_member_index}
+    : FOR    ${index}    IN    @{index_list}
+    \    ${destination} =    Get From Dictionary    ${ClusterManagement__index_to_ip_mapping}    ${index}
+    \    ${command} =    BuiltIn.Set_Variable    sudo /sbin/iptables -D OUTPUT -p all --source ${source} --destination ${destination} -j DROP
+    \    Run Keyword If    "${index}" != "${rejoin_member_index}"    Run_Command_On_Member    command=${command}    member_index=${rejoin_member_index}
+    ${command} =    BuiltIn.Set_Variable    sudo /sbin/iptables -L -n
+    ${output} =    Run_Command_On_Member    command=${command}    member_index=${rejoin_member_index}
+    Log    ${output}
+
+Flush_Iptables_From_List_Or_All
+    [Arguments]    ${member_index_list}=${EMPTY}
+    [Documentation]    If the list is empty, flush IPTables in all ODL instances. Otherwise, flush member based on present indices.
+    ${command} =    BuiltIn.Set_Variable    sudo iptables -v -F
+    ${output} =    Run_Command_On_List_Or_All    command=${command}    member_index_list=${member_index_list}
+
 ClusterManagement__Build_List
     [Arguments]    ${member}
     ${member_int}=    BuiltIn.Convert_To_Integer    ${member}
@@ -75,18 +105,20 @@ Kill_Single_Member
     Kill_Members_From_List_Or_All    ${index_list}    ${confirm}
 
 Clean_Journals_And_Snapshots_On_List_Or_All
-    [Arguments]    ${member_index_list}=${EMPTY}
+    [Arguments]    ${member_index_list}=${EMPTY}    ${karaf_home}=${WORKSPACE}${/}${BUNDLEFOLDER}
     [Documentation]    Delete journal and snapshots directories on every node listed (or all).
     ${index_list} =    ClusterManagement__Given_Or_Internal_Index_List    given_list=${member_index_list}
-    ${command} =    Set Variable    rm -rf "${KARAF_HOME}/journal" "${KARAF_HOME}/snapshots"
+    ${command} =    Set Variable    rm -rf "${karaf_home}/journal" "${karaf_home}/snapshots"
     : FOR    ${index}    IN    @{index_list}    # usually: 1, 2, 3.
     \    Run_Command_On_Member    command=${command}    member_index=${index}
 
 Start_Members_From_List_Or_All
-    [Arguments]    ${member_index_list}=${EMPTY}    ${wait_for_sync}=True    ${timeout}=300s
+    [Arguments]    ${member_index_list}=${EMPTY}    ${wait_for_sync}=True    ${timeout}=300s    ${karaf_home}=${WORKSPACE}${/}${BUNDLEFOLDER}    ${export_java_home}=${JAVA_HOME}
     [Documentation]    If the list is empty, start all cluster members. Otherwise, start members based on present indices.
     ...    If ${wait_for_sync}, wait for cluster sync on listed members.
-    ${command} =    BuiltIn.Set_Variable    ${KARAF_HOME}/bin/start
+    ...    Optionally karaf_home can be overriden. Optionally specific JAVA_HOME is used for starting.
+    ${base_command} =    BuiltIn.Set_Variable    ${karaf_home}/bin/start
+    ${command} =    BuiltIn.Set_Variable_If    "${export_java_home}"    export JAVA_HOME="${export_java_home}"; ${base_command}    ${base_command}
     Run_Command_On_List_Or_All    command=${command}    member_index_list=${member_index_list}
     BuiltIn.Return_From_Keyword_If    not ${wait_for_sync}
     BuiltIn.Wait_Until_Keyword_Succeeds    ${timeout}    1s    Check_Cluster_Is_In_Sync    member_index_list=${member_index_list}
@@ -148,7 +180,6 @@ Check_Cluster_Is_In_Sync
     ${index_list} =    ClusterManagement__Given_Or_Internal_Index_List    given_list=${member_index_list}
     : FOR    ${index}    IN    @{index_list}    # usually: 1, 2, 3.
     \    ${status} =    Get_Sync_Status_Of_Member    member_index=${index}
-    \    # The previous line may have failed already. If not, check status.
     \    BuiltIn.Continue_For_Loop_If    'True' == '${status}'
     \    BuiltIn.Fail    Index ${index} has incorrect status: ${status}