{#- PREPARE #}
{%- set DEFAULT_DICT = {
  'check-status-code': 200,
  'check-http-header-dict': {},
  'check-certificate-expiration-days': 15,
  'failure-amount': 2,
  'check-maximum-elapsed-time': 2,
  'check-frontend-ip-list': [],
  'nameserver-list': []
} %}
{%- for default_key in ['check-frontend-ip-list', 'nameserver-list', 'check-status-code', 'check-certificate-expiration-days', 'check-maximum-elapsed-time', 'failure-amount'] %}
{%-   if default_key in slapparameter_dict %}
{%-     do DEFAULT_DICT.__setitem__(default_key, slapparameter_dict[default_key]) %}
{%-   endif %}
{%- endfor %}
{%- set CHECK_DICT = {} %}
{%- for check_name, check_definition in slapparameter_dict['check-dict'].items() %}
{%-   if 'url-list' in check_definition %}
{%-     set check = DEFAULT_DICT.copy()  %}
{%-     set url_list = [] %}
{%-     for url in check_definition.pop('url-list') %}
{%-       if len(url.strip()) > 0 %}
{#-         Support various URL entries #}
{%-         if url.startswith('http:') or url.startswith('https:') %}
{%-           if url not in url_list %}
{%-             do url_list.append(url) %}
{%-           endif %}
{%-         else %}
{%-           for schema in ['http://', 'https://'] %}
{%-             set add_url = '%s%s' % (schema, url) %}
{%-             if add_url not in url_list %}
{%-               do url_list.append('%s%s' % (schema, url)) %}
{%-             endif %}
{%-           endfor %}
{%-         endif %}
{%-       endif %}
{%-     endfor %}
{%-     do check.update(check_definition) %}
{%-     do check.__setitem__('url-list', url_list) %}
{%-     set class = check['check-maximum-elapsed-time'] %}
{%-     if class not in CHECK_DICT %}
{%-       do CHECK_DICT.__setitem__(class, []) %}
{%-     endif %}
{%-     do check.__setitem__('-name', check_name) %}
{%-     do CHECK_DICT[class].append(check) %}
{%-   endif %}
{%- endfor %}

{%- set PART_LIST = [] %}
{%- for class, class_check_list in CHECK_DICT.items() %}
{#- class is used to separate surykatka with different timeouts #}
{%-   set CLASS_URL_LIST = [] %}
{%-   for check in class_check_list | sort(attribute='-name') %}
{%-     do CLASS_URL_LIST.extend(check['url-list']) %}
{%-     for url in check['url-list'] %}
{%-       set promise_name = 'http-query-' ~ hashlib_module.md5(check['-name'].encode('utf-8')).hexdigest() ~ '-' ~ hashlib_module.md5(url.encode('utf-8')).hexdigest() %}
{%-       set part_name = promise_name ~ '-promise' %}
{%-       do PART_LIST.append(part_name) %}
[{{part_name}}]
<= monitor-promise-base
promise = check_surykatka_json
name = {{ promise_name }}.py
config-report = http_query
config-url = {{ url }}
config-status-code = {{ check['check-status-code'] }}
config-http-header-dict = {{ json_module.dumps(check['check-http-header-dict']) }}
config-certificate-expiration-days = {{ check['check-certificate-expiration-days'] }}
config-failure-amount = {{ check['failure-amount'] }}
config-maximum-elapsed-time = {{ check['check-maximum-elapsed-time'] }}
config-ip-list = {{ ' '.join(check['check-frontend-ip-list']) }}
config-json-file = ${surykatka-config-{{ class }}:json}
{%-     endfor %} {#- for url in check['url-list'] #}
{%-   endfor %} {#- for check in class_check_list | sort(attribute='-name') #}

{%-     do PART_LIST.append('surykatka-bot-%i-promise' % (class,)) %}
[surykatka-bot-{{ class }}-promise]
<= monitor-promise-base
promise = check_surykatka_json
name = surykatka-bot-{{ class }}.py
config-report = bot_status
config-json-file = ${surykatka-config-{{ class }}:json}

[surykatka-config-{{ class }}]
recipe = slapos.recipe.template:jinja2
db = ${directory:srv}/surykatka-{{ class }}.db
output = ${directory:etc}/surykatka-{{ class }}.ini
url = {{ template_surykatka_ini }}
url_list = {{ dumps(CLASS_URL_LIST) }}
nameserver_list = {{ dumps(DEFAULT_DICT['nameserver-list']) }}
json = ${directory:srv}/surykatka-{{ class }}.json
{#- timeout is just a bit bigger than class time #}
timeout = {{ int(class) + 2 }}

context =
  import json_module json
  key db :db
  key nameserver_list :nameserver_list
  key url_list :url_list
  key timeout :timeout

{%-     do PART_LIST.append('surykatka-%i'% (class,)) %}
[surykatka-{{ class }}]
recipe = slapos.cookbook:wrapper
config = ${surykatka-config-{{ class }}:output}
command-line =
  {{ surykatka_binary }} --run crawl --reload --configuration ${:config}
wrapper-path = ${monitor-directory:service}/${:_buildout_section_name_}
hash-existing-files = ${buildout:directory}/software_release/buildout.cfg

{%-     do PART_LIST.append('surykatka-json-%i-promise'% (class,)) %}
[surykatka-json-{{ class }}-promise]
<= monitor-promise-base
promise = check_file_state
name = surykatka-json-{{ class }}.py
config-filename = ${surykatka-config-{{ class }}:json}
config-state = not-empty
# workaround for bug in check_file_state
config-url =

[surykatka-status-json-{{ class }}]
recipe = slapos.recipe.template
json = ${surykatka-config-{{ class }}:json}
inline =
  #!/bin/sh
  {{ surykatka_binary }} --run status --configuration ${surykatka-{{ class }}:config} --output json --stdout ${:json}
output = ${monitor-directory:bin}/${:_buildout_section_name_}

{%-     do PART_LIST.append('cron-entry-surykatka-status-%i' % (class,)) %}
[cron-entry-surykatka-status-{{ class }}]
recipe = slapos.cookbook:cron.d
cron-entries = ${directory:etc}/cron.d
name = surykatka-status-{{ class }}
frequency = */2 * * * *
command = ${surykatka-status-json-{{ class }}:output}
{%- endfor %} {#- for class, class_check_list in CHECK_DICT.items() #}

[buildout]
extends = {{ instance_base_monitor }}
parts +=
{% for part_id in sorted(PART_LIST) %}
  {{ part_id }}
{% endfor %}