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 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