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:
Elena Ezhova 2015-07-24 19:49:00 +03:00 committed by Nir Magnezi
parent 1138361e2c
commit 52ad675d92
8 changed files with 26 additions and 21 deletions

View File

@ -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,

View File

@ -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),

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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":

View File

@ -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')