class Naifa::Plugins::Postgres

Constants

DEFAULT_FILENAME
DEFAULT_SETTINGS

Public Class Methods

backup(options={}) click to toggle source
# File lib/naifa/plugins/postgres.rb, line 18
def self.backup(options={})
  filename = options.fetch(:filename, DEFAULT_FILENAME)

  _backup(filename, options)
end
restore(options={}) click to toggle source
# File lib/naifa/plugins/postgres.rb, line 12
def self.restore(options={})
  filename = options.fetch(:filename, DEFAULT_FILENAME)

  _restore(filename, options)
end
sync(options={}) click to toggle source
# File lib/naifa/plugins/postgres.rb, line 24
def self.sync(options={})
  options ||= {}
  filename = options.fetch(:filename, DEFAULT_FILENAME)

  backup_settings = options.fetch(:backup, {})
  restore_settings = options.fetch(:restore, {})
  environments_settings = options.fetch(:environments, {})

  if backup_settings[:environment].blank? ||
      environments_settings[backup_settings[:environment]].blank? ||
      restore_settings[:environment].blank? ||
      environments_settings[restore_settings[:environment]].blank?

    raise Thor::Error, "Sync (Backup and Restore) environments are not defined"
  end

  if environments_settings[backup_settings[:environment]][:type] == :heroku &&
     environments_settings[restore_settings[:environment]][:type] == :heroku

     Heroku::Postgres.sync(
       environments_settings[backup_settings[:environment]][:remote].presence || backup_settings[:environment],
       environments_settings[restore_settings[:environment]][:remote].presence || restore_settings[:environment]
     )
  else
    _backup(filename, options)
    _restore(filename, options)
  end
end

Private Class Methods

_backup(filename, options={}) click to toggle source
# File lib/naifa/plugins/postgres.rb, line 53
def self._backup(filename, options={})
  options ||= {}
  backup_settings = options[:backup]
  environments_settings = options[:environments]

  if backup_settings[:environment].blank? ||
    environments_settings[backup_settings[:environment]].blank?

    raise Thor::Error, "Backup environment is not defined"
  end

  environment_settings = environments_settings[backup_settings[:environment]]

  case environment_settings[:type]
  when :remote
    if environment_settings[:host].blank? ||
        environment_settings[:username].blank? ||
        environment_settings[:database].blank? ||
        (environment_settings[:path].presence || options[:path].presence).blank?

      raise Thor::Error, "Backup remote environment #{backup_settings[:environment]} is not correctly configured"
    end

    command_line = build_backup_command(
      environment_settings[:host],
      environment_settings[:username],
      environment_settings[:database],
      File.join(
        environment_settings[:path].presence || options[:path].presence,
        filename
      ),
      environment_settings[:backup_options]
    )
    Kernel.system(command_line)
  when :local
    if environment_settings[:username].blank? ||
        environment_settings[:database].blank? ||
        (environment_settings[:path].presence || options[:path].presence).blank?

      raise Thor::Error, "Backup local environment #{backup_settings[:environment]} is not correctly configured"
    end

    command_line = build_backup_command(
      'localhost',
      environment_settings[:username],
      environment_settings[:database],
      File.join(
        environment_settings[:path].presence || options[:path].presence,
        filename
      ),
      environment_settings[:backup_options]
    )
    Kernel.system(command_line)
  when :heroku
    if (environment_settings[:path].presence || options[:path].presence).blank?
      raise Thor::Error, "Backup heroku environment #{backup_settings[:environment]} is not correctly configured"
    end

    Heroku::Postgres.backup(
      File.join(
        environment_settings[:path].presence || options[:path].presence,
        filename
      ),
      environment_settings[:remote].presence || backup_settings[:environment]
    )
  when :docker
    if environment_settings[:username].blank? ||
        environment_settings[:database].blank? ||
        (environment_settings[:path].presence || options[:path].presence).blank? ||
        environment_settings[:app_name].blank?

      raise Thor::Error, "Restore docker environment #{backup_settings[:environment]} is not correctly configured"
    end

    command_line = build_backup_command(
      'localhost',
      environment_settings[:username],
      environment_settings[:database],
      File.join(
        environment_settings[:path].presence || options[:path].presence,
        filename
      ),
      environment_settings[:backup_options]
    )
    Utils.docker_compose_exec_command(
      environment_settings[:app_name].presence,
      command_line
    )
  else
    raise Thor::Error, "Backup unsupported type"
  end
end
_restore(filename, options={}) click to toggle source
# File lib/naifa/plugins/postgres.rb, line 148
def self._restore(filename, options={})
  options ||= {}

  restore_settings = options[:restore]
  environments_settings = options[:environments]

  if restore_settings[:environment].blank? ||
    environments_settings[restore_settings[:environment]].blank?

    raise Thor::Error, "Restore environment is not defined"
  end

  environment_settings = environments_settings[restore_settings[:environment]]

  case environment_settings[:type]
  when :remote
    if environment_settings[:host].blank? ||
        environment_settings[:username].blank? ||
        environment_settings[:database].blank? ||
        (environment_settings[:path].presence || options[:path].presence).blank?

      raise Thor::Error, "Restore remote environment #{restore_settings[:environment]} is not correctly configured"
    end

    command_line = build_restore_command(
      environment_settings[:host],
      environment_settings[:username],
      environment_settings[:database],
      File.join(
        environment_settings[:path].presence || options[:path].presence,
        filename
      ),
      environment_settings[:restore_options]
    )
    Kernel.system(command_line)
  when :local
    if environment_settings[:username].blank? ||
        environment_settings[:database].blank? ||
        (environment_settings[:path].presence || options[:path].presence).blank?

      raise Thor::Error, "Restore local environment #{restore_settings[:environment]} is not correctly configured"
    end

    command_line = build_restore_command(
      'localhost',
      environment_settings[:username],
      environment_settings[:database],
      File.join(
        environment_settings[:path] || options[:path],
        filename
      ),
      environment_settings[:restore_options]
    )
    Kernel.system(command_line)
  when :docker
    if environment_settings[:username].blank? ||
        environment_settings[:database].blank? ||
        (environment_settings[:path].presence || options[:path].presence).blank? ||
        environment_settings[:app_name].blank?

      raise Thor::Error, "Restore docker environment #{restore_settings[:environment]} is not correctly configured"
    end

    command_line = build_restore_command(
      'localhost',
      environment_settings[:username],
      environment_settings[:database],
      File.join(
        environment_settings[:path].presence || options[:path].presence,
        filename
      ),
      environment_settings[:restore_options]
    )
    Utils.docker_compose_exec_command(
      environment_settings[:app_name],
      command_line
    )
  else
    raise Thor::Error, "Restore unsupported type"
  end
end
build_backup_command(host, username, database, filename, options={}) click to toggle source
# File lib/naifa/plugins/postgres.rb, line 240
def self.build_backup_command(host, username, database, filename, options={})
  command = "pg_dump "
  command << " #{options.join(' ')}" if options.present?
  command << " -h #{host} -U #{username} -d #{database} > #{filename}"
end
build_restore_command(host, username, database, filename, options={}) click to toggle source
# File lib/naifa/plugins/postgres.rb, line 232
def self.build_restore_command(host, username, database, filename, options={})
  command = "pg_restore"
  command << " #{options.join(' ')}" if options.present?
  command << " -h #{host} -U #{username} -d #{database} #{filename}"
end