*** Settings *** Documentation OF1.3 Suite for flow actions ... - output ALL ... - output CONTROLLER ... - output TABLE ... - output INPORT ... - output LOCAL ... - output NORMAL ... - output FLOOD ... - output ANY ... ... NOTE: for OVS, INPORT does not appear to be supported Suite Setup OpenFlow Actions Suite Setup Suite Teardown OpenFlow Actions Suite Teardown Test Template Create And Remove Flow Library Collections Library OperatingSystem Library String Library XML Resource ../../../libraries/Utils.robot Resource ../../../libraries/FlowLib.robot Resource ../../../libraries/SwitchUtils.robot Library RequestsLibrary Library ../../../libraries/Common.py Variables ../../../variables/Variables.py Library ../../../libraries/SwitchClasses/${SWITCH_CLASS}.py *** Variables *** ${SWITCH_CLASS} Ovs ${SWITCH_IP} ${MININET} ${SWITCH_PROMPT} ${DEFAULT_LINUX_PROMPT} ${CONTROLLER} null ${REST_CON} /restconf/config/opendaylight-inventory:nodes ${ipv4_src} 11.3.0.0/16 ${ipv4_dst} 99.0.0.0/8 ${eth_type} 0x800 ${eth_src} 00:ab:cd:ef:01:23 ${eth_dst} ff:ff:ff:ff:ff:ff ##documentation strings ${INPORT_doc} OF1.3: OFPP_INPORT = 0xfffffff8, /* Send the packet out the input port. This\nreserved port must be explicitly used\nin order to send back out of the input\nport. */\n ${TABLE_doc} OF1.3: OFPP_TABLE = 0xfffffff9, /* Submit the packet to the first flow table NB: This destination port can only be used in packet-out messages. */ ${NORMAL_doc} OF1.3 OFPP_NORMAL = 0xfffffffa, /* Process with normal L2/L3 switching. */ ${FLOOD_doc} OF1.3 OFPP_FLOOD = 0xfffffffb, /* All physical ports in VLAN, except input port and those blocked or link down. */ ${ALL_doc} OF1.3: OFPP_ALL = 0xfffffffc, /* All physical ports except input port. */ ${CONTROLLER_doc} OF1.3 OFPP_CONTROLLER = 0xfffffffd, /* Send to controller. */ ${LOCAL_doc} OF1.3 OFPP_LOCAL = 0xfffffffe, /* Local openflow "port". */ ${ANY_doc} OF1.3 OFPP_ANY = 0xffffffff /* Wildcard port used only for flow mod (delete) and flow stats requests. Selects all flows regardless of output port (including flows with no output port). */ *** Test Cases *** output port tableID flowID priority INPORT [Documentation] ${INPORT_doc} [Tags] inport ${TEST_NAME} 200 161 1 TABLE [Documentation] ${TABLE_doc} [Tags] table ${TEST_NAME} 200 261 65535 NORMAL [Documentation] ${NORMAL_doc} [Tags] normal ${TEST_NAME} 200 361 9 FLOOD [Documentation] ${FLOOD_doc} [Tags] flood ${TEST_NAME} 200 81 255 ALL [Documentation] ${ALL_doc} [Tags] all ${TEST_NAME} 200 88 42 CONTROLLER [Documentation] ${CONTROLLER_doc} [Tags] controller ${TEST_NAME} 200 21 21 LOCAL [Documentation] ${LOCAL_doc} [Tags] local ${TEST_NAME} 200 32 12345 ANY [Documentation] ${ANY_doc} [Tags] any ${TEST_NAME} 200 111 54321 *** Keywords *** Create And Remove Flow [Arguments] ${output_port} ${table_id} ${flow_id} ${priority} ##The dictionaries here will be used to populate the match and action elements of the flow mod ${ethernet_match_dict}= Create Dictionary type=${eth_type} destination=${eth_dst} source=${eth_src} ${ipv4_match_dict}= Create Dictionary source=${ipv4_src} destination=${ipv4_dst} ##flow is a python Object to build flow details, including the xml format to send to controller ${flow}= Create Inventory Flow Set "${flow}" "table_id" With "${table_id}" Set "${flow}" "id" With "${flow_id}" Set "${flow}" "priority" With "${priority}" Clear Flow Actions ${flow} Set Flow Output Action ${flow} 0 0 ${output_port} Set Flow Ethernet Match ${flow} ${ethernet_match_dict} Set Flow IPv4 Match ${flow} ${ipv4_match_dict} Log Flow XML is ${flow.xml} Call Method ${test_switch} create_flow_match_elements ${flow.xml} Log ${test_switch.flow_validations} ${dpid_id}= Get Switch Datapath ID ${test_switch} Add Flow To Controller And Verify ${flow.xml} openflow:${dpid_id} ${flow.table_id} ${flow.id} Validate Switch Output ${test_switch} ${test_switch.dump_all_flows} ${test_switch.flow_validations} Remove Flow From Controller And Verify ${flow.xml} openflow:${dpid_id} ${flow.table_id} ${flow.id} Validate Switch Output ${test_switch} ${test_switch.dump_all_flows} ${test_switch.flow_validations} false OpenFlow Actions Suite Setup ${test_switch}= Get Switch ${SWITCH_CLASS} Set Suite Variable ${test_switch} Call Method ${test_switch} set_mgmt_ip ${SWITCH_IP} Call Method ${test_switch} set_controller_ip ${CONTROLLER} Call Method ${test_switch} set_mgmt_prompt ${SWITCH_PROMPT} Run Command On Remote System ${CONTROLLER} ps -elf | grep java Log MAKE: ${test_switch.make}\n MODEL: ${test_switch.model}\n IP: ${test_switch.mgmt_ip}\n PROMPT: ${test_switch.mgmt_prompt}\n CONTROLLER_IP: ${test_switch.of_controller_ip}\n MGMT_PROTOCOL: ${test_switch.mgmt_protocol} Ping ${test_switch.mgmt_ip} Initialize Switch ${test_switch} Configure OpenFlow ${test_switch} Create Session session http://${CONTROLLER}:${RESTCONFPORT} auth=${AUTH} headers=${HEADERS_XML} OpenFlow Actions Suite Teardown Cleanup Switch ${test_switch} SSHLibrary.Close All Connections Telnet.Close All Connections