theforeman/foreman_maintain

View on GitHub
definitions/scenarios/backup.rb

Summary

Maintainability
A
0 mins
Test Coverage
module ForemanMaintain::Scenarios
  class Backup < ForemanMaintain::Scenario
    metadata do
      description 'Backup'
      manual_detection
      tags :backup
      run_strategy :fail_fast
      param :strategy, 'Backup strategy. One of [:online, :offline]',
        :required => true
      param :backup_dir, 'Directory where to backup to', :required => true
      param :preserve_dir, 'Directory where to backup to'
      param :incremental_dir, 'Changes since specified backup only'
      param :proxy_features, 'List of proxy features to backup (default: all)', :array => true
      param :skip_pulp_content, 'Skip Pulp content during backup'
      param :tar_volume_size, 'Size of tar volume (indicates splitting)'
      param :wait_for_tasks, 'Wait for running tasks to complete instead of aborting'
    end

    def compose
      check_valid_strategy
      add_step_with_context(Checks::Backup::IncrementalParentType,
        :online_backup => strategy == :online)
      add_step(Checks::ForemanTasks::NotRunning.new(:wait_for_tasks => wait_for_tasks?))
      add_step(Checks::Pulpcore::NoRunningTasks.new(:wait_for_tasks => wait_for_tasks?))
      add_step_with_context(Procedures::Backup::AccessibilityConfirmation) if strategy == :offline
      add_step_with_context(Procedures::Backup::PrepareDirectory)
      add_step_with_context(Procedures::Backup::Metadata, :online_backup => strategy == :online)

      case strategy
      when :online
        add_online_backup_steps
      when :offline
        add_offline_backup_steps
      end

      add_step_with_context(Procedures::Backup::CompressData)
    end

    # rubocop:disable  Metrics/MethodLength
    def set_context_mapping
      context.map(:backup_dir,
        Procedures::Backup::PrepareDirectory => :backup_dir,
        Procedures::Backup::Metadata => :backup_dir,
        Procedures::Backup::ConfigFiles => :backup_dir,
        Procedures::Backup::CompressData => :backup_dir,
        Procedures::Backup::Pulp => :backup_dir,
        Procedures::Backup::Online::CandlepinDB => :backup_dir,
        Procedures::Backup::Online::ForemanDB => :backup_dir,
        Procedures::Backup::Online::PulpcoreDB => :backup_dir)
      context.map(:preserve_dir,
        Procedures::Backup::PrepareDirectory => :preserve_dir)
      context.map(:incremental_dir,
        Checks::Backup::IncrementalParentType => :incremental_dir,
        Procedures::Backup::PrepareDirectory => :incremental_dir,
        Procedures::Backup::Metadata => :incremental_dir)
      context.map(:proxy_features,
        Procedures::Backup::ConfigFiles => :proxy_features)
      context.map(:skip_pulp_content,
        Procedures::Backup::Pulp => :skip)
      context.map(:tar_volume_size,
        Procedures::Backup::Pulp => :tar_volume_size)
    end
    # rubocop:enable  Metrics/MethodLength

    private

    def check_valid_strategy
      unless [:online, :offline].include? strategy
        raise ArgumentError, "Unsupported strategy '#{strategy}'"
      end
    end

    def add_offline_backup_steps
      add_step_with_context(Procedures::ForemanProxy::Features, :load_only => true)
      add_steps_with_context(
        Procedures::Service::Stop,
        Procedures::Backup::ConfigFiles,
        Procedures::Backup::Pulp
      )

      if feature(:instance).postgresql_local?
        add_step(Procedures::Service::Start.new(:only => ['postgresql']))
      end

      add_database_backup_steps

      add_steps_with_context(Procedures::Service::Start)
    end

    def add_online_backup_steps
      add_step(Procedures::Service::Stop.new(:only => online_workers)) unless online_workers.empty?

      add_step_with_context(Procedures::Backup::ConfigFiles, :ignore_changed_files => true,
        :online_backup => true)
      add_step_with_context(Procedures::Backup::Pulp, :ensure_unchanged => true)
      add_database_backup_steps
    end

    def add_database_backup_steps
      add_steps_with_context(
        Procedures::Backup::Online::CandlepinDB,
        Procedures::Backup::Online::ForemanDB,
        Procedures::Backup::Online::PulpcoreDB
      )

      add_step(Procedures::Service::Start.new(:only => online_workers)) unless online_workers.empty?
    end

    def strategy
      context.get(:strategy)
    end

    def wait_for_tasks?
      !!context.get(:wait_for_tasks)
    end

    def online_workers
      services = []
      services += feature(:dynflow_sidekiq).workers if feature(:dynflow_sidekiq)
      services += feature(:pulpcore).configured_workers if feature(:pulpcore)
      services
    end
  end

  class BackupRescueCleanup < ForemanMaintain::Scenario
    metadata do
      description 'Failed backup cleanup'
      manual_detection
      run_strategy :fail_slow
      tags :backup
      param :backup_dir, 'Directory where to backup to', :required => true
      param :preserve_dir, 'Directory where to backup to'
    end

    def compose
      add_step_with_context(Procedures::Service::Start)
      add_step_with_context(Procedures::Backup::Clean)
    end

    def set_context_mapping
      context.map(:backup_dir,
        Procedures::Backup::Clean => :backup_dir)
      context.map(:preserve_dir,
        Procedures::Backup::Clean => :preserve_dir)
    end
  end
end