Fixed support of session_persistence for lbaas/octavia

This patch will fix broken support of session_persistence and
only add cookie_name when type is APP_COOKIE.

Change-Id: I32ad7840208bcc20091abcc1df68a7a707a7c4ac
This commit is contained in:
Satish Patel 2021-03-09 18:19:46 +00:00
parent 68c1b31768
commit e111000aab
4 changed files with 61 additions and 9 deletions

View File

@ -159,6 +159,7 @@ class LoadBalancerDriver(base.DriverBase):
try: try:
pool = self.oc().pool_create(pool['lb_method'], listener.id, pool = self.oc().pool_create(pool['lb_method'], listener.id,
pool['protocol'], pool['protocol'],
pool['session_persistence'],
pool['admin_state_up']) pool['admin_state_up'])
except exception.InternalError as ex: except exception.InternalError as ex:
msg = 'Failed in creating lb pool: %s.' % str(ex) msg = 'Failed in creating lb pool: %s.' % str(ex)

View File

@ -98,12 +98,18 @@ class OctaviaClient(base.DriverBase):
@sdk.translate_exception @sdk.translate_exception
def pool_create(self, lb_algorithm, listener_id, protocol, def pool_create(self, lb_algorithm, listener_id, protocol,
admin_state_up=True, name=None, description=None): session_persistence, admin_state_up=True,
name=None, description=None):
# Remove cookie_name when type not equal to APP_COOKIE
if session_persistence['type'] != 'APP_COOKIE':
session_persistence.pop('cookie_name', None)
kwargs = { kwargs = {
'lb_algorithm': lb_algorithm, 'lb_algorithm': lb_algorithm,
'listener_id': listener_id, 'listener_id': listener_id,
'protocol': protocol, 'protocol': protocol,
'session_persistence': session_persistence,
'admin_state_up': admin_state_up, 'admin_state_up': admin_state_up,
} }

View File

@ -50,7 +50,11 @@ class TestOctaviaLBaaSDriver(base.SenlinTestCase):
self.pool = { self.pool = {
'lb_method': 'ROUND_ROBIN', 'lb_method': 'ROUND_ROBIN',
'protocol': 'HTTP', 'protocol': 'HTTP',
'admin_state_up': True 'session_persistence': {
'type': 'SOURCE_IP',
'cookie_name': 'whatever',
},
'admin_state_up': True,
} }
self.hm = { self.hm = {
"type": "HTTP", "type": "HTTP",
@ -168,7 +172,7 @@ class TestOctaviaLBaaSDriver(base.SenlinTestCase):
self.assertEqual('LISTENER_ID', res['listener']) self.assertEqual('LISTENER_ID', res['listener'])
self.oc.pool_create.assert_called_once_with( self.oc.pool_create.assert_called_once_with(
self.pool['lb_method'], 'LISTENER_ID', self.pool['protocol'], self.pool['lb_method'], 'LISTENER_ID', self.pool['protocol'],
self.pool['admin_state_up']) self.pool['session_persistence'], self.pool['admin_state_up'])
self.assertEqual('POOL_ID', res['pool']) self.assertEqual('POOL_ID', res['pool'])
self.oc.healthmonitor_create.assert_called_once_with( self.oc.healthmonitor_create.assert_called_once_with(
self.hm['type'], self.hm['delay'], self.hm['timeout'], self.hm['type'], self.hm['delay'], self.hm['timeout'],
@ -227,7 +231,7 @@ class TestOctaviaLBaaSDriver(base.SenlinTestCase):
self.assertEqual('LISTENER_ID', res['listener']) self.assertEqual('LISTENER_ID', res['listener'])
self.oc.pool_create.assert_called_once_with( self.oc.pool_create.assert_called_once_with(
self.pool['lb_method'], 'LISTENER_ID', self.pool['protocol'], self.pool['lb_method'], 'LISTENER_ID', self.pool['protocol'],
self.pool['admin_state_up']) self.pool['session_persistence'], self.pool['admin_state_up'])
self.assertEqual('POOL_ID', res['pool']) self.assertEqual('POOL_ID', res['pool'])
self.oc.healthmonitor_create.assert_called_once_with( self.oc.healthmonitor_create.assert_called_once_with(
self.hm['type'], self.hm['delay'], self.hm['timeout'], self.hm['type'], self.hm['delay'], self.hm['timeout'],
@ -357,7 +361,7 @@ class TestOctaviaLBaaSDriver(base.SenlinTestCase):
self.vip['connection_limit'], self.vip['admin_state_up']) self.vip['connection_limit'], self.vip['admin_state_up'])
self.oc.pool_create.assert_called_once_with( self.oc.pool_create.assert_called_once_with(
self.pool['lb_method'], 'LISTENER_ID', self.pool['protocol'], self.pool['lb_method'], 'LISTENER_ID', self.pool['protocol'],
self.pool['admin_state_up']) self.pool['session_persistence'], self.pool['admin_state_up'])
self.lb_driver._wait_for_lb_ready.assert_called_with('LB_ID') self.lb_driver._wait_for_lb_ready.assert_called_with('LB_ID')
self.lb_driver.lb_delete.assert_called_once_with( self.lb_driver.lb_delete.assert_called_once_with(
loadbalancer='LB_ID', listener='LISTENER_ID', pool='POOL_ID') loadbalancer='LB_ID', listener='LISTENER_ID', pool='POOL_ID')

View File

@ -129,6 +129,12 @@ class TestOctaviaV2Driver(base.SenlinTestCase):
lb_algorithm = 'ROUND_ROBIN' lb_algorithm = 'ROUND_ROBIN'
listener_id = 'ID1' listener_id = 'ID1'
protocol = 'HTTP' protocol = 'HTTP'
session_persistence = {
'type': 'SOURCE_IP',
'cookie_name': 'whatever',
}
session_persistence_expected = session_persistence.copy()
session_persistence_expected.pop('cookie_name', None)
pool_obj = mock.Mock() pool_obj = mock.Mock()
# All input parameters are provided # All input parameters are provided
@ -140,20 +146,55 @@ class TestOctaviaV2Driver(base.SenlinTestCase):
self.conn.load_balancer.create_pool.return_value = pool_obj self.conn.load_balancer.create_pool.return_value = pool_obj
self.assertEqual(pool_obj, self.oc.pool_create( self.assertEqual(pool_obj, self.oc.pool_create(
lb_algorithm, listener_id, protocol, **kwargs)) lb_algorithm, listener_id, protocol, session_persistence,
**kwargs))
self.conn.load_balancer.create_pool.assert_called_once_with( self.conn.load_balancer.create_pool.assert_called_once_with(
lb_algorithm=lb_algorithm, listener_id=listener_id, lb_algorithm=lb_algorithm, listener_id=listener_id,
protocol=protocol, **kwargs) protocol=protocol,
session_persistence=session_persistence_expected,
**kwargs)
# Use default input parameters # Use default input parameters
kwargs = { kwargs = {
'admin_state_up': True 'admin_state_up': True
} }
self.assertEqual(pool_obj, self.oc.pool_create( self.assertEqual(pool_obj, self.oc.pool_create(
lb_algorithm, listener_id, protocol)) lb_algorithm, listener_id, protocol, session_persistence))
self.conn.load_balancer.create_pool.assert_called_with( self.conn.load_balancer.create_pool.assert_called_with(
lb_algorithm=lb_algorithm, listener_id=listener_id, lb_algorithm=lb_algorithm, listener_id=listener_id,
protocol=protocol, **kwargs) protocol=protocol,
session_persistence=session_persistence_expected,
**kwargs)
def test_pool_create_cookie_removed(self):
lb_algorithm = 'ROUND_ROBIN'
listener_id = 'ID1'
protocol = 'HTTP'
pool_obj = mock.Mock()
# All input parameters are provided
kwargs = {
'admin_state_up': True,
'name': 'test-pool',
'description': 'This is a pool',
}
self.conn.load_balancer.create_pool.return_value = pool_obj
# Check type is APP_COOKIE
session_persistence_app_cookie = {
'type': 'APP_COOKIE',
'cookie_name': 'whatever',
}
self.assertEqual(pool_obj, self.oc.pool_create(
lb_algorithm, listener_id, protocol,
session_persistence_app_cookie, **kwargs))
# cookie_name is not removed
self.conn.load_balancer.create_pool.assert_called_once_with(
lb_algorithm=lb_algorithm, listener_id=listener_id,
protocol=protocol,
session_persistence=session_persistence_app_cookie,
**kwargs)
def test_pool_delete(self): def test_pool_delete(self):
pool_id = 'ID1' pool_id = 'ID1'