# Install and maintain OpenStack Health.
# params:
#   source_dir:
#     The directory where the application will be running
#   serveradmin:
#     Used in the Apache virtual host, eg., openstack-health@openstack.org
#   vhost_name:
#     Used in the Apache virtual host, eg., health.openstack.org
#   vhost_port:
#     Used in the Apache virtual host, eg., 5000
class openstack_health::api(
  $db_uri = undef,
  $source_dir = '/opt/openstack-health',
  $server_admin = "webmaster@${::fqdn}",
  $vhost_name = 'localhost',
  $vhost_port = 5000,
  $ignored_run_metadata_keys = undef,
  $elastic_recheck_dir = '/opt/elastic-recheck',
  $elastic_recheck_repo = 'https://git.openstack.org/openstack-infra/elastic-recheck',
  $elastic_recheck_revision = 'master',
  $cache_expiration = 900,
) {

  include ::httpd::mod::wsgi

  $default_ignored_run_metadata_keys = ['build_change', 'build_node',
                                        'build_patchset', 'build_ref',
                                        'build_short_uuid', 'build_uuid',
                                        'build_zuul_url', 'filename',
                                        'build_newrev']

  if $ignored_run_metadata_keys {
    # In case it was defined, ensure the value provided is an array
    if is_array($ignored_run_metadata_keys) {
      $ignored_keys = $ignored_run_metadata_keys
    } else {
      fail('$ignored_run_metadata_keys parameter should be an array of strings')
    }
  } else {
    # In case it was not defined, use the default value
    $ignored_keys = $default_ignored_run_metadata_keys
  }

  $api_dir = "${source_dir}/openstack_health"
  $virtualenv_dir = "${source_dir}/.venv"

  class { '::python':
    dev        => true,
    pip        => true,
    virtualenv => true,
    version    => 'system',
  }

  class { '::memcached':
    max_memory => '60%',
    listen_ip  => '127.0.0.1',
  }

  vcsrepo { $elastic_recheck_dir :
    ensure   => latest,
    owner    => 'openstack_health',
    group    => 'openstack_health',
    provider => git,
    revision => $elastic_recheck_revision,
    source   => $elastic_recheck_repo,
    require  => Class['::openstack_health::user'],
  }

  ::python::virtualenv { $virtualenv_dir:
    ensure  => present,
    require => Class['::python'],
  }

  package {'apache2-utils':
    ensure => present,
  }

  case $::osfamily {
    'RedHat': {
      package {'libffi-dev':
        ensure => present,
        name   => 'libffi-devel',
      }
    }
    default: {
      package {'libffi-dev':
        ensure => present,
      }
    }
  }

  package {'libxml2-dev':
    ensure => present,
  }

  package {'libxslt1-dev':
    ensure => present,
  }

  package {'zlib1g-dev':
    ensure => present,
  }

  package {'libmemcached-dev':
    ensure => present,
  }

  package {'cython':
    ensure => present,
  }

  exec { 'requirements':
    command     => "${virtualenv_dir}/bin/pip install -U -r ${source_dir}/requirements.txt",
    require     => [
      Python::Virtualenv[$virtualenv_dir],
      Package['libmemcached-dev'],
      Package['cython'],
    ],
    subscribe   => Vcsrepo[$source_dir],
    refreshonly => true,
    timeout     => 1800,
  }

  exec { 'elastic-recheck-install':
    command     => "${virtualenv_dir}/bin/pip install -U ${elastic_recheck_dir}",
    require     => [
      Python::Virtualenv[$virtualenv_dir],
      Package['libffi-dev'],
    ],
    subscribe   => Vcsrepo[$elastic_recheck_dir],
    refreshonly => true,
    timeout     => 1800,
  }

  exec { 'package-application':
    command     => "${virtualenv_dir}/bin/pip install -e ${source_dir}",
    refreshonly => true,
    subscribe   => Exec['requirements'],
  }

  file { '/etc/openstack-health.conf':
    ensure    => present,
    content   => template('openstack_health/openstack-health.conf.erb'),
    owner     => 'openstack_health',
    group     => 'openstack_health',
    mode      => '0644',
    subscribe => [
      Vcsrepo[$source_dir],
      Vcsrepo[$elastic_recheck_dir],
    ],
  }

  ::httpd::vhost { "${vhost_name}-api":
    docroot  => 'MEANINGLESS ARGUMENT',
    port     => $vhost_port,
    priority => '50',
    ssl      => false,
    template => 'openstack_health/openstack-health-api.vhost.erb',
    require  => [
      File['/etc/openstack-health.conf'],
      Exec['package-application'],
    ],
  }
  if ! defined(Httpd::Mod['cache']) {
    httpd::mod { 'cache':
      ensure => present,
    }
  }

  if $::operatingsystem == 'Ubuntu' and $::operatingsystemrelease == '12.04' {
    $cache_disk_module = 'disk_cache'
  } else {
    $cache_disk_module = 'cache_disk'
  }
  if ! defined(Httpd::Mod[$cache_disk_module]) {
    httpd::mod { $cache_disk_module:
      ensure => present,
    }
  }
}