Class: DatadogBackup::Cli

Inherits:
Object
  • Object
show all
Includes:
Options
Defined in:
lib/datadog_backup/cli.rb

Overview

CLI is the command line interface for the datadog_backup gem.

Instance Method Summary collapse

Methods included from Options

#action, #backup_dir, #concurrency_limit, #diff_format, #disable_array_sort, #force_restore, #output_format, #resources

Constructor Details

#initialize(options) ⇒ Cli

rubocop:enable Style/StringConcatenation



67
68
69
# File 'lib/datadog_backup/cli.rb', line 67

def initialize(options)
  @options = options
end

Instance Method Details

#all_diff_futuresObject



11
12
13
14
15
16
17
18
19
20
# File 'lib/datadog_backup/cli.rb', line 11

def all_diff_futures
  LOGGER.info("Starting diffs on #{::DatadogBackup::ThreadPool::TPOOL.max_length} threads")
  any_resource_instance
    .all_file_ids_for_selected_resources
    .map do |file_id|
    Concurrent::Promises.future_on(::DatadogBackup::ThreadPool::TPOOL, file_id) do |fid|
      [fid, getdiff(fid)]
    end
  end
end

#any_resource_instanceObject



22
23
24
# File 'lib/datadog_backup/cli.rb', line 22

def any_resource_instance
  resource_instances.first
end

#backupObject



26
27
28
29
30
# File 'lib/datadog_backup/cli.rb', line 26

def backup
  resource_instances.each(&:purge)
  resource_instances.each(&:backup)
  any_resource_instance.all_files
end

#definitive_resource_instance(id) ⇒ Object



32
33
34
# File 'lib/datadog_backup/cli.rb', line 32

def definitive_resource_instance(id)
  matching_resource_instance(any_resource_instance.class_from_id(id))
end

#format_diff_output(diff_output) ⇒ Object

rubocop:disable Style/StringConcatenation



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/datadog_backup/cli.rb', line 47

def format_diff_output(diff_output)
  case diff_format
  when nil, :color
    diff_output.map do |id, diff|
      " ---\n id: #{id}\n#{diff}"
    end.join("\n")
  when :html
    '<html><head><style>' +
      Diffy::CSS +
      '</style></head><body>' +
      diff_output.map do |id, diff|
        "<br><br> ---<br><strong> id: #{id}</strong><br>#{diff}"
      end.join('<br>') +
      '</body></html>'
  else
    raise 'Unexpected diff_format.'
  end
end

#getdiff(id) ⇒ Object



36
37
38
39
40
41
42
43
44
# File 'lib/datadog_backup/cli.rb', line 36

def getdiff(id)
  result = definitive_resource_instance(id).diff(id)
  case result
  when '---' || '' || "\n" || '<div class="diff"></div>'
    nil
  else
    result
  end
end

#restoreObject



71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/datadog_backup/cli.rb', line 71

def restore
  futures = all_diff_futures
  watcher = ::DatadogBackup::ThreadPool.watcher

  futures.each do |future|
    id, diff = *future.value!
    next if diff.nil? || diff.empty?

    if @options[:force_restore]
      definitive_resource_instance(id).restore(id)
    else
      ask_to_restore(id, diff)
    end
  end
  watcher.join if watcher.status
end

#run!Object



88
89
90
91
92
# File 'lib/datadog_backup/cli.rb', line 88

def run!
  puts(send(action.to_sym))
rescue SystemExit, Interrupt
  ::DatadogBackup::ThreadPool.shutdown
end