Add support for setting protocol.
HAProxy driver will not support TCP, HTTP, or HEALTH mode values via the new set_protocol() driver API method. Default is HTTP. Invalid values will return a failure.
This commit is contained in:
@@ -21,6 +21,8 @@ class LBaaSController(object):
|
|||||||
NODE_ERR = "DISABLED"
|
NODE_ERR = "DISABLED"
|
||||||
RESPONSE_FAILURE = "FAIL"
|
RESPONSE_FAILURE = "FAIL"
|
||||||
RESPONSE_SUCCESS = "PASS"
|
RESPONSE_SUCCESS = "PASS"
|
||||||
|
ACTION_FIELD = 'hpcs_action'
|
||||||
|
RESPONSE_FIELD = 'hpcs_response'
|
||||||
|
|
||||||
def __init__(self, logger, driver, json_msg):
|
def __init__(self, logger, driver, json_msg):
|
||||||
self.logger = logger
|
self.logger = logger
|
||||||
@@ -34,12 +36,12 @@ class LBaaSController(object):
|
|||||||
Process the JSON message and return a JSON response.
|
Process the JSON message and return a JSON response.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if 'hpcs_action' not in self.msg:
|
if self.ACTION_FIELD not in self.msg:
|
||||||
self.logger.error("Missing HPCS_ACTION value")
|
self.logger.error("Missing `%s` value" % self.ACTION_FIELD)
|
||||||
self.msg['hpcs_response'] = self.RESPONSE_FAILURE
|
self.msg[self.RESPONSE_FIELD] = self.RESPONSE_FAILURE
|
||||||
return self.msg
|
return self.msg
|
||||||
|
|
||||||
action = self.msg['hpcs_action'].upper()
|
action = self.msg[self.ACTION_FIELD].upper()
|
||||||
self.logger.debug("Requested action: %s" % action)
|
self.logger.debug("Requested action: %s" % action)
|
||||||
if action == 'CREATE':
|
if action == 'CREATE':
|
||||||
return self._action_create()
|
return self._action_create()
|
||||||
@@ -52,8 +54,9 @@ class LBaaSController(object):
|
|||||||
elif action == 'DELETE':
|
elif action == 'DELETE':
|
||||||
return self._action_delete()
|
return self._action_delete()
|
||||||
else:
|
else:
|
||||||
self.logger.error("Invalid HPCS_ACTION value: %s" % action)
|
self.logger.error("Invalid `%s` value: %s" %
|
||||||
self.msg['hpcs_response'] = self.RESPONSE_FAILURE
|
(self.ACTION_FIELD, action))
|
||||||
|
self.msg[self.RESPONSE_FIELD] = self.RESPONSE_FAILURE
|
||||||
return self.msg
|
return self.msg
|
||||||
|
|
||||||
def _action_create(self):
|
def _action_create(self):
|
||||||
@@ -61,6 +64,21 @@ class LBaaSController(object):
|
|||||||
if 'nodes' not in self.msg:
|
if 'nodes' not in self.msg:
|
||||||
return BadRequest("Missing 'nodes' element").to_json()
|
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']:
|
for lb_node in self.msg['nodes']:
|
||||||
port, address = None, None
|
port, address = None, None
|
||||||
|
|
||||||
@@ -97,15 +115,15 @@ class LBaaSController(object):
|
|||||||
)
|
)
|
||||||
for lb_node in self.msg['nodes']:
|
for lb_node in self.msg['nodes']:
|
||||||
lb_node['condition'] = self.NODE_ERR
|
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:
|
except Exception as e:
|
||||||
self.logger.error("CREATE failed: %s, %s" % (e.__class__, e))
|
self.logger.error("CREATE failed: %s, %s" % (e.__class__, e))
|
||||||
for lb_node in self.msg['nodes']:
|
for lb_node in self.msg['nodes']:
|
||||||
lb_node['condition'] = self.NODE_ERR
|
lb_node['condition'] = self.NODE_ERR
|
||||||
self.msg['hpcs_response'] = self.RESPONSE_FAILURE
|
self.msg[self.RESPONSE_FIELD] = self.RESPONSE_FAILURE
|
||||||
else:
|
else:
|
||||||
self.logger.info("Activated load balancer changes")
|
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
|
return self.msg
|
||||||
|
|
||||||
@@ -124,12 +142,12 @@ class LBaaSController(object):
|
|||||||
self.logger.error(
|
self.logger.error(
|
||||||
"Selected driver does not support SUSPEND action."
|
"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:
|
except Exception as e:
|
||||||
self.logger.error("SUSPEND failed: %s, %s" % (e.__class__, 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:
|
else:
|
||||||
self.msg['hpcs_response'] = self.RESPONSE_SUCCESS
|
self.msg[self.RESPONSE_FIELD] = self.RESPONSE_SUCCESS
|
||||||
return self.msg
|
return self.msg
|
||||||
|
|
||||||
def _action_enable(self):
|
def _action_enable(self):
|
||||||
@@ -140,12 +158,12 @@ class LBaaSController(object):
|
|||||||
self.logger.error(
|
self.logger.error(
|
||||||
"Selected driver does not support ENABLE action."
|
"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:
|
except Exception as e:
|
||||||
self.logger.error("ENABLE failed: %s, %s" % (e.__class__, 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:
|
else:
|
||||||
self.msg['hpcs_response'] = self.RESPONSE_SUCCESS
|
self.msg[self.RESPONSE_FIELD] = self.RESPONSE_SUCCESS
|
||||||
return self.msg
|
return self.msg
|
||||||
|
|
||||||
def _action_delete(self):
|
def _action_delete(self):
|
||||||
@@ -156,10 +174,10 @@ class LBaaSController(object):
|
|||||||
self.logger.error(
|
self.logger.error(
|
||||||
"Selected driver does not support DELETE action."
|
"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:
|
except Exception as e:
|
||||||
self.logger.error("DELETE failed: %s, %s" % (e.__class__, 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:
|
else:
|
||||||
self.msg['hpcs_response'] = self.RESPONSE_SUCCESS
|
self.msg[self.RESPONSE_FIELD] = self.RESPONSE_SUCCESS
|
||||||
return self.msg
|
return self.msg
|
||||||
|
|||||||
@@ -38,6 +38,10 @@ class LoadBalancerDriver(object):
|
|||||||
""" Add a server for which we will proxy. """
|
""" Add a server for which we will proxy. """
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
|
def set_protocol(self, protocol):
|
||||||
|
""" Set the protocol of the instance. """
|
||||||
|
raise NotImplementedError()
|
||||||
|
|
||||||
def create(self):
|
def create(self):
|
||||||
""" Create the load balancer. """
|
""" Create the load balancer. """
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ class HAProxyDriver(LoadBalancerDriver):
|
|||||||
self._backup_config = self._config_file + '.BKUP'
|
self._backup_config = self._config_file + '.BKUP'
|
||||||
self._config = dict()
|
self._config = dict()
|
||||||
self.bind('0.0.0.0', 80)
|
self.bind('0.0.0.0', 80)
|
||||||
|
self.set_protocol('HTTP')
|
||||||
|
|
||||||
def _config_to_string(self):
|
def _config_to_string(self):
|
||||||
"""
|
"""
|
||||||
@@ -44,7 +45,7 @@ class HAProxyDriver(LoadBalancerDriver):
|
|||||||
)
|
)
|
||||||
output.append('defaults')
|
output.append('defaults')
|
||||||
output.append(' log global')
|
output.append(' log global')
|
||||||
output.append(' mode http')
|
output.append(' mode %s' % self._config['mode'])
|
||||||
output.append(' option httplog')
|
output.append(' option httplog')
|
||||||
output.append(' option dontlognull')
|
output.append(' option dontlognull')
|
||||||
output.append(' option redispatch')
|
output.append(' option redispatch')
|
||||||
@@ -154,6 +155,12 @@ class HAProxyDriver(LoadBalancerDriver):
|
|||||||
self._config['servers'] = []
|
self._config['servers'] = []
|
||||||
self._config['servers'].append((host, port))
|
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):
|
def create(self):
|
||||||
self._write_config()
|
self._write_config()
|
||||||
self._restart()
|
self._restart()
|
||||||
|
|||||||
Reference in New Issue
Block a user