diff --git a/kuryr_kubernetes/controller/drivers/lbaasv2.py b/kuryr_kubernetes/controller/drivers/lbaasv2.py index 629502aee..9692fcfdc 100644 --- a/kuryr_kubernetes/controller/drivers/lbaasv2.py +++ b/kuryr_kubernetes/controller/drivers/lbaasv2.py @@ -74,6 +74,8 @@ class LBaaSv2Driver(base.LBaaSDriver): if not response: # NOTE(ivc): load balancer was present before 'create', but got # deleted externally between 'create' and 'find' + # NOTE(ltomasbo): or it is in ERROR status, so we deleted and + # trigger the retry raise k_exc.ResourceNotReady(request) return response @@ -521,6 +523,10 @@ class LBaaSv2Driver(base.LBaaSDriver): loadbalancer.id = response['loadbalancers'][0]['id'] loadbalancer.port_id = self._get_vip_port(loadbalancer).get("id") loadbalancer.provider = response['loadbalancers'][0]['provider'] + if (response['loadbalancers'][0]['provisioning_status'] == + 'ERROR'): + self.release_loadbalancer(loadbalancer) + return None except (KeyError, IndexError): return None diff --git a/kuryr_kubernetes/tests/unit/controller/drivers/test_lbaasv2.py b/kuryr_kubernetes/tests/unit/controller/drivers/test_lbaasv2.py index a6ff73947..4545022c0 100644 --- a/kuryr_kubernetes/tests/unit/controller/drivers/test_lbaasv2.py +++ b/kuryr_kubernetes/tests/unit/controller/drivers/test_lbaasv2.py @@ -343,7 +343,8 @@ class TestLBaaSv2Driver(test_base.TestCase): provider='haproxy', security_groups=[]) loadbalancer_id = '00EE9E11-91C2-41CF-8FD4-7970579E5C4C' resp = {'loadbalancers': [{'id': loadbalancer_id, - 'provider': 'haproxy'}]} + 'provider': 'haproxy', + 'provisioning_status': 'ACTIVE'}]} lbaas.list_loadbalancers.return_value = resp m_driver._get_vip_port.return_value = {'id': mock.sentinel.port_id} @@ -357,6 +358,7 @@ class TestLBaaSv2Driver(test_base.TestCase): self.assertEqual(getattr(loadbalancer, attr), getattr(ret, attr)) self.assertEqual(loadbalancer_id, ret.id) + m_driver.release_loadbalancer.assert_not_called() def test_find_loadbalancer_not_found(self): lbaas = self.useFixture(k_fix.MockLBaaSClient()).client @@ -375,6 +377,30 @@ class TestLBaaSv2Driver(test_base.TestCase): vip_address=str(loadbalancer.ip), vip_subnet_id=loadbalancer.subnet_id) self.assertIsNone(ret) + m_driver.release_loadbalancer.assert_not_called() + + def test_find_loadbalancer_error(self): + lbaas = self.useFixture(k_fix.MockLBaaSClient()).client + cls = d_lbaasv2.LBaaSv2Driver + m_driver = mock.Mock(spec=d_lbaasv2.LBaaSv2Driver) + loadbalancer = obj_lbaas.LBaaSLoadBalancer( + name='TEST_NAME', project_id='TEST_PROJECT', ip='1.2.3.4', + subnet_id='D3FA400A-F543-4B91-9CD3-047AF0CE42D1') + loadbalancer_id = '00EE9E11-91C2-41CF-8FD4-7970579E5C4C' + resp = {'loadbalancers': [{'id': loadbalancer_id, + 'provider': 'haproxy', + 'provisioning_status': 'ERROR'}]} + lbaas.list_loadbalancers.return_value = resp + m_driver._get_vip_port.return_value = {'id': mock.sentinel.port_id} + + ret = cls._find_loadbalancer(m_driver, loadbalancer) + lbaas.list_loadbalancers.assert_called_once_with( + name=loadbalancer.name, + project_id=loadbalancer.project_id, + vip_address=str(loadbalancer.ip), + vip_subnet_id=loadbalancer.subnet_id) + self.assertIsNone(ret) + m_driver.release_loadbalancer.assert_called_once() def test_create_listener(self): lbaas = self.useFixture(k_fix.MockLBaaSClient()).client