Align logging in the amphora
This patch configures the primary components of the amphora to log to syslog using consistent logging facilities. By default, user traffic logs will go to LOG_LOCAL0 and the amphora processes (haproxy, keepalived, etc.) will log to LOG_LOCAL1. This is a patch supporting log offloading. Change-Id: Ifda91e0310e812e34f1e398dd3176af8a9c58f89 Story: 1665069 Task: 5486
This commit is contained in:
parent
4007d56b3e
commit
80ddbaeef4
@ -195,6 +195,19 @@
|
||||
# facilitate "fail fast" scenarios like failovers
|
||||
# active_connection_max_retries = 15
|
||||
# active_connection_rety_interval = 2
|
||||
#
|
||||
# Sets the syslog LOG_LOCAL[0-7] facility number for amphora log offloading.
|
||||
# user_log_facility will receive the traffic flow logs.
|
||||
# administrative_log_facility will receive the amphora processes logs.
|
||||
# Note: Some processes only support LOG_LOCAL, so we are restricted to the
|
||||
# LOG_LOCAL facilities.
|
||||
# user_log_facility = 0
|
||||
# administrative_log_facility = 1
|
||||
#
|
||||
# The user flow log format for HAProxy.
|
||||
# {{ project_id }} and {{ lb_id }} will be automatically substituted by the
|
||||
# controller when configuring HAProxy if they are present in the string.
|
||||
# user_log_format = '{{ project_id }} {{ lb_id }} %f %ci %cp %t %{+Q}r %ST %B %U %[ssl_c_verify] %{+Q}[ssl_c_s_dn] %b %s %Tt %tsc'
|
||||
|
||||
[controller_worker]
|
||||
# workers = 1
|
||||
|
@ -59,4 +59,7 @@ class AgentJinjaTemplater(object):
|
||||
'respawn_interval': CONF.haproxy_amphora.respawn_interval,
|
||||
'amphora_udp_driver': CONF.amphora_agent.amphora_udp_driver,
|
||||
'agent_tls_protocol': CONF.amphora_agent.agent_tls_protocol,
|
||||
'topology': topology})
|
||||
'topology': topology,
|
||||
'administrative_log_facility':
|
||||
CONF.haproxy_amphora.administrative_log_facility,
|
||||
'user_log_facility': CONF.haproxy_amphora.user_log_facility})
|
||||
|
@ -18,6 +18,7 @@ import subprocess
|
||||
|
||||
import flask
|
||||
import jinja2
|
||||
from oslo_config import cfg
|
||||
from oslo_log import log as logging
|
||||
import webob
|
||||
|
||||
@ -27,6 +28,7 @@ from octavia.common import constants as consts
|
||||
|
||||
|
||||
BUFFER = 100
|
||||
CONF = cfg.CONF
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
@ -92,7 +94,9 @@ class Keepalived(object):
|
||||
keepalived_cfg=util.keepalived_cfg_path(),
|
||||
keepalived_log=util.keepalived_log_path(),
|
||||
amphora_nsname=consts.AMPHORA_NAMESPACE,
|
||||
amphora_netns=consts.AMP_NETNS_SVC_PREFIX
|
||||
amphora_netns=consts.AMP_NETNS_SVC_PREFIX,
|
||||
administrative_log_facility=(
|
||||
CONF.haproxy_amphora.administrative_log_facility),
|
||||
)
|
||||
text_file.write(text)
|
||||
|
||||
|
@ -20,6 +20,7 @@ import subprocess
|
||||
|
||||
import flask
|
||||
import jinja2
|
||||
from oslo_config import cfg
|
||||
from oslo_log import log as logging
|
||||
import webob
|
||||
from werkzeug import exceptions
|
||||
@ -32,6 +33,7 @@ from octavia.common import constants as consts
|
||||
|
||||
BUFFER = 100
|
||||
CHECK_SCRIPT_NAME = 'udp_check.sh'
|
||||
CONF = cfg.CONF
|
||||
KEEPALIVED_CHECK_SCRIPT_NAME = 'lvs_udp_check.sh'
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
@ -127,7 +129,9 @@ class KeepalivedLvs(udp_listener_base.UdpListenerApiServerBase):
|
||||
keepalived_cmd=consts.KEEPALIVED_CMD,
|
||||
keepalived_cfg=util.keepalived_lvs_cfg_path(listener_id),
|
||||
amphora_nsname=consts.AMPHORA_NAMESPACE,
|
||||
amphora_netns=consts.AMP_NETNS_SVC_PREFIX
|
||||
amphora_netns=consts.AMP_NETNS_SVC_PREFIX,
|
||||
administrative_log_facility=(
|
||||
CONF.haproxy_amphora.administrative_log_facility),
|
||||
)
|
||||
text_file.write(text)
|
||||
|
||||
|
@ -10,9 +10,9 @@ SELinuxContext=system_u:system_r:keepalived_t:s0
|
||||
Type=forking
|
||||
KillMode=process
|
||||
{% if vrrp_pid and check_pid %}
|
||||
ExecStart=/sbin/ip netns exec {{ amphora_nsname }} {{ keepalived_cmd }} -D -d -f {{ keepalived_cfg }} -p {{ keepalived_pid }} -r {{ vrrp_pid }} -c {{ check_pid }}
|
||||
ExecStart=/sbin/ip netns exec {{ amphora_nsname }} {{ keepalived_cmd }} --log-facility={{ administrative_log_facility }} -f {{ keepalived_cfg }} -p {{ keepalived_pid }} -r {{ vrrp_pid }} -c {{ check_pid }}
|
||||
{% else %}
|
||||
ExecStart=/sbin/ip netns exec {{ amphora_nsname }} {{ keepalived_cmd }} -D -d -f {{ keepalived_cfg }} -p {{ keepalived_pid }}
|
||||
ExecStart=/sbin/ip netns exec {{ amphora_nsname }} {{ keepalived_cmd }} --log-facility={{ administrative_log_facility }} -f {{ keepalived_cfg }} -p {{ keepalived_pid }}
|
||||
{% endif %}
|
||||
ExecReload=/bin/kill -HUP $MAINPID
|
||||
PIDFile={{ keepalived_pid }}
|
||||
|
@ -19,9 +19,9 @@ NAME=octavia-keepalived
|
||||
DESC=octavia-keepalived
|
||||
TMPFILES="/tmp/.vrrp /tmp/.healthcheckers"
|
||||
{% if vrrp_pid and check_pid %}
|
||||
DAEMON_ARGS="-D -d -f {{ keepalived_cfg }} -p {{ keepalived_pid }} -r {{ vrrp_pid }} -c {{ check_pid }}"
|
||||
DAEMON_ARGS="--log-facility={{ administrative_log_facility }} -f {{ keepalived_cfg }} -p {{ keepalived_pid }} -r {{ vrrp_pid }} -c {{ check_pid }}"
|
||||
{% else %}
|
||||
DAEMON_ARGS="-D -d -f {{ keepalived_cfg }} -p {{ keepalived_pid }}"
|
||||
DAEMON_ARGS="-log-facility={{ administrative_log_facility }} -f {{ keepalived_cfg }} -p {{ keepalived_pid }}"
|
||||
{% endif %}
|
||||
|
||||
#includes lsb functions
|
||||
|
@ -23,7 +23,7 @@ stop on runlevel [!2345]
|
||||
respawn
|
||||
|
||||
{% if vrrp_pid and check_pid %}
|
||||
exec /sbin/ip netns exec {{ amphora_nsname }} {{ keepalived_cmd }} -n -D -d -f {{ keepalived_cfg }} -p {{ keepalived_pid }} -r {{ vrrp_pid }} -c {{ check_pid }}
|
||||
exec /sbin/ip netns exec {{ amphora_nsname }} {{ keepalived_cmd }} -n --log-facility={{ administrative_log_facility }} -f {{ keepalived_cfg }} -p {{ keepalived_pid }} -r {{ vrrp_pid }} -c {{ check_pid }}
|
||||
{% else %}
|
||||
exec /sbin/ip netns exec {{ amphora_nsname }} {{ keepalived_cmd }} -n -D -d -f {{ keepalived_cfg }} -p {{ keepalived_pid }}
|
||||
exec /sbin/ip netns exec {{ amphora_nsname }} {{ keepalived_cmd }} -n --log-facility={{ administrative_log_facility }} -f {{ keepalived_cfg }} -p {{ keepalived_pid }}
|
||||
{% endif %}
|
||||
|
@ -14,6 +14,8 @@
|
||||
#}
|
||||
[DEFAULT]
|
||||
debug = {{ debug }}
|
||||
use_syslog = True
|
||||
syslog_log_facility = LOG_LOCAL{{ administrative_log_facility }}
|
||||
|
||||
[haproxy_amphora]
|
||||
base_cert_dir = {{ base_cert_dir }}
|
||||
@ -24,6 +26,8 @@ haproxy_cmd = {{ haproxy_cmd }}
|
||||
respawn_count = {{ respawn_count }}
|
||||
respawn_interval = {{ respawn_interval }}
|
||||
use_upstart = {{ use_upstart }}
|
||||
user_log_facility = {{ user_log_facility }}
|
||||
administrative_log_facility = {{ administrative_log_facility }}
|
||||
|
||||
[health_manager]
|
||||
controller_ip_port_list = {{ controller_list|join(', ') }}
|
||||
|
@ -80,5 +80,10 @@ def main():
|
||||
'accesslog': '/var/log/amphora-agent.log',
|
||||
'errorlog': '/var/log/amphora-agent.log',
|
||||
'loglevel': 'debug',
|
||||
'syslog': True,
|
||||
'syslog_facility': 'local{}'.format(
|
||||
CONF.haproxy_amphora.administrative_log_facility),
|
||||
'syslog_addr': 'unix://dev/log',
|
||||
|
||||
}
|
||||
AmphoraAgent(server_instance.app, options).run()
|
||||
|
@ -253,6 +253,16 @@ haproxy_amphora_opts = [
|
||||
cfg.StrOpt('haproxy_stick_size', default='10k',
|
||||
help=_('Size of the HAProxy stick table. Accepts k, m, g '
|
||||
'suffixes. Example: 10k')),
|
||||
cfg.IntOpt('user_log_facility', default=0, min=0, max=7,
|
||||
help=_('LOG_LOCAL facility number to use for user traffic '
|
||||
'logs.')),
|
||||
cfg.IntOpt('administrative_log_facility', default=1, min=0, max=7,
|
||||
help=_('LOG_LOCAL facility number to use for amphora processes '
|
||||
'logs.')),
|
||||
cfg.StrOpt('user_log_format',
|
||||
default='{project_id} {lb_id} %f %ci %cp %t %{+Q}r %ST %B %U '
|
||||
'%[ssl_c_verify] %{+Q}[ssl_c_s_dn] %b %s %Tt %tsc',
|
||||
help=_('Log format string for user flow logging.')),
|
||||
|
||||
# REST server
|
||||
cfg.IPOpt('bind_host', default='::', # nosec
|
||||
|
@ -123,6 +123,13 @@ class JinjaTemplater(object):
|
||||
JINJA_ENV.filters['hash_amp_id'] = octavia_utils.base64_sha1_string
|
||||
return JINJA_ENV.get_template(os.path.basename(self.haproxy_template))
|
||||
|
||||
def _format_log_string(self, load_balancer):
|
||||
log_format = CONF.haproxy_amphora.user_log_format.replace(
|
||||
'{project_id}', load_balancer.project_id)
|
||||
log_format = log_format.replace('{lb_id}', load_balancer.id)
|
||||
log_format = log_format.replace(' ', '\ ')
|
||||
return log_format
|
||||
|
||||
def render_loadbalancer_obj(self, host_amphora, listener,
|
||||
tls_cert=None, socket_path=None,
|
||||
feature_compatibility=None,
|
||||
@ -154,6 +161,9 @@ class JinjaTemplater(object):
|
||||
'stats_sock': socket_path,
|
||||
'log_http': self.log_http,
|
||||
'log_server': self.log_server,
|
||||
'administrative_log_facility':
|
||||
CONF.haproxy_amphora.administrative_log_facility,
|
||||
'user_log_facility': CONF.haproxy_amphora.user_log_facility,
|
||||
'connection_logging': self.connection_logging},
|
||||
constants=constants)
|
||||
|
||||
@ -166,7 +176,7 @@ class JinjaTemplater(object):
|
||||
be processed by the templating system
|
||||
"""
|
||||
t_listener = self._transform_listener(
|
||||
listener, tls_cert, feature_compatibility,
|
||||
listener, tls_cert, feature_compatibility, loadbalancer,
|
||||
client_ca_filename=client_ca_filename, client_crl=client_crl,
|
||||
pool_tls_certs=pool_tls_certs)
|
||||
ret_value = {
|
||||
@ -208,8 +218,8 @@ class JinjaTemplater(object):
|
||||
}
|
||||
|
||||
def _transform_listener(self, listener, tls_cert, feature_compatibility,
|
||||
client_ca_filename=None, client_crl=None,
|
||||
pool_tls_certs=None):
|
||||
loadbalancer, client_ca_filename=None,
|
||||
client_crl=None, pool_tls_certs=None):
|
||||
"""Transforms a listener into an object that will
|
||||
|
||||
be processed by the templating system
|
||||
@ -224,6 +234,7 @@ class JinjaTemplater(object):
|
||||
'topology': listener.load_balancer.topology,
|
||||
'amphorae': listener.load_balancer.amphorae,
|
||||
'enabled': listener.enabled,
|
||||
'user_log_format': self._format_log_string(loadbalancer),
|
||||
'timeout_client_data': (
|
||||
listener.timeout_client_data or
|
||||
CONF.haproxy_amphora.timeout_client_data),
|
||||
|
@ -17,8 +17,8 @@
|
||||
global
|
||||
daemon
|
||||
user nobody
|
||||
log {{ log_http | default('/dev/log', true)}} local0
|
||||
log {{ log_server | default('/dev/log', true)}} local1 notice
|
||||
log {{ log_http | default('/dev/log', true)}} local{{ user_log_facility }}
|
||||
log {{ log_server | default('/dev/log', true)}} local{{ administrative_log_facility }} notice
|
||||
stats socket {{ sock_path }} mode 0666 level user
|
||||
{% if loadbalancer.global_connection_limit is defined %}
|
||||
maxconn {{ loadbalancer.global_connection_limit }}
|
||||
|
@ -139,14 +139,7 @@ bind {{ lb_vip_address }}:{{ listener.protocol_port }} {{
|
||||
|
||||
{% macro frontend_macro(constants, listener, lb_vip_address) %}
|
||||
frontend {{ listener.id }}
|
||||
{% if (listener.protocol.lower() ==
|
||||
constants.PROTOCOL_TERMINATED_HTTPS.lower() or
|
||||
listener.protocol.lower() ==
|
||||
constants.PROTOCOL_HTTP.lower()) %}
|
||||
option httplog
|
||||
{% else %}
|
||||
option tcplog
|
||||
{% endif %}
|
||||
log-format {{ listener.user_log_format }}
|
||||
{% if listener.connection_limit is defined %}
|
||||
maxconn {{ listener.connection_limit }}
|
||||
{% endif %}
|
||||
|
@ -41,7 +41,9 @@ class HAProxyCompatTestCase(base.TestCase):
|
||||
" option splice-response\n"
|
||||
" option http-keep-alive\n\n\n\n"
|
||||
"frontend sample_listener_id_1\n"
|
||||
" option httplog\n"
|
||||
" log-format 12345\\ sample_loadbalancer_id_1\\ %f\\ "
|
||||
"%ci\\ %cp\\ %t\\ %{{+Q}}r\\ %ST\\ %B\\ %U\\ "
|
||||
"%[ssl_c_verify]\\ %{{+Q}}[ssl_c_s_dn]\\ %b\\ %s\\ %Tt\\ %tsc\n"
|
||||
" maxconn {maxconn}\n"
|
||||
" bind 10.0.0.2:80\n"
|
||||
" mode http\n"
|
||||
|
@ -57,8 +57,13 @@ class AgentJinjaTestCase(base.TestCase):
|
||||
# Test execution order could influence this with the test below
|
||||
self.conf.config(group='amphora_agent',
|
||||
agent_server_network_file=None)
|
||||
self.conf.config(group="haproxy_amphora",
|
||||
administrative_log_facility=1)
|
||||
self.conf.config(group="haproxy_amphora", user_log_facility=0)
|
||||
expected_config = ('\n[DEFAULT]\n'
|
||||
'debug = False\n\n'
|
||||
'debug = False\n'
|
||||
'use_syslog = True\n'
|
||||
'syslog_log_facility = LOG_LOCAL1\n\n'
|
||||
'[haproxy_amphora]\n'
|
||||
'base_cert_dir = /var/lib/octavia/certs\n'
|
||||
'base_path = /var/lib/octavia\n'
|
||||
@ -67,7 +72,9 @@ class AgentJinjaTestCase(base.TestCase):
|
||||
'haproxy_cmd = /usr/sbin/haproxy\n'
|
||||
'respawn_count = 2\n'
|
||||
'respawn_interval = 2\n'
|
||||
'use_upstart = True\n\n'
|
||||
'use_upstart = True\n'
|
||||
'user_log_facility = 0\n'
|
||||
'administrative_log_facility = 1\n\n'
|
||||
'[health_manager]\n'
|
||||
'controller_ip_port_list = 192.0.2.10:5555\n'
|
||||
'heartbeat_interval = 10\n'
|
||||
@ -94,8 +101,13 @@ class AgentJinjaTestCase(base.TestCase):
|
||||
self.conf.config(group="amphora_agent",
|
||||
agent_server_network_file='/etc/network/interfaces')
|
||||
self.conf.config(group="haproxy_amphora", use_upstart='False')
|
||||
self.conf.config(group="haproxy_amphora",
|
||||
administrative_log_facility=1)
|
||||
self.conf.config(group="haproxy_amphora", user_log_facility=0)
|
||||
expected_config = ('\n[DEFAULT]\n'
|
||||
'debug = False\n\n'
|
||||
'debug = False\n'
|
||||
'use_syslog = True\n'
|
||||
'syslog_log_facility = LOG_LOCAL1\n\n'
|
||||
'[haproxy_amphora]\n'
|
||||
'base_cert_dir = /var/lib/octavia/certs\n'
|
||||
'base_path = /var/lib/octavia\n'
|
||||
@ -104,7 +116,9 @@ class AgentJinjaTestCase(base.TestCase):
|
||||
'haproxy_cmd = /usr/sbin/haproxy\n'
|
||||
'respawn_count = 2\n'
|
||||
'respawn_interval = 2\n'
|
||||
'use_upstart = False\n\n'
|
||||
'use_upstart = False\n'
|
||||
'user_log_facility = 0\n'
|
||||
'administrative_log_facility = 1\n\n'
|
||||
'[health_manager]\n'
|
||||
'controller_ip_port_list = 192.0.2.10:5555\n'
|
||||
'heartbeat_interval = 10\n'
|
||||
@ -135,8 +149,13 @@ class AgentJinjaTestCase(base.TestCase):
|
||||
agent_server_network_file=None)
|
||||
self.conf.config(group="amphora_agent",
|
||||
amphora_udp_driver='new_udp_driver')
|
||||
self.conf.config(group="haproxy_amphora",
|
||||
administrative_log_facility=1)
|
||||
self.conf.config(group="haproxy_amphora", user_log_facility=0)
|
||||
expected_config = ('\n[DEFAULT]\n'
|
||||
'debug = False\n\n'
|
||||
'debug = False\n'
|
||||
'use_syslog = True\n'
|
||||
'syslog_log_facility = LOG_LOCAL1\n\n'
|
||||
'[haproxy_amphora]\n'
|
||||
'base_cert_dir = /var/lib/octavia/certs\n'
|
||||
'base_path = /var/lib/octavia\n'
|
||||
@ -145,7 +164,9 @@ class AgentJinjaTestCase(base.TestCase):
|
||||
'haproxy_cmd = /usr/sbin/haproxy\n'
|
||||
'respawn_count = 2\n'
|
||||
'respawn_interval = 2\n'
|
||||
'use_upstart = True\n\n'
|
||||
'use_upstart = True\n'
|
||||
'user_log_facility = 0\n'
|
||||
'administrative_log_facility = 1\n\n'
|
||||
'[health_manager]\n'
|
||||
'controller_ip_port_list = 192.0.2.10:5555\n'
|
||||
'heartbeat_interval = 10\n'
|
||||
|
@ -35,7 +35,10 @@ class TestHaproxyCfg(base.TestCase):
|
||||
|
||||
def test_render_template_tls(self):
|
||||
fe = ("frontend sample_listener_id_1\n"
|
||||
" option httplog\n"
|
||||
" log-format 12345\\ sample_loadbalancer_id_1\\ %f\\ "
|
||||
"%ci\\ %cp\\ %t\\ %{{+Q}}r\\ %ST\\ %B\\ %U\\ "
|
||||
"%[ssl_c_verify]\\ %{{+Q}}[ssl_c_s_dn]\\ %b\\ %s\\ %Tt\\ "
|
||||
"%tsc\n"
|
||||
" maxconn {maxconn}\n"
|
||||
" redirect scheme https if !{{ ssl_fc }}\n"
|
||||
" bind 10.0.0.2:443 "
|
||||
@ -86,7 +89,10 @@ class TestHaproxyCfg(base.TestCase):
|
||||
|
||||
def test_render_template_tls_no_sni(self):
|
||||
fe = ("frontend sample_listener_id_1\n"
|
||||
" option httplog\n"
|
||||
" log-format 12345\\ sample_loadbalancer_id_1\\ %f\\ "
|
||||
"%ci\\ %cp\\ %t\\ %{{+Q}}r\\ %ST\\ %B\\ %U\\ "
|
||||
"%[ssl_c_verify]\\ %{{+Q}}[ssl_c_s_dn]\\ %b\\ %s\\ %Tt\\ "
|
||||
"%tsc\n"
|
||||
" maxconn {maxconn}\n"
|
||||
" redirect scheme https if !{{ ssl_fc }}\n"
|
||||
" bind 10.0.0.2:443 "
|
||||
@ -185,7 +191,10 @@ class TestHaproxyCfg(base.TestCase):
|
||||
|
||||
def test_render_template_custom_timeouts(self):
|
||||
fe = ("frontend sample_listener_id_1\n"
|
||||
" option httplog\n"
|
||||
" log-format 12345\\ sample_loadbalancer_id_1\\ %f\\ "
|
||||
"%ci\\ %cp\\ %t\\ %{{+Q}}r\\ %ST\\ %B\\ %U\\ "
|
||||
"%[ssl_c_verify]\\ %{{+Q}}[ssl_c_s_dn]\\ %b\\ %s\\ %Tt\\ "
|
||||
"%tsc\n"
|
||||
" maxconn {maxconn}\n"
|
||||
" bind 10.0.0.2:80\n"
|
||||
" mode http\n"
|
||||
@ -221,7 +230,10 @@ class TestHaproxyCfg(base.TestCase):
|
||||
|
||||
def test_render_template_null_timeouts(self):
|
||||
fe = ("frontend sample_listener_id_1\n"
|
||||
" option httplog\n"
|
||||
" log-format 12345\\ sample_loadbalancer_id_1\\ %f\\ "
|
||||
"%ci\\ %cp\\ %t\\ %{{+Q}}r\\ %ST\\ %B\\ %U\\ "
|
||||
"%[ssl_c_verify]\\ %{{+Q}}[ssl_c_s_dn]\\ %b\\ %s\\ %Tt\\ "
|
||||
"%tsc\n"
|
||||
" maxconn {maxconn}\n"
|
||||
" bind 10.0.0.2:80\n"
|
||||
" mode http\n"
|
||||
@ -285,7 +297,10 @@ class TestHaproxyCfg(base.TestCase):
|
||||
|
||||
def test_render_template_https_real_monitor(self):
|
||||
fe = ("frontend sample_listener_id_1\n"
|
||||
" option tcplog\n"
|
||||
" log-format 12345\\ sample_loadbalancer_id_1\\ %f\\ "
|
||||
"%ci\\ %cp\\ %t\\ %{{+Q}}r\\ %ST\\ %B\\ %U\\ "
|
||||
"%[ssl_c_verify]\\ %{{+Q}}[ssl_c_s_dn]\\ %b\\ %s\\ %Tt\\ "
|
||||
"%tsc\n"
|
||||
" maxconn {maxconn}\n"
|
||||
" bind 10.0.0.2:443\n"
|
||||
" mode tcp\n"
|
||||
@ -318,7 +333,10 @@ class TestHaproxyCfg(base.TestCase):
|
||||
|
||||
def test_render_template_https_hello_monitor(self):
|
||||
fe = ("frontend sample_listener_id_1\n"
|
||||
" option tcplog\n"
|
||||
" log-format 12345\\ sample_loadbalancer_id_1\\ %f\\ "
|
||||
"%ci\\ %cp\\ %t\\ %{{+Q}}r\\ %ST\\ %B\\ %U\\ "
|
||||
"%[ssl_c_verify]\\ %{{+Q}}[ssl_c_s_dn]\\ %b\\ %s\\ %Tt\\ "
|
||||
"%tsc\n"
|
||||
" maxconn {maxconn}\n"
|
||||
" bind 10.0.0.2:443\n"
|
||||
" mode tcp\n"
|
||||
@ -420,7 +438,10 @@ class TestHaproxyCfg(base.TestCase):
|
||||
|
||||
def test_render_template_no_monitor_https(self):
|
||||
fe = ("frontend sample_listener_id_1\n"
|
||||
" option tcplog\n"
|
||||
" log-format 12345\\ sample_loadbalancer_id_1\\ %f\\ "
|
||||
"%ci\\ %cp\\ %t\\ %{{+Q}}r\\ %ST\\ %B\\ %U\\ "
|
||||
"%[ssl_c_verify]\\ %{{+Q}}[ssl_c_s_dn]\\ %b\\ %s\\ %Tt\\ "
|
||||
"%tsc\n"
|
||||
" maxconn {maxconn}\n"
|
||||
" bind 10.0.0.2:443\n"
|
||||
" mode tcp\n"
|
||||
@ -476,7 +497,10 @@ class TestHaproxyCfg(base.TestCase):
|
||||
|
||||
def test_render_template_no_persistence_https(self):
|
||||
fe = ("frontend sample_listener_id_1\n"
|
||||
" option tcplog\n"
|
||||
" log-format 12345\\ sample_loadbalancer_id_1\\ %f\\ "
|
||||
"%ci\\ %cp\\ %t\\ %{{+Q}}r\\ %ST\\ %B\\ %U\\ "
|
||||
"%[ssl_c_verify]\\ %{{+Q}}[ssl_c_s_dn]\\ %b\\ %s\\ %Tt\\ "
|
||||
"%tsc\n"
|
||||
" maxconn {maxconn}\n"
|
||||
" bind 10.0.0.2:443\n"
|
||||
" mode tcp\n"
|
||||
@ -574,7 +598,10 @@ class TestHaproxyCfg(base.TestCase):
|
||||
|
||||
def test_render_template_unlimited_connections(self):
|
||||
fe = ("frontend sample_listener_id_1\n"
|
||||
" option tcplog\n"
|
||||
" log-format 12345\\ sample_loadbalancer_id_1\\ %f\\ "
|
||||
"%ci\\ %cp\\ %t\\ %{{+Q}}r\\ %ST\\ %B\\ %U\\ "
|
||||
"%[ssl_c_verify]\\ %{{+Q}}[ssl_c_s_dn]\\ %b\\ %s\\ %Tt\\ "
|
||||
"%tsc\n"
|
||||
" maxconn {maxconn}\n"
|
||||
" bind 10.0.0.2:443\n"
|
||||
" mode tcp\n"
|
||||
@ -602,7 +629,10 @@ class TestHaproxyCfg(base.TestCase):
|
||||
|
||||
def test_render_template_limited_connections(self):
|
||||
fe = ("frontend sample_listener_id_1\n"
|
||||
" option tcplog\n"
|
||||
" log-format 12345\\ sample_loadbalancer_id_1\\ %f\\ "
|
||||
"%ci\\ %cp\\ %t\\ %{+Q}r\\ %ST\\ %B\\ %U\\ "
|
||||
"%[ssl_c_verify]\\ %{+Q}[ssl_c_s_dn]\\ %b\\ %s\\ %Tt\\ "
|
||||
"%tsc\n"
|
||||
" maxconn 2014\n"
|
||||
" bind 10.0.0.2:443\n"
|
||||
" mode tcp\n"
|
||||
@ -630,7 +660,10 @@ class TestHaproxyCfg(base.TestCase):
|
||||
|
||||
def test_render_template_l7policies(self):
|
||||
fe = ("frontend sample_listener_id_1\n"
|
||||
" option httplog\n"
|
||||
" log-format 12345\\ sample_loadbalancer_id_1\\ %f\\ "
|
||||
"%ci\\ %cp\\ %t\\ %{{+Q}}r\\ %ST\\ %B\\ %U\\ "
|
||||
"%[ssl_c_verify]\\ %{{+Q}}[ssl_c_s_dn]\\ %b\\ %s\\ %Tt\\ "
|
||||
"%tsc\n"
|
||||
" maxconn {maxconn}\n"
|
||||
" bind 10.0.0.2:80\n"
|
||||
" mode http\n"
|
||||
@ -896,12 +929,14 @@ class TestHaproxyCfg(base.TestCase):
|
||||
|
||||
def test_transform_listener(self):
|
||||
in_listener = sample_configs.sample_listener_tuple()
|
||||
ret = self.jinja_cfg._transform_listener(in_listener, None, {})
|
||||
ret = self.jinja_cfg._transform_listener(in_listener, None, {},
|
||||
in_listener.load_balancer)
|
||||
self.assertEqual(sample_configs.RET_LISTENER, ret)
|
||||
|
||||
def test_transform_listener_with_l7(self):
|
||||
in_listener = sample_configs.sample_listener_tuple(l7=True)
|
||||
ret = self.jinja_cfg._transform_listener(in_listener, None, {})
|
||||
ret = self.jinja_cfg._transform_listener(in_listener, None, {},
|
||||
in_listener.load_balancer)
|
||||
self.assertEqual(sample_configs.RET_LISTENER_L7, ret)
|
||||
|
||||
def test_transform_loadbalancer(self):
|
||||
@ -1069,7 +1104,10 @@ class TestHaproxyCfg(base.TestCase):
|
||||
base_amp_path='/var/lib/octavia',
|
||||
base_crt_dir='/var/lib/octavia/certs')
|
||||
fe = ("frontend sample_listener_id_1\n"
|
||||
" option httplog\n"
|
||||
" log-format 12345\\ sample_loadbalancer_id_1\\ %f\\ "
|
||||
"%ci\\ %cp\\ %t\\ %{+Q}r\\ %ST\\ %B\\ %U\\ "
|
||||
"%[ssl_c_verify]\\ %{+Q}[ssl_c_s_dn]\\ %b\\ %s\\ %Tt\\ "
|
||||
"%tsc\n"
|
||||
" maxconn 1000000\n"
|
||||
" redirect scheme https if !{ ssl_fc }\n"
|
||||
" bind 10.0.0.2:443\n"
|
||||
|
@ -295,6 +295,9 @@ RET_LISTENER = {
|
||||
'amphorae': [sample_amphora_tuple()],
|
||||
'peer_port': 1024,
|
||||
'topology': 'SINGLE',
|
||||
'user_log_format': '12345\\ sample_loadbalancer_id_1\\ %f\\ %ci\\ %cp\\ '
|
||||
'%t\\ %{+Q}r\\ %ST\\ %B\\ %U\\ %[ssl_c_verify]\\ '
|
||||
'%{+Q}[ssl_c_s_dn]\\ %b\\ %s\\ %Tt\\ %tsc',
|
||||
'pools': [RET_POOL_1],
|
||||
'l7policies': [],
|
||||
'enabled': True,
|
||||
@ -315,6 +318,9 @@ RET_LISTENER_L7 = {
|
||||
'amphorae': [sample_amphora_tuple()],
|
||||
'peer_port': 1024,
|
||||
'topology': 'SINGLE',
|
||||
'user_log_format': '12345\\ sample_loadbalancer_id_1\\ %f\\ %ci\\ %cp\\ '
|
||||
'%t\\ %{+Q}r\\ %ST\\ %B\\ %U\\ %[ssl_c_verify]\\ '
|
||||
'%{+Q}[ssl_c_s_dn]\\ %b\\ %s\\ %Tt\\ %tsc',
|
||||
'pools': [RET_POOL_1, RET_POOL_2],
|
||||
'l7policies': [RET_L7POLICY_1, RET_L7POLICY_2, RET_L7POLICY_3,
|
||||
RET_L7POLICY_4, RET_L7POLICY_5, RET_L7POLICY_6,
|
||||
@ -504,7 +510,7 @@ def sample_listener_loadbalancer_tuple(proto=None, topology=None,
|
||||
topology = constants.TOPOLOGY_SINGLE
|
||||
in_lb = collections.namedtuple(
|
||||
'load_balancer', 'id, name, protocol, vip, amphorae, topology, '
|
||||
'enabled')
|
||||
'enabled, project_id')
|
||||
return in_lb(
|
||||
id='sample_loadbalancer_id_1',
|
||||
name='test-lb',
|
||||
@ -518,7 +524,8 @@ def sample_listener_loadbalancer_tuple(proto=None, topology=None,
|
||||
role=constants.ROLE_BACKUP)]
|
||||
if more_amp else [sample_amphora_tuple()],
|
||||
topology=topology,
|
||||
enabled=enabled
|
||||
enabled=enabled,
|
||||
project_id='12345'
|
||||
)
|
||||
|
||||
|
||||
@ -991,7 +998,10 @@ def sample_base_expected_config(frontend=None, backend=None,
|
||||
peers=None, global_opts=None, defaults=None):
|
||||
if frontend is None:
|
||||
frontend = ("frontend sample_listener_id_1\n"
|
||||
" option httplog\n"
|
||||
" log-format 12345\\ sample_loadbalancer_id_1\\ %f\\ "
|
||||
"%ci\\ %cp\\ %t\\ %{{+Q}}r\\ %ST\\ %B\\ %U\\ "
|
||||
"%[ssl_c_verify]\\ %{{+Q}}[ssl_c_s_dn]\\ %b\\ %s\\ %Tt\\ "
|
||||
"%tsc\n"
|
||||
" maxconn {maxconn}\n"
|
||||
" bind 10.0.0.2:80\n"
|
||||
" mode http\n"
|
||||
|
Loading…
Reference in New Issue
Block a user