... 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
*** 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
${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}
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
[Arguments] ${device_name}
[Documentation] Check that the specified device has no Netconf connectors nor associated data.
Check_Device_Has_No_Netconf_Connector ${device_name}
- ${uri}= Builtin.Set_Variable network-topology:network-topology/topology/topology-netconf/node/${device_name}/yang-ext:mount
+ ${uri}= Builtin.Set_Variable network-topology:network-topology/topology/topology-netconf/node/${device_name}
${response}= RequestsLibrary.Get Request nvr_session ${uri} ${ACCEPT_XML}
BuiltIn.Should_Be_Equal_As_Integers ${response.status_code} 404
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
${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
+ [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
- SSHLibrary.Write java -Xmx1G -XX:MaxPermSize=256M -jar ${filename} --device-count ${device-count} --debug ${debug} ${schemas_option} >testtool.log 2>&1
+ ${command} BuiltIn.Set_Variable java ${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
+ # 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}
# "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
+
+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}