5c013af78d1dbf18f84b1f81604f491fc5f0f972
[integration/test.git] / csit / libraries / controller / DdbCommons.robot
1 *** Settings ***
2 Documentation     DOMDataBroker testing: Common keywords
3 ...
4 ...               Copyright (c) 2017 Cisco Systems, Inc. and others. All rights reserved.
5 ...
6 ...               This program and the accompanying materials are made available under the
7 ...               terms of the Eclipse Public License v1.0 which accompanies this distribution,
8 ...               and is available at http://www.eclipse.org/legal/epl-v10.html
9 ...
10 ...               This resource file implements various test cases templates.
11 ...               FIXME: add a link to a document (when published) where the scenarios are defined
12 Library           ${CURDIR}/../MdsalLowlevelPy.py
13 Resource          ${CURDIR}/../ClusterAdmin.robot
14 Resource          ${CURDIR}/../ClusterManagement.robot
15 Resource          ${CURDIR}/../MdsalLowlevel.robot
16 Resource          ${CURDIR}/../TemplatedRequests.robot
17 Resource          ${CURDIR}/../WaitForFailure.robot
18
19 *** Variables ***
20 ${SHARD_NAME}     default
21 ${SHARD_TYPE}     config
22 ${TRANSACTION_RATE_1K}    ${1000}
23 ${DURATION_30S}    ${30}
24 ${DURATION_10S}    ${10}
25 ${ID_PREFIX}      prefix-
26 ${TRANSACTION_TIMEOUT}    ${30}
27 ${TRANSACTION_TIMEOUT_2X}    ${2*${TRANSACTION_TIMEOUT}}
28 ${SIMPLE_TX}      ${False}
29 ${CHAINED_TX}     ${True}
30 ${HARD_TIMEOUT}    ${60}
31 @{TRANSACTION_FAILED}    ${500}
32 ${PREF_BASED_SHARD}    id-ints
33 ${TEST_LOG_LEVEL}    info
34 @{TEST_LOG_COMPONENTS}    org.opendaylight.controller.cluster.sharding    org.opendaylight.controller.cluster.datastore
35
36 *** Keywords ***
37 Explicit_Leader_Movement_Test_Templ
38     [Arguments]    ${leader_from}    ${leader_to}    ${shard_name}=${SHARD_NAME}    ${shard_type}=${SHARD_TYPE}
39     [Documentation]    Implements explicit leader movement test scenario.
40     ${idx_from}    ${idx_to}    ${idx_trans} =    Get_Node_Indexes_For_The_ELM_Test    ${leader_from}    ${leader_to}    ${shard_name}
41     ...    ${shard_type}
42     ${ip_trans_as_list} =    BuiltIn.Create_List    ${ODL_SYSTEM_${idx_trans}_IP}
43     ${idx_trans_as_list} =    BuiltIn.Create_List    ${idx_trans}
44     MdsalLowlevelPy.Start_Write_Transactions_On_Nodes    ${ip_trans_as_list}    ${idx_trans_as_list}    ${ID_PREFIX}    ${DURATION_30S}    ${TRANSACTION_RATE_1K}    chained_flag=${False}
45     ClusterAdmin.Make_Leader_Local    ${idx_to}    ${shard_name}    ${shard_type}
46     ${new_leader}    ${new_followers} =    BuiltIn.Wait_Until_Keyword_Succeeds    10s    1s    ClusterManagement.Verify_Shard_Leader_Elected    ${shard_name}
47     ...    ${shard_type}    ${True}    ${idx_from}
48     BuiltIn.Should_Be_Equal    ${idx_to}    ${new_leader}
49     ${resp_list} =    MdsalLowlevelPy.Wait_For_Transactions
50     TemplatedRequests.Check_Status_Code    @{resp_list}[0]
51
52 Explicit_Leader_Movement_PrefBasedShard_Test_Templ
53     [Arguments]    ${leader_from}    ${leader_to}    ${shard_name}=${PREF_BASED_SHARD}    ${shard_type}=${SHARD_TYPE}
54     [Documentation]    Implements explicit leader movement test scenario.
55     ${idx_from}    ${idx_to}    ${idx_trans} =    Get_Node_Indexes_For_The_ELM_Test    ${leader_from}    ${leader_to}    ${shard_name}!!
56     ...    ${shard_type}
57     ${ip_trans_as_list} =    BuiltIn.Create_List    ${ODL_SYSTEM_${idx_trans}_IP}
58     ${idx_trans_as_list} =    BuiltIn.Create_List    ${idx_trans}
59     MdsalLowlevelPy.Start_Produce_Transactions_On_Nodes    ${ip_trans_as_list}    ${idx_trans_as_list}    ${ID_PREFIX}    ${DURATION_30S}    ${TRANSACTION_RATE_1K}
60     MdsalLowlevel.Become_Prefix_Leader    ${idx_to}    ${shard_name}    ${ID_PREFIX}
61     ${new_leader}    ${new_followers} =    BuiltIn.Wait_Until_Keyword_Succeeds    10s    1s    ClusterManagement.Verify_Shard_Leader_Elected    ${shard_name}!!
62     ...    ${shard_type}    ${True}    ${idx_from}
63     BuiltIn.Should_Be_Equal    ${idx_to}    ${new_leader}
64     ${resp_list} =    MdsalLowlevelPy.Wait_For_Transactions
65     TemplatedRequests.Check_Status_Code    @{resp_list}[0]
66
67 Get_Node_Indexes_For_The_ELM_Test
68     [Arguments]    ${leader_from}    ${leader_to}    ${shard_name}    ${shard_type}
69     [Documentation]    Return indexes for explicit leader movement test case, indexes of present to next leader node and index where transaction
70     ...    producer should be deployed.
71     ${leader}    ${follower_list} =    ClusterManagement.Get_Leader_And_Followers_For_Shard    shard_name=${shard_name}    shard_type=${shard_type}
72     ${idx_from} =    BuiltIn.Set_Variable    ${leader}
73     ${idx_to} =    BuiltIn.Set_Variable    @{follower_list}[0]
74     ${idx_trans} =    BuiltIn.Set_Variable_If    "${leader_from}" == "remote" and "${leader_to}" == "remote"    @{follower_list}[1]    "${leader_from}" == "local"    ${leader}    "${leader_to}" == "local"
75     ...    @{follower_list}[0]
76     BuiltIn.Return_From_Keyword    ${idx_from}    ${idx_to}    ${idx_trans}
77
78 Clean_Leader_Shutdown_Test_Templ
79     [Arguments]    ${leader_location}    ${shard_name}=${SHARD_NAME}    ${shard_type}=${SHARD_TYPE}
80     [Documentation]    Implements clean leader shutdown test scenario.
81     ${removed} =    BuiltIn.Set_Variable    ${False}
82     ${producer_idx}    ${actual_leader}    ${follower_list} =    Get_Node_Indexes_For_Clean_Leader_Shutdown_Test    ${leader_location}    ${shard_name}    ${shard_type}
83     ${producer_ip_as_list} =    BuiltIn.Create_List    ${ODL_SYSTEM_${producer_idx}_IP}
84     ${producer_idx_as_list} =    BuiltIn.Create_List    ${producer_idx}
85     MdsalLowlevelPy.Start_Write_Transactions_On_Nodes    ${producer_ip_as_list}    ${producer_idx_as_list}    ${ID_PREFIX}    ${DURATION_30S}    ${TRANSACTION_RATE_1K}    chained_flag=${False}
86     ClusterAdmin.Remove_Shard_Replica    ${actual_leader}    ${shard_name}    member-${actual_leader}    ${shard_type}
87     ${removed} =    BuiltIn.Set_Variable    ${True}
88     ${resp_list} =    MdsalLowlevelPy.Wait_For_Transactions
89     TemplatedRequests.Check_Status_Code    @{resp_list}[0]
90     [Teardown]    ClusterAdmin.Add_Shard_Replica    ${actual_leader}    ${shard_name}    ${shard_type}
91
92 Clean_Leader_Shutdown_PrefBasedShard_Test_Templ
93     [Arguments]    ${leader_location}    ${shard_name}=${PREF_BASED_SHARD}    ${shard_type}=${SHARD_TYPE}
94     [Documentation]    Implements clean leader shutdown test scenario.
95     ${producer_idx}    ${actual_leader}    ${follower_list} =    Get_Node_Indexes_For_Clean_Leader_Shutdown_Test    ${leader_location}    ${shard_name}!!    ${shard_type}
96     ${producer_ip_as_list} =    BuiltIn.Create_List    ${ODL_SYSTEM_${producer_idx}_IP}
97     ${producer_idx_as_list} =    BuiltIn.Create_List    ${producer_idx}
98     MdsalLowlevelPy.Start_Produce_Transactions_On_Nodes    ${producer_ip_as_list}    ${producer_idx_as_list}    ${ID_PREFIX}    ${DURATION_30S}    ${TRANSACTION_RATE_1K}
99     ClusterAdmin.Remove_Prefix_Shard_Replica    ${actual_leader}    ${shard_name}    member-${actual_leader}    ${shard_type}
100     BuiltIn.Wait_Until_Keyword_Succeeds    15s    2s    ClusterManagement.Get_Leader_And_Followers_For_Shard    shard_name=${shard_name}!!    shard_type=${shard_type}    member_index_list=${follower_list}
101     BuiltIn.Run_Keyword_And_Ignore_Error    ClusterManagement.Get_Raft_State_Of_Shard_At_Member    shard_name=${shard_name}!!    shard_type=${shard_type}    member_index=${actual_leader}
102     WaitForFailure.Confirm_Keyword_Fails_Within_Timeout    10s    2s    ClusterManagement.Get_Raft_State_Of_Shard_At_Member    shard_name=${shard_name}!!    shard_type=${shard_type}    member_index=${actual_leader}
103     ${resp_list} =    MdsalLowlevelPy.Wait_For_Transactions
104     TemplatedRequests.Check_Status_Code    @{resp_list}[0]
105     [Teardown]    ClusterAdmin.Add_Prefix_Shard_Replica    ${actual_leader}    ${shard_name}    ${shard_type}
106
107 Get_Node_Indexes_For_Clean_Leader_Shutdown_Test
108     [Arguments]    ${leader_location}    ${shard_name}    ${shard_type}
109     [Documentation]    Return indexes for clean leader shudown test case, index where transaction producer shoudl be deployed and a shard leader index.
110     ${leader}    ${follower_list} =    ClusterManagement.Get_Leader_And_Followers_For_Shard    shard_name=${shard_name}    shard_type=${shard_type}
111     ${follower_list_leangth} =    BuiltIn.Evaluate    ${NUM_ODL_SYSTEM}-1
112     BuiltIn.Length_Should_Be    ${follower_list}    ${follower_list_leangth}
113     ${producer_idx} =    BuiltIn.Set_Variable_If    "${leader_location}" == "local"    ${leader}    @{follower_list}[0]
114     BuiltIn.Return_From_Keyword    ${producer_idx}    ${leader}    ${follower_list}
115
116 Leader_Isolation_Test_Templ
117     [Arguments]    ${heal_timeout}    ${shard_name}=${SHARD_NAME}    ${shard_type}=${SHARD_TYPE}
118     [Documentation]    Implements leader isolation test scenario.
119     ${producing_transactions_time} =    BuiltIn.Set_Variable    ${${heal_timeout}+60}
120     ${all_indices} =    ClusterManagement.List_All_Indices
121     ${leader}    ${follower_list} =    ClusterManagement.Get_Leader_And_Followers_For_Shard    shard_name=${shard_name}    shard_type=${shard_type}    member_index_list=${all_indices}
122     ${all_ip_list} =    ClusterManagement.Resolve_IP_Address_For_Members    ${all_indices}
123     MdsalLowlevelPy.Start_Write_Transactions_On_Nodes    ${all_ip_list}    ${all_indices}    ${ID_PREFIX}    ${producing_transactions_time}    ${TRANSACTION_RATE_1K}    chained_flag=${SIMPLE_TX}
124     ${date_start} =    DateTime.Get_Current_Date
125     ${date_end} =    DateTime.Add_Time_To_Date    ${date_start}    ${producing_transactions_time}
126     ClusterManagement.Isolate_Member_From_List_Or_All    ${leader}
127     BuiltIn.Wait_Until_Keyword_Succeeds    10s    2s    ClusterManagement.Verify_Shard_Leader_Elected    ${shard_name}    ${shard_type}    ${True}
128     ...    ${leader}    member_index_list=${follower_list}
129     BuiltIn.Sleep    ${heal_timeout}
130     ClusterManagement.Rejoin_Member_From_List_Or_All    ${leader}
131     BuiltIn.Wait_Until_Keyword_Succeeds    20s    2s    ClusterManagement.Get_Leader_And_Followers_For_Shard    ${shard_name}    ${shard_type}
132     ${time_to_finish} =    Get_Seconds_To_Time    ${date_end}
133     BuiltIn.Run_Keyword_If    ${heal_timeout} < ${TRANSACTION_TIMEOUT}    Leader_Isolation_Heal_Within_Tt
134     ...    ELSE    Module_Leader_Isolation_Heal_Default    ${leader}    ${time_to_finish}
135
136 Leader_Isolation_PrefBasedShard_Test_Templ
137     [Arguments]    ${heal_timeout}    ${shard_name}=${PREF_BASED_SHARD}    ${shard_type}=${SHARD_TYPE}
138     [Documentation]    Implements leader isolation test scenario.
139     ${producing_transactions_time} =    BuiltIn.Set_Variable    ${${heal_timeout}+60}
140     ${all_indices} =    ClusterManagement.List_All_Indices
141     ${leader}    ${follower_list} =    ClusterManagement.Get_Leader_And_Followers_For_Shard    shard_name=${shard_name}!!    shard_type=${shard_type}    member_index_list=${all_indices}
142     ${all_ip_list} =    ClusterManagement.Resolve_IP_Address_For_Members    ${all_indices}
143     MdsalLowlevelPy.Start_Produce_Transactions_On_Nodes    ${all_ip_list}    ${all_indices}    ${ID_PREFIX}    ${producing_transactions_time}    ${TRANSACTION_RATE_1K}
144     ${date_start} =    DateTime.Get_Current_Date
145     ${date_end} =    DateTime.Add_Time_To_Date    ${date_start}    ${producing_transactions_time}
146     ClusterManagement.Isolate_Member_From_List_Or_All    ${leader}
147     BuiltIn.Wait_Until_Keyword_Succeeds    10s    2s    ClusterManagement.Verify_Shard_Leader_Elected    ${shard_name}!!    ${shard_type}    ${True}
148     ...    ${leader}    member_index_list=${follower_list}
149     BuiltIn.Sleep    ${heal_timeout}
150     ClusterManagement.Rejoin_Member_From_List_Or_All    ${leader}
151     BuiltIn.Wait_Until_Keyword_Succeeds    20s    2s    ClusterManagement.Get_Leader_And_Followers_For_Shard    ${shard_name}!!    ${shard_type}
152     ${time_to_finish} =    Get_Seconds_To_Time    ${date_end}
153     BuiltIn.Run_Keyword_If    ${heal_timeout} < ${TRANSACTION_TIMEOUT}    Leader_Isolation_Heal_Within_Tt
154     ...    ELSE    Prefix_Leader_Isolation_Heal_Default    ${leader}    ${time_to_finish}
155
156 Leader_Isolation_Heal_Within_Tt
157     [Documentation]    The leader isolation test case end if the heal happens within transaction timeout. All write transaction
158     ...    producers shoudl finish without error.
159     ${resp_list} =    MdsalLowlevelPy.Wait_For_Transactions
160     : FOR    ${resp}    IN    @{resp_list}
161     \    TemplatedRequests.Check_Status_Code    ${resp}
162
163 Module_Leader_Isolation_Heal_Default
164     [Arguments]    ${isolated_node}    ${time_to_finish}
165     [Documentation]    The leader isolation test case end. The transaction producer on isolated node should fail and should be restarted.
166     Then all write transaction producers should finish without error.
167     ${resp} =    MdsalLowlevelPy.Get_Next_Transactions_Response
168     BuiltIn.Log    ${resp}
169     # TODO: check on response status code
170     ${restart_producer_node_idx_as_list}    BuiltIn.Create_List    ${isolated_node}
171     ${restart_producer_node_ip} =    ClusterManagement.Resolve_IP_Address_For_Member    ${isolated_node}
172     ${restart_producer_node_ip_as_list}    BuiltIn.Create_List    ${restart_producer_node_ip}
173     MdsalLowlevelPy.Start_Write_Transactions_On_Nodes    ${restart_producer_node_ip_as_list}    ${restart_producer_node_idx_as_list}    ${ID_PREFIX}    ${time_to_finish}    ${TRANSACTION_RATE_1K}    chained_flag=${SIMPLE_TX}
174     ${resp_list} =    MdsalLowlevelPy.Wait_For_Transactions
175     : FOR    ${resp}    IN    @{resp_list}
176     \    TemplatedRequests.Check_Status_Code    ${resp}
177
178 Prefix_Leader_Isolation_Heal_Default
179     [Arguments]    ${isolated_node}    ${time_to_finish}
180     [Documentation]    The leader isolation test case end. The transaction producer on isolated node shoudl fail and should be restarted.
181     Then all write transaction producers shoudl finish without error.
182     ${resp} =    MdsalLowlevelPy.Get_Next_Transactions_Response
183     BuiltIn.Log    ${resp}
184     # TODO: check on response status code
185     ${restart_producer_node_idx_as_list}    BuiltIn.Create_List    ${isolated_node}
186     ${restart_producer_node_ip} =    ClusterManagement.Resolve_IP_Address_For_Member    ${isolated_node}
187     ${restart_producer_node_ip_as_list}    BuiltIn.Create_List    ${restart_producer_node_ip}
188     MdsalLowlevelPy.Start_Produce_Transactions_On_Nodes    ${restart_producer_node_ip_as_list}    ${restart_producer_node_idx_as_list}    ${ID_PREFIX}    ${time_to_finish}    ${TRANSACTION_RATE_1K}
189     ${resp_list} =    MdsalLowlevelPy.Wait_For_Transactions
190     : FOR    ${resp}    IN    @{resp_list}
191     \    TemplatedRequests.Check_Status_Code    ${resp}
192
193 Client_Isolation_Test_Templ
194     [Arguments]    ${listener_node_role}    ${trans_chain_flag}    ${shard_name}=${SHARD_NAME}    ${shard_type}=${SHARD_TYPE}
195     [Documentation]    Implements client isolation test scenario.
196     ${all_indices} =    ClusterManagement.List_All_Indices
197     ${leader}    ${follower_list} =    ClusterManagement.Get_Leader_And_Followers_For_Shard    shard_name=${shard_name}    shard_type=${shard_type}    member_index_list=${all_indices}
198     ${follower1} =    Collections.Get_From_List    ${follower_list}    ${0}
199     ${client_node_dst} =    BuiltIn.Set_Variable_If    "${listener_node_role}" == "leader"    ${leader}    ${follower1}
200     ${client_node_ip} =    ClusterManagement.Resolve_IP_Address_For_Member    ${client_node_dst}
201     ${client_node_ip_as_list}    BuiltIn.Create_List    ${client_node_ip}
202     ${client_node_idx_as_list}    BuiltIn.Create_List    ${client_node_dst}
203     MdsalLowlevelPy.Start_Write_Transactions_On_Nodes    ${client_node_ip_as_list}    ${client_node_idx_as_list}    ${ID_PREFIX}    ${DURATION_30S}    ${TRANSACTION_RATE_1K}    chained_flag=${trans_chain_flag}
204     ${start_date}    DateTime.Get_Current_Date
205     ${timeout_date} =    DateTime.Add_Time_To_Date    ${start_date}    ${TRANSACTION_TIMEOUT}
206     ${abort_date} =    DateTime.Add_Time_To_Date    ${start_date}    ${HARD_TIMEOUT}
207     ClusterManagement.Isolate_Member_From_List_Or_All    ${client_node_dst}
208     WaitForFailure.Verify_Keyword_Does_Not_Fail_Within_Timeout    ${TRANSACTION_TIMEOUT}    1s    Ongoing_Transactions_Not_Failed_Yet
209     WaitForFailure.Confirm_Keyword_Fails_Within_Timeout    3s    1s    Ongoing_Transactions_Failed
210     ${abort_time}    Get_Seconds_To_Time    ${abort_date}
211     WaitForFailure.Verify_Keyword_Does_Not_Fail_Within_Timeout    ${abort_time}    1s    Verify_Client_Aborted    ${False}
212     WaitForFailure.Confirm_Keyword_Fails_Within_Timeout    3s    1s    Verify_Client_Aborted    ${True}
213     [Teardown]    BuiltIn.Run Keywords    ClusterManagement.Rejoin_Member_From_List_Or_All    ${client_node_dst}
214     ...    AND    MdsalLowlevelPy.Wait_For_Transactions
215
216 Client_Isolation_PrefBasedShard_Test_Templ
217     [Arguments]    ${listener_node_role}    ${trans_chain_flag}    ${shard_name}=${PREF_BASED_SHARD}    ${shard_type}=${SHARD_TYPE}
218     [Documentation]    Implements client isolation test scenario.
219     ${all_indices} =    ClusterManagement.List_All_Indices
220     ${leader}    ${follower_list} =    ClusterManagement.Get_Leader_And_Followers_For_Shard    shard_name=${shard_name}    shard_type=${shard_type}    member_index_list=${all_indices}
221     ${follower1} =    Collections.Get_From_List    ${follower_list}    ${0}
222     ${client_node_dst} =    BuiltIn.Set_Variable_If    "${listener_node_role}" == "leader"    ${leader}    ${follower1}
223     ${client_node_ip} =    ClusterManagement.Resolve_IP_Address_For_Member    ${client_node_dst}
224     ${client_node_ip_as_list}    BuiltIn.Create_List    ${client_node_ip}
225     ${client_node_idx_as_list}    BuiltIn.Create_List    ${client_node_dst}
226     MdsalLowlevelPy.Start_Produce_Transactions_On_Nodes    ${client_node_ip_as_list}    ${client_node_idx_as_list}    ${ID_PREFIX}    ${DURATION_30S}    ${TRANSACTION_RATE_1K}
227     ${start_date}    DateTime.Get_Current_Date
228     ${timeout_date} =    DateTime.Add_Time_To_Date    ${start_date}    ${TRANSACTION_TIMEOUT}
229     ${abort_date} =    DateTime.Add_Time_To_Date    ${start_date}    ${HARD_TIMEOUT}
230     ClusterManagement.Isolate_Member_From_List_Or_All    ${client_node_dst}
231     WaitForFailure.Verify_Keyword_Does_Not_Fail_Within_Timeout    ${TRANSACTION_TIMEOUT}    1s    Ongoing_Transactions_Not_Failed_Yet
232     WaitForFailure.Confirm_Keyword_Fails_Within_Timeout    3s    1s    Ongoing_Transactions_Failed
233     ${abort_time}    Get_Seconds_To_Time    ${abort_date}
234     WaitForFailure.Verify_Keyword_Does_Not_Fail_Within_Timeout    ${abort_time}    1s    Verify_Client_Aborted    ${False}
235     WaitForFailure.Confirm_Keyword_Fails_Within_Timeout    3s    1s    Verify_Client_Aborted    ${True}
236     [Teardown]    BuiltIn.Run Keywords    ClusterManagement.Rejoin_Member_From_List_Or_All    ${client_node_dst}
237     ...    AND    MdsalLowlevelPy.Wait_For_Transactions
238
239 Ongoing_Transactions_Not_Failed_Yet
240     [Documentation]    Verify that no write-transaction rpc finished, means they are still running.
241     ${resp} =    MdsalLowlevelPy.Get_Next_Transactions_Response
242     BuiltIn.Should_Be_Equal    ${None}    ${resp}    ${resp} not expected.
243
244 Ongoing_Transactions_Failed
245     [Documentation]    Verify if write-transaction failed.
246     ${resp} =    MdsalLowlevelPy.Get_Next_Transactions_Response
247     Check_Status_Code    ${resp}    explicit_status_codes=${TRANSACTION_FAILED}
248
249 Get_Seconds_To_Time
250     [Arguments]    ${date_in_future}
251     [Documentation]    Return number of seconds remaining to ${date_in_future}.
252     ${date_now} =    DateTime.Get_Current_Date
253     ${duration} =    DateTime.Subtract_Date_From_Date    ${date_in_future}    ${date_now}
254     BuiltIn.Run_Keyword_And_Return    BuiltIn.Convert_To_Integer    ${duration}
255
256 Remote_Listener_Test_Templ
257     [Arguments]    ${listener_node_role}    ${shard_name}=${SHARD_NAME}    ${shard_type}=${SHARD_TYPE}
258     [Documentation]    Implements remote listener test scenario.
259     ${all_indices} =    ClusterManagement.List_All_Indices
260     ${leader}    ${follower_list} =    ClusterManagement.Get_Leader_And_Followers_For_Shard    shard_name=${shard_name}    shard_type=${shard_type}    member_index_list=${all_indices}
261     ${follower1} =    Collections.Get_From_List    ${follower_list}    ${0}
262     ${follower2} =    Collections.Get_From_List    ${follower_list}    ${1}
263     ${listener_node_dst} =    BuiltIn.Set_Variable_If    "${listener_node_role}" == "leader"    ${leader}    ${follower1}
264     MdsalLowlevel.Subscribe_Dtcl    ${listener_node_dst}
265     ${all_ip_list} =    ClusterManagement.Resolve_IP_Address_For_Members    ${all_indices}
266     MdsalLowlevelPy.Start_Write_Transactions_On_Nodes    ${all_ip_list}    ${all_indices}    ${ID_PREFIX}    ${DURATION_10S}    ${TRANSACTION_RATE_1K}    chained_flag=${SIMPLE_TX}
267     ClusterAdmin.Make_Leader_Local    ${follower1}    ${shard_name}    ${shard_type}
268     ${resp_list} =    MdsalLowlevelPy.Wait_For_Transactions
269     : FOR    ${resp}    IN    @{resp_list}
270     \    TemplatedRequests.Check_Status_Code    ${resp}
271     [Teardown]    MdsalLowlevel.Unsubscribe_Dtcl    ${listener_node_dst}
272
273 Remote_Listener_PrefBasedShard_Test_Templ
274     [Arguments]    ${listener_node_role}    ${shard_name}=${PREF_BASED_SHARD}    ${shard_type}=${SHARD_TYPE}
275     [Documentation]    Implements listener isolation test scenario.
276     ${all_indices} =    ClusterManagement.List_All_Indices
277     ${leader}    ${follower_list} =    ClusterManagement.Get_Leader_And_Followers_For_Shard    shard_name=${shard_name}    shard_type=${shard_type}    member_index_list=${all_indices}
278     ${follower1} =    Collections.Get_From_List    ${follower_list}    ${0}
279     ${follower2} =    Collections.Get_From_List    ${follower_list}    ${1}
280     ${listener_node_dst} =    BuiltIn.Set_Variable_If    "${listener_node_role}" == "leader"    ${leader}    ${follower1}
281     MdsalLowlevel.Subscribe_Dtcl    ${listener_node_dst}
282     ${all_ip_list} =    ClusterManagement.Resolve_IP_Address_For_Members    ${all_indices}
283     MdsalLowlevelPy.Start_Produce_Transactions_On_Nodes    ${all_ip_list}    ${all_indices}    ${ID_PREFIX}    ${DURATION_10S}    ${TRANSACTION_RATE_1K}
284     ClusterAdmin.Make_Leader_Local    ${follower1}    ${shard_name}    ${shard_type}
285     ${resp_list} =    MdsalLowlevelPy.Wait_For_Transactions
286     : FOR    ${resp}    IN    @{resp_list}
287     \    TemplatedRequests.Check_Status_Code    ${resp}
288     [Teardown]    MdsalLowlevel.Unsubscribe_Dtcl    ${listener_node_dst}
289
290 Create_Prefix_Based_Shard_And_Verify
291     [Arguments]    ${prefix}=${PREF_BASED_SHARD}
292     [Documentation]    Create prefix based shard with replicas on all nodes
293     ${all_indices} =    ClusterManagement.List_All_Indices
294     ${node_to_trigger} =    Collections.Get_From_List    ${all_indices}    ${0}
295     MdsalLowlevel.Create_Prefix_Shard    ${node_to_trigger}    ${prefix}    ${all_indices}
296     BuiltIn.Wait_Until_Keyword_Succeeds    30s    3s    ClusterManagement.Get_Leader_And_Followers_For_Shard    shard_name=${prefix}!!    shard_type=${SHARD_TYPE}    member_index_list=${all_indices}
297
298 Remove_Prefix_Based_Shard_And_Verify
299     [Arguments]    ${prefix}=${PREF_BASED_SHARD}
300     [Documentation]    Remove prefix based shard with all replicas
301     ${all_indices} =    ClusterManagement.List_All_Indices
302     ${node_to_trigger} =    Collections.Get_From_List    ${all_indices}    ${0}
303     MdsalLowlevel.Remove_Prefix_Shard    ${node_to_trigger}    ${prefix}
304     : FOR    ${idx}    IN    @{all_indices}
305     \    BuiltIn.Wait_Until_Keyword_Succeeds    15s    2s    Verify_Shard_Replica_Removed    ${idx}    ${prefix}!!
306     \    ...    ${SHARD_TYPE}
307
308 Verify_Shard_Replica_Removed
309     [Arguments]    ${member_index}    ${shard_name}    ${shard_type}
310     [Documentation]    Verify that shard is removed. Jolokia return 404 for shard memeber.
311     ${session} =    Resolve_Http_Session_For_Member    member_index=${member_index}
312     ${type_class} =    Resolve_Shard_Type_Class    shard_type=${shard_type}
313     ${uri} =    BuiltIn.Set_Variable    /jolokia/read/org.opendaylight.controller:Category=Shards,name=member-${member_index}-shard-${shard_name}-${shard_type},type=${type_class}
314     ${text}    TemplatedRequests.Get_From_Uri    uri=${uri}    session=${session}
315     BuiltIn.Should_Contain    ${text}    "status":404    javax.management.InstanceNotFoundException