def testSanity(self, mock_del_cls, mock_check_call): TrafficClass.create_class("en0", 2, 10) mock_del_cls.assert_called_with("en0", 2, show_error=False, throw_except=False) mock_check_call.assert_any_call([ 'tc', 'class', 'add', 'dev', 'en0', 'parent', '1:fffe', 'classid', '1:0x2', 'htb', 'rate', '12000', 'ceil', '10' ]) mock_check_call.assert_any_call([ 'tc', 'qdisc', 'add', 'dev', 'en0', 'parent', '1:0x2', 'fq_codel' ]) mock_check_call.assert_any_call([ 'tc', 'filter', 'add', 'dev', 'en0', 'protocol', 'ip', 'parent', '1:', 'prio', '1', 'handle', '0x2', 'fw', 'flowid', '1:0x2' ])
def testSanity(self, mock_del_cls, mock_check_call): TrafficClass.create_class("en0", 2, 10) mock_del_cls.assert_called_with("en0", 2, show_error=False, throw_except=False) mock_check_call.assert_any_call([ "tc", "class", "add", "dev", "en0", "parent", "1:fffe", "classid", "1:0x2", "htb", "rate", "12000", "ceil", "10", ]) mock_check_call.assert_any_call([ "tc", "qdisc", "add", "dev", "en0", "parent", "1:0x2", "fq_codel" ]) mock_check_call.assert_any_call([ "tc", "filter", "add", "dev", "en0", "protocol", "ip", "parent", "1:", "prio", "1", "handle", "0x2", "fw", "flowid", "1:0x2", ])
def testSanityTrafficClass(self): intf = 'qt' BRIDGE = 'qtbr0' BridgeTools.create_bridge(BRIDGE, BRIDGE) BridgeTools.create_internal_iface(BRIDGE, intf, None) parent_qid = 2 qid = 3 apn_ambr = 1000000 bearer_mbr = 500000 bearer_gbr = 250000 TrafficClass.init_qdisc(intf, show_error=False) # create APN level ambr TrafficClass.create_class(intf, qid=parent_qid, max_bw=apn_ambr) # create child queue TrafficClass.create_class( intf, qid=qid, rate=bearer_gbr, max_bw=bearer_mbr, parent_qid=parent_qid, ) # check if the filters installed for leaf class only filter_output = subprocess.check_output(['tc', 'filter', 'show', 'dev', intf]) filter_list = filter_output.decode('utf-8').split("\n") filter_list = [ln for ln in filter_list if 'classid' in ln] assert('classid 1:{qid}'.format(qid=parent_qid) in filter_list[0]) assert('classid 1:{qid}'.format(qid=qid) in filter_list[1]) # check if classes are installed with appropriate bandwidth limits class_output = subprocess.check_output(['tc', 'class', 'show', 'dev', intf]) class_list = class_output.decode('utf-8').split("\n") for info in class_list: if 'class htb 1:{qid}'.format(qid=qid) in info: child_class = info if 'class htb 1:{qid}'.format(qid=parent_qid) in info: parent_class = info assert(parent_class and 'ceil 1Mbit' in parent_class) assert(child_class and 'rate 250Kbit ceil 500Kbit' in child_class) # check if fq_codel is associated only with the leaf class qdisc_output = subprocess.check_output(['tc', 'qdisc', 'show', 'dev', intf]) # check if read_all_classes work qid_list = TrafficClass.read_all_classes(intf) assert((qid, parent_qid) in qid_list) # delete leaf class TrafficClass.delete_class(intf, 3) # check class for qid 3 removed class_output = subprocess.check_output(['tc', 'class', 'show', 'dev', intf]) class_list = class_output.decode('utf-8').split("\n") assert( not [ info for info in class_list if 'class htb 1:{qid}'.format( qid=qid, ) in info ] ) # delete APN AMBR class TrafficClass.delete_class(intf, 2) # verify that parent class is removed class_output = subprocess.check_output(['tc', 'class', 'show', 'dev', intf]) class_list = class_output.decode('utf-8').split("\n") assert( not [ info for info in class_list if 'class htb 1:{qid}'.format( qid=parent_qid, ) in info ] ) # check if no fq_codel nor filter exists qdisc_output = subprocess.check_output(['tc', 'qdisc', 'show', 'dev', intf]) filter_output = subprocess.check_output(['tc', 'filter', 'show', 'dev', intf]) filter_list = filter_output.decode('utf-8').split("\n") filter_list = [ln for ln in filter_list if 'classid' in ln] qdisc_list = qdisc_output.decode('utf-8').split("\n") qdisc_list = [ln for ln in qdisc_list if 'fq_codel' in ln] assert(not filter_list and not qdisc_list) # destroy all qos on intf run_cmd(['tc qdisc del dev {intf} root'.format(intf=intf)])