Unsubscribe_Dtcl
[Arguments] ${member_index}
- [Documentation] Unsubscribe a listener from the data changes. Invoke unsubscribe-dtcl rpc.
+ [Documentation] Invoke unsubscribe-dtcl rpc, return copy-matches field as boolean.
${session} = ClusterManagement.Resolve_Http_Session_For_Member member_index=${member_index}
${text} = TemplatedRequests.Post_As_Xml_Templated ${UNSUBSCRIBE_DTCL_DIR} session=${session}
- ${xml} = XML.Parse_Xml ${text}
- ${matches} = XML.Get_Element_Text ${xml} xpath=copy-matches
- ${matches} = BuiltIn.Convert_To_Boolean ${matches}
- BuiltIn.Return_From_Keyword ${matches}
+ BuiltIn.Run_Keyword_And_Return MdsalLowLevel__Parse_Matches ${text}
+
+Unsubscribe_Dtcl_No_Tx
+ [Arguments] ${member_index}
+ [Documentation] Unsubscribe a listener from the data changes. Expect success no notifications received. Return boolean status.
+ ${session} = ClusterManagement.Resolve_Http_Session_For_Member member_index=${member_index}
+ ${text} = TemplatedRequests.Post_As_Xml_Templated ${UNSUBSCRIBE_DTCL_DIR} session=${session} additional_allowed_status_codes=${INTERNAL_SERVER_ERROR}
+ BuiltIn.Run_Keyword_And_Return MdsalLowLevel__Parse_Maybe_No_Tx ${text}
Subscribe_Ddtl
[Arguments] ${member_index}
Unsubscribe_Ddtl
[Arguments] ${member_index}
- [Documentation] Unsubscribe DOMDataTreeListener from listening to the data changes.
+ [Documentation] Invoke unsubscribe-ddtl rpc, return copy-matches field as boolean.
${session} = ClusterManagement.Resolve_Http_Session_For_Member member_index=${member_index}
${text} = TemplatedRequests.Post_As_Xml_Templated ${UNSUBSCRIBE_DDTL_DIR} session=${session}
+ BuiltIn.Run_Keyword_And_Return MdsalLowLevel__Parse_Matches ${text}
+
+Unsubscribe_Ddtl_No_Tx
+ [Arguments] ${member_index}
+ [Documentation] Unsubscribe a listener from the data changes. Expect success no notifications received. Return boolean status.
+ ${session} = ClusterManagement.Resolve_Http_Session_For_Member member_index=${member_index}
+ ${text} = TemplatedRequests.Post_As_Xml_Templated ${UNSUBSCRIBE_DDTL_DIR} session=${session} additional_allowed_status_codes=${INTERNAL_SERVER_ERROR}
+ BuiltIn.Run_Keyword_And_Return MdsalLowLevel__Parse_Maybe_No_Tx ${text}
+
+MdsalLowLevel__Parse_Matches
+ [Arguments] ${text}
+ [Documentation] Interpret the \${text} as XML response to an unsubscribe call and return copy-matches as boolean.
${xml} = XML.Parse_Xml ${text}
${matches} = XML.Get_Element_Text ${xml} xpath=copy-matches
${matches} = BuiltIn.Convert_To_Boolean ${matches}
BuiltIn.Return_From_Keyword ${matches}
+MdsalLowLevel__Parse_Maybe_No_Tx
+ [Arguments] ${text}
+ [Documentation] Attempt to parse the \${text} as successful unsubscribe. If that fails, extract the error message and expect no notifications.
+ ${status} ${message} = BuiltIn.Run_Keyword_And_Ignore_Error MdsalLowLevel__Parse_Matches ${text}
+ BuiltIn.Return_From_Keyword_If "${status}" == "PASS" ${message}
+ ${xml} = XML.Parse_Xml ${text}
+ ${message} = XML.Get_Element_Text ${xml} xpath=error/error-message
+ ${status} ${message} = BuiltIn.Run_Keyword_And_Ignore_Error BuiltIn.Should_Contain ${message} listener has not received
+ BuiltIn.Return_From_Keyword_If "${status}" == "PASS" ${TRUE}
+ [Return] ${FALSE}
+
Start_Publish_Notifications
[Arguments] ${member_index} ${gid} ${seconds} ${notif_per_sec}
[Documentation] Start publishing notifications by invoking publish-notifications rpc.
${leader} ${follower_list} = ClusterManagement.Get_Leader_And_Followers_For_Shard shard_name=${SHARD_NAME} shard_type=${SHARD_TYPE} member_index_list=${all_indices} verify_restconf=False
MdsalLowlevel.Subscribe_Dtcl ${leader}
BuiltIn.Sleep 5s
- ${copy_matches} = MdsalLowlevel.Unsubscribe_Dtcl ${leader}
+ ${copy_matches} = MdsalLowlevel.Unsubscribe_Dtcl_No_Tx ${leader}
BuiltIn.Should_Be_True ${copy_matches}
Subscribe_Listener_To_Follower
${follower_idx} = Collections.Get_From_List ${follower_list} ${0}
MdsalLowlevel.Subscribe_Dtcl ${follower_idx}
BuiltIn.Sleep 5s
- ${copy_matches} = MdsalLowlevel.Unsubscribe_Dtcl ${follower_idx}
+ ${copy_matches} = MdsalLowlevel.Unsubscribe_Dtcl_No_Tx ${follower_idx}
BuiltIn.Should_Be_True ${copy_matches}
Make_Leader_Local
${all_indices} = ClusterManagement.List_All_Indices
${old_leader} ${follower_list} = ClusterManagement.Get_Leader_And_Followers_For_Shard shard_name=${shard_name} shard_type=${shard_type} member_index_list=${all_indices} verify_restconf=False
ClusterAdmin.Remove_Shard_Replica ${old_leader} ${shard_name} member-${old_leader} ${shard_type}
- BuiltIn.Wait_Until_Keyword_Succeeds 60s 5s DdbCommons.Verify_Shard_Replica_Removed ${old_leader} ${shard_name} ${shard_type}
+ BuiltIn.Wait_Until_Keyword_Succeeds 60s 5s DdbCommons.Verify_Shard_Replica_Not_Present ${old_leader} ${shard_name} ${shard_type}
${actual_leader} ${actual_follower_list} = BuiltIn.Wait_Until_Keyword_Succeeds 60s 5s ClusterManagement.Get_Leader_And_Followers_For_Shard shard_name=${shard_name}
... verify_restconf=False shard_type=${shard_type} member_index_list=${follower_list}
BuiltIn.Should_Not_Be_Equal_As_Numbers ${old_leader} ${actual_leader}
${leader} ${follower_list} = ClusterManagement.Get_Leader_And_Followers_For_Shard shard_name=${shard_name} shard_type=${shard_type} member_index_list=${all_indices} verify_restconf=False
${follower1} = Collections.Get_From_List ${follower_list} ${0}
ClusterAdmin.Remove_Shard_Replica ${follower1} ${shard_name} member-${follower1} ${shard_type}
- BuiltIn.Wait_Until_Keyword_Succeeds 60s 5s DdbCommons.Verify_Shard_Replica_Removed ${follower1} ${shard_name} ${shard_type}
+ BuiltIn.Wait_Until_Keyword_Succeeds 60s 5s DdbCommons.Verify_Shard_Replica_Not_Present ${follower1} ${shard_name} ${shard_type}
${new_indices_list} = ClusterManagement.List_Indices_Minus_Member ${follower1}
ClusterManagement.Verify_Shard_Leader_Elected ${shard_name} ${shard_type} ${False} ${leader} member_index_list=${new_indices_list}
BuiltIn.Wait_Until_Keyword_Succeeds 60s 5s ClusterAdmin.Add_Shard_Replica ${follower1} ${shard_name} ${shard_type}
${leader} ${follower_list} = ClusterManagement.Get_Leader_And_Followers_For_Shard shard_name=${SHARD_NAME} shard_type=${SHARD_TYPE} member_index_list=${all_indices} verify_restconf=False
MdsalLowlevel.Subscribe_Ddtl ${leader}
BuiltIn.Sleep 5s
- ${copy_matches} = MdsalLowlevel.Unsubscribe_Ddtl ${leader}
+ ${copy_matches} = MdsalLowlevel.Unsubscribe_Ddtl_No_Tx ${leader}
BuiltIn.Should_Be_True ${copy_matches}
Subscribe_Listener_To_Follower
${follower_idx} = Collections.Get_From_List ${follower_list} ${0}
MdsalLowlevel.Subscribe_Ddtl ${follower_idx}
BuiltIn.Sleep 5s
- ${copy_matches} = MdsalLowlevel.Unsubscribe_Ddtl ${follower_idx}
+ ${copy_matches} = MdsalLowlevel.Unsubscribe_Ddtl_No_Tx ${follower_idx}
BuiltIn.Should_Be_True ${copy_matches}
Become_Prefix_Leader
${all_indices} = ClusterManagement.List_All_Indices
${old_leader} ${follower_list} = ClusterManagement.Get_Leader_And_Followers_For_Shard shard_name=${shard_name}!! shard_type=${shard_type} member_index_list=${all_indices} verify_restconf=False
ClusterAdmin.Remove_Prefix_Shard_Replica ${old_leader} ${shard_name} member-${old_leader} ${shard_type}
- BuiltIn.Wait_Until_Keyword_Succeeds 60s 5s Verify_Shard_Replica_Removed ${old_leader} ${shard_name}!! ${shard_type}
+ BuiltIn.Wait_Until_Keyword_Succeeds 60s 5s Verify_Shard_Replica_Not_Present ${old_leader} ${shard_name}!! ${shard_type}
${actual_leader} ${actual_follower_list} = BuiltIn.Wait_Until_Keyword_Succeeds 60s 5s ClusterManagement.Get_Leader_And_Followers_For_Shard shard_name=${shard_name}!!
... verify_restconf=False shard_type=${shard_type} member_index_list=${follower_list}
BuiltIn.Should_Not_Be_Equal_As_Numbers ${old_leader} ${actual_leader}
${leader} ${follower_list} = ClusterManagement.Get_Leader_And_Followers_For_Shard shard_name=${shard_name}!! shard_type=${shard_type} member_index_list=${all_indices} verify_restconf=False
${follower1} = Collections.Get_From_List ${follower_list} ${0}
ClusterAdmin.Remove_Prefix_Shard_Replica ${follower1} ${shard_name} member-${follower1} ${shard_type}
- BuiltIn.Wait_Until_Keyword_Succeeds 60s 5s DdbCommons.Verify_Shard_Replica_Removed ${follower1} ${shard_name}!! ${shard_type}
+ BuiltIn.Wait_Until_Keyword_Succeeds 60s 5s DdbCommons.Verify_Shard_Replica_Not_Present ${follower1} ${shard_name}!! ${shard_type}
${new_indices_list} = ClusterManagement.List_Indices_Minus_Member ${follower1}
ClusterManagement.Verify_Shard_Leader_Elected ${shard_name}!! ${shard_type} ${False} ${leader} member_index_list=${new_indices_list}
BuiltIn.Wait_Until_Keyword_Succeeds 60s 5s ClusterAdmin.Add_Prefix_Shard_Replica ${follower1} ${shard_name} ${shard_type}