diff --git a/ovn_octavia_provider/driver.py b/ovn_octavia_provider/driver.py index 9cf67f7b..49cc341c 100644 --- a/ovn_octavia_provider/driver.py +++ b/ovn_octavia_provider/driver.py @@ -280,7 +280,8 @@ class OvnProviderDriver(driver_base.ProviderDriver): 'address': old_member.address, 'protocol_port': old_member.protocol_port, 'pool_id': old_member.pool_id, - 'subnet_id': old_member.subnet_id} + 'subnet_id': old_member.subnet_id, + 'old_admin_state_up': old_member.admin_state_up} if not isinstance(new_member.admin_state_up, o_datamodels.UnsetType): request_info['admin_state_up'] = new_member.admin_state_up request = {'type': ovn_const.REQ_TYPE_MEMBER_UPDATE, diff --git a/ovn_octavia_provider/helper.py b/ovn_octavia_provider/helper.py index 525604cf..3f916616 100644 --- a/ovn_octavia_provider/helper.py +++ b/ovn_octavia_provider/helper.py @@ -1483,11 +1483,13 @@ class OvnProviderHelper(object): pool = {constants.ID: member[constants.POOL_ID], constants.PROVISIONING_STATUS: constants.ACTIVE, constants.OPERATING_STATUS: constants.ONLINE} + member_status = {constants.ID: member[constants.ID], + constants.PROVISIONING_STATUS: constants.ACTIVE} + if not member[constants.ADMIN_STATE_UP]: + member_status[constants.OPERATING_STATUS] = constants.OFFLINE status = { constants.POOLS: [pool], - constants.MEMBERS: [ - {constants.ID: member[constants.ID], - constants.PROVISIONING_STATUS: constants.ACTIVE}], + constants.MEMBERS: [member_status], constants.LOADBALANCERS: [ {constants.ID: ovn_lb.name, constants.PROVISIONING_STATUS: constants.ACTIVE}]} @@ -1625,8 +1627,19 @@ class OvnProviderHelper(object): self._update_member(member, ovn_lb, pool_key) if constants.ADMIN_STATE_UP in member: if member[constants.ADMIN_STATE_UP]: - member_status[constants.OPERATING_STATUS] = ( - constants.ONLINE) + old_admin_state_up = member.get('old_admin_state_up') + if old_admin_state_up is None: + exist_member = self._octavia_driver_lib.get_member( + member[constants.ID]) + if exist_member: + old_admin_state_up = exist_member.admin_state_up + if old_admin_state_up: + member_status[constants.OPERATING_STATUS] = ( + constants.ONLINE) + else: + # going from down to up should reflect NO_MONITOR state + member_status[constants.OPERATING_STATUS] = ( + constants.NO_MONITOR) else: member_status[constants.OPERATING_STATUS] = ( constants.OFFLINE) diff --git a/ovn_octavia_provider/tests/unit/test_driver.py b/ovn_octavia_provider/tests/unit/test_driver.py index 4a2e5572..35c4f6a7 100644 --- a/ovn_octavia_provider/tests/unit/test_driver.py +++ b/ovn_octavia_provider/tests/unit/test_driver.py @@ -273,6 +273,7 @@ class TestOvnProviderDriver(ovn_base.TestOvnOctaviaBase): 'protocol_port': self.ref_member.protocol_port, 'pool_id': self.ref_member.pool_id, 'admin_state_up': self.update_member.admin_state_up, + 'old_admin_state_up': self.ref_member.admin_state_up, 'subnet_id': self.ref_member.subnet_id} expected_dict = {'type': ovn_const.REQ_TYPE_MEMBER_UPDATE, 'info': info} diff --git a/ovn_octavia_provider/tests/unit/test_helper.py b/ovn_octavia_provider/tests/unit/test_helper.py index b25f3450..094ab258 100644 --- a/ovn_octavia_provider/tests/unit/test_helper.py +++ b/ovn_octavia_provider/tests/unit/test_helper.py @@ -62,7 +62,8 @@ class TestOvnProviderHelper(ovn_base.TestOvnOctaviaBase): 'protocol_port': self.member_port, 'subnet_id': self.member_subnet_id, 'pool_id': self.member_pool_id, - 'admin_state_up': True} + 'admin_state_up': True, + 'old_admin_state_up': True} self.ovn_nbdb_api = mock.patch.object(self.helper, 'ovn_nbdb_api') self.ovn_nbdb_api.start() add_req_thread = mock.patch.object(ovn_helper.OvnProviderHelper, @@ -1133,6 +1134,8 @@ class TestOvnProviderHelper(ovn_base.TestOvnOctaviaBase): constants.ACTIVE) self.assertEqual(status['members'][0]['provisioning_status'], constants.ACTIVE) + self.assertEqual(status['members'][0]['operating_status'], + constants.OFFLINE) @mock.patch.object(ovn_helper.OvnProviderHelper, '_add_member') def test_member_create_exception(self, mock_add_member): @@ -1238,6 +1241,17 @@ class TestOvnProviderHelper(ovn_base.TestOvnOctaviaBase): constants.ACTIVE) self.assertEqual(status['members'][0]['operating_status'], constants.OFFLINE) + self.member['old_admin_state_up'] = False + self.member['admin_state_up'] = True + status = self.helper.member_update(self.member) + self.assertEqual(status['loadbalancers'][0]['provisioning_status'], + constants.ACTIVE) + self.assertEqual(status['pools'][0]['provisioning_status'], + constants.ACTIVE) + self.assertEqual(status['members'][0]['provisioning_status'], + constants.ACTIVE) + self.assertEqual(status['members'][0]['operating_status'], + constants.NO_MONITOR) def test_member_update_disabled_lb(self): self.helper._find_ovn_lb_with_pool_key.side_effect = [