Merge "Delete neutron ports for Failed/Succeeded pods"

This commit is contained in:
Zuul 2020-03-24 11:54:47 +00:00 committed by Gerrit Code Review
commit 256dc2e3b1
3 changed files with 70 additions and 3 deletions

View File

@ -36,6 +36,8 @@ K8S_OBJ_KURYRNETPOLICY = 'KuryrNetPolicy'
K8S_OBJ_KURYRLOADBALANCER = 'KuryrLoadBalancer'
K8S_POD_STATUS_PENDING = 'Pending'
K8S_POD_STATUS_SUCCEEDED = 'Succeeded'
K8S_POD_STATUS_FAILED = 'Failed'
K8S_ANNOTATION_PREFIX = 'openstack.org/kuryr'
K8S_ANNOTATION_VIF = K8S_ANNOTATION_PREFIX + '-vif'

View File

@ -63,6 +63,23 @@ class VIFHandler(k8s_base.ResourceEventHandler):
drivers.ServiceSecurityGroupsDriver.get_instance())
def on_present(self, pod):
state = driver_utils.get_pod_state(pod)
if (self._is_pod_completed(pod)):
if state:
LOG.debug("Pod has completed execution, removing the vifs")
self.on_deleted(pod)
try:
self._set_pod_state(pod, None)
except k_exc.K8sClientException:
LOG.exception("Could not clear pod annotation")
raise k_exc.ResourceNotReady(pod['metadata']['name'])
except k_exc.K8sResourceNotFound:
pass
else:
LOG.debug("Pod has completed execution, no annotation found."
" Skipping")
return
if (driver_utils.is_host_network(pod) or
not self._is_pod_scheduled(pod)):
# REVISIT(ivc): consider an additional configurable check that
@ -70,7 +87,6 @@ class VIFHandler(k8s_base.ResourceEventHandler):
# where certain pods/namespaces/nodes can be managed by other
# networking solutions/CNI drivers.
return
state = driver_utils.get_pod_state(pod)
LOG.debug("Got VIFs from annotation: %r", state)
project_id = self._drv_project.get_project(pod)
security_groups = self._drv_sg.get_security_groups(pod, project_id)
@ -209,6 +225,15 @@ class VIFHandler(k8s_base.ResourceEventHandler):
except KeyError:
return False
@staticmethod
def _is_pod_completed(pod):
try:
return (pod['status']['phase'] in
(constants.K8S_POD_STATUS_SUCCEEDED,
constants.K8S_POD_STATUS_FAILED))
except KeyError:
return False
def _set_pod_state(self, pod, state):
# TODO(ivc): extract annotation interactions
if not state:

View File

@ -70,12 +70,14 @@ class TestVIFHandler(test_base.TestCase):
self._activate_vif = self._handler._drv_vif_pool.activate_vif
self._set_pod_state = self._handler._set_pod_state
self._is_pod_scheduled = self._handler._is_pod_scheduled
self._is_pod_completed = self._handler._is_pod_completed
self._request_additional_vifs = \
self._multi_vif_drv.request_additional_vifs
self._request_vif.return_value = self._vif
self._request_additional_vifs.return_value = self._additioan_vifs
self._is_pod_scheduled.return_value = True
self._is_pod_completed.return_value = False
self._get_project.return_value = self._project_id
self._get_subnets.return_value = self._subnets
self._get_security_groups.return_value = self._security_groups
@ -139,6 +141,17 @@ class TestVIFHandler(test_base.TestCase):
self.assertFalse(h_vif.VIFHandler._is_pod_scheduled({'spec': {},
'status': {}}))
def test_is_pod_completed_pending(self):
self.assertFalse(h_vif.VIFHandler._is_pod_completed(self._pod))
def test_is_pod_completed_succeeded(self):
self.assertTrue(h_vif.VIFHandler._is_pod_completed({'status': {'phase':
k_const.K8S_POD_STATUS_SUCCEEDED}}))
def test_is_pod_completed_failed(self):
self.assertTrue(h_vif.VIFHandler._is_pod_completed({'status': {'phase':
k_const.K8S_POD_STATUS_FAILED}}))
@mock.patch('oslo_config.cfg.CONF')
@mock.patch('kuryr_kubernetes.controller.drivers.utils.'
'update_port_pci_info')
@ -167,7 +180,7 @@ class TestVIFHandler(test_base.TestCase):
h_vif.VIFHandler.on_present(self._handler, self._pod)
m_get_pod_state.assert_not_called()
m_get_pod_state.assert_called_once()
self._request_vif.assert_not_called()
self._request_additional_vifs.assert_not_called()
self._activate_vif.assert_not_called()
@ -182,12 +195,39 @@ class TestVIFHandler(test_base.TestCase):
h_vif.VIFHandler.on_present(self._handler, self._pod)
m_get_pod_state.assert_not_called()
m_get_pod_state.assert_called_once()
self._request_vif.assert_not_called()
self._request_additional_vifs.assert_not_called()
self._activate_vif.assert_not_called()
self._set_pod_state.assert_not_called()
@mock.patch('kuryr_kubernetes.controller.drivers.utils.get_pod_state')
def test_on_present_on_completed_with_annotation(self, m_get_pod_state):
self._is_pod_completed.return_value = True
m_get_pod_state.return_value = self._state
h_vif.VIFHandler.on_present(self._handler, self._pod)
self._handler.on_deleted.assert_called_once_with(self._pod)
self._set_pod_state.assert_called_once_with(self._pod, None)
self._request_vif.assert_not_called()
self._request_additional_vifs.assert_not_called()
self._activate_vif.assert_not_called()
@mock.patch('kuryr_kubernetes.controller.drivers.utils.get_pod_state')
def test_on_present_on_completed_without_annotation(self, m_get_pod_state):
self._is_pod_completed.return_value = True
m_get_pod_state.return_value = None
h_vif.VIFHandler.on_present(self._handler, self._pod)
self._handler.on_deleted.assert_not_called()
self._set_pod_state.assert_not_called()
self._request_vif.assert_not_called()
self._request_additional_vifs.assert_not_called()
self._activate_vif.assert_not_called()
@mock.patch('oslo_config.cfg.CONF')
@mock.patch('kuryr_kubernetes.controller.drivers.utils.'
'update_port_pci_info')