car people performace suite for 3 node controller 58/34258/12
authorPeter Gubka <pgubka@cisco.com>
Mon, 8 Feb 2016 13:03:10 +0000 (14:03 +0100)
committerGerrit Code Review <gerrit@opendaylight.org>
Mon, 15 Feb 2016 11:35:33 +0000 (11:35 +0000)
the robot is basically taken from
suites/controller/OneNode_Datastore/010_crud_mdsal_perf.robot
and adapted for 3 nodes setup

the perf script is adapted to use more controller ip addresses

Change-Id: I085ae94b0b920cb171ec48d9328abd5d988fc1d8
Signed-off-by: Peter Gubka <pgubka@cisco.com>
csit/suites/controller/ThreeNodes_Datastore/010_crud_mdsal_perf.robot [new file with mode: 0644]
csit/testplans/controller-rest-clust-cars-perf.txt [new file with mode: 0644]
tools/odl-mdsal-clustering-tests/scripts/cluster_rest_script.py

diff --git a/csit/suites/controller/ThreeNodes_Datastore/010_crud_mdsal_perf.robot b/csit/suites/controller/ThreeNodes_Datastore/010_crud_mdsal_perf.robot
new file mode 100644 (file)
index 0000000..ad14914
--- /dev/null
@@ -0,0 +1,150 @@
+*** Settings ***
+Documentation     Test for measuring execution time of MD-SAL DataStore operations in cluster.
+...
+...               Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
+...
+...               This program and the accompanying materials are made available under the
+...               terms of the Eclipse Public License v1.0 which accompanies this distribution,
+...               and is available at http://www.eclipse.org/legal/epl-v10.html
+...
+...               This test suite requires odl-restconf and odl-clustering-test-app modules.
+...               The script cluster_rest_script.py is used for generating requests for
+...               operations on people, car and car-people DataStore test models.
+...               (see the https://wiki.opendaylight.org/view/MD-SAL_Clustering_Test_Plan)
+...
+...               Reported bugs:
+...               https://bugs.opendaylight.org/show_bug.cgi?id=4220
+Suite Setup       Start Suite
+Suite Teardown    Stop Suite
+Test Setup        SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing
+Library           RequestsLibrary
+Library           SSHLibrary
+Library           XML
+Variables         ../../../variables/Variables.py
+Resource          ../../../libraries/Utils.robot
+Resource          ../../../libraries/SetupUtils.robot
+Resource          ../../../libraries/ClusterKeywords.robot
+
+*** Variables ***
+${ITEM_COUNT}     ${10000}
+${ITEM_BATCH}     ${10000}
+${PROCEDURE_TIMEOUT}    5m
+${threads}        6    # threads are assigned to cluster nodes in round robin way
+${addcarcmd}      python cluster_rest_script.py --port ${RESTCONFPORT} add --itemtype car --itemcount ${ITEM_COUNT} --ipr ${ITEM_BATCH}
+${addpeoplecmd}    python cluster_rest_script.py --port ${RESTCONFPORT} add --itemtype people --itemcount ${ITEM_COUNT} --ipr ${ITEM_BATCH}
+${purchasecmd}    python cluster_rest_script.py --port ${RESTCONFPORT} add-rpc --itemtype car-people --itemcount ${ITEM_COUNT} --threads 6
+${carurl}         /restconf/config/car:cars
+${peopleurl}      /restconf/config/people:people
+${carpeopleurl}    /restconf/config/car-people:car-people
+${CONTROLLER_LOG_LEVEL}    INFO
+${TOOL_OPTIONS}    ${EMPTY}
+${SHARD_CAR_NAME}    shard-car-config
+${SHARD_PEOPLE_NAME}    shard-people-config
+${SHARD_CAR_PERSON_NAME}    shard-car-people-config
+
+*** Test Cases ***
+Add Cars
+    [Documentation]    Request to add ${ITEM_COUNT} cars (timeout in ${PROCEDURE_TIMEOUT}).
+    ${car_leader}=    ClusterKeywords.Get Leader And Verify    ${SHARD_CAR_NAME}
+    Start Tool    ${addcarcmd}    --host ${car_leader} ${TOOL_OPTIONS}
+    Wait Until Tool Finish    ${PROCEDURE_TIMEOUT}
+
+Verify Cars
+    [Documentation]    Store logs and verify result
+    Stop Tool
+    Store File To Workspace    cluster_rest_script.log    cluster_rest_script_add_cars.log
+    ${rsp}=    RequestsLibrary.Get Request    session    ${carurl}    headers=${ACCEPT_XML}
+    ${count}=    XML.Get Element Count    ${rsp.content}    xpath=car-entry
+    Should Be Equal As Numbers    ${count}    ${ITEM_COUNT}
+
+Add People
+    [Documentation]    Request to add ${ITEM_COUNT} people (timeout in ${PROCEDURE_TIMEOUT}).
+    ${people_leader}=    ClusterKeywords.Get Leader And Verify    ${SHARD_PEOPLE_NAME}
+    Start Tool    ${addpeoplecmd}    --host ${people_leader} ${TOOL_OPTIONS}
+    Wait Until Tool Finish    ${PROCEDURE_TIMEOUT}
+
+Verify People
+    [Documentation]    Store logs and verify result
+    Stop Tool
+    Store File To Workspace    cluster_rest_script.log    cluster_rest_script_add_people.log
+    ${rsp}=    RequestsLibrary.Get Request    session    ${peopleurl}    headers=${ACCEPT_XML}
+    ${count}=    XML.Get Element Count    ${rsp.content}    xpath=person
+    Should Be Equal As Numbers    ${count}    ${ITEM_COUNT}
+
+Purchase Cars
+    [Documentation]    Request to purchase ${ITEM_COUNT} cars (timeout in ${PROCEDURE_TIMEOUT}).
+    Start Tool    ${purchasecmd}    --host ${ODL_SYSTEM_1_IP},${ODL_SYSTEM_2_IP},${ODL_SYSTEM_3_IP} ${TOOL_OPTIONS}
+    Wait Until Tool Finish    ${PROCEDURE_TIMEOUT}
+
+Verify Purchases
+    [Documentation]    Store logs and verify result
+    Stop Tool
+    Store File To Workspace    cluster_rest_script.log    cluster_rest_script_purchase_cars.log
+    ${rsp}=    RequestsLibrary.Get Request    session    ${carpeopleurl}    headers=${ACCEPT_XML}
+    ${count}=    XML.Get Element Count    ${rsp.content}    xpath=car-person
+    Should Be Equal As Numbers    ${count}    ${ITEM_COUNT}
+    [Teardown]    Report_Failure_Due_To_Bug    4220
+
+Delete Cars
+    [Documentation]    Remove cars from the datastore
+    ${rsp}=    RequestsLibrary.Delete    session    ${carurl}
+    Should Be Equal As Numbers    200    ${rsp.status_code}
+    ${rsp}=    RequestsLibrary.Get Request    session    ${carurl}
+    Should Be Equal As Numbers    404    ${rsp.status_code}
+
+Delete People
+    [Documentation]    Remove people from the datastore
+    ${rsp}=    RequestsLibrary.Delete    session    ${peopleurl}
+    Should Be Equal As Numbers    200    ${rsp.status_code}
+    ${rsp}=    RequestsLibrary.Get Request    session    ${peopleurl}
+    Should Be Equal As Numbers    404    ${rsp.status_code}
+
+Delete CarPeople
+    [Documentation]    Remove car-people entries from the datastore
+    ${rsp}=    RequestsLibrary.Delete    session    ${carpeopleurl}
+    Should Be Equal As Numbers    200    ${rsp.status_code}
+    ${rsp}=    RequestsLibrary.Get Request    session    ${carpeopleurl}
+    Should Be Equal As Numbers    404    ${rsp.status_code}
+
+*** Keywords ***
+Start Suite
+    [Documentation]    Suite setup keyword
+    SetupUtils.Setup_Utils_For_Setup_And_Teardown
+    KarafKeywords.Execute_Controller_Karaf_Command_On_Background    log:set ${CONTROLLER_LOG_LEVEL}
+    ${mininet_conn_id}=    SSHLibrary.Open Connection    ${TOOLS_SYSTEM_IP}    prompt=${DEFAULT_LINUX_PROMPT}    timeout=6s
+    Builtin.Set Suite Variable    ${mininet_conn_id}
+    Utils.Flexible Mininet Login    ${TOOLS_SYSTEM_USER}
+    SSHLibrary.Put File    ${CURDIR}/../../../../tools/odl-mdsal-clustering-tests/scripts/cluster_rest_script.py    .
+    ${stdout}    ${stderr}    ${rc}=    SSHLibrary.Execute Command    ls    return_stdout=True    return_stderr=True
+    ...    return_rc=True
+    RequestsLibrary.Create Session    session    http://${ODL_SYSTEM_IP}:${RESTCONFPORT}    auth=${AUTH}
+
+Stop Suite
+    [Documentation]    Suite teardown keyword
+    SSHLibrary.Close All Connections
+    RequestsLibrary.Delete All Sessions
+
+Start_Tool
+    [Arguments]    ${command}    ${tool_opt}
+    [Documentation]    Start the tool ${command} ${tool_opt}
+    BuiltIn.Log    ${command}
+    ${output}=    SSHLibrary.Write    ${command} ${tool_opt}
+    BuiltIn.Log    ${output}
+
+Wait_Until_Tool_Finish
+    [Arguments]    ${timeout}
+    [Documentation]    Wait ${timeout} for the tool exit.
+    BuiltIn.Wait Until Keyword Succeeds    ${timeout}    1s    SSHLibrary.Read Until Prompt
+
+Stop_Tool
+    [Documentation]    Stop the tool if still running.
+    Utils.Write_Bare_Ctrl_C
+    ${output}=    SSHLibrary.Read    delay=1s
+    BuiltIn.Log    ${output}
+
+Store_File_To_Workspace
+    [Arguments]    ${source_file_name}    ${target_file_name}
+    [Documentation]    Store the ${source_file_name} to the workspace as ${target_file_name}.
+    ${output_log}=    SSHLibrary.Execute_Command    cat ${source_file_name}
+    BuiltIn.Log    ${output_log}
+    Create File    ${target_file_name}    ${output_log}
diff --git a/csit/testplans/controller-rest-clust-cars-perf.txt b/csit/testplans/controller-rest-clust-cars-perf.txt
new file mode 100644 (file)
index 0000000..bfda0c5
--- /dev/null
@@ -0,0 +1,8 @@
+# Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
+#
+# This program and the accompanying materials are made available under the
+# terms of the Eclipse Public License v1.0 which accompanies this distribution,
+# and is available at http://www.eclipse.org/legal/epl-v10.html
+
+# Place the suites in run order:
+integration/test/csit/suites/controller/ThreeNodes_Datastore/010_crud_mdsal_perf.robot
index ce6342d37b23ccdf8b58059240f0dd72003a4c42..7a6d060a964ba8648b3a0bd9111eba173d1253d7 100644 (file)
@@ -241,7 +241,7 @@ def _task_executor(preparing_function, odl_ip="127.0.0.1", port="8181",
     Args:
         :param preparing_function: function to prepare http request object
 
-        :param odl_ip: ip address of ODL; default="127.0.0.1"
+        :param odl_ip: ip address of ODL or comma separated addesses; default="127.0.0.1"
 
         :param port: restconf port; default="8181"
 
@@ -258,6 +258,10 @@ def _task_executor(preparing_function, odl_ip="127.0.0.1", port="8181",
                        {"http_status_code1: "count1", etc.}
     """
 
+    # geting hosts
+    hosts = odl_ip.split(',')
+    nrhosts = len(hosts)
+
     items = [i+1 for i in range(item_count)]
     item_groups = []
     for i in range(0, item_count, items_per_request):
@@ -279,7 +283,7 @@ def _task_executor(preparing_function, odl_ip="127.0.0.1", port="8181",
         thr = threading.Thread(target=_request_sender,
                                args=(i, preparing_function, auth),
                                kwargs={"in_queue": send_queue, "exit_event": exit_event,
-                                       "odl_ip": odl_ip, "port": port,
+                                       "odl_ip": hosts[i % nrhosts], "port": port,
                                        "out_queue": result_queue})
         threads.append(thr)
         thr.start()
@@ -628,7 +632,8 @@ if __name__ == "__main__":
     parser = argparse.ArgumentParser(description="Cluster datastore"
                                                  "performance test script")
     parser.add_argument("--host", default="127.0.0.1",
-                        help="Host where odl controller is running"
+                        help="Host where odl controller is running."
+                             "Or comma separated list of hosts."
                              "(default is 127.0.0.1)")
     parser.add_argument("--port", default="8181",
                         help="Port on which odl's RESTCONF is listening"