rubber 3.1.0 → 3.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG +10 -1
- data/Gemfile +2 -3
- data/lib/ext/fog/compute/digital_ocean_v2.rb +82 -0
- data/lib/rubber/cloud.rb +11 -2
- data/lib/rubber/cloud/aws.rb +9 -536
- data/lib/rubber/cloud/aws/base.rb +318 -0
- data/lib/rubber/cloud/aws/classic.rb +245 -0
- data/lib/rubber/cloud/{aws_table_store.rb → aws/table_store.rb} +2 -1
- data/lib/rubber/cloud/aws/vpc.rb +612 -0
- data/lib/rubber/cloud/base.rb +10 -2
- data/lib/rubber/cloud/digital_ocean.rb +62 -21
- data/lib/rubber/cloud/vagrant.rb +3 -3
- data/lib/rubber/instance.rb +13 -5
- data/lib/rubber/recipes/rubber/instances.rb +68 -16
- data/lib/rubber/recipes/rubber/setup.rb +12 -2
- data/lib/rubber/recipes/rubber/vpcs.rb +92 -0
- data/lib/rubber/tag.rb +1 -1
- data/lib/rubber/util.rb +8 -0
- data/lib/rubber/version.rb +1 -1
- data/rubber.gemspec +1 -1
- data/templates/base/config/rubber/rubber.yml +32 -1
- data/templates/nat_gateway/config/rubber/role/nat_gateway/nat.sh +45 -0
- data/templates/nat_gateway/templates.yml +2 -0
- data/test/cloud/aws/classic_test.rb +54 -0
- data/test/cloud/{aws_table_store_test.rb → aws/table_store_test.rb} +8 -8
- data/test/cloud/{aws_test.rb → aws/vpc_test.rb} +5 -5
- data/test/cloud/digital_ocean_test.rb +37 -19
- data/test/instance_test.rb +1 -1
- metadata +74 -93
data/lib/rubber/tag.rb
CHANGED
data/lib/rubber/util.rb
CHANGED
@@ -119,6 +119,14 @@ module Rubber
|
|
119
119
|
str.split('_').map{ |part| part.capitalize }.join
|
120
120
|
end
|
121
121
|
|
122
|
+
def is_instance_id?(str)
|
123
|
+
str =~ /^i-[a-z0-9]+$/
|
124
|
+
end
|
125
|
+
|
126
|
+
def is_internet_gateway_id?(str)
|
127
|
+
str =~ /^igw-[a-z0-9]+$/
|
128
|
+
end
|
129
|
+
|
122
130
|
extend self
|
123
131
|
end
|
124
132
|
end
|
data/lib/rubber/version.rb
CHANGED
data/rubber.gemspec
CHANGED
@@ -31,7 +31,7 @@ Gem::Specification.new do |s|
|
|
31
31
|
s.add_dependency 'net-ssh', '~> 2.6'
|
32
32
|
s.add_dependency 'thor'
|
33
33
|
s.add_dependency 'clamp'
|
34
|
-
s.add_dependency 'fog', '
|
34
|
+
s.add_dependency 'fog', '< 2.0'
|
35
35
|
|
36
36
|
s.add_development_dependency('rake')
|
37
37
|
s.add_development_dependency('test-unit')
|
@@ -81,8 +81,39 @@ cloud_providers:
|
|
81
81
|
# OPTIONAL: Needed for backing up database to s3
|
82
82
|
# backup_bucket: "#{app_name}-backups"
|
83
83
|
|
84
|
+
# OPTIONAL: Define a VPC to deploy to. The alias can be thought of as a
|
85
|
+
# unique Rubber-specific Id. If vpc_alias and vpc_addr are absent, Rubber
|
86
|
+
# will instead assume we're deploying to EC2 Classic
|
87
|
+
# vpc_alias: "#{app_name}_#{Rubber.env == 'production' ? 'production' : 'development'}"
|
88
|
+
# vpc_cidr: 10.0.0.0/16
|
89
|
+
|
90
|
+
# VPCs will typically have two subnets - one for instances that need a
|
91
|
+
# direct internet connection (load balancers, etc.), and one for instances
|
92
|
+
# that don't (database servers, app servers, etc.). At the very least,
|
93
|
+
# we'll need a public subnet. Rubber will detect the instance's private_nic
|
94
|
+
# configuration, and auto-create a subnet if appropriate. Any instances on
|
95
|
+
# the public subnet will need the following configuration. It is also
|
96
|
+
# important to note that AWS VPC Subnets are availability zone-specific,
|
97
|
+
# meaning you probably want to specify an availability zone for your
|
98
|
+
# instance. You will also have to specify a different subnet_cidr for each
|
99
|
+
# availability zone, since subnets cannot overlap.
|
100
|
+
# private_nic:
|
101
|
+
# subnet_cidr: '10.0.0.0/24'
|
102
|
+
# gateway: public
|
103
|
+
|
104
|
+
# For a private subnet, you will need to configure a nat_gateway instance in
|
105
|
+
# the public subnet so that machines can still reach the outside world for
|
106
|
+
# things like software updates. After configuring a NAT gateway, you can
|
107
|
+
# set up a separate private subnet. You will also need to set your :gateway
|
108
|
+
# Capistrano configuration value to the full hostname of the nat gateway in
|
109
|
+
# order to communicate with instances on private subnets. Instances which
|
110
|
+
# are on a private subnet will need the following configuration
|
111
|
+
# private_nic:
|
112
|
+
# subnet_cidr: '10.0.1.0/24'
|
113
|
+
# gateway: "#{rubber_instances.for_role('nat_gateway').first.instance_id}"
|
114
|
+
|
84
115
|
# REQUIRED: the ami and instance type for creating instances
|
85
|
-
# The Ubuntu images at http://alestic.com/ work well
|
116
|
+
# The Ubuntu images at http://old.alestic.com/ work well
|
86
117
|
# Ubuntu 14.04.1 Trusty instance-store 64-bit: ami-92f569fa
|
87
118
|
#
|
88
119
|
# m1.small or m1.large or m1.xlarge
|
@@ -0,0 +1,45 @@
|
|
1
|
+
<%
|
2
|
+
@perms = 0744
|
3
|
+
@path = '/etc/init.d/nat'
|
4
|
+
@post = 'ln -sf /etc/init.d/nat /etc/rc2.d/S90nat && service nat start'
|
5
|
+
|
6
|
+
vpc_cidr = Rubber.config.cloud_providers.aws.vpc_cidr
|
7
|
+
%>
|
8
|
+
echo -e "\n\nLoading simple rc.firewall-iptables version $FWVER..\n"
|
9
|
+
DEPMOD=/sbin/depmod
|
10
|
+
MODPROBE=/sbin/modprobe
|
11
|
+
|
12
|
+
#======================================================================
|
13
|
+
#== No editing beyond this line is required for initial MASQ testing ==
|
14
|
+
echo -en " loading modules: "
|
15
|
+
echo " - Verifying that all kernel modules are ok"
|
16
|
+
$DEPMOD -a
|
17
|
+
echo "----------------------------------------------------------------------"
|
18
|
+
echo -en "ip_tables, "
|
19
|
+
$MODPROBE ip_tables
|
20
|
+
echo -en "nf_conntrack, "
|
21
|
+
$MODPROBE nf_conntrack
|
22
|
+
echo -en "nf_conntrack_ftp, "
|
23
|
+
$MODPROBE nf_conntrack_ftp
|
24
|
+
echo -en "nf_conntrack_irc, "
|
25
|
+
$MODPROBE nf_conntrack_irc
|
26
|
+
echo -en "iptable_nat, "
|
27
|
+
$MODPROBE iptable_nat
|
28
|
+
echo -en "nf_nat_ftp, "
|
29
|
+
$MODPROBE nf_nat_ftp
|
30
|
+
echo "----------------------------------------------------------------------"
|
31
|
+
echo -e " Done loading modules.\n"
|
32
|
+
echo " Enabling forwarding.."
|
33
|
+
echo "1" > /proc/sys/net/ipv4/ip_forward
|
34
|
+
echo " Enabling DynamicAddr.."
|
35
|
+
echo "1" > /proc/sys/net/ipv4/ip_dynaddr
|
36
|
+
echo " Disabling redirects.."
|
37
|
+
echo "0" > /proc/sys/net/ipv4/conf/eth0/send_redirects
|
38
|
+
echo " Clearing any existing NAT rules and setting default policy.."
|
39
|
+
|
40
|
+
# Share public Internet connection.
|
41
|
+
iptables --table nat --flush
|
42
|
+
iptables -t nat -C POSTROUTING -o eth0 -s <%= vpc_cidr %> -j MASQUERADE 2> /dev/null || iptables -t nat -A POSTROUTING -o eth0 -s <%= vpc_cidr %> -j MASQUERADE
|
43
|
+
|
44
|
+
echo -e "\nrc.firewall-iptables v$FWVER done.\n"
|
45
|
+
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require File.expand_path(File.join(__FILE__, '../../..', 'test_helper'))
|
2
|
+
require 'rubber/cloud/aws/classic'
|
3
|
+
require 'ostruct'
|
4
|
+
|
5
|
+
class AwsClassicTest < Test::Unit::TestCase
|
6
|
+
|
7
|
+
context "aws" do
|
8
|
+
|
9
|
+
setup do
|
10
|
+
env = {'access_key' => "XXX", 'secret_access_key' => "YYY", 'region' => "us-east-1"}
|
11
|
+
env = Rubber::Configuration::Environment::BoundEnv.new(env, nil, nil, nil)
|
12
|
+
@cloud = Rubber::Cloud::Aws::Classic.new(env, nil)
|
13
|
+
end
|
14
|
+
|
15
|
+
should "instantiate" do
|
16
|
+
assert @cloud.compute_provider
|
17
|
+
assert @cloud.storage_provider
|
18
|
+
end
|
19
|
+
|
20
|
+
should "provide storage" do
|
21
|
+
assert @cloud.storage('mybucket')
|
22
|
+
end
|
23
|
+
|
24
|
+
should "provide table store" do
|
25
|
+
assert @cloud.table_store('somekey')
|
26
|
+
end
|
27
|
+
|
28
|
+
should "create instance" do
|
29
|
+
assert @cloud.create_instance('', '', '', '', '', '')
|
30
|
+
end
|
31
|
+
|
32
|
+
should "create instance with opts" do
|
33
|
+
assert @cloud.create_instance('', '', '', '', '', '', :ebs_optimized => true)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context "aws with alternative region" do
|
38
|
+
|
39
|
+
setup do
|
40
|
+
@region = "ap-southeast-2"
|
41
|
+
env = {'access_key' => "XXX", 'secret_access_key' => "YYY", 'region' => @region}
|
42
|
+
env = Rubber::Configuration::Environment::BoundEnv.new(env, nil, nil, nil)
|
43
|
+
@cloud = Rubber::Cloud::Aws::Classic.new(env, nil)
|
44
|
+
end
|
45
|
+
|
46
|
+
should "set region on compute provider" do
|
47
|
+
assert_equal @cloud.compute_provider.region, @region
|
48
|
+
end
|
49
|
+
|
50
|
+
should "set region on storage provider" do
|
51
|
+
assert_equal @cloud.storage_provider.region, @region
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -1,5 +1,5 @@
|
|
1
|
-
require File.expand_path(File.join(__FILE__, '
|
2
|
-
require 'rubber/cloud/
|
1
|
+
require File.expand_path(File.join(__FILE__, '../../..', 'test_helper'))
|
2
|
+
require 'rubber/cloud/aws/table_store'
|
3
3
|
|
4
4
|
class AwsTableStoreTest < Test::Unit::TestCase
|
5
5
|
|
@@ -10,34 +10,34 @@ class AwsTableStoreTest < Test::Unit::TestCase
|
|
10
10
|
:aws_secret_access_key => 'YYY')
|
11
11
|
@table = 'mytable'
|
12
12
|
@provider.create_domain(@table)
|
13
|
-
@table_store = Rubber::Cloud::
|
13
|
+
@table_store = Rubber::Cloud::Aws::TableStore.new(@provider, @table)
|
14
14
|
end
|
15
15
|
|
16
16
|
should "require a table" do
|
17
17
|
|
18
18
|
assert_raise do
|
19
|
-
Rubber::Cloud::
|
19
|
+
Rubber::Cloud::Aws::TableStore.new(@provider, nil)
|
20
20
|
end
|
21
21
|
|
22
22
|
assert_raise do
|
23
|
-
Rubber::Cloud::
|
23
|
+
Rubber::Cloud::Aws::TableStore.new(@provider, "")
|
24
24
|
end
|
25
25
|
|
26
|
-
assert Rubber::Cloud::
|
26
|
+
assert Rubber::Cloud::Aws::TableStore.new(@provider, @table)
|
27
27
|
end
|
28
28
|
|
29
29
|
context "ensure_table" do
|
30
30
|
|
31
31
|
should "created table if not there" do
|
32
32
|
assert_raises { @provider.domain_metadata('sometable') }
|
33
|
-
@table_store = Rubber::Cloud::
|
33
|
+
@table_store = Rubber::Cloud::Aws::TableStore.new(@provider, 'sometable')
|
34
34
|
assert @provider.domain_metadata('sometable')
|
35
35
|
end
|
36
36
|
|
37
37
|
should "still work if table already exists" do
|
38
38
|
@provider.create_domain('sometable')
|
39
39
|
assert @provider.domain_metadata('sometable')
|
40
|
-
@table_store = Rubber::Cloud::
|
40
|
+
@table_store = Rubber::Cloud::Aws::TableStore.new(@provider, 'sometable')
|
41
41
|
assert @provider.domain_metadata('sometable')
|
42
42
|
end
|
43
43
|
|
@@ -1,15 +1,15 @@
|
|
1
|
-
require File.expand_path(File.join(__FILE__, '
|
2
|
-
require 'rubber/cloud/aws'
|
1
|
+
require File.expand_path(File.join(__FILE__, '../../..', 'test_helper'))
|
2
|
+
require 'rubber/cloud/aws/vpc'
|
3
3
|
require 'ostruct'
|
4
4
|
|
5
|
-
class
|
5
|
+
class AwsVpcTest < Test::Unit::TestCase
|
6
6
|
|
7
7
|
context "aws" do
|
8
8
|
|
9
9
|
setup do
|
10
10
|
env = {'access_key' => "XXX", 'secret_access_key' => "YYY", 'region' => "us-east-1"}
|
11
11
|
env = Rubber::Configuration::Environment::BoundEnv.new(env, nil, nil, nil)
|
12
|
-
@cloud = Rubber::Cloud::Aws.new(env, nil)
|
12
|
+
@cloud = Rubber::Cloud::Aws::Vpc.new(env, nil)
|
13
13
|
end
|
14
14
|
|
15
15
|
should "instantiate" do
|
@@ -40,7 +40,7 @@ class AwsTest < Test::Unit::TestCase
|
|
40
40
|
@region = "ap-southeast-2"
|
41
41
|
env = {'access_key' => "XXX", 'secret_access_key' => "YYY", 'region' => @region}
|
42
42
|
env = Rubber::Configuration::Environment::BoundEnv.new(env, nil, nil, nil)
|
43
|
-
@cloud = Rubber::Cloud::Aws.new(env, nil)
|
43
|
+
@cloud = Rubber::Cloud::Aws::Vpc.new(env, nil)
|
44
44
|
end
|
45
45
|
|
46
46
|
should "set region on compute provider" do
|
@@ -8,13 +8,21 @@ class DigitalOceanTest < Test::Unit::TestCase
|
|
8
8
|
|
9
9
|
setup do
|
10
10
|
env = {
|
11
|
-
'
|
12
|
-
'
|
13
|
-
'
|
14
|
-
'
|
11
|
+
'digital_ocean_token' => "XYZ",
|
12
|
+
'region' => 'nyc1',
|
13
|
+
'key_file' => "#{File.dirname(__FILE__)}/../fixtures/basic/test.pem",
|
14
|
+
'key_name' => 'test'
|
15
15
|
}
|
16
16
|
env = Rubber::Configuration::Environment::BoundEnv.new(env, nil, nil, nil)
|
17
17
|
@cloud = Rubber::Cloud::DigitalOcean.new(env, nil)
|
18
|
+
|
19
|
+
@cloud.compute_provider.ssh_keys.each do |key|
|
20
|
+
@cloud.compute_provider.delete_ssh_key(key.id)
|
21
|
+
end
|
22
|
+
|
23
|
+
# This is currently (as of 11/2/15) the only valid image name in
|
24
|
+
# Fog's mocked digital ocean images request
|
25
|
+
@valid_image_name = 'Nifty New Snapshot'
|
18
26
|
end
|
19
27
|
|
20
28
|
should 'instantiate' do
|
@@ -24,36 +32,36 @@ class DigitalOceanTest < Test::Unit::TestCase
|
|
24
32
|
|
25
33
|
context '#create_instance' do
|
26
34
|
should 'create instance' do
|
27
|
-
assert @cloud.create_instance('my-instance',
|
35
|
+
assert @cloud.create_instance('my-instance', @valid_image_name, '512MB', [], '', 'nyc1')
|
28
36
|
end
|
29
37
|
|
30
38
|
should 'create instance with private networking enabled' do
|
31
39
|
env = {
|
32
|
-
'
|
33
|
-
'api_key' => "YYY",
|
40
|
+
'digital_ocean_token' => "XYZ",
|
34
41
|
'key_file' => "#{File.dirname(__FILE__)}/../fixtures/basic/test.pem",
|
42
|
+
'key_name' => 'test',
|
35
43
|
'private_networking' => true
|
36
44
|
}
|
37
45
|
|
38
46
|
env = Rubber::Configuration::Environment::BoundEnv.new(env, nil, nil, nil)
|
39
47
|
|
40
|
-
assert Rubber::Cloud::DigitalOcean.new(env, nil).create_instance('my-instance',
|
48
|
+
assert Rubber::Cloud::DigitalOcean.new(env, nil).create_instance('my-instance', @valid_image_name, '512MB', [], '', 'nyc2')
|
41
49
|
end
|
42
50
|
|
43
51
|
should 'raise error if region does not support private networking but private networking is enabled' do
|
44
52
|
env = {
|
45
|
-
'
|
46
|
-
'api_key' => "YYY",
|
53
|
+
'digital_ocean_token' => "XYZ",
|
47
54
|
'key_file' => "#{File.dirname(__FILE__)}/../fixtures/basic/test.pem",
|
55
|
+
'key_name' => 'test',
|
48
56
|
'private_networking' => true
|
49
57
|
}
|
50
58
|
|
51
59
|
env = Rubber::Configuration::Environment::BoundEnv.new(env, nil, nil, nil)
|
52
60
|
|
53
61
|
begin
|
54
|
-
Rubber::Cloud::DigitalOcean.new(env, nil).create_instance('my-instance',
|
62
|
+
Rubber::Cloud::DigitalOcean.new(env, nil).create_instance('my-instance', @valid_image_name, '512MB', [], '', 'nyc1')
|
55
63
|
rescue => e
|
56
|
-
assert_equal 'Private networking is enabled, but region
|
64
|
+
assert_equal 'Private networking is enabled, but region nyc1 does not support it', e.message
|
57
65
|
else
|
58
66
|
fail 'Did not raise exception for region that does not support private networking'
|
59
67
|
end
|
@@ -61,9 +69,9 @@ class DigitalOceanTest < Test::Unit::TestCase
|
|
61
69
|
|
62
70
|
should 'raise error if invalid region' do
|
63
71
|
begin
|
64
|
-
@cloud.create_instance('my-instance',
|
72
|
+
@cloud.create_instance('my-instance', @valid_image_name, '512MB', [], '', 'mars1')
|
65
73
|
rescue => e
|
66
|
-
assert_equal 'Invalid region for DigitalOcean:
|
74
|
+
assert_equal 'Invalid region for DigitalOcean: mars1', e.message
|
67
75
|
else
|
68
76
|
fail 'Did not raise exception for invalid region'
|
69
77
|
end
|
@@ -71,7 +79,7 @@ class DigitalOceanTest < Test::Unit::TestCase
|
|
71
79
|
|
72
80
|
should 'raise an error if invalid image type' do
|
73
81
|
begin
|
74
|
-
@cloud.create_instance('my-instance',
|
82
|
+
@cloud.create_instance('my-instance', @valid_image_name, 'm1.small', [], '', 'nyc1')
|
75
83
|
rescue => e
|
76
84
|
assert_equal 'Invalid image type for DigitalOcean: m1.small', e.message
|
77
85
|
else
|
@@ -81,7 +89,7 @@ class DigitalOceanTest < Test::Unit::TestCase
|
|
81
89
|
|
82
90
|
should 'raise an error if invalid image name' do
|
83
91
|
begin
|
84
|
-
@cloud.create_instance('my-instance', 'Windows Server 2003', '512MB', [], '', '
|
92
|
+
@cloud.create_instance('my-instance', 'Windows Server 2003', '512MB', [], '', 'nyc1')
|
85
93
|
rescue => e
|
86
94
|
assert_equal 'Invalid image name for DigitalOcean: Windows Server 2003', e.message
|
87
95
|
else
|
@@ -91,11 +99,15 @@ class DigitalOceanTest < Test::Unit::TestCase
|
|
91
99
|
|
92
100
|
should 'raise an error if no remote SSH key and local key_file is bad' do
|
93
101
|
begin
|
94
|
-
env = {
|
102
|
+
env = {
|
103
|
+
'digital_ocean_token' => "XYZ",
|
104
|
+
'region' => 'nyc1',
|
105
|
+
'key_name' => 'test'
|
106
|
+
}
|
95
107
|
env = Rubber::Configuration::Environment::BoundEnv.new(env, nil, nil, nil)
|
96
108
|
cloud = Rubber::Cloud::DigitalOcean.new(env, nil)
|
97
109
|
|
98
|
-
cloud.create_instance('my-instance',
|
110
|
+
cloud.create_instance('my-instance', @valid_image_name, '512MB', [], '', 'New York 1')
|
99
111
|
rescue => e
|
100
112
|
assert_equal 'Missing key_file for DigitalOcean', e.message
|
101
113
|
else
|
@@ -108,7 +120,13 @@ class DigitalOceanTest < Test::Unit::TestCase
|
|
108
120
|
context 'digital ocean with aws storage' do
|
109
121
|
|
110
122
|
setup do
|
111
|
-
env = {
|
123
|
+
env = {
|
124
|
+
'digital_ocean_token' => "xyz",
|
125
|
+
'region' => 'nyc1',
|
126
|
+
'key_file' => "#{File.dirname(__FILE__)}/../fixtures/basic/test.pem",
|
127
|
+
'key_name' => 'test'
|
128
|
+
}
|
129
|
+
|
112
130
|
@aws_region = "ap-southeast-2"
|
113
131
|
env['cloud_providers'] = {'aws' => {'access_key' => "XXX", 'secret_access_key' => "YYY", 'region' => @aws_region}}
|
114
132
|
env = Rubber::Configuration::Environment::BoundEnv.new(env, nil, nil, nil)
|
data/test/instance_test.rb
CHANGED
@@ -199,7 +199,7 @@ class InstanceTest < Test::Unit::TestCase
|
|
199
199
|
setup do
|
200
200
|
env = {'access_key' => "XXX", 'secret_access_key' => "YYY", 'region' => "us-east-1"}
|
201
201
|
env = Rubber::Configuration::Environment::BoundEnv.new(env, nil, nil, nil)
|
202
|
-
@cloud = Rubber::Cloud::Aws.new(env, nil)
|
202
|
+
@cloud = Rubber::Cloud::Aws::Classic.new(env, nil)
|
203
203
|
@cloud.storage_provider.put_bucket('bucket')
|
204
204
|
Rubber.stubs(:cloud).returns(@cloud)
|
205
205
|
end
|
metadata
CHANGED
@@ -1,185 +1,163 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubber
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
5
|
-
prerelease:
|
4
|
+
version: 3.2.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Matt Conway
|
9
8
|
- Kevin Menard
|
10
|
-
autorequire:
|
9
|
+
autorequire:
|
11
10
|
bindir: bin
|
12
11
|
cert_chain: []
|
13
|
-
date:
|
12
|
+
date: 2016-01-10 00:00:00.000000000 Z
|
14
13
|
dependencies:
|
15
14
|
- !ruby/object:Gem::Dependency
|
16
|
-
name: capistrano
|
17
15
|
requirement: !ruby/object:Gem::Requirement
|
18
|
-
none: false
|
19
16
|
requirements:
|
20
|
-
- - ~>
|
17
|
+
- - "~>"
|
21
18
|
- !ruby/object:Gem::Version
|
22
19
|
version: '2.12'
|
23
|
-
|
20
|
+
name: capistrano
|
24
21
|
prerelease: false
|
22
|
+
type: :runtime
|
25
23
|
version_requirements: !ruby/object:Gem::Requirement
|
26
|
-
none: false
|
27
24
|
requirements:
|
28
|
-
- - ~>
|
25
|
+
- - "~>"
|
29
26
|
- !ruby/object:Gem::Version
|
30
27
|
version: '2.12'
|
31
28
|
- !ruby/object:Gem::Dependency
|
32
|
-
name: net-ssh
|
33
29
|
requirement: !ruby/object:Gem::Requirement
|
34
|
-
none: false
|
35
30
|
requirements:
|
36
|
-
- - ~>
|
31
|
+
- - "~>"
|
37
32
|
- !ruby/object:Gem::Version
|
38
33
|
version: '2.6'
|
39
|
-
|
34
|
+
name: net-ssh
|
40
35
|
prerelease: false
|
36
|
+
type: :runtime
|
41
37
|
version_requirements: !ruby/object:Gem::Requirement
|
42
|
-
none: false
|
43
38
|
requirements:
|
44
|
-
- - ~>
|
39
|
+
- - "~>"
|
45
40
|
- !ruby/object:Gem::Version
|
46
41
|
version: '2.6'
|
47
42
|
- !ruby/object:Gem::Dependency
|
48
|
-
name: thor
|
49
43
|
requirement: !ruby/object:Gem::Requirement
|
50
|
-
none: false
|
51
44
|
requirements:
|
52
|
-
- -
|
45
|
+
- - ">="
|
53
46
|
- !ruby/object:Gem::Version
|
54
47
|
version: '0'
|
55
|
-
|
48
|
+
name: thor
|
56
49
|
prerelease: false
|
50
|
+
type: :runtime
|
57
51
|
version_requirements: !ruby/object:Gem::Requirement
|
58
|
-
none: false
|
59
52
|
requirements:
|
60
|
-
- -
|
53
|
+
- - ">="
|
61
54
|
- !ruby/object:Gem::Version
|
62
55
|
version: '0'
|
63
56
|
- !ruby/object:Gem::Dependency
|
64
|
-
name: clamp
|
65
57
|
requirement: !ruby/object:Gem::Requirement
|
66
|
-
none: false
|
67
58
|
requirements:
|
68
|
-
- -
|
59
|
+
- - ">="
|
69
60
|
- !ruby/object:Gem::Version
|
70
61
|
version: '0'
|
71
|
-
|
62
|
+
name: clamp
|
72
63
|
prerelease: false
|
64
|
+
type: :runtime
|
73
65
|
version_requirements: !ruby/object:Gem::Requirement
|
74
|
-
none: false
|
75
66
|
requirements:
|
76
|
-
- -
|
67
|
+
- - ">="
|
77
68
|
- !ruby/object:Gem::Version
|
78
69
|
version: '0'
|
79
70
|
- !ruby/object:Gem::Dependency
|
80
|
-
name: fog
|
81
71
|
requirement: !ruby/object:Gem::Requirement
|
82
|
-
none: false
|
83
72
|
requirements:
|
84
|
-
- -
|
73
|
+
- - "<"
|
85
74
|
- !ruby/object:Gem::Version
|
86
|
-
version: '
|
87
|
-
|
75
|
+
version: '2.0'
|
76
|
+
name: fog
|
88
77
|
prerelease: false
|
78
|
+
type: :runtime
|
89
79
|
version_requirements: !ruby/object:Gem::Requirement
|
90
|
-
none: false
|
91
80
|
requirements:
|
92
|
-
- -
|
81
|
+
- - "<"
|
93
82
|
- !ruby/object:Gem::Version
|
94
|
-
version: '
|
83
|
+
version: '2.0'
|
95
84
|
- !ruby/object:Gem::Dependency
|
96
|
-
name: rake
|
97
85
|
requirement: !ruby/object:Gem::Requirement
|
98
|
-
none: false
|
99
86
|
requirements:
|
100
|
-
- -
|
87
|
+
- - ">="
|
101
88
|
- !ruby/object:Gem::Version
|
102
89
|
version: '0'
|
103
|
-
|
90
|
+
name: rake
|
104
91
|
prerelease: false
|
92
|
+
type: :development
|
105
93
|
version_requirements: !ruby/object:Gem::Requirement
|
106
|
-
none: false
|
107
94
|
requirements:
|
108
|
-
- -
|
95
|
+
- - ">="
|
109
96
|
- !ruby/object:Gem::Version
|
110
97
|
version: '0'
|
111
98
|
- !ruby/object:Gem::Dependency
|
112
|
-
name: test-unit
|
113
99
|
requirement: !ruby/object:Gem::Requirement
|
114
|
-
none: false
|
115
100
|
requirements:
|
116
|
-
- -
|
101
|
+
- - ">="
|
117
102
|
- !ruby/object:Gem::Version
|
118
103
|
version: '0'
|
119
|
-
|
104
|
+
name: test-unit
|
120
105
|
prerelease: false
|
106
|
+
type: :development
|
121
107
|
version_requirements: !ruby/object:Gem::Requirement
|
122
|
-
none: false
|
123
108
|
requirements:
|
124
|
-
- -
|
109
|
+
- - ">="
|
125
110
|
- !ruby/object:Gem::Version
|
126
111
|
version: '0'
|
127
112
|
- !ruby/object:Gem::Dependency
|
128
|
-
name: shoulda-context
|
129
113
|
requirement: !ruby/object:Gem::Requirement
|
130
|
-
none: false
|
131
114
|
requirements:
|
132
|
-
- -
|
115
|
+
- - ">="
|
133
116
|
- !ruby/object:Gem::Version
|
134
117
|
version: '0'
|
135
|
-
|
118
|
+
name: shoulda-context
|
136
119
|
prerelease: false
|
120
|
+
type: :development
|
137
121
|
version_requirements: !ruby/object:Gem::Requirement
|
138
|
-
none: false
|
139
122
|
requirements:
|
140
|
-
- -
|
123
|
+
- - ">="
|
141
124
|
- !ruby/object:Gem::Version
|
142
125
|
version: '0'
|
143
126
|
- !ruby/object:Gem::Dependency
|
144
|
-
name: mocha
|
145
127
|
requirement: !ruby/object:Gem::Requirement
|
146
|
-
none: false
|
147
128
|
requirements:
|
148
|
-
- -
|
129
|
+
- - ">="
|
149
130
|
- !ruby/object:Gem::Version
|
150
131
|
version: '0'
|
151
|
-
|
132
|
+
name: mocha
|
152
133
|
prerelease: false
|
134
|
+
type: :development
|
153
135
|
version_requirements: !ruby/object:Gem::Requirement
|
154
|
-
none: false
|
155
136
|
requirements:
|
156
|
-
- -
|
137
|
+
- - ">="
|
157
138
|
- !ruby/object:Gem::Version
|
158
139
|
version: '0'
|
159
140
|
- !ruby/object:Gem::Dependency
|
160
|
-
name: awesome_print
|
161
141
|
requirement: !ruby/object:Gem::Requirement
|
162
|
-
none: false
|
163
142
|
requirements:
|
164
|
-
- -
|
143
|
+
- - ">="
|
165
144
|
- !ruby/object:Gem::Version
|
166
145
|
version: '0'
|
167
|
-
|
146
|
+
name: awesome_print
|
168
147
|
prerelease: false
|
148
|
+
type: :development
|
169
149
|
version_requirements: !ruby/object:Gem::Requirement
|
170
|
-
none: false
|
171
150
|
requirements:
|
172
|
-
- -
|
151
|
+
- - ">="
|
173
152
|
- !ruby/object:Gem::Version
|
174
153
|
version: '0'
|
175
|
-
description:
|
176
|
-
|
177
|
-
capistrano, rubber is role based, so you can define a set
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
in instances that serve only as an 'app' role to handle increased app server load.\n"
|
154
|
+
description: |2
|
155
|
+
The rubber plugin enables relatively complex multi-instance deployments of RubyOnRails applications to
|
156
|
+
Amazon's Elastic Compute Cloud (EC2). Like capistrano, rubber is role based, so you can define a set
|
157
|
+
of configuration files for a role and then assign that role to as many concrete instances as needed. One
|
158
|
+
can also assign multiple roles to a single instance. This lets one start out with a single ec2 instance
|
159
|
+
(belonging to all roles), and add new instances into the mix as needed to scale specific facets of your
|
160
|
+
deployment, e.g. adding in instances that serve only as an 'app' role to handle increased app server load.
|
183
161
|
email:
|
184
162
|
- matt@conwaysplace.com
|
185
163
|
- nirvdrum@gmail.com
|
@@ -188,8 +166,8 @@ executables:
|
|
188
166
|
extensions: []
|
189
167
|
extra_rdoc_files: []
|
190
168
|
files:
|
191
|
-
- .gitignore
|
192
|
-
- .travis.yml
|
169
|
+
- ".gitignore"
|
170
|
+
- ".travis.yml"
|
193
171
|
- CHANGELOG
|
194
172
|
- Gemfile
|
195
173
|
- Gemfile.1.8.7
|
@@ -201,12 +179,16 @@ files:
|
|
201
179
|
- lib/capistrano/find_servers_for_task_fix.rb
|
202
180
|
- lib/capistrano/hostcmd.rb
|
203
181
|
- lib/capistrano/thread_safety_fix.rb
|
182
|
+
- lib/ext/fog/compute/digital_ocean_v2.rb
|
204
183
|
- lib/rubber.rb
|
205
184
|
- lib/rubber/capistrano.rb
|
206
185
|
- lib/rubber/cli.rb
|
207
186
|
- lib/rubber/cloud.rb
|
208
187
|
- lib/rubber/cloud/aws.rb
|
209
|
-
- lib/rubber/cloud/
|
188
|
+
- lib/rubber/cloud/aws/base.rb
|
189
|
+
- lib/rubber/cloud/aws/classic.rb
|
190
|
+
- lib/rubber/cloud/aws/table_store.rb
|
191
|
+
- lib/rubber/cloud/aws/vpc.rb
|
210
192
|
- lib/rubber/cloud/base.rb
|
211
193
|
- lib/rubber/cloud/digital_ocean.rb
|
212
194
|
- lib/rubber/cloud/fog.rb
|
@@ -243,6 +225,7 @@ files:
|
|
243
225
|
- lib/rubber/recipes/rubber/tags.rb
|
244
226
|
- lib/rubber/recipes/rubber/utils.rb
|
245
227
|
- lib/rubber/recipes/rubber/volumes.rb
|
228
|
+
- lib/rubber/recipes/rubber/vpcs.rb
|
246
229
|
- lib/rubber/tag.rb
|
247
230
|
- lib/rubber/thread_safe_proxy.rb
|
248
231
|
- lib/rubber/util.rb
|
@@ -514,6 +497,8 @@ files:
|
|
514
497
|
- templates/mysql_proxy/config/rubber/mysql_proxy/mysql-proxy.lua
|
515
498
|
- templates/mysql_proxy/config/rubber/rubber-mysql_proxy.yml
|
516
499
|
- templates/mysql_proxy/templates.yml
|
500
|
+
- templates/nat_gateway/config/rubber/role/nat_gateway/nat.sh
|
501
|
+
- templates/nat_gateway/templates.yml
|
517
502
|
- templates/newrelic/config/rubber/deploy-newrelic.rb
|
518
503
|
- templates/newrelic/config/rubber/role/newrelic/monit-newrelic.conf
|
519
504
|
- templates/newrelic/config/rubber/rubber-newrelic.yml
|
@@ -641,8 +626,9 @@ files:
|
|
641
626
|
- templates/zookeeper/config/rubber/role/zookeeper/zookeeper-upstart.conf
|
642
627
|
- templates/zookeeper/config/rubber/rubber-zookeeper.yml
|
643
628
|
- templates/zookeeper/templates.yml
|
644
|
-
- test/cloud/
|
645
|
-
- test/cloud/
|
629
|
+
- test/cloud/aws/classic_test.rb
|
630
|
+
- test/cloud/aws/table_store_test.rb
|
631
|
+
- test/cloud/aws/vpc_test.rb
|
646
632
|
- test/cloud/digital_ocean_test.rb
|
647
633
|
- test/cloud/fog_storage_test.rb
|
648
634
|
- test/cloud/fog_test.rb
|
@@ -686,30 +672,25 @@ files:
|
|
686
672
|
- test/util_test.rb
|
687
673
|
homepage: https://github.com/rubber/rubber
|
688
674
|
licenses: []
|
689
|
-
|
675
|
+
metadata: {}
|
676
|
+
post_install_message:
|
690
677
|
rdoc_options: []
|
691
678
|
require_paths:
|
692
679
|
- lib
|
693
680
|
required_ruby_version: !ruby/object:Gem::Requirement
|
694
|
-
none: false
|
695
681
|
requirements:
|
696
|
-
- -
|
682
|
+
- - ">="
|
697
683
|
- !ruby/object:Gem::Version
|
698
684
|
version: 1.9.3
|
699
685
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
700
|
-
none: false
|
701
686
|
requirements:
|
702
|
-
- -
|
687
|
+
- - ">="
|
703
688
|
- !ruby/object:Gem::Version
|
704
689
|
version: '0'
|
705
|
-
segments:
|
706
|
-
- 0
|
707
|
-
hash: -1794893249450792958
|
708
690
|
requirements: []
|
709
|
-
rubyforge_project:
|
710
|
-
rubygems_version:
|
711
|
-
signing_key:
|
712
|
-
specification_version:
|
713
|
-
summary: A capistrano plugin for managing multi-instance deployments to the cloud
|
714
|
-
(ec2)
|
691
|
+
rubyforge_project:
|
692
|
+
rubygems_version: 2.4.8
|
693
|
+
signing_key:
|
694
|
+
specification_version: 4
|
695
|
+
summary: A capistrano plugin for managing multi-instance deployments to the cloud (ec2)
|
715
696
|
test_files: []
|