Services: update service's status after LB completely provisioned.

When creating a service of type 'LoadBalancer', you create
a cloud network load balancer.
This provides an externally-accessible IP address that sends
traffic to the correct port on your cluster nodes.
The external IP address is stored in k8s service's status
information (under loadbalancer/ingress/ip).

Kuryr implements this capability using OpenStack floating IP
functionality.
This patch updates Kuryr to store external IP information only after
LB was entirely configured in OpenStack.

Change-Id: I1d43f03d49d6e760c859f219aa9a4c209087c753
Closes-Bug: 1756730
(cherry picked from commit e0dfd36e36)
This commit is contained in:
Yossi Boaron 2018-03-18 22:47:29 +02:00 committed by Luis Tomas Bolivar
parent 985c387949
commit c7528a132d
2 changed files with 42 additions and 4 deletions

View File

@ -235,7 +235,14 @@ class LoadBalancerHandler(k8s_base.ResourceEventHandler):
if not lbaas_state:
lbaas_state = obj_lbaas.LBaaSState()
prev_service_pub_ip_info = lbaas_state.service_pub_ip_info
if self._sync_lbaas_members(endpoints, lbaas_state, lbaas_spec):
# For LoadBalancer service type, update k8s-service status with
# floating IP address if needed.
if (prev_service_pub_ip_info != lbaas_state.service_pub_ip_info
and lbaas_state.service_pub_ip_info is not None):
self._update_lb_status(
endpoints, lbaas_state.service_pub_ip_info.ip_addr)
# REVISIT(ivc): since _sync_lbaas_members is responsible for
# creating all lbaas components (i.e. load balancer, listeners,
# pools, members), it is currently possible for it to fail (due
@ -562,12 +569,8 @@ class LoadBalancerHandler(k8s_base.ResourceEventHandler):
if service_pub_ip_info:
# if loadbalancerIP should be defined for lbaas,
# associate it to lbaas VIP
# and update k8s-service status with
# loadbalancerIP address
self._drv_service_pub_ip.associate_pub_ip(
service_pub_ip_info, lb.port_id)
self._update_lb_status(
endpoints, service_pub_ip_info.ip_addr)
lbaas_state.service_pub_ip_info = service_pub_ip_info
changed = True
elif lbaas_state.service_pub_ip_info:

View File

@ -428,6 +428,7 @@ class TestLoadBalancerHandler(test_base.TestCase):
def test_on_present(self):
lbaas_spec = mock.sentinel.lbaas_spec
lbaas_state = mock.sentinel.lbaas_state
lbaas_state.service_pub_ip_info = None
endpoints = mock.sentinel.endpoints
m_handler = mock.Mock(spec=h_lbaas.LoadBalancerHandler)
@ -445,10 +446,44 @@ class TestLoadBalancerHandler(test_base.TestCase):
endpoints, lbaas_state, lbaas_spec)
m_handler._set_lbaas_state.assert_called_once_with(
endpoints, lbaas_state)
m_handler._update_lb_status.assert_not_called()
def _fake_sync_lbaas_members(self, endpoints, lbaas_state, lbaas_spec):
floating_ip = {'floating_ip_address': '1.2.3.5',
'id': 'ec29d641-fec4-4f67-928a-124a76b3a888'}
service_pub_ip_info = obj_lbaas.LBaaSPubIp(
ip_id=floating_ip['id'],
ip_addr=floating_ip['floating_ip_address'], alloc_method='kk')
lbaas_state.service_pub_ip_info = service_pub_ip_info
return True
def test_on_present_loadbalancer_service(self):
lbaas_spec = mock.sentinel.lbaas_spec
lbaas_state = mock.sentinel.lbaas_state
lbaas_state.service_pub_ip_info = None
endpoints = mock.sentinel.endpoints
m_handler = mock.Mock(spec=h_lbaas.LoadBalancerHandler)
m_handler._get_lbaas_spec.return_value = lbaas_spec
m_handler._should_ignore.return_value = False
m_handler._get_lbaas_state.return_value = lbaas_state
m_handler._sync_lbaas_members = self._fake_sync_lbaas_members
h_lbaas.LoadBalancerHandler.on_present(m_handler, endpoints)
m_handler._get_lbaas_spec.assert_called_once_with(endpoints)
m_handler._should_ignore.assert_called_once_with(endpoints, lbaas_spec)
m_handler._get_lbaas_state.assert_called_once_with(endpoints)
m_handler._set_lbaas_state.assert_called_once_with(
endpoints, lbaas_state)
m_handler._update_lb_status.assert_called()
def test_on_present_rollback(self):
lbaas_spec = mock.sentinel.lbaas_spec
lbaas_state = mock.sentinel.lbaas_state
lbaas_state.service_pub_ip_info = None
endpoints = mock.sentinel.endpoints
m_handler = mock.Mock(spec=h_lbaas.LoadBalancerHandler)