| ''' |
| More complex (composite) test-cases for the OLT |
| ''' |
| |
| import logging |
| from oftest.testutils import * |
| from oltbase import OltBaseTest |
| from oltconstants import * |
| |
| |
| 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_vlan_id = 140 |
| mcast_groups = Thing( |
| ch1="230.10.10.10", |
| ch2="231.11.11.11", |
| ch3="232.12.12.12", |
| ch4="233.13.13.13", |
| ch5="234.14.14.14" |
| ) |
| onu1 = Thing( |
| port=onu_port, |
| 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 |
| self.setupIgmpCaptureFlowRules(self.getCookieBlock()) |
| self.testSustainedPacketFlow(onu1.s_vlan_id, c_vlan_id, 10) # to check that unicast still flows |
| |
| # 5. Send periodic IGMP queries out toward the ONU and verify its arrival |
| self.testIgmpQueryOut() |
| self.testSustainedPacketFlow(onu1.s_vlan_id, c_vlan_id, 10) # to check that unicast still flows |
| |
| # 6. Send in an IGMP join request for one channel (specific multicast address) and verify that |
| # the controller receives it. |
| self.sendIgmpReport(join=[mcast_groups.ch1]) |
| |
| # 7. Setup flows for forwarding multicast traffic from the OLT port toward the ONU(s) |
| ch1_cookie = self.getCookieBlock() |
| ch1_group_id = 1 |
| self.setupMcastChannel(mcast_groups.ch1, mcast_vlan_id, [onu1.port], ch1_group_id, ch1_cookie) |
| |
| # 8. Verify that multicast packets can reach the ONU |
| self.testMcastFlow(mcast_groups.ch1, mcast_vlan_id, [onu1.port], 10) |
| |
| # 9. Verify that bidirectional unicast traffic still works across the PON |
| self.testSustainedPacketFlow(onu1.s_vlan_id, c_vlan_id, 10) # to check that unicast still flows |
| |
| # 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 |
| self.sendIgmpReport(leave=[mcast_groups.ch1], join=[mcast_groups.ch2]) |
| self.removeMcastChannel(mcast_groups.ch1, mcast_vlan_id, [onu1.port], ch1_group_id, ch1_cookie) |
| ch2_cookie = self.getCookieBlock() |
| ch2_group_id = 2 |
| self.setupMcastChannel(mcast_groups.ch2, mcast_vlan_id, [onu1.port], ch2_group_id, ch2_cookie) |
| self.testMcastFlow(mcast_groups.ch1, mcast_vlan_id, [onu1.port], expect_to_be_blocked=True) |
| self.testMcastFlow(mcast_groups.ch2, mcast_vlan_id, [onu1.port], 10) |
| self.testSustainedPacketFlow(onu1.s_vlan_id, c_vlan_id, 10) # to check that unicast still flows |
| |
| # 11. Add a second channel while keeping the existing one. Verify all what needs to be verified |
| # (similar as above) |
| self.sendIgmpReport(join=[mcast_groups.ch2, mcast_groups.ch3]) |
| ch3_cookie = self.getCookieBlock() |
| ch3_group_id = 3 |
| self.setupMcastChannel(mcast_groups.ch3, mcast_vlan_id, [onu1.port], ch3_group_id, ch3_cookie) |
| self.testMcastFlow(mcast_groups.ch1, mcast_vlan_id, [onu1.port], expect_to_be_blocked=True) |
| self.testMcastFlow(mcast_groups.ch2, mcast_vlan_id, [onu1.port], 10) |
| self.testMcastFlow(mcast_groups.ch3, mcast_vlan_id, [onu1.port], 10) |
| self.testSustainedPacketFlow(onu1.s_vlan_id, c_vlan_id, 10) # to check that unicast still flows |
| |
| # 12. Add two more multicast channels, and verify everything again |
| self.sendIgmpReport(join=[mcast_groups.ch2, mcast_groups.ch3, mcast_groups.ch4, mcast_groups.ch5]) |
| ch4_cookie = self.getCookieBlock() |
| ch4_group_id = 4 |
| self.setupMcastChannel(mcast_groups.ch4, mcast_vlan_id, [onu1.port], ch4_group_id, ch4_cookie) |
| ch5_cookie = self.getCookieBlock() |
| ch5_group_id = 5 |
| self.setupMcastChannel(mcast_groups.ch5, mcast_vlan_id, [onu1.port], ch5_group_id, ch5_cookie) |
| self.testMcastFlow(mcast_groups.ch1, mcast_vlan_id, [onu1.port], expect_to_be_blocked=True) |
| self.testMcastFlow(mcast_groups.ch2, mcast_vlan_id, [onu1.port], 10) |
| self.testMcastFlow(mcast_groups.ch3, mcast_vlan_id, [onu1.port], 10) |
| self.testMcastFlow(mcast_groups.ch4, mcast_vlan_id, [onu1.port], 10) |
| self.testMcastFlow(mcast_groups.ch5, mcast_vlan_id, [onu1.port], 10) |
| self.testSustainedPacketFlow(onu1.s_vlan_id, c_vlan_id, 10) # to check that unicast still flows |
| |
| # 13. Flip a channel for one of the multicast channels, and verify everything (ch3 -> ch1) |
| self.sendIgmpReport(join=[mcast_groups.ch1, mcast_groups.ch2, mcast_groups.ch4, mcast_groups.ch5], |
| leave=[mcast_groups.ch3]) |
| self.removeMcastChannel(mcast_groups.ch3, mcast_vlan_id, [onu1.port], ch3_group_id, ch3_cookie) |
| ## reusing the same group id and cookie |
| self.setupMcastChannel(mcast_groups.ch1, mcast_vlan_id, [onu1.port], ch1_group_id, ch1_cookie) |
| self.testMcastFlow(mcast_groups.ch1, mcast_vlan_id, [onu1.port], 10) |
| self.testMcastFlow(mcast_groups.ch2, mcast_vlan_id, [onu1.port], 10) |
| self.testMcastFlow(mcast_groups.ch3, mcast_vlan_id, [onu1.port], expect_to_be_blocked=True) |
| self.testMcastFlow(mcast_groups.ch4, mcast_vlan_id, [onu1.port], 10) |
| self.testMcastFlow(mcast_groups.ch5, mcast_vlan_id, [onu1.port], 10) |
| self.testSustainedPacketFlow(onu1.s_vlan_id, c_vlan_id, 10) # to check that unicast still flows |
| |
| # 14. Tear down the test. |
| self.resetOlt() |