From f86541b359743012b2bf4536d53befa01efccb3d Mon Sep 17 00:00:00 2001 From: shihanzhang Date: Fri, 16 May 2014 15:26:57 +0800 Subject: [PATCH] Check the validation of 'delay' and 'timeout' In health monitor, the 'delay' should be greater or equal than 'timeout'. Change-Id: I64972881676f2a1269aad8f9cdc77ae957c088d9 Closes-bug: #1320111 --- neutron/extensions/loadbalancer.py | 4 ++++ neutron/services/loadbalancer/plugin.py | 12 ++++++++++ .../db/loadbalancer/test_db_loadbalancer.py | 23 +++++++++++++++++++ 3 files changed, 39 insertions(+) diff --git a/neutron/extensions/loadbalancer.py b/neutron/extensions/loadbalancer.py index bbeae035b1c..ae91b6515e2 100644 --- a/neutron/extensions/loadbalancer.py +++ b/neutron/extensions/loadbalancer.py @@ -29,6 +29,10 @@ from neutron.services import service_base # Loadbalancer Exceptions +class DelayOrTimeoutInvalid(qexception.BadRequest): + message = _("Delay must be greater than or equal to timeout") + + class NoEligibleBackend(qexception.NotFound): message = _("No eligible backend for pool %(pool_id)s") diff --git a/neutron/services/loadbalancer/plugin.py b/neutron/services/loadbalancer/plugin.py index 51e0e3f39be..4e992e08519 100644 --- a/neutron/services/loadbalancer/plugin.py +++ b/neutron/services/loadbalancer/plugin.py @@ -230,7 +230,14 @@ class LoadBalancerPlugin(ldb.LoadBalancerPluginDb, driver = self._get_driver_for_pool(context, m['pool_id']) driver.delete_member(context, m) + def _validate_hm_parameters(self, delay, timeout): + if delay < timeout: + raise loadbalancer.DelayOrTimeoutInvalid() + def create_health_monitor(self, context, health_monitor): + new_hm = health_monitor['health_monitor'] + self._validate_hm_parameters(new_hm['delay'], new_hm['timeout']) + hm = super(LoadBalancerPlugin, self).create_health_monitor( context, health_monitor @@ -238,7 +245,12 @@ class LoadBalancerPlugin(ldb.LoadBalancerPluginDb, return hm def update_health_monitor(self, context, id, health_monitor): + new_hm = health_monitor['health_monitor'] old_hm = self.get_health_monitor(context, id) + delay = new_hm.get('delay', old_hm.get('delay')) + timeout = new_hm.get('timeout', old_hm.get('timeout')) + self._validate_hm_parameters(delay, timeout) + hm = super(LoadBalancerPlugin, self).update_health_monitor( context, id, diff --git a/neutron/tests/unit/db/loadbalancer/test_db_loadbalancer.py b/neutron/tests/unit/db/loadbalancer/test_db_loadbalancer.py index 0dec61cf6df..bc541c7c84f 100644 --- a/neutron/tests/unit/db/loadbalancer/test_db_loadbalancer.py +++ b/neutron/tests/unit/db/loadbalancer/test_db_loadbalancer.py @@ -965,6 +965,29 @@ class TestLoadBalancer(LoadBalancerPluginDbTestCase): for k, v in keys: self.assertEqual(monitor['health_monitor'][k], v) + def test_create_health_monitor_with_timeout_delay_invalid(self): + data = {'health_monitor': {'type': type, + 'delay': 3, + 'timeout': 6, + 'max_retries': 2, + 'admin_state_up': True, + 'tenant_id': self._tenant_id}} + req = self.new_create_request('health_monitors', data, self.fmt) + res = req.get_response(self.ext_api) + self.assertEqual(webob.exc.HTTPBadRequest.code, res.status_int) + + def test_update_health_monitor_with_timeout_delay_invalid(self): + with self.health_monitor() as monitor: + data = {'health_monitor': {'delay': 10, + 'timeout': 20, + 'max_retries': 2, + 'admin_state_up': False}} + req = self.new_update_request("health_monitors", + data, + monitor['health_monitor']['id']) + res = req.get_response(self.ext_api) + self.assertEqual(webob.exc.HTTPBadRequest.code, res.status_int) + def test_update_healthmonitor(self): keys = [('type', "TCP"), ('tenant_id', self._tenant_id),