kumogata 0.1.1 → 0.1.2
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 +3 -2
- data/lib/kumogata/argument_parser.rb +5 -1
- data/lib/kumogata/client.rb +27 -16
- data/lib/kumogata/version.rb +1 -1
- data/spec/kumogata_create_spec.rb +0 -3
- data/spec/kumogata_delete_spec.rb +0 -2
- data/spec/kumogata_export_spec.rb +59 -0
- data/spec/kumogata_list_spec.rb +67 -0
- data/spec/kumogata_update_spec.rb +0 -2
- data/spec/spec_helper.rb +1 -1
- metadata +5 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 58505fd69f4767540e2830de48d42a07605781d9
|
4
|
+
data.tar.gz: dbed8f02373d8f06f284009b9c3e0b4126b4bf10
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: db73cef84452369b64bc6284f65672120b4f62720c6ac9abcb92cf6bfc26dfe5709035a11aaeca72a7cd6788d09aa1cea2b30ea710f63390fde352996543b0d6
|
7
|
+
data.tar.gz: e40c5f04d96bafbf34f721a4f46f116ac65786fdc4f7c308d330dbb85e826592ea3929d60720311716cacfef9ab486b0a4ed09b64859ae9af2822016173e647e
|
data/README.md
CHANGED
@@ -2,8 +2,8 @@
|
|
2
2
|
|
3
3
|
Kumogata is a tool for AWS CroudFormation.
|
4
4
|
|
5
|
-
[](http://badge.fury.io/rb/kumogata)
|
6
|
+
[](https://drone.io/github.com/winebarrel/kumogata/latest)
|
7
7
|
|
8
8
|
It can define a template in Ruby DSL, such as:
|
9
9
|
|
@@ -58,6 +58,7 @@ Commands:
|
|
58
58
|
update PATH_OR_URL STACK_NAME Update a stack as specified in the template
|
59
59
|
delete STACK_NAME Delete a specified stack
|
60
60
|
list [STACK_NAME] List summary information for stacks
|
61
|
+
export STACK_NAME Export a template from a specified stack
|
61
62
|
|
62
63
|
Options:
|
63
64
|
-k, --access-key ACCESS_KEY
|
@@ -27,13 +27,17 @@ class Kumogata::ArgumentParser
|
|
27
27
|
:arguments => [:path_or_url, :stack_name]
|
28
28
|
},
|
29
29
|
:delete => {
|
30
|
-
:description => '
|
30
|
+
:description => 'Delete a specified stack',
|
31
31
|
:arguments => [:stack_name]
|
32
32
|
},
|
33
33
|
:list => {
|
34
34
|
:description => 'List summary information for stacks',
|
35
35
|
:arguments => [:stack_name?]
|
36
36
|
},
|
37
|
+
:export => {
|
38
|
+
:description => 'Export a template from a specified stack',
|
39
|
+
:arguments => [:stack_name]
|
40
|
+
},
|
37
41
|
}
|
38
42
|
|
39
43
|
class << self
|
data/lib/kumogata/client.rb
CHANGED
@@ -57,6 +57,11 @@ class Kumogata::Client
|
|
57
57
|
JSON.pretty_generate(stacks)
|
58
58
|
end
|
59
59
|
|
60
|
+
def export(stack_name = nil)
|
61
|
+
template = export_template(stack_name)
|
62
|
+
devaluate_template(template).chomp
|
63
|
+
end
|
64
|
+
|
60
65
|
private ###########################################################
|
61
66
|
|
62
67
|
def open_template(path_or_url)
|
@@ -146,22 +151,6 @@ class Kumogata::Client
|
|
146
151
|
end
|
147
152
|
end
|
148
153
|
|
149
|
-
def describe_stacks(stack_name)
|
150
|
-
AWS.memoize do
|
151
|
-
stacks = @cloud_formation.stacks
|
152
|
-
stacks = stacks.select {|i| i.name == stack_name } if stack_name
|
153
|
-
|
154
|
-
stacks.map do |stack|
|
155
|
-
{
|
156
|
-
'StackName' => stack.name,
|
157
|
-
'CreationTime' => stack.creation_time,
|
158
|
-
'StackStatus' => stack.status,
|
159
|
-
'Description' => stack.description,
|
160
|
-
}
|
161
|
-
end
|
162
|
-
end
|
163
|
-
end
|
164
|
-
|
165
154
|
def create_stack(template, stack_name)
|
166
155
|
stack_name = stack_name || 'kumogata-' + UUIDTools::UUID.timestamp_create
|
167
156
|
|
@@ -229,6 +218,28 @@ class Kumogata::Client
|
|
229
218
|
end
|
230
219
|
end
|
231
220
|
|
221
|
+
def describe_stacks(stack_name)
|
222
|
+
AWS.memoize do
|
223
|
+
stacks = @cloud_formation.stacks
|
224
|
+
stacks = stacks.select {|i| i.name == stack_name } if stack_name
|
225
|
+
|
226
|
+
stacks.map do |stack|
|
227
|
+
{
|
228
|
+
'StackName' => stack.name,
|
229
|
+
'CreationTime' => stack.creation_time,
|
230
|
+
'StackStatus' => stack.status,
|
231
|
+
'Description' => stack.description,
|
232
|
+
}
|
233
|
+
end
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
def export_template(stack_name)
|
238
|
+
stack = @cloud_formation.stacks[stack_name]
|
239
|
+
stack.status
|
240
|
+
JSON.parse(stack.template)
|
241
|
+
end
|
242
|
+
|
232
243
|
def while_in_progress(stack, complete_status)
|
233
244
|
while stack.status =~ /_IN_PROGRESS\Z/
|
234
245
|
print '.'.intense_black unless @options.debug?
|
data/lib/kumogata/version.rb
CHANGED
@@ -22,7 +22,6 @@ end
|
|
22
22
|
|
23
23
|
run_client(:create, :template => template) do |client, cf|
|
24
24
|
json = eval_template(template, :update_deletion_policy => true).to_json
|
25
|
-
stacks = double('status')
|
26
25
|
|
27
26
|
output = make_double('output') do |obj|
|
28
27
|
obj.should_receive(:key) { 'AZ' }
|
@@ -89,7 +88,6 @@ end
|
|
89
88
|
|
90
89
|
run_client(:create, :template => template, :options => {:parameters => ['InstanceType=m1.large']}) do |client, cf|
|
91
90
|
json = eval_template(template, :update_deletion_policy => true).to_json
|
92
|
-
stacks = double('stacks')
|
93
91
|
|
94
92
|
output = make_double('output') do |obj|
|
95
93
|
obj.should_receive(:key) { 'AZ' }
|
@@ -148,7 +146,6 @@ end
|
|
148
146
|
|
149
147
|
run_client(:create, :arguments => ['MyStack'], :template => template) do |client, cf|
|
150
148
|
json = eval_template(template).to_json
|
151
|
-
stacks = double('status')
|
152
149
|
|
153
150
|
output = make_double('output') do |obj|
|
154
151
|
obj.should_receive(:key) { 'AZ' }
|
@@ -1,8 +1,6 @@
|
|
1
1
|
describe 'Kumogata::Client#delete' do
|
2
2
|
it 'update a stack from Ruby template' do
|
3
3
|
run_client(:delete, :arguments => ['MyStack'], :options => {:force => true}) do |client, cf|
|
4
|
-
stacks = double('status')
|
5
|
-
|
6
4
|
stack = make_double('stack') do |obj|
|
7
5
|
obj.should_receive(:delete).with(no_args())
|
8
6
|
obj.should_receive(:status).and_return(
|
@@ -0,0 +1,59 @@
|
|
1
|
+
describe 'Kumogata::Client#export' do
|
2
|
+
it 'export a template' do
|
3
|
+
json = <<-EOS
|
4
|
+
{
|
5
|
+
"Resources": {
|
6
|
+
"myEC2Instance": {
|
7
|
+
"Type": "AWS::EC2::Instance",
|
8
|
+
"Properties": {
|
9
|
+
"ImageId": "ami-XXXXXXXX",
|
10
|
+
"InstanceType": "t1.micro"
|
11
|
+
}
|
12
|
+
}
|
13
|
+
},
|
14
|
+
"Outputs": {
|
15
|
+
"AZ": {
|
16
|
+
"Value": {
|
17
|
+
"Fn::GetAtt": [
|
18
|
+
"myEC2Instance",
|
19
|
+
"AvailabilityZone"
|
20
|
+
]
|
21
|
+
}
|
22
|
+
}
|
23
|
+
}
|
24
|
+
}
|
25
|
+
EOS
|
26
|
+
|
27
|
+
template = run_client(:export, :arguments => ['MyStack']) do |client, cf|
|
28
|
+
stack = make_double('stack') do |obj|
|
29
|
+
obj.should_receive(:status) { 'CREATE_COMPLETE' }
|
30
|
+
obj.should_receive(:template) { json }
|
31
|
+
end
|
32
|
+
|
33
|
+
stacks = make_double('stacks') do |obj|
|
34
|
+
obj.should_receive(:[]).with('MyStack') { stack }
|
35
|
+
end
|
36
|
+
|
37
|
+
cf.should_receive(:stacks) { stacks }
|
38
|
+
end
|
39
|
+
|
40
|
+
expect(template).to eq((<<-EOS).chomp)
|
41
|
+
Resources do
|
42
|
+
myEC2Instance do
|
43
|
+
Type "AWS::EC2::Instance"
|
44
|
+
Properties do
|
45
|
+
ImageId "ami-XXXXXXXX"
|
46
|
+
InstanceType "t1.micro"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
Outputs do
|
51
|
+
AZ do
|
52
|
+
Value do
|
53
|
+
Fn__GetAtt "myEC2Instance", "AvailabilityZone"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
EOS
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
describe 'Kumogata::Client#list' do
|
2
|
+
it 'list stacks' do
|
3
|
+
json = run_client(:list) do |client, cf|
|
4
|
+
stack1 = make_double('stack1') do |obj|
|
5
|
+
obj.should_receive(:name) { 'stack1' }
|
6
|
+
obj.should_receive(:creation_time) { '2014-03-02 16:17:18 UTC' }
|
7
|
+
obj.should_receive(:status) { 'CREATE_COMPLETE' }
|
8
|
+
obj.should_receive(:description) { nil }
|
9
|
+
end
|
10
|
+
|
11
|
+
stack2 = make_double('stack2') do |obj|
|
12
|
+
obj.should_receive(:name) { 'stack2' }
|
13
|
+
obj.should_receive(:creation_time) { '2014-03-02 16:17:19 UTC' }
|
14
|
+
obj.should_receive(:status) { 'CREATE_COMPLETE' }
|
15
|
+
obj.should_receive(:description) { nil }
|
16
|
+
end
|
17
|
+
|
18
|
+
cf.should_receive(:stacks) { [stack1, stack2] }
|
19
|
+
end
|
20
|
+
|
21
|
+
expect(json).to eq((<<-EOS).chomp)
|
22
|
+
[
|
23
|
+
{
|
24
|
+
"StackName": "stack1",
|
25
|
+
"CreationTime": "2014-03-02 16:17:18 UTC",
|
26
|
+
"StackStatus": "CREATE_COMPLETE",
|
27
|
+
"Description": null
|
28
|
+
},
|
29
|
+
{
|
30
|
+
"StackName": "stack2",
|
31
|
+
"CreationTime": "2014-03-02 16:17:19 UTC",
|
32
|
+
"StackStatus": "CREATE_COMPLETE",
|
33
|
+
"Description": null
|
34
|
+
}
|
35
|
+
]
|
36
|
+
EOS
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'list a specified stack' do
|
40
|
+
json = run_client(:list, :arguments => ['stack1']) do |client, cf|
|
41
|
+
stack1 = make_double('stack1') do |obj|
|
42
|
+
obj.should_receive(:name).twice { 'stack1' }
|
43
|
+
obj.should_receive(:creation_time) { '2014-03-02 16:17:18 UTC' }
|
44
|
+
obj.should_receive(:status) { 'CREATE_COMPLETE' }
|
45
|
+
obj.should_receive(:description) { nil }
|
46
|
+
end
|
47
|
+
|
48
|
+
stack2 = make_double('stack2') do |obj|
|
49
|
+
obj.should_receive(:name) { 'stack2' }
|
50
|
+
end
|
51
|
+
|
52
|
+
cf.should_receive(:stacks) { [stack1, stack2] }
|
53
|
+
end
|
54
|
+
|
55
|
+
expect(json).to eq((<<-EOS).chomp)
|
56
|
+
[
|
57
|
+
{
|
58
|
+
"StackName": "stack1",
|
59
|
+
"CreationTime": "2014-03-02 16:17:18 UTC",
|
60
|
+
"StackStatus": "CREATE_COMPLETE",
|
61
|
+
"Description": null
|
62
|
+
}
|
63
|
+
]
|
64
|
+
EOS
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
@@ -22,7 +22,6 @@ end
|
|
22
22
|
|
23
23
|
run_client(:update, :arguments => ['MyStack'], :template => template) do |client, cf|
|
24
24
|
json = eval_template(template).to_json
|
25
|
-
stacks = double('status')
|
26
25
|
|
27
26
|
output = make_double('output') do |obj|
|
28
27
|
obj.should_receive(:key) { 'AZ' }
|
@@ -86,7 +85,6 @@ end
|
|
86
85
|
|
87
86
|
run_client(:update, :arguments => ['MyStack'], :template => template, :options => {:parameters => ['InstanceType=m1.large']}) do |client, cf|
|
88
87
|
json = eval_template(template).to_json
|
89
|
-
stacks = double('status')
|
90
88
|
|
91
89
|
output = make_double('output') do |obj|
|
92
90
|
obj.should_receive(:key) { 'AZ' }
|
data/spec/spec_helper.rb
CHANGED
@@ -19,7 +19,7 @@ def tempfile(content, template_ext)
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def run_client(command, options = {})
|
22
|
-
$stdout = open('/dev/null', 'w')
|
22
|
+
$stdout = open('/dev/null', 'w') unless ENV['DEBUG']
|
23
23
|
|
24
24
|
kumogata_template = options[:template]
|
25
25
|
kumogata_arguments = options[:arguments] || []
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kumogata
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Genki Sugawara
|
@@ -177,6 +177,8 @@ files:
|
|
177
177
|
- spec/kumogata_convert_spec.rb
|
178
178
|
- spec/kumogata_create_spec.rb
|
179
179
|
- spec/kumogata_delete_spec.rb
|
180
|
+
- spec/kumogata_export_spec.rb
|
181
|
+
- spec/kumogata_list_spec.rb
|
180
182
|
- spec/kumogata_update_spec.rb
|
181
183
|
- spec/kumogata_validate_spec.rb
|
182
184
|
- spec/spec_helper.rb
|
@@ -208,6 +210,8 @@ test_files:
|
|
208
210
|
- spec/kumogata_convert_spec.rb
|
209
211
|
- spec/kumogata_create_spec.rb
|
210
212
|
- spec/kumogata_delete_spec.rb
|
213
|
+
- spec/kumogata_export_spec.rb
|
214
|
+
- spec/kumogata_list_spec.rb
|
211
215
|
- spec/kumogata_update_spec.rb
|
212
216
|
- spec/kumogata_validate_spec.rb
|
213
217
|
- spec/spec_helper.rb
|