Fixes updating members with the wrong pool ID

On queens, if you update a member using the wrong pool ID, the user
will get the correct error response, but the load balancer will
remain locked. This patch corrects that by putting the pool
validation in the correct sequence.
This is already fixed in Rocky and newer as part of the provider
driver feature.

Change-Id: Id88bd2363d4cb0213096997146d0a79454289978
Story: 2007609
Task: 39599
This commit is contained in:
Michael Johnson 2020-04-29 18:05:12 -07:00
parent 5528268e2f
commit d71178e11b
3 changed files with 16 additions and 6 deletions

View File

@ -231,14 +231,14 @@ class MemberController(base.BaseController):
self._auth_validate_action(context, db_member.project_id, self._auth_validate_action(context, db_member.project_id,
constants.RBAC_PUT) constants.RBAC_PUT)
self._validate_pool_id(id, db_member.pool_id)
self._test_lb_and_listener_and_pool_statuses(context.session, self._test_lb_and_listener_and_pool_statuses(context.session,
member=db_member) member=db_member)
self.repositories.member.update( self.repositories.member.update(
context.session, db_member.id, context.session, db_member.id,
provisioning_status=constants.PENDING_UPDATE) provisioning_status=constants.PENDING_UPDATE)
self._validate_pool_id(id, db_member.pool_id)
try: try:
LOG.info("Sending Update of Member %s to handler", id) LOG.info("Sending Update of Member %s to handler", id)
self.handler.update(db_member, member) self.handler.update(db_member, member)

View File

@ -864,12 +864,18 @@ class TestMember(base.BaseAPITest):
lb_id=self.lb_id, listener_id=self.listener_id, lb_id=self.lb_id, listener_id=self.listener_id,
pool_id=self.pool_id, member_id=api_member.get('id')) pool_id=self.pool_id, member_id=api_member.get('id'))
def test_bad_update(self): def test_update_wrong_pool(self):
api_member = self.create_member( api_member = self.create_member(
self.pool_id, '10.0.0.1', 80).get(self.root_tag) self.pool_id, '10.0.0.1', 80).get(self.root_tag)
new_member = {'protocol_port': 'ten'} self.set_lb_status(self.lb_id)
self.put(self.member_path.format(member_id=api_member.get('id')), new_member = {'monitor_port': '81'}
self._build_body(new_member), status=400) bad_member_path = (
self.MEMBERS_PATH.format(pool_id=self.pool_with_listener_id) +
'/' + api_member.get('id'))
self.put(bad_member_path, self._build_body(new_member), status=404)
self.assert_correct_status(
lb_id=self.lb_id, listener_id=self.listener_id,
pool_id=self.pool_id, member_id=api_member.get('id'))
def test_update_with_bad_handler(self): def test_update_with_bad_handler(self):
api_member = self.create_member( api_member = self.create_member(

View File

@ -0,0 +1,4 @@
---
fixes:
- |
Fixed updating members with the wrong pool ID locking the load balancer.