Use "session_persistence" in data models for uniformity with API attribute
Currently API uses "session_persistence" attribute name for session
persistence while in data model the name is "sessionpersistence".
This naming difference makes things complicated and leads to errors
in case wrong attribute name usage.
For example, if we try to create a pool with defined session persistence
from_dict method of the Pool data model tries to pop "session_persistence"
from a model_dict [1]. But in reality model_dict contains "sessionpersistence"
key due to the replacement that was done in from_sqlalchemy_model method [2]
according to the db model [3]. This will later lead to errors during
refreshing of a device when pool.sessionpersistence [4] returns a dict
instead of a SessionPersistence data model.
Kept sessionpersistence attribute in Pool data model for backwards
compatibility.
[1] https://github.com/openstack/neutron-lbaas/blob/master/neutron_lbaas/services/loadbalancer/data_models.py#L350
[2] https://github.com/openstack/neutron-lbaas/blob/master/neutron_lbaas/services/loadbalancer/data_models.py#L67
[3] https://github.com/openstack/neutron-lbaas/blob/master/neutron_lbaas/db/loadbalancer/models.py#L148
[4] https://github.com/openstack/neutron-lbaas/blob/master/neutron_lbaas/services/loadbalancer/drivers/haproxy/jinja_cfg.py#L297
Conflicts:
neutron_lbaas/drivers/octavia/driver.py
neutron_lbaas/tests/unit/drivers/octavia/test_octavia_driver.py
neutron_lbaas/tests/unit/services/loadbalancer/drivers/haproxy/sample_configs/sample_configs.py
Change-Id: Ib5efac45cf19acf0afe88a7ffa79514dd4129ed1
Closes-Bug: #1477348
(cherry picked from commit ae4687195c
)
This commit is contained in:
parent
1138361e2c
commit
52ad675d92
|
@ -404,7 +404,7 @@ class LoadBalancerPluginDbv2(base_db.CommonDbMixin,
|
|||
if session_info:
|
||||
s_p = self._create_session_persistence_db(session_info,
|
||||
pool_db.id)
|
||||
pool_db.sessionpersistence = s_p
|
||||
pool_db.session_persistence = s_p
|
||||
|
||||
context.session.add(pool_db)
|
||||
return data_models.Pool.from_sqlalchemy_model(pool_db)
|
||||
|
@ -514,11 +514,6 @@ class LoadBalancerPluginDbv2(base_db.CommonDbMixin,
|
|||
# do not want listener, members, or healthmonitor in dict
|
||||
pool_dict = pool.to_dict(listener=False, members=False,
|
||||
healthmonitor=False)
|
||||
# have to rename sessionpersistence key to session_persistence
|
||||
# for compatibility with what is acceptable by the extension
|
||||
pool_dict['session_persistence'] = pool_dict.get(
|
||||
'sessionpersistence')
|
||||
del pool_dict['sessionpersistence']
|
||||
pool_dict['healthmonitor_id'] = hm_db.id
|
||||
self.update_pool(context, pool_id, pool_dict)
|
||||
hm_db = self._get_resource(context, models.HealthMonitorV2,
|
||||
|
|
|
@ -145,7 +145,7 @@ class PoolV2(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):
|
|||
HealthMonitorV2,
|
||||
backref=orm.backref("pool", uselist=False),
|
||||
lazy='joined')
|
||||
sessionpersistence = orm.relationship(
|
||||
session_persistence = orm.relationship(
|
||||
SessionPersistenceV2,
|
||||
uselist=False,
|
||||
backref=orm.backref("pool", uselist=False),
|
||||
|
|
|
@ -652,8 +652,8 @@ class PayloadPreparer(object):
|
|||
'lb_algorithm': pool.lb_algorithm,
|
||||
'admin_state_up': pool.admin_state_up
|
||||
}
|
||||
if pool.sessionpersistence:
|
||||
peristence = pool.sessionpersistence
|
||||
if pool.session_persistence:
|
||||
peristence = pool.session_persistence
|
||||
peristence_payload = self.prepare_sessionpersistence(peristence)
|
||||
update_attrs['sessionpersistence'] = peristence_payload
|
||||
return update_attrs
|
||||
|
|
|
@ -363,11 +363,11 @@ class RadwareLBaaSV2Driver(base_v2_driver.RadwareLBaaSBaseV2Driver):
|
|||
PROPERTY_DEFAULTS.get(prop))
|
||||
pool_dict['healthmonitor'] = hm_dict
|
||||
|
||||
if listener.default_pool.sessionpersistence:
|
||||
if listener.default_pool.session_persistence:
|
||||
sess_pers_dict = {}
|
||||
for prop in SESSION_PERSISTENCY_PROPERTIES:
|
||||
sess_pers_dict[prop] = getattr(
|
||||
listener.default_pool.sessionpersistence, prop,
|
||||
listener.default_pool.session_persistence, prop,
|
||||
PROPERTY_DEFAULTS.get(prop))
|
||||
pool_dict['sessionpersistence'] = sess_pers_dict
|
||||
|
||||
|
|
|
@ -65,11 +65,15 @@ class BaseDataModel(object):
|
|||
|
||||
@classmethod
|
||||
def from_sqlalchemy_model(cls, sa_model, calling_class=None):
|
||||
attr_mapping = vars(cls).get("attr_mapping")
|
||||
instance = cls()
|
||||
for attr_name in vars(instance):
|
||||
if attr_name.startswith('_'):
|
||||
continue
|
||||
attr = getattr(sa_model, attr_name)
|
||||
if attr_mapping and attr_name in attr_mapping.keys():
|
||||
attr = getattr(sa_model, attr_mapping[attr_name])
|
||||
else:
|
||||
attr = getattr(sa_model, attr_name)
|
||||
# Handles M:1 or 1:1 relationships
|
||||
if isinstance(attr, model_base.BASEV2):
|
||||
if hasattr(instance, attr_name):
|
||||
|
@ -304,11 +308,14 @@ class HealthMonitor(BaseDataModel):
|
|||
|
||||
class Pool(BaseDataModel):
|
||||
|
||||
# Map deprecated attribute names to new ones.
|
||||
attr_mapping = {'sessionpersistence': 'session_persistence'}
|
||||
|
||||
def __init__(self, id=None, tenant_id=None, name=None, description=None,
|
||||
healthmonitor_id=None, protocol=None, lb_algorithm=None,
|
||||
admin_state_up=None, operating_status=None,
|
||||
provisioning_status=None, members=None, healthmonitor=None,
|
||||
sessionpersistence=None, listener=None):
|
||||
session_persistence=None, listener=None):
|
||||
self.id = id
|
||||
self.tenant_id = tenant_id
|
||||
self.name = name
|
||||
|
@ -321,7 +328,10 @@ class Pool(BaseDataModel):
|
|||
self.provisioning_status = provisioning_status
|
||||
self.members = members or []
|
||||
self.healthmonitor = healthmonitor
|
||||
self.sessionpersistence = sessionpersistence
|
||||
self.session_persistence = session_persistence
|
||||
# NOTE(eezhova): Old attribute name is kept for backwards
|
||||
# compatibility with out-of-tree drivers.
|
||||
self.sessionpersistence = self.session_persistence
|
||||
self.listener = listener
|
||||
|
||||
def attached_to_loadbalancer(self):
|
||||
|
@ -337,9 +347,9 @@ class Pool(BaseDataModel):
|
|||
if self.listener:
|
||||
ret_dict['listeners'].append({'id': self.listener.id})
|
||||
ret_dict['session_persistence'] = None
|
||||
if self.sessionpersistence:
|
||||
if self.session_persistence:
|
||||
ret_dict['session_persistence'] = (
|
||||
self.sessionpersistence.to_api_dict())
|
||||
self.session_persistence.to_api_dict())
|
||||
ret_dict['members'] = [{'id': member.id} for member in self.members]
|
||||
return ret_dict
|
||||
|
||||
|
@ -347,6 +357,7 @@ class Pool(BaseDataModel):
|
|||
def from_dict(cls, model_dict):
|
||||
healthmonitor = model_dict.pop('healthmonitor', None)
|
||||
session_persistence = model_dict.pop('session_persistence', None)
|
||||
model_dict.pop('sessionpersistence', None)
|
||||
listener = model_dict.pop('listener', [])
|
||||
members = model_dict.pop('members', [])
|
||||
model_dict['members'] = [Member.from_dict(member)
|
||||
|
|
|
@ -294,9 +294,9 @@ def _transform_pool(pool):
|
|||
if pool.healthmonitor:
|
||||
ret_value['health_monitor'] = _transform_health_monitor(
|
||||
pool.healthmonitor)
|
||||
if pool.sessionpersistence:
|
||||
if pool.session_persistence:
|
||||
ret_value['session_persistence'] = _transform_session_persistence(
|
||||
pool.sessionpersistence)
|
||||
pool.session_persistence)
|
||||
return ret_value
|
||||
|
||||
|
||||
|
|
|
@ -755,7 +755,6 @@ class TestLBaaSDriver(TestLBaaSDriverBase):
|
|||
"protocol_port": 80,
|
||||
"protocol": "HTTP",
|
||||
"connection_limit": -1,
|
||||
"admin_state_up": True,
|
||||
"default_pool": {
|
||||
"protocol": "HTTP",
|
||||
"lb_algorithm":
|
||||
|
|
|
@ -203,7 +203,7 @@ def sample_pool_tuple(proto=None, monitor=True, persistence=True,
|
|||
proto = 'HTTP' if proto is None else proto
|
||||
in_pool = collections.namedtuple(
|
||||
'pool', 'id, protocol, lb_algorithm, members, healthmonitor,'
|
||||
'sessionpersistence, admin_state_up, provisioning_status')
|
||||
'session_persistence, admin_state_up, provisioning_status')
|
||||
mon = sample_health_monitor_tuple(proto=proto) if monitor is True else None
|
||||
persis = sample_session_persistence_tuple(
|
||||
persistence_type=persistence_type) if persistence is True else None
|
||||
|
@ -214,7 +214,7 @@ def sample_pool_tuple(proto=None, monitor=True, persistence=True,
|
|||
members=[sample_member_tuple('sample_member_id_1', '10.0.0.99'),
|
||||
sample_member_tuple('sample_member_id_2', '10.0.0.98')],
|
||||
healthmonitor=mon,
|
||||
sessionpersistence=persis,
|
||||
session_persistence=persis,
|
||||
admin_state_up=True,
|
||||
provisioning_status='ACTIVE')
|
||||
|
||||
|
|
Loading…
Reference in New Issue