[[PageOutline]] = GENI OpenFlow Slicer Test Plan = This test plan is for validating software that implements the [wiki:OpenFlow/Slicer/Requirements GENI Slicer Requirements]. The focus of this test plan is testing that the requirements are satisfied in an environment that is close to how the slicer will be used in practice once it is deployed in GENI. In other words, it is not focused on functional unit testing. Tests may exercise specific functions defined in the requirements, but the tests themselves should focus on validating that the tests pass within the context of how they will be used in GENI. With all of that said, this is also not a full blown integration test. A lot of the data plane traffic is simple ICMP ping traffic, which is not necessarily indicative of all kinds of traffic one might see in GENI. Also, any of the limitations of the substrate will not be held against the slicer as part of this test plan. == Expected test outcome == * All test steps verifying a MUST requirement will be satisfied. * All test steps verifying a SHOULD requirement will be satisfied with special exceptions made only when they seem reasonable. * Any test steps that verify a MAY will have the results documented as features that operators can consider, but failing these steps they will not count against the test plan. * Any test steps that verify an item from the wishlist will have the results documented as features that operators can consider, but failing these steps will not count against the test plan. * All test steps verifying something that doesn't map back directly to a requirement will be satisfied with special exceptions made only when they seem reasonable. == Tracking progress during testing == * Test plan progress and results will be tracked at http://groups.geni.net/geni/wiki/OpenFlow/Slicer/TestPlan/Results#OngoingTests. * Issues uncovered during testing must be tracked using a ticket system. This ticket system can be provided by the slicer developers, or it can be the GENI wiki ticketing system. * Validated slice software versions will be documented at http://groups.geni.net/geni/wiki/OpenFlow/Slicer/TestPlan/Results#ValidatedSoftware. * If you would like for a specific piece of software to be tested, please contact help {at] geni [dot} net. == Assumptions and Dependencies == * Slicer software must interact with OpenFlow v1.0 * Slicer must interact any hardware or software OpenFlow 1.0 switch that is not running in a VLAN-based hybrid mode. * Documentation must is available describing configuration and usage * Slice operations will be performed using the GENI AM API where possible. Most tests cannot be completed without the AM API. = Slicer Test Cases = == OF-OPR-SLCR-FN Testing Scenario: == === Environment === Ideally, this test case will be run with a hardware OpenFlow switch and hosts attached to that switch. The switch should not be running in VLAN-hybrid mode. If this test is run with vSwithches, please note this in the test plan results. === Step 1: Setup === a. Reserve 5 slices (using the add_slice function) ''(005-a)'': i. Slice 'samevlan' with two ports on a single switch, each on the same VLAN. Create this slice such that it handles any VLAN translation at the slicer. Ensure the slicer state is accurate. ''(001-a)'' ii. Slice 'diffvlans' with two ports on the same switch, each associated with a different VLAN. Create this slice such that it handles any VLAN translation at the slicer. Ensure the slicer state is accurate. ''(001-a)'' iii. Slice 'tenvlans' with 10 VLANs on the same switch. Ensure the slicer state is accurate. ''(001-a)'' iv. Slice 'untaggedports' with two untagged ports on a single switch. Ensure the slicer state is accurate. ''(001-b)'' v. Slice 'fullports' with two full ports on a single switch. Ensure the slicer state is accurate. ''(001-c)'' b. Attach hosts to each port with the appropriate data plane VLAN connections for 'samevlan', 'diffvlans', and hosts for at least two of the VLANs for 'tenvlans' c. Add two hosts which are on the same VLAN but do not correspond to an existing slice. === Step 2: Establish that basic connectivity works === a. Run a gosal instance and a modified pox forwarding.l2_learning controller for 'samevlan' that installs a send-to-controller rule for unmatched traffic within the VLAN. b. Start a packet capture on the slicer facing the switch. c. Start a packet capture on the host running gosal facing the controller. d. Using a host that is not in a slice, send ICMP ping traffic on the data plane and make sure it never reaches the other host that is not in a VLAN. ''(002)'' ''(004-a)'' ''(004-c)'' e. Using 'samevlan', send ICMP ping data plane traffic between the two hosts. Ensure that it gets through to the two hosts in 'samevlan', but not to the hosts in 'diffvlans'. ''(001)'' ''(003)'' f. Stop the packet capture(s) at the slicer, and check for the following: i. Check that traffic from the hosts that don't belong to a slice never shows up at the slicer. ''(004-a)'' ''(004-c)'' ii. Check that traffic from the slicer destined for a controller is only sent to a single controller ''(004-b)'' ''(004-d)'' iii. Check that packet-ins from the switch have a VLAN tag, but packet-ins going to the controller do not. Also ensure that nothing else is different. ''(014-b)'' ''(009)'' iv. Check that packet-outs from the controller have no VLAN tag, but packet-outs going to the switch do. Also ensure that nothing else is different. ''(014-a)'' ''(009)'' v. Traffic sent to the OFPP_ALL port from the controller is funnelled into the set of ports in the slice by the slicer. ''(003-c)'' g. Stop the gosal instance and pox forwarding.l2_learning controller for 'samevlan'. === Step 3: Test for VLAN enforcement and translation === a. Start a floodlight instance with static flow pusher enabled for the samevlan slice. b. Push a flow that matches one of the ports and VLANs in 'samevlan' and tries to do a VLAN rewrite to a different VLAN ID before outputting to the other port in the slice. Ensure this gets rejected by the slicer, and an error message is returned. ''(003-b)'' ''(004-e)'' ''(008-a)'' c. Push a flow that matches one of the ports and VLANs, and tries to do a strip-VLAN action. Ensure this gets rejected by the slicer, and an error message is returned. ''(003-a)'' ''(004-e)'' ''(008-a)'' d. Run a gosal instance and a modified pox forwarding.l2_learning controller for 'diffvlans' that installs a send-to-controller rule for unmatched traffic for the specific VLAN+port matches that fall within the slice. e. Send ICMP ping traffic between the 'diffvlans' hosts and make sure it gets exchanged properly. ''(014-d)'' === Step 4: Check data plane throughput === a. If it is not in place already, start a floodlight instance with static flow pusher enabled for the 'samevlan' slice. Make sure no flows are in place. b. Push flows that match traffic from one of the ports and sends the traffic to the other port in each direction. c. Run a tcp iperf between the two hosts and record the results compared to the known substrate bandwidth. d. Run a 1 Mbps udp iperf between the two hosts and record the results compared to the known substrate bandwidth. e. Run a 100 Mbps udp iperf between the two hosts and record the results compared to the known substrate bandwidth. === Step 5: Test for OF functionality === a. Start a packet capture on the slicer facing both the switch and the controller. b. Push a flow_stats request from the controller. c. Stop the packet capture, and check that the flow_stats reply only went to the controller that requested it. ''(004-g)'' d. Run some OFTest checks within the 'samevlan' slice to make sure that ''(004-f)'' and ''(009)'' are met. i. Test OFPT_GET_CONFIG_REQUEST and make sure an OFPT_GET_CONFIG_REPLY comes back. Use the OFTest GetConfigReply test. ii. Run a test that verifies OFPT_FLOW_REMOVED messages are properly returned to the controller. Use the OFTest FlowExpire test. iii. Run a test that verifies that OFPT_BARRIER_REQUESTS send back an OFPT_BARRIER_REPLY. Use the OFTest BarrierRequestReply test. e. Test a few synchronous messages using OFTest to make sure ''(006)'' is met. f. Test that ''(007-a)'' and ''(007-b)'' both generate error messages if ''(007-c)'' is not met. i. Test that sending an OFPT_PORT_MOD from the controller either generates an error, or at the very least doesn't go to the substrate. Use the OFTest PortModPacketIn test. ii. Test that sending an OFPT_SET_CONFIG message either generates an error, or at the very least doesn't go to the substrate. Use the OFTest SetConfigRequest test. === Step 6: Test for stacked slicer support === a. For 'diffvlans' stop the pox forwarding.l2_learning controller. Point the slice at another instance of the slicer. In this higher-level slicer, create an identical slice for 'diffvlans' (can be done manually), and point it at a new controller URL. At that new controller URL, run an instance of the service abstraction layer, and on top of that, run floodlight forwarding. b. Send ICMP ping data plane traffic between the 'diffvlans' hosts. ''(010)'' === Step 7: Test for any extra functionality === a. Test that any documented control plane performance isolation solution works as expected. If applicable, try testing packet-in rates and packet-out rates. ''(011)'' b. Test that any documented data plane performance isolation solution works as expected. This will involve appropriately setting up two slices, proactively installing flows, and starting UDP iperfs to make sure expected throughput is matched. ''(012)'' c. Test that any per-slice flow limits work as expected. ''(012)'' === Step 8: Test management API === a. Call dump_slices and make sure it works as expected. Ensure it returns which slices are active and which are disabled along with however the AM identifies the slices. ''(005-d)'' ''(008-b)'' ''(008-c)'' b. Call change_controller and make sure it is reflected in the slicer state ''(005-c)'' c. Call update_slice if possible and report back what happens ''(005-e)'' d. Call delete_slice and clean up all slices ''(005-b)'' == OF-OPF-SLCR-OP Testing Scenario == === Environment === This test may be run with vSwitches in GENI or using mininet. === Step 1: Setup === a. Clear any existing log files that the slicer may have created. b. Create 10 slices named slice{1-10}. Each slice should have a single unique VLAN ID spanning across 10 switches between two hosts. For each of these slices, install static flows for passing traffic between the hosts. Generate ping traffic from a host at the end of each of the slices and make sure it is working. Leave this traffic running for the duration of this scenario. ''(003)'' === Step 2: Collect monitoring data === a. Make sure there is some way to collect monitoring data for all of the slices that have been set up. This could be something like a read-only slice, or an administrative call to see things like flow stats for all slices. ''(002)'' ''(010)'' === Step 3: Test slice operations === a. Create a new slice 'testslice', use the modified pox forwarding.l2_learning controller, and ensure that pings in the other slices continue to flow. Ensure that this slice is added with no operator intervention. ''(004)'' ''(001-a)'' b. Change the controller URL for 'testslice'. Ensure that the change takes place with no operator intervention. ''(001-c)'' c. If a slicer is capable of disabling a slice, trigger 'testslice' to get disabled. Ensure that either the slicer owner either gets notified, or that 'dump_slices' shows that the slice is disabled. Administratively re-enable the slice if it was disabled. ''(001-d)'' d. Disconnect the 'testslice' controller. Wait for about a minute, and try sending ICMP ping traffic in the data plane. Ensure that it doesn't get through. ''(008)'' e. Delete the slice and make sure that doing so does not require operator intervention. Check right away and make sure all flows for that slice have been removed. ''(001-b)'' ''(009)'' === Step 4: Substrate-generated traffic === a. Connect a host to the substrate that is not part of a slice, and that does not share a data plane port with the other slices. Send a high rate of traffic out of its data plane interface and ensure that the other slices remain stable. ''(007)'' b. Try sending traffic that the slicer cannot process (e.g. non-OpenFlow traffic or an OpenFlow version that the slicer doesn't currently understand) directly to the southbound interface of the slicer. Make sure the slicer remains stable. ''(011)'' === Step 5: Test logging === a. Check that a log exists for the slicer. ''(005)'' b. Configure the logging to rotate on a daily basis. c. Look at the entries for the log. Any entries that exist in the default case should be reasonable. At this point, the size of the log should also be reasonable. ''(006-a)'' d. Try changing the log level while the slicer is running to the most verbose level. Verify that the logs are showing more data. ''(006-b)'' e. Set the logging back to a standard level. Leave the setup running overnight. In the morning, verify that the logs have been rotated, the logs are of reasonable size, and that logging is still working. ''(006-c)'' == OF-OPR-SLCR-SW Testing == === Step 1: Perform validation steps === a. Ensure there is a support mailing list and some level of documentation for users and administrators. ''(001)'' ''(002)'' ''(009)'' b. Ensure with the development team that there is a plan to support OpenFlow 1.3 in the future. ''(003)'' c. Ensure that there is a repository which we can acccess. ''(004)'' d. Ensure that upgrades of software don't destroy previous configuration. ''(007)'' e. Work with the development team to make sure they can satisfy remaining software requirements. ''(005)'' ''(006)'' ''(008)'' == Integration Testing == === Environment === This test should be run with vSwitches in GENI which are interconnected through a GENI stitched connection. === Step 1: Setup === a. Install two instances of the slicer software. b. Create a GENI slice comprised of two vSwitches interconnected through a GENI stitched connection. There should be 2 hosts attached to each vSwitch. c. Point the control plane for the one of the vSwitches to one of the OpenFlow slicers and another vSwitch to another OpenFlow slicer. d. Create a single OpenFlow slice in each slicer that connects the hosts to each vSwitch, and each vSwitch to the stitched connection. Point both of these reservations to a single controller URL and run a floodlight forwarding controller there. === Step 2: Exchange traffic === a. Make sure that each host can exchange ICMP ping traffic with all other hosts. == Wishlist Testing (on request) == === Environment === There are no restrictions on environment for these tests. === Step 1: Check documentation === a. Does the software come in a package? If so, are there instructions for installing the software as a package? b. Is untagged traffic supported in the slicer? If so, does the documentation show how to reserve the untagged space on a port? c. Is data plane isolation supported (unlikely until future OpenFlow versions are supported)? === Step 2: Set up the environment === a. Create a slice that uses two ports that connect two hosts in a slice. Use untagged space on those ports if possible. b. Run Floodlight static flow pusher, and push down a set of flows that will forward traffic between the two ports. c. Make sure that you can exchange traffic between the hosts. === Step 3: Test that priority setting works === a. Install an identical set of flows with a higher priority and no actions. When doing this, do not remove the old rules. b. If possible, check the flow table and ensure that all four of the flows are in the flow table. c. Ensure that traffic is not exchanged between the hosts. d. Remove the higher-priority flows and make sure that traffic flows again.