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
This commit is contained in:
Peng Liu 2018-08-09 17:24:17 +08:00 committed by Alexey Perevalov
parent 776e3e1760
commit 5fa529efa4
10 changed files with 83 additions and 95 deletions

View File

@ -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)}

View File

@ -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:

View File

@ -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()

View File

@ -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

View File

@ -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)

View File

@ -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]

View File

@ -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()

View File

@ -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)

View File

@ -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)

View File

@ -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