diff --git a/libra/common/exc.py b/libra/common/exc.py new file mode 100644 index 00000000..e7f5d2d0 --- /dev/null +++ b/libra/common/exc.py @@ -0,0 +1,25 @@ +# Copyright 2013 Hewlett-Packard Development Company, L.P. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + + +class DeletedStateError(Exception): + """ + Exception representing an invalid operation on a load balancer that + is in the deleted state. + """ + def __init__(self, value): + self.value = value + + def __str__(self): + return repr(self.value) diff --git a/libra/worker/controller.py b/libra/worker/controller.py index 030fdfc0..9edab3c0 100644 --- a/libra/worker/controller.py +++ b/libra/worker/controller.py @@ -14,6 +14,7 @@ from libra import __version__ as libra_version from libra import __release__ as libra_release +from libra.common.exc import DeletedStateError from libra.common.faults import BadRequest from libra.worker.drivers.base import LoadBalancerDriver @@ -337,7 +338,14 @@ class LBaaSController(object): return self.msg def _action_stats(self): - """ Get load balancer statistics. """ + """ + Get load balancer statistics. + + We push responsibility for knowing what state a load balancer + current is in to the driver. Trying to get statistics for a LB that + has been deleted is an error. + """ + try: # TODO: Do something with the returned statistics self.driver.get_stats(protocol=None) @@ -346,6 +354,10 @@ class LBaaSController(object): self.logger.error(error) self.msg[self.RESPONSE_FIELD] = self.RESPONSE_FAILURE self.msg[self.ERROR_FIELD] = error + except DeletedStateError: + self.logger.info("Invalid operation STATS on a deleted LB") + self.msg['status'] = 'DELETED' + self.msg[self.RESPONSE_FIELD] = self.RESPONSE_FAILURE except Exception as e: self.logger.error("STATS failed: %s, %s" % (e.__class__, e)) self.msg[self.RESPONSE_FIELD] = self.RESPONSE_FAILURE diff --git a/libra/worker/drivers/haproxy/ubuntu_services.py b/libra/worker/drivers/haproxy/ubuntu_services.py index 4826adb2..267381e5 100644 --- a/libra/worker/drivers/haproxy/ubuntu_services.py +++ b/libra/worker/drivers/haproxy/ubuntu_services.py @@ -15,6 +15,7 @@ import os import subprocess +from libra.common.exc import DeletedStateError from libra.common.lbstats import LBStatistics from libra.worker.drivers.haproxy.services_base import ServicesBase from libra.worker.drivers.haproxy.query import HAProxyQuery @@ -146,6 +147,8 @@ class UbuntuServices(ServicesBase): http://cbonte.github.com/haproxy-dconv/configuration-1.4.html#9 """ + if not os.path.exists(self._config_file): + raise DeletedStateError("Load balancer is deleted.") if not os.path.exists(self._haproxy_pid): raise Exception("HAProxy is not running.")