+ : FOR ${i} IN RANGE ${NUM_ODL_SYSTEM}
+ \ KarafKeywords.Issue Command On Karaf Console threads --list | wc -l ${ODL_SYSTEM_${i+1}_IP}
+
+Copy DHCP Files From Control Node
+ [Documentation] Copy the current DHCP files to the robot vm. The keyword must be called
+ ... after the subnet(s) are created and before the subnet(s) are deleted.
+ ${suite_} = BuiltIn.Evaluate """${SUITE_NAME}""".replace(" ","_").replace("/","_").replace(".","_")
+ ${dstdir} = BuiltIn.Set Variable /tmp/qdhcp/${suite_}
+ OperatingSystem.Create Directory ${dstdir}
+ OpenStackOperations.Get ControlNode Connection
+ BuiltIn.Run Keyword And Ignore Error SSHLibrary.Get Directory /opt/stack/data/neutron/dhcp ${dstdir} recursive=True
+
+Is Feature Installed
+ [Arguments] ${features}=none
+ : FOR ${feature} IN @{features}
+ \ ${status} ${output} BuiltIn.Run Keyword And Ignore Error BuiltIn.Should Contain ${CONTROLLERFEATURES} ${feature}
+ \ Return From Keyword If "${status}" == "PASS" True
+ [Return] False
+
+Add OVS Logging On All OpenStack Nodes
+ [Documentation] Add higher levels of OVS logging to all the OpenStack nodes
+ BuiltIn.Run Keyword If 0 < ${NUM_OS_SYSTEM} OVSDB.Add OVS Logging ${OS_CNTL_CONN_ID}
+ BuiltIn.Run Keyword If 1 < ${NUM_OS_SYSTEM} OVSDB.Add OVS Logging ${OS_CMP1_CONN_ID}
+ BuiltIn.Run Keyword If 2 < ${NUM_OS_SYSTEM} OVSDB.Add OVS Logging ${OS_CMP2_CONN_ID}
+
+Reset OVS Logging On All OpenStack Nodes
+ [Documentation] Reset the OVS logging to all the OpenStack nodes
+ BuiltIn.Run Keyword If 0 < ${NUM_OS_SYSTEM} OVSDB.Reset OVS Logging ${OS_CNTL_CONN_ID}
+ BuiltIn.Run Keyword If 1 < ${NUM_OS_SYSTEM} OVSDB.Reset OVS Logging ${OS_CMP1_CONN_ID}
+ BuiltIn.Run Keyword If 2 < ${NUM_OS_SYSTEM} OVSDB.Reset OVS Logging ${OS_CMP2_CONN_ID}
+
+Start Packet Capture On Nodes
+ [Arguments] ${tag} ${filter} @{ips}
+ [Documentation] Wrapper keyword around the TcpDump packet capture that is catered to the Openstack setup.
+ ... The caller must pass the three arguments with a variable number of ips at the end,
+ ... but ${EMPTY} can be used for the tag and filter.
+ ${suite_} = BuiltIn.Evaluate """${SUITE_NAME}""".replace(" ","_").replace("/","_").replace(".","_")
+ ${tag_} = BuiltIn.Catenate SEPARATOR=__ ${tag} ${suite_}
+ @{conn_ids} = Tcpdump.Start Packet Capture on Nodes tag=${tag_} filter=${filter} ips=${ips}
+ [Return] @{conn_ids}
+
+Stop Packet Capture On Nodes
+ [Arguments] ${conn_ids}=@{EMPTY}
+ Tcpdump.Stop Packet Capture on Nodes ${conn_ids}
+
+Server Live Migrate
+ [Arguments] ${vm_instance_name}
+ [Documentation] Keyword for live migration of VM instance
+ ... additional_agrs is to select particular migration(live/shared-migration/block-migration)
+ ... if the additional_agrs is not given default migration(shared-migration) will happen
+ ${output} = OpenStackOperations.OpenStack CLI nova live-migration ${vm_instance_name}
+
+Get Hypervisor Host Of Vm
+ [Arguments] ${vm_name}
+ [Documentation] Show server with neutron request.
+ ${output} = OpenStackOperations.OpenStack CLI openstack server show -f value -c OS-EXT-SRV-ATTR:host ${vm_name}
+ [Return] ${output}
+
+Check If Migration Is Complete
+ [Arguments] ${vm_name}
+ [Documentation] Show server and verify if task_state is not migrating
+ ${output} = OpenStackOperations.OpenStack CLI openstack server show ${vm_name} | grep "OS-EXT-STS:task_state"
+ BuiltIn.Should Not Contain ${output} migrating
+
+Modify OpenStack Configuration File
+ [Arguments] ${conn_id} ${file_name} ${section} ${key} ${value}
+ [Documentation] Use crudini to modify any parameter in any Openstack configuration File
+ SSHLibrary.Switch Connection ${conn_id}
+ ${output} ${rc} = SSHLibrary.Execute Command sudo crudini --verbose --set --inplace ${file_name} ${section} ${key} ${value} return_rc=True return_stdout=True
+ BuiltIn.Log ${output}
+ BuiltIn.Should Be True '${rc}' == '0'
+
+Restart DevStack Service
+ [Arguments] ${conn_id} ${service_name}
+ [Documentation] Restart the Openstack Service
+ SSHLibrary.Switch Connection ${conn_id}
+ ${output} ${rc} = SSHLibrary.Execute Command sudo systemctl restart devstack@${service_name}.service return_rc=True return_stdout=True
+ BuiltIn.Log ${output}
+ BuiltIn.Should Be True '${rc}' == '0'
+
+Get Network Segmentation Id
+ [Arguments] ${network_name}
+ [Documentation] Returns network segmentation id for the given network name.
+ ${output} = OpenStack CLI openstack network show ${network_name} | grep segmentation_id | awk '{print $4}'
+ @{list} = String.Split String ${output}
+ [Return] @{list}[0]
+
+Verify Expected Default Tables On Nodes
+ [Arguments] ${node_ips}=@{OS_ALL_IPS}
+ [Documentation] Verify if Default Table Entries are programmed on all Nodes
+ : FOR ${node_ip} IN @{node_ips}
+ \ Verify Expected Default Tables ${node_ip}
+
+Verify Expected Default Tables
+ [Arguments] ${ovs_ip}
+ [Documentation] Verify if Default Table Entries are programmed on specific Node
+ ${flow_dump} = Utils.Write Commands Until Expected Prompt sudo ovs-ofctl dump-flows ${INTEGRATION_BRIDGE} -OOpenFlow13 ${DEFAULT_LINUX_PROMPT_STRICT}
+ BuiltIn.Log ${flow_dump}
+ : FOR ${table} IN @{DEFAULT_FLOW_TABLES}
+ \ Builtin.Should Match Regexp ${flow_dump} .*table=${table}.*priority=0
+
+Get Project Id
+ [Arguments] ${project_name}
+ [Documentation] Returns project ID for the given project name.
+ ${project_id} = OpenStack CLI openstack project show ${project_name} -f value -c id
+ [Return] ${project_id}
+
+Set Instance Quota For Project
+ [Arguments] ${num_instances} ${project_id}
+ [Documentation] Set quota for the created instances using the specific project id.
+ ${output} = OpenStack CLI openstack quota set --instances ${num_instances} ${project_id}
+ [Return] ${output}