blob: db8f33ffe5e17ffd06ee852e6fb06a0ba8762559 [file] [log] [blame]
'''
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, with one ONU.
Plan:
0. Reset the OLT into a clean state
1. Setup the OLT to pass authentication (EAPOL) to controller
from any port, and test it.
2. Setup the OLT to pass unicast traffic for the ONU
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
)
# 0. Reset the OLT into a clean state
self.resetOlt()
# 1. Setup the OLT to pass authentication (EAPOL) to controller
# from any port, and test it.
self.installEapolRule()
self.sendEapolIn()
# 2. Setup the OLT to pass 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.installIgmpRule(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()
class TestScenario2TwoOnus(OltBaseTest):
"""
Run a comprehensive test scenario involving the OLT and two ONUs.
Plan:
0. Reset the OLT into a clean state
1. Setup the OLT to pass authentication (EAPOL) to controller from ONU1
and test it.
2. Setup the OLT to pass 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 ONU1 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 ONU1
8. Verify that multicast packets can reach ONU1
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) - at this point ONU1 is tuned into ch2 and ch3
12. Setup the OLT to pass authentication (EAPOL) to controller from ONU2
and test it.
13. Setup the OLT to pass unicast traffic for the ONU2
14. Verify that unicast traffic works in both directions (use a few hundred frames in both ways)
15. Verify that both ONUs can send/receive unicast and ONU1 can still see its 2 channels
16. Setup IGMP forwarding toward the controller
17. Send periodic IGMP queries out toward the ONU2 and verify its arrival
18. Send in an IGMP join request for one channel (specific multicast address) and verify that
the controller receives it.
19. Setup flows for forwarding multicast traffic from the OLT port toward ONU2
20. Verify that multicast packets can reach ONU2
21. Verify that bidirectional unicast traffic still works across the PON for both ONUs
22. 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
- verify everything for ONU1 too
23. Add a second channel while keeping the existing one. Verify all what needs to be verified
(similar as above) - at this point ONU1 is tuned into ch2 and ch3 and ONU2 is
tuned to ch2 and ch5
24. Flip a channel for ONU1 and verify everything
25. Tear down the test.
"""
# TODO