kumogata 0.4.4 → 0.4.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -2
- data/bin/kumogata +14 -4
- data/kumogata.gemspec +1 -1
- data/lib/kumogata/argument_parser.rb +20 -15
- data/lib/kumogata/client.rb +18 -13
- data/lib/kumogata/post_processing.rb +3 -1
- data/lib/kumogata/utils.rb +19 -0
- data/lib/kumogata/version.rb +1 -1
- data/lib/kumogata.rb +1 -1
- data/spec/kumogata_update_spec.rb +2 -2
- data/spec/spec_helper.rb +1 -0
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7fdd78705361ec8fc36f2c44c1082e16f5c28789
|
4
|
+
data.tar.gz: a87009e2d2ee94e6b23415e1e6d6b6c7ebd7aad5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e4af102fcc4b069f907dc145da52e899de20574f36500058c16ae80036d85d7147339dba61b0941033c0e5a4e3e55a2271c095d86771748367dbc169447abec1
|
7
|
+
data.tar.gz: ede746e11db3a41f3b1aae33dfa209e8fcbb1583f1a994d7ba8853703f11fa918d3efff1b9b83eab86977439f97bfe7cda595d891ebf571ac478e9bd367e6265
|
data/README.md
CHANGED
@@ -5,8 +5,8 @@
|
|
5
5
|
|
6
6
|
Kumogata is a tool for [AWS CloudFormation](https://aws.amazon.com/cloudformation/).
|
7
7
|
|
8
|
-
[![Gem Version](https://badge.fury.io/rb/kumogata.png?
|
9
|
-
[![Build Status](https://drone.io/github.com/winebarrel/kumogata/status.png?
|
8
|
+
[![Gem Version](https://badge.fury.io/rb/kumogata.png?201403151714)](http://badge.fury.io/rb/kumogata)
|
9
|
+
[![Build Status](https://drone.io/github.com/winebarrel/kumogata/status.png?201403151714)](https://drone.io/github.com/winebarrel/kumogata/latest)
|
10
10
|
|
11
11
|
It can define a template in Ruby DSL, such as:
|
12
12
|
|
data/bin/kumogata
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
$: << File.expand_path("#{File.dirname __FILE__}/../lib")
|
3
3
|
require 'rubygems'
|
4
4
|
require 'kumogata'
|
5
|
+
require 'kumogata/argument_parser'
|
5
6
|
|
6
7
|
options = nil
|
7
8
|
|
@@ -14,7 +15,7 @@ parsed = Kumogata::ArgumentParser.parse! {|parser, cmd, args, opts|
|
|
14
15
|
}
|
15
16
|
|
16
17
|
begin
|
17
|
-
command, arguments, options = parsed
|
18
|
+
command, arguments, options, output_result = parsed
|
18
19
|
|
19
20
|
aws_opts = {}
|
20
21
|
|
@@ -24,8 +25,8 @@ begin
|
|
24
25
|
|
25
26
|
AWS.config(aws_opts) unless aws_opts.empty?
|
26
27
|
|
27
|
-
String.colorize =
|
28
|
-
Diffy::Diff.default_format =
|
28
|
+
String.colorize = options.color?
|
29
|
+
Diffy::Diff.default_format = options.color? ? :color : :text
|
29
30
|
|
30
31
|
if options.debug?
|
31
32
|
Kumogata.logger.set_debug(true)
|
@@ -37,12 +38,21 @@ begin
|
|
37
38
|
end
|
38
39
|
|
39
40
|
out = Kumogata::Client.new(options).send(command, *arguments)
|
40
|
-
|
41
|
+
|
42
|
+
if output_result and out
|
43
|
+
puts out
|
44
|
+
end
|
41
45
|
rescue Exception => e
|
42
46
|
$stderr.puts("[ERROR] #{e.message}".red) unless e.kind_of?(Interrupt)
|
43
47
|
|
44
48
|
if options and options.debug?
|
45
49
|
raise e
|
50
|
+
else
|
51
|
+
backtrace = Kumogata::Utils.filter_backtrace(e.backtrace)
|
52
|
+
backtrace = backtrace.slice(0, 3)
|
53
|
+
unless backtrace.empty?
|
54
|
+
$stderr.puts " from #{backtrace.first}".red
|
55
|
+
end
|
46
56
|
end
|
47
57
|
|
48
58
|
exit 1
|
data/kumogata.gemspec
CHANGED
@@ -21,7 +21,7 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.add_dependency 'aws-sdk'
|
22
22
|
spec.add_dependency 'coderay'
|
23
23
|
spec.add_dependency 'diffy'
|
24
|
-
spec.add_dependency 'dslh', '>= 0.2.
|
24
|
+
spec.add_dependency 'dslh', '>= 0.2.6'
|
25
25
|
spec.add_dependency 'hashie'
|
26
26
|
spec.add_dependency 'highline'
|
27
27
|
spec.add_dependency 'json'
|
@@ -3,58 +3,61 @@ $kumogata = Hashie::Mash.new
|
|
3
3
|
|
4
4
|
class Kumogata::ArgumentParser
|
5
5
|
DEFAULT_OPTIONS = {
|
6
|
-
:replace_underscore => true,
|
7
6
|
:delete_stack => true,
|
8
7
|
:result_log => File.join(Dir.pwd, 'result.json'),
|
9
8
|
:command_result_log => File.join(Dir.pwd, 'command_result.json'),
|
10
|
-
:color =>
|
9
|
+
:color => $stdout.tty?,
|
11
10
|
:debug => false,
|
12
11
|
}
|
13
12
|
|
14
13
|
COMMANDS = {
|
15
14
|
:create => {
|
16
15
|
:description => 'Create resources as specified in the template',
|
17
|
-
:arguments => [:path_or_url, :stack_name?]
|
16
|
+
:arguments => [:path_or_url, :stack_name?],
|
17
|
+
:output => false,
|
18
18
|
},
|
19
19
|
:validate => {
|
20
20
|
:description => 'Validate a specified template',
|
21
|
-
:arguments => [:path_or_url]
|
21
|
+
:arguments => [:path_or_url],
|
22
|
+
:output => false,
|
22
23
|
},
|
23
24
|
:convert => {
|
24
25
|
:description => 'Convert a template format',
|
25
|
-
:arguments => [:path_or_url]
|
26
|
+
:arguments => [:path_or_url],
|
26
27
|
},
|
27
28
|
:update => {
|
28
29
|
:description => 'Update a stack as specified in the template',
|
29
|
-
:arguments => [:path_or_url, :stack_name]
|
30
|
+
:arguments => [:path_or_url, :stack_name],
|
31
|
+
:output => false,
|
30
32
|
},
|
31
33
|
:delete => {
|
32
34
|
:description => 'Delete a specified stack',
|
33
|
-
:arguments => [:stack_name]
|
35
|
+
:arguments => [:stack_name],
|
36
|
+
:output => false,
|
34
37
|
},
|
35
38
|
:list => {
|
36
39
|
:description => 'List summary information for stacks',
|
37
|
-
:arguments => [:stack_name?]
|
40
|
+
:arguments => [:stack_name?],
|
38
41
|
},
|
39
42
|
:export => {
|
40
43
|
:description => 'Export a template from a specified stack',
|
41
|
-
:arguments => [:stack_name]
|
44
|
+
:arguments => [:stack_name],
|
42
45
|
},
|
43
46
|
:'show-events' => {
|
44
47
|
:description => 'Show events for a specified stack',
|
45
|
-
:arguments => [:stack_name]
|
48
|
+
:arguments => [:stack_name],
|
46
49
|
},
|
47
50
|
:'show-outputs' => {
|
48
51
|
:description => 'Show outputs for a specified stack',
|
49
|
-
:arguments => [:stack_name]
|
52
|
+
:arguments => [:stack_name],
|
50
53
|
},
|
51
54
|
:'show-resources' => {
|
52
55
|
:description => 'Show resources for a specified stack',
|
53
|
-
:arguments => [:stack_name]
|
56
|
+
:arguments => [:stack_name],
|
54
57
|
},
|
55
58
|
:diff => {
|
56
59
|
:description => 'Compare templates logically',
|
57
|
-
:arguments => [:path_or_url1, :path_or_url2]
|
60
|
+
:arguments => [:path_or_url1, :path_or_url2],
|
58
61
|
},
|
59
62
|
}
|
60
63
|
|
@@ -81,7 +84,7 @@ class Kumogata::ArgumentParser
|
|
81
84
|
opt.on('-s', '--secret-key SECRET_KEY') {|v| options[:secret_access_key] = v }
|
82
85
|
opt.on('-r', '--region REGION') {|v| options[:region] = v }
|
83
86
|
opt.on('' , '--format TMPLATE_FORMAT', [:ruby, :json]) {|v| options[:format] = v }
|
84
|
-
opt.on('' , '--skip-replace-underscore') { options[:
|
87
|
+
opt.on('' , '--skip-replace-underscore') { options[:skip_replace_underscore] = false }
|
85
88
|
opt.on('' , '--deletion-policy-retain') { options[:deletion_policy_retain] = true }
|
86
89
|
opt.on('-p', '--parameters KEY_VALUES', Array) {|v| options[:parameters] = v }
|
87
90
|
opt.on('-e', '--encrypt-parameters KEYS', Array) {|v| options[:encrypt_parameters] = v }
|
@@ -95,6 +98,7 @@ class Kumogata::ArgumentParser
|
|
95
98
|
opt.on('' , '--command-result-log PATH') {|v| options[:command] = v }
|
96
99
|
opt.on('' , '--force') { options[:force] = true }
|
97
100
|
opt.on('-w', '--ignore-all-space') { options[:ignore_all_space] = true }
|
101
|
+
opt.on('' , '--color') { options[:color] = true }
|
98
102
|
opt.on('' , '--no-color') { options[:color] = false }
|
99
103
|
opt.on('' , '--debug') { options[:debug] = true }
|
100
104
|
opt.parse!
|
@@ -128,6 +132,7 @@ class Kumogata::ArgumentParser
|
|
128
132
|
end
|
129
133
|
end
|
130
134
|
|
135
|
+
output = COMMANDS[command].fetch(:output, true)
|
131
136
|
command = command.to_s.gsub('-', '_').to_sym
|
132
137
|
|
133
138
|
$kumogata.command = command
|
@@ -135,7 +140,7 @@ class Kumogata::ArgumentParser
|
|
135
140
|
$kumogata.options = options
|
136
141
|
options = $kumogata.options # Copy of the reference
|
137
142
|
|
138
|
-
[command, arguments, options]
|
143
|
+
[command, arguments, options, output]
|
139
144
|
end
|
140
145
|
|
141
146
|
private
|
data/lib/kumogata/client.rb
CHANGED
@@ -17,14 +17,14 @@ class Kumogata::Client
|
|
17
17
|
outputs = create_stack(template, stack_name)
|
18
18
|
@post_processing.run(:create, outputs)
|
19
19
|
|
20
|
-
|
20
|
+
outputs
|
21
21
|
end
|
22
22
|
|
23
23
|
def validate(path_or_url)
|
24
24
|
template = open_template(path_or_url)
|
25
25
|
add_encryption_password_for_validation(template)
|
26
26
|
validate_template(template)
|
27
|
-
|
27
|
+
true
|
28
28
|
end
|
29
29
|
|
30
30
|
def convert(path_or_url)
|
@@ -48,7 +48,7 @@ class Kumogata::Client
|
|
48
48
|
outputs = update_stack(template, stack_name)
|
49
49
|
@post_processing.run(:update, outputs)
|
50
50
|
|
51
|
-
|
51
|
+
outputs
|
52
52
|
end
|
53
53
|
|
54
54
|
def delete(stack_name)
|
@@ -58,7 +58,7 @@ class Kumogata::Client
|
|
58
58
|
delete_stack(stack_name)
|
59
59
|
end
|
60
60
|
|
61
|
-
|
61
|
+
true
|
62
62
|
end
|
63
63
|
|
64
64
|
def list(stack_name = nil)
|
@@ -134,7 +134,7 @@ class Kumogata::Client
|
|
134
134
|
def evaluate_template(template, path_or_url)
|
135
135
|
key_converter = proc do |key|
|
136
136
|
key = key.to_s
|
137
|
-
key.gsub!('__', '::')
|
137
|
+
key.gsub!('__', '::') unless @options.skip_replace_underscore?
|
138
138
|
key
|
139
139
|
end
|
140
140
|
|
@@ -551,16 +551,21 @@ Stack Resource Summaries:
|
|
551
551
|
|
552
552
|
Outputs:
|
553
553
|
#{JSON.pretty_generate(outputs).colorize_as(:json)}
|
554
|
+
EOS
|
554
555
|
|
555
|
-
|
556
|
-
|
556
|
+
if @options.result_log?
|
557
|
+
puts <<-EOS
|
557
558
|
|
558
|
-
|
559
|
-
|
560
|
-
|
561
|
-
|
562
|
-
|
563
|
-
|
559
|
+
(Save to `#{@options.result_log}`)
|
560
|
+
EOS
|
561
|
+
|
562
|
+
open(@options.result_log, 'wb') do |f|
|
563
|
+
f.puts JSON.pretty_generate({
|
564
|
+
'StackName' => stack_name,
|
565
|
+
'StackResourceSummaries' => summaries,
|
566
|
+
'Outputs' => outputs,
|
567
|
+
})
|
568
|
+
end
|
564
569
|
end
|
565
570
|
end
|
566
571
|
|
data/lib/kumogata/utils.rb
CHANGED
@@ -17,6 +17,25 @@ class Kumogata::Utils
|
|
17
17
|
a_zA_Z0_9 = (('a'..'z').to_a + ('A'..'Z').to_a + ('0'..'9').to_a)
|
18
18
|
a_zA_Z0_9.sample(n).join
|
19
19
|
end
|
20
|
+
|
21
|
+
def filter_backtrace(backtrace)
|
22
|
+
filter_path = ['(eval)']
|
23
|
+
|
24
|
+
if defined?(Gem)
|
25
|
+
filter_path.concat(Gem.path)
|
26
|
+
end
|
27
|
+
|
28
|
+
RbConfig::CONFIG.select {|k, v|
|
29
|
+
k.to_s =~ /libdir/
|
30
|
+
}.each {|k, v| filter_path << v }
|
31
|
+
|
32
|
+
filter_path = filter_path.map {|i| /\A#{Regexp.escape(i)}/ }
|
33
|
+
|
34
|
+
backtrace.select do |path|
|
35
|
+
path = path.split(':', 2).first
|
36
|
+
not filter_path.any? {|i| i =~ path }
|
37
|
+
end
|
38
|
+
end
|
20
39
|
end # of class methods
|
21
40
|
end
|
22
41
|
|
data/lib/kumogata/version.rb
CHANGED
data/lib/kumogata.rb
CHANGED
@@ -14,6 +14,7 @@ require 'net/ssh'
|
|
14
14
|
require 'open-uri'
|
15
15
|
require 'open3'
|
16
16
|
require 'optparse'
|
17
|
+
require 'rbconfig'
|
17
18
|
require 'retryable'
|
18
19
|
require 'set'
|
19
20
|
require 'singleton'
|
@@ -22,7 +23,6 @@ require 'term/ansicolor'
|
|
22
23
|
require 'thread'
|
23
24
|
require 'uuidtools'
|
24
25
|
|
25
|
-
require 'kumogata/argument_parser'
|
26
26
|
require 'kumogata/client'
|
27
27
|
require 'kumogata/crypt'
|
28
28
|
require 'kumogata/ext/coderay_ext'
|
@@ -77,11 +77,11 @@ Outputs do
|
|
77
77
|
end
|
78
78
|
EOS
|
79
79
|
|
80
|
-
Timecop.freeze(Time.
|
80
|
+
Timecop.freeze(Time.utc(2014)) do
|
81
81
|
run_client(:update, :arguments => ['MyStack'], :template => template, :options => {:deletion_policy_retain => true}) do |client, cf|
|
82
82
|
template = eval_template(template, :update_deletion_policy => true)
|
83
83
|
template["Resources"]["myEC2Instance"]["Metadata"] = {
|
84
|
-
"DeletionPolicyUpdateKeyForKumogata" => "
|
84
|
+
"DeletionPolicyUpdateKeyForKumogata" => "DeletionPolicyUpdateValueForKumogata1388534400"
|
85
85
|
}
|
86
86
|
json = template.to_json
|
87
87
|
client.should_receive(:print_event_log).once
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kumogata
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Genki Sugawara
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-03-
|
11
|
+
date: 2014-03-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aws-sdk
|
@@ -58,14 +58,14 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - '>='
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 0.2.
|
61
|
+
version: 0.2.6
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - '>='
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: 0.2.
|
68
|
+
version: 0.2.6
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: hashie
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|