# Class: datadog_agent::integrations::mysql
#
# This class will install the necessary configuration for the mysql integration
#
# Parameters:
#   $password
#       The mysql password for the datadog user
#   $host:
#       The host mysql is running on
#   $user
#       The mysql user for the datadog user
#   $sock
#       Connect mysql via unix socket
#   $tags
#       Optional array of tags
#   $replication
#       replication option
#   $galera_cluster
#       galera cluster option
#   $extra_status_metrics
#       extra status metrics
#   $extra_innodb_metrics
#       extra innodb metrics
#   $extra_performance_metrics
#       extra performance metrics, query run time, 95th precentile avg
#   $schema_size_metrics
#       schema size metrics
#   $disable_innodb_metrics
#       disable innodb metrics, used with older versions of MySQL without innodb engine support.
# Sample Usage:
#
#  class { 'datadog_agent::integrations::mysql' :
#    host     => 'localhost',
#    password => 'some_pass',
#    user     => 'datadog'
#  }
# Sample Usage (Instance):
#  class { 'datadog_agent::integrations::mysql' :
#    instances => [{
#      host                      => 'localhost',
#      password                  => 'mypassword',
#      user                      => 'datadog',
#      port                      => '3306',
#      tags                      => ['instance:mysql1'],
#      replication               => '0',
#      galera_cluster            => '0',
#      extra_status_metrics      => 'true',
#      extra_innodb_metrics      => 'true',
#      extra_performance_metrics => 'true',
#      schema_size_metrics       => 'true', 
#      disable_innodb_metrics    => 'false',
#    }
#  }
#
#
class datadog_agent::integrations::mysql(
  $password,
  $host = 'localhost',
  $user = 'datadog',
  $port = 3306,
  $sock = undef,
  $tags = [],
  $replication = '0',
  $galera_cluster = '0',
  $extra_status_metrics = false,
  $extra_innodb_metrics = false,
  $extra_performance_metrics = false,
  $schema_size_metrics = false,
  $disable_innodb_metrics = false,
  $instances = undef,
  ) inherits datadog_agent::params {
  include datadog_agent

  validate_array($tags)

  if !$instances and $host {
    $_instances = [{
      'host'                      => $host,
      'password'                  => $password,
      'user'                      => $user,
      'port'                      => $port,
      'sock'                      => $sock,
      'tags'                      => $tags,
      'replication'               => $replication,
      'galera_cluster'            => $galera_cluster,
      'extra_status_metrics'      => $extra_status_metrics,
      'extra_innodb_metrics'      => $extra_innodb_metrics,
      'extra_performance_metrics' => $extra_performance_metrics,
      'schema_size_metrics'       => $schema_size_metrics,
      'disable_innodb_metrics'    => $disable_innodb_metrics,
    }]
  } elsif !$instances{
    $_instances = []
  } else {
    $_instances = $instances
  }

  file { "${datadog_agent::params::conf_dir}/mysql.yaml":
    ensure  => file,
    owner   => $datadog_agent::params::dd_user,
    group   => $datadog_agent::params::dd_group,
    mode    => '0600',
    content => template('datadog_agent/agent-conf.d/mysql.yaml.erb'),
    require => Package[$datadog_agent::params::package_name],
    notify  => Service[$datadog_agent::params::service_name],
  }
}

