require 'yaml'

# default variable values
pgver = '13'
pgbr_branch = 'release/2.32'
vm_prefix = 'check_pgbr_c7'
encrypted_repo = 'true'
edb_repository_username = 'username'
edb_repository_password = 'password'

if File.file?('vagrant.yml') and ( custom = YAML.load_file('vagrant.yml') )
    pgver                   = custom['pgver']                   if custom.has_key?('pgver')
    pgbr_branch             = custom['pgbr_branch']             if custom.has_key?('pgbr_branch')
    vm_prefix               = custom['vm_prefix']               if custom.has_key?('vm_prefix')
    encrypted_repo          = custom['encrypted_repo']          if custom.has_key?('encrypted_repo')
    edb_repository_username = custom['edb_repository_username'] if custom.has_key?('edb_repository_username')
    edb_repository_password = custom['edb_repository_password'] if custom.has_key?('edb_repository_password')
end

epas = 'false'
if defined?(ENV['EPAS']) and ENV['EPAS'] == 'true'
    epas = 'true'
end

Vagrant.configure(2) do |config|

    if epas == 'true'
        pgdata = "/var/lib/edb/as#{pgver}/data"
        pguser = "enterprisedb"
        pgport = 5444
        pgsvc  = "edb-as-#{pgver}"
    else
        pgdata = "/var/lib/pgsql/#{pgver}/data"
        pguser = "postgres"
        pgport = 5432
        pgsvc  = "postgresql-#{pgver}"
    end

    config.vm.box = 'centos/7'

    # hardware and host settings
    config.vm.provider 'libvirt' do |lv|
        lv.cpus = 1
        lv.memory = 2048
        lv.default_prefix = vm_prefix
    end

    # don't mind about insecure ssh key
    config.ssh.insert_key = false

    # share the default vagrant folder
    config.vm.synced_folder ".", "/vagrant"

    # mount check_pgbackrest path for testing
    config.vm.synced_folder "../..", "/check_pgbackrest", type: "nfs"
    if File.directory?(File.expand_path("../../../pgbackrest"))
        config.vm.synced_folder "../../../pgbackrest", "/pgbackrest", type: "nfs"
    end

    # ssh configuration
    config.vm.synced_folder '../common/ssh', '/root/.ssh', type: 'rsync',
        owner: 'root', group: 'root',
        rsync__args: [ "--verbose", "--archive", "--delete", "--copy-links", "--no-perms" ]

    # check_pgbackrest install on all the nodes
    config.vm.provision 'check_pgbackrest', type: 'shell', path: 'provision/check_pgbackrest.bash'

    config.vm.define "icinga-srv" do |icinga|
        icinga.vm.hostname = "icinga-srv"

        # install PostgreSQL
        icinga.vm.provision 'pgsql', type: 'shell', 
          path: 'provision/PGDG/pgsql.bash', 
          args: [ pgver, "/var/lib/pgsql/#{pgver}/data", "postgres" ]

        # icinga2 local setup
        icinga.vm.provision 'icinga2', type: 'shell',
          path: 'provision/icinga2.bash', run: 'never'

        # pgbackrest setup
        icinga.vm.provision 'icinga2_multi', type: 'shell',
          path: 'provision/icinga2_multi.bash',
          args: [ pguser ],
          run: 'never'
    end

    config.vm.define "pgsql-srv" do |pgsql|
        pgsql.vm.hostname = "pgsql-srv"
        
        if epas == 'true'
            # install EDB Postgres Advanced Server
            pgsql.vm.provision 'epas', type: 'shell', 
              path: 'provision/EDB/epas.bash', 
              args: [ pgver, pgdata, pguser, pgport, edb_repository_username, edb_repository_password ]
            
            # compile pgBackRest besides EDB Postgres Advanced Server
            pgsql.vm.provision 'pgbackrest_build', type: 'shell', 
              path: 'provision/EDB/pgbackrest_build.bash',
              args: [ pgver, pgbr_branch ],
              run: 'never'
        else
            # install PostgreSQL
            pgsql.vm.provision 'pgsql', type: 'shell', 
              path: 'provision/PGDG/pgsql.bash', 
              args: [ pgver, pgdata, pguser ]

            # compile pgBackRest besides PostgreSQL
            pgsql.vm.provision 'pgbackrest_build', type: 'shell', 
              path: 'provision/PGDG/pgbackrest_build.bash',
              args: [ pgbr_branch ],
              run: 'never'
        end

        # pgbackrest local setup
        pgsql.vm.provision 'pgbackrest_local_primary', type: 'shell',
          path: 'provision/pgbackrest_local_primary.bash',
          args: [ pgver, pgdata, pguser, pgport, encrypted_repo ],
          run: 'never'
 
        # pgbackrest remote setup
        pgsql.vm.provision 'pgbackrest_remote_primary', type: 'shell',
          path: 'provision/pgbackrest_remote_primary.bash',
          args: [ pgver, pgdata, pguser, pgport, encrypted_repo ],
          run: 'never'
 
        # pgbackrest minio setup
        pgsql.vm.provision 'pgbackrest_minio_primary', type: 'shell',
          path: 'provision/pgbackrest_minio_primary.bash',
          args: [ pgver, pgdata, pguser, pgport, encrypted_repo ],
          run: 'never'
 
        # pgbackrest azurite setup
        pgsql.vm.provision 'pgbackrest_azurite_primary', type: 'shell',
          path: 'provision/pgbackrest_azurite_primary.bash',
          args: [ pgver, pgdata, pguser, pgport, encrypted_repo ],
          run: 'never'

        # generate configuration file for common scripts
        $script = <<-SCRIPT
        echo export PGVER=\\"$1\\" > $7
        echo export PGDATA=\\"$2\\" >> $7
        echo export PGUSER=\\"$3\\" >> $7
        echo export PGPORT=\\"$4\\" >> $7
        echo export PGSVC=\\"$5\\" >> $7
        echo export SPROFILE=\\"$6\\" >> $7
        SCRIPT

        pgsql.vm.provision 'generate_config_file', type: 'shell',
          inline: $script, run: 'never',
          args: [ pgver, pgdata, pguser, pgport, pgsvc, ENV['SPROFILE'] || 'local', '/check_pgbackrest/tests/common/configuration.profile' ]
    end

    config.vm.define "backup-srv" do |backup|
        backup.vm.hostname = "backup-srv"
 
        # cifs share to store pgbackrest backups
        backup.vm.provision 'cifs', type: 'shell',
          path: 'provision/cifs.bash', run: 'never'
        
        if epas == 'true'
            # install EDB Postgres Advanced Server
            backup.vm.provision 'epas', type: 'shell', 
              path: 'provision/EDB/epas.bash', 
              args: [ pgver, pgdata, pguser, pgport, edb_repository_username, edb_repository_password ]

            # compile pgBackRest besides EDB Postgres Advanced Server
            backup.vm.provision 'pgbackrest_build', type: 'shell', 
              path: 'provision/EDB/pgbackrest_build.bash',
              args: [ pgver, pgbr_branch ],
              run: 'never'
        else
            # install PostgreSQL
            backup.vm.provision 'pgsql', type: 'shell', 
              path: 'provision/PGDG/pgsql.bash', 
              args: [ pgver, pgdata, pguser ]
            
            # compile pgBackRest besides PostgreSQL
            backup.vm.provision 'pgbackrest_build', type: 'shell', 
              path: 'provision/PGDG/pgbackrest_build.bash',
              args: [ pgbr_branch ],
              run: 'never'
        end

        # pgbackrest local setup
        backup.vm.provision 'pgbackrest_local_standby', type: 'shell',
          path: 'provision/pgbackrest_local_standby.bash',
          args: [ pgver, pgdata, pguser, pgport, pgsvc, encrypted_repo ],
          run: 'never'

        # pgbackrest remote setup
        backup.vm.provision 'pgbackrest_remote_standby', type: 'shell',
          path: 'provision/pgbackrest_remote_standby.bash',
          args: [ pgver, pgdata, pguser, pgport, pgsvc, encrypted_repo ],
          run: 'never'

        # pgbackrest minio setup
        backup.vm.provision 'pgbackrest_minio_standby', type: 'shell',
          path: 'provision/pgbackrest_minio_standby.bash',
          args: [ pgver, pgdata, pguser, pgport, pgsvc, encrypted_repo ],
          run: 'never'
 
        # pgbackrest azurite setup
        backup.vm.provision 'pgbackrest_azurite_standby', type: 'shell',
          path: 'provision/pgbackrest_azurite_standby.bash',
          args: [ pgver, pgdata, pguser, pgport, pgsvc, encrypted_repo ],
          run: 'never'

        # minio local setup
        backup.vm.provision 'minio', type: 'shell', 
          path: 'provision/minio.bash', run: 'never'

        # minio http setup
        backup.vm.provision 'minio_http', type: 'shell', 
          path: 'provision/minio_http.bash', run: 'never'

        # azurite local setup
        backup.vm.provision 'azurite', type: 'shell', 
          path: 'provision/azurite.bash', run: 'never'
    end

    # build a specific Perl version on all the nodes
    config.vm.provision 'perl_build', type: 'shell',
      path: 'provision/perl_build.bash', run: 'never'
end
