bora 0.9.4 → 1.0.0.beta1

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.
@@ -0,0 +1,132 @@
1
+ require 'rake/tasklib'
2
+
3
+ class Bora
4
+ class StackTasks < Rake::TaskLib
5
+ def initialize(stack)
6
+ @stack = stack
7
+ define_tasks
8
+ end
9
+
10
+
11
+ protected
12
+
13
+ def define_tasks
14
+ define_apply_task
15
+ define_delete_task
16
+ define_diff_task
17
+ define_events_task
18
+ define_outputs_task
19
+ define_recreate_task
20
+ define_show_task
21
+ define_show_current_task
22
+ define_status_task
23
+ define_validate_task
24
+ end
25
+
26
+ def define_apply_task
27
+ within_namespace do
28
+ desc "Creates (or updates) the '#{@stack.stack_name}' stack"
29
+ task :apply do |_, args|
30
+ @stack.apply(extract_params_from_args(args.extras))
31
+ end
32
+ end
33
+ end
34
+
35
+ def define_delete_task
36
+ within_namespace do
37
+ desc "Deletes the '#{@stack.stack_name}' stack"
38
+ task :delete do
39
+ @stack.delete
40
+ end
41
+ end
42
+ end
43
+
44
+ def define_diff_task
45
+ within_namespace do
46
+ desc "Diffs the new template with the '#{@stack.stack_name}' stack's current template"
47
+ task :diff do |_, args|
48
+ @stack.diff(extract_params_from_args(args.extras))
49
+ end
50
+ end
51
+ end
52
+
53
+ def define_events_task
54
+ within_namespace do
55
+ desc "Outputs the latest events from the '#{@stack.stack_name}' stack"
56
+ task :events do
57
+ @stack.events
58
+ end
59
+ end
60
+ end
61
+
62
+ def define_outputs_task
63
+ within_namespace do
64
+ desc "Shows the outputs from the '#{@stack.stack_name}' stack"
65
+ task :outputs do
66
+ @stack.outputs
67
+ end
68
+ end
69
+ end
70
+
71
+ def define_recreate_task
72
+ within_namespace do
73
+ desc "Recreates (deletes then creates) the '#{@stack.stack_name}' stack"
74
+ task :recreate do |_, args|
75
+ @stack.recreate(extract_params_from_args(args.extras))
76
+ end
77
+ end
78
+ end
79
+
80
+ def define_show_task
81
+ within_namespace do
82
+ desc "Shows the new template for '#{@stack.stack_name}' stack"
83
+ task :show do |_, args|
84
+ @stack.show(self.extract_params_from_args(args.extras))
85
+ end
86
+ end
87
+ end
88
+
89
+ def define_show_current_task
90
+ within_namespace do
91
+ desc "Shows the current template for '#{@stack.stack_name}' stack"
92
+ task :show_current do
93
+ @stack.show_current
94
+ end
95
+ end
96
+ end
97
+
98
+ def define_status_task
99
+ within_namespace do
100
+ desc "Displays the current status of the '#{@stack.stack_name}' stack"
101
+ task :status do
102
+ @stack.status
103
+ end
104
+ end
105
+ end
106
+
107
+ def define_validate_task
108
+ within_namespace do
109
+ desc "Checks the '#{@stack.stack_name}' stack's template for validity"
110
+ task :validate do |_, args|
111
+ @stack.validate(extract_params_from_args(args.extras))
112
+ end
113
+ end
114
+ end
115
+
116
+ def within_namespace
117
+ namespace :stack do
118
+ namespace @stack.stack_name do
119
+ yield
120
+ end
121
+ end
122
+ end
123
+
124
+
125
+ protected
126
+
127
+ def extract_params_from_args(args)
128
+ args ? Hash[args.map { |arg| arg.split("=", 2) }] : {}
129
+ end
130
+
131
+ end
132
+ end
data/lib/bora/tasks.rb CHANGED
@@ -1,12 +1,17 @@
1
1
  require 'colorize'
2
2
  require 'rake/tasklib'
3
- require 'bora/stack'
3
+ require 'bora/cfn/stack'
4
4
 
5
- module Bora
5
+ class Bora
6
6
  class Tasks < Rake::TaskLib
7
7
  def initialize(stack_name, template_uri = nil)
8
+ puts "--------------------------------------------------------------------------------"
9
+ puts "Bora::Tasks is deprecated. Please use YAML based configuration instead."
10
+ puts "See http://ampedandwired.com/bora for more information."
11
+ puts "--------------------------------------------------------------------------------"
12
+
8
13
  @stack_name = stack_name
9
- @stack = Stack.new(stack_name)
14
+ @stack = Cfn::Stack.new(stack_name)
10
15
  @colorize = true
11
16
  @stack_options = {}
12
17
  within_namespace { yield self } if block_given?
@@ -0,0 +1,37 @@
1
+ require 'bora/stack'
2
+
3
+ class Bora
4
+ class Template
5
+ def initialize(template_name, template_config)
6
+ @template_name = template_name
7
+ @template_config = template_config
8
+ @stacks = {}
9
+ template_config['stacks'].each do |stack_name, stack_config|
10
+ stack_name = "#{template_name}-#{stack_name}"
11
+ stack_config = resolve_stack_config(template_config, stack_config)
12
+ @stacks[stack_name] = Stack.new(stack_name, template_config['template_file'], stack_config)
13
+ end
14
+ end
15
+
16
+ def stack(name)
17
+ @stacks[name]
18
+ end
19
+
20
+ def rake_tasks
21
+ @stacks.each { |_, s| s.rake_tasks }
22
+ end
23
+
24
+
25
+ private
26
+
27
+ def resolve_stack_config(template_config, stack_config)
28
+ extract_cfn_options(template_config).merge(stack_config)
29
+ end
30
+
31
+ def extract_cfn_options(config)
32
+ valid_options = ["capabilities"]
33
+ config.select { |k| valid_options.include?(k) }
34
+ end
35
+
36
+ end
37
+ end
data/lib/bora/version.rb CHANGED
@@ -1,3 +1,3 @@
1
- module Bora
2
- VERSION = "0.9.4"
1
+ class Bora
2
+ VERSION = "1.0.0.beta1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bora
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.4
4
+ version: 1.0.0.beta1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Charles Blaxland
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-03-29 00:00:00.000000000 Z
11
+ date: 2016-04-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: '10.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: thor
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0.19'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '0.19'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: bundler
85
99
  requirement: !ruby/object:Gem::Requirement
@@ -111,7 +125,8 @@ dependencies:
111
125
  description:
112
126
  email:
113
127
  - charles.blaxland@gmail.com
114
- executables: []
128
+ executables:
129
+ - bora
115
130
  extensions: []
116
131
  extra_rdoc_files: []
117
132
  files:
@@ -124,15 +139,19 @@ files:
124
139
  - bin/console
125
140
  - bin/setup
126
141
  - bora.gemspec
142
+ - exe/bora
127
143
  - lib/bora.rb
144
+ - lib/bora/cfn/event.rb
145
+ - lib/bora/cfn/output.rb
146
+ - lib/bora/cfn/stack.rb
147
+ - lib/bora/cfn/stack_status.rb
148
+ - lib/bora/cfn/status.rb
128
149
  - lib/bora/cfn_param_resolver.rb
129
- - lib/bora/event.rb
130
- - lib/bora/output.rb
131
- - lib/bora/rake_tasks.rb
150
+ - lib/bora/cli.rb
132
151
  - lib/bora/stack.rb
133
- - lib/bora/stack_status.rb
134
- - lib/bora/status.rb
152
+ - lib/bora/stack_tasks.rb
135
153
  - lib/bora/tasks.rb
154
+ - lib/bora/template.rb
136
155
  - lib/bora/version.rb
137
156
  homepage: https://github.com/ampedandwired/bora
138
157
  licenses: []
@@ -148,9 +167,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
148
167
  version: '0'
149
168
  required_rubygems_version: !ruby/object:Gem::Requirement
150
169
  requirements:
151
- - - ">="
170
+ - - ">"
152
171
  - !ruby/object:Gem::Version
153
- version: '0'
172
+ version: 1.3.1
154
173
  requirements: []
155
174
  rubyforge_project:
156
175
  rubygems_version: 2.4.5.1
data/lib/bora/event.rb DELETED
@@ -1,31 +0,0 @@
1
- require 'bora/status'
2
-
3
- module Bora
4
- class Event
5
- def initialize(event)
6
- @event = event
7
- @status = Status.new(@event.resource_status)
8
- end
9
-
10
- def method_missing(sym, *args, &block)
11
- @event.send(sym, *args, &block)
12
- end
13
-
14
- def status_success?
15
- @status.success?
16
- end
17
-
18
- def status_failure?
19
- @status.failure?
20
- end
21
-
22
- def status_complete?
23
- status_success? || status_failure?
24
- end
25
-
26
- def to_s
27
- status_reason = @event.resource_status_reason ? " - #{@event.resource_status_reason}" : ""
28
- "#{@event.timestamp.getlocal} - #{@event.resource_type} - #{@event.logical_resource_id} - #{@status}#{status_reason}"
29
- end
30
- end
31
- end
data/lib/bora/output.rb DELETED
@@ -1,20 +0,0 @@
1
- module Bora
2
- class Output
3
- def initialize(output)
4
- @output = output
5
- end
6
-
7
- def key
8
- @output.output_key
9
- end
10
-
11
- def value
12
- @output.output_value
13
- end
14
-
15
- def to_s
16
- desc = @output.description ? " (#{@output.description})" : ""
17
- "#{@output.output_key} - #{@output.output_value} #{desc}"
18
- end
19
- end
20
- end
@@ -1,107 +0,0 @@
1
- require 'tempfile'
2
- require 'yaml'
3
- require 'colorize'
4
- require 'rake/tasklib'
5
- require 'cfndsl'
6
- require 'bora/tasks'
7
- require 'bora/cfn_param_resolver'
8
-
9
- module Bora
10
- class RakeTasks < Rake::TaskLib
11
- def initialize(config_file_or_hash)
12
- define_templates(load_config(config_file_or_hash))
13
- end
14
-
15
-
16
- private
17
-
18
- def define_templates(config)
19
- config['templates'].each do |template_name, template_config|
20
- define_stacks(template_name, template_config)
21
- end
22
- end
23
-
24
- def define_stacks(template_name, template_config)
25
- template_file = template_config['template_file']
26
- template_config['stacks'].each do |stack_name, stack_config|
27
- stack_name = stack_config['stack_name'] || "#{template_name}-#{stack_name}"
28
- stack_options = extract_stack_options(template_config)
29
- define_tasks(template_file, stack_name, stack_config, stack_options)
30
- end
31
- end
32
-
33
- def define_tasks(template_file, stack_name, stack_config, stack_options)
34
- Bora::Tasks.new(stack_name) do |t|
35
- t.stack_options = stack_options
36
-
37
- task :generate do |_, args|
38
- params = extract_params(stack_config, args)
39
-
40
- if File.extname(template_file) == ".rb"
41
- template_body = run_cfndsl(template_file, params)
42
- template_json = JSON.parse(template_body)
43
- if template_json["Parameters"]
44
- cfn_param_keys = template_json["Parameters"].keys
45
- cfn_params = params.select { |k, v| cfn_param_keys.include?(k) }.map do |k, v|
46
- { parameter_key: k, parameter_value: v }
47
- end
48
- t.stack_options[:parameters] = cfn_params if !cfn_params.empty?
49
- end
50
- t.stack_options[:template_body] = template_body
51
- else
52
- t.stack_options[:template_url] = template_file
53
- if !params.empty?
54
- t.stack_options[:parameters] = params.map do |k, v|
55
- { parameter_key: k, parameter_value: v }
56
- end
57
- end
58
- end
59
- end
60
- end
61
- end
62
-
63
- def run_cfndsl(template_file, params)
64
- temp_extras = Tempfile.new("bora")
65
- temp_extras.write(params.to_yaml)
66
- temp_extras.close
67
- template_body = CfnDsl.eval_file_with_extras(template_file, [[:yaml, temp_extras.path]]).to_json
68
- temp_extras.unlink
69
- template_body
70
- end
71
-
72
- def extract_stack_options(config)
73
- valid_options = ["capabilities"]
74
- config.select { |k| valid_options.include?(k) }
75
- end
76
-
77
- def extract_params(stack_config, args)
78
- params = stack_config['params'] || {}
79
- params.merge!(extract_params_from_args(args.extras))
80
- params.map { |k, v| [k, process_param_substitutions(v)] }.to_h
81
- end
82
-
83
- def process_param_substitutions(val)
84
- old_val = nil
85
- while old_val != val
86
- old_val = val
87
- val = val.sub(/\${[^}]+}/) do |m|
88
- token = m[2..-2]
89
- CfnParamResolver.new(token).resolve
90
- end
91
- end
92
- val
93
- end
94
-
95
- def extract_params_from_args(args)
96
- args ? Hash[args.map { |arg| arg.split("=", 2) }] : {}
97
- end
98
-
99
- def load_config(config)
100
- if config.class == String
101
- return YAML.load_file(config)
102
- elsif config.class == Hash
103
- return config
104
- end
105
- end
106
- end
107
- end
@@ -1,29 +0,0 @@
1
- require 'bora/status'
2
-
3
- module Bora
4
- class StackStatus
5
- def initialize(underlying_stack)
6
- @stack = underlying_stack
7
- if @stack
8
- @status = Status.new(@stack.stack_status)
9
- end
10
- end
11
-
12
- def exists?
13
- @status && !@status.deleted?
14
- end
15
-
16
- def success?
17
- @status && @status.success?
18
- end
19
-
20
- def to_s
21
- if @stack
22
- status_reason = @stack.stack_status_reason ? " - #{@stack.stack_status_reason}" : ""
23
- "#{@stack.stack_name} - #{@status}#{status_reason}"
24
- else
25
- "Stack does not exist"
26
- end
27
- end
28
- end
29
- end