# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You 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 gpdb {

  class deploy($roles) {
    if ("gpdb-master" in $roles or "gpdb-segment" in $roles) {
      include gpdb::common
    }
  }

  class common($nodes, $gp_home, $db_base_dir, $master_db_port, $segment_db_port_prefix) {

    include stdlib

    class { 'gpdb::common::install_packages': }

    class { 'gpdb::common::gpadmin_user':}

    class { 'gpdb::common::prepare_file_structure':
      base_dir => "$db_base_dir",
      require  => Class['gpdb::common::gpadmin_user']
    }

    class { 'gpdb::common::prepare_db_dirs':
      base_dir            => "$db_base_dir",
      nodes               => $nodes,
      gp_home             => $gp_home,
      master_port         => $master_db_port,
      segment_port_prefix => $segment_db_port_prefix,
      require             => [Class['gpdb::common::prepare_file_structure'], Exec["install_python_packages"]]
    }

    gpdb::server{"stop_if_running":
      nodes                   => $gpdb::common::nodes,
      gp_home                 => $gpdb::common::gp_home,
      db_base_dir             => $gpdb::common::db_base_dir,
      master_db_port          => $gpdb::common::master_db_port,
      segment_db_port_prefix  => $gpdb::common::segment_db_port_prefix,
      require                 => Class['gpdb::common::prepare_db_dirs'],
      start_or_stop           => stopped,
    }

    class { 'gpdb::common::configure_master_node':
      base_dir            => "$db_base_dir",
      nodes               => $nodes,
      gp_home             => $gp_home,
      master_port         => $master_db_port,
      segment_port_prefix => $segment_db_port_prefix,
      require             => Class['gpdb::common::prepare_db_dirs']
    }

    class { 'gpdb::common::stop_master_in_admin_mode':
      base_dir      => "$db_base_dir",
      nodes         => $nodes,
      gp_home       => $gp_home,
      master_port   => $master_db_port,
      require       => Class['gpdb::common::configure_master_node']
    }

    gpdb::server{"start":
      nodes                   => $gpdb::common::nodes,
      gp_home                 => $gpdb::common::gp_home,
      db_base_dir             => $gpdb::common::db_base_dir,
      master_db_port          => $gpdb::common::master_db_port,
      segment_db_port_prefix  => $gpdb::common::segment_db_port_prefix,
      require                 => [ Gpdb::Server["stop_if_running"], Class['gpdb::common::stop_master_in_admin_mode'] ],
      start_or_stop           => running,
    }

    class gpadmin_user{
      group { 'gpadmin':
        ensure => 'present',
      }
      user { 'gpadmin':
        ensure            => 'present',
        system            => false,
        managehome        => true,
        groups            => 'gpadmin',
        shell             => '/bin/bash',
      }
    }

    class install_packages{
      # GPDB 5.x only supports Python 2.x, but we dropped pip for python2 in BIGTOP-3491.
      # In addition, the latest versions of some distros (Fedora and Ubuntu, at least)
      # doesn't seem to provide it as a standard package. So we use get-pip.py
      # (https://pip.pypa.io/en/stable/installing/#installing-with-get-pip-py)
      # here to install it on all distros.
      exec { 'download_get_pip':
        cwd => '/tmp',
        command => '/usr/bin/curl -sLO https://bootstrap.pypa.io/pip/2.7/get-pip.py'
      }
      exec { 'install_pip':
        cwd => '/tmp',
        command => '/usr/bin/python2 get-pip.py',
        require => [Exec["download_get_pip"], Package["gpdb"]],
      }
      # GPDB requires the following python packages as of v5.28.5. See
      # https://github.com/greenplum-db/gpdb/tree/5X_STABLE#building-greenplum-database-with-gporca.
      exec { 'install_python_packages':
        command => "/usr/bin/env pip install -q 'cryptography<3.3' lockfile paramiko psutil",
        require => [Exec["install_pip"]],
      }
      package { ["gpdb"]:
        ensure => latest,
      }
    }

    class prepare_file_structure($base_dir = undef){
      file { "$base_dir":
        ensure => 'directory',
        owner  => 'gpadmin',
        group  => 'gpadmin',
      }
      file { "$base_dir/master":
        ensure => 'directory',
        owner  => 'gpadmin',
        group  => 'gpadmin',
      }
      file { "$base_dir/primary":
        ensure => 'directory',
        owner  => 'gpadmin',
        group  => 'gpadmin',
      }
    }

    class prepare_db_dirs($nodes = undef, $base_dir = undef, $gp_home = undef, $master_port = undef, $segment_port_prefix = undef){
      file { '/home/gpadmin/init-db.sh':
        content => template('gpdb/init-db.sh'),
        require => [
          File["$base_dir/primary"],
          File["$base_dir/master"]],
        owner   => 'gpadmin',
        group   => 'gpadmin',
        mode    => '0700',
      }
      file { '/home/gpadmin/stop-db.sh':
        content => template('gpdb/stop-db.sh'),
        owner   => 'gpadmin',
        group   => 'gpadmin',
        mode    => '0700',
      }
      each($nodes) |$index, $value| {
        notice($value)
        if ($::fqdn == $value) {
          $dbid = $index+1
          $content = $index-1
          $hostname = $value
          $segment_nodes_count=size($nodes)-1
          if ($dbid == 1){
            $port = $master_port
            $db_sub_dir = "master"
            $m_options = "master"
            $x_options = "-x 0 -E"
            $z_options = "$segment_nodes_count"
          } else{
            $port = "$segment_port_prefix${content}"
            $db_sub_dir = "primary"
            $m_options = "mirrorless"
            $x_options = ""
            $z_options = "$segment_nodes_count"
          }
          $db_dir = "$base_dir/${db_sub_dir}/gpseg${content}"
          exec { "create_master_db${db_dir}":
            command => "init-db.sh $db_dir",
            require => [File["/home/gpadmin/init-db.sh"]],
            path    => '/home/gpadmin',
            user    => 'gpadmin',
          }
          file_line { "allow all host connection${db_dir}":
            path    => "${db_dir}/pg_hba.conf",
            line    => 'host all all 0.0.0.0/0 trust',
            require => [Exec["create_master_db${db_dir}"]],
          }
          file_line { "add 1 conf${db_dir}":
            path    => "${db_dir}/postgresql.conf",
            line    => 'log_statement=all',
            require => [Exec["create_master_db${db_dir}"]],
          }
          file_line { "add 2 conf${db_dir}":
            path    => "${db_dir}/postgresql.conf",
            line    => 'checkpoint_segments=8',
            require => [Exec["create_master_db${db_dir}"]],
          }
          file_line { "add 3 conf${db_dir}":
            path    => "${db_dir}/postgresql.conf",
            line    => "port=${port}",
            require => [Exec["create_master_db${db_dir}"]],
          }
          file { "${db_dir}/gp_dbid":
            content => template('gpdb/gp_dbid'),
            require => [Exec["create_master_db${db_dir}"]],
            owner   => 'gpadmin',
            group   => 'gpadmin',
            mode    => '0700',
          }
          file { "${db_dir}/gpssh.conf":
            content => template('gpdb/gpssh.conf'),
            require => [Exec["create_master_db${db_dir}"]],
            owner   => 'gpadmin',
            group   => 'gpadmin',
            mode    => '0700',
          }
          file { "${db_dir}/postmaster.opts":
            content => template('gpdb/postmaster.opts'),
            require => [Exec["create_master_db${db_dir}"]],
            owner   => 'gpadmin',
            group   => 'gpadmin',
            mode    => '0700',
          }
          file { "${db_dir}/run.opts":
            source  => "${db_dir}/postmaster.opts",
            ensure  => present,
            require => [File["${db_dir}/postmaster.opts"]],
            owner   => 'gpadmin',
            group   => 'gpadmin',
            mode    => '0700',
          }
        }
      }
    }

    class stop_master_in_admin_mode($nodes = undef, $base_dir = undef, $gp_home = undef, $master_port = undef){
      if ($::fqdn == $nodes[0]) {
        exec { 'stop-master-db-in-admin-mode':
          command => "stop-db.sh $base_dir/master/gpseg-1 $master_port",
          path    => '/home/gpadmin',
          user    => 'gpadmin',
          require => [
            Exec["create_master_db$base_dir/master/gpseg-1"],
            File['/home/gpadmin/stop-db.sh']
          ],
        }
      }
    }

    class configure_master_node($nodes = undef, $base_dir = undef, $gp_home = undef, $master_port = undef, $segment_port_prefix = undef){
      if ($::fqdn == $nodes[0]) {
        notice("must make admin")
        file { '/home/gpadmin/start-master-db-in-admin-mode.sh':
          content => template('gpdb/start-master-db-in-admin-mode.sh'),
          require => [Exec["create_master_db$base_dir/master/gpseg-1"]],
          owner   => 'gpadmin',
          group   => 'gpadmin',
          mode    => '0700',
        }
        file { '/home/gpadmin/test-master-db.sh':
          content => template('gpdb/test-master-db.sh'),
          require => [Exec["create_master_db$base_dir/master/gpseg-1"]],
          owner   => 'gpadmin',
          group   => 'gpadmin',
          mode    => '0700',
        }
        exec { 'start-master-db-in-admin-mode':
          command => "start-master-db-in-admin-mode.sh $base_dir/master/gpseg-1",
          path    => '/home/gpadmin',
          user    => 'gpadmin',
          require => [
            Exec["create_master_db$base_dir/master/gpseg-1"],
            File['/home/gpadmin/start-master-db-in-admin-mode.sh']
          ],
        }
        file { '/home/gpadmin/insert-to-segmentConfig-table.sh':
          content => template('gpdb/insert-to-segmentConfig-table.sh'),
          require => [Exec["start-master-db-in-admin-mode"]],
          owner   => 'gpadmin',
          group   => 'gpadmin',
          mode    => '0700',
        }
        file { '/home/gpadmin/insert-to-faultStrategy-table.sh':
          content => template('gpdb/insert-to-faultStrategy-table.sh'),
          require => [Exec["start-master-db-in-admin-mode"]],
          owner   => 'gpadmin',
          group   => 'gpadmin',
          mode    => '0700',
        }
        exec { "insert-to-faultStrategy-table":
          environment => ["PGOPTIONS=-c gp_session_role=utility"],
          command     => "insert-to-faultStrategy-table.sh",
          path        => '/home/gpadmin',
          user        => 'gpadmin',
          require     => [
            File["/home/gpadmin/insert-to-faultStrategy-table.sh"],
            Exec['start-master-db-in-admin-mode'],
          ],
        }
        each($nodes) |$index, $value| {
          $dbid = $index+1
          $content = $index-1
          $hostname = $value
          if ($dbid == 1){
            $port = $master_port
            $db_sub_dir = "master"
            $m_options = "master"
            $x_options = "\"-x\" \"0\" \"-c\" \"gp_role=utility\""
            $z_options = "0"
          } else{
            $port = "$segment_port_prefix${content}"
            $db_sub_dir = "primary"
            $m_options = "mirrorless"
            $x_options = ""
            $z_options = "3"
          }
          $db_dir = "$base_dir/${db_sub_dir}/gpseg${content}"
          notice("${dbid} - ${content} - ${port} - ${hostname} - ${db_dir}")
          exec { "insert-to-segmentConfig-table${dbid}":
            environment => ["PGOPTIONS=-c gp_session_role=utility"],
            command     => "insert-to-segmentConfig-table.sh ${dbid} ${content} ${port} ${value} ${db_dir}",
            path        => '/home/gpadmin',
            user        => 'gpadmin',
            require     => [
              File["/home/gpadmin/insert-to-segmentConfig-table.sh"],
              Exec['start-master-db-in-admin-mode'],
            ],
          }
        }
      }
    }
  }

  define server($nodes, $gp_home, $db_base_dir, $master_db_port, $segment_db_port_prefix, $start_or_stop){
    each($nodes) |$index, $value| {
      $content = $index-1
      if ($::fqdn == $value) {
        if ($index == 0){
          $db_sub_dir = "master"
          $port = $master_db_port
        }else{
          $db_sub_dir = "primary"
          $port = "$segment_db_port_prefix${content}"
        }
        $db_dir = "$db_base_dir/${db_sub_dir}/gpseg${content}"
        service { "gpdb${content}${start_or_stop}":
          provider  => base,
          ensure    => $start_or_stop,
          start     => "su -l gpadmin -m $db_dir/run.opts",
          stop      => "su -l gpadmin -m /home/gpadmin/stop-db.sh $db_dir $port",
          hasstatus => false,
          pattern   => "${db_dir}",
        }
      }
    }
  }
}
