Outline and 1st pass on 1st complex case

Change-Id: I3311168eb54ace1ccd05c9114dbcc9d6d0fd2075
diff --git a/olt-complex.py b/olt-complex.py
new file mode 100644
index 0000000..bf4486d
--- /dev/null
+++ b/olt-complex.py
@@ -0,0 +1,108 @@
+'''
+More complex (composite) test-cases for the OLT
+'''
+
+import logging
+from oftest.testutils import *
+from oltbase import OltBaseTest
+
+class Thing(object):
+    """An object we can stash arbitrary attributes for easy reach"""
+    def __init__(self, **kws):
+        self.__dict__.update(kws)
+
+
+class ControllerAccess(OltBaseTest):
+    """Verify openflow access from OLT device"""
+
+    def runTest(self):
+        logging.info("Running ControllerAccess test")
+
+        # implicitly testing access to the openflow device
+        # and deleting all residual flows and groups
+        delete_all_flows(self.controller)
+        delete_all_groups(self.controller)
+
+
+class TestScenario1SingleOnu(OltBaseTest):
+    """
+    Run a comprehensive test scenrario on the OLT.
+
+    Plan:
+
+    1.  Reset the OLT into a clean state
+    2.  Setup the OLT to pass authentication (L2/Unicast) traffic for the ONU1
+    3.  Verify that unicast traffic works in both directions (use a few hundred frames in both ways)
+    4.  Setup IGMP forwarding toward the controller
+    5.  Send periodic IGMP queries out toward the ONU and verify its arrival
+    6.  Send in an IGMP join request for one channel (specific multicast address) and verify that
+        the controller receives it.
+    7.  Setup flows for forwarding multicast traffic from the OLT port toward the ONU(s)
+    8.  Verify that multicast packets can reach the ONU
+    9.  Verify that bidirectional unicast traffic still works across the PON
+    10. Change channel to a new multicast group and verify both multicast receiption as well as
+        unicast traffic works. This step involves:
+        - sending a leave message by the ONU to the controller and verify its reception
+        - sending a join message and verify its reception
+        - removing the existing multicast flow
+        - adding a new multicast flow
+        - verify that original flow no longer flows
+        - verify new flow
+        - verify that unicast still works
+    11. Add a second channel while keeping the existing one. Verify all what needs to be verified
+        (similar as above)
+    12. Add two more multicast channels, and verify everything
+    13. Flip a channel for one of the multicast channels, and verify everything
+    14. Tear down the test.
+    """
+
+    def runTest(self):
+        logging.info("Running %s" % self.__class__.__name__)
+
+        # Some constants
+        c_vlan_id = 111
+        mcast_groups = Thing(
+            ch1="230.10.10.10",
+            ch2="231.11.11.11",
+            ch3="232.12.12.12",
+            ch4="233.13.13.13"
+        )
+        onu1 = Thing(
+            ip="13.14.14.13",
+            mac="b6:b8:3e:fb:1a:3f",
+            s_vlan_id=13
+        )
+
+        # 1.  Reset the OLT into a clean state
+        self.resetOlt()
+
+        # 2.  Setup the OLT to pass authentication (L2/Unicast) traffic for the ONU1
+        self.installDoubleTaggingRules(onu1.s_vlan_id, c_vlan_id, self.getCookieBlock())
+
+        # 3.  Verify that unicast traffic works in both directions (use a few hundred frames in both ways)
+        self.testPacketFlow(onu1.s_vlan_id, c_vlan_id)  # this tests just one packet in each way
+        self.testSustainedPacketFlow(onu1.s_vlan_id, c_vlan_id, 100)
+
+        # 4.  Setup IGMP forwarding toward the controller
+        # 5.  Send periodic IGMP queries out toward the ONU and verify its arrival
+        # 6.  Send in an IGMP join request for one channel (specific multicast address) and verify that
+        #     the controller receives it.
+        # 7.  Setup flows for forwarding multicast traffic from the OLT port toward the ONU(s)
+        # 8.  Verify that multicast packets can reach the ONU
+        # 9.  Verify that bidirectional unicast traffic still works across the PON
+        # 10. Change channel to a new multicast group and verify both multicast receiption as well as
+        #     unicast traffic works. This step involves:
+        #     - sending a leave message by the ONU to the controller and verify its reception
+        #     - sending a join message and verify its reception
+        #     - removing the existing multicast flow
+        #     - adding a new multicast flow
+        #     - verify that original flow no longer flows
+        #     - verify new flow
+        #     - verify that unicast still works
+        # 11. Add a second channel while keeping the existing one. Verify all what needs to be verified
+        #     (similar as above)
+        # 12. Add two more multicast channels, and verify everything
+        # 13. Flip a channel for one of the multicast channels, and verify everything
+
+        # 14. Tear down the test.
+        self.resetOlt()