OCP-Router - Fix Ingress controller LB listener creation

After the changes done at LBaaS driver to support
namespace network isolation Ingress controller fails to
create/ensure Listener for the L7 Router LB.

This patch fixes this issue, and also update ingress controller
code to retrieve L7 router's LB details in the context of
the working thread.

Closes-Bug: 1787883

Change-Id: Ia63785bdc9018f8ecd3ad820bb484f34c48e9569
This commit is contained in:
Yossi Boaron
2018-08-19 20:30:57 +03:00
parent 0f6eea35bc
commit 831ee03d6f
2 changed files with 37 additions and 14 deletions

View File

@@ -12,7 +12,6 @@
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import eventlet
import time
@@ -68,7 +67,11 @@ class L7Router(object):
# create/verify listeners
self._l7_router_listeners = {}
listener = self._drv_l7_router.ensure_listener(
self._router_lb, 'HTTP', k_const.KURYR_L7_ROUTER_HTTP_PORT)
self._router_lb, 'HTTP', k_const.KURYR_L7_ROUTER_HTTP_PORT,
service_type=None)
LOG.info("Ingress controller - "
"retrieve HTTP listener details '%s'", listener)
self._l7_router_listeners[k_const.KURYR_L7_ROUTER_HTTP_PORT] = listener
def get_router(self):
@@ -107,9 +110,9 @@ class IngressCtrlr(object):
try:
self._status = 'IN_PROGRESS'
self._l7_router.ensure_router()
except Exception:
except Exception as e:
self._status = 'DOWN'
LOG.error("Ingress controller - failed to get L7 router")
LOG.error("Ingress controller - failed to get L7 router (%s)", e)
return
self._status = 'ACTIVE'
LOG.info("Ingress controller - ACTIVE")
@@ -131,10 +134,7 @@ class IngressCtrlr(object):
'Ingress-LB handlers should be enabled, and '
'l7_router_uuid should be specified')
return
# Note(yboaron) Create a new thread for L7 router/LB configuration
# verification, a separate thread is needed since it might be that
# router not created yet and we can't block controller/service thread.
eventlet.spawn(self._start_operation_impl)
self._start_operation_impl()
def get_router_and_listener(self):
"""This function returns L7 router and Listeners details,

View File

@@ -46,27 +46,50 @@ class TestIngressCtrlr(test_base.TestCase):
self.assertIsNone(ret_l7router)
self.assertIsNone(ret_listener)
@mock.patch('eventlet.spawn')
@mock.patch('kuryr_kubernetes.controller.drivers.base'
'.LBaaSDriver.get_instance')
@mock.patch('kuryr_kubernetes.config.CONF')
def test_ingress_ctrlr_router_enabled_k8s(self, m_cfg, m_eventlet):
def test_ingress_ctrlr_router_enabled_k8s(self, m_cfg, m_get_lbaas_drv):
m_cfg.kubernetes.enabled_handlers = ['ingresslb']
m_cfg.ingress.l7_router_uuid = '00EE9E11-91C2-41CF-8FD4-7970579E5C4C'
l7_router = obj_lbaas.LBaaSLoadBalancer(
name='TEST_NAME', project_id='TEST_PROJECT', ip='1.2.3.4',
subnet_id='D3FA400A-F543-4B91-9CD3-047AF0CE42D1',
security_groups=[],
id='00EE9E11-91C2-41CF-8FD4-7970579E5C4C')
m_driver = mock.Mock()
m_driver.get_lb_by_uuid.return_value = l7_router
m_get_lbaas_drv.return_value = m_driver
ing_ctrl = ingress_ctl.IngressCtrlr.get_instance()
ing_ctrl.start_operation()
self.assertIsNotNone(ing_ctrl)
m_eventlet.assert_called_once()
self.assertEqual(ing_ctrl._status, 'ACTIVE')
@mock.patch('eventlet.spawn')
@mock.patch('kuryr_kubernetes.controller.drivers.base'
'.LBaaSDriver.get_instance')
@mock.patch('kuryr_kubernetes.config.CONF')
def test_ingress_ctrlr_router_enabled_ocp(self, m_cfg, m_eventlet):
def test_ingress_ctrlr_router_enabled_ocp(self, m_cfg, m_get_lbaas_drv):
m_cfg.kubernetes.enabled_handlers = ['ocproute']
m_cfg.ingress.l7_router_uuid = '00EE9E11-91C2-41CF-8FD4-7970579E5C4C'
l7_router = obj_lbaas.LBaaSLoadBalancer(
name='TEST_NAME', project_id='TEST_PROJECT', ip='1.2.3.4',
subnet_id='D3FA400A-F543-4B91-9CD3-047AF0CE42D1',
security_groups=[],
id='00EE9E11-91C2-41CF-8FD4-7970579E5C4C')
m_driver = mock.Mock()
m_driver.get_lb_by_uuid.return_value = l7_router
m_get_lbaas_drv.return_value = m_driver
ing_ctrl = ingress_ctl.IngressCtrlr.get_instance()
ing_ctrl.start_operation()
self.assertIsNotNone(ing_ctrl)
m_eventlet.assert_called_once()
self.assertEqual(ing_ctrl._status, 'ACTIVE')
@mock.patch('kuryr_kubernetes.controller.drivers.base'
'.LBaaSDriver.get_instance')