yutani 0.1.18 → 0.1.19
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/lib/yutani/cli.rb +72 -34
- data/lib/yutani/utils.rb +12 -6
- data/lib/yutani/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 19392ae5e18da8ace5f0da1b75df60195b02344e
|
4
|
+
data.tar.gz: 58d4d3605b5364954891c45c7bd6b4db756e248d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 192cea6e367fbb41488479646ae933eb7931825566adb7ec9b654e4f40f0c045f6093f3068d597cd4ba4bd7b8949c0b691f5d0aaf2b56e4ef1dd2b4c287269a4
|
7
|
+
data.tar.gz: 8154a43329154a3466949852de0ba4d7bc20f6ad3fe79f7a248d34989ac5a889bd1789fe638299a5523fb9dc1f5b6802bc49b1c5b29983148cdc925dcce176ef
|
data/lib/yutani/cli.rb
CHANGED
@@ -50,9 +50,14 @@ module Yutani
|
|
50
50
|
Yutani.logger.info "Re-build triggered: #{a} added" unless a.empty?
|
51
51
|
Yutani.logger.info "Re-build triggered: #{d} deleted" unless d.empty?
|
52
52
|
|
53
|
-
|
54
|
-
|
55
|
-
|
53
|
+
begin
|
54
|
+
build
|
55
|
+
rescue Exception => e
|
56
|
+
Yutani.logger.error "#{e.class.name} #{e.message}"
|
57
|
+
#Yutani.logger.error Yutani::Cli.format_backtrace(e.backtrace) unless e.backtrace.empty?
|
58
|
+
else
|
59
|
+
Yutani.logger.info "Re-build finished successfully"
|
60
|
+
end
|
56
61
|
end.start
|
57
62
|
|
58
63
|
# exit cleanly upon Ctrl-C
|
@@ -70,42 +75,26 @@ module Yutani
|
|
70
75
|
puts Yutani::VERSION
|
71
76
|
end
|
72
77
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
if args.empty?
|
81
|
-
raise "No targets specified"
|
82
|
-
end
|
83
|
-
|
84
|
-
contents = files.inject({}) do |h, f|
|
85
|
-
h.merge!(JSON.parse(File.read(f)))
|
86
|
-
h
|
87
|
-
end
|
88
|
-
|
89
|
-
targets = contents['resource'].inject({}) do |h,(k,v)|
|
90
|
-
h[k] = v.select do |k,v|
|
91
|
-
(args - k.split('_')).empty?
|
78
|
+
%w(plan apply destroy).each do |tf_cmd|
|
79
|
+
desc tf_cmd, "Run terraform #{tf_cmd} with wildcard targets"
|
80
|
+
define_method tf_cmd do |*args|
|
81
|
+
# we only support json files
|
82
|
+
files = Dir.glob('*.tf.json')
|
83
|
+
if files.empty?
|
84
|
+
raise "Could not find any *.tf.json files"
|
92
85
|
end
|
93
|
-
h
|
94
|
-
end.reject{|k,v| v.empty? }
|
95
86
|
|
96
|
-
|
97
|
-
|
98
|
-
|
87
|
+
# merge contents of *.tf.json files into one hash
|
88
|
+
contents = files.inject({}) do |h, f|
|
89
|
+
h.merge!(JSON.parse(File.read(f)))
|
90
|
+
h
|
99
91
|
end
|
100
|
-
flags
|
101
|
-
end.flatten
|
102
92
|
|
103
|
-
|
104
|
-
|
93
|
+
new_args = []
|
94
|
+
expand_target_wildcard_args(new_args, args, contents)
|
105
95
|
|
106
|
-
|
107
|
-
|
108
|
-
%x/terraform #{name} #{args}/
|
96
|
+
Yutani::Utils.run_tf_command(tf_cmd, new_args)
|
97
|
+
end
|
109
98
|
end
|
110
99
|
|
111
100
|
desc 'init', 'Initialize with a basic setup'
|
@@ -147,6 +136,55 @@ module Yutani
|
|
147
136
|
|
148
137
|
private
|
149
138
|
|
139
|
+
# horror show, in dire need of a succint algorithm
|
140
|
+
def expand_target_wildcard_args(new_args, args, contents)
|
141
|
+
flag = args.shift
|
142
|
+
|
143
|
+
if flag == '-target'
|
144
|
+
target_val = args.shift
|
145
|
+
|
146
|
+
if target_val.nil?
|
147
|
+
raise "-target arg missing corresponding target resource"
|
148
|
+
end
|
149
|
+
|
150
|
+
# if no wildcard found, then pass through unaltered
|
151
|
+
if target_val !~ /\*/
|
152
|
+
new_args << '-target'
|
153
|
+
new_args << target_val
|
154
|
+
expand_target_wildcard_args(new_args, args, contents)
|
155
|
+
end
|
156
|
+
|
157
|
+
target_regex = Regexp.new('^' + target_val.gsub(/\*/, '.*') + '$')
|
158
|
+
|
159
|
+
tf_targets = []
|
160
|
+
contents['resource'].each do |resource_type,v|
|
161
|
+
v.each do |resource_name,_|
|
162
|
+
if "#{resource_type}.#{resource_name}" =~ target_regex
|
163
|
+
tf_targets << "#{resource_type}.#{resource_name}"
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
if tf_targets.empty?
|
169
|
+
# we didn't find any matches, so pass through unaltered and
|
170
|
+
# let TF throw error
|
171
|
+
new_args << '-target'
|
172
|
+
new_args << target_val
|
173
|
+
else
|
174
|
+
tf_targets.each do |target|
|
175
|
+
new_args << '-target'
|
176
|
+
new_args << target
|
177
|
+
end
|
178
|
+
end
|
179
|
+
elsif flag.nil?
|
180
|
+
return
|
181
|
+
else
|
182
|
+
new_args.push flag
|
183
|
+
end
|
184
|
+
|
185
|
+
expand_target_wildcard_args(new_args, args, contents)
|
186
|
+
end
|
187
|
+
|
150
188
|
def self.format_backtrace(bt)
|
151
189
|
"Backtrace: #{bt.join("\n from ")}"
|
152
190
|
end
|
data/lib/yutani/utils.rb
CHANGED
@@ -7,17 +7,23 @@ class Array
|
|
7
7
|
end
|
8
8
|
|
9
9
|
module Yutani
|
10
|
-
|
10
|
+
class IndifferentHash < Hash
|
11
11
|
include Hashie::Extensions::MergeInitializer
|
12
|
-
|
13
|
-
|
12
|
+
include Hashie::Extensions::IndifferentAccess
|
13
|
+
end
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
15
|
+
class DeepMergeHash < Hash
|
16
|
+
include Hashie::Extensions::DeepMerge
|
17
|
+
end
|
18
18
|
|
19
19
|
module Utils
|
20
20
|
class << self
|
21
|
+
def run_tf_command(cmd, *args)
|
22
|
+
command = ENV.fetch('TERRAFORM', 'terraform') + ' ' + cmd + ' ' + args.join(' ')
|
23
|
+
Yutani.logger.info command
|
24
|
+
exec(command)
|
25
|
+
end
|
26
|
+
|
21
27
|
def convert_symbols_to_strings_in_flat_hash(h)
|
22
28
|
h.inject({}) do |h, (k,v)|
|
23
29
|
k = k.is_a?(Symbol) ? k.to_s : k
|
data/lib/yutani/version.rb
CHANGED