Add ability to compose java command according to version
[integration/test.git] / csit / libraries / NetconfKeywords.robot
index b06b4d26efc2e53b5cf9338221c62dd3744b037a..234f99d8f10404ca4e6bee78344e7e235670ee80 100644 (file)
@@ -12,13 +12,21 @@ Documentation     Perform complex operations on netconf.
 ...               netconf operations into reusable keywords to make writing netconf
 ...               test suites easier.
 Library           Collections
+Library           DateTime
 Library           RequestsLibrary
 Resource          NetconfViaRestconf.robot
+Resource          NexusKeywords.robot
 Resource          SSHKeywords.robot
+Resource          Utils.robot
 
 *** Variables ***
+${TESTTOOL_DEFAULT_JAVA_OPTIONS}    -Xmx1G -XX:MaxPermSize=256M -Dorg.apache.sshd.registerBouncyCastle=false
 ${DIRECTORY_WITH_DEVICE_TEMPLATES}    ${CURDIR}/../variables/netconf/device
 ${FIRST_TESTTOOL_PORT}    17830
+${BASE_NETCONF_DEVICE_PORT}    17830
+${DEVICE_NAME_BASE}    netconf-scaling-device
+${TESTTOOL_DEVICE_TIMEOUT}    60s
+${ENABLE_NETCONF_TEST_TIMEOUT}    ${ENABLE_GLOBAL_TEST_DEADLINES}
 
 *** Keywords ***
 Setup_NetconfKeywords
@@ -26,25 +34,33 @@ Setup_NetconfKeywords
     ${tmp}=    BuiltIn.Create_Dictionary
     BuiltIn.Set_Suite_Variable    ${NetconfKeywords__mounted_device_types}    ${tmp}
     NetconfViaRestconf.Setup_Netconf_Via_Restconf
+    NexusKeywords.Initialize_Artifact_Deployment_And_Usage
 
 Configure_Device_In_Netconf
-    [Arguments]    ${device_name}    ${device_type}=default    ${device_port}=${FIRST_TESTTOOL_PORT}
+    [Arguments]    ${device_name}    ${device_type}=default    ${device_port}=${FIRST_TESTTOOL_PORT}    ${device_address}=${TOOLS_SYSTEM_IP}    ${device_user}=admin    ${device_password}=topsecret
     [Documentation]    Tell Netconf about the specified device so it can add it into its configuration.
-    ${template_as_string}=    BuiltIn.Set_Variable    {'DEVICE_IP': '${TOOLS_SYSTEM_IP}', 'DEVICE_NAME': '${device_name}', 'DEVICE_PORT': '${device_port}'}
+    ${template_as_string}=    BuiltIn.Set_Variable    {'DEVICE_IP': '${device_address}', 'DEVICE_NAME': '${device_name}', 'DEVICE_PORT': '${device_port}', 'DEVICE_USER': '${device_user}', 'DEVICE_PASSWORD': '${device_password}'}
     NetconfViaRestconf.Put_Xml_Template_Folder_Via_Restconf    ${DIRECTORY_WITH_DEVICE_TEMPLATES}${/}${device_type}    ${template_as_string}
     Collections.Set_To_Dictionary    ${NetconfKeywords__mounted_device_types}    ${device_name}    ${device_type}
 
 Count_Netconf_Connectors_For_Device
     [Arguments]    ${device_name}
-    [Documentation]    Count all Netconf connectors referring to the specified device (usually 0 or 1).
-    ${mounts}=    Utils.Get_Data_From_URI    operational    network-topology:network-topology/topology/topology-netconf
+    [Documentation]    Count all instances of the specified device in the Netconf topology (usually 0 or 1).
+    # FIXME: This no longer counts netconf connectors, it counts "device instances in Netconf topology".
+    # This keyword should be renamed but without an automatic keyword naming standards checker this is
+    # potentially destabilizing change so right now it is as FIXME. Proposed new name:
+    # Count_Device_Instances_In_Netconf_Topology
+    ${mounts}=    NetconfViaRestconf.Get_Operational_Data_From_URI    network-topology:network-topology/topology/topology-netconf
     Builtin.Log    ${mounts}
     ${actual_count}=    Builtin.Evaluate    len('''${mounts}'''.split('"node-id":"${device_name}"'))-1
     Builtin.Return_From_Keyword    ${actual_count}
 
 Check_Device_Has_No_Netconf_Connector
     [Arguments]    ${device_name}
-    [Documentation]    Check that there are no Netconf connectors referring to the specified device.
+    [Documentation]    Check that there are no instances of the specified device in the Netconf topology.
+    # FIXME: Similarlt to "Count_Netconf_Connectors_For_Device", this does not check whether the device has
+    # no netconf connector but whether the device is present in the netconf topology or not. Rename, proposed
+    # new name: Check_Device_Not_Present_In_Netconf_Topology
     ${count}    Count_Netconf_Connectors_For_Device    ${device_name}
     Builtin.Should_Be_Equal_As_Strings    ${count}    0
 
@@ -59,7 +75,7 @@ Check_Device_Completely_Gone
 Check_Device_Connected
     [Arguments]    ${device_name}
     [Documentation]    Check that the specified device is accessible from Netconf.
-    ${device_status}=    Utils.Get_Data_From_URI    operational    network-topology:network-topology/topology/topology-netconf/node/${device_name}
+    ${device_status}=    NetconfViaRestconf.Get_Operational_Data_From_URI    network-topology:network-topology/topology/topology-netconf/node/${device_name}
     Builtin.Should_Contain    ${device_status}    "netconf-node-topology:connection-status":"connected"
 
 Wait_Device_Connected
@@ -120,32 +136,31 @@ NetconfKeywords__Check_Device_Is_Up
     ${count}=    SSHKeywords.Count_Port_Occurences    ${last-port}    LISTEN    java
     BuiltIn.Should_Be_Equal_As_Integers    ${count}    1
 
+NetconfKeywords__Wait_Device_Is_Up_And_Running
+    [Arguments]    ${device_name}
+    ${number}=    BuiltIn.Evaluate    '${device_name}'.split('-').pop()
+    BuiltIn.Wait_Until_Keyword_Succeeds    ${TESTTOOL_DEVICE_TIMEOUT}    1s    Check_Device_Up_And_Running    ${number}
+
 Install_And_Start_Testtool
-    [Arguments]    ${device-count}=10    ${debug}=true    ${schemas}=none    ${options}=${EMPTY}
+    [Arguments]    ${device-count}=10    ${debug}=true    ${schemas}=none    ${tool_options}=${EMPTY}    ${java_options}=${TESTTOOL_DEFAULT_JAVA_OPTIONS}    ${mdsal}=true
     [Documentation]    Install and run testtool. Also arrange to collect its output into a log file.
     ...    When the ${schemas} argument is set to 'none', it signifies that
     ...    there are no additional schemas to be deployed, so the directory
     ...    for the additional schemas is deleted on the remote machine and
     ...    the additional schemas argument is left out.
     # Install test tool on the machine.
-    # TODO: The "urlbase" line is very similar to what pcep suites do. Reduce this code duplication.
-    ${urlbase}=    BuiltIn.Set_Variable    ${NEXUSURL_PREFIX}/content/repositories/opendaylight.snapshot/org/opendaylight/netconf/netconf-testtool
-    ${version}=    SSHLibrary.Execute_Command    curl ${urlbase}/maven-metadata.xml | grep '<version>' | cut -d '>' -f 2 | cut -d '<' -f 1
-    BuiltIn.Log    ${version}
-    ${namepart}=    SSHLibrary.Execute_Command    curl ${urlbase}/${version}/maven-metadata.xml | grep value | head -n 1 | cut -d '>' -f 2 | cut -d '<' -f 1
-    BuiltIn.Log    ${namepart}
-    BuiltIn.Set_Suite_Variable    ${filename}    netconf-testtool-${namepart}-executable.jar
-    BuiltIn.Log    ${filename}
-    ${response}=    SSHLibrary.Execute_Command    curl ${urlbase}/${version}/${filename} >${filename}
-    BuiltIn.Log    ${response}
+    ${filename}=    NexusKeywords.Deploy_Test_Tool    netconf    netconf-testtool
     ${schemas_option}=    NetconfKeywords__Deploy_Additional_Schemas    ${schemas}
     # Start the testtool
-    ${command}    BuiltIn.Set_Variable    java -Xmx1G -XX:MaxPermSize=256M -jar ${filename} ${options} --device-count ${device-count} --debug ${debug} ${schemas_option}
+    ${command}=    NexusKeywords.Compose_Full_Java_Command    ${java_options} -jar ${filename} ${tool_options} --device-count ${device-count} --debug ${debug} ${schemas_option} --md-sal ${mdsal}
     BuiltIn.Log    Running testtool: ${command}
-    SSHLibrary.Write    ${command} >testtool.log 2>&1
+    ${logfile}=    Utils.Get_Log_File_Name    testtool
+    BuiltIn.Set_Suite_Variable    ${testtool_log}    ${logfile}
+    SSHLibrary.Write    ${command} >${logfile} 2>&1
+    # Store information needed by other keywords.
+    BuiltIn.Set_Suite_Variable    ${NetconfKeywords__testtool_device_count}    ${device-count}
     # Wait for the testtool to boot up.
-    ${timeout}=    BuiltIn.Evaluate    (${device-count}/3)+5
-    BuiltIn.Wait_Until_Keyword_Succeeds    ${timeout}s    1s    NetconfKeywords__Check_Device_Is_Up    ${FIRST_TESTTOOL_PORT}
+    Perform_Operation_On_Each_Device    NetconfKeywords__Wait_Device_Is_Up_And_Running
 
 Check_Device_Up_And_Running
     [Arguments]    ${device-number}
@@ -161,4 +176,26 @@ Stop_Testtool
     # TODO: Maybe this keyword's content shall be moved into SSHUtils and named somewhat like
     # "Interrupt_Program_And_Download_Its_Log" which will get an argument stating the name of
     # the log file to get.
-    SSHLibrary.Get_File    testtool.log
+    SSHLibrary.Get_File    ${testtool_log}
+
+NetconfKeywords__Check_Netconf_Test_Timeout_Not_Expired
+    [Arguments]    ${deadline_Date}
+    BuiltIn.Return_From_Keyword_If    not ${ENABLE_NETCONF_TEST_TIMEOUT}
+    ${current_Date}=    DateTime.Get_Current_Date
+    ${ellapsed_seconds}=    DateTime.Subtract_Date_From_Date    ${deadline_Date}    ${current_Date}
+    BuiltIn.Run_Keyword_If    ${ellapsed_seconds}<0    Fail    The global time out period expired
+
+NetconfKeywords__Perform_Operation_With_Checking_On_Next_Device
+    [Arguments]    ${operation}    ${deadline_Date}
+    NetconfKeywords__Check_Netconf_Test_Timeout_Not_Expired    ${deadline_Date}
+    ${number}=    BuiltIn.Evaluate    ${current_port}-${BASE_NETCONF_DEVICE_PORT}+1
+    BuiltIn.Run_Keyword    ${operation}    ${DEVICE_NAME_BASE}-${number}
+    ${next}=    BuiltIn.Evaluate    ${current_port}+1
+    BuiltIn.Set_Suite_Variable    ${current_port}    ${next}
+
+Perform_Operation_On_Each_Device
+    [Arguments]    ${operation}    ${count}=${NetconfKeywords__testtool_device_count}    ${timeout}=30m
+    ${current_Date}=    DateTime.Get_Current_Date
+    ${deadline_Date}=    DateTime.Add_Time_To_Date    ${current_Date}    ${timeout}
+    BuiltIn.Set_Suite_Variable    ${current_port}    ${BASE_NETCONF_DEVICE_PORT}
+    BuiltIn.Repeat_Keyword    ${count} times    NetconfKeywords__Perform_Operation_With_Checking_On_Next_Device    ${operation}    ${deadline_Date}