Add support for HAProxy L7 checks
This change add several configuration options to enable HTTP checks to the HAProxy configuration, instead of the default TCP connection checks (which continue to be the default). It also enables /healthcheck endpoint for cinder-api on openstack releases >= ocata. Closes-Bug: #1880610 Change-Id: I9d118f70fc1390be7b800ad20ae20e77818adac7
This commit is contained in:
parent
70deb577f9
commit
51e32a4f7e
@ -36,6 +36,7 @@ from charmhelpers.contrib.openstack.utils import (
|
|||||||
from charmhelpers.contrib.hahelpers.cluster import (
|
from charmhelpers.contrib.hahelpers.cluster import (
|
||||||
determine_apache_port,
|
determine_apache_port,
|
||||||
determine_api_port,
|
determine_api_port,
|
||||||
|
https
|
||||||
)
|
)
|
||||||
|
|
||||||
CHARM_CEPH_CONF = '/var/lib/charm/{}/ceph.conf'
|
CHARM_CEPH_CONF = '/var/lib/charm/{}/ceph.conf'
|
||||||
@ -100,16 +101,26 @@ class HAProxyContext(OSContextGenerator):
|
|||||||
specific to this charm.
|
specific to this charm.
|
||||||
Also used to extend cinder.conf context with correct api_listening_port
|
Also used to extend cinder.conf context with correct api_listening_port
|
||||||
'''
|
'''
|
||||||
|
service = 'cinder_api'
|
||||||
haproxy_port = config('api-listening-port')
|
haproxy_port = config('api-listening-port')
|
||||||
api_port = determine_api_port(config('api-listening-port'),
|
api_port = determine_api_port(config('api-listening-port'),
|
||||||
singlenode_mode=True)
|
singlenode_mode=True)
|
||||||
apache_port = determine_apache_port(config('api-listening-port'),
|
apache_port = determine_apache_port(config('api-listening-port'),
|
||||||
singlenode_mode=True)
|
singlenode_mode=True)
|
||||||
|
|
||||||
|
backend_options = {
|
||||||
|
service: [{
|
||||||
|
'option': 'httpchk GET /healthcheck',
|
||||||
|
'http-check': 'expect status 200',
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
|
||||||
ctxt = {
|
ctxt = {
|
||||||
'service_ports': {'cinder_api': [haproxy_port, apache_port]},
|
'service_ports': {service: [haproxy_port, apache_port]},
|
||||||
'osapi_volume_listen_port': api_port,
|
'osapi_volume_listen_port': api_port,
|
||||||
'port': api_port,
|
'port': api_port,
|
||||||
|
'backend_options': backend_options,
|
||||||
|
'https': https()
|
||||||
}
|
}
|
||||||
return ctxt
|
return ctxt
|
||||||
|
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
[composite:osapi_volume]
|
[composite:osapi_volume]
|
||||||
use = call:cinder.api:root_app_factory
|
use = call:cinder.api:root_app_factory
|
||||||
/: apiversions
|
/: apiversions
|
||||||
|
/healthcheck: healthcheck
|
||||||
/v1: openstack_volume_api_v1
|
/v1: openstack_volume_api_v1
|
||||||
/v2: openstack_volume_api_v2
|
/v2: openstack_volume_api_v2
|
||||||
/v3: openstack_volume_api_v3
|
/v3: openstack_volume_api_v3
|
||||||
@ -64,6 +65,14 @@ pipeline = cors http_proxy_to_wsgi faultwrap osvolumeversionapp
|
|||||||
[app:osvolumeversionapp]
|
[app:osvolumeversionapp]
|
||||||
paste.app_factory = cinder.api.versions:Versions.factory
|
paste.app_factory = cinder.api.versions:Versions.factory
|
||||||
|
|
||||||
|
[pipeline:healthcheck]
|
||||||
|
pipeline = request_id healthcheckapp
|
||||||
|
|
||||||
|
[app:healthcheckapp]
|
||||||
|
paste.app_factory = oslo_middleware:Healthcheck.app_factory
|
||||||
|
backends = disable_by_file
|
||||||
|
disable_by_file_path = /etc/cinder/healthcheck_disable
|
||||||
|
|
||||||
##########
|
##########
|
||||||
# Shared #
|
# Shared #
|
||||||
##########
|
##########
|
||||||
|
2
tox.ini
2
tox.ini
@ -25,7 +25,7 @@ setenv = VIRTUAL_ENV={envdir}
|
|||||||
commands = stestr run --slowest {posargs}
|
commands = stestr run --slowest {posargs}
|
||||||
allowlist_externals =
|
allowlist_externals =
|
||||||
charmcraft
|
charmcraft
|
||||||
rename.sh
|
{toxinidir}/rename.sh
|
||||||
passenv =
|
passenv =
|
||||||
HOME
|
HOME
|
||||||
TERM
|
TERM
|
||||||
|
@ -26,8 +26,6 @@ TO_PATCH = [
|
|||||||
'config',
|
'config',
|
||||||
'relation_ids',
|
'relation_ids',
|
||||||
'service_name',
|
'service_name',
|
||||||
'determine_apache_port',
|
|
||||||
'determine_api_port',
|
|
||||||
'os_release',
|
'os_release',
|
||||||
'related_units',
|
'related_units',
|
||||||
'relation_get'
|
'relation_get'
|
||||||
@ -545,3 +543,32 @@ class TestCinderContext(CharmTestCase):
|
|||||||
contexts.VolumeUsageAuditContext.DEFAULT_CRONTAB_PATH, "wt+")
|
contexts.VolumeUsageAuditContext.DEFAULT_CRONTAB_PATH, "wt+")
|
||||||
self.assertEqual(self.config.return_value,
|
self.assertEqual(self.config.return_value,
|
||||||
ctxt["volume_usage_audit_period"])
|
ctxt["volume_usage_audit_period"])
|
||||||
|
|
||||||
|
@patch('charmhelpers.contrib.hahelpers.cluster.https')
|
||||||
|
@patch('cinder_contexts.https')
|
||||||
|
def test_haproxy_context(self, mock_https, mock_ch_https):
|
||||||
|
config = {'api-listening-port': 8776}
|
||||||
|
self.config.side_effect = lambda x: config[x]
|
||||||
|
for https_mode in [False, True]:
|
||||||
|
mock_https.return_value = https_mode
|
||||||
|
mock_ch_https.return_value = https_mode
|
||||||
|
api_port = 8766
|
||||||
|
if https_mode:
|
||||||
|
api_port = 8756
|
||||||
|
|
||||||
|
haproxy_context = contexts.HAProxyContext()
|
||||||
|
expected = {
|
||||||
|
"service_ports": {"cinder_api": [8776, 8766]},
|
||||||
|
"osapi_volume_listen_port": api_port,
|
||||||
|
'port': api_port,
|
||||||
|
"backend_options": {
|
||||||
|
"cinder_api": [
|
||||||
|
{
|
||||||
|
'option': 'httpchk GET /healthcheck',
|
||||||
|
'http-check': 'expect status 200',
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"https": https_mode,
|
||||||
|
}
|
||||||
|
self.assertEqual(expected, haproxy_context())
|
||||||
|
Loading…
Reference in New Issue
Block a user