class DatadogBackup::Core

Public Class Methods

new(options) click to toggle source
# File lib/datadog_backup/core.rb, line 70
def initialize(options)
  @options = options
  @banlist = []
  ::FileUtils.mkdir_p(mydir)
end

Public Instance Methods

api_resource_name() click to toggle source
# File lib/datadog_backup/core.rb, line 19
def api_resource_name
  raise 'subclass is expected to implement #api_resource_name'
end
api_service() click to toggle source
# File lib/datadog_backup/core.rb, line 11
def api_service
  raise 'subclass is expected to implement #api_service'
end
api_version() click to toggle source
# File lib/datadog_backup/core.rb, line 15
def api_version
  raise 'subclass is expected to implement #api_version'
end
backup() click to toggle source
# File lib/datadog_backup/core.rb, line 23
def backup
  raise 'subclass is expected to implement #backup'
end
create(body) click to toggle source

Calls out to Datadog and checks for a '200' response

# File lib/datadog_backup/core.rb, line 81
def create(body)
  result = with_200 do
    api_service.request(Net::HTTP::Post, "/api/#{api_version}/#{api_resource_name}", nil, body, true)
  end
  logger.warn 'Successfully created in datadog.'
  result
end
diff(id) click to toggle source

Returns the diffy diff. Optionally, supply an array of keys to remove from comparison

# File lib/datadog_backup/core.rb, line 29
def diff(id)
  current = except(get_by_id(id)).deep_sort.to_yaml
  filesystem = except(load_from_file_by_id(id)).deep_sort.to_yaml
  result = ::Diffy::Diff.new(current, filesystem, include_plus_and_minus_in_html: true).to_s(diff_format)
  logger.debug("Compared ID #{id} and found #{result}")
  result
end
except(hash) click to toggle source

Returns a hash with banlist elements removed

# File lib/datadog_backup/core.rb, line 38
def except(hash)
  hash.tap do # tap returns self
    @banlist.each do |key|
      hash.delete(key) # delete returns the value at the deleted key, hence the tap wrapper
    end
  end
end
get(id) click to toggle source
# File lib/datadog_backup/core.rb, line 46
def get(id)
  with_200 do
    api_service.request(Net::HTTP::Get, "/api/#{api_version}/#{api_resource_name}/#{id}", nil, nil, false)
  end
rescue RuntimeError => e
  return {} if e.message.include?('Request failed with error ["404"')

  raise e.message
end
get_all() click to toggle source
# File lib/datadog_backup/core.rb, line 56
def get_all
  with_200 do
    api_service.request(Net::HTTP::Get, "/api/#{api_version}/#{api_resource_name}", nil, nil, false)
  end
end
get_and_write_file(id) click to toggle source
# File lib/datadog_backup/core.rb, line 62
def get_and_write_file(id)
  write_file(dump(get_by_id(id)), filename(id))
end
get_by_id(id) click to toggle source
# File lib/datadog_backup/core.rb, line 66
def get_by_id(id)
  except(get(id))
end
myclass() click to toggle source
# File lib/datadog_backup/core.rb, line 76
def myclass
  self.class.to_s.split(':').last.downcase
end
restore(id) click to toggle source
# File lib/datadog_backup/core.rb, line 98
def restore(id)
  body = load_from_file_by_id(id)
  begin
    update(id, body)
  rescue RuntimeError => e
    if e.message.include?('Request failed with error ["404"')
      new_id = create(body).fetch('id')

      FileUtils.rm(find_file_by_id(id))
      get_and_write_file(new_id)
    else
      raise e.message
    end
  end
end
update(id, body) click to toggle source

Calls out to Datadog and checks for a '200' response

# File lib/datadog_backup/core.rb, line 90
def update(id, body)
  result = with_200 do
    api_service.request(Net::HTTP::Put, "/api/#{api_version}/#{api_resource_name}/#{id}", nil, body, true)
  end
  logger.warn 'Successfully restored to datadog.'
  result
end
with_200() { || ... } click to toggle source
# File lib/datadog_backup/core.rb, line 114
def with_200
  max_retries = 6
  retries ||= 0

  response = yield
  raise "Request failed with error #{response}" unless response[0] == '200'

  response[1]
rescue ::Net::OpenTimeout => e
  if (retries += 1) <= max_retries
    sleep(0.1 * retries**5) # 0.1, 3.2, 24.3, 102.4 seconds per retry
    retry
  else
    raise "Net::OpenTimeout: #{e.message}"
  end
end