Merge "Update sriov neutron ports with pci info"
This commit is contained in:
commit
53059406ea
|
@ -132,6 +132,12 @@ We have to add to the sriov section following mapping:
|
|||
physnet_resource_mappings = physnet1:numa0
|
||||
|
||||
|
||||
6. Use privileged user
|
||||
|
||||
To make neutron ports active kuryr-k8s makes requests to neutron API to update
|
||||
ports with binding:profile information. Due to this it is necessary to make
|
||||
actions with privileged user with admin rights.
|
||||
|
||||
Reference
|
||||
---------
|
||||
|
||||
|
|
|
@ -61,6 +61,7 @@ CNI_TIMEOUT_CODE = 200
|
|||
|
||||
KURYR_PORT_NAME = 'kuryr-pool-port'
|
||||
KURYR_L7_ROUTER_HTTP_PORT = '80'
|
||||
KURYR_VIF_TYPE_SRIOV = 'sriov'
|
||||
|
||||
OCTAVIA_L2_MEMBER_MODE = "L2"
|
||||
OCTAVIA_L3_MEMBER_MODE = "L3"
|
||||
|
|
|
@ -485,3 +485,36 @@ def get_namespace(namespace_name):
|
|||
return kubernetes.get(
|
||||
'{}/namespaces/{}'.format(
|
||||
constants.K8S_API_BASE, namespace_name))
|
||||
|
||||
|
||||
def update_port_pci_info(pod, vif):
|
||||
node = get_host_id(pod)
|
||||
annot_port_pci_info = get_port_annot_pci_info(node, vif.id)
|
||||
neutron = clients.get_neutron_client()
|
||||
LOG.debug("Neutron port %s is updated with binding:profile info %s",
|
||||
vif.id, annot_port_pci_info)
|
||||
neutron.update_port(
|
||||
vif.id,
|
||||
{
|
||||
"port": {
|
||||
'binding:profile': annot_port_pci_info
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
def get_port_annot_pci_info(nodename, neutron_port):
|
||||
k8s = clients.get_kubernetes_client()
|
||||
annot_name = constants.K8S_ANNOTATION_NODE_PCI_DEVICE_INFO
|
||||
annot_name = annot_name + '-' + neutron_port
|
||||
|
||||
node_info = k8s.get('/api/v1/nodes/{}'.format(nodename))
|
||||
annotations = node_info['metadata']['annotations']
|
||||
try:
|
||||
json_pci_info = annotations[annot_name]
|
||||
pci_info = jsonutils.loads(json_pci_info)
|
||||
except KeyError:
|
||||
pci_info = {}
|
||||
except Exception:
|
||||
LOG.exception('Exception when reading annotations '
|
||||
'%s and converting from json', annot_name)
|
||||
return pci_info
|
||||
|
|
|
@ -121,6 +121,8 @@ class VIFHandler(k8s_base.ResourceEventHandler):
|
|||
else:
|
||||
changed = False
|
||||
for ifname, vif in state.vifs.items():
|
||||
if vif.plugin == constants.KURYR_VIF_TYPE_SRIOV:
|
||||
driver_utils.update_port_pci_info(pod, vif)
|
||||
if not vif.active:
|
||||
self._drv_vif_pool.activate_vif(pod, vif)
|
||||
changed = True
|
||||
|
|
|
@ -133,14 +133,18 @@ class TestVIFHandler(test_base.TestCase):
|
|||
self.assertFalse(h_vif.VIFHandler._is_pending_node({'spec': {},
|
||||
'status': {}}))
|
||||
|
||||
@mock.patch('kuryr_kubernetes.controller.drivers.utils.'
|
||||
'update_port_pci_info')
|
||||
@mock.patch('kuryr_kubernetes.controller.drivers.utils.is_host_network')
|
||||
@mock.patch('kuryr_kubernetes.controller.drivers.utils.get_pod_state')
|
||||
def test_on_present(self, m_get_pod_state, m_host_network):
|
||||
def test_on_present(self, m_get_pod_state, m_host_network, m_update_pci):
|
||||
m_get_pod_state.return_value = self._state
|
||||
m_host_network.return_value = False
|
||||
self._vif.plugin = 'sriov'
|
||||
h_vif.VIFHandler.on_present(self._handler, self._pod)
|
||||
|
||||
m_get_pod_state.assert_called_once_with(self._pod)
|
||||
m_update_pci.assert_called_once_with(self._pod, self._vif)
|
||||
self._request_vif.assert_not_called()
|
||||
self._request_additional_vifs.assert_not_called()
|
||||
self._activate_vif.assert_not_called()
|
||||
|
@ -175,19 +179,23 @@ class TestVIFHandler(test_base.TestCase):
|
|||
self._activate_vif.assert_not_called()
|
||||
self._set_pod_state.assert_not_called()
|
||||
|
||||
@mock.patch('kuryr_kubernetes.controller.drivers.utils.'
|
||||
'update_port_pci_info')
|
||||
@mock.patch('kuryr_kubernetes.controller.drivers.utils.get_services')
|
||||
@mock.patch('kuryr_kubernetes.controller.drivers.utils.is_host_network')
|
||||
@mock.patch('kuryr_kubernetes.controller.drivers.utils.get_pod_state')
|
||||
def test_on_present_activate(self, m_get_pod_state, m_host_network,
|
||||
m_get_services):
|
||||
m_get_services, m_update_pci):
|
||||
m_get_pod_state.return_value = self._state
|
||||
m_host_network.return_value = False
|
||||
m_get_services.return_value = {"items": []}
|
||||
self._vif.active = False
|
||||
self._vif.plugin = 'sriov'
|
||||
|
||||
h_vif.VIFHandler.on_present(self._handler, self._pod)
|
||||
|
||||
m_get_pod_state.assert_called_once_with(self._pod)
|
||||
m_update_pci.assert_called_once_with(self._pod, self._vif)
|
||||
self._activate_vif.assert_called_once_with(self._pod, self._vif)
|
||||
self._set_pod_state.assert_called_once_with(self._pod, self._state)
|
||||
self._request_vif.assert_not_called()
|
||||
|
|
Loading…
Reference in New Issue