#
# Copyright (C) 2015 Juniper Networks
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
# == Class: tripleo::network::contrail::analytics
#
# Configure Contrail Analytics services
#
# == Parameters:
#
# [*host_ip*]
#  (required) host IP address of Analytics
#  String (IPv4) value.
#
# [*admin_password*]
#  (optional) admin password
#  String value.
#  Defaults to hiera('contrail::admin_password')
#
# [*admin_tenant_name*]
#  (optional) admin tenant name.
#  String value.
#  Defaults to hiera('contrail::admin_tenant_name')
#
# [*admin_token*]
#  (optional) admin token
#  String value.
#  Defaults to hiera('contrail::admin_token')
#
# [*admin_user*]
#  (optional) admin user name.
#  String value.
#  Defaults to hiera('contrail::admin_user')
#
# [*api_server*]
#  (optional) IP address of api server
#  String value.
#  Defaults to hiera('contrail_config_vip')
#
# [*api_port*]
#  (optional) port of api server
#  String value.
#  Defaults to hiera('contrail::api_port')
#
# [*analytics_aaa_mode*]
#  (optional) analytics aaa mode parameter
#  String value.
#  Defaults to hiera('contrail::analytics_aaa_mode')
#
# [*auth_host*]
#  (optional) keystone server ip address
#  String (IPv4) value.
#  Defaults to hiera('contrail::auth_host')
#
# [*auth_port*]
#  (optional) keystone port.
#  Integer value.
#  Defaults to hiera('contrail::auth_port')
#
# [*auth_port_ssl*]
#  (optional) keystone ssl port.
#  Integer value.
#  Defaults to hiera('contrail::auth_port_ssl')
#
# [*auth_protocol*]
#  (optional) authentication protocol.
#  String value.
#  Defaults to hiera('contrail::auth_protocol')
#
# [*ca_file*]
#  (optional) ca file name
#  String value.
#  Defaults to hiera('contrail::service_certificate',false)
#
# [*cert_file*]
#  (optional) cert file name
#  String value.
#  Defaults to hiera('contrail::service_certificate',false)
#
# [*cassandra_server_list*]
#  (optional) List IPs+port of Cassandra servers
#  Array of strings value.
#  Defaults to hiera('contrail::cassandra_server_list')
#
# [*collector_http_server_port*]
#  (optional) Collector http port
#  Integer value.
#  Defaults to 8089
#
# [*collector_sandesh_port*]
#  (optional) Collector sandesh port
#  Integer value.
#  Defaults to 8086
#
# [*disc_server_ip*]
#  (optional) IPv4 address of discovery server.
#  String (IPv4) value.
#  Defaults to hiera('contrail_config_vip')
#
# [*disc_server_port*]
#  (optional) port Discovery server listens on.
#  Integer value.
#  Defaults to hiera('contrail::disc_server_port')
#
# [*http_server_port*]
#  (optional) Analytics http port
#  Integer value.
#  Defaults to 8090
#
# [*insecure*]
#  (optional) insecure mode.
#  Boolean value.
#  Defaults to falsehiera('contrail::insecure')
#
# [*kafka_broker_list*]
#  (optional) List IPs+port of kafka servers
#  Array of strings value.
#  Defaults to hiera('contrail::kafka_broker_list')
#
# [*memcached_servers*]
#  (optional) IPv4 address of memcached servers
#  String (IPv4) value + port
#  Defaults to hiera('contrail::memcached_server')
#
# [*public_vip*]
#  (optional) Public virtual IP address
#  String (IPv4) value
#  Defaults to hiera('public_virtual_ip')
#
# [*rabbit_server*]
#  (optional) IPv4 addresses of rabbit server.
#  Array of String (IPv4) value.
#  Defaults to hiera('rabbitmq_node_ips')
#
# [*rabbit_user*]
#  (optional) Rabbit user
#  String value.
#  Defaults to hiera('contrail::rabbit_user')
#
# [*rabbit_password*]
#  (optional) Rabbit password
#  String value.
#  Defaults to hiera('contrail::rabbit_password')
#
# [*rabbit_port*]
#  (optional) port of rabbit server
#  String value.
#  Defaults to hiera('contrail::rabbit_port')
#
# [*redis_server*]
#  (optional) IPv4 address of redis server.
#  String (IPv4) value.
#  Defaults to '127.0.0.1'.
#
# [*redis_server_port*]
#  (optional) port Redis server listens on.
#  Integer value.
#  Defaults to 6379
#
# [*rest_api_ip*]
#  (optional) IP address Analytics rest interface listens on
#  String (IPv4) value.
#  Defaults to '0.0.0.0'
#
# [*rest_api_port*]
#  (optional) Analytics rest port
#  Integer value.
#  Defaults to 8081
#
# [*step*]
#  (optional) Step stack is in
#  Integer value.
#  Defaults to hiera('step')
#
# [*zk_server_ip*]
#  (optional) List IPs+port of Zookeeper servers
#  Array of strings value.
#  Defaults to hiera('contrail::zk_server_ip')
#
class tripleo::network::contrail::analytics(
  $step                       = hiera('step'),
  $admin_password             = hiera('contrail::admin_password'),
  $admin_tenant_name          = hiera('contrail::admin_tenant_name'),
  $admin_token                = hiera('contrail::admin_token'),
  $admin_user                 = hiera('contrail::admin_user'),
  $api_server                 = hiera('contrail_config_vip'),
  $api_port                   = hiera('contrail::api_port'),
  $auth_host                  = hiera('contrail::auth_host'),
  $auth_port                  = hiera('contrail::auth_port'),
  $auth_protocol              = hiera('contrail::auth_protocol'),
  $auth_port_ssl              = hiera('contrail::auth_port_ssl'),
  $analytics_aaa_mode         = hiera('contrail::analytics_aaa_mode'),
  $cassandra_server_list      = hiera('contrail_analytics_database_node_ips'),
  $ca_file                    = hiera('contrail::service_certificate',false),
  $cert_file                  = hiera('contrail::service_certificate',false),
  $collector_http_server_port = hiera('contrail::analytics::collector_http_server_port'),
  $collector_sandesh_port     = hiera('contrail::analytics::collector_sandesh_port'),
  $disc_server_ip             = hiera('contrail_config_vip'),
  $disc_server_port           = hiera('contrail::disc_server_port'),
  $http_server_port           = hiera('contrail::analytics::http_server_port'),
  $host_ip                    = hiera('contrail::analytics::host_ip'),
  $insecure                   = hiera('contrail::insecure'),
  $kafka_broker_list          = hiera('contrail_analytics_database_node_ips'),
  $memcached_servers          = hiera('contrail::memcached_server'),
  $public_vip                 = hiera('public_virtual_ip'),
  $rabbit_server              = hiera('rabbitmq_node_ips'),
  $rabbit_user                = hiera('contrail::rabbit_user'),
  $rabbit_password            = hiera('contrail::rabbit_password'),
  $rabbit_port                = hiera('contrail::rabbit_port'),
  $redis_server               = hiera('contrail::analytics::redis_server'),
  $redis_server_port          = hiera('contrail::analytics::redis_server_port'),
  $rest_api_ip                = hiera('contrail::analytics::rest_api_ip'),
  $rest_api_port              = hiera('contrail::analytics::rest_api_port'),
  $zk_server_ip               = hiera('contrail_database_node_ips'),
)
{
  $cassandra_server_list_9042 = join([join($cassandra_server_list, ':9042 '),':9042'],'')
  $kafka_broker_list_9092 = join([join($kafka_broker_list, ':9092 '),':9092'],'')
  $rabbit_server_list_5672 = join([join($rabbit_server, ":${rabbit_port},"),":${rabbit_port}"],'')
  $redis_config = "bind ${host_ip} 127.0.0.1"
  $zk_server_ip_2181 = join([join($zk_server_ip, ':2181 '),':2181'],'')
  $zk_server_ip_2181_comma = join([join($zk_server_ip, ':2181,'),':2181'],'')

  if $auth_protocol == 'https' {
    $keystone_config = {
        'admin_password'    => $admin_password,
        'admin_tenant_name' => $admin_tenant_name,
        'admin_user'        => $admin_user,
        'auth_host'         => $auth_host,
        'auth_port'         => $auth_port_ssl,
        'auth_protocol'     => $auth_protocol,
        'insecure'          => $insecure,
        'certfile'          => $cert_file,
        'cafile'            => $ca_file,
    }
    $vnc_api_lib_config = {
      'auth' => {
        'AUTHN_SERVER'   => $public_vip,
        'AUTHN_PORT'     => $auth_port_ssl,
        'AUTHN_PROTOCOL' => $auth_protocol,
        'certfile'       => $cert_file,
        'cafile'         => $ca_file,
      },
    }
  } else {
    $keystone_config = {
        'admin_password'    => $admin_password,
        'admin_tenant_name' => $admin_tenant_name,
        'admin_user'        => $admin_user,
        'auth_host'         => $auth_host,
        'auth_port'         => $auth_port,
        'auth_protocol'     => $auth_protocol,
        'insecure'          => $insecure,
    }
    $vnc_api_lib_config = {
      'auth' => {
        'AUTHN_SERVER' => $public_vip,
      },
    }
  }
  if $step >= 3 {
    class {'::contrail::analytics':
      alarm_gen_config         => {
        'DEFAULTS'  => {
          'host_ip'              => $host_ip,
          'kafka_broker_list'    => $kafka_broker_list_9092,
          'rabbitmq_server_list' => $rabbit_server_list_5672,
          'rabbitmq_user'        => $rabbit_user,
          'rabbitmq_password'    => $rabbit_password,
          'zk_list'              => $zk_server_ip_2181,
        },
        'DISCOVERY' => {
          'disc_server_ip'   => $disc_server_ip,
          'disc_server_port' => $disc_server_port,
        },
      },
      analytics_nodemgr_config => {
        'DISCOVERY' => {
          'server' => $disc_server_ip,
          'port'   => $disc_server_port,
        },
      },
      analytics_api_config     => {
        'DEFAULTS'  => {
          'api_server'            => "${api_server}:${api_port}",
          'aaa_mode'              => $analytics_aaa_mode,
          'cassandra_server_list' => $cassandra_server_list_9042,
          'host_ip'               => $host_ip,
          'http_server_port'      => $http_server_port,
          'rest_api_ip'           => $rest_api_ip,
          'rest_api_port'         => $rest_api_port,
        },
        'DISCOVERY' => {
          'disc_server_ip'   => $disc_server_ip,
          'disc_server_port' => $disc_server_port,
        },
        'REDIS'     => {
          'redis_server_port' => $redis_server_port,
          'redis_query_port'  => $redis_server_port,
          'server'            => $redis_server,
        },
        'KEYSTONE'  => $keystone_config,
      },
      collector_config         => {
        'DEFAULT'   => {
          'cassandra_server_list' => $cassandra_server_list_9042,
          'hostip'                => $host_ip,
          'http_server_port'      => $collector_http_server_port,
          'kafka_broker_list'     => $kafka_broker_list_9092,
          'zookeeper_server_list' => $zk_server_ip_2181_comma,
        },
        'COLLECTOR' => {
          'port' => $collector_sandesh_port,
        },
        'DISCOVERY' => {
          'port'   => $disc_server_port,
          'server' => $disc_server_ip,
        },
        'REDIS'     => {
          'port'   => $redis_server_port,
          'server' => $redis_server,
        },
      },
      query_engine_config      => {
        'DEFAULT'   => {
          'cassandra_server_list' => $cassandra_server_list_9042,
          'hostip'                => $host_ip,
        },
        'DISCOVERY' => {
          'port'   => $disc_server_port,
          'server' => $disc_server_ip,
        },
        'REDIS'     => {
          'port'   => $redis_server_port,
          'server' => $redis_server,
        },
      },
      snmp_collector_config    => {
        'DEFAULTS'  => {
          'zookeeper' => $zk_server_ip_2181_comma,
        },
        'DISCOVERY' => {
          'disc_server_ip'   => $disc_server_ip,
          'disc_server_port' => $disc_server_port,
        },
      },
      redis_config             => $redis_config,
      topology_config          => {
        'DEFAULTS'  => {
          'zookeeper' => $zk_server_ip_2181_comma,
        },
        'DISCOVERY' => {
          'disc_server_ip'   => $disc_server_ip,
          'disc_server_port' => $disc_server_port,
        },
      },
      vnc_api_lib_config       => $vnc_api_lib_config,
      keystone_config          => {
        'KEYSTONE'     => $keystone_config,
      },
    }
  }
  if $step >= 5 {
    class {'::contrail::analytics::provision_analytics':
      api_address                => $api_server,
      api_port                   => $api_port,
      analytics_node_address     => $host_ip,
      analytics_node_name        => $::fqdn,
      keystone_admin_user        => $admin_user,
      keystone_admin_password    => $admin_password,
      keystone_admin_tenant_name => $admin_tenant_name,
      openstack_vip              => $public_vip,
    }
  }
}