Python invocation of several parallel publish-notifications RPCs.
"""
from robot.api import logger
+import time
import Queue
import requests
import string
_globals = {}
-def _send_http_request_thread_impl(rqueue, url, data, http_timeout):
+def _send_http_request_thread_impl(rqueue, index, url, data, http_timeout):
"""Start either publish or write transactions rpc based on input.
:param rqueue: result queue
:type rqueue: Queue.Queue
+ :param index: cluster member index
+ :type index: int
:param url: rpc url
:type url: string
:param data: http request content
:param http_timeout: http response timeout
:type http_timeout: int
"""
- logger.info('rpc indoked with details: {}'.format(data))
+ logger.info('rpc invoked with details: {}'.format(data))
try:
resp = requests.post(url=url, headers={'Content-Type': 'application/xml'},
data=data, auth=('admin', 'admin'), timeout=http_timeout)
except Exception as exc:
resp = exc
logger.debug(exc)
- rqueue.put(resp)
+ rqueue.put(("member-" + str(index), time.ctime(), resp))
def _initiate_rpcs(host_list, prefix_list, url_templ, data_templ, subst_dict):
timeout = int(subst_dict['DURATION']) + 3*125+10
logger.info('url: {}, data: {}, timeout: {}'.format(url, data, timeout))
t = threading.Thread(target=_send_http_request_thread_impl,
- args=(resqueue, url, data, timeout))
+ args=(resqueue, i, url, data, timeout))
t.daemon = True
t.start()
lthreads.append(t)
def wait_for_transactions():
- """Blocking call, waitig for responses from all threads."""
+ """Blocking call, waitig for responses from all threads.
+
+ :return: list of triples; triple consists of member name, response time and response object
+ :rtype: list[(str, int, requests.Response)]
+ """
lthreads = _globals.pop('threads')
resqueue = _globals.pop('result_queue')
while not resqueue.empty():
results.append(resqueue.get())
for rsp in results:
- if isinstance(rsp, requests.Response):
- logger.info(rsp.text)
+ if isinstance(rsp[2], requests.Response):
+ logger.info(rsp[2].text)
else:
- logger.info(rsp)
+ logger.info(rsp[2])
return results
def get_next_transactions_response():
- """Get http response from write-transactions rpc if available."""
+ """Get http response from write-transactions rpc if available.
+
+ :return: None or a triple consisting of member name, response time and response object"""
resqueue = _globals.get('result_queue')
if not resqueue.empty():
rsp = resqueue.get()
- if isinstance(rsp, requests.Response):
- logger.info(rsp.text)
+ if isinstance(rsp[2], requests.Response):
+ logger.info(rsp[2].text)
else:
- logger.info(rsp)
+ logger.info(rsp[2])
return rsp
return None
...
... This resource file implements various test cases templates.
... FIXME: add a link to a document (when published) where the scenarios are defined
+...
+... TODO: When checking first response in isolation scenarior, make sure it comes from the expected member.
Library ${CURDIR}/../MdsalLowlevelPy.py
Resource ${CURDIR}/../ClusterAdmin.robot
Resource ${CURDIR}/../ClusterManagement.robot
... ${shard_type} ${True} ${idx_from} verify_restconf=False
BuiltIn.Should_Be_Equal ${idx_to} ${new_leader}
${resp_list} = MdsalLowlevelPy.Wait_For_Transactions
- TemplatedRequests.Check_Status_Code @{resp_list}[0]
+ TemplatedRequests.Check_Status_Code @{resp_list}[0][2]
Explicit_Leader_Movement_PrefBasedShard_Test_Templ
[Arguments] ${leader_from} ${leader_to} ${shard_name}=${PREF_BASED_SHARD} ${shard_type}=${SHARD_TYPE}
... ${shard_type} ${True} ${idx_from} verify_restconf=False
BuiltIn.Should_Be_Equal ${idx_to} ${new_leader}
${resp_list} = MdsalLowlevelPy.Wait_For_Transactions
- TemplatedRequests.Check_Status_Code @{resp_list}[0]
+ TemplatedRequests.Check_Status_Code @{resp_list}[0][2]
Get_Node_Indexes_For_The_ELM_Test
[Arguments] ${leader_from} ${leader_to} ${shard_name} ${shard_type}
ClusterAdmin.Remove_Shard_Replica ${actual_leader} ${shard_name} member-${actual_leader} ${shard_type}
${removed} = BuiltIn.Set_Variable ${True}
${resp_list} = MdsalLowlevelPy.Wait_For_Transactions
- TemplatedRequests.Check_Status_Code @{resp_list}[0]
+ TemplatedRequests.Check_Status_Code @{resp_list}[0][2]
[Teardown] BuiltIn.Run_Keywords BuiltIn.Run_Keyword_And_Ignore_Error BuiltIn.Wait_Until_Keyword_Succeeds 60s 5s ClusterManagement.Get_Leader_And_Followers_For_Shard
... shard_name=${shard_name} shard_type=${shard_type} member_index_list=${follower_list} verify_restconf=False
... AND ClusterAdmin.Add_Shard_Replica ${actual_leader} ${shard_name} ${shard_type}
# TODO: Check on the result of this
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}
${resp_list} = MdsalLowlevelPy.Wait_For_Transactions
- TemplatedRequests.Check_Status_Code @{resp_list}[0]
+ TemplatedRequests.Check_Status_Code @{resp_list}[0][2]
[Teardown] BuiltIn.Run_Keywords BuiltIn.Run_Keyword_And_Ignore_Error BuiltIn.Wait_Until_Keyword_Succeeds 60s 5s ClusterManagement.Get_Leader_And_Followers_For_Shard
... shard_name=${shard_name}!! shard_type=${shard_type} member_index_list=${follower_list} verify_restconf=False
... AND ClusterAdmin.Add_Prefix_Shard_Replica ${actual_leader} ${shard_name} ${shard_type}
... producers shoudl finish without error.
${resp_list} = MdsalLowlevelPy.Wait_For_Transactions
: FOR ${resp} IN @{resp_list}
- \ TemplatedRequests.Check_Status_Code ${resp}
+ \ TemplatedRequests.Check_Status_Code ${resp}[2]
Module_Leader_Isolation_Heal_Default
[Arguments] ${isolated_node} ${time_to_finish}
... reset_globals=${False}
${resp_list} = MdsalLowlevelPy.Wait_For_Transactions
: FOR ${resp} IN @{resp_list}
- \ TemplatedRequests.Check_Status_Code ${resp}
+ \ TemplatedRequests.Check_Status_Code ${resp}[2]
Prefix_Leader_Isolation_Heal_Default
[Arguments] ${isolated_node} ${time_to_finish}
MdsalLowlevelPy.Start_Produce_Transactions_On_Nodes ${restart_producer_node_ip_as_list} ${restart_producer_node_idx_as_list} ${ID_PREFIX2} ${time_to_finish} ${TRANSACTION_RATE_1K} reset_globals=${False}
${resp_list} = MdsalLowlevelPy.Wait_For_Transactions
: FOR ${resp} IN @{resp_list}
- \ TemplatedRequests.Check_Status_Code ${resp}
+ \ TemplatedRequests.Check_Status_Code ${resp}[2]
Client_Isolation_Test_Templ
[Arguments] ${listener_node_role} ${trans_chain_flag} ${shard_name}=${SHARD_NAME} ${shard_type}=${SHARD_TYPE}
Ongoing_Transactions_Failed
[Documentation] Verify if write-transaction failed.
${resp} = MdsalLowlevelPy.Get_Next_Transactions_Response
- Check_Status_Code ${resp} explicit_status_codes=${TRANSACTION_FAILED}
+ Check_Status_Code ${resp}[2] explicit_status_codes=${TRANSACTION_FAILED}
Get_Seconds_To_Time
[Arguments] ${date_in_future}
BuiltIn.Should_Not_Be_Equal_As_Numbers ${leader} ${newleader}
${resp_list} = MdsalLowlevelPy.Wait_For_Transactions
: FOR ${resp} IN @{resp_list}
- \ TemplatedRequests.Check_Status_Code ${resp}
+ \ TemplatedRequests.Check_Status_Code ${resp}[2]
${copy_matches} = MdsalLowlevel.Unsubscribe_Dtcl ${listener_node_dst}
${subscribed} = BuiltIn.Set_Variable ${False}
BuiltIn.Should_Be_True ${copy_matches}
BuiltIn.Should_Not_Be_Equal_As_Numbers ${leader} ${newleader}
${resp_list} = MdsalLowlevelPy.Wait_For_Transactions
: FOR ${resp} IN @{resp_list}
- \ TemplatedRequests.Check_Status_Code ${resp}
+ \ TemplatedRequests.Check_Status_Code ${resp}[2]
${copy_matches} = MdsalLowlevel.Unsubscribe_Ddtl ${listener_node_dst}
${subscribed} = BuiltIn.Set_Variable ${False}
BuiltIn.Should_Be_True ${copy_matches}