Class: HamburgerStore

Inherits:
Object
  • Object
show all
Defined in:
lib/hamburgerstore.rb

Overview

Data store for pipeline instance metadata. Nothing to do with hamburgers. Sorry.

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ HamburgerStore

Returns a new instance of HamburgerStore.



38
39
40
41
42
43
44
# File 'lib/hamburgerstore.rb', line 38

def initialize(options = {})
  check_kms(options)
  check_dynamo(options)

  fail 'need to specify table_name parameter' if options[:table_name].nil?
  @table = @ddb.table(options[:table_name])
end

Instance Method Details

#check_dynamo(options) ⇒ Object



29
30
31
32
33
34
35
36
# File 'lib/hamburgerstore.rb', line 29

def check_dynamo(options)
  if options[:dynamo].nil?
    fail 'need to specify region' if options[:region].nil?
    @ddb = Aws::DynamoDB::Resource.new region: options[:region]
  else
    @ddb = options[:dynamo]
  end
end

#check_kms(options) ⇒ Object



18
19
20
21
22
23
24
25
26
27
# File 'lib/hamburgerstore.rb', line 18

def check_kms(options)
  # fail 'need to specify kms key_id parameter' if options[:key_id].nil?
  @key_id = options[:key_id]
  if options[:kms].nil?
    fail 'need to specify region' if options[:region].nil?
    @kms = Aws::KMS::Client.new region: options[:region]
  else
    @kms = options[:kms]
  end
end

#ddb_get_item(identifier) ⇒ Object



54
55
56
57
58
59
60
# File 'lib/hamburgerstore.rb', line 54

def ddb_get_item(identifier)
  item = @table.get_item(key: { 'hamburger' => identifier }).item
  if item.nil?
    fail HamburgerNoItemInTableError, "No values for '#{identifier}' found in table."
  end
  item
end

#decrypt(value) ⇒ Object



12
13
14
15
16
# File 'lib/hamburgerstore.rb', line 12

def decrypt(value)
  fail HamburgerKeyNotFoundInItemError, 'The key' if value.nil?
  encrypted_value = Base64.decode64(value)
  @kms.decrypt(ciphertext_blob: encrypted_value).plaintext.strip
end

#encrypt(value) ⇒ Object



6
7
8
9
10
# File 'lib/hamburgerstore.rb', line 6

def encrypt(value)
  value = ' ' if value.length < 1
  encrypted_value = @kms.encrypt(key_id: @key_id, plaintext: value).ciphertext_blob
  Base64.encode64(encrypted_value)
end

#retrieve(identifier, key) ⇒ Object



62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/hamburgerstore.rb', line 62

def retrieve(identifier, key)
  error = nil
  begin
    item = ddb_get_item(identifier)
  rescue StandardError => e
    error = e
  end
  if !error.nil? || item.nil? || item[key].nil?
    fail HamburgerKeyNotFoundInItemError, "The key '#{key}' was not found in '#{identifier}' hamburger store."
  end
  decrypt(item[key])
end

#retrieve_all(identifier) ⇒ Object



75
76
77
78
79
80
81
82
83
# File 'lib/hamburgerstore.rb', line 75

def retrieve_all(identifier)
  encrypted_items = ddb_get_item(identifier)
  hamburger = encrypted_items.delete('hamburger')
  result = { 'hamburger' => hamburger }
  encrypted_items.each_pair do |key, value|
    result[key] = decrypt(value)
  end
  result
end

#store(identifer, key, value) ⇒ Object



46
47
48
49
50
51
52
# File 'lib/hamburgerstore.rb', line 46

def store(identifer, key, value)
  fail 'need to specify kms key_id parameter' if @key_id.nil?
  item = @table.get_item(key: { 'hamburger' => identifer }).item
  item = { 'hamburger' => identifer } if item.nil?
  item[key] = encrypt(value)
  @table.put_item(item: item, return_values: :ALL_OLD)
end