diff --git a/kuryr_kubernetes/clients.py b/kuryr_kubernetes/clients.py index 47307589d..1b7afb56c 100644 --- a/kuryr_kubernetes/clients.py +++ b/kuryr_kubernetes/clients.py @@ -103,7 +103,7 @@ def _create_ports(self, payload): response = self.post(os_port.Port.base_path, json=payload) if not response.ok: - raise os_exc.SDKException('Error when bulk creating ports: %s', + raise os_exc.SDKException('Error when bulk creating ports: %s' % response.text) return (os_port.Port(**item) for item in response.json()['ports']) diff --git a/kuryr_kubernetes/tests/unit/test_clients.py b/kuryr_kubernetes/tests/unit/test_clients.py index 5d1965f7d..7fb8efa37 100644 --- a/kuryr_kubernetes/tests/unit/test_clients.py +++ b/kuryr_kubernetes/tests/unit/test_clients.py @@ -15,6 +15,7 @@ from unittest import mock +from openstack import exceptions as os_exc from openstack.network.v2 import port as os_port from kuryr_kubernetes import clients @@ -128,3 +129,27 @@ class TestOpenStackSDKHack(test_base.TestCase): clients._create_ports(m_osdk, payload) m_post.assert_called_once_with(os_port.Port.base_path, json=expected) + + def test_create_ports_out_of_ports(self): + """Simulate error response from OpenStack SDK""" + m_response = mock.Mock() + m_response.text = ('{"NeutronError": {"type": "OverQuota", "message": ' + '"Quota exceeded for resources: [\'port\'].", ' + '"detail": ""}}') + m_response.ok = False + m_post = mock.Mock() + m_post.return_value = m_response + m_osdk = mock.Mock() + m_osdk.post = m_post + + payload = {'ports': []} + + try: + clients._create_ports(m_osdk, payload) + except os_exc.SDKException as ex: + # no additional params passed to the exception class + self.assertIsNone(ex.extra_data) + # no formatting placeholders in message + self.assertNotIn('%s', ex.message) + + m_post.assert_called_once_with(os_port.Port.base_path, json=payload)