File 0007-Haproxy-agent-prevent-vif-port-unplug-when-automatic-failover-occurs-and-fix-memory-leak.patch of Package openstack-neutron-lbaas
diff -crB --new-file neutron-lbaas-9.2.2.dev11-backup/neutron_lbaas/agent/agent_manager.py neutron-lbaas-9.2.2.dev11/neutron_lbaas/agent/agent_manager.py
*** neutron-lbaas-9.2.2.dev11-backup/neutron_lbaas/agent/agent_manager.py 2018-10-03 11:50:12.588649834 -0700
--- neutron-lbaas-9.2.2.dev11/neutron_lbaas/agent/agent_manager.py 2018-10-03 11:52:23.283486527 -0700
***************
*** 155,161 ****
ready_instances = set(self.plugin_rpc.get_ready_devices())
for deleted_id in known_instances - ready_instances:
! self._destroy_loadbalancer(deleted_id)
for loadbalancer_id in ready_instances:
self._reload_loadbalancer(loadbalancer_id)
--- 155,161 ----
ready_instances = set(self.plugin_rpc.get_ready_devices())
for deleted_id in known_instances - ready_instances:
! self._destroy_loadbalancer(deleted_id, resync=True)
for loadbalancer_id in ready_instances:
self._reload_loadbalancer(loadbalancer_id)
***************
*** 164,170 ****
LOG.exception(_LE('Unable to retrieve ready devices'))
self.needs_resync = True
! self.remove_orphans()
def _get_driver(self, loadbalancer_id):
if loadbalancer_id not in self.instance_mapping:
--- 164,170 ----
LOG.exception(_LE('Unable to retrieve ready devices'))
self.needs_resync = True
! self.remove_orphans(resync=True)
def _get_driver(self, loadbalancer_id):
if loadbalancer_id not in self.instance_mapping:
***************
*** 195,204 ****
loadbalancer_id)
self.needs_resync = True
! def _destroy_loadbalancer(self, lb_id):
driver = self._get_driver(lb_id)
try:
! driver.undeploy_instance(lb_id, delete_namespace=True)
del self.instance_mapping[lb_id]
self.plugin_rpc.loadbalancer_destroyed(lb_id)
except Exception:
--- 195,205 ----
loadbalancer_id)
self.needs_resync = True
! def _destroy_loadbalancer(self, lb_id, resync=False):
driver = self._get_driver(lb_id)
try:
! driver.undeploy_instance(lb_id, delete_namespace=True,
! resync=resync)
del self.instance_mapping[lb_id]
self.plugin_rpc.loadbalancer_destroyed(lb_id)
except Exception:
***************
*** 206,217 ****
lb_id)
self.needs_resync = True
! def remove_orphans(self):
for driver_name in self.device_drivers:
lb_ids = [lb_id for lb_id in self.instance_mapping
if self.instance_mapping[lb_id] == driver_name]
try:
! self.device_drivers[driver_name].remove_orphans(lb_ids)
except NotImplementedError:
pass # Not all drivers will support this
--- 207,219 ----
lb_id)
self.needs_resync = True
! def remove_orphans(self, resync=False):
for driver_name in self.device_drivers:
lb_ids = [lb_id for lb_id in self.instance_mapping
if self.instance_mapping[lb_id] == driver_name]
try:
! self.device_drivers[driver_name].remove_orphans(lb_ids,
! resync=resync)
except NotImplementedError:
pass # Not all drivers will support this
diff -crB --new-file neutron-lbaas-9.2.2.dev11-backup/neutron_lbaas/drivers/haproxy/namespace_driver.py neutron-lbaas-9.2.2.dev11/neutron_lbaas/drivers/haproxy/namespace_driver.py
*** neutron-lbaas-9.2.2.dev11-backup/neutron_lbaas/drivers/haproxy/namespace_driver.py 2018-10-03 11:50:12.588649834 -0700
--- neutron-lbaas-9.2.2.dev11/neutron_lbaas/drivers/haproxy/namespace_driver.py 2018-10-03 11:55:09.507505867 -0700
***************
*** 141,147 ****
pid_file=pid_data)
pm.disable()
# unplug the ports
! if loadbalancer_id in self.deployed_loadbalancers:
self._unplug(namespace,
self.deployed_loadbalancers[loadbalancer_id].vip_port)
--- 141,153 ----
pid_file=pid_data)
pm.disable()
# unplug the ports
! # Before unplugging the port check if LBaaS
! # is being active and see if it is a resync
! # or failover is configured
! resync = kwargs.get('resync', False)
! failover_state = cfg.CONF.allow_automatic_lbaas_agent_failover
! if (loadbalancer_id in self.deployed_loadbalancers and
! not (resync and failover_state)):
self._unplug(namespace,
self.deployed_loadbalancers[loadbalancer_id].vip_port)
***************
*** 162,168 ****
ns = ip_lib.IPWrapper(namespace=namespace)
ns.garbage_collect_namespace()
! def remove_orphans(self, known_loadbalancer_ids):
if not os.path.exists(self.state_path):
return
--- 168,177 ----
ns = ip_lib.IPWrapper(namespace=namespace)
ns.garbage_collect_namespace()
! if loadbalancer_id in self.deployed_loadbalancers:
! del self.deployed_loadbalancers[loadbalancer_id]
!
! def remove_orphans(self, known_loadbalancer_ids, resync=False):
if not os.path.exists(self.state_path):
return
***************
*** 170,176 ****
if lb_id not in known_loadbalancer_ids)
for lb_id in orphans:
if self.exists(lb_id):
! self.undeploy_instance(lb_id, cleanup_namespace=True)
def get_stats(self, loadbalancer_id):
socket_path = self._get_state_file_path(loadbalancer_id,
--- 179,186 ----
if lb_id not in known_loadbalancer_ids)
for lb_id in orphans:
if self.exists(lb_id):
! self.undeploy_instance(lb_id, cleanup_namespace=True,
! resync=resync)
def get_stats(self, loadbalancer_id):
socket_path = self._get_state_file_path(loadbalancer_id,
diff -crB --new-file neutron-lbaas-9.2.2.dev11-backup/neutron_lbaas/tests/unit/agent/test_agent_manager.py neutron-lbaas-9.2.2.dev11/neutron_lbaas/tests/unit/agent/test_agent_manager.py
*** neutron-lbaas-9.2.2.dev11-backup/neutron_lbaas/tests/unit/agent/test_agent_manager.py 2017-10-09 16:40:31.000000000 -0700
--- neutron-lbaas-9.2.2.dev11/neutron_lbaas/tests/unit/agent/test_agent_manager.py 2018-10-03 11:52:23.287486613 -0700
***************
*** 97,104 ****
reload.assert_has_calls([mock.call(i) for i in reloaded],
any_order=True)
! destroy.assert_has_calls([mock.call(i) for i in destroyed],
! any_order=True)
self.assertFalse(self.mgr.needs_resync)
def test_sync_state_all_known(self):
--- 97,105 ----
reload.assert_has_calls([mock.call(i) for i in reloaded],
any_order=True)
! destroy.assert_has_calls(
! [mock.call(i, resync=True) for i in destroyed],
! any_order=True)
self.assertFalse(self.mgr.needs_resync)
def test_sync_state_all_known(self):
***************
*** 179,185 ****
self.mgr._destroy_loadbalancer(lb_id)
self.driver_mock.undeploy_instance.assert_called_once_with(
! lb_id, delete_namespace=True)
self.assertNotIn(lb_id, self.mgr.instance_mapping)
self.rpc_mock.loadbalancer_destroyed.assert_called_once_with(lb_id)
self.assertFalse(self.mgr.needs_resync)
--- 180,186 ----
self.mgr._destroy_loadbalancer(lb_id)
self.driver_mock.undeploy_instance.assert_called_once_with(
! lb_id, delete_namespace=True, resync=False)
self.assertNotIn(lb_id, self.mgr.instance_mapping)
self.rpc_mock.loadbalancer_destroyed.assert_called_once_with(lb_id)
self.assertFalse(self.mgr.needs_resync)
***************
*** 192,198 ****
self.mgr._destroy_loadbalancer(lb_id)
self.driver_mock.undeploy_instance.assert_called_once_with(
! lb_id, delete_namespace=True)
self.assertIn(lb_id, self.mgr.instance_mapping)
self.assertFalse(self.rpc_mock.loadbalancer_destroyed.called)
self.assertTrue(self.log.exception.called)
--- 193,199 ----
self.mgr._destroy_loadbalancer(lb_id)
self.driver_mock.undeploy_instance.assert_called_once_with(
! lb_id, delete_namespace=True, resync=False)
self.assertIn(lb_id, self.mgr.instance_mapping)
self.assertFalse(self.rpc_mock.loadbalancer_destroyed.called)
self.assertTrue(self.log.exception.called)
***************
*** 203,217 ****
self.mgr._get_driver, 'unknown')
def test_remove_orphans(self):
! self.mgr.remove_orphans()
! self.driver_mock.remove_orphans.assert_called_once_with(['1', '2'])
def test_agent_disabled(self):
payload = {'admin_state_up': False}
self.mgr.agent_updated(mock.Mock(), payload)
self.driver_mock.undeploy_instance.assert_has_calls(
! [mock.call('1', delete_namespace=True),
! mock.call('2', delete_namespace=True)],
any_order=True
)
--- 204,219 ----
self.mgr._get_driver, 'unknown')
def test_remove_orphans(self):
! self.mgr.remove_orphans(resync=False)
! self.driver_mock.remove_orphans.assert_called_once_with(
! ['1', '2'], resync=False)
def test_agent_disabled(self):
payload = {'admin_state_up': False}
self.mgr.agent_updated(mock.Mock(), payload)
self.driver_mock.undeploy_instance.assert_has_calls(
! [mock.call('1', delete_namespace=True, resync=False),
! mock.call('2', delete_namespace=True, resync=False)],
any_order=True
)
diff -crB --new-file neutron-lbaas-9.2.2.dev11-backup/neutron_lbaas/tests/unit/drivers/haproxy/test_namespace_driver.py neutron-lbaas-9.2.2.dev11/neutron_lbaas/tests/unit/drivers/haproxy/test_namespace_driver.py
*** neutron-lbaas-9.2.2.dev11-backup/neutron_lbaas/tests/unit/drivers/haproxy/test_namespace_driver.py 2018-10-03 11:50:12.592649921 -0700
--- neutron-lbaas-9.2.2.dev11/neutron_lbaas/tests/unit/drivers/haproxy/test_namespace_driver.py 2018-10-03 11:57:01.113695052 -0700
***************
*** 108,113 ****
--- 108,114 ----
namespace=ns)
mock_shutil.assert_called_once_with('/path/' + self.lb.id)
mock_ns.garbage_collect_namespace.assert_called_once_with()
+ self.assertDictEqual(self.driver.deployed_loadbalancers, {})
@mock.patch('os.makedirs')
@mock.patch('os.path.dirname')
***************
*** 141,147 ****
list_dir.assert_called_once_with(self.driver.state_path)
self.driver.exists.assert_called_once_with('lb2')
self.driver.undeploy_instance.assert_called_once_with(
! 'lb2', cleanup_namespace=True)
def test_get_stats(self):
# Shamelessly stolen from v1 namespace driver tests.
--- 142,148 ----
list_dir.assert_called_once_with(self.driver.state_path)
self.driver.exists.assert_called_once_with('lb2')
self.driver.undeploy_instance.assert_called_once_with(
! 'lb2', cleanup_namespace=True, resync=False)
def test_get_stats(self):
# Shamelessly stolen from v1 namespace driver tests.