Improve dom data broker test templates 24/58424/3
authorPeter Gubka <pgubka@cisco.com>
Wed, 7 Jun 2017 15:26:11 +0000 (17:26 +0200)
committerVratko Polák <vrpolak@cisco.com>
Mon, 12 Jun 2017 09:01:57 +0000 (09:01 +0000)
with request response pairing

Change-Id: Id2d59abf2bf6b73fe659948d872dc9639b726f42
Signed-off-by: Peter Gubka <pgubka@cisco.com>
csit/libraries/MdsalLowlevelPy.py
csit/libraries/controller/DdbCommons.robot

index 48da723c4d8eb89698eba2f616672d7f130d5b4e..70ff6476c8575c0fc0d980c71b02332295a526f6 100644 (file)
@@ -2,6 +2,7 @@
 Python invocation of several parallel publish-notifications RPCs.
 """
 from robot.api import logger
+import time
 import Queue
 import requests
 import string
@@ -11,11 +12,13 @@ import threading
 _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
@@ -23,14 +26,14 @@ def _send_http_request_thread_impl(rqueue, url, data, http_timeout):
     :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):
@@ -56,7 +59,7 @@ 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)
@@ -139,7 +142,11 @@ def start_produce_transactions_on_nodes(host_list, prefix_list, id_prefix,
 
 
 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')
 
@@ -150,22 +157,24 @@ def wait_for_transactions():
     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
index c36e060730ddb0e692a0adf2d6689292870b48df..503880417274318f71f85fcc7aa3feaf87fd4e31 100644 (file)
@@ -9,6 +9,8 @@ Documentation     DOMDataBroker testing: Common keywords
 ...
 ...               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
@@ -56,7 +58,7 @@ Explicit_Leader_Movement_Test_Templ
     ...    ${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}
@@ -72,7 +74,7 @@ Explicit_Leader_Movement_PrefBasedShard_Test_Templ
     ...    ${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}
@@ -97,7 +99,7 @@ Clean_Leader_Shutdown_Test_Templ
     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}
@@ -118,7 +120,7 @@ Clean_Leader_Shutdown_PrefBasedShard_Test_Templ
     # 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}
@@ -205,7 +207,7 @@ Leader_Isolation_Heal_Within_Rt
     ...    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}
@@ -222,7 +224,7 @@ Module_Leader_Isolation_Heal_Default
     ...    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}
@@ -238,7 +240,7 @@ Prefix_Leader_Isolation_Heal_Default
     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}
@@ -296,7 +298,7 @@ Ongoing_Transactions_Not_Failed_Yet
 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}
@@ -324,7 +326,7 @@ Remote_Listener_Test_Templ
     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}
@@ -352,7 +354,7 @@ Remote_Listener_PrefBasedShard_Test_Templ
     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}