autostacker24 1.0.66 → 1.0.67
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/bin/autostacker24 +64 -16
- data/lib/autostacker24/stacker.rb +2 -1
- data/lib/autostacker24/template_preprocessor.rb +15 -7
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 011e9bdc25672f70fe6bf1a96cce80ca7f6e0ff0
|
4
|
+
data.tar.gz: d57dfb2d268cac5631ce12bf80b919a06edf692d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 65d6effa19097bfa665fdc6e582d4f4d75c8cf0d899bec0a7bad6fa4f07e5cb37335146803ae2f895e90a33b0b20326ba11db327dbbcc8cc08a2ca515e724131
|
7
|
+
data.tar.gz: 7ef99ef3dce94265d32addd34bb6d621c1f2f633450a327a6fd97df3e9e9cc266520bc67ed2b6667333e3e40edb0b302fca446b831fdacaeeecc6b97c4fdf725
|
data/bin/autostacker24
CHANGED
@@ -3,23 +3,71 @@
|
|
3
3
|
require 'optparse'
|
4
4
|
require 'autostacker24'
|
5
5
|
|
6
|
-
def
|
7
|
-
|
8
|
-
|
9
|
-
parser.on("--template VALUE", "template location") do |value|
|
10
|
-
params[:template] = value
|
11
|
-
end
|
12
|
-
parser.parse(argv)
|
13
|
-
return params
|
6
|
+
def error(msg)
|
7
|
+
puts "\nError: #{msg}\n\n#{USAGE}"
|
8
|
+
exit 1
|
14
9
|
end
|
15
10
|
|
16
|
-
|
17
|
-
|
11
|
+
def check_template(args)
|
12
|
+
error('--template missing or file not found') unless args.template && File.exists?(args.template)
|
13
|
+
end
|
14
|
+
|
15
|
+
def check_stack(args)
|
16
|
+
error('--stack name missing') unless args.stack
|
17
|
+
end
|
18
|
+
|
19
|
+
args = OpenStruct.new
|
20
|
+
args.region = ENV['AWS_REGION']
|
21
|
+
args.params = {}
|
22
|
+
parser = OptionParser.new do |opts|
|
23
|
+
opts.banner = 'Usage: autostacker24 command [options]'
|
24
|
+
opts.separator ''
|
25
|
+
opts.separator 'Commands:'
|
26
|
+
opts.separator "\tcreate\t\t create or update a stack"
|
27
|
+
opts.separator "\tdelete\t\t delete a stack"
|
28
|
+
opts.separator "\tpreprocess\t pretty print template after preprocessing"
|
29
|
+
opts.separator "\tvalidate\t validate the template"
|
30
|
+
opts.separator ''
|
31
|
+
opts.separator 'Options:'
|
32
|
+
opts.on('--template TEMPLATE', 'Path to template') {|v| args.template = v}
|
33
|
+
opts.on('--stack STACK', 'Name of stack') {|v| args.stack = v}
|
34
|
+
opts.on('--parent PARENT', 'Name of parent stack') {|v| args.parent = v}
|
35
|
+
opts.on('--region REGION', 'AWS region') {|v| args.region = v}
|
36
|
+
opts.on('--profile PROFILE', 'AWS profile (use aws configure)') {|v| args.profile = v}
|
37
|
+
opts.on('--param KEY=VALUE', 'Stack Parameter') {|v| args.params.store(*v.split('=')) }
|
38
|
+
opts.on('--help', 'Show this help') {|_| puts opts; exit!;}
|
39
|
+
opts.on('--version', 'Show version') {|_| puts `gem list autostacker24`; exit!;}
|
40
|
+
end
|
41
|
+
USAGE = parser.to_s
|
18
42
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
else
|
24
|
-
raise ArgumentError, "unknown command"
|
43
|
+
begin
|
44
|
+
parser.parse!(ARGV)
|
45
|
+
rescue OptionParser::ParseError => x
|
46
|
+
error(x)
|
25
47
|
end
|
48
|
+
|
49
|
+
error("one command expected, found #{ARGV.size}") if ARGV.size != 1
|
50
|
+
args.command = ARGV[0]
|
51
|
+
args.params = args.params.inject({}){|m, kv| m.merge(Hash[kv[0].to_sym, kv[1]])}
|
52
|
+
|
53
|
+
Stacker.region = args.region
|
54
|
+
Stacker.credentials = Aws::SharedCredentials(profile_name: args.profile) if args.profile
|
55
|
+
|
56
|
+
case args.command
|
57
|
+
when /validate/
|
58
|
+
check_template(args)
|
59
|
+
Stacker.validate_template(args.template)
|
60
|
+
when /create|update|create_or_update/
|
61
|
+
check_template(args)
|
62
|
+
check_stack(args)
|
63
|
+
Stacker.create_or_update_stack(args.stack, args.template, args.params, args.parent)
|
64
|
+
when /delete/
|
65
|
+
check_stack(args)
|
66
|
+
Stacker.delete_stack(args.stack)
|
67
|
+
when /preprocess|show/
|
68
|
+
check_template(args)
|
69
|
+
puts JSON.pretty_generate(JSON.parse(Stacker.template_body(args.template)))
|
70
|
+
else
|
71
|
+
error("unknown command '#{args.command}'")
|
72
|
+
end
|
73
|
+
|
@@ -52,6 +52,7 @@ module Stacker
|
|
52
52
|
tags: tags)
|
53
53
|
rescue Aws::CloudFormation::Errors::ValidationError => error
|
54
54
|
raise error unless error.message =~ /No updates are to be performed/i # may be flaky, do more research in API
|
55
|
+
puts "stack #{stack_name} is already up to date"
|
55
56
|
find_stack(stack_name)
|
56
57
|
else
|
57
58
|
wait_for_stack(stack_name, :update, seen_events)
|
@@ -162,7 +163,7 @@ module Stacker
|
|
162
163
|
end
|
163
164
|
|
164
165
|
def get_stack_events(stack_name_or_id)
|
165
|
-
|
166
|
+
cloud_formation.describe_stack_events(stack_name: stack_name_or_id).data.stack_events
|
166
167
|
end
|
167
168
|
|
168
169
|
def cloud_formation # lazy CloudFormation client
|
@@ -1,16 +1,20 @@
|
|
1
1
|
|
2
2
|
require 'json'
|
3
3
|
require 'set'
|
4
|
+
require 'yaml'
|
4
5
|
|
5
6
|
module AutoStacker24
|
6
7
|
|
7
8
|
module Preprocessor
|
8
9
|
|
9
10
|
def self.preprocess(template)
|
10
|
-
if template =~
|
11
|
-
template
|
11
|
+
if template =~ /\A\s*\{/
|
12
|
+
template
|
13
|
+
elsif template =~ /\A\s*\/{2}/
|
14
|
+
preprocess_json(parse_json(template)).to_json
|
15
|
+
else
|
16
|
+
preprocess_json(parse_yaml(template)).to_json
|
12
17
|
end
|
13
|
-
template
|
14
18
|
end
|
15
19
|
|
16
20
|
def self.parse_json(template)
|
@@ -21,6 +25,10 @@ module AutoStacker24
|
|
21
25
|
raise e
|
22
26
|
end
|
23
27
|
|
28
|
+
def self.parse_yaml(template)
|
29
|
+
YAML.load(template)
|
30
|
+
end
|
31
|
+
|
24
32
|
def self.preprocess_json(json)
|
25
33
|
if json.is_a?(Hash)
|
26
34
|
json.inject({}) do |m, (k, v)|
|
@@ -40,9 +48,9 @@ module AutoStacker24
|
|
40
48
|
end
|
41
49
|
|
42
50
|
def self.preprocess_user_data(s)
|
43
|
-
m =
|
51
|
+
m = /\A@file:\/\/(.*)/.match(s)
|
44
52
|
s = File.read(m[1]) if m
|
45
|
-
{'Fn::Base64' => s}
|
53
|
+
{'Fn::Base64' => preprocess_string(s)}
|
46
54
|
end
|
47
55
|
|
48
56
|
def self.preprocess_string(s)
|
@@ -50,7 +58,7 @@ module AutoStacker24
|
|
50
58
|
case token
|
51
59
|
when '@@' then '@'
|
52
60
|
when '@[' then '['
|
53
|
-
when
|
61
|
+
when /\A@/ then parse_ref(token)
|
54
62
|
else token
|
55
63
|
end
|
56
64
|
end
|
@@ -73,7 +81,7 @@ module AutoStacker24
|
|
73
81
|
end
|
74
82
|
|
75
83
|
def self.parse_ref(token)
|
76
|
-
m =
|
84
|
+
m = /\A@([^\[]*)(\[([^,]*)(\s*,\s*(.*))?\])?$/.match(token)
|
77
85
|
m1 = m[1]
|
78
86
|
m2 = m[3]
|
79
87
|
m3 = m[5]
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: autostacker24
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.67
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Johannes Mueller
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-03-
|
12
|
+
date: 2016-03-15 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: aws-sdk-core
|