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)
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)
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)
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)
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)])
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)
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'])
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) ])
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) ])
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
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