Merge "Services: Add support for K8S service's port edit use case"
This commit is contained in:
commit
70d470c992
@ -429,11 +429,23 @@ class LoadBalancerHandler(k8s_base.ResourceEventHandler):
|
||||
|
||||
return changed
|
||||
|
||||
def _is_pool_in_spec(self, pool, lbaas_state, lbaas_spec):
|
||||
# NOTE(yboaron): in order to check if a specific pool is in lbaas_spec
|
||||
# we should:
|
||||
# 1. get the listener that pool is attached to
|
||||
# 2. check if listener's attributes appear in lbaas_spec.
|
||||
for l in lbaas_state.listeners:
|
||||
if l.id != pool.listener_id:
|
||||
continue
|
||||
for port in lbaas_spec.ports:
|
||||
if l.port == port.port and l.protocol == port.protocol:
|
||||
return True
|
||||
return False
|
||||
|
||||
def _remove_unused_pools(self, endpoints, lbaas_state, lbaas_spec):
|
||||
current_pools = {m.pool_id for m in lbaas_state.members}
|
||||
removed_ids = set()
|
||||
for pool in lbaas_state.pools:
|
||||
if pool.id in current_pools:
|
||||
if self._is_pool_in_spec(pool, lbaas_state, lbaas_spec):
|
||||
continue
|
||||
self._drv_lbaas.release_pool(endpoints,
|
||||
lbaas_state.loadbalancer,
|
||||
|
@ -712,6 +712,48 @@ class TestLoadBalancerHandler(test_base.TestCase):
|
||||
self.assertEqual([], observed_targets)
|
||||
self.assertEqual(expected_ip, str(state.loadbalancer.ip))
|
||||
|
||||
@mock.patch('kuryr_kubernetes.controller.drivers.base'
|
||||
'.PodSubnetsDriver.get_instance')
|
||||
@mock.patch('kuryr_kubernetes.controller.drivers.base'
|
||||
'.PodProjectDriver.get_instance')
|
||||
@mock.patch('kuryr_kubernetes.controller.drivers.base'
|
||||
'.LBaaSDriver.get_instance')
|
||||
def test_sync_lbaas_members_svc_listener_port_edit(
|
||||
self, m_get_drv_lbaas, m_get_drv_project, m_get_drv_subnets):
|
||||
# REVISIT(ivc): test methods separately and verify ensure/release
|
||||
project_id = uuidutils.generate_uuid()
|
||||
subnet_id = uuidutils.generate_uuid()
|
||||
current_ip = '1.1.1.1'
|
||||
current_targets = {
|
||||
'1.1.1.101': (1001, 10001)}
|
||||
expected_ip = '1.1.1.1'
|
||||
expected_targets = {
|
||||
'1.1.1.101': (1201, 10001)}
|
||||
endpoints = self._generate_endpoints(expected_targets)
|
||||
state = self._generate_lbaas_state(
|
||||
current_ip, current_targets, project_id, subnet_id)
|
||||
spec = self._generate_lbaas_spec(expected_ip, expected_targets,
|
||||
project_id, subnet_id)
|
||||
|
||||
m_drv_lbaas = mock.Mock(wraps=FakeLBaaSDriver())
|
||||
m_drv_project = mock.Mock()
|
||||
m_drv_project.get_project.return_value = project_id
|
||||
m_drv_subnets = mock.Mock()
|
||||
m_drv_subnets.get_subnets.return_value = {
|
||||
subnet_id: mock.sentinel.subnet}
|
||||
m_get_drv_lbaas.return_value = m_drv_lbaas
|
||||
m_get_drv_project.return_value = m_drv_project
|
||||
m_get_drv_subnets.return_value = m_drv_subnets
|
||||
|
||||
handler = h_lbaas.LoadBalancerHandler()
|
||||
|
||||
with mock.patch.object(handler, '_get_pod_subnet') as m_get_pod_subnet:
|
||||
m_get_pod_subnet.return_value = subnet_id
|
||||
handler._sync_lbaas_members(endpoints, state, spec)
|
||||
|
||||
self.assertEqual(expected_ip, str(state.loadbalancer.ip))
|
||||
m_drv_lbaas.release_pool.assert_called_once()
|
||||
|
||||
def test_get_lbaas_spec(self):
|
||||
self.skipTest("skipping until generalised annotation handling is "
|
||||
"implemented")
|
||||
|
Loading…
x
Reference in New Issue
Block a user