Esempio n. 1
0
 def _add_qdisc(self, direction):
     if direction == constants.EGRESS_DIRECTION:
         tc_lib.add_tc_qdisc(
             self.name, 'htb', parent='root', namespace=self.namespace)
     else:
         tc_lib.add_tc_qdisc(
             self.name, 'ingress', namespace=self.namespace)
Esempio n. 2
0
 def test_add_tc_qdisc_tbf(self):
     tc_lib.add_tc_qdisc('device', 'tbf', parent='root', max_kbps=10000,
                         burst_kb=1500, latency_ms=70, kernel_hz=250,
                         namespace=self.namespace)
     burst = tc_lib._get_tbf_burst_value(10000, 1500, 70) * 1024 / 8
     self.mock_add_tc_qdisc.assert_called_once_with(
         'device', parent=rtnl.TC_H_ROOT, kind='tbf', rate=10000 * 128,
         burst=burst, latency=70000, namespace=self.namespace)
Esempio n. 3
0
 def test_add_tc_qdisc_tbf(self):
     tc_lib.add_tc_qdisc('device', 'tbf', parent='root', max_kbps=10000,
                         burst_kb=1500, latency_ms=70, kernel_hz=250,
                         namespace=self.namespace)
     burst = tc_lib._get_tbf_burst_value(10000, 1500, 70) * 1024 / 8
     self.mock_add_tc_qdisc.assert_called_once_with(
         'device', parent=rtnl.TC_H_ROOT, kind='tbf', rate=10000 * 128,
         burst=burst, latency=70000, namespace=self.namespace)
Esempio n. 4
0
    def test_add_tc_policy_class_check_min_kbps_values(self):
        def warning_args(rate, min_rate):
            return ('TC HTB class policy rate %(rate)s (bytes/second) is '
                    'lower than the minimum accepted %(min_rate)s '
                    '(bytes/second), for device %(device)s, qdisc '
                    '%(qdisc)s and classid %(classid)s', {
                        'rate': rate,
                        'min_rate': min_rate,
                        'classid': '1:10',
                        'device': self.device[0],
                        'qdisc': '1:'
                    })

        self._create_two_namespaces()
        tc_lib.add_tc_qdisc(self.device[0],
                            'htb',
                            parent='root',
                            handle='1:',
                            namespace=self.ns[0])

        with mock.patch.object(tc_lib, 'LOG') as mock_log:
            # rate > min_rate: OK
            tc_lib.add_tc_policy_class(self.device[0],
                                       '1:',
                                       '1:10',
                                       max_kbps=2000,
                                       burst_kb=1000,
                                       min_kbps=4,
                                       namespace=self.ns[0])
            mock_log.warning.assert_not_called()

            # rate < min_rate: min_rate = 466 with burst = 128000
            tc_lib.add_tc_policy_class(self.device[0],
                                       '1:',
                                       '1:10',
                                       max_kbps=2000,
                                       burst_kb=1000,
                                       min_kbps=3,
                                       namespace=self.ns[0])
            mock_log.warning.assert_called_once_with(
                *warning_args(3 * 125, tc_lib._calc_min_rate(1000 * 125)))

            # rate < min_rate: min_rate = 455 with burst = 0.8 ceil = 256000
            mock_log.reset_mock()
            tc_lib.add_tc_policy_class(self.device[0],
                                       '1:',
                                       '1:10',
                                       max_kbps=2000,
                                       burst_kb=None,
                                       min_kbps=5,
                                       namespace=self.ns[0])
            min_rate = tc_lib._calc_min_rate(qos_consts.DEFAULT_BURST_RATE *
                                             2000 * 125)
            mock_log.warning.assert_called_once_with(
                *warning_args(5 * 125, min_rate))
Esempio n. 5
0
    def test_list_tc_policy_class_retrieve_statistics(self):
        statistics = {
            'bytes', 'packets', 'drop', 'overlimits', 'bps', 'pps', 'qlen',
            'backlog'
        }
        self._create_two_namespaces()
        tc_lib.add_tc_qdisc(self.device[0],
                            'htb',
                            parent='root',
                            handle='1:',
                            namespace=self.ns[0])
        tc_lib.add_tc_policy_class(self.device[0],
                                   '1:',
                                   '1:10',
                                   max_kbps=1000,
                                   burst_kb=900,
                                   min_kbps=500,
                                   namespace=self.ns[0])
        tc_lib.add_tc_filter_match_mac(self.device[0],
                                       '1:',
                                       '1:10',
                                       self.mac[1],
                                       namespace=self.ns[0])
        tc_classes = tc_lib.list_tc_policy_class(self.device[0],
                                                 namespace=self.ns[0])
        self.assertEqual(1, len(tc_classes))
        self.assertEqual(statistics, set(tc_classes[0]['stats']))

        bytes = tc_classes[0]['stats']['bytes']
        packets = tc_classes[0]['stats']['packets']
        net_helpers.assert_ping(self.ns[1],
                                str(netaddr.IPNetwork(self.ip[0]).ip),
                                count=1)
        tc_classes = tc_lib.list_tc_policy_class(self.device[0],
                                                 namespace=self.ns[0])
        self.assertGreater(tc_classes[0]['stats']['bytes'], bytes)
        self.assertGreater(tc_classes[0]['stats']['packets'], packets)
Esempio n. 6
0
    def test_add_tc_qdisc_htb(self):
        tc_lib.add_tc_qdisc('device',
                            'htb',
                            parent='root',
                            handle='1:',
                            namespace=self.namespace)
        self.mock_add_tc_qdisc.assert_called_once_with(
            'device',
            parent=rtnl.TC_H_ROOT,
            kind='htb',
            handle='1:0',
            namespace=self.namespace)
        self.mock_add_tc_qdisc.reset_mock()

        tc_lib.add_tc_qdisc('device',
                            'htb',
                            parent='root',
                            handle='2',
                            namespace=self.namespace)
        self.mock_add_tc_qdisc.assert_called_once_with(
            'device',
            parent=rtnl.TC_H_ROOT,
            kind='htb',
            handle='2:0',
            namespace=self.namespace)
        self.mock_add_tc_qdisc.reset_mock()

        tc_lib.add_tc_qdisc('device',
                            'htb',
                            parent='root',
                            handle='3:12',
                            namespace=self.namespace)
        self.mock_add_tc_qdisc.assert_called_once_with(
            'device',
            parent=rtnl.TC_H_ROOT,
            kind='htb',
            handle='3:0',
            namespace=self.namespace)
        self.mock_add_tc_qdisc.reset_mock()

        tc_lib.add_tc_qdisc('device',
                            'htb',
                            parent='root',
                            handle=4,
                            namespace=self.namespace)
        self.mock_add_tc_qdisc.assert_called_once_with(
            'device',
            parent=rtnl.TC_H_ROOT,
            kind='htb',
            handle='4:0',
            namespace=self.namespace)
        self.mock_add_tc_qdisc.reset_mock()

        tc_lib.add_tc_qdisc('device',
                            'htb',
                            parent='root',
                            namespace=self.namespace)
        self.mock_add_tc_qdisc.assert_called_once_with(
            'device',
            parent=rtnl.TC_H_ROOT,
            kind='htb',
            namespace=self.namespace)
        self.mock_add_tc_qdisc.reset_mock()

        tc_lib.add_tc_qdisc('device', 'htb', parent='root', handle=5)
        self.mock_add_tc_qdisc.assert_called_once_with('device',
                                                       parent=rtnl.TC_H_ROOT,
                                                       kind='htb',
                                                       handle='5:0',
                                                       namespace=None)
        self.mock_add_tc_qdisc.reset_mock()
Esempio n. 7
0
    def test_add_tc_filter_vxlan(self):
        # The traffic control is applied on the veth pair device of the first
        # namespace (self.ns[0]). The traffic created from the VXLAN interface
        # when replying to the ping (sent from the other namespace), is
        # encapsulated in a VXLAN frame and goes through the veth pair
        # interface.
        self._create_two_namespaces_connected_using_vxlan()

        tc_lib.add_tc_qdisc(self.device[0],
                            'htb',
                            parent='root',
                            handle='1:',
                            namespace=self.ns[0])
        classes = tc_lib.list_tc_policy_class(self.device[0],
                                              namespace=self.ns[0])
        self.assertEqual(0, len(classes))

        class_ids = []
        for i in range(1, 10):
            class_id = '1:%s' % i
            class_ids.append(class_id)
            tc_lib.add_tc_policy_class(self.device[0],
                                       '1:',
                                       class_id,
                                       namespace=self.ns[0],
                                       min_kbps=1000,
                                       max_kbps=2000,
                                       burst_kb=1600)

        # Add a filter for a randomly chosen created class, in the first
        # namespace veth pair device, with the VXLAN MAC address. The traffic
        # from the VXLAN device must go through this chosen class.
        chosen_class_id = random.choice(class_ids)
        tc_lib.add_tc_filter_vxlan(self.device[0],
                                   '1:',
                                   chosen_class_id,
                                   self.mac_vxlan[0],
                                   self.vxlan_id,
                                   namespace=self.ns[0])

        tc_classes = tc_lib.list_tc_policy_class(self.device[0],
                                                 namespace=self.ns[0])
        for tc_class in (c for c in tc_classes
                         if c['classid'] == chosen_class_id):
            bytes = tc_class['stats']['bytes']
            packets = tc_class['stats']['packets']
            break
        else:
            self.fail('TC class %(class_id)s is not present in the device '
                      '%(device)s' % {
                          'class_id': chosen_class_id,
                          'device': self.device[0]
                      })

        net_helpers.assert_ping(self.ns[1],
                                str(netaddr.IPNetwork(self.ip_vxlan[0]).ip),
                                count=1)
        tc_classes = tc_lib.list_tc_policy_class(self.device[0],
                                                 namespace=self.ns[0])
        for tc_class in tc_classes:
            if tc_class['classid'] == chosen_class_id:
                self.assertGreater(tc_class['stats']['bytes'], bytes)
                self.assertGreater(tc_class['stats']['packets'], packets)
            else:
                self.assertEqual(0, tc_class['stats']['bytes'])
                self.assertEqual(0, tc_class['stats']['packets'])
Esempio n. 8
0
    def test_add_tc_qdisc_htb(self):
        tc_lib.add_tc_qdisc('device', 'htb', parent='root', handle='1:',
                            namespace=self.namespace)
        self.mock_add_tc_qdisc.assert_called_once_with(
            'device', parent=rtnl.TC_H_ROOT, kind='htb', handle='1:0',
            namespace=self.namespace)
        self.mock_add_tc_qdisc.reset_mock()

        tc_lib.add_tc_qdisc('device', 'htb', parent='root', handle='2',
                            namespace=self.namespace)
        self.mock_add_tc_qdisc.assert_called_once_with(
            'device', parent=rtnl.TC_H_ROOT, kind='htb', handle='2:0',
            namespace=self.namespace)
        self.mock_add_tc_qdisc.reset_mock()

        tc_lib.add_tc_qdisc('device', 'htb', parent='root', handle='3:12',
                            namespace=self.namespace)
        self.mock_add_tc_qdisc.assert_called_once_with(
            'device', parent=rtnl.TC_H_ROOT, kind='htb', handle='3:0',
            namespace=self.namespace)
        self.mock_add_tc_qdisc.reset_mock()

        tc_lib.add_tc_qdisc('device', 'htb', parent='root', handle=4,
                            namespace=self.namespace)
        self.mock_add_tc_qdisc.assert_called_once_with(
            'device', parent=rtnl.TC_H_ROOT, kind='htb', handle='4:0',
            namespace=self.namespace)
        self.mock_add_tc_qdisc.reset_mock()

        tc_lib.add_tc_qdisc('device', 'htb', parent='root',
                            namespace=self.namespace)
        self.mock_add_tc_qdisc.assert_called_once_with(
            'device', parent=rtnl.TC_H_ROOT, kind='htb',
            namespace=self.namespace)
        self.mock_add_tc_qdisc.reset_mock()

        tc_lib.add_tc_qdisc('device', 'htb', parent='root', handle=5)
        self.mock_add_tc_qdisc.assert_called_once_with(
            'device', parent=rtnl.TC_H_ROOT, kind='htb', handle='5:0',
            namespace=None)
        self.mock_add_tc_qdisc.reset_mock()