{% 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 %}