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.
openSUSE Build Service is sponsored by