+ \ ${net_id} = OpenStackOperations.Get Net Id @{networks}[${INDEX}]
+ \ ${is_ipv6} = String.Get Regexp Matches @{subnets}[${INDEX}] ${IP6_REGEX}
+ \ ${length} = BuiltIn.Get Length ${is_ipv6}
+ \ ${cmd} = BuiltIn.Set Variable If ${length} == 0 ip route ip -6 route
+ \ ${output} = Utils.Write Commands Until Expected Prompt sudo ip netns exec qdhcp-${net_id} ${cmd} ${DEFAULT_LINUX_PROMPT_STRICT}
+ \ BuiltIn.Should Contain ${output} @{subnets}[${INDEX}]
+
+Neutron Cleanup
+ [Arguments] ${vms}=@{EMPTY} ${networks}=@{EMPTY} ${subnets}=@{EMPTY} ${ports}=@{EMPTY} ${sgs}=@{EMPTY}
+ : FOR ${vm} IN @{vms}
+ \ BuiltIn.Run Keyword And Ignore Error Delete Vm Instance ${vm}
+ : FOR ${port} IN @{ports}
+ \ BuiltIn.Run Keyword And Ignore Error Delete Port ${port}
+ : FOR ${subnet} IN @{subnets}
+ \ BuiltIn.Run Keyword And Ignore Error Delete SubNet ${subnet}
+ : FOR ${network} IN @{networks}
+ \ BuiltIn.Run Keyword And Ignore Error Delete Network ${network}
+ : FOR ${sg} IN @{sgs}
+ \ BuiltIn.Run Keyword And Ignore Error Delete SecurityGroup ${sg}
+
+OpenStack List All
+ [Documentation] Get a list of different OpenStack resources that might be in use.
+ @{modules} = BuiltIn.Create List server port network subnet security group
+ ... security group rule floating ip router
+ : FOR ${module} IN @{modules}
+ \ ${output} = OpenStack CLI openstack ${module} list
+
+OpenStack CLI Get List
+ [Arguments] ${cmd}
+ [Documentation] Return a json list from the output of an OpenStack command.
+ @{list} = BuiltIn.Create List
+ ${json} = OpenStack CLI ${cmd}
+ @{list} = RequestsLibrary.To Json ${json}
+ BuiltIn.Log ${list}
+ [Return] @{list}
+
+OpenStack CLI
+ [Arguments] ${cmd}
+ [Documentation] Run the given OpenStack ${cmd} and log the output.
+ ${rc} ${output} = OperatingSystem.Run And Return Rc And Output ${cmd}
+ BuiltIn.Log ${output}
+ BuiltIn.Should Be True '${rc}' == '0'
+ [Return] ${output}
+
+OpenStack CLI With No Log
+ [Arguments] ${cmd}
+ [Documentation] Run the given OpenStack ${cmd} and do not log the output.
+ ${rc} ${output} = OperatingSystem.Run And Return Rc And Output ${cmd}
+ BuiltIn.Should Be True '${rc}' == '0'
+ [Return] ${output}
+
+OpenStack Cleanup All
+ [Documentation] Cleanup all Openstack resources with best effort. The keyword will query for all resources
+ ... in use and then attempt to delete them. Errors are ignored to allow the cleanup to continue.
+ @{fips} = OpenStack CLI Get List openstack floating ip list -f json
+ : FOR ${fip} IN @{fips}
+ \ BuiltIn.Run Keyword And Ignore Error Delete Floating IP ${fip['ID']}
+ @{vms} = OpenStack CLI Get List openstack server list -f json
+ : FOR ${vm} IN @{vms}
+ \ BuiltIn.Run Keyword And Ignore Error Delete Vm Instance ${vm['ID']}
+ @{routers} = OpenStack CLI Get List openstack router list -f json
+ : FOR ${router} IN @{routers}
+ \ BuiltIn.Run Keyword And Ignore Error Cleanup Router ${router['ID']}
+ @{ports} = OpenStack CLI Get List openstack port list -f json
+ : FOR ${port} IN @{ports}
+ \ BuiltIn.Run Keyword And Ignore Error Delete Port ${port['ID']}
+ @{networks} = OpenStack CLI Get List openstack network list -f json
+ : FOR ${network} IN @{networks}
+ \ BuiltIn.Run Keyword And Ignore Error Delete Subnet ${network['Subnets']}
+ \ BuiltIn.Run Keyword And Ignore Error Delete Network ${network['ID']}
+ @{security_groups} = OpenStack CLI Get List openstack security group list -f json
+ : FOR ${security_group} IN @{security_groups}
+ \ BuiltIn.Run Keyword If "${security_group['Name']}" != "default" BuiltIn.Run Keyword And Ignore Error Delete SecurityGroup ${security_group['ID']}
+ OpenStack List All
+
+Cleanup Router
+ [Arguments] ${id}
+ [Documentation] Delete a router, but first remove any interfaces or gateways so that the delete will be successful.
+ @{ports} = OpenStack CLI Get List openstack port list --router ${id} -f json --long
+ : FOR ${port} IN @{ports}
+ \ ${subnet_id} = OpenStackOperations.Get Match ${port['Fixed IP Addresses']} ${REGEX_UUID} 0
+ \ BuiltIn.Run Keyword If "${port['Device Owner']}" == "network:router_gateway" BuiltIn.Run Keyword And Ignore Error Remove Gateway ${id}
+ \ BuiltIn.Run Keyword If "${port['Device Owner']}" == "network:router_interface" BuiltIn.Run Keyword And Ignore Error Remove Interface ${id} ${subnet_id}
+ BuiltIn.Run Keyword And Ignore Error Delete Router ${id}
+
+OpenStack Suite Setup
+ [Documentation] Wrapper teardown keyword that can be used in any suite running in an openstack environement
+ SetupUtils.Setup_Utils_For_Setup_And_Teardown
+ @{loggers} = BuiltIn.Create List org.apache.karaf.shell.support.ShellUtil org.apache.sshd.server.session.ServerSessionImpl
+ Setuputils.Setup_Logging_For_Debug_Purposes_On_List_Or_All OFF ${loggers}
+ DevstackUtils.Devstack Suite Setup
+ @{tcpdump_port_6653_conn_ids} = OpenStackOperations.Start Packet Capture On Nodes tcpdump_port_6653 port 6653 @{OS_ALL_IPS}
+ BuiltIn.Set Suite Variable @{tcpdump_port_6653_conn_ids}
+ BuiltIn.Run Keyword If "${PRE_CLEAN_OPENSTACK_ALL}"=="True" OpenStack Cleanup All
+ OpenStackOperations.Add OVS Logging On All OpenStack Nodes
+ ClusterManagement.Dump_Local_Shards_For_Each_Member
+ Verify Expected Default Tables On Nodes
+
+OpenStack Suite Teardown
+ [Documentation] Wrapper teardown keyword that can be used in any suite running in an openstack environement
+ ... to clean up all openstack resources. For example, all instances, networks, ports, etc will be listed and
+ ... and deleted. As other global cleanup tasks are needed, they can be added here and the suites will all
+ ... benefit automatically.
+ OpenStack Cleanup All
+ OpenStackOperations.Stop Packet Capture On Nodes ${tcpdump_port_6653_conn_ids}
+ SSHLibrary.Close All Connections
+ : 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}