{%- from "haproxy/map.jinja" import proxy with context -%}

global
  log /dev/log  local0
  log /dev/log  local1 notice
  chroot /var/lib/haproxy
  stats  socket {{ proxy.stats_socket }} mode 660 level admin
  stats timeout 30s
  user  haproxy
  group haproxy
  daemon
  pidfile  /var/run/haproxy.pid
  spread-checks 4
  tune.maxrewrite 1024
  tune.bufsize 32768
  maxconn  16000
  ca-base /etc/ssl/certs
  crt-base /etc/ssl/private
  ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
  ssl-default-bind-options no-sslv3

defaults
  log  global
  mode http

  maxconn 8000
  {#
  timeout connect {{ proxy.get('connect_timeout', '5000') }}ms
  timeout client {{ proxy.get('client_timeout', '50000ms') }}ms
  timeout server {{ proxy.get('server_timeout', '50000ms') }}ms
  #}
  option  redispatch
  retries  3
  stats  enable
  timeout http-request 10s
  timeout queue 1m
  timeout connect 10s
  timeout client 1m
  timeout server 1m
  timeout check 10s

{%- if proxy.listen.admin_page is defined and proxy.listen.admin_page.user is defined %}

userlist STATSUSERS
  group admin users admin
  user {{ proxy.listen.admin_page.user }} insecure-password {{ proxy.listen.admin_page.password }}
  user stats insecure-password {{ proxy.listen.admin_page.password }}
{#
{%- for listen_name, listen in proxy.get('listen', {}).iteritems() %}
{%- if listen.user is defined %}
  user {{ listen.user }} insecure-password {{ listen.password }}
{%- endif %}
{%- endfor %}
#}

{%- endif %}

{%- for listen_name, listen in proxy.get('listen', {}).iteritems() %}
{%- if listen.get('format', 'listen') == 'listen' %}

listen {{ listen_name }}
  {%- for bind in listen.binds %}
  bind {{ bind.address }}:{{ bind.port }}
  {%- endfor %}
  {%- if listen.type == 'http' %}
  mode http
  balance  roundrobin
  option  httplog
  {%- endif %}
  {%- if listen.type == 'rabbitmq' %}
  balance roundrobin
  mode tcp
  option tcpka
  timeout client 48h
  timeout server 48h
  {%- endif %}
  {%- if listen.type == 'mysql' %}
  balance leastconn
  mode tcp
  option httpchk
  option tcplog
  option clitcpka
  option srvtcpka
  timeout client  28801s
  timeout server  28801s
  option mysql-check user haproxy
  {%- endif %}
  {%- if listen.type == 'horizon' %}
  balance  source
  capture  cookie vgnvisitor= len 32
  cookie  SERVERID insert indirect nocache
  mode http
  option forwardfor
  option httpchk
  option httpclose
  option httplog
  rspidel ^Set-cookie:\ IP=
  {%- endif %}
  {%- if listen.type == 'general-service' %}
  mode http
  balance  roundrobin
  option  httplog
  {%- endif %}
  {%- if listen.type == 'openstack-service' %}
  option  httpchk
  option  httplog
  option  httpclose
  {%- endif %}
  {%- if listen.type == 'heat' %}
  balance  source
  option tcpka
  option httpchk
  option tcplog
  {%- endif %}
  {%- if listen.type == 'contrail-config' %}
  mode http
  stats enable
  stats uri /
  stats auth {{ listen.user }}:{{ listen.password }}
  {%- endif %}
  {%- if listen.type == 'contrail-api' %}
  option nolinger
  balance roundrobin
  {%- endif %}
  {%- if listen.type == 'contrail-analytics' %}
  option nolinger
  balance roundrobin
  option tcp-check
  tcp-check connect port 6379
  default-server error-limit 1 on-error mark-down
  {%- endif %}
  {%- if listen.type == 'stats' %}
  mode http
  stats enable
  stats uri /
  {%- if listen.user is defined %}
  stats auth {{ listen.user }}:{{ listen.password }}
  {%- endif %}
  {%- endif %}
  {%- if listen.type == 'admin' %}
  mode  http
  acl  AuthOkay_ReadOnly http_auth(STATSUSERS)
  acl  AuthOkay_Admin http_auth_group(STATSUSERS) {{ listen.user }}
  stats  enable
  stats  refresh 60s
  stats  uri /
  stats  http-request auth realm admin_page unless AuthOkay_ReadOnly
  stats  admin if AuthOkay_Admin
  {%- endif %}
  {%- for server in listen.get('servers', []) %}
  server {{ server.name }} {{ server.host }}:{{ server.port }} {{ server.get('params', '') }}
  {%- endfor %}
{%- endif %}
{%- endfor %}

{%- for listen_name, listen in proxy.get('listen', {}).iteritems() %}
{%- if listen.get('format', 'listen') == 'end' %}

frontend  {{ listen_name }} {{ listen.binds[0].address }}:{{ listen.binds[0].port }}
  {%- for acl in listen.get('acls', []) %}
  {%- for condition in acl.get('conditions', []) %}
  acl {{ acl.name }} {{ condition.type }} {{ condition.condition }}
  {%- endfor %}
  use_backend {{ acl.name }}-backend   if {{ acl.name }}
  {%- endfor %}
  default_backend {{ listen_name }}-backend

backend {{ listen_name }}-backend
  {%- if listen.type == 'http' %}
  balance roundrobin
  {%- endif %}
  {%- for server in listen.get('servers', []) %}
  server {{ server.get('name', server.host) }} {{ server.host }}:{{ server.port }} {{ server.get('params', '') }}
  {%- endfor %}
{%- for acl in listen.get('acls', []) %}

backend {{ acl.name }}-backend
  balance     roundrobin
  {%- for server in acl.get('servers', []) %}
  server {{ server.get('name', server.host) }} {{ server.host }}:{{ server.port }} {{ server.get('params', '') }}
  {%- endfor %}
{%- endfor %}
{%- endif %}
{%- endfor %}
