]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
LBaaS: throw proper exception on duplicating monitor association
authorOleg Bondarev <obondarev@mirantis.com>
Tue, 6 Aug 2013 13:44:30 +0000 (17:44 +0400)
committerOleg Bondarev <obondarev@mirantis.com>
Wed, 14 Aug 2013 12:13:12 +0000 (16:13 +0400)
Fixes bug 1208728

Change-Id: I6cf27766eedff34a6ed5062a50b049ab0a5bf96a

neutron/db/loadbalancer/loadbalancer_db.py
neutron/extensions/loadbalancer.py
neutron/tests/unit/db/loadbalancer/test_db_loadbalancer.py

index 4c9fd7195b50a7ef7ceb042d7e87c6e98a0331be..8b890fc00cf9d321c46bf14cd856be8d508ae349 100644 (file)
@@ -565,6 +565,13 @@ class LoadBalancerPluginDb(LoadBalancerPluginBase,
     def create_pool_health_monitor(self, context, health_monitor, pool_id):
         monitor_id = health_monitor['health_monitor']['id']
         with context.session.begin(subtransactions=True):
+            assoc_qry = context.session.query(PoolMonitorAssociation)
+            assoc = assoc_qry.filter_by(pool_id=pool_id,
+                                        monitor_id=monitor_id).first()
+            if assoc:
+                raise loadbalancer.PoolMonitorAssociationExists(
+                    monitor_id=monitor_id, pool_id=pool_id)
+
             pool = self._get_resource(context, Pool, pool_id)
 
             assoc = PoolMonitorAssociation(pool_id=pool_id,
index 82b4a8e665e332af0d8ea7013acaa1f2b3bf39d9..084a7c4555adb7610bf9583a5d25f8b198155428 100644 (file)
@@ -54,6 +54,11 @@ class PoolMonitorAssociationNotFound(qexception.NotFound):
                 "with Pool %(pool_id)s")
 
 
+class PoolMonitorAssociationExists(qexception.Conflict):
+    message = _('health_monitor %(monitor_id)s is already associated '
+                'with pool %(pool_id)s')
+
+
 class StateInvalid(qexception.NeutronException):
     message = _("Invalid state %(state)s of Loadbalancer resource %(id)s")
 
index 697b1cd464d33bbf57f1d652e034d1a242ecf0aa..8ba25aea2224e5638b318548598e5879e7a086c4 100644 (file)
@@ -1210,6 +1210,24 @@ class TestLoadBalancer(LoadBalancerPluginDbTestCase):
                 driver_call.assert_called_once_with(
                     mock.ANY, hm['health_monitor'], pool['pool']['id'])
 
+    def test_create_pool_health_monitor_already_associated(self):
+        with contextlib.nested(
+            self.pool(name="pool"),
+            self.health_monitor(),
+        ) as (pool, hm):
+            res = self.plugin.create_pool_health_monitor(
+                context.get_admin_context(),
+                hm, pool['pool']['id']
+            )
+            self.assertEqual({'health_monitor':
+                              [hm['health_monitor']['id']]},
+                             res)
+            self.assertRaises(loadbalancer.PoolMonitorAssociationExists,
+                              self.plugin.create_pool_health_monitor,
+                              context.get_admin_context(),
+                              hm,
+                              pool['pool']['id'])
+
     def test_create_pool_healthmon_invalid_pool_id(self):
         with self.health_monitor() as healthmon:
             self.assertRaises(loadbalancer.PoolNotFound,