autostacker24 1.0.66 → 1.0.67

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3d6747b5745a81e573c4b64039bf0c291605510f
4
- data.tar.gz: c9359f7c97474cb3956f3f1c819b74523b29856e
3
+ metadata.gz: 011e9bdc25672f70fe6bf1a96cce80ca7f6e0ff0
4
+ data.tar.gz: d57dfb2d268cac5631ce12bf80b919a06edf692d
5
5
  SHA512:
6
- metadata.gz: 6bb8f3554b3376e5ba41e4eb37a354ad896541dd4d914db347d0239e2e08896fe3270d7177f1879aa7c4224695628afd82bf52885a136cae1451b92d277ae1b1
7
- data.tar.gz: 474d7bf2809aa6bf37174607afaa6deb1c8c3d31673928e559ce54c57fdac4d42ce03cab1cee112d700b8e727948974355b101330fb9211a818538c488a63443
6
+ metadata.gz: 65d6effa19097bfa665fdc6e582d4f4d75c8cf0d899bec0a7bad6fa4f07e5cb37335146803ae2f895e90a33b0b20326ba11db327dbbcc8cc08a2ca515e724131
7
+ data.tar.gz: 7ef99ef3dce94265d32addd34bb6d621c1f2f633450a327a6fd97df3e9e9cc266520bc67ed2b6667333e3e40edb0b302fca446b831fdacaeeecc6b97c4fdf725
@@ -3,23 +3,71 @@
3
3
  require 'optparse'
4
4
  require 'autostacker24'
5
5
 
6
- def parse_options(argv)
7
- params = {}
8
- parser = OptionParser.new
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
- command = ARGV[0]
17
- params = parse_options(ARGV)
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
- if command == "validate"
20
- Stacker.validate_template(params[:template])
21
- elsif command == "preprocess"
22
- puts Stacker.template_body(params[:template])
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
- events = cloud_formation.describe_stack_events(stack_name: stack_name_or_id).data.stack_events
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 =~ /^\s*\/{2}\s*/i
11
- template = preprocess_json(parse_json(template)).to_json
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 = /^@file:\/\/(.*)/.match(s)
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 /^@/ then parse_ref(token)
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 = /^@([^\[]*)(\[([^,]*)(\s*,\s*(.*))?\])?$/.match(token)
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.66
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-11 00:00:00.000000000 Z
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