def testError(self, mock_check_call): def dummy_check_call(*args): raise subprocess.CalledProcessError(returncode=1, cmd="tc") mock_check_call.side_effect = dummy_check_call with self.assertLogs("pipelined.qos.tc_cmd", level="ERROR") as cm: TrafficClass.init_qdisc("eth0", show_error=True) self.assertTrue("error: 1 running: tc qdisc add dev " in cm.output[0])
def testSudoUser(self, _, mock_check_call): intf = 'qt' BRIDGE = 'qtbr0' BridgeTools.create_bridge(BRIDGE, BRIDGE) BridgeTools.create_internal_iface(BRIDGE, intf, None) TrafficClass.init_qdisc(intf) mock_check_call.assert_any_call( ["sudo", "tc", "qdisc", "add", "dev", intf, "root", "handle", "1:", "htb"], )
def testError(self, mock_check_call): def dummy_check_call(*args): raise subprocess.CalledProcessError(returncode=1, cmd="tc") mock_check_call.side_effect = dummy_check_call with self.assertLogs("pipelined.qos.qos_tc_impl", level="ERROR") as cm: try: TrafficClass.init_qdisc("en0", throw_except=True, show_error=True) self.fail("init_qdisc didn't raise an exception") except subprocess.CalledProcessError: pass self.assertTrue("error running tc qdisc add dev" in cm.output[0]) args = [ "tc", "qdisc", "add", "dev", "en0", "root", "handle", "1:", "htb" ] mock_check_call.assert_called_with(args)
def testError(self, mock_check_call): def dummy_check_call(*args): raise subprocess.CalledProcessError(returncode=1, cmd="tc") mock_check_call.side_effect = dummy_check_call with self.assertLogs('pipelined.qos.qos_tc_impl', level='ERROR') as cm: try: TrafficClass.init_qdisc("en0", throw_except=True, show_error=True) self.fail("init_qdisc didn't raise an exception") except subprocess.CalledProcessError: pass self.assertTrue("error running tc qdisc add dev" in cm.output[0]) args = [ 'tc', 'qdisc', 'add', 'dev', 'en0', 'root', 'handle', '1:', 'htb' ] mock_check_call.assert_called_with(args)
def setUpClass(cls): BridgeTools.create_bridge(cls.BRIDGE, cls.BRIDGE) BridgeTools.create_internal_iface(cls.BRIDGE, cls.IFACE, None) TrafficClass.init_qdisc(cls.IFACE, True)
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)])
def testSudoUser(self, _, mock_check_call): TrafficClass.init_qdisc("eth0") mock_check_call.assert_any_call( ["sudo", "tc", "qdisc", "add", "dev", "eth0", "root", "handle", "1:", "htb"] )
def testSudoUser(self, _, mock_check_call): TrafficClass.init_qdisc("en0") mock_check_call.assert_any_call([ 'sudo', 'tc', 'qdisc', 'add', 'dev', 'en0', 'root', 'handle', '1:', 'htb' ])