66a33a5586d2a5583f5f932c3dc5e3bcb8207c17
[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}/../KarafKeywords.robot
16 Resource          ${CURDIR}/../MdsalLowlevel.robot
17 Resource          ${CURDIR}/../TemplatedRequests.robot
18 Resource          ${CURDIR}/../ShardStability.robot
19 Resource          ${CURDIR}/../WaitForFailure.robot
20
21 *** Variables ***
22 ${SHARD_NAME}     default
23 ${SHARD_TYPE}     config
24 ${TRANSACTION_RATE_1K}    ${1000}
25 ${DURATION_90S}    ${90}    #TODO: Rename to hint at the goal of waiting, instead of its default value.
26 ${DURATION_30S}    ${30}
27 ${ID_PREFIX}      prefix-
28 ${TRANSACTION_TIMEOUT}    ${30}
29 ${TRANSACTION_TIMEOUT_2X}    ${2*${TRANSACTION_TIMEOUT}}
30 ${SIMPLE_TX}      ${False}
31 ${CHAINED_TX}     ${True}
32 ${ISOLATED_TRANS_TRUE}    ${True}
33 ${ISOLATED_TRANS_FALSE}    ${False}
34 ${HARD_TIMEOUT}    ${120}
35 @{TRANSACTION_FAILED}    ${500}
36 ${PREF_BASED_SHARD}    id-ints
37 ${TEST_LOG_LEVEL}    info
38 @{TEST_LOG_COMPONENTS}    org.opendaylight.controller.cluster.sharding    org.opendaylight.controller.cluster.datastore
39 ${HEAL_WITHIN_TRANS_TIMEOUT}    ${0}
40
41 *** Keywords ***
42 Explicit_Leader_Movement_Test_Templ
43     [Arguments]    ${leader_from}    ${leader_to}    ${shard_name}=${SHARD_NAME}    ${shard_type}=${SHARD_TYPE}
44     [Documentation]    Implements explicit leader movement test scenario.
45     ${idx_from}    ${idx_to}    ${idx_trans} =    Get_Node_Indexes_For_The_ELM_Test    ${leader_from}    ${leader_to}    ${shard_name}
46     ...    ${shard_type}
47     KarafKeywords.Log_Message_To_Controller_Karaf    Starting leader movement from node${idx_from} to node${idx_to}, transaction producer at node${idx_trans}.
48     ${ip_trans_as_list} =    BuiltIn.Create_List    ${ODL_SYSTEM_${idx_trans}_IP}
49     ${idx_trans_as_list} =    BuiltIn.Create_List    ${idx_trans}
50     MdsalLowlevelPy.Start_Write_Transactions_On_Nodes    ${ip_trans_as_list}    ${idx_trans_as_list}    ${ID_PREFIX}    ${DURATION_30S}    ${TRANSACTION_RATE_1K}    chained_flag=${CHAINED_TX}
51     BuiltIn.Sleep    5s
52     ClusterAdmin.Make_Leader_Local    ${idx_to}    ${shard_name}    ${shard_type}
53     ${new_leader}    ${new_followers} =    BuiltIn.Wait_Until_Keyword_Succeeds    30s    5s    ClusterManagement.Verify_Shard_Leader_Elected    ${shard_name}
54     ...    ${shard_type}    ${True}    ${idx_from}    verify_restconf=False
55     BuiltIn.Should_Be_Equal    ${idx_to}    ${new_leader}
56     ${resp_list} =    MdsalLowlevelPy.Wait_For_Transactions
57     TemplatedRequests.Check_Status_Code    @{resp_list}[0]
58
59 Explicit_Leader_Movement_PrefBasedShard_Test_Templ
60     [Arguments]    ${leader_from}    ${leader_to}    ${shard_name}=${PREF_BASED_SHARD}    ${shard_type}=${SHARD_TYPE}
61     [Documentation]    Implements explicit leader movement test scenario.
62     ${idx_from}    ${idx_to}    ${idx_trans} =    Get_Node_Indexes_For_The_ELM_Test    ${leader_from}    ${leader_to}    ${shard_name}!!
63     ...    ${shard_type}
64     ${ip_trans_as_list} =    BuiltIn.Create_List    ${ODL_SYSTEM_${idx_trans}_IP}
65     ${idx_trans_as_list} =    BuiltIn.Create_List    ${idx_trans}
66     MdsalLowlevelPy.Start_Produce_Transactions_On_Nodes    ${ip_trans_as_list}    ${idx_trans_as_list}    ${ID_PREFIX}    ${DURATION_30S}    ${TRANSACTION_RATE_1K}
67     BuiltIn.Sleep    5s
68     MdsalLowlevel.Become_Prefix_Leader    ${idx_to}    ${shard_name}
69     ${new_leader}    ${new_followers} =    BuiltIn.Wait_Until_Keyword_Succeeds    30s    5s    ClusterManagement.Verify_Shard_Leader_Elected    ${shard_name}!!
70     ...    ${shard_type}    ${True}    ${idx_from}    verify_restconf=False
71     BuiltIn.Should_Be_Equal    ${idx_to}    ${new_leader}
72     ${resp_list} =    MdsalLowlevelPy.Wait_For_Transactions
73     TemplatedRequests.Check_Status_Code    @{resp_list}[0]
74
75 Get_Node_Indexes_For_The_ELM_Test
76     [Arguments]    ${leader_from}    ${leader_to}    ${shard_name}    ${shard_type}
77     [Documentation]    Return indexes for explicit leader movement test case, indexes of present to next leader node and index where transaction
78     ...    producer should be deployed.
79     ${leader}    ${follower_list} =    ClusterManagement.Get_Leader_And_Followers_For_Shard    shard_name=${shard_name}    shard_type=${shard_type}    verify_restconf=False
80     ${idx_from} =    BuiltIn.Set_Variable    ${leader}
81     ${idx_to} =    BuiltIn.Set_Variable    @{follower_list}[0]
82     ${idx_trans} =    BuiltIn.Set_Variable_If    "${leader_from}" == "remote" and "${leader_to}" == "remote"    @{follower_list}[1]    "${leader_from}" == "local"    ${leader}    "${leader_to}" == "local"
83     ...    @{follower_list}[0]
84     BuiltIn.Return_From_Keyword    ${idx_from}    ${idx_to}    ${idx_trans}
85
86 Clean_Leader_Shutdown_Test_Templ
87     [Arguments]    ${leader_location}    ${shard_name}=${SHARD_NAME}    ${shard_type}=${SHARD_TYPE}
88     [Documentation]    Implements clean leader shutdown test scenario.
89     ${removed} =    BuiltIn.Set_Variable    ${False}
90     ${producer_idx}    ${actual_leader}    ${follower_list} =    Get_Node_Indexes_For_Clean_Leader_Shutdown_Test    ${leader_location}    ${shard_name}    ${shard_type}
91     ${producer_ip_as_list} =    BuiltIn.Create_List    ${ODL_SYSTEM_${producer_idx}_IP}
92     ${producer_idx_as_list} =    BuiltIn.Create_List    ${producer_idx}
93     MdsalLowlevelPy.Start_Write_Transactions_On_Nodes    ${producer_ip_as_list}    ${producer_idx_as_list}    ${ID_PREFIX}    ${DURATION_30S}    ${TRANSACTION_RATE_1K}    chained_flag=${CHAINED_TX}
94     BuiltIn.Sleep    5s
95     ClusterAdmin.Remove_Shard_Replica    ${actual_leader}    ${shard_name}    member-${actual_leader}    ${shard_type}
96     ${removed} =    BuiltIn.Set_Variable    ${True}
97     ${resp_list} =    MdsalLowlevelPy.Wait_For_Transactions
98     TemplatedRequests.Check_Status_Code    @{resp_list}[0]
99     [Teardown]    BuiltIn.Run_Keywords    BuiltIn.Run_Keyword_And_Ignore_Error    BuiltIn.Wait_Until_Keyword_Succeeds    30s    3s    ClusterManagement.Get_Leader_And_Followers_For_Shard
100     ...    shard_name=${shard_name}    shard_type=${shard_type}    member_index_list=${follower_list}    verify_restconf=False
101     ...    AND    ClusterAdmin.Add_Shard_Replica    ${actual_leader}    ${shard_name}    ${shard_type}
102     ...    AND    BuiltIn.Wait_Until_Keyword_Succeeds    30s    3s    ClusterManagement.Get_Leader_And_Followers_For_Shard    shard_name=${shard_name}
103     ...    verify_restconf=False    shard_type=${shard_type}
104
105 Clean_Leader_Shutdown_PrefBasedShard_Test_Templ
106     [Arguments]    ${leader_location}    ${shard_name}=${PREF_BASED_SHARD}    ${shard_type}=${SHARD_TYPE}
107     [Documentation]    Implements clean leader shutdown test scenario.
108     ${producer_idx}    ${actual_leader}    ${follower_list} =    Get_Node_Indexes_For_Clean_Leader_Shutdown_Test    ${leader_location}    ${shard_name}!!    ${shard_type}
109     ${producer_ip_as_list} =    BuiltIn.Create_List    ${ODL_SYSTEM_${producer_idx}_IP}
110     ${producer_idx_as_list} =    BuiltIn.Create_List    ${producer_idx}
111     MdsalLowlevelPy.Start_Produce_Transactions_On_Nodes    ${producer_ip_as_list}    ${producer_idx_as_list}    ${ID_PREFIX}    ${DURATION_30S}    ${TRANSACTION_RATE_1K}
112     BuiltIn.Sleep    5s
113     ClusterAdmin.Remove_Prefix_Shard_Replica    ${actual_leader}    ${shard_name}    member-${actual_leader}    ${shard_type}
114     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}
115     ...    verify_restconf=False
116     # TODO: Check on the result of this
117     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}
118     ${resp_list} =    MdsalLowlevelPy.Wait_For_Transactions
119     TemplatedRequests.Check_Status_Code    @{resp_list}[0]
120     [Teardown]    BuiltIn.Run_Keywords    BuiltIn.Run_Keyword_And_Ignore_Error    BuiltIn.Wait_Until_Keyword_Succeeds    30s    3s    ClusterManagement.Get_Leader_And_Followers_For_Shard
121     ...    shard_name=${shard_name}!!    shard_type=${shard_type}    member_index_list=${follower_list}    verify_restconf=False
122     ...    AND    ClusterAdmin.Add_Prefix_Shard_Replica    ${actual_leader}    ${shard_name}    ${shard_type}
123     ...    AND    BuiltIn.Wait_Until_Keyword_Succeeds    30s    3s    ClusterManagement.Get_Leader_And_Followers_For_Shard    shard_name=${shard_name}!!
124     ...    verify_restconf=False    shard_type=${shard_type}
125
126 Get_Node_Indexes_For_Clean_Leader_Shutdown_Test
127     [Arguments]    ${leader_location}    ${shard_name}    ${shard_type}
128     [Documentation]    Return indexes for clean leader shudown test case, index where transaction producer shoudl be deployed and a shard leader index.
129     ${leader}    ${follower_list} =    ClusterManagement.Get_Leader_And_Followers_For_Shard    shard_name=${shard_name}    shard_type=${shard_type}    verify_restconf=False
130     ${follower_list_leangth} =    BuiltIn.Evaluate    ${NUM_ODL_SYSTEM}-1
131     BuiltIn.Length_Should_Be    ${follower_list}    ${follower_list_leangth}
132     ${producer_idx} =    BuiltIn.Set_Variable_If    "${leader_location}" == "local"    ${leader}    @{follower_list}[0]
133     BuiltIn.Return_From_Keyword    ${producer_idx}    ${leader}    ${follower_list}
134
135 Leader_Isolation_Test_Templ
136     [Arguments]    ${heal_timeout}    ${shard_name}=${SHARD_NAME}    ${shard_type}=${SHARD_TYPE}
137     [Documentation]    Implements leader isolation test scenario.
138     ${li_isolated}    BuiltIn.Set_Variable    ${False}
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}    verify_restconf=False
142     ${all_ip_list} =    ClusterManagement.Resolve_IP_Address_For_Members    ${all_indices}
143     MdsalLowlevelPy.Start_Write_Transactions_On_Nodes    ${all_ip_list}    ${all_indices}    ${ID_PREFIX}    ${producing_transactions_time}    ${TRANSACTION_RATE_1K}    chained_flag=${CHAINED_TX}
144     BuiltIn.Sleep    5s
145     ${date_start} =    DateTime.Get_Current_Date
146     ${date_end} =    DateTime.Add_Time_To_Date    ${date_start}    ${producing_transactions_time}
147     KarafKeywords.Log_Message_To_Controller_Karaf    Isolating node ${leader}
148     ClusterManagement.Isolate_Member_From_List_Or_All    ${leader}
149     ${li_isolated}    BuiltIn.Set_Variable    ${True}
150     BuiltIn.Wait_Until_Keyword_Succeeds    45s    2s    ClusterManagement.Verify_Shard_Leader_Elected    ${shard_name}    ${shard_type}    ${True}
151     ...    ${leader}    member_index_list=${follower_list}
152     ${date_leader_elected} =    DateTime.Get_Current_Date
153     ${delta} =    DateTime.Subtract_Date_From_Date    ${date_leader_elected}    ${date_start}
154     # TODO: Consider extracting the block which depends on ${heal_timeout} value into two keywords, and have just one If to decide which one to call.
155     BuiltIn.Run_Keyword_If    ${heal_timeout}==${HEAL_WITHIN_TRANS_TIMEOUT} and ${delta} > ${TRANSACTION_TIMEOUT}    BuiltIn.Fail    We are not able to heal the cluster within transaction timout because new leader election took more time.
156     ${resp} =    MdsalLowlevelPy.Get_Next_Transactions_Response
157     BuiltIn.Should_Be_Equal    ${resp}    ${NONE}    No response expected, received ${resp}
158     BuiltIn.Sleep    ${heal_timeout}
159     KarafKeywords.Log_Message_To_Controller_Karaf    Rejoining node ${leader}
160     ClusterManagement.Rejoin_Member_From_List_Or_All    ${leader}
161     ${li_isolated}    BuiltIn.Set_Variable    ${False}
162     BuiltIn.Wait_Until_Keyword_Succeeds    60s    10s    ShardStability.Shards_Stability_Get_Details    ${DEFAULT_SHARD_LIST}
163     BuiltIn.Wait_Until_Keyword_Succeeds    15s    2s    ClusterManagement.Get_Leader_And_Followers_For_Shard    ${shard_name}    ${shard_type}    verify_restconf=False
164     ${time_to_finish} =    Get_Seconds_To_Time    ${date_end}
165     BuiltIn.Run_Keyword_If    ${heal_timeout} < ${TRANSACTION_TIMEOUT}    Leader_Isolation_Heal_Within_Tt
166     ...    ELSE    Module_Leader_Isolation_Heal_Default    ${leader}    ${time_to_finish}
167     [Teardown]    BuiltIn.Run_Keyword_If    ${li_isolated}    BuiltIn.Run_Keywords    ClusterManagement.Rejoin_Member_From_List_Or_All    ${leader}
168     ...    AND    BuiltIn.Wait_Until_Keyword_Succeeds    60s    10s    ShardStability.Shards_Stability_Get_Details    ${DEFAULT_SHARD_LIST}
169
170 Leader_Isolation_PrefBasedShard_Test_Templ
171     [Arguments]    ${heal_timeout}    ${shard_name}=${PREF_BASED_SHARD}    ${shard_type}=${SHARD_TYPE}
172     [Documentation]    Implements leader isolation test scenario.
173     ${li_isolated}    BuiltIn.Set_Variable    ${False}
174     ${producing_transactions_time} =    BuiltIn.Set_Variable    ${${heal_timeout}+60}
175     ${all_indices} =    ClusterManagement.List_All_Indices
176     ${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
177     ${all_ip_list} =    ClusterManagement.Resolve_IP_Address_For_Members    ${all_indices}
178     MdsalLowlevelPy.Start_Produce_Transactions_On_Nodes    ${all_ip_list}    ${all_indices}    ${ID_PREFIX}    ${producing_transactions_time}    ${TRANSACTION_RATE_1K}
179     BuiltIn.Sleep    5s
180     ${date_start} =    DateTime.Get_Current_Date
181     ${date_end} =    DateTime.Add_Time_To_Date    ${date_start}    ${producing_transactions_time}
182     KarafKeywords.Log_Message_To_Controller_Karaf    Isolating node ${leader}
183     ClusterManagement.Isolate_Member_From_List_Or_All    ${leader}
184     ${li_isolated}    BuiltIn.Set_Variable    ${True}
185     BuiltIn.Wait_Until_Keyword_Succeeds    45s    2s    ClusterManagement.Verify_Shard_Leader_Elected    ${shard_name}!!    ${shard_type}    ${True}
186     ...    ${leader}    member_index_list=${follower_list}
187     ${date_leader_elected} =    DateTime.Get_Current_Date
188     ${delta} =    DateTime.Subtract_Date_From_Date    ${date_leader_elected}    ${date_start}
189     # TODO: Consider extracting the block which depends on ${heal_timeout} value into two keywords, and have just one If to decide which one to call.
190     BuiltIn.Run_Keyword_If    ${heal_timeout}==${HEAL_WITHIN_TRANS_TIMEOUT} and ${delta} > ${TRANSACTION_TIMEOUT}    BuiltIn.Fail    We are not able to heal the cluster within transaction timout because new leader election took more time.
191     ${resp} =    MdsalLowlevelPy.Get_Next_Transactions_Response
192     BuiltIn.Should_Be_Equal    ${resp}    ${NONE}    No response expected, received ${resp}
193     BuiltIn.Sleep    ${heal_timeout}
194     KarafKeywords.Log_Message_To_Controller_Karaf    Rejoining node ${leader}
195     ClusterManagement.Rejoin_Member_From_List_Or_All    ${leader}
196     ${li_isolated}    BuiltIn.Set_Variable    ${False}
197     BuiltIn.Wait_Until_Keyword_Succeeds    60s    10s    ShardStability.Shards_Stability_Get_Details    ${DEFAULT_SHARD_LIST}
198     BuiltIn.Wait_Until_Keyword_Succeeds    15s    2s    ClusterManagement.Get_Leader_And_Followers_For_Shard    ${shard_name}!!    ${shard_type}    verify_restconf=False
199     ${time_to_finish} =    Get_Seconds_To_Time    ${date_end}
200     BuiltIn.Run_Keyword_If    ${heal_timeout} < ${TRANSACTION_TIMEOUT}    Leader_Isolation_Heal_Within_Tt
201     ...    ELSE    Prefix_Leader_Isolation_Heal_Default    ${leader}    ${time_to_finish}
202     [Teardown]    BuiltIn.Run_Keyword_If    ${li_isolated}    BuiltIn.Run_Keywords    ClusterManagement.Rejoin_Member_From_List_Or_All    ${leader}
203     ...    AND    BuiltIn.Wait_Until_Keyword_Succeeds    60s    10s    ShardStability.Shards_Stability_Get_Details    ${DEFAULT_SHARD_LIST}
204
205 Leader_Isolation_Heal_Within_Tt
206     [Documentation]    The leader isolation test case end if the heal happens within transaction timeout. All write transaction
207     ...    producers shoudl finish without error.
208     ${resp_list} =    MdsalLowlevelPy.Wait_For_Transactions
209     : FOR    ${resp}    IN    @{resp_list}
210     \    TemplatedRequests.Check_Status_Code    ${resp}
211
212 Module_Leader_Isolation_Heal_Default
213     [Arguments]    ${isolated_node}    ${time_to_finish}
214     [Documentation]    The leader isolation test case end. The transaction producer on isolated node should fail and should be restarted.
215     ...    Then all write transaction producers should finish without error.
216     ${resp} =    MdsalLowlevelPy.Get_Next_Transactions_Response
217     BuiltIn.Log    ${resp}
218     BuiltIn.Should_Not_Be_Equal    ${NONE}    ${resp}    Write-transaction should have returned error from isolated leader node.
219     # TODO: check on response status code
220     ${restart_producer_node_idx_as_list}    BuiltIn.Create_List    ${isolated_node}
221     ${restart_producer_node_ip} =    ClusterManagement.Resolve_IP_Address_For_Member    ${isolated_node}
222     ${restart_producer_node_ip_as_list}    BuiltIn.Create_List    ${restart_producer_node_ip}
223     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=${CHAINED_TX}
224     ...    reset_globals=${False}
225     ${resp_list} =    MdsalLowlevelPy.Wait_For_Transactions
226     : FOR    ${resp}    IN    @{resp_list}
227     \    TemplatedRequests.Check_Status_Code    ${resp}
228
229 Prefix_Leader_Isolation_Heal_Default
230     [Arguments]    ${isolated_node}    ${time_to_finish}
231     [Documentation]    The leader isolation test case end. The transaction producer on isolated node shoudl fail and should be restarted.
232     ...    Then all write transaction producers shoudl finish without error.
233     ${resp} =    MdsalLowlevelPy.Get_Next_Transactions_Response
234     BuiltIn.Log    ${resp}
235     BuiltIn.Should_Not_Be_Equal    ${NONE}    ${resp}    Produce-transaction should have returned error from isolated leader node.
236     # TODO: check on response status code
237     ${restart_producer_node_idx_as_list}    BuiltIn.Create_List    ${isolated_node}
238     ${restart_producer_node_ip} =    ClusterManagement.Resolve_IP_Address_For_Member    ${isolated_node}
239     ${restart_producer_node_ip_as_list}    BuiltIn.Create_List    ${restart_producer_node_ip}
240     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}    reset_globals=${False}
241     ${resp_list} =    MdsalLowlevelPy.Wait_For_Transactions
242     : FOR    ${resp}    IN    @{resp_list}
243     \    TemplatedRequests.Check_Status_Code    ${resp}
244
245 Client_Isolation_Test_Templ
246     [Arguments]    ${listener_node_role}    ${trans_chain_flag}    ${shard_name}=${SHARD_NAME}    ${shard_type}=${SHARD_TYPE}
247     [Documentation]    Implements client isolation test scenario.
248     ${all_indices} =    ClusterManagement.List_All_Indices
249     ${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
250     ${follower1} =    Collections.Get_From_List    ${follower_list}    ${0}
251     ${client_node_dst} =    BuiltIn.Set_Variable_If    "${listener_node_role}" == "leader"    ${leader}    ${follower1}
252     ${client_node_ip} =    ClusterManagement.Resolve_IP_Address_For_Member    ${client_node_dst}
253     ${client_node_ip_as_list}    BuiltIn.Create_List    ${client_node_ip}
254     ${client_node_idx_as_list}    BuiltIn.Create_List    ${client_node_dst}
255     MdsalLowlevelPy.Start_Write_Transactions_On_Nodes    ${client_node_ip_as_list}    ${client_node_idx_as_list}    ${ID_PREFIX}    ${DURATION_90S}    ${TRANSACTION_RATE_1K}    chained_flag=${trans_chain_flag}
256     BuiltIn.Sleep    5s
257     ${start_date}    DateTime.Get_Current_Date
258     ${timeout_date} =    DateTime.Add_Time_To_Date    ${start_date}    ${TRANSACTION_TIMEOUT}
259     ${abort_date} =    DateTime.Add_Time_To_Date    ${start_date}    ${HARD_TIMEOUT}
260     KarafKeywords.Log_Message_To_Controller_Karaf    Isolating node ${client_node_dst}
261     ClusterManagement.Isolate_Member_From_List_Or_All    ${client_node_dst}
262     ${trans_timeout} =    Get_Seconds_To_Time    ${timeout_date}
263     WaitForFailure.Verify_Keyword_Does_Not_Fail_Within_Timeout    ${trans_timeout}    1s    Ongoing_Transactions_Not_Failed_Yet
264     ${hard_timeout} =    Get_Seconds_To_Time    ${abort_date}
265     WaitForFailure.Verify_Keyword_Does_Not_Fail_Within_Timeout    ${hard_timeout}    1s    Ongoing_Transactions_Not_Failed_Yet
266     BuiltIn.Wait_Until_Keyword_Succeeds    20s    2s    Ongoing_Transactions_Failed
267     [Teardown]    BuiltIn.Run Keywords    KarafKeywords.Log_Message_To_Controller_Karaf    Rejoining node ${client_node_dst}
268     ...    AND    ClusterManagement.Rejoin_Member_From_List_Or_All    ${client_node_dst}
269     ...    AND    BuiltIn.Wait_Until_Keyword_Succeeds    60s    10s    ShardStability.Shards_Stability_Get_Details    ${DEFAULT_SHARD_LIST}
270     ...    AND    MdsalLowlevelPy.Wait_For_Transactions
271
272 Client_Isolation_PrefBasedShard_Test_Templ
273     [Arguments]    ${listener_node_role}    ${isolated_transactions_flag}    ${shard_name}=${PREF_BASED_SHARD}    ${shard_type}=${SHARD_TYPE}
274     [Documentation]    Implements client isolation test scenario.
275     ${all_indices} =    ClusterManagement.List_All_Indices
276     ${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
277     ${follower1} =    Collections.Get_From_List    ${follower_list}    ${0}
278     ${client_node_dst} =    BuiltIn.Set_Variable_If    "${listener_node_role}" == "leader"    ${leader}    ${follower1}
279     ${client_node_ip} =    ClusterManagement.Resolve_IP_Address_For_Member    ${client_node_dst}
280     ${client_node_ip_as_list}    BuiltIn.Create_List    ${client_node_ip}
281     ${client_node_idx_as_list}    BuiltIn.Create_List    ${client_node_dst}
282     MdsalLowlevelPy.Start_Produce_Transactions_On_Nodes    ${client_node_ip_as_list}    ${client_node_idx_as_list}    ${ID_PREFIX}    ${DURATION_90S}    ${TRANSACTION_RATE_1K}    isolated_transactions_flag=${isolated_transactions_flag}
283     BuiltIn.Sleep    5s
284     ${start_date}    DateTime.Get_Current_Date
285     ${timeout_date} =    DateTime.Add_Time_To_Date    ${start_date}    ${TRANSACTION_TIMEOUT}
286     ${abort_date} =    DateTime.Add_Time_To_Date    ${start_date}    ${HARD_TIMEOUT}
287     KarafKeywords.Log_Message_To_Controller_Karaf    Isolating node ${client_node_dst}
288     ClusterManagement.Isolate_Member_From_List_Or_All    ${client_node_dst}
289     ${trans_timeout} =    Get_Seconds_To_Time    ${timeout_date}
290     WaitForFailure.Verify_Keyword_Does_Not_Fail_Within_Timeout    ${trans_timeout}    1s    Ongoing_Transactions_Not_Failed_Yet
291     ${hard_timeout} =    Get_Seconds_To_Time    ${abort_date}
292     WaitForFailure.Verify_Keyword_Does_Not_Fail_Within_Timeout    ${hard_timeout}    1s    Ongoing_Transactions_Not_Failed_Yet
293     BuiltIn.Wait_Until_Keyword_Succeeds    20s    2s    Ongoing_Transactions_Failed
294     [Teardown]    BuiltIn.Run Keywords    KarafKeywords.Log_Message_To_Controller_Karaf    Rejoining node ${client_node_dst}
295     ...    AND    ClusterManagement.Rejoin_Member_From_List_Or_All    ${client_node_dst}
296     ...    AND    BuiltIn.Wait_Until_Keyword_Succeeds    60s    10s    ShardStability.Shards_Stability_Get_Details    ${DEFAULT_SHARD_LIST}
297     ...    AND    MdsalLowlevelPy.Wait_For_Transactions
298
299 Ongoing_Transactions_Not_Failed_Yet
300     [Documentation]    Verify that no write-transaction rpc finished, means they are still running.
301     ${resp} =    MdsalLowlevelPy.Get_Next_Transactions_Response
302     BuiltIn.Should_Be_Equal    ${None}    ${resp}    ${resp} not expected.
303
304 Ongoing_Transactions_Failed
305     [Documentation]    Verify if write-transaction failed.
306     ${resp} =    MdsalLowlevelPy.Get_Next_Transactions_Response
307     Check_Status_Code    ${resp}    explicit_status_codes=${TRANSACTION_FAILED}
308
309 Get_Seconds_To_Time
310     [Arguments]    ${date_in_future}
311     [Documentation]    Return number of seconds remaining to ${date_in_future}.
312     ${date_now} =    DateTime.Get_Current_Date
313     ${duration} =    DateTime.Subtract_Date_From_Date    ${date_in_future}    ${date_now}
314     BuiltIn.Run_Keyword_And_Return    BuiltIn.Convert_To_Integer    ${duration}
315
316 Remote_Listener_Test_Templ
317     [Arguments]    ${listener_node_role}    ${shard_name}=${SHARD_NAME}    ${shard_type}=${SHARD_TYPE}
318     [Documentation]    Implements remote listener test scenario.
319     ${subscribed} =    BuiltIn.Set_Variable    ${False}
320     ${all_indices} =    ClusterManagement.List_All_Indices
321     ${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
322     ${follower1} =    Collections.Get_From_List    ${follower_list}    ${0}
323     ${listener_node_dst} =    BuiltIn.Set_Variable_If    "${listener_node_role}" == "leader"    ${leader}    ${follower1}
324     MdsalLowlevel.Subscribe_Dtcl    ${listener_node_dst}
325     ${subscribed} =    BuiltIn.Set_Variable    ${True}
326     ${all_ip_list} =    ClusterManagement.Resolve_IP_Address_For_Members    ${all_indices}
327     MdsalLowlevelPy.Start_Write_Transactions_On_Nodes    ${all_ip_list}    ${all_indices}    ${ID_PREFIX}    ${DURATION_30S}    ${TRANSACTION_RATE_1K}    chained_flag=${CHAINED_TX}
328     BuiltIn.Sleep    5s
329     ClusterAdmin.Remove_Shard_Replica    ${listener_node_dst}    ${shard_name}    member-${listener_node_dst}    ${shard_type}
330     ${alive_replicas} =    ClusterManagement.List_Indices_Minus_Member    ${listener_node_dst}    ${all_indices}
331     ${newleader}    ${newfollower_list} =    BuiltIn.Wait_Until_Keyword_Succeeds    45s    2s    ClusterManagement.Get_Leader_And_Followers_For_Shard    shard_name=${shard_name}
332     ...    shard_type=${shard_type}    member_index_list=${alive_replicas}    verify_restconf=False
333     BuiltIn.Run_Keyword_If    "${listener_node_role}" != "leader"    BuiltIn.Should_Be_Equal_As_Numbers    ${leader}    ${newleader}
334     ${resp_list} =    MdsalLowlevelPy.Wait_For_Transactions
335     : FOR    ${resp}    IN    @{resp_list}
336     \    TemplatedRequests.Check_Status_Code    ${resp}
337     ${copy_matches} =    MdsalLowlevel.Unsubscribe_Dtcl    ${listener_node_dst}
338     ${subscribed} =    BuiltIn.Set_Variable    ${False}
339     BuiltIn.Should_Be_True    ${copy_matches}
340     [Teardown]    BuiltIn.Run_Keywords    BuiltIn.Run_Keyword_If    ${subscribed}    MdsalLowlevel.Unsubscribe_Dtcl    ${listener_node_dst}
341     ...    AND    ClusterAdmin.Add_Shard_Replica    ${listener_node_dst}    ${shard_name}    ${shard_type}
342     ...    AND    BuiltIn.Wait_Until_Keyword_Succeeds    30s    3s    ClusterManagement.Get_Leader_And_Followers_For_Shard    shard_name=${shard_name}
343     ...    verify_restconf=False    shard_type=${shard_type}
344
345 Remote_Listener_PrefBasedShard_Test_Templ
346     [Arguments]    ${listener_node_role}    ${shard_name}=${PREF_BASED_SHARD}    ${shard_type}=${SHARD_TYPE}
347     [Documentation]    Implements listener isolation test scenario.
348     ${subscribed} =    BuiltIn.Set_Variable    ${False}
349     ${all_indices} =    ClusterManagement.List_All_Indices
350     ${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
351     ${follower1} =    Collections.Get_From_List    ${follower_list}    ${0}
352     ${listener_node_dst} =    BuiltIn.Set_Variable_If    "${listener_node_role}" == "leader"    ${leader}    ${follower1}
353     MdsalLowlevel.Subscribe_Ddtl    ${listener_node_dst}
354     ${subscribed} =    BuiltIn.Set_Variable    ${True}
355     ${all_ip_list} =    ClusterManagement.Resolve_IP_Address_For_Members    ${all_indices}
356     MdsalLowlevelPy.Start_Produce_Transactions_On_Nodes    ${all_ip_list}    ${all_indices}    ${ID_PREFIX}    ${DURATION_30S}    ${TRANSACTION_RATE_1K}
357     BuiltIn.Sleep    5s
358     ClusterAdmin.Remove_Prefix_Shard_Replica    ${listener_node_dst}    ${shard_name}    member-${listener_node_dst}    ${shard_type}
359     ${alive_replicas} =    ClusterManagement.List_Indices_Minus_Member    ${listener_node_dst}    ${all_indices}
360     ${newleader}    ${newfollower_list} =    BuiltIn.Wait_Until_Keyword_Succeeds    45s    2s    ClusterManagement.Get_Leader_And_Followers_For_Shard    shard_name=${shard_name}!!
361     ...    member_index_list=${alive_replicas}    verify_restconf=False    shard_type=${shard_type}
362     BuiltIn.Run_Keyword_If    "${listener_node_role}" != "leader"    BuiltIn.Should_Be_Equal_As_Numbers    ${leader}    ${newleader}
363     ${resp_list} =    MdsalLowlevelPy.Wait_For_Transactions
364     : FOR    ${resp}    IN    @{resp_list}
365     \    TemplatedRequests.Check_Status_Code    ${resp}
366     ${copy_matches} =    MdsalLowlevel.Unsubscribe_Ddtl    ${listener_node_dst}
367     ${subscribed} =    BuiltIn.Set_Variable    ${False}
368     BuiltIn.Should_Be_True    ${copy_matches}
369     [Teardown]    BuiltIn.Run_Keywords    BuiltIn.Run_Keyword_If    ${subscribed}    MdsalLowlevel.Unsubscribe_Ddtl    ${listener_node_dst}
370     ...    AND    ClusterAdmin.Add_Prefix_Shard_Replica    ${listener_node_dst}    ${shard_name}    ${shard_type}
371     ...    AND    BuiltIn.Wait_Until_Keyword_Succeeds    30s    3s    ClusterManagement.Get_Leader_And_Followers_For_Shard    shard_name=${shard_name}!!
372     ...    verify_restconf=False    shard_type=${shard_type}
373
374 Create_Prefix_Based_Shard_And_Verify
375     [Arguments]    ${prefix}=${PREF_BASED_SHARD}
376     [Documentation]    Create prefix based shard with replicas on all nodes
377     ${all_indices} =    ClusterManagement.List_All_Indices
378     ${node_to_trigger} =    Collections.Get_From_List    ${all_indices}    ${0}
379     MdsalLowlevel.Create_Prefix_Shard    ${node_to_trigger}    ${prefix}    ${all_indices}
380     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}
381     ...    verify_restconf=False
382
383 Remove_Prefix_Based_Shard_And_Verify
384     [Arguments]    ${prefix}=${PREF_BASED_SHARD}
385     [Documentation]    Remove prefix based shard with all replicas
386     ${all_indices} =    ClusterManagement.List_All_Indices
387     ${node_to_trigger} =    Collections.Get_From_List    ${all_indices}    ${0}
388     MdsalLowlevel.Remove_Prefix_Shard    ${node_to_trigger}    ${prefix}
389     : FOR    ${idx}    IN    @{all_indices}
390     \    BuiltIn.Wait_Until_Keyword_Succeeds    15s    2s    Verify_Shard_Replica_Removed    ${idx}    ${prefix}!!
391     \    ...    ${SHARD_TYPE}
392
393 Verify_Shard_Replica_Removed
394     [Arguments]    ${member_index}    ${shard_name}    ${shard_type}
395     [Documentation]    Verify that shard is removed. Jolokia return 404 for shard memeber.
396     ${session} =    Resolve_Http_Session_For_Member    member_index=${member_index}
397     ${type_class} =    Resolve_Shard_Type_Class    shard_type=${shard_type}
398     ${uri} =    BuiltIn.Set_Variable    /jolokia/read/org.opendaylight.controller:Category=Shards,name=member-${member_index}-shard-${shard_name}-${shard_type},type=${type_class}
399     ${text}    TemplatedRequests.Get_From_Uri    uri=${uri}    session=${session}
400     BuiltIn.Should_Contain    ${text}    "status":404    javax.management.InstanceNotFoundException
401
402 Restart_Test_Templ
403     [Documentation]    Kill every odl node and start again.
404     ClusterManagement.Kill_Members_From_List_Or_All
405     ClusterManagement.Clean_Directories_On_List_Or_All    tmp_dir=/tmp
406     ClusterManagement.Start_Members_From_List_Or_All
407     BuiltIn.Wait_Until_Keyword_Succeeds    300s    10s    ShardStability.Shards_Stability_Get_Details    ${DEFAULT_SHARD_LIST}    verify_restconf=True
408     ClusterManagement.Run_Bash_Command_On_List_Or_All    ps -ef | grep java