humidifier 2.15.0 → 3.0.0
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 +4 -4
- data/CloudFormationResourceSpecification.json +24305 -18109
- data/LICENSE +1 -1
- data/README.md +55 -33
- data/lib/humidifier/condition.rb +0 -2
- data/lib/humidifier/config.rb +46 -0
- data/lib/humidifier/fn.rb +7 -8
- data/lib/humidifier/loader.rb +37 -45
- data/lib/humidifier/mapping.rb +0 -2
- data/lib/humidifier/output.rb +4 -6
- data/lib/humidifier/parameter.rb +9 -10
- data/lib/humidifier/props.rb +177 -2
- data/lib/humidifier/resource.rb +13 -14
- data/lib/humidifier/stack.rb +166 -21
- data/lib/humidifier/version.rb +1 -1
- data/lib/humidifier.rb +31 -24
- metadata +67 -31
- data/lib/humidifier/aws_adapters/base.rb +0 -67
- data/lib/humidifier/aws_adapters/noop.rb +0 -25
- data/lib/humidifier/aws_adapters/sdkv1.rb +0 -75
- data/lib/humidifier/aws_adapters/sdkv2.rb +0 -61
- data/lib/humidifier/aws_adapters/sdkv3.rb +0 -31
- data/lib/humidifier/aws_shim.rb +0 -83
- data/lib/humidifier/configuration.rb +0 -69
- data/lib/humidifier/props/base.rb +0 -47
- data/lib/humidifier/props/boolean_prop.rb +0 -25
- data/lib/humidifier/props/double_prop.rb +0 -23
- data/lib/humidifier/props/integer_prop.rb +0 -23
- data/lib/humidifier/props/json_prop.rb +0 -31
- data/lib/humidifier/props/list_prop.rb +0 -42
- data/lib/humidifier/props/map_prop.rb +0 -46
- data/lib/humidifier/props/string_prop.rb +0 -23
- data/lib/humidifier/props/structure_prop.rb +0 -71
- data/lib/humidifier/props/timestamp_prop.rb +0 -23
- data/lib/humidifier/sdk_payload.rb +0 -122
- data/lib/humidifier/sleeper.rb +0 -25
- data/lib/humidifier/utils.rb +0 -19
data/lib/humidifier/resource.rb
CHANGED
@@ -5,14 +5,16 @@ module Humidifier
|
|
5
5
|
class Resource
|
6
6
|
# Attributes that are available to every stack
|
7
7
|
COMMON_ATTRIBUTES =
|
8
|
-
|
9
|
-
|
8
|
+
Humidifier.underscore(
|
9
|
+
%w[Condition CreationPolicy DeletionPolicy DependsOn Metadata
|
10
|
+
UpdatePolicy]
|
11
|
+
)
|
10
12
|
|
11
13
|
attr_accessor :properties, *COMMON_ATTRIBUTES.values
|
12
14
|
|
13
|
-
def initialize(properties = {}
|
15
|
+
def initialize(properties = {})
|
14
16
|
self.properties = {}
|
15
|
-
update(properties
|
17
|
+
update(properties)
|
16
18
|
end
|
17
19
|
|
18
20
|
# Patches method_missing to include property accessors
|
@@ -49,9 +51,9 @@ module Humidifier
|
|
49
51
|
end
|
50
52
|
|
51
53
|
# Update a set of properties defined by the given properties hash
|
52
|
-
def update(properties
|
54
|
+
def update(properties)
|
53
55
|
properties.each do |property, value|
|
54
|
-
update_property(property, value
|
56
|
+
update_property(property, value)
|
55
57
|
end
|
56
58
|
end
|
57
59
|
|
@@ -67,10 +69,10 @@ module Humidifier
|
|
67
69
|
end
|
68
70
|
|
69
71
|
# Update an individual property on this resource
|
70
|
-
def update_property(property, value
|
72
|
+
def update_property(property, value)
|
71
73
|
property = property.to_s
|
72
|
-
property = validate_property(property
|
73
|
-
value = validate_value(property, value
|
74
|
+
property = validate_property(property)
|
75
|
+
value = validate_value(property, value)
|
74
76
|
properties[property] = value
|
75
77
|
end
|
76
78
|
|
@@ -110,9 +112,7 @@ module Humidifier
|
|
110
112
|
(self.class.props.keys & [method.to_s, method.to_s[0..-2]]).any?
|
111
113
|
end
|
112
114
|
|
113
|
-
def validate_property(property
|
114
|
-
property = Utils.underscore(property) if raw
|
115
|
-
|
115
|
+
def validate_property(property)
|
116
116
|
unless self.class.prop?(property)
|
117
117
|
raise ArgumentError, 'Attempting to set invalid property for ' \
|
118
118
|
"#{self.class.name}: #{property}"
|
@@ -121,9 +121,8 @@ module Humidifier
|
|
121
121
|
property
|
122
122
|
end
|
123
123
|
|
124
|
-
def validate_value(property, value
|
124
|
+
def validate_value(property, value)
|
125
125
|
prop = self.class.props[property]
|
126
|
-
value = prop.convert(value) if raw
|
127
126
|
|
128
127
|
unless prop.valid?(value)
|
129
128
|
raise ArgumentError, "Invalid value for #{property}: #{value.inspect}"
|
data/lib/humidifier/stack.rb
CHANGED
@@ -3,16 +3,45 @@
|
|
3
3
|
module Humidifier
|
4
4
|
# Represents a CFN stack
|
5
5
|
class Stack
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
class TemplateTooLargeError < StandardError
|
7
|
+
def initialize(bytesize)
|
8
|
+
super(
|
9
|
+
"Cannot use a template > #{MAX_TEMPLATE_URL_SIZE} bytes " \
|
10
|
+
"(currently #{bytesize} bytes), consider using nested stacks " \
|
11
|
+
'(http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide' \
|
12
|
+
'/aws-properties-stack.html)'
|
13
|
+
)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
# The AWS region, can be set through the environment, defaults to us-east-1
|
18
|
+
AWS_REGION = ENV['AWS_REGION'] || 'us-east-1'
|
9
19
|
|
10
20
|
# Lists of objects linked to the stack
|
11
21
|
ENUMERABLE_RESOURCES =
|
12
|
-
|
22
|
+
Humidifier.underscore(
|
23
|
+
%w[Conditions Mappings Outputs Parameters Resources]
|
24
|
+
)
|
25
|
+
|
26
|
+
# The maximum size a template body can be before it has to be put somewhere
|
27
|
+
# and referenced through a URL
|
28
|
+
MAX_TEMPLATE_BODY_SIZE = 51_200
|
29
|
+
|
30
|
+
# The maximum size a template body can be inside of an S3 bucket
|
31
|
+
MAX_TEMPLATE_URL_SIZE = 460_800
|
32
|
+
|
33
|
+
# The maximum amount of time that Humidifier should wait for a stack to
|
34
|
+
# complete a CRUD operation
|
35
|
+
MAX_WAIT = 600
|
36
|
+
|
37
|
+
# Single settings on the stack
|
38
|
+
STATIC_RESOURCES =
|
39
|
+
Humidifier.underscore(%w[AWSTemplateFormatVersion Description Metadata])
|
13
40
|
|
14
41
|
attr_accessor :id
|
15
|
-
|
42
|
+
attr_writer :client
|
43
|
+
|
44
|
+
attr_reader :name, *ENUMERABLE_RESOURCES.values, *STATIC_RESOURCES.values
|
16
45
|
|
17
46
|
def initialize(opts = {})
|
18
47
|
@name = opts[:name]
|
@@ -28,22 +57,38 @@ module Humidifier
|
|
28
57
|
end
|
29
58
|
end
|
30
59
|
|
31
|
-
# Add a resource to the stack and optionally set its attributes
|
32
60
|
def add(name, resource, attributes = {})
|
33
61
|
resources[name] = resource
|
34
62
|
resource.update_attributes(attributes) if attributes.any?
|
35
63
|
resource
|
36
64
|
end
|
37
65
|
|
38
|
-
|
39
|
-
|
66
|
+
def add_condition(name, opts = {})
|
67
|
+
conditions[name] = Condition.new(opts)
|
68
|
+
end
|
69
|
+
|
70
|
+
def add_mapping(name, opts = {})
|
71
|
+
mappings[name] = Mapping.new(opts)
|
72
|
+
end
|
73
|
+
|
74
|
+
def add_output(name, opts = {})
|
75
|
+
outputs[name] = Output.new(opts)
|
76
|
+
end
|
77
|
+
|
78
|
+
def add_parameter(name, opts = {})
|
79
|
+
parameters[name] = Parameter.new(opts)
|
80
|
+
end
|
81
|
+
|
82
|
+
def client
|
83
|
+
@client ||= Aws::CloudFormation::Client.new(region: AWS_REGION)
|
84
|
+
end
|
85
|
+
|
40
86
|
def identifier
|
41
87
|
id || name || default_identifier
|
42
88
|
end
|
43
89
|
|
44
|
-
# A string representation of the stack that's valid for CFN
|
45
90
|
def to_cf(serializer = :json)
|
46
|
-
resources = static_resources.merge(enumerable_resources)
|
91
|
+
resources = static_resources.merge!(enumerable_resources)
|
47
92
|
|
48
93
|
case serializer
|
49
94
|
when :json then JSON.pretty_generate(resources)
|
@@ -51,20 +96,75 @@ module Humidifier
|
|
51
96
|
end
|
52
97
|
end
|
53
98
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
99
|
+
def create(opts = {})
|
100
|
+
params = { stack_name: name }.merge!(template_for(opts)).merge!(opts)
|
101
|
+
|
102
|
+
try_valid do
|
103
|
+
client.create_stack(params).tap { |response| @id = response.stack_id }
|
58
104
|
end
|
59
105
|
end
|
60
106
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
107
|
+
def create_and_wait(opts = {})
|
108
|
+
perform_and_wait(:create, opts)
|
109
|
+
end
|
110
|
+
|
111
|
+
def create_change_set(opts = {})
|
112
|
+
params = {
|
113
|
+
stack_name: identifier,
|
114
|
+
change_set_name: "changeset-#{Time.now.strftime('%Y-%m-%d-%H-%M-%S')}"
|
115
|
+
}
|
116
|
+
params.merge!(template_for(opts)).merge!(opts)
|
117
|
+
|
118
|
+
try_valid { client.create_change_set(params) }
|
119
|
+
end
|
120
|
+
|
121
|
+
def delete(opts = {})
|
122
|
+
client.delete_stack({ stack_name: identifier }.merge!(opts))
|
123
|
+
true
|
124
|
+
end
|
125
|
+
|
126
|
+
def delete_and_wait(opts = {})
|
127
|
+
perform_and_wait(:delete, opts)
|
128
|
+
end
|
129
|
+
|
130
|
+
def deploy(opts = {})
|
131
|
+
exists? ? update(opts) : create(opts)
|
132
|
+
end
|
133
|
+
|
134
|
+
def deploy_and_wait(opts = {})
|
135
|
+
perform_and_wait(exists? ? :update : :create, opts)
|
136
|
+
end
|
137
|
+
|
138
|
+
def deploy_change_set(opts = {})
|
139
|
+
exists? ? create_change_set(opts) : create(opts)
|
140
|
+
end
|
141
|
+
|
142
|
+
def exists?
|
143
|
+
Aws::CloudFormation::Stack.new(name: identifier).exists?
|
144
|
+
end
|
145
|
+
|
146
|
+
def update(opts = {})
|
147
|
+
params =
|
148
|
+
{ stack_name: identifier }.merge!(template_for(opts)).merge!(opts)
|
149
|
+
|
150
|
+
try_valid { client.update_stack(params) }
|
151
|
+
end
|
152
|
+
|
153
|
+
def update_and_wait(opts = {})
|
154
|
+
perform_and_wait(:update, opts)
|
155
|
+
end
|
156
|
+
|
157
|
+
def upload
|
158
|
+
Humidifier.config.ensure_upload_configured!(identifier)
|
159
|
+
upload_object("#{Humidifier.config.s3_prefix}#{identifier}.json")
|
160
|
+
end
|
161
|
+
|
162
|
+
def valid?(opts = {})
|
163
|
+
params = template_for(opts).merge!(opts)
|
164
|
+
|
165
|
+
try_valid { client.validate_template(params) }
|
65
166
|
end
|
66
167
|
|
67
|
-
# Increment the default identifier
|
68
168
|
def self.next_default_identifier
|
69
169
|
@count ||= 0
|
70
170
|
@count += 1
|
@@ -75,9 +175,36 @@ module Humidifier
|
|
75
175
|
|
76
176
|
attr_reader :default_identifier
|
77
177
|
|
178
|
+
def perform_and_wait(method, opts)
|
179
|
+
public_send(method, opts).tap do
|
180
|
+
signal = :"stack_#{method}_complete"
|
181
|
+
|
182
|
+
client.wait_until(signal, stack_name: identifier) do |waiter|
|
183
|
+
waiter.max_attempts = (opts.delete(:max_wait) || MAX_WAIT) / 5
|
184
|
+
waiter.delay = 5
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
def try_valid
|
190
|
+
yield || true
|
191
|
+
rescue Aws::CloudFormation::Errors::ValidationError => error
|
192
|
+
warn(error.message)
|
193
|
+
warn(error.backtrace)
|
194
|
+
false
|
195
|
+
end
|
196
|
+
|
197
|
+
def upload_object(key)
|
198
|
+
Aws.config.update(region: AWS_REGION)
|
199
|
+
bucket = Humidifier.config.s3_bucket
|
200
|
+
|
201
|
+
Aws::S3::Client.new.put_object(body: to_cf, bucket: bucket, key: key)
|
202
|
+
Aws::S3::Object.new(bucket, key).presigned_url(:get)
|
203
|
+
end
|
204
|
+
|
78
205
|
def enumerable_resources
|
79
206
|
ENUMERABLE_RESOURCES.each_with_object({}) do |(name, prop), list|
|
80
|
-
resources =
|
207
|
+
resources = public_send(prop)
|
81
208
|
next if resources.empty?
|
82
209
|
|
83
210
|
list[name] =
|
@@ -89,9 +216,27 @@ module Humidifier
|
|
89
216
|
|
90
217
|
def static_resources
|
91
218
|
STATIC_RESOURCES.each_with_object({}) do |(name, prop), list|
|
92
|
-
resource =
|
219
|
+
resource = public_send(prop)
|
93
220
|
list[name] = resource if resource
|
94
221
|
end
|
95
222
|
end
|
223
|
+
|
224
|
+
def bytesize
|
225
|
+
to_cf.bytesize.tap do |size|
|
226
|
+
raise TemplateTooLargeError, size if size > MAX_TEMPLATE_URL_SIZE
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
230
|
+
def template_for(opts)
|
231
|
+
@template ||=
|
232
|
+
if opts.delete(:force_upload) ||
|
233
|
+
Humidifier.config.force_upload ||
|
234
|
+
bytesize > MAX_TEMPLATE_BODY_SIZE
|
235
|
+
|
236
|
+
{ template_url: upload }
|
237
|
+
else
|
238
|
+
{ template_body: to_cf }
|
239
|
+
end
|
240
|
+
end
|
96
241
|
end
|
97
242
|
end
|
data/lib/humidifier/version.rb
CHANGED
data/lib/humidifier.rb
CHANGED
@@ -1,41 +1,29 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'date'
|
4
|
-
require 'forwardable'
|
5
4
|
require 'json'
|
6
5
|
require 'pathname'
|
7
6
|
require 'yaml'
|
8
7
|
|
9
|
-
require '
|
10
|
-
require '
|
11
|
-
require '
|
12
|
-
require 'humidifier/props'
|
13
|
-
|
14
|
-
require 'humidifier/props/base'
|
8
|
+
require 'aws-sdk-cloudformation'
|
9
|
+
require 'aws-sdk-s3'
|
10
|
+
require 'fast_underscore'
|
15
11
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
require 'humidifier/output'
|
25
|
-
require 'humidifier/parameter'
|
26
|
-
require 'humidifier/resource'
|
27
|
-
require 'humidifier/sdk_payload'
|
28
|
-
require 'humidifier/serializer'
|
29
|
-
require 'humidifier/sleeper'
|
30
|
-
require 'humidifier/stack'
|
31
|
-
require 'humidifier/version'
|
12
|
+
# Hook into the string extension and ensure it works for certain AWS acronyms
|
13
|
+
String.prepend(
|
14
|
+
Module.new do
|
15
|
+
def underscore
|
16
|
+
FastUnderscore.underscore(gsub(/(ARNs|AZs|VPCs)/) { $1.capitalize })
|
17
|
+
end
|
18
|
+
end
|
19
|
+
)
|
32
20
|
|
33
21
|
# container module for all gem classes
|
34
22
|
module Humidifier
|
35
23
|
class << self
|
36
24
|
# the configuration instance
|
37
25
|
def config
|
38
|
-
@config ||=
|
26
|
+
@config ||= Config.new
|
39
27
|
end
|
40
28
|
|
41
29
|
# yield the config object to the block for setting user params
|
@@ -62,7 +50,26 @@ module Humidifier
|
|
62
50
|
def [](aws_name)
|
63
51
|
registry[aws_name]
|
64
52
|
end
|
53
|
+
|
54
|
+
# a frozen hash of the given names mapped to their underscored version
|
55
|
+
def underscore(names)
|
56
|
+
names.map { |name| [name, name.underscore.to_sym] }.to_h.freeze
|
57
|
+
end
|
65
58
|
end
|
66
59
|
end
|
67
60
|
|
61
|
+
require 'humidifier/condition'
|
62
|
+
require 'humidifier/config'
|
63
|
+
require 'humidifier/fn'
|
64
|
+
require 'humidifier/loader'
|
65
|
+
require 'humidifier/mapping'
|
66
|
+
require 'humidifier/output'
|
67
|
+
require 'humidifier/parameter'
|
68
|
+
require 'humidifier/ref'
|
69
|
+
require 'humidifier/resource'
|
70
|
+
require 'humidifier/serializer'
|
71
|
+
require 'humidifier/stack'
|
72
|
+
require 'humidifier/version'
|
73
|
+
require 'humidifier/props'
|
74
|
+
|
68
75
|
Humidifier::Loader.load
|
metadata
CHANGED
@@ -1,29 +1,71 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: humidifier
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Localytics
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-05-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: aws-sdk-cloudformation
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.19'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.19'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: aws-sdk-s3
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.36'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.36'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: fast_underscore
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0.3'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0.3'
|
13
55
|
- !ruby/object:Gem::Dependency
|
14
56
|
name: bundler
|
15
57
|
requirement: !ruby/object:Gem::Requirement
|
16
58
|
requirements:
|
17
59
|
- - "~>"
|
18
60
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
61
|
+
version: '2.0'
|
20
62
|
type: :development
|
21
63
|
prerelease: false
|
22
64
|
version_requirements: !ruby/object:Gem::Requirement
|
23
65
|
requirements:
|
24
66
|
- - "~>"
|
25
67
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
68
|
+
version: '2.0'
|
27
69
|
- !ruby/object:Gem::Dependency
|
28
70
|
name: minitest
|
29
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -44,14 +86,14 @@ dependencies:
|
|
44
86
|
requirements:
|
45
87
|
- - "~>"
|
46
88
|
- !ruby/object:Gem::Version
|
47
|
-
version: '1.
|
89
|
+
version: '1.10'
|
48
90
|
type: :development
|
49
91
|
prerelease: false
|
50
92
|
version_requirements: !ruby/object:Gem::Requirement
|
51
93
|
requirements:
|
52
94
|
- - "~>"
|
53
95
|
- !ruby/object:Gem::Version
|
54
|
-
version: '1.
|
96
|
+
version: '1.10'
|
55
97
|
- !ruby/object:Gem::Dependency
|
56
98
|
name: rake
|
57
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -72,14 +114,28 @@ dependencies:
|
|
72
114
|
requirements:
|
73
115
|
- - "~>"
|
74
116
|
- !ruby/object:Gem::Version
|
75
|
-
version: '0.
|
117
|
+
version: '0.68'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0.68'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: rubocop-performance
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '1.2'
|
76
132
|
type: :development
|
77
133
|
prerelease: false
|
78
134
|
version_requirements: !ruby/object:Gem::Requirement
|
79
135
|
requirements:
|
80
136
|
- - "~>"
|
81
137
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
138
|
+
version: '1.2'
|
83
139
|
- !ruby/object:Gem::Dependency
|
84
140
|
name: simplecov
|
85
141
|
requirement: !ruby/object:Gem::Requirement
|
@@ -120,37 +176,18 @@ files:
|
|
120
176
|
- LICENSE
|
121
177
|
- README.md
|
122
178
|
- lib/humidifier.rb
|
123
|
-
- lib/humidifier/aws_adapters/base.rb
|
124
|
-
- lib/humidifier/aws_adapters/noop.rb
|
125
|
-
- lib/humidifier/aws_adapters/sdkv1.rb
|
126
|
-
- lib/humidifier/aws_adapters/sdkv2.rb
|
127
|
-
- lib/humidifier/aws_adapters/sdkv3.rb
|
128
|
-
- lib/humidifier/aws_shim.rb
|
129
179
|
- lib/humidifier/condition.rb
|
130
|
-
- lib/humidifier/
|
180
|
+
- lib/humidifier/config.rb
|
131
181
|
- lib/humidifier/fn.rb
|
132
182
|
- lib/humidifier/loader.rb
|
133
183
|
- lib/humidifier/mapping.rb
|
134
184
|
- lib/humidifier/output.rb
|
135
185
|
- lib/humidifier/parameter.rb
|
136
186
|
- lib/humidifier/props.rb
|
137
|
-
- lib/humidifier/props/base.rb
|
138
|
-
- lib/humidifier/props/boolean_prop.rb
|
139
|
-
- lib/humidifier/props/double_prop.rb
|
140
|
-
- lib/humidifier/props/integer_prop.rb
|
141
|
-
- lib/humidifier/props/json_prop.rb
|
142
|
-
- lib/humidifier/props/list_prop.rb
|
143
|
-
- lib/humidifier/props/map_prop.rb
|
144
|
-
- lib/humidifier/props/string_prop.rb
|
145
|
-
- lib/humidifier/props/structure_prop.rb
|
146
|
-
- lib/humidifier/props/timestamp_prop.rb
|
147
187
|
- lib/humidifier/ref.rb
|
148
188
|
- lib/humidifier/resource.rb
|
149
|
-
- lib/humidifier/sdk_payload.rb
|
150
189
|
- lib/humidifier/serializer.rb
|
151
|
-
- lib/humidifier/sleeper.rb
|
152
190
|
- lib/humidifier/stack.rb
|
153
|
-
- lib/humidifier/utils.rb
|
154
191
|
- lib/humidifier/version.rb
|
155
192
|
homepage: https://github.com/localytics/humidifier
|
156
193
|
licenses:
|
@@ -164,15 +201,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
164
201
|
requirements:
|
165
202
|
- - ">="
|
166
203
|
- !ruby/object:Gem::Version
|
167
|
-
version: '2.
|
204
|
+
version: '2.4'
|
168
205
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
169
206
|
requirements:
|
170
207
|
- - ">="
|
171
208
|
- !ruby/object:Gem::Version
|
172
209
|
version: '0'
|
173
210
|
requirements: []
|
174
|
-
|
175
|
-
rubygems_version: 2.7.6
|
211
|
+
rubygems_version: 3.0.3
|
176
212
|
signing_key:
|
177
213
|
specification_version: 4
|
178
214
|
summary: CloudFormation made easy
|
@@ -1,67 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Humidifier
|
4
|
-
# A container module for all adapters for the SDK
|
5
|
-
module AwsAdapters
|
6
|
-
# The parent class for the adapters for both versions of the SDK
|
7
|
-
class Base
|
8
|
-
# Create a CFN stack
|
9
|
-
def create(payload)
|
10
|
-
try_valid do
|
11
|
-
response = client.create_stack(payload.create_params)
|
12
|
-
payload.id = response.stack_id
|
13
|
-
response
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
# Delete a CFN stack
|
18
|
-
def delete(payload)
|
19
|
-
client.delete_stack(payload.delete_params)
|
20
|
-
true
|
21
|
-
end
|
22
|
-
|
23
|
-
# Update a CFN stack if it exists, otherwise create it
|
24
|
-
def deploy(payload)
|
25
|
-
exists?(payload) ? update(payload) : create(payload)
|
26
|
-
end
|
27
|
-
|
28
|
-
# Update a CFN stack
|
29
|
-
def update(payload)
|
30
|
-
try_valid { client.update_stack(payload.update_params) }
|
31
|
-
end
|
32
|
-
|
33
|
-
# Upload a CFN stack to S3 so that it can be referenced via template_url
|
34
|
-
def upload(payload)
|
35
|
-
Humidifier.config.ensure_upload_configured!(payload)
|
36
|
-
filename = "#{Humidifier.config.s3_prefix}#{payload.identifier}.json"
|
37
|
-
upload_object(payload, filename)
|
38
|
-
end
|
39
|
-
|
40
|
-
# Validate a template in CFN
|
41
|
-
def valid?(payload)
|
42
|
-
try_valid { client.validate_template(payload.validate_params) }
|
43
|
-
end
|
44
|
-
|
45
|
-
%i[create delete deploy update].each do |method|
|
46
|
-
define_method(:"#{method}_and_wait") do |payload|
|
47
|
-
perform_and_wait(method, payload)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
private
|
52
|
-
|
53
|
-
def client
|
54
|
-
@client ||=
|
55
|
-
base_module::CloudFormation::Client.new(region: AwsShim::REGION)
|
56
|
-
end
|
57
|
-
|
58
|
-
def try_valid
|
59
|
-
yield || true
|
60
|
-
rescue base_module::CloudFormation::Errors::ValidationError => error
|
61
|
-
warn(error.message)
|
62
|
-
warn(error.backtrace)
|
63
|
-
false
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Humidifier
|
4
|
-
module AwsAdapters
|
5
|
-
# An adapter used when neither SDK is loaded
|
6
|
-
class Noop
|
7
|
-
# Capture all STACK_METHODS method calls and warn that they will not be
|
8
|
-
# run
|
9
|
-
def method_missing(method, *)
|
10
|
-
if AwsShim::STACK_METHODS.include?(method)
|
11
|
-
puts "WARNING: Cannot run #{method} because aws-sdk not loaded."
|
12
|
-
false
|
13
|
-
else
|
14
|
-
super
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
# We capture stack methods and warn about them but don't actually respond
|
19
|
-
# to them
|
20
|
-
def respond_to_missing?(method, *)
|
21
|
-
AwsShim::STACK_METHODS.include?(method) ? false : super
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|