Fix robot syntax with robot.tidy tool
[integration/test.git] / csit / libraries / controller / DrbCommons.robot
index b901b089f4d0920549158cf45959fb33e90432e2..d835db8585c63735a4345724b051bfb24b8164e3 100644 (file)
@@ -1,12 +1,12 @@
 *** Settings ***
 Documentation     DOMRpcBroker testing: Common keywords
 *** Settings ***
 Documentation     DOMRpcBroker testing: Common keywords
-...
+...           
 ...               Copyright (c) 2017 Cisco Systems, Inc. and others. All rights reserved.
 ...               Copyright (c) 2017 Cisco Systems, Inc. and others. All rights reserved.
-...
+...           
 ...               This program and the accompanying materials are made available under the
 ...               terms of the Eclipse Public License v1.0 which accompanies this distribution,
 ...               and is available at http://www.eclipse.org/legal/epl-v10.html
 ...               This program and the accompanying materials are made available under the
 ...               terms of the Eclipse Public License v1.0 which accompanies this distribution,
 ...               and is available at http://www.eclipse.org/legal/epl-v10.html
-...
+...           
 ...               The aim of this resource is to groups reusable blocks of commands into
 ...               keywords. It should be initiated by DrbCommons_Init. It creates
 ...               ${all_indices}, ${registered_indices}, ${nonregistered_indices} and
 ...               The aim of this resource is to groups reusable blocks of commands into
 ...               keywords. It should be initiated by DrbCommons_Init. It creates
 ...               ${all_indices}, ${registered_indices}, ${nonregistered_indices} and
@@ -20,12 +20,23 @@ Documentation     DOMRpcBroker testing: Common keywords
 ...               constant from isolated node with regirered rpc is
 ...               invalid
 ...               ${active_indices} - list of indexes of non-isolated, non-stopped/killed nodes
 ...               constant from isolated node with regirered rpc is
 ...               invalid
 ...               ${active_indices} - list of indexes of non-isolated, non-stopped/killed nodes
+...           
+...               Akka can create spurious UnreachableMember events, see
+...               https://bugs.opendaylight.org/show_bug.cgi?id=8430
+...               so some keywords contain "tolerance" argument which applies BuiltIn.Wait_Until_Keyword_Succeeds.
+...           
+...               The delay before subsequent ReachableMember is significantly higher than
+...               RPC registration delay documented at
+...               http://docs.opendaylight.org/en/latest/developer-guide/controller.html#rpcs-and-cluster
 Library           Collections
 Resource          ${CURDIR}/../ClusterManagement.robot
 Resource          ${CURDIR}/../MdsalLowlevel.robot
 Library           Collections
 Resource          ${CURDIR}/../ClusterManagement.robot
 Resource          ${CURDIR}/../MdsalLowlevel.robot
+Resource          ${CURDIR}/../ShardStability.robot
 
 *** Variables ***
 ${CONSTANT_PREFIX}    constant-
 
 *** Variables ***
 ${CONSTANT_PREFIX}    constant-
+${CONTEXT}        context
+${BUG_8430_TOLERANCE}    10
 
 *** Keywords ***
 DrbCommons_Init
 
 *** Keywords ***
 DrbCommons_Init
@@ -56,17 +67,47 @@ Unregister_Rpc_And_Update_Possible_Constants
     DrbCommons__Rem_Possible_Constant    ${member_index}
     DrbCommons__Deregister_Index    ${member_index}
 
     DrbCommons__Rem_Possible_Constant    ${member_index}
     DrbCommons__Deregister_Index    ${member_index}
 
+Register_Action_And_Update_Possible_Constants
+    [Arguments]    ${member_index}
+    [Documentation]    Register routed rpc on given node of the cluster.
+    MdsalLowlevel.Register_Bound_Constant    ${member_index}    ${CONTEXT}    ${CONSTANT_PREFIX}${member_index}
+    DrbCommons__Add_Possible_Constant    ${member_index}
+    DrbCommons__Register_Index    ${member_index}
+
+Unregister_Action_And_Update_Possible_Constants
+    [Arguments]    ${member_index}
+    [Documentation]    Unregister routed rpc on given node of the cluster.
+    MdsalLowlevel.Unregister_Bound_Constant    ${member_index}    ${CONTEXT}
+    DrbCommons__Rem_Possible_Constant    ${member_index}
+    DrbCommons__Deregister_Index    ${member_index}
+
 Register_Rpc_On_Nodes
     [Arguments]    ${index_list}
     [Documentation]    Register global rpc on given nodes of the cluster.
 Register_Rpc_On_Nodes
     [Arguments]    ${index_list}
     [Documentation]    Register global rpc on given nodes of the cluster.
-    : FOR    ${index}    IN    @{index_list}
-    \    Register_Rpc_And_Update_Possible_Constants    ${index}
+    FOR    ${index}    IN    @{index_list}
+        Register_Rpc_And_Update_Possible_Constants    ${index}
+    END
 
 Unregister_Rpc_On_Nodes
     [Arguments]    ${index_list}
     [Documentation]    Unregister global rpc on given nodes of the cluster.
 
 Unregister_Rpc_On_Nodes
     [Arguments]    ${index_list}
     [Documentation]    Unregister global rpc on given nodes of the cluster.
-    : FOR    ${index}    IN    @{index_list}
-    \    Unregister_Rpc_And_Update_Possible_Constants    ${index}
+    FOR    ${index}    IN    @{index_list}
+        Unregister_Rpc_And_Update_Possible_Constants    ${index}
+    END
+
+Register_Action_On_Nodes
+    [Arguments]    ${index_list}
+    [Documentation]    Register global rpc on given nodes of the cluster.
+    FOR    ${index}    IN    @{index_list}
+        Register_Action_And_Update_Possible_Constants    ${index}
+    END
+
+Unregister_Action_On_Nodes
+    [Arguments]    ${index_list}
+    [Documentation]    Unregister global rpc on given nodes of the cluster.
+    FOR    ${index}    IN    @{index_list}
+        Unregister_Action_And_Update_Possible_Constants    ${index}
+    END
 
 Verify_Constant_On_Registered_Node
     [Arguments]    ${member_index}
 
 Verify_Constant_On_Registered_Node
     [Arguments]    ${member_index}
@@ -83,30 +124,71 @@ Verify_Constant_On_Unregistered_Node
     Collections.List_Should_Contain_Value    ${possible_constants}    ${constant}
     BuiltIn.Return_From_Keyword    ${constant}
 
     Collections.List_Should_Contain_Value    ${possible_constants}    ${constant}
     BuiltIn.Return_From_Keyword    ${constant}
 
+Verify_Contexted_Constant_On_Registered_Node
+    [Arguments]    ${member_index}
+    [Documentation]    Verify that the rpc response comes from the local node.
+    ${constant} =    MdsalLowlevel.Get_Contexted_Constant    ${member_index}    ${CONTEXT}
+    BuiltIn.Should_Be_Equal_As_Strings    ${CONSTANT_PREFIX}${member_index}    ${constant}
+    BuiltIn.Return_From_Keyword    ${constant}
+
+Verify_Contexted_Constant_On_Unregistered_Node
+    [Arguments]    ${member_index}
+    [Documentation]    Verify that the response comes from other nodes with rpc registered. Verification
+    ...    passes for registered nodes too.
+    ${constant} =    MdsalLowlevel.Get_Contexted_Constant    ${member_index}    ${CONTEXT}
+    Collections.List_Should_Contain_Value    ${possible_constants}    ${constant}
+    BuiltIn.Return_From_Keyword    ${constant}
+
 Verify_Constant_On_Registered_Nodes
     [Arguments]    ${index_list}
     [Documentation]    Verify that the rpc response comes from the local node for every node in the list.
 Verify_Constant_On_Registered_Nodes
     [Arguments]    ${index_list}
     [Documentation]    Verify that the rpc response comes from the local node for every node in the list.
-    : FOR    ${index}    IN    @{index_list}
-    \    Verify_Constant_On_Registered_Node    ${index}
+    FOR    ${index}    IN    @{index_list}
+        Verify_Constant_On_Registered_Node    ${index}
+    END
+
+Verify_Contexted_Constant_On_Registered_Nodes
+    [Arguments]    ${index_list}
+    [Documentation]    Verify that the rpc response comes from the local node for every node in the list.
+    FOR    ${index}    IN    @{index_list}
+        Verify_Contexted_Constant_On_Registered_Node    ${index}
+    END
 
 Verify_Constant_On_Unregistered_Nodes
     [Arguments]    ${index_list}
     [Documentation]    Verify that the rpc response comes from the remote node for every node in the list.
 
 Verify_Constant_On_Unregistered_Nodes
     [Arguments]    ${index_list}
     [Documentation]    Verify that the rpc response comes from the remote node for every node in the list.
-    : FOR    ${index}    IN    @{index_list}
-    \    Verify_Constant_On_Unregistered_Node    ${index}
+    FOR    ${index}    IN    @{index_list}
+        Verify_Constant_On_Unregistered_Node    ${index}
+    END
 
 Verify_Constant_On_Active_Nodes
 
 Verify_Constant_On_Active_Nodes
+    [Arguments]    ${tolerance}=${BUG_8430_TOLERANCE}
+    [Documentation]    Verify that the rpc response comes from the local node for every node in the list.
+    ...    As a workaround for Bug 8430, \${tolerance} can be set as duration (number of seconds) for WUKS.
+    # TODO: Rename most Verify_* keywords to Check_* and use the Verify prefix for the WUKS versions.
+    BuiltIn.Run_Keyword_And_Return_If    ${tolerance}    BuiltIn.Wait_Until_Keyword_Succeeds    ${tolerance}    1s    Verify_Constant_On_Active_Nodes    tolerance=0
+    FOR    ${index}    IN    @{active_indices}
+        BuiltIn.Run_Keyword_If    ${index} in ${registered_indices}    Verify_Constant_On_Registered_Node    ${index}
+        ...    ELSE    Verify_Constant_On_Unregistered_Node    ${index}
+    END
+
+Verify_Contexted_Constant_On_Active_Nodes
+    [Arguments]    ${tolerance}=${BUG_8430_TOLERANCE}
     [Documentation]    Verify that the rpc response comes from the local node for every node in the list.
     [Documentation]    Verify that the rpc response comes from the local node for every node in the list.
-    : FOR    ${index}    IN    @{active_indices}
-    \    BuiltIn.Run_Keyword_If    ${index} in ${registered_indices}    Verify_Constant_On_Registered_Node    ${index}
-    \    ...    ELSE    Verify_Constant_On_Unregistered_Node    ${index}
+    ...    As a workaround for Bug 8430, \${tolerance} can be set as duration (number of seconds) for WUKS.
+    # TODO: Rename most Verify_* keywords to Check_* and use the Verify prefix for the WUKS versions.
+    BuiltIn.Run_Keyword_And_Return_If    ${tolerance}    BuiltIn.Wait_Until_Keyword_Succeeds    ${tolerance}    1s    Verify_Contexted_Constant_On_Active_Nodes    tolerance=0
+    FOR    ${index}    IN    @{active_indices}
+        BuiltIn.Run_Keyword_If    ${index} in ${registered_indices}    Verify_Contexted_Constant_On_Registered_Node    ${index}
+        ...    ELSE    Verify_Contexted_Constant_On_Unregistered_Node    ${index}
+    END
 
 Verify_Expected_Constant_On_Nodes
     [Arguments]    ${index_list}    ${exp_constant}
     [Documentation]    Verify that the rpc response comes only from one node only for every node in the list.
 
 Verify_Expected_Constant_On_Nodes
     [Arguments]    ${index_list}    ${exp_constant}
     [Documentation]    Verify that the rpc response comes only from one node only for every node in the list.
-    : FOR    ${index}    IN    @{index_list}
-    \    ${const_index} =    Get_Constant_Index_From_Node    ${index}
-    \    BuiltIn.Should_Be_Equal_As_Strings    ${exp_constant}    ${CONSTANT_PREFIX}${const_index}
+    FOR    ${index}    IN    @{index_list}
+        ${const_index} =    Get_Constant_Index_From_Node    ${index}
+        BuiltIn.Should_Be_Equal_As_Strings    ${exp_constant}    ${CONSTANT_PREFIX}${const_index}
+    END
 
 Get_Constant_Index_From_Node
     [Arguments]    ${member_index}
 
 Get_Constant_Index_From_Node
     [Arguments]    ${member_index}
@@ -117,11 +199,20 @@ Get_Constant_Index_From_Node
     ${index} =    BuiltIn.Convert_To_Integer    ${index}
     BuiltIn.Return_From_Keyword    ${index}
 
     ${index} =    BuiltIn.Convert_To_Integer    ${index}
     BuiltIn.Return_From_Keyword    ${index}
 
+Get_Contexted_Constant_Index_From_Node
+    [Arguments]    ${member_index}
+    [Documentation]    Ivoke get-contexted-constant rpc on given member index. Returns the index of
+    ...    the node where the constant came from.
+    ${constant} =    MdsalLowlevel.Get_Contexted_Constant    ${member_index}    ${CONTEXT}
+    ${index} =    String.Replace_String    ${constant}    ${CONSTANT_PREFIX}    ${EMPTY}
+    ${index} =    BuiltIn.Convert_To_Integer    ${index}
+    BuiltIn.Return_From_Keyword    ${index}
+
 Isolate_Node
     [Arguments]    ${member_index}
     [Documentation]    Isolate a member and update appropriate suite variables.
     ClusterManagement.Isolate_Member_From_List_Or_All    ${member_index}
 Isolate_Node
     [Arguments]    ${member_index}
     [Documentation]    Isolate a member and update appropriate suite variables.
     ClusterManagement.Isolate_Member_From_List_Or_All    ${member_index}
-    DrbCommons__Upadte_Active_Nodes_List    deactivate_idx=${member_index}
+    DrbCommons__Update_Active_Nodes_List    deactivate_idx=${member_index}
     BuiltIn.Return_From_Keyword_If    ${member_index} not in ${registered_indices}
     DrbCommons__Rem_Possible_Constant    ${member_index}
 
     BuiltIn.Return_From_Keyword_If    ${member_index} not in ${registered_indices}
     DrbCommons__Rem_Possible_Constant    ${member_index}
 
@@ -129,11 +220,12 @@ Rejoin_Node
     [Arguments]    ${member_index}
     [Documentation]    Rejoin a member and update appropriate suite variables.
     ClusterManagement.Rejoin_Member_From_List_Or_All    ${member_index}
     [Arguments]    ${member_index}
     [Documentation]    Rejoin a member and update appropriate suite variables.
     ClusterManagement.Rejoin_Member_From_List_Or_All    ${member_index}
-    DrbCommons__Upadte_Active_Nodes_List    activate_idx=${member_index}
+    BuiltIn.Wait_Until_Keyword_Succeeds    70s    10s    ShardStability.Shards_Stability_Get_Details    ${DEFAULT_SHARD_LIST}
+    DrbCommons__Update_Active_Nodes_List    activate_idx=${member_index}
     BuiltIn.Return_From_Keyword_If    ${member_index} not in ${registered_indices}
     DrbCommons__Add_Possible_Constant    ${member_index}
 
     BuiltIn.Return_From_Keyword_If    ${member_index} not in ${registered_indices}
     DrbCommons__Add_Possible_Constant    ${member_index}
 
-DrbCommons__Upadte_Active_Nodes_List
+DrbCommons__Update_Active_Nodes_List
     [Arguments]    ${activate_idx}=${EMPTY}    ${deactivate_idx}=${EMPTY}
     [Documentation]    Add or remove member index to/from the list of active nodes.
     BuiltIn.Run_Keyword_If    "${activate_idx}" != "${EMPTY}"    Collections.Append_To_List    ${active_indices}    ${activate_idx}
     [Arguments]    ${activate_idx}=${EMPTY}    ${deactivate_idx}=${EMPTY}
     [Documentation]    Add or remove member index to/from the list of active nodes.
     BuiltIn.Run_Keyword_If    "${activate_idx}" != "${EMPTY}"    Collections.Append_To_List    ${active_indices}    ${activate_idx}