jackal-cfn 0.2.14 → 0.2.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d1ead03a002146de19a393af5ee2841b7db8bcb7
4
- data.tar.gz: 6731c62c19638361c3fc25ebdf01a355a47fbe53
3
+ metadata.gz: c074ac269a3949f7b1e9554a1d3d301d7656195a
4
+ data.tar.gz: 75fd37b327ca6ee8c562ed0f2bfc4be4fb1e97a6
5
5
  SHA512:
6
- metadata.gz: 9d733f6e773a969bf2c24303c5a496e113a557d7fc335838d8e5f5fac4410f0305cd5a5c21966892c3397681650c42fc216bca23d603defa9ae1c8bc875d8bb8
7
- data.tar.gz: badd616f99027ca1d8ed975fbcf491fb42f7b536b3dfb36a5755c5d1f3ee8123a7c71f6dc4677d47bbad1bcbd9545d4d3e40023d0d73f173bbf0b46a189575d6
6
+ metadata.gz: 4f8d1552c3b1fc950357808137c461f0f21b06db494a9660d9cd9fbc67e69820dc503b8491e9a6d6b6ce3812d6a0274c88453ded523680672a282146764119b2
7
+ data.tar.gz: e6441d30aaaaa8fba8f69b40c157e38499d5c3530ac5f730d2f932d15784c9e33fee47b08534f79f61851d087785987f10f3555ea431fcda332313b6d5f3a950
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ # v0.2.16
2
+ * [feature] Allow image re-registration when options provided
3
+ * [enhancement] Add resource scrubber helper
4
+
1
5
  # v0.2.14
2
6
  * [fix] Update variable name used in stack resource name construction
3
7
 
@@ -15,7 +15,10 @@ module Jackal
15
15
  # "NoReboot": Boolean,
16
16
  # "BlockDeviceMappings": Array,
17
17
  # "HaltInstance": Boolean,
18
- # "Region": String
18
+ # "Region": String,
19
+ # "Register" : {
20
+ # REGISTER_OPTIONS
21
+ # }
19
22
  # }
20
23
  # }
21
24
  # }
@@ -58,12 +61,12 @@ module Jackal
58
61
  poll_for_available = false
59
62
  case cfn_resource[:request_type].to_sym
60
63
  when :create
61
- generate_ami(cfn_response, parameters)
64
+ generate_ami(message, cfn_response, parameters)
62
65
  poll_for_available = true
63
66
  when :update
64
67
  destroy_ami(cfn_response, cfn_resource, parameters)
65
68
  unless(cfn_response['Status'] == 'FAILED')
66
- generate_ami(cfn_response, parameters)
69
+ generate_ami(message, cfn_response, parameters)
67
70
  poll_for_available = true
68
71
  end
69
72
  when :delete
@@ -99,6 +102,7 @@ module Jackal
99
102
  def poll_ami_available(message, region, ami_id)
100
103
  available = false
101
104
  pause_interval = config.fetch(:ami_register_interval, 5).to_i
105
+
102
106
  if(ami_id)
103
107
  until(available)
104
108
  debug "Pausing for AMI to become available: #{ami_id} (wait time: #{pause_interval})"
@@ -137,10 +141,11 @@ module Jackal
137
141
 
138
142
  # Create new AMI using provided EC2 instance
139
143
  #
144
+ # @param message [Carnivore::Message]
140
145
  # @param response [Hash] cfn response
141
146
  # @param parameters [Hash] resource parameters
142
147
  # @return [Hash] updated response hash
143
- def generate_ami(response, parameters)
148
+ def generate_ami(message, response, parameters)
144
149
  begin
145
150
  result = compute_api(parameters[:region]).create_image(
146
151
  parameters[:instance_id],
@@ -149,7 +154,33 @@ module Jackal
149
154
  parameters[:no_reboot],
150
155
  :block_device_mappings => parameters.fetch(:block_device_mappings, [])
151
156
  )
152
- info "New AMI registered: #{result.body['imageId']}"
157
+ info "New AMI created: #{result.body['imageId']}"
158
+ if(parameters[:register])
159
+ poll_ami_available(message, parameters[:region], result.body['imageId'])
160
+ register_parameters = Hash[
161
+ parameters[:register].map do |k,v|
162
+ [Bogo::Utility.camel(k), v]
163
+ end
164
+ ]
165
+ image_info = compute_api(parameters[:region]).describe_images('ImageId' => result.body['imageId']).body['imagesSet'].first
166
+ register_result = compute_api(parameters[:region]).register_image(
167
+ "#{image_info['name']}-reregister",
168
+ "Re-register of AMI #{result.body['imageId']} for #{image_info['name']}",
169
+ image_info['rootDeviceName'],
170
+ image_info['blockDeviceMapping'].map{|i|
171
+ Hash[i.map{|k,v|[Bogo::Utility.camel(k), v]}]
172
+ },
173
+ {
174
+ 'Architecture' => image_info['architecture'],
175
+ 'VirtualizationType' => image_info['virtualizationType'],
176
+ }.merge(register_parameters)
177
+ )
178
+ unless(result.body['imageId'] == register_result.body['imageId'])
179
+ info "New AMI registered: #{register_result.body['imageId']} - Destroying created image: #{result.body['imageId']}"
180
+ compute_api(parameters[:region]).deregister_image(result.body['imageId'])
181
+ end
182
+ result = register_result
183
+ end
153
184
  response['Data']['AmiId'] = result.body['imageId']
154
185
  response['PhysicalResourceId'] = [
155
186
  physical_resource_id,
@@ -28,12 +28,16 @@ module Jackal
28
28
  key = parameters[:key].split('.')
29
29
  value = parameters[:value]
30
30
  unless(value.is_a?(String))
31
- raise TypeError.new("Expecting `String` value but received `#{value.class}`")
32
- end
33
- value = MultiJson.load(value).to_smash
34
- return_value = value.get(*key)
35
- if(return_value.is_a?(Enumerable))
36
- return_value = MultiJson.dump(return_value)
31
+ unless(cfn_resource[:request_type].to_sym == :delete)
32
+ raise TypeError.new("Expecting `String` value but received `#{value.class}`")
33
+ end
34
+ return_value = nil
35
+ else
36
+ value = MultiJson.load(value).to_smash
37
+ return_value = value.get(*key)
38
+ if(return_value.is_a?(Enumerable))
39
+ return_value = MultiJson.dump(return_value)
40
+ end
37
41
  end
38
42
  cfn_response['Data']['Payload'] = return_value
39
43
  respond_to_stack(cfn_response, cfn_resource[:response_url])
@@ -0,0 +1,28 @@
1
+ require 'jackal-cfn'
2
+
3
+ module Jackal
4
+ module Cfn
5
+ class Scrubber < Jackal::Cfn::Resource
6
+
7
+ def valid?(message)
8
+ payload = unpack(message)
9
+ payload.get(:data, :cfn_resource)
10
+ end
11
+
12
+ # Scrub resource
13
+ #
14
+ # @param message [Carnivore::Message]
15
+ def execute(message)
16
+ failure_wrap(message) do |payload|
17
+ cfn_resource = rekey_hash(payload.get(:data, :cfn_resource))
18
+ properties = rekey_hash(cfn_resource[:resource_properties])
19
+ parameters = rekey_hash(properties[:parameters])
20
+ cfn_response = build_response(cfn_resource)
21
+ respond_to_stack(cfn_response, cfn_resource[:response_url])
22
+ job_completed(:jackal_cfn, payload, message)
23
+ end
24
+ end
25
+
26
+ end
27
+ end
28
+ end
@@ -160,6 +160,7 @@ module Jackal
160
160
  :cfn_resource => data_payload
161
161
  )
162
162
  if(config[:reprocess])
163
+ debug "Reprocessing received message! #{payload}"
163
164
  Carnivore::Supervisor.supervisor[destination(:input, payload)].transmit(payload)
164
165
  message.confirm!
165
166
  else
@@ -1,6 +1,6 @@
1
1
  module Jackal
2
2
  module Cfn
3
3
  # Current version
4
- VERSION = Gem::Version.new('0.2.14')
4
+ VERSION = Gem::Version.new('0.2.16')
5
5
  end
6
6
  end
data/lib/jackal-cfn.rb CHANGED
@@ -13,5 +13,6 @@ module Jackal
13
13
  autoload :AmiManager, 'jackal-cfn/resource/ami_manager'
14
14
  autoload :AmiRegister, 'jackal-cfn/resource/ami_register'
15
15
  autoload :JackalStack, 'jackal-cfn/resource/jackal_stack'
16
+ autoload :Scrubber, 'jackal-cfn/resource/scrubber'
16
17
  end
17
18
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jackal-cfn
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.14
4
+ version: 0.2.16
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Roberts
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-09-23 00:00:00.000000000 Z
11
+ date: 2015-11-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jackal
@@ -71,6 +71,7 @@ files:
71
71
  - lib/jackal-cfn/resource/ami_register.rb
72
72
  - lib/jackal-cfn/resource/hash_extractor.rb
73
73
  - lib/jackal-cfn/resource/jackal_stack.rb
74
+ - lib/jackal-cfn/resource/scrubber.rb
74
75
  - lib/jackal-cfn/utils.rb
75
76
  - lib/jackal-cfn/utils/fog.rb
76
77
  - lib/jackal-cfn/utils/http.rb
@@ -95,7 +96,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
95
96
  version: '0'
96
97
  requirements: []
97
98
  rubyforge_project:
98
- rubygems_version: 2.2.2
99
+ rubygems_version: 2.4.8
99
100
  signing_key:
100
101
  specification_version: 4
101
102
  summary: Message processing helper