bora 0.2.0 → 0.3.0

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: a3bef88ac6bd7773175b02930da53efe7de03ec7
4
- data.tar.gz: 450388c3e3ffc40c353ed09af8a79b8bf2223c13
3
+ metadata.gz: c1bb37a94a96c16d392746dd4b9fde60bf77f598
4
+ data.tar.gz: 33b5fa1b0aefa84de3bffaaba26ca7868381e7ee
5
5
  SHA512:
6
- metadata.gz: 0b7cc4b0e82bf2eb5c9ba59e95600f890296b7dcb1409177dccff2373a7b99b74c5664b95bacc96a3d597ff1cdfa477164489b623a05d8a20972f9e9e9abe142
7
- data.tar.gz: 770f772c1df360fc90dfe7bb1efa031e537aa110a11638fb3bda947dc3c08a45b48810e28f4598bcd7ea7efc169ed35a395530c6545fbfd0a0925706af01a285
6
+ metadata.gz: bd85e49e097d8aa0519601152b6e342d391012c6d6b70d02eae06dd3073382c760d0adb5cdc5ae5e2973b1b5278f697b3fe1f5e4512157cd2d37d989f6b8d33d
7
+ data.tar.gz: 3f91f89e9fdd73faba4a40b8da1df84d2f70254efb3de207c31b9004d62cd0ee7f9f376a3ed642f4cf444d4b23745da9e1428d35f4c84fecc80ebcd664c65e92
data/README.md CHANGED
@@ -1,11 +1,7 @@
1
1
  # Bora
2
2
 
3
- > 1. A cold and often gusty katabatic wind in the Adriatic
4
- > 2. A tool for pushing around your cloud formations
5
-
6
3
  This gem contains Ruby [rake](https://github.com/ruby/rake) tasks that help you work with [CloudFormation](https://aws.amazon.com/cloudformation/) stacks.
7
- You don't need to use it with rake though - you can use the underlaying classes
8
- in any Ruby app.
4
+ You don't need to use it with rake though - you can use the underlying classes in any Ruby app.
9
5
 
10
6
 
11
7
  ## Installation
@@ -49,6 +45,9 @@ rake stack:example:delete # Deletes the example stack
49
45
  rake stack:example:diff # Diffs the new template with the example stack's current template
50
46
  rake stack:example:events # Outputs the latest events from the example stack
51
47
  rake stack:example:new_template # Shows the new template for example stack
48
+ rake stack:example:recreate # Recreates (deletes then creates) the example stack
49
+ rake stack:example:status # Displays the current status of the example stack
50
+ rake stack:example:validate # Checks the example stack's template for validity
52
51
  ```
53
52
 
54
53
  You can add as many templates as you like into your Rakefile, simply define an instance of `Bora::Tasks` for each one.
data/lib/bora.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require "bora/version"
2
+ require "bora/status"
2
3
  require "bora/event"
3
4
  require "bora/stack"
4
5
  require "bora/tasks"
data/lib/bora/event.rb CHANGED
@@ -1,9 +1,11 @@
1
1
  require 'colorize'
2
+ require 'bora/status'
2
3
 
3
4
  module Bora
4
5
  class Event
5
6
  def initialize(event)
6
7
  @event = event
8
+ @status = Status.new(@event.resource_status)
7
9
  end
8
10
 
9
11
  def method_missing(sym, *args, &block)
@@ -11,11 +13,11 @@ module Bora
11
13
  end
12
14
 
13
15
  def status_success?
14
- @event.resource_status.end_with?("_COMPLETE")
16
+ @status.success?
15
17
  end
16
18
 
17
19
  def status_failure?
18
- @event.resource_status.end_with?("_FAILED")
20
+ @status.failure?
19
21
  end
20
22
 
21
23
  def status_complete?
@@ -23,14 +25,8 @@ module Bora
23
25
  end
24
26
 
25
27
  def to_s(colorize = true)
26
- color = case
27
- when status_success?; :green
28
- when status_failure?; :red
29
- else; :yellow;
30
- end
31
- status = colorize ? @event.resource_status.colorize(color) : @event.resource_status
32
28
  status_reason = @event.resource_status_reason ? " - #{@event.resource_status_reason}" : ""
33
- "#{@event.timestamp} - #{@event.resource_type} - #{@event.logical_resource_id} - #{status}#{status_reason}"
29
+ "#{@event.timestamp.getlocal} - #{@event.resource_type} - #{@event.logical_resource_id} - #{@status.to_s(colorize)}#{status_reason}"
34
30
  end
35
31
  end
36
32
  end
data/lib/bora/stack.rb CHANGED
@@ -1,6 +1,8 @@
1
1
  require 'set'
2
2
  require 'aws-sdk'
3
3
  require 'diffy'
4
+ require 'bora/stack_status'
5
+ require 'bora/event'
4
6
 
5
7
  module Bora
6
8
  class Stack
@@ -22,6 +24,11 @@ module Bora
22
24
  exists? ? update(options, &block) : create(options, &block)
23
25
  end
24
26
 
27
+ def recreate(options, &block)
28
+ delete(&block) if exists?
29
+ create(options, &block) if !exists?
30
+ end
31
+
25
32
  def delete(&block)
26
33
  call_cfn_action(:delete, &block)
27
34
  end
@@ -53,13 +60,26 @@ module Bora
53
60
  Diffy::Diff.new(template, new_template(options))
54
61
  end
55
62
 
63
+ def validate(options)
64
+ @cfn.validate_template(options.select { |k| [:template_body, :template_url].include?(k) })
65
+ end
66
+
67
+ def status
68
+ StackStatus.new(underlying_stack)
69
+ end
70
+
56
71
  def exists?
57
- underlying_stack && underlying_stack.stack_status != 'DELETE_COMPLETE'
72
+ status.exists?
58
73
  end
59
74
 
60
75
 
76
+ # =============================================================================================
61
77
  private
62
78
 
79
+ def method_missing(sym, *args, &block)
80
+ underlying_stack ? underlying_stack.send(sym, *args, &block) : nil
81
+ end
82
+
63
83
  def call_cfn_action(action, options = {}, &block)
64
84
  underlying_stack(refresh: true)
65
85
  return true if action == :delete && !exists?
@@ -71,7 +91,7 @@ module Bora
71
91
  rescue Aws::CloudFormation::Errors::ValidationError => e
72
92
  raise e unless e.message.include?("No updates are to be performed")
73
93
  end
74
- (action == :delete && !underlying_stack) || underlying_stack.stack_status.end_with?('_COMPLETE')
94
+ (action == :delete && !underlying_stack) || status.success?
75
95
  end
76
96
 
77
97
  def wait_for_completion
@@ -0,0 +1,29 @@
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(colorize = true)
21
+ if @stack
22
+ status_reason = @stack.stack_status_reason ? " - #{@stack.stack_status_reason}" : ""
23
+ "#{@stack.stack_name} - #{@status.to_s(colorize)}#{status_reason}"
24
+ else
25
+ "Stack does not exist"
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,41 @@
1
+ require 'colorize'
2
+
3
+ module Bora
4
+ class Status
5
+ def initialize(status)
6
+ @status = status
7
+ end
8
+
9
+ def success?
10
+ @status.end_with?("_COMPLETE") && !@status.include?("ROLLBACK")
11
+ end
12
+
13
+ def failure?
14
+ @status.end_with?("_FAILED") || @status.include?("ROLLBACK")
15
+ end
16
+
17
+ def deleted?
18
+ @status == "DELETE_COMPLETE"
19
+ end
20
+
21
+ def complete?
22
+ success? || failure?
23
+ end
24
+
25
+ def to_s(colorize = true)
26
+ colorize ? @status.colorize(color) : @status
27
+ end
28
+
29
+
30
+ private
31
+
32
+ def color
33
+ case
34
+ when success?; :green
35
+ when failure?; :red
36
+ else; :yellow;
37
+ end
38
+ end
39
+
40
+ end
41
+ end
data/lib/bora/tasks.rb CHANGED
@@ -22,6 +22,9 @@ module Bora
22
22
  define_diff_task
23
23
  define_events_task
24
24
  define_new_template_task
25
+ define_recreate_task
26
+ define_status_task
27
+ define_validate_task
25
28
  end
26
29
 
27
30
  def define_apply_task
@@ -84,6 +87,33 @@ module Bora
84
87
  end
85
88
  end
86
89
 
90
+ def define_recreate_task
91
+ within_namespace do
92
+ desc "Recreates (deletes then creates) the #{@stack_name} stack"
93
+ task :recreate do
94
+ invoke_action("recreate", stack_options)
95
+ end
96
+ end
97
+ end
98
+
99
+ def define_status_task
100
+ within_namespace do
101
+ desc "Displays the current status of the #{@stack_name} stack"
102
+ task :status do
103
+ puts @stack.status
104
+ end
105
+ end
106
+ end
107
+
108
+ def define_validate_task
109
+ within_namespace do
110
+ desc "Checks the #{@stack_name} stack's template for validity"
111
+ task :validate do
112
+ puts "Template for stack '#{@stack_name}' is valid" if @stack.validate(stack_options)
113
+ end
114
+ end
115
+ end
116
+
87
117
  def invoke_action(action, *args)
88
118
  puts "#{action.capitalize} stack #{@stack_name}"
89
119
  success = @stack.send(action, *args) { |event| puts event.to_s(colorize) }
data/lib/bora/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Bora
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.0"
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.2.0
4
+ version: 0.3.0
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-01-15 00:00:00.000000000 Z
11
+ date: 2016-01-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk
@@ -113,6 +113,8 @@ files:
113
113
  - lib/bora.rb
114
114
  - lib/bora/event.rb
115
115
  - lib/bora/stack.rb
116
+ - lib/bora/stack_status.rb
117
+ - lib/bora/status.rb
116
118
  - lib/bora/tasks.rb
117
119
  - lib/bora/version.rb
118
120
  homepage: https://github.com/ampedandwired/bora