From 0478a47502beed7efece43a55a39cdd17ee2e96c Mon Sep 17 00:00:00 2001 From: Alexey Perevalov Date: Tue, 28 Aug 2018 03:39:06 -0400 Subject: [PATCH] Add container_id to connect method of BaseBindingDriver container_id is necessary for VHostUserDriver, binding driver writes its configuration to file which contains part of container id, to be able to distinguish conf files inside containers (for case when vhostuser socket dir mounted to several pods). Partially-Implements: support-vhost-user-port-type-on-bm-installation Change-Id: I328585dc6d596371d8511a3cb5ccef907d955c76 Signed-off-by: Alexey Perevalov --- kuryr_kubernetes/cni/binding/base.py | 12 +++++------ kuryr_kubernetes/cni/binding/bridge.py | 20 ++++++++++--------- kuryr_kubernetes/cni/binding/nested.py | 4 ++-- kuryr_kubernetes/cni/handlers.py | 6 ++++-- .../cni/plugins/k8s_cni_registry.py | 3 ++- .../unit/cni/plugins/test_k8s_cni_registry.py | 9 ++++++--- 6 files changed, 31 insertions(+), 23 deletions(-) diff --git a/kuryr_kubernetes/cni/binding/base.py b/kuryr_kubernetes/cni/binding/base.py index b2e33f66f..6eae629d2 100644 --- a/kuryr_kubernetes/cni/binding/base.py +++ b/kuryr_kubernetes/cni/binding/base.py @@ -30,11 +30,11 @@ class BaseBindingDriver(object): """Interface to attach ports to pods.""" @abc.abstractmethod - def connect(self, vif, ifname, netns): + def connect(self, vif, ifname, netns, container_id): raise NotImplementedError() @abc.abstractmethod - def disconnect(self, vif, ifname, netns): + def disconnect(self, vif, ifname, netns, container_id): raise NotImplementedError() @@ -92,19 +92,19 @@ def _configure_l3(vif, ifname, netns, is_default_gateway): def connect(vif, instance_info, ifname, netns=None, report_health=None, - is_default_gateway=True): + is_default_gateway=True, container_id=None): driver = _get_binding_driver(vif) if report_health: report_health(driver.is_healthy()) os_vif.plug(vif, instance_info) - driver.connect(vif, ifname, netns) + driver.connect(vif, ifname, netns, container_id) _configure_l3(vif, ifname, netns, is_default_gateway) def disconnect(vif, instance_info, ifname, netns=None, report_health=None, - **kwargs): + container_id=None, **kwargs): driver = _get_binding_driver(vif) if report_health: report_health(driver.is_healthy()) - driver.disconnect(vif, ifname, netns) + driver.disconnect(vif, ifname, netns, container_id) os_vif.unplug(vif, instance_info) diff --git a/kuryr_kubernetes/cni/binding/bridge.py b/kuryr_kubernetes/cni/binding/bridge.py index c524d6dfb..ee50a4f5d 100644 --- a/kuryr_kubernetes/cni/binding/bridge.py +++ b/kuryr_kubernetes/cni/binding/bridge.py @@ -29,7 +29,7 @@ class BaseBridgeDriver(health.HealthHandler, b_base.BaseBindingDriver): def __init__(self): super(BaseBridgeDriver, self).__init__() - def connect(self, vif, ifname, netns): + def connect(self, vif, ifname, netns, container_id): host_ifname = vif.vif_name with b_base.get_ipdb() as h_ipdb: @@ -67,7 +67,7 @@ class BaseBridgeDriver(health.HealthHandler, b_base.BaseBindingDriver): h_iface.mtu = interface_mtu h_iface.up() - def disconnect(self, vif, ifname, netns): + def disconnect(self, vif, ifname, netns, container_id): pass @@ -75,8 +75,8 @@ class BridgeDriver(BaseBridgeDriver): def __init__(self): super(BridgeDriver, self).__init__() - def connect(self, vif, ifname, netns): - super(BridgeDriver, self).connect(vif, ifname, netns) + def connect(self, vif, ifname, netns, container_id): + super(BridgeDriver, self).connect(vif, ifname, netns, container_id) host_ifname = vif.vif_name bridge_name = vif.bridge_name @@ -84,7 +84,7 @@ class BridgeDriver(BaseBridgeDriver): with h_ipdb.interfaces[bridge_name] as h_br: h_br.add_port(host_ifname) - def disconnect(self, vif, ifname, netns): + def disconnect(self, vif, ifname, netns, container_id): # NOTE(ivc): veth pair is destroyed automatically along with the # container namespace pass @@ -95,16 +95,18 @@ class VIFOpenVSwitchDriver(BaseBridgeDriver): def __init__(self): super(VIFOpenVSwitchDriver, self).__init__() - def connect(self, vif, ifname, netns): - super(VIFOpenVSwitchDriver, self).connect(vif, ifname, netns) + def connect(self, vif, ifname, netns, container_id): + super(VIFOpenVSwitchDriver, self).connect(vif, ifname, netns, + container_id) # FIXME(irenab) use pod_id (neutron port device_id) instance_id = 'kuryr' net_utils.create_ovs_vif_port(vif.bridge_name, vif.vif_name, vif.port_profile.interface_id, vif.address, instance_id) - def disconnect(self, vif, ifname, netns): - super(VIFOpenVSwitchDriver, self).disconnect(vif, ifname, netns) + def disconnect(self, vif, ifname, netns, container_id): + super(VIFOpenVSwitchDriver, self).disconnect(vif, ifname, netns, + container_id) net_utils.delete_ovs_vif_port(vif.bridge_name, vif.vif_name) def is_healthy(self): diff --git a/kuryr_kubernetes/cni/binding/nested.py b/kuryr_kubernetes/cni/binding/nested.py index c969e0dca..36a96fc4b 100644 --- a/kuryr_kubernetes/cni/binding/nested.py +++ b/kuryr_kubernetes/cni/binding/nested.py @@ -35,7 +35,7 @@ class NestedDriver(health.HealthHandler, b_base.BaseBindingDriver): def _get_iface_create_args(self, vif): raise NotImplementedError() - def connect(self, vif, ifname, netns): + def connect(self, vif, ifname, netns, container_id): with b_base.get_ipdb() as h_ipdb: # NOTE(vikasc): Ideally 'ifname' should be used here but instead a # temporary name is being used while creating the device for @@ -62,7 +62,7 @@ class NestedDriver(health.HealthHandler, b_base.BaseBindingDriver): iface.address = str(vif.address) iface.up() - def disconnect(self, vif, ifname, netns): + def disconnect(self, vif, ifname, netns, container_id): # NOTE(vikasc): device will get deleted with container namespace, so # nothing to be done here. pass diff --git a/kuryr_kubernetes/cni/handlers.py b/kuryr_kubernetes/cni/handlers.py index 2a1c1dc11..47509c009 100644 --- a/kuryr_kubernetes/cni/handlers.py +++ b/kuryr_kubernetes/cni/handlers.py @@ -111,7 +111,8 @@ class AddHandler(CNIHandlerBase): is_default_gateway = (ifname == self._cni.CNI_IFNAME) b_base.connect(_vif, self._get_inst(pod), ifname, self._cni.CNI_NETNS, - is_default_gateway=is_default_gateway) + is_default_gateway=is_default_gateway, + container_id=self._cni.CNI_CONTAINERID) def should_callback(self, pod, vifs): """Called after all vifs have been processed @@ -147,7 +148,8 @@ class DelHandler(CNIHandlerBase): def on_vif(self, pod, vif, ifname): b_base.disconnect(vif, self._get_inst(pod), - self._cni.CNI_IFNAME, self._cni.CNI_NETNS) + self._cni.CNI_IFNAME, self._cni.CNI_NETNS, + container_id=self._cni.CNI_CONTAINERID) def should_callback(self, pod, vifs): """Called after all vifs have been processed diff --git a/kuryr_kubernetes/cni/plugins/k8s_cni_registry.py b/kuryr_kubernetes/cni/plugins/k8s_cni_registry.py index b00f38584..640c7d0b3 100644 --- a/kuryr_kubernetes/cni/plugins/k8s_cni_registry.py +++ b/kuryr_kubernetes/cni/plugins/k8s_cni_registry.py @@ -131,7 +131,8 @@ class K8sCNIRegistryPlugin(base_cni.CNIPlugin): is_default_gateway = (ifname == params.CNI_IFNAME) fn(vif, self._get_inst(pod), ifname, params.CNI_NETNS, report_health=self.report_drivers_health, - is_default_gateway=is_default_gateway) + is_default_gateway=is_default_gateway, + container_id=params.CNI_CONTAINERID) return vifs def _get_inst(self, pod): diff --git a/kuryr_kubernetes/tests/unit/cni/plugins/test_k8s_cni_registry.py b/kuryr_kubernetes/tests/unit/cni/plugins/test_k8s_cni_registry.py index 11c1d36f8..78d8254b0 100644 --- a/kuryr_kubernetes/tests/unit/cni/plugins/test_k8s_cni_registry.py +++ b/kuryr_kubernetes/tests/unit/cni/plugins/test_k8s_cni_registry.py @@ -45,7 +45,8 @@ class TestK8sCNIRegistryPlugin(base.TestCase): m_lock.assert_called_with('default/foo', external=True) m_connect.assert_called_with(mock.ANY, mock.ANY, 'eth0', 123, report_health=mock.ANY, - is_default_gateway=mock.ANY) + is_default_gateway=mock.ANY, + container_id='cont_id') self.assertEqual('cont_id', self.plugin.registry['default/foo']['containerid']) @@ -55,7 +56,8 @@ class TestK8sCNIRegistryPlugin(base.TestCase): m_disconnect.assert_called_with(mock.ANY, mock.ANY, 'eth0', 123, report_health=mock.ANY, - is_default_gateway=mock.ANY) + is_default_gateway=mock.ANY, + container_id='cont_id') @mock.patch('kuryr_kubernetes.cni.binding.base.disconnect') def test_del_wrong_container_id(self, m_disconnect): @@ -88,7 +90,8 @@ class TestK8sCNIRegistryPlugin(base.TestCase): 'containerid': 'cont_id'}) m_connect.assert_called_with(mock.ANY, mock.ANY, 'eth0', 123, report_health=mock.ANY, - is_default_gateway=mock.ANY) + is_default_gateway=mock.ANY, + container_id='cont_id') @mock.patch('time.sleep', mock.Mock()) def test_add_not_present(self):