kumo_keisei 3.2.1 → 4.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/README.md +8 -10
- data/VERSION +1 -1
- data/lib/kumo_keisei/get_stack_output.rb +13 -0
- data/lib/kumo_keisei/stack.rb +12 -9
- data/lib/kumo_keisei.rb +1 -0
- data/spec/lib/kumo_keisei/get_stack_output_spec.rb +33 -0
- data/spec/lib/kumo_keisei/stack_spec.rb +13 -34
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ee8cf3ca725828906b7a8c98b2ddd15957964443
|
4
|
+
data.tar.gz: b5a1bcbb5b5f0093f86aec78378a2a08c4c86a31
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e81b694610cf7626e3ab8ad2bbd39a6e6f273b007200c89057b7ff4405b8812c8e9c44afe81af74bec88a84b9603b036df37ec816d82edebcff8e9047e54b6b9
|
7
|
+
data.tar.gz: 2a6e0142a23dc0520a193379163db5f8c72963e2dcda1d687105705d30e0353bec25f4f4c5a34cbd3a2a254a9b308faa352fd0afd85b0b829fbc800597e52328
|
data/README.md
CHANGED
@@ -24,12 +24,12 @@ Or install it yourself as:
|
|
24
24
|
|
25
25
|
### Basic Usage
|
26
26
|
|
27
|
-
The basic usage will give you a CloudFormation stack named `{application}-{
|
27
|
+
The basic usage will give you a CloudFormation stack named `{application}-{environment}`. The default type is `nodes`
|
28
28
|
|
29
29
|
```ruby
|
30
30
|
application_name = "myapp"
|
31
31
|
environment_name = "production"
|
32
|
-
my_stack = KumoKeisei::Stack.new(
|
32
|
+
my_stack = KumoKeisei::Stack.new(application_name, environment_name)
|
33
33
|
|
34
34
|
stack_config = {
|
35
35
|
config_path: File.join('/app', 'env', 'config'),
|
@@ -39,15 +39,13 @@ stack_config = {
|
|
39
39
|
my_stack.apply! stack_config
|
40
40
|
```
|
41
41
|
|
42
|
-
###
|
42
|
+
### Stack Naming
|
43
|
+
|
44
|
+
We are using APPNAME-ENVNAME (e.g `redbubble-staging`) as our naming convention. There are some legacy stacks in AWS which have the old naming convention which is APPNAME-TYPE-ENVNAME (e.g `redbubble-nodes-staging`). If you want to ensure that you keep your existing stack (so you don't accidently build an extra stack):
|
45
|
+
|
46
|
+
0. Login into the AWS console and find out what your stack is named.
|
47
|
+
0. Update your app name (see Basic Usage above) in the apply-env script to match your existing stack name's app name part (which is everything before the environment name, e.g `redbubble-nodes` in `redbubble-nodes-staging`)
|
43
48
|
|
44
|
-
Specify the `type` in an options object passed to the `KumoKeisei::Stack` constructor. For example the following will give you a `myapp-vpc-production` stack e.g:
|
45
|
-
```ruby
|
46
|
-
vpc_stack_options = {
|
47
|
-
type: 'vpc'
|
48
|
-
}
|
49
|
-
vpc_stack = KumoKeisei::Stack.new('myapp', 'production', vpc_stack_options)
|
50
|
-
```
|
51
49
|
|
52
50
|
### Timeouts
|
53
51
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
4.0.0
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module KumoKeisei
|
2
|
+
class GetStackOutput
|
3
|
+
def initialize(aws_stack)
|
4
|
+
@aws_stack = aws_stack
|
5
|
+
end
|
6
|
+
|
7
|
+
def output(name)
|
8
|
+
return nil if @aws_stack.nil?
|
9
|
+
outputs_hash = @aws_stack.outputs.reduce({}) { |acc, o| acc.merge(o.output_key.to_s => o.output_value) }
|
10
|
+
outputs_hash[name]
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
data/lib/kumo_keisei/stack.rb
CHANGED
@@ -28,14 +28,21 @@ module KumoKeisei
|
|
28
28
|
self.new(app_name, environment_name).exists?
|
29
29
|
end
|
30
30
|
|
31
|
-
def initialize(app_name, environment_name, options = { confirmation_timeout: 30, waiter_delay: 20, waiter_attempts: 90 })
|
32
|
-
type = options.fetch(:type, 'nodes')
|
31
|
+
def initialize(app_name, environment_name, options = { confirmation_timeout: 30, waiter_delay: 20, waiter_attempts: 90, prompt_user: true })
|
33
32
|
@env_name = environment_name
|
34
33
|
@app_name = app_name
|
35
|
-
@stack_name = "#{app_name}-#{
|
34
|
+
@stack_name = "#{app_name}-#{ environment_name }"
|
36
35
|
@confirmation_timeout = options[:confirmation_timeout]
|
37
36
|
@waiter_delay = options[:waiter_delay]
|
38
37
|
@waiter_attempts = options[:waiter_attempts]
|
38
|
+
prompt_user if options[:prompt_user]
|
39
|
+
end
|
40
|
+
|
41
|
+
def prompt_user
|
42
|
+
puts "WARNING: You are about to lookup/create/update/delete #{@stack_name}."
|
43
|
+
puts "We have recently changed the way we name stacks in aws, if #{@stack_name} looks correct, hit 'Y', otherwise hit anything else and read more at 'https://github.com/redbubble/kumo_keisei_gem'"
|
44
|
+
continue = $stdin.gets.chomp.downcase
|
45
|
+
exit 1 if continue != 'y'
|
39
46
|
end
|
40
47
|
|
41
48
|
def apply!(stack_config)
|
@@ -62,12 +69,8 @@ module KumoKeisei
|
|
62
69
|
ensure_deleted!
|
63
70
|
end
|
64
71
|
|
65
|
-
def outputs(
|
66
|
-
|
67
|
-
return nil if stack.nil?
|
68
|
-
outputs_hash = stack.outputs.reduce({}) { |acc, o| acc.merge(o.output_key.to_s => o.output_value) }
|
69
|
-
|
70
|
-
outputs_hash[output]
|
72
|
+
def outputs(name)
|
73
|
+
return GetStackOutput.new(get_stack).output(name)
|
71
74
|
end
|
72
75
|
|
73
76
|
def logical_resource(resource_name)
|
data/lib/kumo_keisei.rb
CHANGED
@@ -0,0 +1,33 @@
|
|
1
|
+
describe KumoKeisei::GetStackOutput do
|
2
|
+
describe "#output" do
|
3
|
+
let(:aws_stack) { double(:stack, outputs: [output])}
|
4
|
+
let(:name) { "Key" }
|
5
|
+
subject { described_class.new(aws_stack).output(name) }
|
6
|
+
|
7
|
+
context 'when the stack exists' do
|
8
|
+
let(:value) { "Value" }
|
9
|
+
let(:output_key) { name }
|
10
|
+
let(:output) { double(:output, output_key: output_key, output_value: value) }
|
11
|
+
|
12
|
+
it "returns the outputs given by CloudFormation" do
|
13
|
+
expect(subject).to eq(value)
|
14
|
+
end
|
15
|
+
|
16
|
+
context "Output key doesn't exist" do
|
17
|
+
let(:output_key) { "something else" }
|
18
|
+
|
19
|
+
it "returns the outputs given by CloudFormation" do
|
20
|
+
expect(subject).to be_nil
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'when the stack does not exist' do
|
26
|
+
let(:aws_stack) { nil }
|
27
|
+
|
28
|
+
it 'returns nil' do
|
29
|
+
expect(subject).to be_nil
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -9,13 +9,14 @@ describe KumoKeisei::Stack do
|
|
9
9
|
|
10
10
|
let(:app_name) { "my-stack" }
|
11
11
|
let(:environment_name) { 'non-production' }
|
12
|
-
let(:stack_name) { "#{app_name}
|
12
|
+
let(:stack_name) { "#{app_name}-#{environment_name}" }
|
13
13
|
let(:stack_template_name) { "#{app_name}-#{environment_name}" }
|
14
14
|
let(:stack_cfntemplate_filename) { "#{stack_template_name}.json" }
|
15
15
|
let(:stack_cfnparams_filename) { "#{stack_template_name}.yml.erb" }
|
16
16
|
let(:cloudformation) { instance_double(Aws::CloudFormation::Client) }
|
17
17
|
let(:happy_stack_status) { "CREATE_COMPLETE" }
|
18
|
-
let(:
|
18
|
+
let(:named_cf_stack) { double(stack_status: happy_stack_status, stack_name: stack_name, stack_id: nil) }
|
19
|
+
let(:cf_stack) { double(stacks: [named_cf_stack]) }
|
19
20
|
let(:parameter_builder) { instance_double(KumoKeisei::ParameterBuilder, params: {}) }
|
20
21
|
let(:stack_template_body) { double(:stack_template_body) }
|
21
22
|
let(:cf_stack_update_params) do
|
@@ -30,7 +31,7 @@ describe KumoKeisei::Stack do
|
|
30
31
|
cf_stack_update_params.merge(on_failure: "DELETE")
|
31
32
|
end
|
32
33
|
let(:confirmation_timeout) { 30 }
|
33
|
-
subject(:instance) { KumoKeisei::Stack.new(app_name, environment_name) }
|
34
|
+
subject(:instance) { KumoKeisei::Stack.new(app_name, environment_name, confirmation_timeout: 30, waiter_delay: 20, waiter_attempts: 90, prompt_user: false ) }
|
34
35
|
let(:stack_config) {
|
35
36
|
{
|
36
37
|
config_path: 'config-path',
|
@@ -40,8 +41,6 @@ describe KumoKeisei::Stack do
|
|
40
41
|
}
|
41
42
|
}
|
42
43
|
|
43
|
-
context "unit tests" do
|
44
|
-
|
45
44
|
before do
|
46
45
|
allow(KumoKeisei::ConsoleJockey).to receive(:flash_message)
|
47
46
|
allow(KumoKeisei::ConsoleJockey).to receive(:write_line).and_return(nil)
|
@@ -51,7 +50,6 @@ describe KumoKeisei::Stack do
|
|
51
50
|
allow(KumoKeisei::ParameterBuilder).to receive(:new).and_return(parameter_builder)
|
52
51
|
allow(File).to receive(:read).with(stack_cfntemplate_filename).and_return(stack_template_body)
|
53
52
|
allow(KumoKeisei::EnvironmentConfig).to receive(:new).with(stack_config.merge(params_template_file_path: "/#{stack_cfnparams_filename}")).and_return(double(:environment_config, cf_params: {}))
|
54
|
-
# allow(File).to receive(:absolute_path).and_return("#{app_name}.yml.erb")
|
55
53
|
Dir.chdir('/')
|
56
54
|
end
|
57
55
|
|
@@ -234,22 +232,15 @@ describe KumoKeisei::Stack do
|
|
234
232
|
end
|
235
233
|
|
236
234
|
describe "#outputs" do
|
237
|
-
|
238
|
-
|
239
|
-
let(:stack) { double(:stack, stack_name: stack_name, outputs: [output])}
|
240
|
-
let(:stack_result) { double(:stack_result, stacks: [stack]) }
|
241
|
-
|
242
|
-
it "returns the outputs given by CloudFormation" do
|
243
|
-
allow(cloudformation).to receive(:describe_stacks).and_return(stack_result)
|
244
|
-
expect(subject.outputs("Key")).to eq("Value")
|
245
|
-
end
|
246
|
-
end
|
235
|
+
let(:name) { "Key" }
|
236
|
+
subject { instance.outputs(name) }
|
247
237
|
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
238
|
+
let(:get_stack_output) { double(:get_stack_output) }
|
239
|
+
|
240
|
+
it "delegates output retrieval to GetStackOutput" do
|
241
|
+
expect(KumoKeisei::GetStackOutput).to receive(:new).with(named_cf_stack).and_return(get_stack_output)
|
242
|
+
expect(get_stack_output).to receive(:output).with(name).and_return('Value')
|
243
|
+
expect(subject).to eq("Value")
|
253
244
|
end
|
254
245
|
end
|
255
246
|
|
@@ -271,17 +262,6 @@ describe KumoKeisei::Stack do
|
|
271
262
|
end
|
272
263
|
end
|
273
264
|
|
274
|
-
describe "#type" do
|
275
|
-
it "presumes stacks are of type node if the type is not set" do
|
276
|
-
expect(subject.stack_name).to eq("#{app_name}-nodes-#{environment_name}")
|
277
|
-
end
|
278
|
-
|
279
|
-
it "embeds the type into the name of the stack if set" do
|
280
|
-
subject = KumoKeisei::Stack.new(app_name, environment_name, { type: "vpc" } )
|
281
|
-
expect(subject.stack_name).to eq("#{app_name}-vpc-#{environment_name}")
|
282
|
-
end
|
283
|
-
end
|
284
|
-
|
285
265
|
describe "#config" do
|
286
266
|
context "when passed a config_path and params_template_file_path" do
|
287
267
|
it "will return the results of the nested KumoKeisei::EnvironmentConfig.config" do
|
@@ -310,12 +290,11 @@ describe KumoKeisei::Stack do
|
|
310
290
|
}
|
311
291
|
}
|
312
292
|
it "will raise an error" do
|
313
|
-
expect { described_class.new(app_name, environment_name).config(stack_config)}.to raise_error(KumoKeisei::Stack::UsageError)
|
293
|
+
expect { described_class.new(app_name, environment_name, prompt_user: false).config(stack_config)}.to raise_error(KumoKeisei::Stack::UsageError)
|
314
294
|
end
|
315
295
|
end
|
316
296
|
|
317
297
|
end
|
318
|
-
end
|
319
298
|
|
320
299
|
describe "#params_template_path" do
|
321
300
|
context "when looking for the parameter template file" do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kumo_keisei
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 4.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Redbubble
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-08-
|
11
|
+
date: 2016-08-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aws-sdk
|
@@ -104,6 +104,7 @@ files:
|
|
104
104
|
- lib/kumo_keisei/environment_config.rb
|
105
105
|
- lib/kumo_keisei/errors.rb
|
106
106
|
- lib/kumo_keisei/file_loader.rb
|
107
|
+
- lib/kumo_keisei/get_stack_output.rb
|
107
108
|
- lib/kumo_keisei/parameter_builder.rb
|
108
109
|
- lib/kumo_keisei/stack.rb
|
109
110
|
- script/build.sh
|
@@ -113,6 +114,7 @@ files:
|
|
113
114
|
- spec/lib/kumo_keisei/console_jockey_spec.rb
|
114
115
|
- spec/lib/kumo_keisei/environment_config_spec.rb
|
115
116
|
- spec/lib/kumo_keisei/file_loader_spec.rb
|
117
|
+
- spec/lib/kumo_keisei/get_stack_output_spec.rb
|
116
118
|
- spec/lib/kumo_keisei/parameter_builder_spec.rb
|
117
119
|
- spec/lib/kumo_keisei/stack_spec.rb
|
118
120
|
- spec/spec_helper.rb
|
@@ -145,6 +147,7 @@ test_files:
|
|
145
147
|
- spec/lib/kumo_keisei/console_jockey_spec.rb
|
146
148
|
- spec/lib/kumo_keisei/environment_config_spec.rb
|
147
149
|
- spec/lib/kumo_keisei/file_loader_spec.rb
|
150
|
+
- spec/lib/kumo_keisei/get_stack_output_spec.rb
|
148
151
|
- spec/lib/kumo_keisei/parameter_builder_spec.rb
|
149
152
|
- spec/lib/kumo_keisei/stack_spec.rb
|
150
153
|
- spec/spec_helper.rb
|