Merge "Delete neutron ports for Failed/Succeeded pods"
This commit is contained in:
commit
256dc2e3b1
|
@ -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'
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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')
|
||||
|
|
Loading…
Reference in New Issue