Esempio n. 1
0
    def test_add_metering_label_rule_without_label(self):
        new_routers_rules = TEST_ROUTERS_WITH_NEW_LABEL
        # clear all the metering labels
        for r in TEST_ROUTERS:
            rm = iptables_driver.RouterWithMetering(self.metering.conf, r)
            rm.metering_labels = {}

        self.metering.update_routers(None, TEST_ROUTERS)
        self.metering.add_metering_label_rule(None, new_routers_rules)
        calls = [
                 mock.call.add_chain('neutron-meter-l-e27fe2df-376',
                                     wrap=False),
                 mock.call.add_chain('neutron-meter-r-e27fe2df-376',
                                     wrap=False),
                 mock.call.add_rule('neutron-meter-FORWARD',
                                    '-j neutron-meter-r-e27fe2df-376',
                                    wrap=False),
                 mock.call.add_rule('neutron-meter-l-e27fe2df-376',
                                    '',
                                    wrap=False),
                 mock.call.add_rule('neutron-meter-r-e27fe2df-376',
                                    '-d 50.0.0.0/24 '
                                    '-i qg-6d411f48-ec '
                                    '-j neutron-meter-l-e27fe2df-376',
                                    top=False,
                                    wrap=False)
                ]
        self.v4filter_inst.assert_has_calls(calls)
Esempio n. 2
0
 def test_iptables_manager_never_create_with_no_valid_namespace(self):
     routers = TEST_ROUTERS[:1]
     self.namespace_exists.return_value = False
     self.metering.add_metering_label(None, routers)
     self.assertFalse(self.iptables_cls.called)
     rm = iptables_driver.RouterWithMetering(self.metering.conf, routers[0])
     self.assertIsNone(rm.iptables_manager)
     self.assertIsNone(rm.snat_iptables_manager)
Esempio n. 3
0
    def test_add_metering_label_when_no_namespace(self):
        routers = TEST_ROUTERS[:1]

        self.namespace_exists.return_value = False
        self.metering._process_metering_label = mock.Mock()
        self.metering.add_metering_label(None, routers)
        rm = iptables_driver.RouterWithMetering(self.metering.conf, routers[0])
        self.assertIsNone(rm.iptables_manager)
        self.assertIsNone(rm.snat_iptables_manager)
        self.assertFalse(self.metering._process_metering_label.called)
Esempio n. 4
0
 def test_create_iptables_manager_for_distributed_routers(self):
     routers = TEST_DVR_ROUTER[:1]
     self.namespace_exists.return_value = True
     snat_ns_name = 'snat-' + routers[0]['id']
     self.snat_ns_name.return_value = snat_ns_name
     self.metering.add_metering_label(None, routers)
     self.assertEqual(2, self.iptables_cls.call_count)
     rm = iptables_driver.RouterWithMetering(self.metering.conf, routers[0])
     self.assertTrue(rm.iptables_manager)
     self.assertTrue(rm.snat_iptables_manager)
Esempio n. 5
0
    def test_add_metering_label_legacy_routers(self):
        routers = TEST_ROUTERS[:1]

        self.namespace_exists.return_value = True
        self.metering._process_ns_specific_metering_label = mock.Mock()
        self.metering.add_metering_label(None, routers)
        rm = iptables_driver.RouterWithMetering(self.metering.conf, routers[0])
        ext_dev, _ = self.metering.get_external_device_names(rm)
        self.assertEqual(
            self.metering._process_ns_specific_metering_label.mock_calls,
            [mock.call(routers[0], ext_dev, rm.iptables_manager)])
Esempio n. 6
0
 def test_create_stateless_iptables_manager(self):
     routers = TEST_ROUTERS[:1]
     self.namespace_exists.return_value = True
     self.metering.add_metering_label(None, routers)
     self.assertEqual(1, self.iptables_cls.call_count)
     self.iptables_cls.assert_called_with(binary_name=mock.ANY,
                                          namespace=mock.ANY,
                                          state_less=True,
                                          use_ipv6=mock.ANY)
     rm = iptables_driver.RouterWithMetering(self.metering.conf, routers[0])
     self.assertTrue(rm.iptables_manager)
     self.assertIsNone(rm.snat_iptables_manager)
Esempio n. 7
0
    def test_get_traffic_counters_with_missing_chain(self):
        for r in TEST_ROUTERS:
            rm = iptables_driver.RouterWithMetering(self.metering.conf, r)
            rm.metering_labels = {r['_metering_labels'][0]['id']: 'fake'}
            self.metering.routers[r['id']] = rm

        mocked_method = self.iptables_cls.return_value.get_traffic_counters
        mocked_method.side_effect = [{'pkts': 1, 'bytes': 8},
                                     RuntimeError('Failed to find the chain')]

        counters = self.metering.get_traffic_counters(None, TEST_ROUTERS)
        expected_label_id = TEST_ROUTERS[0]['_metering_labels'][0]['id']
        self.assertIn(expected_label_id, counters)
        self.assertEqual(1, counters[expected_label_id]['pkts'])
        self.assertEqual(8, counters[expected_label_id]['bytes'])
Esempio n. 8
0
    def test_add_metering_label_dvr_routers(self):
        routers = TEST_DVR_ROUTER[:1]

        self.namespace_exists.return_value = True
        snat_ns_name = 'snat-' + routers[0]['id']
        self.snat_ns_name.return_value = snat_ns_name
        self.metering._process_ns_specific_metering_label = mock.Mock()
        self.metering.add_metering_label(None, routers)
        rm = iptables_driver.RouterWithMetering(self.metering.conf, routers[0])
        ext_dev, ext_snat_dev = self.metering.get_external_device_names(rm)
        self.assertEqual(
            2, self.metering._process_ns_specific_metering_label.call_count)
        # check and validate the right device being passed based on the
        # namespace.
        self.assertEqual(
            self.metering._process_ns_specific_metering_label.mock_calls, [
                mock.call(routers[0], ext_dev, rm.iptables_manager),
                mock.call(routers[0], ext_snat_dev, rm.snat_iptables_manager)
            ])
Esempio n. 9
0
 def test_add_metering_label_rule_dvr_router(self):
     routers = TEST_DVR_ROUTER
     self.metering.update_routers(None, TEST_DVR_ROUTER)
     self.namespace_exists.return_value = True
     self.metering._process_metering_rule_action_based_on_ns = mock.Mock()
     self.metering.add_metering_label_rule(None, routers)
     rm = iptables_driver.RouterWithMetering(self.metering.conf, routers[0])
     ext_dev, ext_snat_dev = self.metering.get_external_device_names(rm)
     self.assertEqual(
         2,
         self.metering._process_metering_rule_action_based_on_ns.call_count)
     # check and validate the right device being passed based on the
     # namespace.
     self.assertEqual(
         self.metering._process_metering_rule_action_based_on_ns.mock_calls,
         [
             mock.call(routers[0], 'create', ext_dev, rm.iptables_manager),
             mock.call(routers[0], 'create', ext_snat_dev,
                       rm.snat_iptables_manager)
         ])
Esempio n. 10
0
    def test_get_traffic_counters_legacy_mode(self):
        for r in TEST_ROUTERS:
            rm = iptables_driver.RouterWithMetering(self.metering.conf, r)
            rm.metering_labels = {r['_metering_labels'][0]['id']: 'fake'}
            self.metering.routers[r['id']] = rm

        mocked_method = self.iptables_cls.return_value.get_traffic_counters
        mocked_method.side_effect = [{
            'pkts': 2,
            'bytes': 5
        }, {
            'pkts': 4,
            'bytes': 3
        }]

        old_granular_traffic_data = self.metering.granular_traffic_data

        expected_total_number_of_data_granularity = 2

        expected_response = {
            'eeef45da-c600-4a2a-b2f4-c0fb6df73c83': {
                'pkts': 4,
                'bytes': 3
            },
            'c5df2fe5-c600-4a2a-b2f4-c0fb6df73c83': {
                'pkts': 2,
                'bytes': 5
            }
        }
        try:
            self.metering.granular_traffic_data = False
            counters = self.metering.get_traffic_counters(None, TEST_ROUTERS)
            print("%s" % counters)
            self.assertEqual(expected_total_number_of_data_granularity,
                             len(counters))
            self.assertEqual(expected_response, counters)
        finally:
            self.metering.granular_traffic_data = old_granular_traffic_data
Esempio n. 11
0
    def test_get_traffic_counters_granular_data(self):
        for r in TEST_ROUTERS:
            rm = iptables_driver.RouterWithMetering(self.metering.conf, r)
            rm.metering_labels = {r['_metering_labels'][0]['id']: 'fake'}
            self.metering.routers[r['id']] = rm

        mocked_method = self.iptables_cls.return_value.get_traffic_counters
        mocked_method.side_effect = [{
            'pkts': 2,
            'bytes': 5
        }, {
            'pkts': 4,
            'bytes': 3
        }]

        old_granular_traffic_data = self.metering.granular_traffic_data

        expected_total_number_of_data_granularities = 9
        expected_response = {
            "router-373ec392-1711-44e3-b008-3251ccfc5099": {
                "pkts": 4,
                "bytes": 3,
                "traffic-counter-granularity": "router"
            },
            "label-c5df2fe5-c600-4a2a-b2f4-c0fb6df73c83": {
                "pkts": 2,
                "bytes": 5,
                "traffic-counter-granularity": "label"
            },
            "router-473ec392-1711-44e3-b008-3251ccfc5099-"
            "label-c5df2fe5-c600-4a2a-b2f4-c0fb6df73c83": {
                "pkts": 2,
                "bytes": 5,
                "traffic-counter-granularity": "label_router"
            },
            "label-eeef45da-c600-4a2a-b2f4-c0fb6df73c83": {
                "pkts": 4,
                "bytes": 3,
                "traffic-counter-granularity": "label"
            },
            "project-6c5f5d2a1fa2441e88e35422926f48e8-"
            "label-eeef45da-c600-4a2a-b2f4-c0fb6df73c83": {
                "pkts": 4,
                "bytes": 3,
                "traffic-counter-granularity": "label_project"
            },
            "router-473ec392-1711-44e3-b008-3251ccfc5099": {
                "pkts": 2,
                "bytes": 5,
                "traffic-counter-granularity": "router"
            },
            "project-6c5f5d2a1fa2441e88e35422926f48e8": {
                "pkts": 6,
                "bytes": 8,
                "traffic-counter-granularity": "project"
            },
            "router-373ec392-1711-44e3-b008-3251ccfc5099-"
            "label-eeef45da-c600-4a2a-b2f4-c0fb6df73c83": {
                "pkts": 4,
                "bytes": 3,
                "traffic-counter-granularity": "label_router"
            },
            "project-6c5f5d2a1fa2441e88e35422926f48e8-"
            "label-c5df2fe5-c600-4a2a-b2f4-c0fb6df73c83": {
                "pkts": 2,
                "bytes": 5,
                "traffic-counter-granularity": "label_project"
            }
        }
        try:
            self.metering.granular_traffic_data = True
            counters = self.metering.get_traffic_counters(None, TEST_ROUTERS)

            self.assertEqual(expected_total_number_of_data_granularities,
                             len(counters))
            self.assertEqual(expected_response, counters)
        finally:
            self.metering.granular_traffic_data = old_granular_traffic_data