From 5fa529efa46695ae2f29a9ad9c35386d952e6a32 Mon Sep 17 00:00:00 2001 From: Peng Liu Date: Thu, 9 Aug 2018 17:24:17 +0800 Subject: [PATCH] Move function get_subnet to kuryr_kubernetes.utils Since the function _get_subnet is widely used by different components, I move it to kuryr_kubernetes.utils as a part of common utilities. Change-Id: I9a80fb55f5c02274fb50c4c92eb3514ccb42830e --- .../controller/drivers/default_subnet.py | 40 ++--------------- .../controller/drivers/multi_vif.py | 4 +- .../controller/drivers/namespace_subnet.py | 3 +- .../controller/drivers/vif_pool.py | 5 +-- .../controller/drivers/test_default_subnet.py | 44 ++----------------- .../unit/controller/drivers/test_multi_vif.py | 3 +- .../drivers/test_namespace_subnet.py | 6 +-- .../unit/controller/drivers/test_vif_pool.py | 9 ++-- kuryr_kubernetes/tests/unit/test_utils.py | 29 ++++++++++++ kuryr_kubernetes/utils.py | 35 +++++++++++++++ 10 files changed, 83 insertions(+), 95 deletions(-) diff --git a/kuryr_kubernetes/controller/drivers/default_subnet.py b/kuryr_kubernetes/controller/drivers/default_subnet.py index 5c4643774..e39294c58 100644 --- a/kuryr_kubernetes/controller/drivers/default_subnet.py +++ b/kuryr_kubernetes/controller/drivers/default_subnet.py @@ -13,45 +13,11 @@ # License for the specific language governing permissions and limitations # under the License. -from oslo_cache import core as cache from oslo_config import cfg -from kuryr_kubernetes import clients from kuryr_kubernetes import config from kuryr_kubernetes.controller.drivers import base -from kuryr_kubernetes import os_vif_util - - -CONF = cfg.CONF - -subnet_caching_opts = [ - cfg.BoolOpt('caching', default=True), - cfg.IntOpt('cache_time', default=3600), -] - -CONF.register_opts(subnet_caching_opts, "subnet_caching") - -cache.configure(CONF) -subnet_cache_region = cache.create_region() -MEMOIZE = cache.get_memoization_decorator( - CONF, subnet_cache_region, "subnet_caching") - -cache.configure_cache_region(CONF, subnet_cache_region) - - -@MEMOIZE -def _get_subnet(subnet_id): - neutron = clients.get_neutron_client() - - n_subnet = neutron.show_subnet(subnet_id).get('subnet') - network_id = n_subnet['network_id'] - n_network = neutron.show_network(network_id).get('network') - - subnet = os_vif_util.neutron_to_osvif_subnet(n_subnet) - network = os_vif_util.neutron_to_osvif_network(n_network) - network.subnets.objects.append(subnet) - - return network +from kuryr_kubernetes import utils class DefaultPodSubnetDriver(base.PodSubnetsDriver): @@ -68,7 +34,7 @@ class DefaultPodSubnetDriver(base.PodSubnetsDriver): raise cfg.RequiredOptError('pod_subnet', cfg.OptGroup('neutron_defaults')) - return {subnet_id: _get_subnet(subnet_id)} + return {subnet_id: utils.get_subnet(subnet_id)} class DefaultServiceSubnetDriver(base.ServiceSubnetsDriver): @@ -85,4 +51,4 @@ class DefaultServiceSubnetDriver(base.ServiceSubnetsDriver): raise cfg.RequiredOptError('service_subnet', cfg.OptGroup('neutron_defaults')) - return {subnet_id: _get_subnet(subnet_id)} + return {subnet_id: utils.get_subnet(subnet_id)} diff --git a/kuryr_kubernetes/controller/drivers/multi_vif.py b/kuryr_kubernetes/controller/drivers/multi_vif.py index ec63523e0..9ce9e39b2 100644 --- a/kuryr_kubernetes/controller/drivers/multi_vif.py +++ b/kuryr_kubernetes/controller/drivers/multi_vif.py @@ -18,8 +18,8 @@ from oslo_serialization import jsonutils from kuryr_kubernetes import clients from kuryr_kubernetes import constants from kuryr_kubernetes.controller.drivers import base -from kuryr_kubernetes.controller.drivers import default_subnet from kuryr_kubernetes import exceptions +from kuryr_kubernetes import utils LOG = logging.getLogger(__name__) @@ -65,7 +65,7 @@ class NPWGMultiVIFDriver(base.MultiVIFDriver): config = jsonutils.loads(nad_obj['metadata']['annotations'] ['openstack.org/kuryr-config']) subnet_id = config[constants.K8S_ANNOTATION_NPWG_CRD_SUBNET_ID] - subnet = {subnet_id: default_subnet._get_subnet(subnet_id)} + subnet = {subnet_id: utils.get_subnet(subnet_id)} if constants.K8S_ANNOTATION_NPWG_CRD_DRIVER_TYPE not in config: vif_drv = self._drv_vif_pool else: diff --git a/kuryr_kubernetes/controller/drivers/namespace_subnet.py b/kuryr_kubernetes/controller/drivers/namespace_subnet.py index ffda2e9f5..2b040276b 100644 --- a/kuryr_kubernetes/controller/drivers/namespace_subnet.py +++ b/kuryr_kubernetes/controller/drivers/namespace_subnet.py @@ -20,6 +20,7 @@ from kuryr_kubernetes import clients from kuryr_kubernetes import constants from kuryr_kubernetes.controller.drivers import default_subnet from kuryr_kubernetes import exceptions +from kuryr_kubernetes import utils from neutronclient.common import exceptions as n_exc @@ -44,7 +45,7 @@ class NamespacePodSubnetDriver(default_subnet.DefaultPodSubnetDriver): pod_namespace = pod['metadata']['namespace'] subnet_id = self._get_namespace_subnet(pod_namespace) - return {subnet_id: default_subnet._get_subnet(subnet_id)} + return {subnet_id: utils.get_subnet(subnet_id)} def _get_namespace_subnet(self, namespace): kubernetes = clients.get_kubernetes_client() diff --git a/kuryr_kubernetes/controller/drivers/vif_pool.py b/kuryr_kubernetes/controller/drivers/vif_pool.py index 8687d0bc7..130aa7a14 100644 --- a/kuryr_kubernetes/controller/drivers/vif_pool.py +++ b/kuryr_kubernetes/controller/drivers/vif_pool.py @@ -31,7 +31,6 @@ from kuryr_kubernetes import clients from kuryr_kubernetes import config from kuryr_kubernetes import constants from kuryr_kubernetes.controller.drivers import base -from kuryr_kubernetes.controller.drivers import default_subnet from kuryr_kubernetes.controller.drivers import utils as c_utils from kuryr_kubernetes.controller.managers import pool from kuryr_kubernetes import exceptions @@ -375,7 +374,7 @@ class NeutronVIFPool(BaseVIFPool): for port in available_ports: subnet_id = port['fixed_ips'][0]['subnet_id'] subnet = { - subnet_id: default_subnet._get_subnet(subnet_id)} + subnet_id: utils.get_subnet(subnet_id)} vif_plugin = self._drv_vif._get_vif_plugin(port) vif = ovu.neutron_to_osvif_vif(vif_plugin, port, subnet) net_obj = subnet[subnet_id] @@ -592,7 +591,7 @@ class NestedVIFPool(BaseVIFPool): subnet_id = port['fixed_ips'][0]['subnet_id'] if not subnets.get(subnet_id): subnets[subnet_id] = {subnet_id: - default_subnet._get_subnet( + utils.get_subnet( subnet_id)} return parent_ports, subports, subnets diff --git a/kuryr_kubernetes/tests/unit/controller/drivers/test_default_subnet.py b/kuryr_kubernetes/tests/unit/controller/drivers/test_default_subnet.py index 481bfcce6..d662bb068 100644 --- a/kuryr_kubernetes/tests/unit/controller/drivers/test_default_subnet.py +++ b/kuryr_kubernetes/tests/unit/controller/drivers/test_default_subnet.py @@ -19,13 +19,11 @@ from oslo_config import cfg from kuryr_kubernetes.controller.drivers import default_subnet from kuryr_kubernetes.tests import base as test_base -from kuryr_kubernetes.tests.unit import kuryr_fixtures as k_fix class TestDefaultPodSubnetDriver(test_base.TestCase): - @mock.patch('kuryr_kubernetes.controller.drivers' - '.default_subnet._get_subnet') + @mock.patch('kuryr_kubernetes.utils.get_subnet') @mock.patch('kuryr_kubernetes.config.CONF') def test_get_subnets(self, m_cfg, m_get_subnet): subnet_id = mock.sentinel.subnet_id @@ -41,8 +39,7 @@ class TestDefaultPodSubnetDriver(test_base.TestCase): self.assertEqual({subnet_id: subnet}, subnets) m_get_subnet.assert_called_once_with(subnet_id) - @mock.patch('kuryr_kubernetes.controller.drivers' - '.default_subnet._get_subnet') + @mock.patch('kuryr_kubernetes.utils.get_subnet') def test_get_subnets_not_set(self, m_get_subnet): pod = mock.sentinel.pod project_id = mock.sentinel.project_id @@ -55,8 +52,7 @@ class TestDefaultPodSubnetDriver(test_base.TestCase): class TestDefaultServiceSubnetDriver(test_base.TestCase): - @mock.patch('kuryr_kubernetes.controller.drivers' - '.default_subnet._get_subnet') + @mock.patch('kuryr_kubernetes.utils.get_subnet') @mock.patch('kuryr_kubernetes.config.CONF') def test_get_subnets(self, m_cfg, m_get_subnet): subnet_id = mock.sentinel.subnet_id @@ -72,8 +68,7 @@ class TestDefaultServiceSubnetDriver(test_base.TestCase): self.assertEqual({subnet_id: subnet}, subnets) m_get_subnet.assert_called_once_with(subnet_id) - @mock.patch('kuryr_kubernetes.controller.drivers' - '.default_subnet._get_subnet') + @mock.patch('kuryr_kubernetes.utils.get_subnet') def test_get_subnets_not_set(self, m_get_subnet): service = mock.sentinel.service project_id = mock.sentinel.project_id @@ -81,34 +76,3 @@ class TestDefaultServiceSubnetDriver(test_base.TestCase): self.assertRaises(cfg.RequiredOptError, driver.get_subnets, service, project_id) m_get_subnet.assert_not_called() - - -class TestGetSubnet(test_base.TestCase): - - @mock.patch('kuryr_kubernetes.os_vif_util.neutron_to_osvif_network') - @mock.patch('kuryr_kubernetes.os_vif_util.neutron_to_osvif_subnet') - def test_get_subnet(self, m_osv_subnet, m_osv_network): - neutron = self.useFixture(k_fix.MockNeutronClient()).client - - subnet = mock.MagicMock() - network = mock.MagicMock() - subnet_id = mock.sentinel.subnet_id - network_id = mock.sentinel.network_id - - neutron_subnet = {'network_id': network_id} - neutron_network = mock.sentinel.neutron_network - - neutron.show_subnet.return_value = {'subnet': neutron_subnet} - neutron.show_network.return_value = {'network': neutron_network} - - m_osv_subnet.return_value = subnet - m_osv_network.return_value = network - - ret = default_subnet._get_subnet(subnet_id) - - self.assertEqual(network, ret) - neutron.show_subnet.assert_called_once_with(subnet_id) - neutron.show_network.assert_called_once_with(network_id) - m_osv_subnet.assert_called_once_with(neutron_subnet) - m_osv_network.assert_called_once_with(neutron_network) - network.subnets.objects.append.assert_called_once_with(subnet) diff --git a/kuryr_kubernetes/tests/unit/controller/drivers/test_multi_vif.py b/kuryr_kubernetes/tests/unit/controller/drivers/test_multi_vif.py index 855af38ec..a7c637c0f 100644 --- a/kuryr_kubernetes/tests/unit/controller/drivers/test_multi_vif.py +++ b/kuryr_kubernetes/tests/unit/controller/drivers/test_multi_vif.py @@ -135,8 +135,7 @@ class TestNPWGMultiVIFDriver(test_base.TestCase): driver_alias='multi_pool') m_set_vifs_driver.assert_called_once() - @mock.patch('kuryr_kubernetes.controller.drivers' - '.default_subnet._get_subnet') + @mock.patch('kuryr_kubernetes.utils.get_subnet') @mock.patch('kuryr_kubernetes.clients.get_kubernetes_client') def test_request_additional_vifs(self, m_get_client, m_get_subnet): vifs = [mock.sentinel.vif_a, mock.sentinel.vif_b, mock.sentinel.vif_c] diff --git a/kuryr_kubernetes/tests/unit/controller/drivers/test_namespace_subnet.py b/kuryr_kubernetes/tests/unit/controller/drivers/test_namespace_subnet.py index f9f16b755..3653fdb92 100644 --- a/kuryr_kubernetes/tests/unit/controller/drivers/test_namespace_subnet.py +++ b/kuryr_kubernetes/tests/unit/controller/drivers/test_namespace_subnet.py @@ -65,8 +65,7 @@ def get_namespace_obj(): class TestNamespacePodSubnetDriver(test_base.TestCase): - @mock.patch('kuryr_kubernetes.controller.drivers' - '.default_subnet._get_subnet') + @mock.patch('kuryr_kubernetes.utils.get_subnet') def test_get_subnets(self, m_get_subnet): project_id = mock.sentinel.project_id pod = get_pod_obj() @@ -86,8 +85,7 @@ class TestNamespacePodSubnetDriver(test_base.TestCase): m_driver._get_namespace_subnet.assert_called_once_with(pod_namespace) m_get_subnet.assert_called_once_with(subnet_id) - @mock.patch('kuryr_kubernetes.controller.drivers' - '.default_subnet._get_subnet') + @mock.patch('kuryr_kubernetes.utils.get_subnet') def test_get_subnets_namespace_not_ready(self, m_get_subnet): project_id = mock.sentinel.project_id pod = get_pod_obj() diff --git a/kuryr_kubernetes/tests/unit/controller/drivers/test_vif_pool.py b/kuryr_kubernetes/tests/unit/controller/drivers/test_vif_pool.py index 3a6c1de1f..a2e2bbb7d 100644 --- a/kuryr_kubernetes/tests/unit/controller/drivers/test_vif_pool.py +++ b/kuryr_kubernetes/tests/unit/controller/drivers/test_vif_pool.py @@ -612,8 +612,7 @@ class NeutronVIFPool(test_base.TestCase): neutron.delete_port.assert_not_called() @mock.patch('kuryr_kubernetes.os_vif_util.neutron_to_osvif_vif') - @mock.patch('kuryr_kubernetes.controller.drivers.default_subnet.' - '_get_subnet') + @mock.patch('kuryr_kubernetes.utils.get_subnet') def test__recover_precreated_ports(self, m_get_subnet, m_to_osvif): cls = vif_pool.NeutronVIFPool m_driver = mock.MagicMock(spec=cls) @@ -659,8 +658,7 @@ class NeutronVIFPool(test_base.TestCase): self.assertEqual(m_driver._available_ports_pools[pool_key], [port_id]) @mock.patch('kuryr_kubernetes.os_vif_util.neutron_to_osvif_vif') - @mock.patch('kuryr_kubernetes.controller.drivers.default_subnet.' - '_get_subnet') + @mock.patch('kuryr_kubernetes.utils.get_subnet') def test__recover_precreated_ports_empty(self, m_get_subnet, m_to_osvif): cls = vif_pool.NeutronVIFPool m_driver = mock.MagicMock(spec=cls) @@ -1071,8 +1069,7 @@ class NestedVIFPool(test_base.TestCase): self.assertEqual(ip_address, cls._get_parent_port_ip(m_driver, port_id)) - @mock.patch('kuryr_kubernetes.controller.drivers.default_subnet.' - '_get_subnet') + @mock.patch('kuryr_kubernetes.utils.get_subnet') def test__get_trunk_info(self, m_get_subnet): cls = vif_pool.NestedVIFPool m_driver = mock.MagicMock(spec=cls) diff --git a/kuryr_kubernetes/tests/unit/test_utils.py b/kuryr_kubernetes/tests/unit/test_utils.py index 677974c02..b2cd5c94f 100644 --- a/kuryr_kubernetes/tests/unit/test_utils.py +++ b/kuryr_kubernetes/tests/unit/test_utils.py @@ -17,6 +17,7 @@ import os from oslo_config import cfg from kuryr_kubernetes.tests import base as test_base +from kuryr_kubernetes.tests.unit import kuryr_fixtures as k_fix from kuryr_kubernetes import utils CONF = cfg.CONF @@ -68,3 +69,31 @@ class TestUtils(test_base.TestCase): m_get.assert_called_once_with( 'http://localhost:%d' % CONF.kubernetes.controller_ha_elector_port) self.assertIsNone(res) + + @mock.patch('kuryr_kubernetes.os_vif_util.neutron_to_osvif_network') + @mock.patch('kuryr_kubernetes.os_vif_util.neutron_to_osvif_subnet') + def test_get_subnet(self, m_osv_subnet, m_osv_network): + neutron = self.useFixture(k_fix.MockNeutronClient()).client + + subnet = mock.MagicMock() + network = mock.MagicMock() + subnet_id = mock.sentinel.subnet_id + network_id = mock.sentinel.network_id + + neutron_subnet = {'network_id': network_id} + neutron_network = mock.sentinel.neutron_network + + neutron.show_subnet.return_value = {'subnet': neutron_subnet} + neutron.show_network.return_value = {'network': neutron_network} + + m_osv_subnet.return_value = subnet + m_osv_network.return_value = network + + ret = utils.get_subnet(subnet_id) + + self.assertEqual(network, ret) + neutron.show_subnet.assert_called_once_with(subnet_id) + neutron.show_network.assert_called_once_with(network_id) + m_osv_subnet.assert_called_once_with(neutron_subnet) + m_osv_network.assert_called_once_with(neutron_network) + network.subnets.objects.append.assert_called_once_with(subnet) diff --git a/kuryr_kubernetes/utils.py b/kuryr_kubernetes/utils.py index 53e3095d5..5a45b7fc6 100644 --- a/kuryr_kubernetes/utils.py +++ b/kuryr_kubernetes/utils.py @@ -17,10 +17,14 @@ import time import requests +from oslo_cache import core as cache from oslo_config import cfg from oslo_log import log from oslo_serialization import jsonutils +from kuryr_kubernetes import clients +from kuryr_kubernetes import os_vif_util + CONF = cfg.CONF LOG = log.getLogger(__name__) @@ -33,6 +37,22 @@ VALID_MULTI_POD_POOLS_OPTS = {'noop': ['neutron-vif', DEFAULT_TIMEOUT = 180 DEFAULT_INTERVAL = 3 +CONF = cfg.CONF + +subnet_caching_opts = [ + cfg.BoolOpt('caching', default=True), + cfg.IntOpt('cache_time', default=3600), +] + +CONF.register_opts(subnet_caching_opts, "subnet_caching") + +cache.configure(CONF) +subnet_cache_region = cache.create_region() +MEMOIZE = cache.get_memoization_decorator( + CONF, subnet_cache_region, "subnet_caching") + +cache.configure_cache_region(CONF, subnet_cache_region) + def utf8_json_decoder(byte_data): """Deserializes the bytes into UTF-8 encoded JSON. @@ -122,3 +142,18 @@ def get_leader_name(): # NOTE(dulek): Assuming there's no leader when we can't contact leader # elector container. return None + + +@MEMOIZE +def get_subnet(subnet_id): + neutron = clients.get_neutron_client() + + n_subnet = neutron.show_subnet(subnet_id).get('subnet') + network_id = n_subnet['network_id'] + n_network = neutron.show_network(network_id).get('network') + + subnet = os_vif_util.neutron_to_osvif_subnet(n_subnet) + network = os_vif_util.neutron_to_osvif_network(n_network) + network.subnets.objects.append(subnet) + + return network