Fix L7 repository create methods
SQLAlchemy can get confused if the parent database objects are not
linked when creating new records using the repository.
For example, when creating an L7 policy, even if you specify the
listener_id, sqlalchemy will drop the ID from the final SQL INSERT
parameter.
This patch corrects the L7 policy and rule create methods to have
the required parent objects linked.
Story: 2006305
Task: 36021
Change-Id: I4380605bdb346eee824b2ce05fa25175c4cc3034
(cherry picked from commit 36afa82d0c
)
This commit is contained in:
parent
4494c62149
commit
0f8eabab9c
|
@ -1474,6 +1474,10 @@ class L7RuleRepository(BaseRepository):
|
|||
with session.begin(subtransactions=True):
|
||||
if not model_kwargs.get('id'):
|
||||
model_kwargs.update(id=uuidutils.generate_uuid())
|
||||
if model_kwargs.get('l7policy_id'):
|
||||
l7policy_db = session.query(models.L7Policy).filter_by(
|
||||
id=model_kwargs.get('l7policy_id')).first()
|
||||
model_kwargs.update(l7policy=l7policy_db)
|
||||
l7rule = self.model_class(**model_kwargs)
|
||||
validate.l7rule_data(l7rule)
|
||||
session.add(l7rule)
|
||||
|
@ -1612,6 +1616,10 @@ class L7PolicyRepository(BaseRepository):
|
|||
pool_db = session.query(models.Pool).filter_by(
|
||||
id=model_kwargs.get('redirect_pool_id')).first()
|
||||
model_kwargs.update(redirect_pool=pool_db)
|
||||
if model_kwargs.get('listener_id'):
|
||||
listener_db = session.query(models.Listener).filter_by(
|
||||
id=model_kwargs.get('listener_id')).first()
|
||||
model_kwargs.update(listener=listener_db)
|
||||
l7policy = self.model_class(
|
||||
**validate.sanitize_l7policy_api_args(model_kwargs,
|
||||
create=True))
|
||||
|
|
|
@ -3432,6 +3432,14 @@ class L7PolicyRepositoryTest(BaseRepositoryTest):
|
|||
new_l7policy.action)
|
||||
self.assertEqual(1, new_l7policy.position)
|
||||
|
||||
def test_l7policy_create_no_listener_id(self):
|
||||
self.assertRaises(
|
||||
db_exception.DBError, self.l7policy_repo.create,
|
||||
self.session, action=constants.L7POLICY_ACTION_REJECT,
|
||||
operating_status=constants.ONLINE,
|
||||
provisioning_status=constants.ACTIVE,
|
||||
enabled=True)
|
||||
|
||||
def test_update(self):
|
||||
new_url = 'http://www.example.com/'
|
||||
listener = self.create_listener(uuidutils.generate_uuid(), 80)
|
||||
|
@ -3800,6 +3808,16 @@ class L7RuleRepositoryTest(BaseRepositoryTest):
|
|||
self.assertEqual('something', new_l7rule.value)
|
||||
self.assertFalse(new_l7rule.invert)
|
||||
|
||||
def test_l7rule_create_wihout_l7policy_id(self):
|
||||
self.assertRaises(
|
||||
db_exception.DBError, self.l7rule_repo.create,
|
||||
self.session, id=None, type=constants.L7RULE_TYPE_PATH,
|
||||
compare_type=constants.L7RULE_COMPARE_TYPE_CONTAINS,
|
||||
provisioning_status=constants.ACTIVE,
|
||||
operating_status=constants.ONLINE,
|
||||
value='something',
|
||||
enabled=True)
|
||||
|
||||
def test_update(self):
|
||||
l7rule = self.create_l7rule(uuidutils.generate_uuid(),
|
||||
self.l7policy.id,
|
||||
|
|
Loading…
Reference in New Issue