From e111000aab550635f8dcc3b678a2ae2b6c8b137f Mon Sep 17 00:00:00 2001 From: Satish Patel Date: Tue, 9 Mar 2021 18:19:46 +0000 Subject: [PATCH] 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 --- senlin/drivers/os/lbaas.py | 1 + senlin/drivers/os/octavia_v2.py | 8 +++- senlin/tests/unit/drivers/test_lbaas.py | 12 +++-- senlin/tests/unit/drivers/test_octavia_v2.py | 49 ++++++++++++++++++-- 4 files changed, 61 insertions(+), 9 deletions(-) diff --git a/senlin/drivers/os/lbaas.py b/senlin/drivers/os/lbaas.py index 0d0b3f29a..5c94202fd 100644 --- a/senlin/drivers/os/lbaas.py +++ b/senlin/drivers/os/lbaas.py @@ -159,6 +159,7 @@ class LoadBalancerDriver(base.DriverBase): try: pool = self.oc().pool_create(pool['lb_method'], listener.id, pool['protocol'], + pool['session_persistence'], pool['admin_state_up']) except exception.InternalError as ex: msg = 'Failed in creating lb pool: %s.' % str(ex) diff --git a/senlin/drivers/os/octavia_v2.py b/senlin/drivers/os/octavia_v2.py index 2673a17a1..20297e6e3 100644 --- a/senlin/drivers/os/octavia_v2.py +++ b/senlin/drivers/os/octavia_v2.py @@ -98,12 +98,18 @@ class OctaviaClient(base.DriverBase): @sdk.translate_exception 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 = { 'lb_algorithm': lb_algorithm, 'listener_id': listener_id, 'protocol': protocol, + 'session_persistence': session_persistence, 'admin_state_up': admin_state_up, } diff --git a/senlin/tests/unit/drivers/test_lbaas.py b/senlin/tests/unit/drivers/test_lbaas.py index 5129e43d1..6f3840e99 100644 --- a/senlin/tests/unit/drivers/test_lbaas.py +++ b/senlin/tests/unit/drivers/test_lbaas.py @@ -50,7 +50,11 @@ class TestOctaviaLBaaSDriver(base.SenlinTestCase): self.pool = { 'lb_method': 'ROUND_ROBIN', 'protocol': 'HTTP', - 'admin_state_up': True + 'session_persistence': { + 'type': 'SOURCE_IP', + 'cookie_name': 'whatever', + }, + 'admin_state_up': True, } self.hm = { "type": "HTTP", @@ -168,7 +172,7 @@ class TestOctaviaLBaaSDriver(base.SenlinTestCase): self.assertEqual('LISTENER_ID', res['listener']) self.oc.pool_create.assert_called_once_with( 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.oc.healthmonitor_create.assert_called_once_with( self.hm['type'], self.hm['delay'], self.hm['timeout'], @@ -227,7 +231,7 @@ class TestOctaviaLBaaSDriver(base.SenlinTestCase): self.assertEqual('LISTENER_ID', res['listener']) self.oc.pool_create.assert_called_once_with( 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.oc.healthmonitor_create.assert_called_once_with( 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.oc.pool_create.assert_called_once_with( 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.lb_delete.assert_called_once_with( loadbalancer='LB_ID', listener='LISTENER_ID', pool='POOL_ID') diff --git a/senlin/tests/unit/drivers/test_octavia_v2.py b/senlin/tests/unit/drivers/test_octavia_v2.py index 5b9d4edff..17860a1e0 100644 --- a/senlin/tests/unit/drivers/test_octavia_v2.py +++ b/senlin/tests/unit/drivers/test_octavia_v2.py @@ -129,6 +129,12 @@ class TestOctaviaV2Driver(base.SenlinTestCase): lb_algorithm = 'ROUND_ROBIN' listener_id = 'ID1' 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() # All input parameters are provided @@ -140,20 +146,55 @@ class TestOctaviaV2Driver(base.SenlinTestCase): self.conn.load_balancer.create_pool.return_value = pool_obj 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( lb_algorithm=lb_algorithm, listener_id=listener_id, - protocol=protocol, **kwargs) + protocol=protocol, + session_persistence=session_persistence_expected, + **kwargs) # Use default input parameters kwargs = { 'admin_state_up': True } 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( 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): pool_id = 'ID1'