diff --git a/libra/worker/controller.py b/libra/worker/controller.py index 56b3b463..1396c207 100644 --- a/libra/worker/controller.py +++ b/libra/worker/controller.py @@ -21,6 +21,8 @@ class LBaaSController(object): NODE_ERR = "DISABLED" RESPONSE_FAILURE = "FAIL" RESPONSE_SUCCESS = "PASS" + ACTION_FIELD = 'hpcs_action' + RESPONSE_FIELD = 'hpcs_response' def __init__(self, logger, driver, json_msg): self.logger = logger @@ -34,12 +36,12 @@ class LBaaSController(object): Process the JSON message and return a JSON response. """ - if 'hpcs_action' not in self.msg: - self.logger.error("Missing HPCS_ACTION value") - self.msg['hpcs_response'] = self.RESPONSE_FAILURE + if self.ACTION_FIELD not in self.msg: + self.logger.error("Missing `%s` value" % self.ACTION_FIELD) + self.msg[self.RESPONSE_FIELD] = self.RESPONSE_FAILURE return self.msg - action = self.msg['hpcs_action'].upper() + action = self.msg[self.ACTION_FIELD].upper() self.logger.debug("Requested action: %s" % action) if action == 'CREATE': return self._action_create() @@ -52,8 +54,9 @@ class LBaaSController(object): elif action == 'DELETE': return self._action_delete() else: - self.logger.error("Invalid HPCS_ACTION value: %s" % action) - self.msg['hpcs_response'] = self.RESPONSE_FAILURE + self.logger.error("Invalid `%s` value: %s" % + (self.ACTION_FIELD, action)) + self.msg[self.RESPONSE_FIELD] = self.RESPONSE_FAILURE return self.msg def _action_create(self): @@ -61,6 +64,21 @@ class LBaaSController(object): if 'nodes' not in self.msg: return BadRequest("Missing 'nodes' element").to_json() + if 'protocol' in self.msg: + try: + self.driver.set_protocol(self.msg['protocol']) + except NotImplementedError: + self.logger.error( + "Selected driver does not support setting protocol." + ) + self.msg[self.RESPONSE_FIELD] = self.RESPONSE_FAILURE + return self.msg + except Exception as e: + self.logger.error("Failure trying to set protocol: %s, %s" % + (e.__class__, e)) + self.msg[self.RESPONSE_FIELD] = self.RESPONSE_FAILURE + return self.msg + for lb_node in self.msg['nodes']: port, address = None, None @@ -97,15 +115,15 @@ class LBaaSController(object): ) for lb_node in self.msg['nodes']: lb_node['condition'] = self.NODE_ERR - self.msg['hpcs_response'] = self.RESPONSE_FAILURE + self.msg[self.RESPONSE_FIELD] = self.RESPONSE_FAILURE except Exception as e: self.logger.error("CREATE failed: %s, %s" % (e.__class__, e)) for lb_node in self.msg['nodes']: lb_node['condition'] = self.NODE_ERR - self.msg['hpcs_response'] = self.RESPONSE_FAILURE + self.msg[self.RESPONSE_FIELD] = self.RESPONSE_FAILURE else: self.logger.info("Activated load balancer changes") - self.msg['hpcs_response'] = self.RESPONSE_SUCCESS + self.msg[self.RESPONSE_FIELD] = self.RESPONSE_SUCCESS return self.msg @@ -124,12 +142,12 @@ class LBaaSController(object): self.logger.error( "Selected driver does not support SUSPEND action." ) - self.msg['hpcs_response'] = self.RESPONSE_FAILURE + self.msg[self.RESPONSE_FIELD] = self.RESPONSE_FAILURE except Exception as e: self.logger.error("SUSPEND failed: %s, %s" % (e.__class__, e)) - self.msg['hpcs_response'] = self.RESPONSE_FAILURE + self.msg[self.RESPONSE_FIELD] = self.RESPONSE_FAILURE else: - self.msg['hpcs_response'] = self.RESPONSE_SUCCESS + self.msg[self.RESPONSE_FIELD] = self.RESPONSE_SUCCESS return self.msg def _action_enable(self): @@ -140,12 +158,12 @@ class LBaaSController(object): self.logger.error( "Selected driver does not support ENABLE action." ) - self.msg['hpcs_response'] = self.RESPONSE_FAILURE + self.msg[self.RESPONSE_FIELD] = self.RESPONSE_FAILURE except Exception as e: self.logger.error("ENABLE failed: %s, %s" % (e.__class__, e)) - self.msg['hpcs_response'] = self.RESPONSE_FAILURE + self.msg[self.RESPONSE_FIELD] = self.RESPONSE_FAILURE else: - self.msg['hpcs_response'] = self.RESPONSE_SUCCESS + self.msg[self.RESPONSE_FIELD] = self.RESPONSE_SUCCESS return self.msg def _action_delete(self): @@ -156,10 +174,10 @@ class LBaaSController(object): self.logger.error( "Selected driver does not support DELETE action." ) - self.msg['hpcs_response'] = self.RESPONSE_FAILURE + self.msg[self.RESPONSE_FIELD] = self.RESPONSE_FAILURE except Exception as e: self.logger.error("DELETE failed: %s, %s" % (e.__class__, e)) - self.msg['hpcs_response'] = self.RESPONSE_FAILURE + self.msg[self.RESPONSE_FIELD] = self.RESPONSE_FAILURE else: - self.msg['hpcs_response'] = self.RESPONSE_SUCCESS + self.msg[self.RESPONSE_FIELD] = self.RESPONSE_SUCCESS return self.msg diff --git a/libra/worker/drivers/base.py b/libra/worker/drivers/base.py index cbb42c23..6651c2ad 100644 --- a/libra/worker/drivers/base.py +++ b/libra/worker/drivers/base.py @@ -38,6 +38,10 @@ class LoadBalancerDriver(object): """ Add a server for which we will proxy. """ raise NotImplementedError() + def set_protocol(self, protocol): + """ Set the protocol of the instance. """ + raise NotImplementedError() + def create(self): """ Create the load balancer. """ raise NotImplementedError() diff --git a/libra/worker/drivers/haproxy/driver.py b/libra/worker/drivers/haproxy/driver.py index 3e4d7866..811e0470 100644 --- a/libra/worker/drivers/haproxy/driver.py +++ b/libra/worker/drivers/haproxy/driver.py @@ -25,6 +25,7 @@ class HAProxyDriver(LoadBalancerDriver): self._backup_config = self._config_file + '.BKUP' self._config = dict() self.bind('0.0.0.0', 80) + self.set_protocol('HTTP') def _config_to_string(self): """ @@ -44,7 +45,7 @@ class HAProxyDriver(LoadBalancerDriver): ) output.append('defaults') output.append(' log global') - output.append(' mode http') + output.append(' mode %s' % self._config['mode']) output.append(' option httplog') output.append(' option dontlognull') output.append(' option redispatch') @@ -154,6 +155,12 @@ class HAProxyDriver(LoadBalancerDriver): self._config['servers'] = [] self._config['servers'].append((host, port)) + def set_protocol(self, protocol): + proto = protocol.lower() + if proto not in ('tcp', 'http', 'health'): + raise Exception("Invalid protocol: %s" % protocol) + self._config['mode'] = proto + def create(self): self._write_config() self._restart()