diff --git a/kuryr_kubernetes/controller/drivers/vif_pool.py b/kuryr_kubernetes/controller/drivers/vif_pool.py index eb3b1b4ba..2b9e487a3 100644 --- a/kuryr_kubernetes/controller/drivers/vif_pool.py +++ b/kuryr_kubernetes/controller/drivers/vif_pool.py @@ -81,6 +81,13 @@ MEMOIZE = cache.get_memoization_decorator( cache.configure_cache_region(oslo_cfg.CONF, node_driver_cache_region) +VIF_TYPE_TO_DRIVER_MAPPING = { + 'VIFOpenVSwitch': 'neutron-vif', + 'VIFBridge': 'neutron-vif', + 'VIFVlanNested': 'nested-vlan', + 'VIFMacvlanNested': 'nested-macvlan' +} + class NoopVIFPool(base.VIFPoolDriver): """No pool VIFs for Kubernetes Pods""" @@ -794,12 +801,12 @@ class MultiVIFPool(base.VIFPoolDriver): pod, project_id, subnets, security_groups) def release_vif(self, pod, vif, *argv): - pod_vif_type = self._get_pod_vif_type(pod) - self._vif_drvs[pod_vif_type].release_vif(pod, vif, *argv) + vif_drv_alias = self._get_vif_drv_alias(vif) + self._vif_drvs[vif_drv_alias].release_vif(pod, vif, *argv) def activate_vif(self, pod, vif): - pod_vif_type = self._get_pod_vif_type(pod) - self._vif_drvs[pod_vif_type].activate_vif(pod, vif) + vif_drv_alias = self._get_vif_drv_alias(vif) + self._vif_drvs[vif_drv_alias].activate_vif(pod, vif) def delete_network_pools(self, net_id): for vif_drv in self._vif_drvs.values(): @@ -827,3 +834,7 @@ class MultiVIFPool(base.VIFPoolDriver): oslo_cfg.CONF.kubernetes.pod_vif_driver) return pod_vif return oslo_cfg.CONF.kubernetes.pod_vif_driver + + def _get_vif_drv_alias(self, vif): + vif_type_name = type(vif).__name__ + return VIF_TYPE_TO_DRIVER_MAPPING[vif_type_name] diff --git a/kuryr_kubernetes/controller/handlers/vif.py b/kuryr_kubernetes/controller/handlers/vif.py index fb279c8a9..21597ab39 100644 --- a/kuryr_kubernetes/controller/handlers/vif.py +++ b/kuryr_kubernetes/controller/handlers/vif.py @@ -24,7 +24,6 @@ from kuryr_kubernetes.handlers import k8s_base from kuryr_kubernetes import objects from kuryr_kubernetes import utils - LOG = logging.getLogger(__name__) @@ -95,13 +94,14 @@ class VIFHandler(k8s_base.ResourceEventHandler): # FIXME(ivc): improve granularity of K8sClient exceptions: # only resourceVersion conflict should be ignored for ifname, vif in state.vifs.items(): - self._drv_for_vif(vif).release_vif(pod, vif, project_id, - security_groups) + self._drv_vif_pool.release_vif(pod, vif, + project_id, + security_groups) else: changed = False for ifname, vif in state.vifs.items(): if not vif.active: - self._drv_for_vif(vif).activate_vif(pod, vif) + self._drv_vif_pool.activate_vif(pod, vif) changed = True if changed: self._set_pod_state(pod, state) @@ -124,12 +124,8 @@ class VIFHandler(k8s_base.ResourceEventHandler): state = self._get_pod_state(pod) if state: for ifname, vif in state.vifs.items(): - self._drv_for_vif(vif).release_vif(pod, vif, project_id, - security_groups) - - def _drv_for_vif(self, vif): - # TODO(danil): a better polymorphism is required here - return self._drv_vif_pool + self._drv_vif_pool.release_vif(pod, vif, project_id, + security_groups) @staticmethod def _is_host_network(pod): diff --git a/kuryr_kubernetes/tests/unit/controller/handlers/test_vif.py b/kuryr_kubernetes/tests/unit/controller/handlers/test_vif.py index 385df3977..7d3fee4df 100644 --- a/kuryr_kubernetes/tests/unit/controller/handlers/test_vif.py +++ b/kuryr_kubernetes/tests/unit/controller/handlers/test_vif.py @@ -84,9 +84,6 @@ class TestVIFHandler(test_base.TestCase): self._set_vifs_driver.return_value = mock.Mock( spec=drivers.PodVIFDriver) - self._handler._drv_for_vif = h_vif.VIFHandler._drv_for_vif.__get__( - self._handler) - @mock.patch.object(drivers.MultiVIFDriver, 'get_enabled_drivers') @mock.patch.object(drivers.VIFPoolDriver, 'set_vif_driver') @mock.patch.object(drivers.VIFPoolDriver, 'get_instance')