elb 0.0.4
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.
- data/.gitignore +17 -0
- data/.ruby-version +1 -0
- data/.travis.yml +9 -0
- data/Gemfile +6 -0
- data/Guardfile +12 -0
- data/LICENSE.txt +22 -0
- data/README.md +57 -0
- data/Rakefile +6 -0
- data/bin/elb +9 -0
- data/elb.gemspec +35 -0
- data/lib/elb.rb +10 -0
- data/lib/elb/cli.rb +30 -0
- data/lib/elb/cli/help.rb +29 -0
- data/lib/elb/deploy.rb +65 -0
- data/lib/elb/helper.rb +41 -0
- data/lib/elb/settings.rb +26 -0
- data/lib/elb/ui.rb +16 -0
- data/lib/elb/version.rb +3 -0
- data/spec/fixtures/aws.yml +3 -0
- data/spec/lib/cli_spec.rb +26 -0
- data/spec/lib/deploy_spec.rb +52 -0
- data/spec/spec_helper.rb +32 -0
- metadata +204 -0
data/.gitignore
ADDED
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
ree-1.8.7-2012.02
|
data/.travis.yml
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
language: ruby
|
2
|
+
cache: bundler
|
3
|
+
rvm:
|
4
|
+
- 1.8.7
|
5
|
+
- 2.0.0
|
6
|
+
addons:
|
7
|
+
code_climate:
|
8
|
+
repo_token:
|
9
|
+
secure: AK6jL+T50l6SbGw/+xo6dpLUz++EQJl56DW+CDOp9+/SYZNL3PqtNGSApMEzXiAf1C+1TAhXRNkH8uyV7x8w6/SGFe+ZzxW1hupqJocDOaFL6sRHBXT9Fg9JNn3FULUgUjZDQn7t7u7QGBpykcGW3JNbKuyiQgfiSYSLx5Ee6OE=
|
data/Gemfile
ADDED
data/Guardfile
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
guard 'rspec', :version => 2 do
|
2
|
+
watch(%r{^spec/.+_spec\.rb$})
|
3
|
+
watch(%r{^lib/(.+)\.rb$}) { "spec/elb_spec.rb" }
|
4
|
+
watch(%r{^lib/elb/(.+)\.rb$}) { "spec/elb_spec.rb" }
|
5
|
+
watch('spec/spec_helper.rb') { "spec/elb_spec.rb" }
|
6
|
+
watch(%r{^lib/elb/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
|
7
|
+
end
|
8
|
+
|
9
|
+
guard 'bundler' do
|
10
|
+
watch('Gemfile')
|
11
|
+
watch(/^.+\.gemspec/)
|
12
|
+
end
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Tung Nguyen
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
# Elb
|
2
|
+
|
3
|
+
[](https://travis-ci.org/tongueroo/elb)
|
4
|
+
[](https://codeclimate.com/github/tongueroo/elb)
|
5
|
+
[](https://codeclimate.com/github/tongueroo/elb)
|
6
|
+
|
7
|
+
Tool gracefully restarts app server without affecting users by deregistering the instance from the elb, restarting it and registering it back to the elb.
|
8
|
+
|
9
|
+
It makes the assumption that the instance belongs to an autoscaling group that was created with cloudformation. Cloudformation automatically tags these instances with a `aws:autoscaling:groupName` tag, which is required.
|
10
|
+
|
11
|
+
## Installation
|
12
|
+
|
13
|
+
```
|
14
|
+
$ gem install elb
|
15
|
+
```
|
16
|
+
|
17
|
+
## Setup
|
18
|
+
|
19
|
+
The tool requires access to a limited number of AWS resources. This tool is meant to be ran on an ec2 instance, so using an IAM role is ideal. An [example IAM policy](https://github.com/tongueroo/elb/wiki/IAM-Role-Example) is on the wiki.
|
20
|
+
|
21
|
+
If you cannot use IAM roles, you can use a credentials file instead. The location of the file should be at ~/.br/aws.yml. An example of the format of the file is provided [here](https://github.com/tongueroo/elb/blob/master/spec/fixtures/aws.yml).
|
22
|
+
|
23
|
+
## Usage
|
24
|
+
|
25
|
+
```
|
26
|
+
$ elb restart
|
27
|
+
```
|
28
|
+
The `elb restart` command is meant to be ran on an ec2 instance and does the following:
|
29
|
+
|
30
|
+
1. deregister the instance from the autoscaling group it's associated with
|
31
|
+
2. restart the app
|
32
|
+
3. warm up the app by hitting it with a local curl request
|
33
|
+
4. register the instance back to the elb
|
34
|
+
|
35
|
+
Options can be used to override default behaviors.
|
36
|
+
|
37
|
+
```
|
38
|
+
$ elb restart --wait 30 # wait 30 seconds after deregistering
|
39
|
+
|
40
|
+
$ elb restart --warm-command "curl -s -v -o /dev/null localhost/custom-warm-url 2>&1 | grep '< HTTP'"
|
41
|
+
|
42
|
+
$ elb restart --restart-command "restart nginx"
|
43
|
+
|
44
|
+
$ elb help
|
45
|
+
```
|
46
|
+
|
47
|
+
### Local Usage
|
48
|
+
|
49
|
+
You can also use the tool locally and test on remote ec2 instances by specifying the `--instance-id` option.
|
50
|
+
|
51
|
+
```bash
|
52
|
+
$ elb restart --instance-id i-xxxxx
|
53
|
+
|
54
|
+
$ elb deregister --instance-id i-xxxxx # only runs deregister part
|
55
|
+
|
56
|
+
$ elb register --instance-id i-xxxxx # only runs register part
|
57
|
+
```
|
data/Rakefile
ADDED
data/bin/elb
ADDED
data/elb.gemspec
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'elb/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "elb"
|
8
|
+
spec.version = Elb::VERSION
|
9
|
+
spec.authors = ["Tung Nguyen"]
|
10
|
+
spec.email = ["tongueroo@gmail.com"]
|
11
|
+
spec.description = %q{Tool to gracefully restart app servers without affecting users}
|
12
|
+
spec.summary = %q{Tool to gracefully restart app servers without affecting users.}
|
13
|
+
spec.homepage = "https://github.com/br/elb"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_dependency "thor"
|
22
|
+
spec.add_dependency "aws-sdk"
|
23
|
+
spec.add_dependency "hashie"
|
24
|
+
spec.add_dependency "colorize"
|
25
|
+
spec.add_dependency "nokogiri", "1.5.11" # fix for 1.8.7
|
26
|
+
|
27
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
28
|
+
spec.add_development_dependency "rake"
|
29
|
+
spec.add_development_dependency "rspec"
|
30
|
+
if RUBY_VERSION != "1.8.7"
|
31
|
+
spec.add_development_dependency "guard"
|
32
|
+
spec.add_development_dependency "guard-bundler"
|
33
|
+
spec.add_development_dependency "guard-rspec"
|
34
|
+
end
|
35
|
+
end
|
data/lib/elb.rb
ADDED
data/lib/elb/cli.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'thor'
|
2
|
+
require 'elb/cli/help'
|
3
|
+
|
4
|
+
module Elb
|
5
|
+
|
6
|
+
class CLI < Thor
|
7
|
+
class_option :noop, :type => :boolean
|
8
|
+
class_option :mute, :default => false, :type => :boolean
|
9
|
+
class_option :instance_id, :desc => 'instance id to use, defaults to instance command is running on'
|
10
|
+
|
11
|
+
desc "restart", "restart server"
|
12
|
+
long_desc Help.restart
|
13
|
+
option :wait, :type => :numeric, :default => 20, :desc => 'period to wait after deregistering'
|
14
|
+
option :warm_command, :desc => 'command use to warm app, defaults to curling homepage', :default => "curl -s -v -o /dev/null localhost/ 2>&1 | grep '< HTTP'"
|
15
|
+
option :restart_command, :desc => 'command use to restart app, defaults to touch tmp/restart.txt', :default => "touch tmp/restart.txt"
|
16
|
+
def restart
|
17
|
+
Deploy.new(options).run
|
18
|
+
end
|
19
|
+
|
20
|
+
desc "deregister", "deregister server from elb"
|
21
|
+
def deregister
|
22
|
+
Deploy.new(options.merge(:wait => 0)).deregister
|
23
|
+
end
|
24
|
+
|
25
|
+
desc "register", "register server with elb"
|
26
|
+
def register
|
27
|
+
Deploy.new(options).register
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/lib/elb/cli/help.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
module Elb
|
2
|
+
class CLI < Thor
|
3
|
+
class Help
|
4
|
+
class << self
|
5
|
+
def restart
|
6
|
+
<<-EOL
|
7
|
+
The command is meant to be ran on the instance itself and will basically:
|
8
|
+
|
9
|
+
1. deregister the instance from the autoscaling group it's associated with
|
10
|
+
|
11
|
+
2. restart the app
|
12
|
+
|
13
|
+
3. warm up the app by hitting it with a local curl request
|
14
|
+
|
15
|
+
4. register the instance back to the elb
|
16
|
+
|
17
|
+
Examples:
|
18
|
+
|
19
|
+
$ elb restart --wait 30 # wait 30 seconds after deregistering
|
20
|
+
|
21
|
+
$ elb restart --warm-command "curl -s -v -o /dev/null localhost/custom-warm-url 2>&1 | grep '< HTTP'"
|
22
|
+
|
23
|
+
$ elb restart --restart-command "/etc/init.d/nginx restart"
|
24
|
+
EOL
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/elb/deploy.rb
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
module Elb
|
2
|
+
class Deploy
|
3
|
+
include Helper
|
4
|
+
|
5
|
+
attr_reader :instance_id
|
6
|
+
def initialize(options={})
|
7
|
+
@options = options
|
8
|
+
@instance_id = options[:instance_id] || %x[curl -s http://instance-data.ec2.internal/latest/meta-data/instance-id].strip
|
9
|
+
setup_aws
|
10
|
+
end
|
11
|
+
|
12
|
+
def run
|
13
|
+
UI.say("Restarting server started")
|
14
|
+
deregister
|
15
|
+
restart
|
16
|
+
warm
|
17
|
+
register
|
18
|
+
UI.say("Restarting server completed")
|
19
|
+
end
|
20
|
+
|
21
|
+
def asg
|
22
|
+
return @asg if @asg
|
23
|
+
name = ec2.instances[instance_id].tags["aws:autoscaling:groupName"]
|
24
|
+
@asg = as.groups[name]
|
25
|
+
end
|
26
|
+
|
27
|
+
def elb
|
28
|
+
return @elb if @elb
|
29
|
+
@elb = asg.load_balancers.first
|
30
|
+
end
|
31
|
+
|
32
|
+
def deregister
|
33
|
+
UI.say("Deregistering server from ELB")
|
34
|
+
return true if @options[:noop]
|
35
|
+
elb.client.deregister_instances_from_load_balancer(
|
36
|
+
:load_balancer_name => elb.name,
|
37
|
+
:instances => [{:instance_id => @instance_id}]
|
38
|
+
)
|
39
|
+
wait(@options[:wait]) # takes a while for the elb to deregister
|
40
|
+
end
|
41
|
+
|
42
|
+
def restart
|
43
|
+
UI.say("Restarting server")
|
44
|
+
system(@options[:restart_command])
|
45
|
+
end
|
46
|
+
|
47
|
+
def warm
|
48
|
+
UI.say("Warming up server")
|
49
|
+
system(@options[:warm_command])
|
50
|
+
end
|
51
|
+
|
52
|
+
def register
|
53
|
+
UI.say("Registering server with ELB")
|
54
|
+
return true if @options[:noop]
|
55
|
+
elb.client.register_instances_with_load_balancer(
|
56
|
+
:load_balancer_name => elb.name,
|
57
|
+
:instances => [{:instance_id => @instance_id}]
|
58
|
+
)
|
59
|
+
end
|
60
|
+
|
61
|
+
def wait(n)
|
62
|
+
sleep n
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
data/lib/elb/helper.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'aws-sdk'
|
2
|
+
|
3
|
+
module Elb
|
4
|
+
module Helper
|
5
|
+
@@setup_aws = nil
|
6
|
+
def setup_aws(region='us-east-1', options={})
|
7
|
+
return if @@setup_aws
|
8
|
+
path = Elb::Settings.new.aws_path
|
9
|
+
if File.exist?(path)
|
10
|
+
@config = YAML.load(IO.read(path))
|
11
|
+
AWS.config(
|
12
|
+
:http_wire_trace => options[:debug],
|
13
|
+
:access_key_id => @config[:aws_access_key_id],
|
14
|
+
:secret_access_key => @config[:aws_secret_access_key]
|
15
|
+
)
|
16
|
+
end
|
17
|
+
@@setup_aws = true
|
18
|
+
end
|
19
|
+
|
20
|
+
def ec2
|
21
|
+
@ec2 ||= AWS::EC2.new
|
22
|
+
end
|
23
|
+
|
24
|
+
def cfn
|
25
|
+
@cfn ||= AWS::CloudFormation.new
|
26
|
+
end
|
27
|
+
|
28
|
+
def rds
|
29
|
+
@rds ||= AWS::RDS.new
|
30
|
+
end
|
31
|
+
|
32
|
+
def as
|
33
|
+
@as ||= AWS::AutoScaling.new
|
34
|
+
end
|
35
|
+
|
36
|
+
def r53
|
37
|
+
@r53 ||= AWS::Route53.new
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
data/lib/elb/settings.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
require 'hashie'
|
3
|
+
|
4
|
+
module Elb
|
5
|
+
class Settings
|
6
|
+
def aws_path
|
7
|
+
path = ENV['TEST'] ? "spec/fixtures/aws.yml" : "#{br_path}/aws.yml"
|
8
|
+
path = ENV['AWS'] if ENV['AWS']
|
9
|
+
path
|
10
|
+
end
|
11
|
+
|
12
|
+
def br_path
|
13
|
+
self.class.br_path
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.br_path
|
17
|
+
ENV['BR_PATH'] || "#{ENV['HOME']}/.br"
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.setup_br_path
|
21
|
+
FileUtils.mkdir(br_path) unless File.exist?(br_path)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
Elb::Settings.setup_br_path
|
data/lib/elb/ui.rb
ADDED
data/lib/elb/version.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Elb::CLI do
|
4
|
+
before(:all) do
|
5
|
+
ensure_tmp
|
6
|
+
@args = "--noop --instance-id #{instance_id} --mute"
|
7
|
+
end
|
8
|
+
|
9
|
+
describe "elb" do
|
10
|
+
it "should restart" do
|
11
|
+
out = execute("bin/elb restart #{@args}")
|
12
|
+
expect(out).to include("Restarting server started")
|
13
|
+
expect(out).to include("Restarting server completed")
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should deregister" do
|
17
|
+
out = execute("bin/elb deregister #{@args}")
|
18
|
+
expect(out).to include("Deregistering server from ELB")
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should register" do
|
22
|
+
out = execute("bin/elb register #{@args}")
|
23
|
+
expect(out).to include("Registering server with ELB")
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Elb::Deploy do
|
4
|
+
before(:all) do
|
5
|
+
AWS.stub!
|
6
|
+
ensure_tmp
|
7
|
+
@options = {
|
8
|
+
:instance_id => instance_id,
|
9
|
+
:noop => true,
|
10
|
+
:restart_command => "touch tmp/restart.txt"
|
11
|
+
}
|
12
|
+
Elb::UI.mute = true
|
13
|
+
end
|
14
|
+
let(:lb) { double("Aws::Elb") }
|
15
|
+
let(:deploy) {
|
16
|
+
deploy = Elb::Deploy.new(@options)
|
17
|
+
allow(deploy.asg).to receive(:load_balancers).and_return([lb])
|
18
|
+
allow(deploy).to receive(:wait).and_return(true)
|
19
|
+
deploy
|
20
|
+
}
|
21
|
+
|
22
|
+
describe "deploy" do
|
23
|
+
it "should run" do
|
24
|
+
expect(deploy).to receive(:deregister)
|
25
|
+
expect(deploy).to receive(:restart)
|
26
|
+
expect(deploy).to receive(:warm)
|
27
|
+
expect(deploy).to receive(:register)
|
28
|
+
deploy.run
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should have asg" do
|
32
|
+
expect(deploy.asg).to_not be_nil
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should have elb" do
|
36
|
+
expect(deploy.elb).to_not be_nil
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should deregister" do
|
40
|
+
expect(deploy.deregister).to be true
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should register" do
|
44
|
+
expect(deploy.register).to be true
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should restart" do
|
48
|
+
expect(deploy.restart).to be true
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
ENV['TEST'] = '1'
|
2
|
+
|
3
|
+
if RUBY_VERSION != "1.8.7"
|
4
|
+
require "codeclimate-test-reporter"
|
5
|
+
CodeClimate::TestReporter.start
|
6
|
+
end
|
7
|
+
|
8
|
+
require "pp"
|
9
|
+
|
10
|
+
root = File.expand_path('../../', __FILE__)
|
11
|
+
require "#{root}/lib/elb"
|
12
|
+
|
13
|
+
module Helpers
|
14
|
+
def execute(cmd)
|
15
|
+
puts "Running: #{cmd}" if ENV['DEBUG']
|
16
|
+
out = `#{cmd}`
|
17
|
+
puts out if ENV['DEBUG']
|
18
|
+
out
|
19
|
+
end
|
20
|
+
|
21
|
+
def instance_id
|
22
|
+
ENV['INSTANCE_ID']
|
23
|
+
end
|
24
|
+
|
25
|
+
def ensure_tmp
|
26
|
+
FileUtils.mkdir('tmp') unless File.exist?('tmp')
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
RSpec.configure do |c|
|
31
|
+
c.include Helpers
|
32
|
+
end
|
metadata
ADDED
@@ -0,0 +1,204 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: elb
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 23
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 4
|
10
|
+
version: 0.0.4
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Tung Nguyen
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2014-06-08 00:00:00 Z
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: thor
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
hash: 3
|
29
|
+
segments:
|
30
|
+
- 0
|
31
|
+
version: "0"
|
32
|
+
type: :runtime
|
33
|
+
version_requirements: *id001
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
name: aws-sdk
|
36
|
+
prerelease: false
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
38
|
+
none: false
|
39
|
+
requirements:
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
hash: 3
|
43
|
+
segments:
|
44
|
+
- 0
|
45
|
+
version: "0"
|
46
|
+
type: :runtime
|
47
|
+
version_requirements: *id002
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: hashie
|
50
|
+
prerelease: false
|
51
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
52
|
+
none: false
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
hash: 3
|
57
|
+
segments:
|
58
|
+
- 0
|
59
|
+
version: "0"
|
60
|
+
type: :runtime
|
61
|
+
version_requirements: *id003
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: colorize
|
64
|
+
prerelease: false
|
65
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
67
|
+
requirements:
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
hash: 3
|
71
|
+
segments:
|
72
|
+
- 0
|
73
|
+
version: "0"
|
74
|
+
type: :runtime
|
75
|
+
version_requirements: *id004
|
76
|
+
- !ruby/object:Gem::Dependency
|
77
|
+
name: nokogiri
|
78
|
+
prerelease: false
|
79
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
80
|
+
none: false
|
81
|
+
requirements:
|
82
|
+
- - "="
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
hash: 21
|
85
|
+
segments:
|
86
|
+
- 1
|
87
|
+
- 5
|
88
|
+
- 11
|
89
|
+
version: 1.5.11
|
90
|
+
type: :runtime
|
91
|
+
version_requirements: *id005
|
92
|
+
- !ruby/object:Gem::Dependency
|
93
|
+
name: bundler
|
94
|
+
prerelease: false
|
95
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
96
|
+
none: false
|
97
|
+
requirements:
|
98
|
+
- - ~>
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
hash: 9
|
101
|
+
segments:
|
102
|
+
- 1
|
103
|
+
- 3
|
104
|
+
version: "1.3"
|
105
|
+
type: :development
|
106
|
+
version_requirements: *id006
|
107
|
+
- !ruby/object:Gem::Dependency
|
108
|
+
name: rake
|
109
|
+
prerelease: false
|
110
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
111
|
+
none: false
|
112
|
+
requirements:
|
113
|
+
- - ">="
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
hash: 3
|
116
|
+
segments:
|
117
|
+
- 0
|
118
|
+
version: "0"
|
119
|
+
type: :development
|
120
|
+
version_requirements: *id007
|
121
|
+
- !ruby/object:Gem::Dependency
|
122
|
+
name: rspec
|
123
|
+
prerelease: false
|
124
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
125
|
+
none: false
|
126
|
+
requirements:
|
127
|
+
- - ">="
|
128
|
+
- !ruby/object:Gem::Version
|
129
|
+
hash: 3
|
130
|
+
segments:
|
131
|
+
- 0
|
132
|
+
version: "0"
|
133
|
+
type: :development
|
134
|
+
version_requirements: *id008
|
135
|
+
description: Tool to gracefully restart app servers without affecting users
|
136
|
+
email:
|
137
|
+
- tongueroo@gmail.com
|
138
|
+
executables:
|
139
|
+
- elb
|
140
|
+
extensions: []
|
141
|
+
|
142
|
+
extra_rdoc_files: []
|
143
|
+
|
144
|
+
files:
|
145
|
+
- .gitignore
|
146
|
+
- .ruby-version
|
147
|
+
- .travis.yml
|
148
|
+
- Gemfile
|
149
|
+
- Guardfile
|
150
|
+
- LICENSE.txt
|
151
|
+
- README.md
|
152
|
+
- Rakefile
|
153
|
+
- bin/elb
|
154
|
+
- elb.gemspec
|
155
|
+
- lib/elb.rb
|
156
|
+
- lib/elb/cli.rb
|
157
|
+
- lib/elb/cli/help.rb
|
158
|
+
- lib/elb/deploy.rb
|
159
|
+
- lib/elb/helper.rb
|
160
|
+
- lib/elb/settings.rb
|
161
|
+
- lib/elb/ui.rb
|
162
|
+
- lib/elb/version.rb
|
163
|
+
- spec/fixtures/aws.yml
|
164
|
+
- spec/lib/cli_spec.rb
|
165
|
+
- spec/lib/deploy_spec.rb
|
166
|
+
- spec/spec_helper.rb
|
167
|
+
homepage: https://github.com/br/elb
|
168
|
+
licenses:
|
169
|
+
- MIT
|
170
|
+
post_install_message:
|
171
|
+
rdoc_options: []
|
172
|
+
|
173
|
+
require_paths:
|
174
|
+
- lib
|
175
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
176
|
+
none: false
|
177
|
+
requirements:
|
178
|
+
- - ">="
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
hash: 3
|
181
|
+
segments:
|
182
|
+
- 0
|
183
|
+
version: "0"
|
184
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
185
|
+
none: false
|
186
|
+
requirements:
|
187
|
+
- - ">="
|
188
|
+
- !ruby/object:Gem::Version
|
189
|
+
hash: 3
|
190
|
+
segments:
|
191
|
+
- 0
|
192
|
+
version: "0"
|
193
|
+
requirements: []
|
194
|
+
|
195
|
+
rubyforge_project:
|
196
|
+
rubygems_version: 1.8.15
|
197
|
+
signing_key:
|
198
|
+
specification_version: 3
|
199
|
+
summary: Tool to gracefully restart app servers without affecting users.
|
200
|
+
test_files:
|
201
|
+
- spec/fixtures/aws.yml
|
202
|
+
- spec/lib/cli_spec.rb
|
203
|
+
- spec/lib/deploy_spec.rb
|
204
|
+
- spec/spec_helper.rb
|