Exemple #1
0
    def testReadAllClasses(self, mock_check_output):
        tc_output = """
class htb 1:1 parent 1:fffe prio 0 rate 12Kbit ceil 1Gbit burst 1599b\n
class htb 1:fffe root rate 1Gbit ceil 1Gbit burst 1375b cburst 1375b\n
class htb 1:2 root rate 1Gbit ceil 1Gbit burst 1375b cburst 1375b\n
class htb 1:5 root rate 1Gbit ceil 1Gbit burst 1375b cburst 1375b\n
class htb 1:7 root rate 1Gbit ceil 1Gbit burst 1375b cburst 1375b\n
class htb 1:8 root rate 1Gbit ceil 1Gbit burst 1375b cburst 1375b\n
class fq_codel 8005:23b parent 8005: \n
class fq_codel 8005:383 parent 8005: \n
"""
        mock_check_output.return_value = bytes(tc_output, "utf-8")
        qid_list = TrafficClass.read_all_classes("testIntf")
        self.assertTrue(qid_list == [1, 65534, 2, 5, 7, 8])
Exemple #2
0
    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)])