+
+Get Ports MacAddr
+ [Arguments] ${portName_list}
+ [Documentation] Retrieve the port MacAddr for the given list of port name and return the MAC address list.
+ ${devstack_conn_id}= Get ControlNode Connection
+ Switch Connection ${devstack_conn_id}
+ ${MacAddr-list} Create List
+ : FOR ${portName} IN @{portName_list}
+ \ ${macAddr}= OpenStackOperations.Get Port Mac ${portName} ${devstack_conn_id}
+ \ Append To List ${MacAddr-list} ${macAddr}
+ [Return] ${MacAddr-list}
+
+Get Port Ip
+ [Arguments] ${port_name}
+ [Documentation] Keyword would return the IP of the ${port_name} received.
+ Switch Connection ${devstack_conn_id}
+ ${output}= Write Commands Until Prompt neutron port-list | grep "${port_name}" | awk '{print $11}' | awk -F "\\"" '{print $2}' 30s
+ Log ${output}
+ ${splitted_output}= Split String ${output} ${EMPTY}
+ ${port_ip}= Get from List ${splitted_output} 0
+ Log ${port_ip}
+ [Return] ${port_ip}
+
+Get Port Mac
+ [Arguments] ${port_name} ${conn_id}=${devstack_conn_id}
+ [Documentation] Keyword would return the MAC ID of the ${port_name} received.
+ Switch Connection ${conn_id}
+ ${output}= Write Commands Until Prompt neutron port-list | grep "${port_name}" | awk '{print $6}' 30s
+ Log ${output}
+ ${splitted_output}= Split String ${output} ${EMPTY}
+ ${port_mac}= Get from List ${splitted_output} 0
+ Log ${port_mac}
+ [Return] ${port_mac}
+
+Create L2Gateway
+ [Arguments] ${bridge_name} ${intf_name} ${gw_name}
+ [Documentation] Keyword to create an L2 Gateway ${gw_name} for bridge ${bridge_name} connected to interface ${intf_name} (Using Neutron CLI).
+ Switch Connection ${devstack_conn_id}
+ ${l2gw_output}= Write Commands Until Prompt ${L2GW_CREATE} name=${bridge_name},interface_names=${intf_name} ${gw_name} 30s
+ Log ${l2gw_output}
+ [Return] ${l2gw_output}
+
+Create L2Gateway Connection
+ [Arguments] ${gw_name} ${net_name}
+ [Documentation] Keyword would create a new L2 Gateway Connection for ${gw_name} to ${net_name} (Using Neutron CLI).
+ Switch Connection ${devstack_conn_id}
+ ${l2gw_output}= Write Commands Until Prompt ${L2GW_CONN_CREATE} ${gw_name} ${net_name} 30s
+ Log ${l2gw_output}
+ [Return] ${l2gw_output}
+
+Get All L2Gateway
+ [Documentation] Keyword to return all the L2 Gateways available (Using Neutron CLI).
+ Switch Connection ${devstack_conn_id}
+ ${output}= Write Commands Until Prompt ${L2GW_GET_YAML} 30s
+ [Return] ${output}
+
+Get All L2Gateway Connection
+ [Documentation] Keyword to return all the L2 Gateway connections available (Using Neutron CLI).
+ Switch Connection ${devstack_conn_id}
+ ${output}= Write Commands Until Prompt ${L2GW_GET_CONN_YAML} 30s
+ [Return] ${output}
+
+Get L2Gateway
+ [Arguments] ${gw_id}
+ [Documentation] Keyword to check if the ${gw_id} is available in the L2 Gateway list (Using Neutron CLI).
+ Switch Connection ${devstack_conn_id}
+ ${output}= Write Commands Until Prompt ${L2GW_SHOW} ${gw_id} 30s
+ Log ${output}
+ [Return] ${output}
+
+Get L2gw Id
+ [Arguments] ${l2gw_name}
+ [Documentation] Keyword to retrieve the L2 Gateway ID for the ${l2gw_name} (Using Neutron CLI).
+ Switch Connection ${devstack_conn_id}
+ ${output}= Write Commands Until Prompt ${L2GW_GET} | grep "${l2gw_name}" | awk '{print $2}' 30s
+ Log ${output}
+ ${splitted_output}= Split String ${output} ${EMPTY}
+ ${l2gw_id}= Get from List ${splitted_output} 0
+ Log ${l2gw_id}
+ [Return] ${l2gw_id}
+
+Get L2gw Connection Id
+ [Arguments] ${l2gw_name}
+ [Documentation] Keyword to retrieve the L2 Gateway Connection ID for the ${l2gw_name} (Using Neutron CLI).
+ Switch Connection ${devstack_conn_id}
+ ${l2gw_id}= OpenStackOperations.Get L2gw Id ${l2gw_name}
+ ${output}= Write Commands Until Prompt ${L2GW_GET_CONN} | grep "${l2gw_id}" | awk '{print $2}' 30s
+ Log ${output}
+ ${splitted_output}= Split String ${output} ${EMPTY}
+ ${l2gw_conn_id}= Get from List ${splitted_output} 0
+ Log ${l2gw_conn_id}
+ [Return] ${l2gw_conn_id}
+
+Neutron Port List Rest
+ [Documentation] Keyword to get all ports details in Neutron (Using REST).
+ ${resp} = RequestsLibrary.Get Request session ${PORT_URL}
+ Log ${resp.content}
+ Should Be Equal As Strings ${resp.status_code} 200
+ [Return] ${resp.content}
+
+Get Neutron Port Rest
+ [Arguments] ${port_id}
+ [Documentation] Keyword to get the specific port details in Neutron (Using REST).
+ ${resp} = RequestsLibrary.Get Request session ${CONFIG_API}/${GET_PORT_URL}/${port_id}
+ Log ${resp.content}
+ Should Be Equal As Strings ${resp.status_code} 200
+ [Return] ${resp.content}
+
+Update Port Rest
+ [Arguments] ${port_id} ${json_data}
+ [Documentation] Keyword to update ${port_id} with json data received in ${json_data} (Using REST).
+ Log ${json_data}
+ ${resp} = RequestsLibrary.Put Request session ${CONFIG_API}/${GET_PORT_URL}/${port_id} ${json_data}
+ Log ${resp.content}
+ Should Be Equal As Strings ${resp.status_code} 200
+ [Return] ${resp.content}
+
+Create And Configure Security Group
+ [Arguments] ${sg-name}
+ Neutron Security Group Create ${sg-name}
+ Neutron Security Group Rule Create ${sg-name} direction=ingress port_range_max=65535 port_range_min=1 protocol=tcp remote_ip_prefix=0.0.0.0/0
+ Neutron Security Group Rule Create ${sg-name} direction=egress port_range_max=65535 port_range_min=1 protocol=tcp remote_ip_prefix=0.0.0.0/0
+ Neutron Security Group Rule Create ${sg-name} direction=ingress protocol=icmp remote_ip_prefix=0.0.0.0/0
+ Neutron Security Group Rule Create ${sg-name} direction=egress protocol=icmp remote_ip_prefix=0.0.0.0/0
+ Neutron Security Group Rule Create ${sg-name} direction=ingress port_range_max=65535 port_range_min=1 protocol=udp remote_ip_prefix=0.0.0.0/0
+ Neutron Security Group Rule Create ${sg-name} direction=egress port_range_max=65535 port_range_min=1 protocol=udp remote_ip_prefix=0.0.0.0/0
+
+Create SFC Flow Classifier
+ [Arguments] ${name} ${src_ip} ${dest_ip} ${protocol} ${dest_port} ${neutron_src_port}
+ [Documentation] Create a flow classifier for SFC
+ ${devstack_conn_id}= Get ControlNode Connection
+ Switch Connection ${devstack_conn_id}
+ ${cmd}= Set Variable neutron 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 ${cmd}
+ ${output}= Write Commands Until Prompt ${cmd} 30s
+ Log ${output}
+ Close Connection
+ Should Contain ${output} Created a new flow_classifier
+ [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}
+ ${cmd}= Set Variable neutron flow-classifier-delete ${name}
+ Log ${cmd}
+ ${output}= Write Commands Until Prompt ${cmd} 30s
+ Log ${output}
+ Close Connection
+ Should Contain ${output} Deleted flow_classifier
+ [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}
+ ${cmd}= Set Variable neutron port-pair-create --ingress=${port_in} --egress=${port_out} ${name}
+ Log ${cmd}
+ ${output}= Write Commands Until Prompt ${cmd} 30s
+ Log ${output}
+ Close Connection
+ Should Contain ${output} Created a new port_pair
+ [Return] ${output}
+
+Delete SFC Port Pair
+ [Arguments] ${name}
+ [Documentation] Delete a SFC port pair
+ ${devstack_conn_id}= Get ControlNode Connection
+ Switch Connection ${devstack_conn_id}
+ ${cmd}= Set Variable neutron port-pair-delete ${name}
+ Log ${cmd}
+ ${output}= Write Commands Until Prompt ${cmd} 30s
+ Log ${output}
+ Close Connection
+ Should Contain ${output} Deleted port_pair
+ [Return] ${output}
+
+Create SFC Port Pair Group
+ [Arguments] ${name} ${port_pair}
+ [Documentation] Creates a port pair group with a single port pair for SFC
+ ${devstack_conn_id}= Get ControlNode Connection
+ Switch Connection ${devstack_conn_id}
+ ${cmd}= Set Variable neutron port-pair-group-create --port-pair ${port_pair} ${name}
+ Log ${cmd}
+ ${output}= Write Commands Until Prompt ${cmd} 30s
+ Log ${output}
+ Close Connection
+ Should Contain ${output} Created a new port_pair_group
+ [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
+ ${devstack_conn_id}= Get ControlNode Connection
+ Switch Connection ${devstack_conn_id}
+ ${cmd}= Set Variable neutron port-pair-group-create --port-pair ${port_pair1} --port-pair ${port_pair2} ${name}
+ Log ${cmd}
+ ${output}= Write Commands Until Prompt ${cmd} 30s
+ Log ${output}
+ Close Connection
+ Should Contain ${output} Created a new port_pair_group
+ [Return] ${output}
+
+Delete SFC Port Pair Group
+ [Arguments] ${name}
+ [Documentation] Delete a SFC port pair group
+ ${devstack_conn_id}= Get ControlNode Connection
+ Switch Connection ${devstack_conn_id}
+ ${cmd}= Set Variable neutron port-pair-group-delete ${name}
+ Log ${cmd}
+ ${output}= Write Commands Until Prompt ${cmd} 30s
+ Log ${output}
+ Close Connection
+ Should Contain ${output} Deleted port_pair_group
+ [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.
+ ${devstack_conn_id}= Get ControlNode Connection
+ Switch Connection ${devstack_conn_id}
+ ${cmd}= Set Variable neutron port-chain-create --port-pair-group ${pg1} --port-pair-group ${pg2} --flow-classifier ${fc} ${name}
+ Log ${cmd}
+ ${output}= Write Commands Until Prompt ${cmd} 30s
+ Log ${output}
+ Close Connection
+ Should Contain ${output} Created a new port_chain
+ [Return] ${output}
+
+Delete SFC Port Chain
+ [Arguments] ${name}
+ [Documentation] Delete a SFC port chain
+ ${devstack_conn_id}= Get ControlNode Connection
+ Switch Connection ${devstack_conn_id}
+ ${cmd}= Set Variable neutron port-chain-delete ${name}
+ Log ${cmd}
+ ${output}= Write Commands Until Prompt ${cmd} 30s
+ Log ${output}
+ Close Connection
+ Should Contain ${output} Deleted port_chain
+ [Return] ${output}
+
+Reboot Nova VM
+ [Arguments] ${vm_name}
+ [Documentation] Reboot NOVA VM
+ ${devstack_conn_id}= Get ControlNode Connection
+ Switch Connection ${devstack_conn_id}
+ ${output}= Write Commands Until Prompt nova reboot --poll ${vm_name} 30s
+ Log ${output}
+ Wait Until Keyword Succeeds 35s 10s Verify VM Is ACTIVE ${vm_name}
+ Close Connection
+
+Remove RSA Key From KnowHosts
+ [Arguments] ${vm_ip}
+ [Documentation] Remove RSA
+ ${devstack_conn_id}= Get ControlNode Connection
+ Switch Connection ${devstack_conn_id}
+ ${output}= Write Commands Until Prompt sudo cat /root/.ssh/known_hosts 30s
+ Log ${output}
+ ${output}= Write Commands Until Prompt sudo ssh-keygen -f "/root/.ssh/known_hosts" -R ${vm_ip} 30s
+ Log ${output}
+ ${output}= Write Commands Until Prompt sudo cat "/root/.ssh/known_hosts" 30s
+ Log ${output}
+ Close Connection