hygroscope 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/hygroscope.gemspec +1 -1
- data/lib/hygroscope/cli.rb +44 -8
- data/lib/hygroscope/stack.rb +3 -3
- data/lib/hygroscope/template.rb +8 -7
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6cf0c838143e22c457350f92b2464989b275af06
|
4
|
+
data.tar.gz: 16166f857257972e8ee90181d793a31bbebb9885
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 91e264b2ecca6188a62bb028388c3e51e7a21a426e6bc1a9370f44c83464beb82483f81a5cbc52edddd6f52ddcf2a989d32e317f4d87ce9634a13ead72b803be
|
7
|
+
data.tar.gz: d34c7c519cf094024ef5db03c5eed7e58be60bb330e2aad99f0adf037568961ce3965b78211ce7d4e7541c15731858f3c4dea19f5c2c03896290fdab7e69c5ba
|
data/CHANGELOG.md
ADDED
data/hygroscope.gemspec
CHANGED
data/lib/hygroscope/cli.rb
CHANGED
@@ -66,8 +66,6 @@ module Hygroscope
|
|
66
66
|
# If the paramset exists load it, otherwise instantiate an empty one
|
67
67
|
p = Hygroscope::ParamSet.new(options[:paramset])
|
68
68
|
|
69
|
-
# TODO: Load and merge outputs from previous invocations -- how???
|
70
|
-
|
71
69
|
# User provided a paramset, so load it and determine which parameters
|
72
70
|
# are set and which need to be prompted.
|
73
71
|
if options[:paramset]
|
@@ -86,31 +84,55 @@ module Hygroscope
|
|
86
84
|
missing = t.parameters.keys
|
87
85
|
end
|
88
86
|
|
87
|
+
# If an existing stack was specified, load its outputs
|
88
|
+
if options[:existing]
|
89
|
+
e = Hygroscope::Stack.new(options[:existing])
|
90
|
+
say_status('info', "Populating parameters from #{options[:existing]} stack", :blue)
|
91
|
+
|
92
|
+
# Fill any template paramater that matches an output of existing stack,
|
93
|
+
# overriding parameters in the paramset. User can still change these if
|
94
|
+
# they were missing from paramset or --ask option is passed.
|
95
|
+
e.describe.outputs.each do |o|
|
96
|
+
p.set(o.output_key, o.output_value) if t.parameters.keys.include?(o.output_key)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
89
100
|
# Prompt for each missing param and save it to the paramset
|
90
101
|
missing.each do |key|
|
91
102
|
# Do not prompt for keys prefixed with "Hygroscope"
|
92
103
|
next if key =~ /^Hygroscope/
|
93
104
|
|
94
|
-
say()
|
95
105
|
type = t.parameters[key]['Type']
|
96
|
-
default =
|
106
|
+
default = p.get(key) ? p.get(key) : t.parameters[key]['Default'] || ''
|
97
107
|
description = t.parameters[key]['Description'] || false
|
98
108
|
values = t.parameters[key]['AllowedValues'] || false
|
99
109
|
no_echo = t.parameters[key]['NoEcho'] || false
|
100
110
|
|
111
|
+
# Thor conveniently provides some nice logic for formatting,
|
112
|
+
# allowing defaults, and validating user input
|
101
113
|
ask_opts = {}
|
102
|
-
ask_opts[:default] = default unless default.empty?
|
114
|
+
ask_opts[:default] = default unless default.to_s.empty?
|
103
115
|
ask_opts[:limited_to] = values if values
|
104
116
|
ask_opts[:echo] = false if no_echo
|
105
117
|
|
118
|
+
puts
|
106
119
|
say("#{description} (#{type})") if description
|
107
|
-
|
120
|
+
# Make sure user enters a value
|
108
121
|
# TODO: Better input validation
|
122
|
+
answer = ''
|
109
123
|
answer = ask(key, :cyan, ask_opts) until answer != ''
|
124
|
+
|
125
|
+
# Save answer to paramset object
|
110
126
|
p.set(key, answer)
|
127
|
+
|
128
|
+
# Add a line break
|
129
|
+
say if no_echo
|
111
130
|
end
|
112
131
|
|
113
|
-
|
132
|
+
# Offer to save paramset if it was modified
|
133
|
+
# Filter out keys beginning with "Hygroscope" since they are not visible
|
134
|
+
# to the user and may be modified on each invocation.
|
135
|
+
unless missing.reject {|k| k =~ /^Hygroscope/}.empty?
|
114
136
|
if yes?('Save changes to paramset?')
|
115
137
|
unless options[:paramset]
|
116
138
|
p.name = ask('Paramset name', :cyan, default: options[:name])
|
@@ -135,7 +157,7 @@ module Hygroscope
|
|
135
157
|
[t, p]
|
136
158
|
end
|
137
159
|
|
138
|
-
desc 'create', "Create a new stack.\nUse the --name option to launch more than one stack from the same template.\nCommand prompts for parameters unless --paramset is specified."
|
160
|
+
desc 'create', "Create a new stack.\nUse the --name option to launch more than one stack from the same template.\nCommand prompts for parameters unless --paramset is specified.\nUse --existing to set parameters from an existing stack's outputs."
|
139
161
|
method_option :name,
|
140
162
|
aliases: '-n',
|
141
163
|
default: File.basename(Dir.pwd),
|
@@ -144,6 +166,10 @@ module Hygroscope
|
|
144
166
|
aliases: '-p',
|
145
167
|
required: false,
|
146
168
|
desc: 'Name of saved paramset to use (optional)'
|
169
|
+
method_option :existing,
|
170
|
+
aliases: '-e',
|
171
|
+
required: false,
|
172
|
+
desc: 'Name of an existing stack from which to retrieve outputs as parameters (optional)'
|
147
173
|
method_option :ask,
|
148
174
|
aliases: '-a',
|
149
175
|
type: :boolean,
|
@@ -152,6 +178,8 @@ module Hygroscope
|
|
152
178
|
def create
|
153
179
|
check_path
|
154
180
|
validate
|
181
|
+
|
182
|
+
# Prepare task takes care of shared logic between "create" and "update"
|
155
183
|
template, paramset = prepare
|
156
184
|
|
157
185
|
s = Hygroscope::Stack.new(options[:name])
|
@@ -159,6 +187,7 @@ module Hygroscope
|
|
159
187
|
s.template = template.compress
|
160
188
|
s.tags['X-Hygroscope-Template'] = File.basename(Dir.pwd)
|
161
189
|
s.capabilities = ['CAPABILITY_IAM']
|
190
|
+
|
162
191
|
s.create!
|
163
192
|
|
164
193
|
status
|
@@ -184,6 +213,8 @@ module Hygroscope
|
|
184
213
|
# whether to re-upload the payload, etc.)
|
185
214
|
check_path
|
186
215
|
validate
|
216
|
+
|
217
|
+
# Prepare task takes care of shared logic between "create" and "update"
|
187
218
|
template, paramset = prepare
|
188
219
|
|
189
220
|
s = Hygroscope::Stack.new(options[:name])
|
@@ -240,9 +271,12 @@ module Hygroscope
|
|
240
271
|
print_table header
|
241
272
|
puts
|
242
273
|
|
274
|
+
# Fancy acrobatics to fit output to terminal width. If the terminal
|
275
|
+
# window is too small, fallback to something appropriate for ~80 chars
|
243
276
|
type_width = terminal_width < 80 ? 30 : terminal_width - 50
|
244
277
|
output_width = terminal_width < 80 ? 54 : terminal_width - 31
|
245
278
|
|
279
|
+
# Header row
|
246
280
|
puts set_color(sprintf(' %-28s %-*s %-18s ', 'Resource', type_width, 'Type', 'Status'), :white, :on_blue)
|
247
281
|
resources = stack.list_resources
|
248
282
|
resources.each do |r|
|
@@ -250,6 +284,7 @@ module Hygroscope
|
|
250
284
|
end
|
251
285
|
|
252
286
|
if s.stack_status.downcase =~ /complete$/
|
287
|
+
# If the stack is complete display any available outputs and stop refreshing
|
253
288
|
puts
|
254
289
|
puts set_color(sprintf(' %-28s %-*s ', 'Output', output_width, 'Value'), :white, :on_yellow)
|
255
290
|
s.outputs.each do |o|
|
@@ -259,6 +294,7 @@ module Hygroscope
|
|
259
294
|
puts "\nMore information: https://console.aws.amazon.com/cloudformation/home"
|
260
295
|
break
|
261
296
|
elsif s.stack_status.downcase =~ /failed$/
|
297
|
+
# If the stack failed to create, stop refreshing
|
262
298
|
puts "\nMore information: https://console.aws.amazon.com/cloudformation/home"
|
263
299
|
break
|
264
300
|
else
|
data/lib/hygroscope/stack.rb
CHANGED
@@ -22,7 +22,7 @@ module Hygroscope
|
|
22
22
|
@parameters.each do |k, v|
|
23
23
|
stack_parameters << {
|
24
24
|
parameter_key: k,
|
25
|
-
parameter_value: v
|
25
|
+
parameter_value: v.to_s
|
26
26
|
}
|
27
27
|
end
|
28
28
|
|
@@ -30,7 +30,7 @@ module Hygroscope
|
|
30
30
|
@tags.each do |k, v|
|
31
31
|
stack_tags << {
|
32
32
|
key: k,
|
33
|
-
value: v
|
33
|
+
value: v.to_s
|
34
34
|
}
|
35
35
|
end
|
36
36
|
|
@@ -59,7 +59,7 @@ module Hygroscope
|
|
59
59
|
@parameters.each do |k, v|
|
60
60
|
stack_parameters << {
|
61
61
|
parameter_key: k,
|
62
|
-
parameter_value: v
|
62
|
+
parameter_value: v.to_s
|
63
63
|
}
|
64
64
|
end
|
65
65
|
|
data/lib/hygroscope/template.rb
CHANGED
@@ -26,12 +26,13 @@ module Hygroscope
|
|
26
26
|
cfoo.process(*files)
|
27
27
|
end
|
28
28
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
29
|
+
fail(TemplateYamlParseError, err.string) unless err.string.empty?
|
30
|
+
|
31
|
+
# Substitute
|
32
|
+
# APP_CONFIG = YAML.load(ERB.new(File.read("#{Rails.root}/config/app_config.yml")).result)[Rails.env]
|
33
|
+
#
|
34
|
+
@template = out.string
|
35
|
+
@template
|
35
36
|
end
|
36
37
|
|
37
38
|
def compress
|
@@ -58,7 +59,7 @@ module Hygroscope
|
|
58
59
|
# Parsing the template to JSON and then re-outputting it is a form of
|
59
60
|
# compression (removing all extra spaces) to keep within the 50KB limit
|
60
61
|
# for CloudFormation templates.
|
61
|
-
template =
|
62
|
+
template = compress
|
62
63
|
|
63
64
|
begin
|
64
65
|
stack = Hygroscope::Stack.new('template-validator')
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hygroscope
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Silverman
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-02-
|
11
|
+
date: 2015-02-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -130,6 +130,7 @@ extensions: []
|
|
130
130
|
extra_rdoc_files: []
|
131
131
|
files:
|
132
132
|
- ".gitignore"
|
133
|
+
- CHANGELOG.md
|
133
134
|
- Gemfile
|
134
135
|
- LICENSE.txt
|
135
136
|
- README.md
|
@@ -162,8 +163,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
162
163
|
version: '0'
|
163
164
|
requirements: []
|
164
165
|
rubyforge_project:
|
165
|
-
rubygems_version: 2.
|
166
|
+
rubygems_version: 2.2.0
|
166
167
|
signing_key:
|
167
168
|
specification_version: 4
|
168
169
|
summary: CloudFormation launcher
|
169
170
|
test_files: []
|
171
|
+
has_rdoc:
|