{% if slap_software_type in software_type -%}

[jinja2-template-base]
recipe = slapos.recipe.template:jinja2
rendered = ${buildout:directory}/${:filename}
extra-context =
context =
    import json_module json
    key eggs_directory buildout:eggs-directory
    key develop_eggs_directory buildout:develop-eggs-directory
    key slap_software_type slap-parameter:slap_software_type
    key slave_instance_list slap-parameter:slave_instance_list
    section slapparameter_dict slap-parameter
    ${:extra-context}

################################
## Configure number of frontend
{% set part_list = [] -%}
{% set single_type_key = 'single-' %}
{% if slap_software_type in ("replicate", "RootSoftwareInstance") %}
{%   set frontend_type = slapparameter_dict.pop('-frontend-type', 'single-default') -%}
{% else -%}
{%   set frontend_type = "%s%s" % (single_type_key, slap_software_type) -%}
{% endif -%}
{% set frontend_quantity = slapparameter_dict.pop('-frontend-quantity', '1') | int -%}
{% set slave_list_name = 'extra_slave_instance_list' -%}
{% set frontend_list = [] %}
{% set frontend_section_list = [] %}
{% set namebase = 'apache-frontend' -%}
# XXX Dirty hack, not possible to define default value before
{% set sla_computer_apache_1_key = '-sla-1-computer_guid' -%}
{% if not sla_computer_apache_1_key in slapparameter_dict -%}
{%   do slapparameter_dict.__setitem__(sla_computer_apache_1_key, '${slap-connection:computer-id}') -%}
{% endif -%}

###############################
# Configure frontend allocation
# Here we request individualy each frontend.
# The presence of sla parameters is checked and added if found
{% for i in range(1, frontend_quantity + 1) -%}
{%   set frontend_name = "%s-%s" % (namebase, i) -%}
{%   set request_section_title = 'request-%s' % frontend_name -%}
{%   set sla_key = "-sla-%s-" % i -%}
{%   set sla_key_length = sla_key | length %}
{%   set sla_parameters = [] %}
{%   for key in slapparameter_dict.keys() %}
{%     if key.startswith(sla_key) %}
{%       do sla_parameters.append(key[sla_key_length:]) %}
{%     endif -%}
{%   endfor -%}
{%   do frontend_list.append(frontend_name) -%}
{%   do frontend_section_list.append(request_section_title) -%}
{%   do part_list.append(request_section_title) -%}
[{{request_section_title}}]
<= replicate
name = {{frontend_name}}
{%   if sla_parameters %}
sla = {{ ' '.join(sla_parameters) }}
{%     for parameter in sla_parameters -%}
sla-{{ parameter }} = {{ slapparameter_dict.pop( sla_key + parameter ) }}
{%     endfor -%}
{%   endif -%}
{% endfor -%}

###############################
# Prepare Slave List

# Prepare states
{% set slave_deploy = slave_list_parameter.get('deploy') %}
{% set slave_test = slave_list_parameter.get('test') %}
{% set slave_ignore = slave_list_parameter.get('ignore') %}
{% set slave_stop = slave_list_parameter.get('stop') %}
{% set default_slave_state = slapparameter_dict.pop('default-slave-state', slave_deploy ) %}

# Prepare slave list
{% set slave_deploy_list = [] %}
{% set slave_test_list = [] %}

{% set slave_configuration_path = slave_list_parameter.get('configuration-path') %}
{% set slave_configuration_json = builtin.open(slave_configuration_path, 'w+').read() %}
{% if slave_configuration_json == '' %}
{%   set slave_configuration = {} %}
{% else %}
{%   set slave_configuration = json_module.loads(slave_configuration_json) %}
{% endif %}
{% for slave in slave_instance_list %}
{%   set slave_reference = slave.get('slave_reference') %}
## Update slave information if slave is new or have changed
{%   if slave_configuration.has_key(slave_reference) %}
{%     if slave.get('timestamp') != slave_configuration.get(slave_reference).get('timestamp') %}
{%       do slave_configuration.get(slave_reference).__setitem__('timestamp', slave.get('timestamp')) %}
{%       do slave_configuration.get(slave_reference).__setitem__('configuration', slave) %}
{%       do slave_configuration.get(slave_reference).__setitem__('status', default_slave_state) %}
{%     endif %}
{%   else %}
{%     do slave_configuration.__setitem__(slave_reference, {}) %}
{%     do slave_configuration.get(slave_reference).__setitem__('timestamp', slave.get('timestamp')) %}
{%     do slave_configuration.get(slave_reference).__setitem__('configuration', slave) %}
{%     do slave_configuration.get(slave_reference).__setitem__('state', default_slave_state) %}
{%   endif %}
## Put slave in the list according to its status
{%   set slave_state = slave_configuration.get(slave_reference).get('state')  %}
{%   if slave_state ==  slave_deploy %}
{%     do slave_configuration.get(slave_reference).__setitem__('deploy_configuration', slave_configuration.get(slave_reference).get('configuration')) %}
{%   elif slave_state == slave_test %}
{%     do slave_test_list.append(slave_configuration.get(slave_reference, 'configuration')) %}
{%   endif %}
{%   if slave_state !=  slave_stop and slave_configuration.get(slave_reference).has_key('deploy_configuration') %}
{%     do slave_deploy_list.append(slave_configuration.get(slave_reference, 'configuration')) %}
{%   endif %}
{% endfor %}
{% do json_module.dump(slave_configuration, builtin.open(slave_configuration_path, 'w')) %}

[replicate]
<= slap-connection
recipe = slapos.cookbook:requestoptional
software-url = ${slap-connection:software-release-url}
software-type = {{frontend_type}}
return = private-ipv4 public-ipv4 slave-instance-information-list monitor_url
config = {{ ' '.join(slapparameter_dict.keys()) + ' ' + slave_list_name }}
{% for parameter, value in slapparameter_dict.iteritems() -%}
config-{{parameter}} = {{ value }}
{% endfor -%}
config-{{ slave_list_name }} = {{ json_module.dumps(slave_deploy_list) }}
connection-monitor_url =

[publish-information]
recipe = slapos.cookbook:publish
domain = {{ slapparameter_dict.get('domain') }}
slave-amount = {{ slave_instance_list | length }}
{% for frontend in frontend_section_list %}
{{ frontend }}-monitor-url = {{ '${' + frontend + ':connection-monitor_url}' }}
{% endfor -%}
{% for frontend in frontend_list -%}
#{{frontend}}-private-ipv4 = ${request-{{frontend}}:private-ipv4}
{% endfor -%}


#----------------------------
#--
#-- Publish slave information
[publish-slave-information]
recipe = slapos.cookbook:softwaretype
default = ${dynamic-publish-slave-information:rendered}
replicate = ${dynamic-publish-slave-information:rendered}
custom-personal = ${dynamic-publish-slave-information:rendered}
custom-group = ${dynamic-publish-slave-information:rendered}

[slave-information]
{% for frontend_section in frontend_section_list -%}
{{ frontend_section }} = {{ "${%s:connection-slave-instance-information-list}" % frontend_section }}
{% endfor -%}

[dynamic-publish-slave-information]
< = jinja2-template-base
template = {{ template_publish_slave_information }}
filename = dynamic-publish-slave-information.cfg
extensions = jinja2.ext.do
extra-context =
    section slave_information slave-information

###########################
# Deploy slave configuration
#

[directory]
recipe = slapos.cookbook:mkdirectory

bin = ${buildout:directory}/bin/
etc = ${buildout:directory}/etc/
srv = ${buildout:directory}/srv/
var = ${buildout:directory}/var/

service = ${:etc}/service
log = ${:var}/log
ca-dir = ${:srv}/ssl
run = ${:var}/run


[frontend-configuration]
#template-log-access = ${template-log-access:target}
apache-directory = {{ build_path.get('apache-location') }}
apache-ipv6 = ${slap-network-information:global-ipv6}
apache-https-port = ${slap-parameter:port}

[dynamic-template-default-vh]
< = jinja2-template-base
template = {{ build_path.get('template-default-virtualhost') }}
rendered = ${apache-directory:slave-configuration}/000.conf
extensions = jinja2.ext.do
extra-context =
    key http_port slap-parameter:plain_http_port
    key https_port slap-parameter:port

[dynamic-apache-frontend-template]
< = jinja2-template-base
template = {{ build_path.get('template-apache-frontend-configuration') }}
rendered = ${apache-configuration:frontend-configuration}
extra-context =
    raw httpd_home {{ build_path.get('apache-location') }}
    key httpd_mod_ssl_cache_directory apache-directory:mod-ssl
    key domain slap-parameter:domain
    key document_root apache-directory:document-root
    key instance_home buildout:directory
    key ipv4_addr slap-network-information:local-ipv4
    key ipv6_addr slap-network-information:global-ipv6
    key http_port slap-parameter:plain_http_port
    key https_port slap-parameter:port
    raw server_admin Admin
    key protected_path apache-configuration:protected-path
    key access_control_string apache-configuration:access-control-string
    key login_certificate ca-frontend:cert-file
    key login_key ca-frontend:key-file
    key ca_dir  certificate-authority:ca-dir
    key ca_crl certificate-authority:ca-crl
    key access_log apache-configuration:access-log
    key error_log apache-configuration:error-log
    key pid_file apache-configuration:pid-file
    key slave_configuration_directory apache-directory:slave-configuration
    section frontend_configuration frontend-configuration

[apache-directory]
recipe = slapos.cookbook:mkdirectory
document-root = ${directory:srv}/htdocs
slave-configuration = ${directory:etc}/apache-slave-conf.d/
cache = ${directory:var}/cache
mod-ssl = ${:cache}/httpd_mod_ssl
vh-ssl = ${:slave-configuration}/ssl
slave-log = ${directory:log}/httpd

[apache-configuration]
frontend-configuration = ${directory:etc}/apache_frontend.conf
cached-configuration = ${directory:etc}/apache_frontend_cached.conf
access-log = ${directory:log}/frontend-apache-access.log
error-log = ${directory:log}/frontend-apache-error.log
pid-file = ${directory:run}/httpd.pid
protected-path = /
access-control-string = none
cached-rewrite-file = ${directory:etc}/apache_rewrite_cached.txt
frontend-configuration-verification = {{ build_path.get('apache-location') }}/bin/httpd -Sf ${:frontend-configuration}
frontend-graceful-command = ${:frontend-configuration-verification}; if [ $? -eq 0 ]; then kill -USR1 $(cat ${:pid-file}); fi
cached-configuration-verification = {{ build_path.get('apache-location') }}/bin/httpd -Sf ${:cached-configuration}
cached-graceful-command = ${:cached-configuration-verification}; if [ $? -eq 0 ]; then kill -USR1 $(cat ${apache-configuration:cache-pid-file}); fi

# Apache for cache configuration
cache-access-log = ${directory:log}/frontend-apache-access-cached.log
cache-error-log = ${directory:log}/frontend-apache-error-cached.log
cache-pid-file = ${directory:run}/httpd-cached.pid

[configtest]
recipe = slapos.cookbook:wrapper
command-line = {{ build_path.get('apache-location') }}/bin/httpd -f ${directory:etc}/apache_frontend.conf -t
wrapper-path = ${directory:bin}/apache-configtest

[certificate-authority]
recipe = slapos.cookbook:certificate_authority
openssl-binary = {{ build_path.get('openssl-location') }}/bin/openssl
ca-dir = ${directory:ca-dir}
requests-directory = ${cadirectory:requests}
wrapper = ${directory:service}/certificate_authority
ca-private = ${cadirectory:private}
ca-certs = ${cadirectory:certs}
ca-newcerts = ${cadirectory:newcerts}
ca-crl = ${cadirectory:crl}

[cadirectory]
recipe = slapos.cookbook:mkdirectory
requests = ${directory:ca-dir}/requests/
private = ${directory:ca-dir}/private/
certs = ${directory:ca-dir}/certs/
newcerts = ${directory:ca-dir}/newcerts/
crl = ${directory:ca-dir}/crl/

[ca-frontend]
<= certificate-authority
recipe = slapos.cookbook:certificate_authority.request
key-file = ${cadirectory:certs}/apache_frontend.key
cert-file = ${cadirectory:certs}/apache_frontend.crt
executable = ${directory:service}/frontend_apache
wrapper = ${directory:service}/frontend_apache
key-content =  ${slap-parameter:apache-key}
cert-content = ${slap-parameter:apache-certificate}
# Put domain name
name = ${slap-parameter:domain}


#####################
# Buidout elements
#


[buildout]
parts =
  publish-slave-information
  publish-information
  dynamic-apache-frontend-template
  configtest
  dynamic-template-default-vh
{% for part in part_list -%}
{{ '  %s' % part }}
{% endfor -%}
#      publish-information

eggs-directory = {{ eggs_directory }}
develop-eggs-directory = {{ develop_eggs_directory }}
offline = true

[slap_connection]
# Kept for backward compatiblity
computer_id = ${slap-connection:computer-id}
partition_id = ${slap-connection:partition-id}
server_url = ${slap-connection:server-url}
software_release_url = ${slap-connection:software-release-url}
key_file = ${slap-connection:key-file}
cert_file = ${slap-connection:cert-file}

[slap-parameter]
slave_instance_list =
-frontend-quantity = 1
-frontend-type = single-default
plain_http_port = 8080
port = 4443
domain = example.com
apache-key =
apache-certificate =

{%- endif %}