elastic-beanstalk 0.2.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -69,7 +69,7 @@ The default is the 'development' environment, change this via command line by pr
69
69
  ### Step 4. Get some coffee
70
70
  This will take a while. We intend to provide an example in the wiki and/or samples dir that implements a [caching strategy detailed here](http://horewi.cz/faster-rails-3-deployments-to-aws-elastic-beanstalk.html) to speed up deployment.
71
71
 
72
- ## Rake Tasks
72
+ ## EB Rake Tasks
73
73
 
74
74
  rake eb:clobber # Remove any generated package
75
75
  rake eb:config # Setup AWS.config and merge/override environments into one resolved configuration
@@ -78,6 +78,19 @@ This will take a while. We intend to provide an example in the wiki and/or samp
78
78
  rake eb:package # Package zip source bundle for Elastic Beanstalk
79
79
  rake eb:show_config[version] # Show resolved configuration without doing anything
80
80
 
81
+ ## RDS Rake Tasks
82
+
83
+ RDS tasks are intended to make integration of RDS task into the deployment process simple.
84
+ i.e. create a snapshot before or after an `eb:deploy`, the following `rake` tasks exist:
85
+
86
+ rake eb:rds:create_snapshot[instance_id,snapshot_id] # Creates an RDS snapshot
87
+ rake eb:rds:instances # List RDS instances
88
+ rake eb:rds:snapshots # List RDS snapshots
89
+
90
+ For example, this would create a snapshot prior to the deployment (and migration) to version 1.1.0:
91
+
92
+ rake eb:rds:create_snapshot[acme, pre-1.1.0] eb:deploy[1.1.0]
93
+
81
94
  ## A real-world example
82
95
 
83
96
  Deploy version 1.1.3 of acme to production
@@ -35,4 +35,5 @@ Gem::Specification.new do |spec|
35
35
  spec.add_runtime_dependency 'awesome_print'
36
36
  spec.add_runtime_dependency 'time_diff'
37
37
  spec.add_runtime_dependency 'zipruby'
38
+ spec.add_runtime_dependency 'table_print'
38
39
  end
@@ -6,9 +6,11 @@ module Elastic
6
6
  require 'elastic/beanstalk/extensions'
7
7
  require 'elastic/beanstalk/smoke_tester'
8
8
  require 'elastic/beanstalk/version'
9
+ require 'elastic/beanstalk/spinner'
9
10
  end
10
11
  end
11
12
 
12
13
  EbConfig = Elastic::Beanstalk::Config
13
14
  EbExtensions = Elastic::Beanstalk::Extensions
14
- EbSmokeTester = Elastic::Beanstalk::SmokeTester
15
+ EbSmokeTester = Elastic::Beanstalk::SmokeTester
16
+ Spinner = Elastic::Beanstalk::Spinner
@@ -1,5 +1,6 @@
1
1
  require 'timeout'
2
2
  require 'net/http'
3
+ require 'elastic/beanstalk/spinner'
3
4
 
4
5
  module Elastic
5
6
  module Beanstalk
@@ -12,28 +13,31 @@ module Elastic
12
13
 
13
14
  puts '-------------------------------------------------------------------------------'
14
15
  # puts "Smoke Testing: \n\turl: #{url}\n\ttimeout: #{timeout}\n\tsleep_wait: #{sleep_wait}\n\texpected_text: #{expected_text}\n"
15
- puts "Smoke Testing: \n\turl: #{url}\n\ttimeout: #{timeout}\n\texpected_text: #{expected_text}\n"
16
+ puts "Smoke Test: \n\turl: #{url}\n\ttimeout: #{timeout}\n\texpected_text: #{expected_text}"
16
17
  response = nil
17
18
  begin
18
19
  Timeout.timeout(timeout) do
19
20
  i = 0
20
- begin
21
- sleep sleep_wait.to_i unless (i == 0)
22
- i += 1
21
+ print "\nRunning..."
22
+ Spinner.show {
23
23
  begin
24
- response = Net::HTTP.get_response(URI(url))
25
- #rescue SocketError => e
26
- # response = ResponseStub.new({code: e.message, body: ''})
27
- rescue => e
28
- response = ResponseStub.new({code: e.message, body: ''})
29
- end
30
-
31
- puts "\t\t[#{response.code}]"
32
- #puts "\t#{response.body}"
33
- end until (!response.nil? && response.code.to_i == 200 && response.body.include?(expected_text))
24
+ sleep sleep_wait.to_i unless (i == 0)
25
+ i += 1
26
+ begin
27
+ response = Net::HTTP.get_response(URI(url))
28
+ #rescue SocketError => e
29
+ # response = ResponseStub.new({code: e.message, body: ''})
30
+ rescue => e
31
+ response = ResponseStub.new({code: e.message, body: ''})
32
+ end
33
+
34
+ #puts "\t\t[#{response.code}]"
35
+ #puts "\t#{response.body}"
36
+ end until (!response.nil? && response.code.to_i == 200 && response.body.include?(expected_text))
37
+ }
34
38
  end
35
39
  ensure
36
- puts "\nFinal response: \n\tcode: [#{response.code}] \n\texpectation met: #{response.body.include?(expected_text)}"
40
+ puts "\n\nFinal response code: [#{response.code}] expectation met: #{response.body.include?(expected_text)}"
37
41
  puts '-------------------------------------------------------------------------------'
38
42
  end
39
43
  end
@@ -0,0 +1,29 @@
1
+ module Elastic
2
+ module Beanstalk
3
+
4
+ module Spinner
5
+ # it's a singleton, thus implemented as a self-extended module
6
+ extend self
7
+
8
+ def show(fps=10)
9
+ chars = %w{ | / - \\ }
10
+ delay = 1.0/fps
11
+ iter = 0
12
+ spinner = Thread.new do
13
+ while iter do # Keep spinning until told otherwise
14
+
15
+ print chars[0]
16
+ sleep delay
17
+ print "\b"
18
+ chars.push chars.shift
19
+ end
20
+ end
21
+ yield.tap {# After yielding to the block, save the return value
22
+ iter = false # Tell the thread to exit, cleaning up after itself…
23
+ spinner.join # …and wait for it to do so.
24
+ } # Use the block's return value as the method's
25
+ end
26
+ end
27
+ end
28
+ end
29
+
@@ -5,9 +5,121 @@ require 'eb_deployer'
5
5
  require 'time_diff'
6
6
  require 'elastic/beanstalk'
7
7
  require 'yaml'
8
+ require 'table_print'
9
+ require 'timeout'
8
10
 
9
11
  namespace :eb do
10
12
 
13
+ namespace :rds do
14
+
15
+ desc 'List RDS snapshots'
16
+ task :snapshots => [:config] do |t, args|
17
+ # absolutely do not run this without specifying columns, otherwise it will call all defined methods including :delete
18
+ print_snapshots(rds.snapshots.to_a)
19
+ end
20
+
21
+ desc 'List RDS instances'
22
+ task :instances => [:config] do |t, args|
23
+ # absolutely do not run this without specifying columns, otherwise it will call all defined methods including :delete
24
+ print_instances(rds.instances.to_a)
25
+ end
26
+
27
+ desc 'Creates an RDS snapshot'
28
+ task :create_snapshot, [:instance_id, :snapshot_id] => [:config] do |t, args|
29
+
30
+ snapshot_id = args[:snapshot_id]
31
+
32
+ db = db(args[:instance_id])
33
+
34
+ from_time = Time.now
35
+ puts "\n\n---------------------------------------------------------------------------------------------------------------------------------------"
36
+ snapshot = db.create_snapshot(snapshot_id)
37
+ #snapshot = snapshot(snapshot_id) # for quick testing of code below
38
+
39
+
40
+ #ID | STATUS | GB | TYPE | ENGINE | ZONE | CREATED_AT | INSTANCE_CREATE_TIME
41
+ #------|----------|----|--------|--------------|------------|------------|------------------------
42
+ #pre-2 | creating | 10 | manual | mysql 5.6.12 | us-east-1d | | 2013-09-10 21:37:27
43
+ # available
44
+ print_snapshots(snapshot)
45
+ puts "\n"
46
+
47
+ timeout = 20 * 60
48
+ sleep_wait = 5
49
+ begin
50
+ Timeout.timeout(timeout) do
51
+ i = 0
52
+
53
+ print "\nCreating snapshot[#{snapshot_id}]..."
54
+ Spinner.show {
55
+ begin
56
+ sleep sleep_wait.to_i unless (i == 0)
57
+ i += 1
58
+
59
+ snapshot = snapshot(snapshot_id)
60
+
61
+ end until (snapshot.status.eql? 'available')
62
+ }
63
+ end
64
+ ensure
65
+ puts "\n\nSnapshot[#{snapshot_id}]: #{snapshot.status}. Finished in #{Time.diff(from_time, Time.now, '%N %S')[:diff]}.\n"
66
+ puts "---------------------------------------------------------------------------------------------------------------------------------------\n\n"
67
+ end
68
+ end
69
+
70
+ def snapshot(snapshot_id)
71
+ AWS::RDS::DBSnapshot.new(snapshot_id)
72
+ end
73
+
74
+ def db(instance_id)
75
+ db_instance = AWS::RDS::DBInstance.new(instance_id)
76
+ raise "DB Instance[#{instance_id}] does not exist." unless db_instance.exists?
77
+ db_instance
78
+ end
79
+
80
+ def rds
81
+ @rds ||= AWS::RDS.new
82
+ @rds
83
+ end
84
+
85
+ def print_snapshots(snapshots)
86
+ tp snapshots,
87
+ {snapshot_id: {display_method: :id}},
88
+ :status,
89
+ {gb: {display_method: :allocated_storage}},
90
+ {type: {display_method: :snapshot_type}},
91
+ {engine: lambda { |i| "#{i.engine} #{i.engine_version}" }},
92
+ {zone: {display_method: :availability_zone_name}},
93
+ :created_at,
94
+ :instance_create_time
95
+ #:master_username,
96
+ end
97
+
98
+ def print_instances(instances)
99
+ tp instances,
100
+ {instance_id: {display_method: :id}},
101
+ {name: {display_method: :db_name}},
102
+ :status,
103
+ {gb: {display_method: :allocated_storage}},
104
+ :iops,
105
+ {class: {display_method: :db_instance_class}},
106
+ {engine: lambda { |i| "#{i.engine} #{i.engine_version}" }},
107
+ {zone: {display_method: :availability_zone_name}},
108
+ :multi_az,
109
+ #{endpoint_address: {max_width: 120}},
110
+ {:endpoint_address => {:width => 120}},
111
+ {port: {display_method: :endpoint_port}},
112
+ #:latest_restorable_time,
113
+ #:auto_minor_version_upgrade,
114
+ #:read_replica_db_instance_identifiers,
115
+ #:read_replica_source_db_instance_identifier,
116
+ #:backup_retention_period,
117
+ #:master_username,
118
+ :created_at
119
+ end
120
+ end
121
+
122
+
11
123
  ###########################################
12
124
  #
13
125
  #
@@ -1,5 +1,5 @@
1
1
  module Elastic
2
2
  module Beanstalk
3
- VERSION = '0.2.2'
3
+ VERSION = '0.3.0'
4
4
  end
5
5
  end
@@ -2,10 +2,11 @@ require 'spec_helper'
2
2
 
3
3
  describe EbExtensions do
4
4
 
5
- # this is a driver only, perhaps make this a reasonable test someday...
5
+ ##this is a driver only, perhaps make this a reasonable test someday...
6
6
  #it "#test_url" do
7
- # url = 'http://acme-development-inactive.elasticbeanstalk.com/ping'
7
+ # #url = 'http://acme-development-inactive.elasticbeanstalk.com/ping'
8
+ # url = 'http://google.com'
8
9
  # expected_text = 'You came to this page by mistake, go back where you came from'
9
- # EbSmokeTester.test_url(url, 600, 5, expected_text)
10
+ # EbSmokeTester.test_url(url, 10, 2, expected_text)
10
11
  #end
11
12
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: elastic-beanstalk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-09-10 00:00:00.000000000 Z
12
+ date: 2013-09-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -139,6 +139,22 @@ dependencies:
139
139
  - - ! '>='
140
140
  - !ruby/object:Gem::Version
141
141
  version: '0'
142
+ - !ruby/object:Gem::Dependency
143
+ name: table_print
144
+ requirement: !ruby/object:Gem::Requirement
145
+ none: false
146
+ requirements:
147
+ - - ! '>='
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ type: :runtime
151
+ prerelease: false
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ! '>='
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
142
158
  description: ! ' The simplest way to configure and deploy an Elastic Beanstalk
143
159
  application via rake.
144
160
 
@@ -164,6 +180,7 @@ files:
164
180
  - lib/elastic/beanstalk/extensions.rb
165
181
  - lib/elastic/beanstalk/railtie.rb
166
182
  - lib/elastic/beanstalk/smoke_tester.rb
183
+ - lib/elastic/beanstalk/spinner.rb
167
184
  - lib/elastic/beanstalk/tasks/eb.rake
168
185
  - lib/elastic/beanstalk/version.rb
169
186
  - spec/lib/deep_symbolize_spec.rb