LoadBalancer Members Reconciliation

This patchset implements the members reconciliation to
ensure that members in pools in OpenStack are matching that of
the respective Kubernetes Endpoints.

Implements: blueprint reconcile-openstack-resources-with-k8s
Depends-On: https://review.opendev.org/c/openstack/ovn-octavia-provider/+/854764
Change-Id: Id7df1d13ca80a08e7a4b33949a3584845403d9ba
This commit is contained in:
Sunday Mgbogu 2022-06-14 20:47:07 +01:00 committed by Michał Dulko
parent 846f158724
commit 93ef2f8650
2 changed files with 59 additions and 12 deletions

View File

@ -182,8 +182,9 @@ class KuryrLoadBalancerHandler(k8s_base.ResourceEventHandler):
lbaas = clients.get_loadbalancer_client()
resources_fn = {'loadbalancer': lbaas.load_balancers,
'listener': lbaas.listeners,
'pool': lbaas.pools}
resources = {'loadbalancer': [], 'listener': [], 'pool': []}
'pool': lbaas.pools, 'member': lbaas.members}
resources = {'loadbalancer': [], 'listener': [], 'pool': [],
'member': []}
for klb in loadbalancer_crds:
if klb['metadata'].get('deletionTimestamp'):
@ -205,16 +206,32 @@ class KuryrLoadBalancerHandler(k8s_base.ResourceEventHandler):
resources['pool'].append({'id': pl['id'],
'selflink': selflink,
'pklb': klb})
for lbm in klb.get('status', {}).get('members', []):
resources['member'].append({'id': lbm['id'],
'selflink': selflink,
'mklb': klb,
'pool_id': lbm['pool_id']})
resources_already_triggered = []
# let's reconcile load balancers first, listeners and then pools
resource_types = ('loadbalancer', 'listener', 'pool')
# let's reconcile load balancers first, listeners, pools
# and then members
resource_types = ('loadbalancer', 'listener', 'pool', 'member')
for resource_type in resource_types:
filters = {}
self._drv_lbaas.add_tags(resource_type, filters)
os_list = resources_fn[resource_type]
os_resources = os_list(**filters)
os_resources_id = [rsrc['id'] for rsrc in os_resources]
if resource_type == 'member':
pool_ids = [cr_member['pool_id'] for cr_member in
resources[resource_type]]
pool_ids = list(set(pool_ids))
os_resources_id = []
for pl_id in pool_ids:
os_resources = os_list(pl_id, **filters)
os_resources_id.extend([rsrc['id'] for rsrc in
os_resources])
else:
os_resources = os_list(**filters)
os_resources_id = [rsrc['id'] for rsrc in os_resources]
for data in resources[resource_type]:
if data['selflink'] in resources_already_triggered:
continue
@ -228,15 +245,21 @@ class KuryrLoadBalancerHandler(k8s_base.ResourceEventHandler):
kubernetes = clients.get_kubernetes_client()
try:
if data.get('klb'):
self._add_event(data['klb'], 'LoadBalancerRecreating',
self._add_event(data['klb'], 'LoadBalancerMissing',
'Load balancer for the Service does not '
'exist anymore. Recreating it.', 'Warning')
if data.get('lklb'):
self._add_event(data['lklb'], 'Load Balancer listener does not'
' exist anymore. Recreating it.', 'Warning')
self._add_event(data['lklb'], 'LoadBalancerListenerMissing',
'Load Balancer listener does not exist '
'anymore. Recreating it.', 'Warning')
if data.get('pklb'):
self._add_event(data['pklb'], 'Load Balancer pool does not '
'exist anymore. Recreating it.', 'Warning')
self._add_event(data['pklb'], 'LoadBalancerPoolMissing',
'Load Balancer pool does not exist anymore. '
'Recreating it.', 'Warning')
if data.get('mklb'):
self._add_event(data['mklb'], 'LoadBalancerMemberMissing',
'Load Balancer member does not exist anymore. '
'Recreating it.', 'Warning')
kubernetes.patch_crd('status', data['selflink'], {})
except k_exc.K8sResourceNotFound:

View File

@ -187,6 +187,17 @@ def get_lb_crds():
"protocol": "TCP"
}
],
"members": [
{
"id": "0123456789a",
"ip": "1.1.1.1",
"name": "default/test-f87976f9c-thjbk:8080",
"pool_id": "1234567890",
"port": 2,
"project_id": "12345678912",
"subnet_id": "123456789120"
}
],
}
},
{
@ -237,7 +248,17 @@ def get_lb_crds():
"protocol": "TCP"
}
],
"members": [
{
"id": "0123456789b",
"ip": "1.1.1.1",
"name": "default/test_1-f87976f9c-thjbk:8080",
"pool_id": "1234567891",
"port": 2,
"project_id": "12345678913",
"subnet_id": "123456789121"
}
],
}
}
]
@ -639,6 +660,7 @@ class TestKuryrLoadBalancerHandler(test_base.TestCase):
lbaas.load_balancers.return_value = []
lbaas.listeners.return_value = []
lbaas.pools.return_value = []
lbaas.members.return_value = []
selflink = ('/apis/openstack.org/v1/namespaces/default/'
'kuryrloadbalancers/test')
m_get_res_link.return_value = selflink
@ -663,9 +685,11 @@ class TestKuryrLoadBalancerHandler(test_base.TestCase):
loadbalancers_id = [{'id': '01234567890'}, {'id': '01234567891'}]
listeners_id = [{'id': '012345678912'}, {'id': '012345678913'}]
pools_id = [{'id': '1234567890'}, {'id': '1234567891'}]
members_id = [{"id": "0123456789a"}, {"id": "0123456789b"}]
lbaas.load_balancers.return_value = loadbalancers_id
lbaas.listeners.return_value = listeners_id
lbaas.pools.return_value = pools_id
lbaas.members.return_value = members_id
h_lb.KuryrLoadBalancerHandler._trigger_reconciliation(
m_handler, loadbalancer_crds)