<%
# This template can be configure the following way with environment variables
# Environment variables to filter services/instances
#   SERVICES_TAG_FILTER: basic tag filter for service (default HTTP)
#   INSTANCE_MUST_TAG: Second level of filtering (optional, default to SERVICES_TAG_FILTER)
#   INSTANCE_EXCLUDE_TAG: Exclude instances having the given tag (default: canary)
#   EXCLUDE_SERVICES: comma-separated services regexps to exclude (default: lbl7.*,netsvc-probe.*,consul-probed.*)

  service_tag_filter = ENV['SERVICES_TAG_FILTER'] || 'http'
  instance_must_tag = ENV['INSTANCE_MUST_TAG'] || service_tag_filter
  instance_exclude_tag = ENV['INSTANCE_EXCLUDE_TAG'] || 'canary'

  # Services to hide
  services_blacklist_raw = (ENV['EXCLUDE_SERVICES'] || 'lbl7.*,netsvc-probe.*,consul-probed.*').split(',')
  services_blacklist = services_blacklist_raw.map { |v| Regexp.new(v) }  # Compute the health of a Service

  # Compute the health of a Service
  def compute_attributes(snode)
    w = 100
    snode['Service']['Tags'].each do |tag|
      match = /^weight-([1-9][0-9])*$/.match(tag)
      w = match[1].to_i if match
    end
    attributes = ""
    node_status = snode.status
    attributes = "#{attributes} disabled" if node_status == 'critical'
    if node_status == 'warning'
      w = w / 8
    end
    attributes = "#{attributes} weight #{w}" if w.positive?
  end
  backends = {}
  services(tag: service_tag_filter).each do |service_name, tags|
    if !services_blacklist.any? {|r| r.match(service_name)} && tags.include?(instance_must_tag)
      the_backends = []
      service(service_name, tag:'http').sort {|a,b| a['Node']['Node'] <=> b['Node']['Node'] }.each do |snode|
        tags_of_instance = snode['Service']['Tags']
        if tags_of_instance.include?(instance_must_tag) && !tags_of_instance.include?(instance_exclude_tag)
          the_backends << snode if snode['Service']['Port']
        end
      end
      # We add the backend ONLY if at least one valid instance does exists
      backends[service_name] = the_backends
    end
  end
%><%
  json_backends = {}
  backends.each_pair do |service_name, nodes|
    service = {
      name:      service_name,
      count:     nodes.count,
      instances: []
    }
    json_backends[service_name] = service
    nodes.each do |snode|
      server = { frontend_id: "backend_http__#{service_name}",
                 id:     snode['Service']['ID'],
                 addr:   snode.service_address,
                 port:   snode['Service']['Port'],
                 tags:   snode['Service']['Tags'],
      }
      service[:instances] << server
    end
  end
  json = { services: json_backends}
%><%= JSON.pretty_generate(json) %>