+
+Add Security Group To VM
+ [Arguments] ${vm} ${sg}
+ [Documentation] Add the security group provided to the given VM.
+ ${rc} ${output}= Run And Return Rc And Output openstack server add security group ${vm} ${sg}
+ Log ${output}
+ Should Not Be True ${rc}
+
+Remove Security Group From VM
+ [Arguments] ${vm} ${sg}
+ [Documentation] Remove the security group provided to the given VM.
+ ${devstack_conn_id}= Get ControlNode Connection
+ Switch Connection ${devstack_conn_id}
+ ${output}= Write Commands Until Prompt And Log openstack server remove security group ${vm} ${sg}
+ Close Connection
+
+Create SFC Flow Classifier
+ [Arguments] ${name} ${src_ip} ${dest_ip} ${protocol} ${dest_port} ${neutron_src_port}
+ [Documentation] Create a flow classifier for SFC
+ ${rc} ${output}= Run And Return Rc And Output openstack sfc flow classifier create --ethertype IPv4 --source-ip-prefix ${src_ip}/32 --destination-ip-prefix ${dest_ip}/32 --protocol ${protocol} --destination-port ${dest_port}:${dest_port} --logical-source-port ${neutron_src_port} ${name}
+ Log ${output}
+ Should Not Be True ${rc}
+ Should Contain ${output} ${name}
+ [Return] ${output}
+
+Delete SFC Flow Classifier
+ [Arguments] ${name}
+ [Documentation] Delete a SFC flow classifier
+ ${devstack_conn_id}= Get ControlNode Connection
+ Switch Connection ${devstack_conn_id}
+ ${rc} ${output}= Run And Return Rc And Output openstack sfc flow classifier delete ${name}
+ Log ${output}
+ Should Not Be True ${rc}
+ [Return] ${output}
+
+Create SFC Port Pair
+ [Arguments] ${name} ${port_in} ${port_out}
+ [Documentation] Creates a neutron port pair for SFC
+ ${devstack_conn_id}= Get ControlNode Connection
+ Switch Connection ${devstack_conn_id}
+ ${rc} ${output}= Run And Return Rc And Output openstack sfc port pair create --ingress=${port_in} --egress=${port_out} ${name}
+ Log ${output}
+ Should Not Be True ${rc}
+ Should Contain ${output} ${name}
+ [Return] ${output}
+
+Delete SFC Port Pair
+ [Arguments] ${name}
+ [Documentation] Delete a SFC port pair
+ ${rc} ${output}= Run And Return Rc And Output openstack sfc port pair delete ${name}
+ Log ${output}
+ Should Not Be True ${rc}
+ [Return] ${output}
+
+Create SFC Port Pair Group
+ [Arguments] ${name} ${port_pair}
+ [Documentation] Creates a port pair group with a single port pair for SFC
+ ${rc} ${output}= Run And Return Rc And Output openstack sfc port pair group create --port-pair ${port_pair} ${name}
+ Log ${output}
+ Should Not Be True ${rc}
+ Should Contain ${output} ${name}
+ [Return] ${output}
+
+Create SFC Port Pair Group With Two Pairs
+ [Arguments] ${name} ${port_pair1} ${port_pair2}
+ [Documentation] Creates a port pair group with two port pairs for SFC
+ ${rc} ${output}= Run And Return Rc And Output openstack sfc port pair group create --port-pair ${port_pair1} --port-pair ${port_pair2} ${name}
+ Log ${output}
+ Should Not Be True ${rc}
+ Should Contain ${output} ${name}
+ [Return] ${output}
+
+Delete SFC Port Pair Group
+ [Arguments] ${name}
+ [Documentation] Delete a SFC port pair group
+ ${devstack_conn_id}= Get ControlNode Connection
+ ${rc} ${output}= Run And Return Rc And Output openstack sfc port pair group delete ${name}
+ Log ${output}
+ Should Not Be True ${rc}
+ [Return] ${output}
+
+Create SFC Port Chain
+ [Arguments] ${name} ${pg1} ${pg2} ${fc}
+ [Documentation] Creates a port pair chain with two port groups and a singel classifier.
+ ${rc} ${output}= Run And Return Rc And Output openstack sfc port chain create --port-pair-group ${pg1} --port-pair-group ${pg2} --flow-classifier ${fc} ${name}
+ Log ${output}
+ Should Not Be True ${rc}
+ Should Contain ${output} ${name}
+ [Return] ${output}
+
+Delete SFC Port Chain
+ [Arguments] ${name}
+ [Documentation] Delete a SFC port chain
+ ${rc} ${output}= Run And Return Rc And Output openstack sfc port chain delete ${name}
+ Log ${output}
+ Should Not Be True ${rc}
+ [Return] ${output}
+
+Reboot Nova VM
+ [Arguments] ${vm_name}
+ [Documentation] Reboot NOVA VM
+ ${rc} ${output}= Run And Return Rc And Output openstack server reboot --wait ${vm_name}
+ Log ${output}
+ Should Not Be True ${rc}
+ Wait Until Keyword Succeeds 35s 10s Verify VM Is ACTIVE ${vm_name}
+
+Remove RSA Key From KnownHosts
+ [Arguments] ${vm_ip}
+ [Documentation] Remove RSA
+ ${devstack_conn_id}= Get ControlNode Connection
+ Switch Connection ${devstack_conn_id}
+ ${output}= Write Commands Until Prompt And Log sudo cat /root/.ssh/known_hosts 30s
+ ${output}= Write Commands Until Prompt And Log sudo ssh-keygen -f "/root/.ssh/known_hosts" -R ${vm_ip} 30s
+ ${output}= Write Commands Until Prompt sudo cat "/root/.ssh/known_hosts" 30s
+
+Wait For Routes To Propogate
+ [Arguments] ${networks} ${subnets}
+ [Documentation] Check propagated routes
+ ${devstack_conn_id} = Get ControlNode Connection
+ Switch Connection ${devstack_conn_id}
+ : FOR ${INDEX} IN RANGE 0 1
+ \ ${net_id}= Get Net Id @{networks}[${INDEX}] ${devstack_conn_id}
+ \ ${is_ipv6}= Get Regexp Matches @{subnets}[${INDEX}] ${IP6_REGEX}
+ \ ${length}= Get Length ${is_ipv6}
+ \ ${cmd}= Set Variable If ${length} == 0 ip route ip -6 route
+ \ ${output}= Write Commands Until Expected Prompt sudo ip netns exec qdhcp-${net_id} ${cmd} ]>
+ \ Should Contain ${output} @{subnets}[${INDEX}]