dew 0.1.3 → 0.1.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/lib/dew/cloud.rb +10 -0
- data/lib/dew/commands/deploy.rb +15 -3
- data/lib/dew/commands/deploy/templates/apache.conf.erb +25 -1
- data/lib/dew/commands/environments.rb +28 -0
- data/lib/dew/models/account.rb +20 -0
- data/lib/dew/version.rb +1 -1
- data/spec/dew/cloud_spec.rb +16 -2
- data/spec/dew/models/account_spec.rb +30 -12
- metadata +44 -30
data/lib/dew/cloud.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'opensrs'
|
2
|
+
|
1
3
|
class Cloud
|
2
4
|
|
3
5
|
attr_reader :region, :account_name, :profile_name
|
@@ -64,6 +66,14 @@ class Cloud
|
|
64
66
|
account_dir = File.join(ENV['HOME'], '.dew','accounts')
|
65
67
|
File.join(account_dir, 'keys', account_name, region, "#{key_name}.pem")
|
66
68
|
end
|
69
|
+
|
70
|
+
def has_dns?
|
71
|
+
account.has_dns?
|
72
|
+
end
|
73
|
+
|
74
|
+
def dns
|
75
|
+
@dns ||= OpenSRS::Server.new(account.opensrs_credentials)
|
76
|
+
end
|
67
77
|
|
68
78
|
private
|
69
79
|
|
data/lib/dew/commands/deploy.rb
CHANGED
@@ -20,6 +20,7 @@ class DeployCommand < Clamp::Command
|
|
20
20
|
option ['--ssl-certificate'], 'FILE', "SSL Certificate file"
|
21
21
|
option ['--ssl-private-key'], 'FILE', "SSL Private Key file"
|
22
22
|
option ['--[no-]passenger'], :flag, "Use passenger (just server public/* if unset)", :default => true, :attribute_name => :use_passenger
|
23
|
+
option ['--gamej-proxy'], 'GAMEJ_PROXY', "GameJ Reverse Proxy"
|
23
24
|
|
24
25
|
def check_and_remove_rvmrc
|
25
26
|
if ssh.exist? "#{application_name}/.rvmrc"
|
@@ -75,14 +76,14 @@ class DeployCommand < Clamp::Command
|
|
75
76
|
|
76
77
|
check_and_remove_rvmrc
|
77
78
|
Inform.debug("Checking out version %{version}", :version => revision)
|
78
|
-
ssh.run "cd #{application_name} && git checkout -q -f
|
79
|
+
ssh.run "cd #{application_name} && git checkout -q -f #{revision}"
|
79
80
|
check_and_remove_rvmrc
|
80
81
|
end
|
81
82
|
|
82
83
|
cd_and_rvm = "cd #{application_name} && . /usr/local/rvm/scripts/rvm && rvm use ruby-1.9.2 && RAILS_ENV=#{rails_env} "
|
83
84
|
|
84
85
|
Inform.info("Updating/installing gems") do
|
85
|
-
ssh.run cd_and_rvm + "bundle install"
|
86
|
+
ssh.run cd_and_rvm + "bundle install --without development"
|
86
87
|
end
|
87
88
|
|
88
89
|
if ssh.exist?("#{application_name}/config/database.yml")
|
@@ -109,6 +110,9 @@ class DeployCommand < Clamp::Command
|
|
109
110
|
end
|
110
111
|
|
111
112
|
if use_ssl?
|
113
|
+
Inform.info "Enabling Mod SSL" do
|
114
|
+
ssh.run "sudo a2enmod ssl"
|
115
|
+
end
|
112
116
|
Inform.info "Uploading SSL Certificate & Private Key" do
|
113
117
|
ssh.run "sudo mkdir -p /etc/apache2/certs" unless ssh.exist?("/etc/apache2/certs")
|
114
118
|
ssh.upload ssl_certificate, "/tmp/sslcert"
|
@@ -117,6 +121,13 @@ class DeployCommand < Clamp::Command
|
|
117
121
|
ssh.run "sudo mv -f /tmp/sslkey /etc/apache2/certs/#{application_name}.key"
|
118
122
|
end
|
119
123
|
end
|
124
|
+
|
125
|
+
if gamej_proxy
|
126
|
+
Inform.info "Enabling Mod Proxy" do
|
127
|
+
ssh.run "sudo a2enmod proxy"
|
128
|
+
ssh.run "sudo a2enmod proxy_http"
|
129
|
+
end
|
130
|
+
end
|
120
131
|
|
121
132
|
Inform.info("Starting application") do
|
122
133
|
if ssh.exist?('/etc/apache2/sites-enabled/000-default')
|
@@ -130,7 +141,8 @@ class DeployCommand < Clamp::Command
|
|
130
141
|
:server_name => server_name,
|
131
142
|
:rails_env => rails_env,
|
132
143
|
:application_name => application_name,
|
133
|
-
:working_directory => "/home/ubuntu/#{application_name}"
|
144
|
+
:working_directory => "/home/ubuntu/#{application_name}",
|
145
|
+
:gamej_proxy => gamej_proxy
|
134
146
|
).instance_eval {binding})
|
135
147
|
ssh.write passenger_config, "/tmp/apache.conf"
|
136
148
|
ssh.run "sudo cp /tmp/apache.conf /etc/apache2/sites-available/#{application_name}"
|
@@ -34,8 +34,21 @@
|
|
34
34
|
LogLevel warn
|
35
35
|
|
36
36
|
CustomLog /var/log/apache2/<%= application_name %>-access.log combined
|
37
|
+
|
38
|
+
<% if gamej_proxy %>
|
39
|
+
<Location /api>
|
40
|
+
Order allow,deny
|
41
|
+
Allow from all
|
42
|
+
</Location>
|
43
|
+
|
44
|
+
# Proxy off to the engine
|
45
|
+
ProxyRequests Off
|
46
|
+
ProxyPass /api/ http://<%= gamej_proxy %>/
|
47
|
+
ProxyPassReverse /api/ http://<%= server_name %>/
|
48
|
+
<% end %>
|
37
49
|
</VirtualHost>
|
38
50
|
<% if use_ssl? %>
|
51
|
+
NameVirtualHost *:443
|
39
52
|
<VirtualHost *:443>
|
40
53
|
ServerAdmin admin@playup.com
|
41
54
|
|
@@ -77,6 +90,17 @@
|
|
77
90
|
|
78
91
|
CustomLog /var/log/apache2/<%= application_name %>-access.log combined
|
79
92
|
|
93
|
+
<% if gamej_proxy %>
|
94
|
+
<Location /api>
|
95
|
+
Order allow,deny
|
96
|
+
Allow from all
|
97
|
+
</Location>
|
98
|
+
|
99
|
+
# Proxy off to the engine
|
100
|
+
SSLProxyEngine on
|
101
|
+
ProxyRequests Off
|
102
|
+
ProxyPass /api/ https://<%= gamej_proxy %>/
|
103
|
+
ProxyPassReverse /api/ https://<%= server_name %>/
|
104
|
+
<% end %>
|
80
105
|
</VirtualHost>
|
81
106
|
<% end %>
|
82
|
-
|
@@ -88,6 +88,34 @@ class EnvironmentsCommand < Clamp::Command
|
|
88
88
|
end
|
89
89
|
end
|
90
90
|
end
|
91
|
+
|
92
|
+
subcommand "run", "Run a script or command on each instance in the environment" do
|
93
|
+
parameter "ENVIRONMENT_NAME", "Name of the environment"
|
94
|
+
option ['-s', '--script'], "FILENAME", "Script to run on each instance"
|
95
|
+
option ['-c', '--command'], "COMMAND", "Command to run on each instance"
|
96
|
+
|
97
|
+
def execute
|
98
|
+
raise "Please supply either -s or -c" unless script or command
|
99
|
+
|
100
|
+
env = Environment.get(environment_name)
|
101
|
+
|
102
|
+
Inform.info("Running on %{l} servers", :l => env.servers.length) do
|
103
|
+
env.servers.each do |server|
|
104
|
+
start = Time.now
|
105
|
+
ssh = server.ssh
|
106
|
+
if script
|
107
|
+
ssh.upload(script, '/tmp/script')
|
108
|
+
ssh.run("chmod +x /tmp/script")
|
109
|
+
ssh.run("/tmp/script", :quiet => false)
|
110
|
+
ssh.run("rm /tmp/script")
|
111
|
+
else
|
112
|
+
ssh.run(command, :quiet => false)
|
113
|
+
end
|
114
|
+
Inform.debug("%{s} took %{time} seconds", :s => server.id, :time => (Time.now - start))
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
91
119
|
|
92
120
|
subcommand "destroy", "Destroy an existing environment" do
|
93
121
|
|
data/lib/dew/models/account.rb
CHANGED
@@ -23,6 +23,26 @@ class Account
|
|
23
23
|
def aws_user_id
|
24
24
|
@yaml['aws']['user_id'].gsub('-', '')
|
25
25
|
end
|
26
|
+
|
27
|
+
def has_dns?
|
28
|
+
@yaml.include?('dns')
|
29
|
+
end
|
30
|
+
|
31
|
+
def dns_username
|
32
|
+
@yaml['dns']['username']
|
33
|
+
end
|
34
|
+
|
35
|
+
def dns_password
|
36
|
+
@yaml['dns']['password']
|
37
|
+
end
|
38
|
+
|
39
|
+
def dns_domain
|
40
|
+
@yaml['dns']['domain']
|
41
|
+
end
|
42
|
+
|
43
|
+
def dns_prefix
|
44
|
+
@yaml['dns']['prefix']
|
45
|
+
end
|
26
46
|
|
27
47
|
def initialize(yaml)
|
28
48
|
@yaml = yaml
|
data/lib/dew/version.rb
CHANGED
data/spec/dew/cloud_spec.rb
CHANGED
@@ -7,8 +7,8 @@ describe :Cloud do
|
|
7
7
|
let (:profile_name) { 'test-light' }
|
8
8
|
|
9
9
|
let (:aws_credentials) { {:aws_access_key_id => '1234', :aws_secret_access_key => '5678', :region => region} }
|
10
|
-
let (:root_aws_credentials) { aws_credentials.merge(:provider => 'AWS')}
|
11
|
-
let (:account) { double('Account', aws_credentials) }
|
10
|
+
let (:root_aws_credentials) { aws_credentials.merge(:provider => 'AWS') }
|
11
|
+
let (:account) { double('Account', aws_credentials.merge(:has_dns? => false)) }
|
12
12
|
let (:profile) { double('Profile') }
|
13
13
|
|
14
14
|
context "after connect is called" do
|
@@ -86,5 +86,19 @@ describe :Cloud do
|
|
86
86
|
end
|
87
87
|
end
|
88
88
|
|
89
|
+
it { Cloud.has_dns?.should be_false }
|
90
|
+
|
91
|
+
context "with DNS credentials in the account" do
|
92
|
+
before :each do
|
93
|
+
account.stub(:has_dns? => true)
|
94
|
+
end
|
95
|
+
it { Cloud.has_dns?.should be_true }
|
96
|
+
|
97
|
+
it "should provide an OpenSRS DNS handle" do
|
98
|
+
Cloud.account.should_receive(:opensrs_credentials).and_return('opensrs creds')
|
99
|
+
OpenSRS::Server.should_receive(:new).with('opensrs creds').and_return('server')
|
100
|
+
Cloud.dns.should == 'server'
|
101
|
+
end
|
102
|
+
end
|
89
103
|
end
|
90
104
|
end
|
@@ -12,26 +12,43 @@ describe Account do
|
|
12
12
|
|
13
13
|
describe "parsing yaml" do
|
14
14
|
before :each do
|
15
|
-
yaml
|
15
|
+
File.stub(:read).and_return(yaml)
|
16
|
+
end
|
17
|
+
|
18
|
+
subject { Account.read('foo') }
|
19
|
+
|
20
|
+
describe "with an aws section" do
|
21
|
+
let (:yaml) {
|
16
22
|
"aws:
|
17
23
|
user_id: 9999-3333-2222
|
18
24
|
access_key_id: foo
|
19
25
|
secret_access_key: bar"
|
26
|
+
}
|
20
27
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
it "should have a user_id stripped of dashes" do
|
26
|
-
@account.aws_user_id.should == '999933332222'
|
27
|
-
end
|
28
|
+
it "should have a user_id stripped of dashes" do
|
29
|
+
subject.aws_user_id.should == '999933332222'
|
30
|
+
end
|
28
31
|
|
29
|
-
|
30
|
-
|
32
|
+
it { subject.aws_access_key_id.should == 'foo' }
|
33
|
+
it { subject.aws_secret_access_key.should == 'bar' }
|
34
|
+
it { subject.has_dns?.should be_false }
|
31
35
|
end
|
32
36
|
|
33
|
-
|
34
|
-
|
37
|
+
describe "with a DNS section" do
|
38
|
+
let (:yaml) {
|
39
|
+
"
|
40
|
+
dns:
|
41
|
+
username: bob
|
42
|
+
domain: mydomain.com
|
43
|
+
password: steve
|
44
|
+
prefix: env
|
45
|
+
"
|
46
|
+
}
|
47
|
+
it { subject.has_dns?.should be_true }
|
48
|
+
it { subject.dns_username.should == 'bob' }
|
49
|
+
it { subject.dns_domain.should == 'mydomain.com' }
|
50
|
+
it { subject.dns_password.should == 'steve' }
|
51
|
+
it { subject.dns_prefix.should == 'env' }
|
35
52
|
end
|
36
53
|
end
|
37
54
|
|
@@ -43,5 +60,6 @@ describe Account do
|
|
43
60
|
Account.user_ids.sort.should == ['id1', 'id2']
|
44
61
|
end
|
45
62
|
end
|
63
|
+
|
46
64
|
|
47
65
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dew
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
9
|
+
- 4
|
10
|
+
version: 0.1.4
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- PlayUp Devops
|
@@ -15,12 +15,12 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-07-
|
18
|
+
date: 2011-07-06 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: inform
|
22
22
|
prerelease: false
|
23
|
-
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
24
|
none: false
|
25
25
|
requirements:
|
26
26
|
- - ~>
|
@@ -32,11 +32,11 @@ dependencies:
|
|
32
32
|
- 4
|
33
33
|
version: 0.0.4
|
34
34
|
type: :runtime
|
35
|
-
|
35
|
+
version_requirements: *id001
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: clamp
|
38
38
|
prerelease: false
|
39
|
-
|
39
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
40
40
|
none: false
|
41
41
|
requirements:
|
42
42
|
- - ~>
|
@@ -48,11 +48,11 @@ dependencies:
|
|
48
48
|
- 0
|
49
49
|
version: 0.2.0
|
50
50
|
type: :runtime
|
51
|
-
|
51
|
+
version_requirements: *id002
|
52
52
|
- !ruby/object:Gem::Dependency
|
53
53
|
name: fog
|
54
54
|
prerelease: false
|
55
|
-
|
55
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
56
56
|
none: false
|
57
57
|
requirements:
|
58
58
|
- - ~>
|
@@ -64,11 +64,11 @@ dependencies:
|
|
64
64
|
- 2
|
65
65
|
version: 0.8.2
|
66
66
|
type: :runtime
|
67
|
-
|
67
|
+
version_requirements: *id003
|
68
68
|
- !ruby/object:Gem::Dependency
|
69
69
|
name: gofer
|
70
70
|
prerelease: false
|
71
|
-
|
71
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ~>
|
@@ -80,11 +80,11 @@ dependencies:
|
|
80
80
|
- 5
|
81
81
|
version: 0.2.5
|
82
82
|
type: :runtime
|
83
|
-
|
83
|
+
version_requirements: *id004
|
84
84
|
- !ruby/object:Gem::Dependency
|
85
85
|
name: highline
|
86
86
|
prerelease: false
|
87
|
-
|
87
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
88
88
|
none: false
|
89
89
|
requirements:
|
90
90
|
- - ~>
|
@@ -96,11 +96,11 @@ dependencies:
|
|
96
96
|
- 2
|
97
97
|
version: 1.6.2
|
98
98
|
type: :runtime
|
99
|
-
|
99
|
+
version_requirements: *id005
|
100
100
|
- !ruby/object:Gem::Dependency
|
101
101
|
name: terminal-table
|
102
102
|
prerelease: false
|
103
|
-
|
103
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
104
104
|
none: false
|
105
105
|
requirements:
|
106
106
|
- - ~>
|
@@ -112,11 +112,25 @@ dependencies:
|
|
112
112
|
- 2
|
113
113
|
version: 1.4.2
|
114
114
|
type: :runtime
|
115
|
-
|
115
|
+
version_requirements: *id006
|
116
|
+
- !ruby/object:Gem::Dependency
|
117
|
+
name: opensrs
|
118
|
+
prerelease: false
|
119
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
120
|
+
none: false
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
hash: 3
|
125
|
+
segments:
|
126
|
+
- 0
|
127
|
+
version: "0"
|
128
|
+
type: :runtime
|
129
|
+
version_requirements: *id007
|
116
130
|
- !ruby/object:Gem::Dependency
|
117
131
|
name: nokogiri
|
118
132
|
prerelease: false
|
119
|
-
|
133
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
120
134
|
none: false
|
121
135
|
requirements:
|
122
136
|
- - ">="
|
@@ -126,11 +140,11 @@ dependencies:
|
|
126
140
|
- 0
|
127
141
|
version: "0"
|
128
142
|
type: :runtime
|
129
|
-
|
143
|
+
version_requirements: *id008
|
130
144
|
- !ruby/object:Gem::Dependency
|
131
145
|
name: rake
|
132
146
|
prerelease: false
|
133
|
-
|
147
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
134
148
|
none: false
|
135
149
|
requirements:
|
136
150
|
- - ~>
|
@@ -142,11 +156,11 @@ dependencies:
|
|
142
156
|
- 7
|
143
157
|
version: 0.8.7
|
144
158
|
type: :development
|
145
|
-
|
159
|
+
version_requirements: *id009
|
146
160
|
- !ruby/object:Gem::Dependency
|
147
161
|
name: rspec
|
148
162
|
prerelease: false
|
149
|
-
|
163
|
+
requirement: &id010 !ruby/object:Gem::Requirement
|
150
164
|
none: false
|
151
165
|
requirements:
|
152
166
|
- - ~>
|
@@ -158,11 +172,11 @@ dependencies:
|
|
158
172
|
- 0
|
159
173
|
version: 2.6.0
|
160
174
|
type: :development
|
161
|
-
|
175
|
+
version_requirements: *id010
|
162
176
|
- !ruby/object:Gem::Dependency
|
163
177
|
name: cucumber
|
164
178
|
prerelease: false
|
165
|
-
|
179
|
+
requirement: &id011 !ruby/object:Gem::Requirement
|
166
180
|
none: false
|
167
181
|
requirements:
|
168
182
|
- - ~>
|
@@ -174,11 +188,11 @@ dependencies:
|
|
174
188
|
- 3
|
175
189
|
version: 0.10.3
|
176
190
|
type: :development
|
177
|
-
|
191
|
+
version_requirements: *id011
|
178
192
|
- !ruby/object:Gem::Dependency
|
179
193
|
name: simplecov
|
180
194
|
prerelease: false
|
181
|
-
|
195
|
+
requirement: &id012 !ruby/object:Gem::Requirement
|
182
196
|
none: false
|
183
197
|
requirements:
|
184
198
|
- - ~>
|
@@ -190,11 +204,11 @@ dependencies:
|
|
190
204
|
- 0
|
191
205
|
version: 0.4.0
|
192
206
|
type: :development
|
193
|
-
|
207
|
+
version_requirements: *id012
|
194
208
|
- !ruby/object:Gem::Dependency
|
195
209
|
name: flay
|
196
210
|
prerelease: false
|
197
|
-
|
211
|
+
requirement: &id013 !ruby/object:Gem::Requirement
|
198
212
|
none: false
|
199
213
|
requirements:
|
200
214
|
- - ~>
|
@@ -206,11 +220,11 @@ dependencies:
|
|
206
220
|
- 2
|
207
221
|
version: 1.4.2
|
208
222
|
type: :development
|
209
|
-
|
223
|
+
version_requirements: *id013
|
210
224
|
- !ruby/object:Gem::Dependency
|
211
225
|
name: geminabox
|
212
226
|
prerelease: false
|
213
|
-
|
227
|
+
requirement: &id014 !ruby/object:Gem::Requirement
|
214
228
|
none: false
|
215
229
|
requirements:
|
216
230
|
- - ">="
|
@@ -220,7 +234,7 @@ dependencies:
|
|
220
234
|
- 0
|
221
235
|
version: "0"
|
222
236
|
type: :development
|
223
|
-
|
237
|
+
version_requirements: *id014
|
224
238
|
description: |
|
225
239
|
Dew is a layer between fog and the ground
|
226
240
|
|