From 8ccc0d01764c234ce9d3dc0191b5a0952111e2ef Mon Sep 17 00:00:00 2001 From: Gregory Thiemonge Date: Thu, 2 Mar 2023 03:30:52 -0500 Subject: [PATCH] Don't update the management port when calculating delta CalculateDelta should be used to get the list of subnets/networks to plug (or unplug) into the amphora for the VIP and the members. It should never reconfigure the management port. Story 2010623 Task 47564 Change-Id: Iccae6ec561603653183911146a638272df631e92 --- .../worker/v2/tasks/network_tasks.py | 23 ++++++++----------- .../worker/v2/tasks/test_network_tasks.py | 11 --------- ...nagement-port-update-3fa157f74ee8c7b2.yaml | 7 ++++++ 3 files changed, 17 insertions(+), 24 deletions(-) create mode 100644 releasenotes/notes/fix-bad-management-port-update-3fa157f74ee8c7b2.yaml diff --git a/octavia/controller/worker/v2/tasks/network_tasks.py b/octavia/controller/worker/v2/tasks/network_tasks.py index ce0def2d5e..76f7491241 100644 --- a/octavia/controller/worker/v2/tasks/network_tasks.py +++ b/octavia/controller/worker/v2/tasks/network_tasks.py @@ -55,16 +55,10 @@ class CalculateAmphoraDelta(BaseNetworkTask): default_provides = constants.DELTA - # TODO(gthiemonge) ensure we no longer need vrrp_port def execute(self, loadbalancer, amphora, availability_zone): LOG.debug("Calculating network delta for amphora id: %s", amphora.get(constants.ID)) - vip_subnet_to_net_map = { - loadbalancer[constants.VIP_SUBNET_ID]: - loadbalancer[constants.VIP_NETWORK_ID] - } - # Figure out what networks we want # seed with lb network(s) if (availability_zone and @@ -77,12 +71,10 @@ class CalculateAmphoraDelta(BaseNetworkTask): db_lb = self.loadbalancer_repo.get( db_apis.get_session(), id=loadbalancer[constants.LOADBALANCER_ID]) - desired_subnet_to_net_map = {} - for mgmt_net_id in management_nets: - for subnet_id in self.network_driver.get_network( - mgmt_net_id).subnets: - desired_subnet_to_net_map[subnet_id] = mgmt_net_id - desired_subnet_to_net_map.update(vip_subnet_to_net_map) + desired_subnet_to_net_map = { + loadbalancer[constants.VIP_SUBNET_ID]: + loadbalancer[constants.VIP_NETWORK_ID] + } for pool in db_lb.pools: for member in pool.members: @@ -101,7 +93,12 @@ class CalculateAmphoraDelta(BaseNetworkTask): nics = self.network_driver.get_plugged_networks( amphora[constants.COMPUTE_ID]) # we don't have two nics in the same network - network_to_nic_map = {nic.network_id: nic for nic in nics} + # Don't include the nics connected to the management network, we don't + # want to update these interfaces. + network_to_nic_map = { + nic.network_id: nic + for nic in nics + if nic.network_id not in management_nets} plugged_network_ids = set(network_to_nic_map) diff --git a/octavia/tests/unit/controller/worker/v2/tasks/test_network_tasks.py b/octavia/tests/unit/controller/worker/v2/tasks/test_network_tasks.py index da7ddef994..e4f2544da8 100644 --- a/octavia/tests/unit/controller/worker/v2/tasks/test_network_tasks.py +++ b/octavia/tests/unit/controller/worker/v2/tasks/test_network_tasks.py @@ -185,7 +185,6 @@ class TestNetworkTasks(base.TestCase): mock_lb_repo_get.return_value = lb_mock mock_driver.get_port.return_value = vrrp_port mock_driver.get_subnet.return_value = member_subnet - mock_driver.get_network.return_value = mgmt_net mock_driver.get_plugged_networks.return_value = [ mgmt_interface, vrrp_interface, @@ -231,9 +230,6 @@ class TestNetworkTasks(base.TestCase): mgmt_subnet = data_models.Subnet( id=self.mgmt_subnet_id, network_id=self.mgmt_net_id) - mgmt_net = data_models.Network( - id=self.mgmt_net_id, - subnets=[mgmt_subnet.id]) mgmt_ip_address = mock.MagicMock() mgmt_interface = data_models.Interface( network_id=self.mgmt_net_id, @@ -304,7 +300,6 @@ class TestNetworkTasks(base.TestCase): fixed_ips=vrrp_port.fixed_ips)] mock_driver.get_port.return_value = vrrp_port mock_driver.get_subnet.return_value = vrrp_subnet - mock_driver.get_network.return_value = mgmt_net calc_delta = network_tasks.CalculateDelta() @@ -407,10 +402,6 @@ class TestNetworkTasks(base.TestCase): mgmt2_subnet = data_models.Subnet( id=mgmt2_subnet_id, network_id=mgmt2_net_id) - mgmt2_net = data_models.Network( - id=mgmt2_net_id, - subnets=[mgmt2_subnet.id] - ) mgmt2_interface = data_models.Interface( network_id=mgmt2_net_id, fixed_ips=[ @@ -419,7 +410,6 @@ class TestNetworkTasks(base.TestCase): subnet_id=mgmt2_subnet_id, ) ]) - mock_driver.get_network.return_value = mgmt2_net az = { constants.MANAGEMENT_NETWORK: mgmt2_net_id, } @@ -439,7 +429,6 @@ class TestNetworkTasks(base.TestCase): # Test with one amp and one pool and one member, wrong network plugged # Delta should be one network/subnet to add and one to remove mock_driver.reset_mock() - mock_driver.get_network.return_value = mgmt_net member_mock = mock.MagicMock() member_mock.subnet_id = member_private_subnet.id pool_mock.members = [member_mock] diff --git a/releasenotes/notes/fix-bad-management-port-update-3fa157f74ee8c7b2.yaml b/releasenotes/notes/fix-bad-management-port-update-3fa157f74ee8c7b2.yaml new file mode 100644 index 0000000000..aa13d3ae75 --- /dev/null +++ b/releasenotes/notes/fix-bad-management-port-update-3fa157f74ee8c7b2.yaml @@ -0,0 +1,7 @@ +--- +fixes: + - | + Fixed an issue when adding or deleting a member, Octavia might have + reconfigured the management port of the amphora by adding or removing + additional subnets. Octavia no longer updates the management port during + those tasks.