pvcglue 0.1.15 → 0.1.17
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/README.md +2 -2
- data/bin/pvc +2 -2
- data/lib/pvcglue.rb +1 -0
- data/lib/pvcglue/capistrano.rb +4 -0
- data/lib/pvcglue/cli.rb +79 -3
- data/lib/pvcglue/configuration.rb +41 -9
- data/lib/pvcglue/local.rb +231 -0
- data/lib/pvcglue/manager.rb +39 -0
- data/lib/pvcglue/packages/rvm.rb +1 -0
- data/lib/pvcglue/templates/database.yml.erb +4 -0
- data/lib/pvcglue/templates/deploy.rb.erb +13 -0
- data/lib/pvcglue/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5317c0a638c5ddacd0a3ee767d7754caa2c04848
|
4
|
+
data.tar.gz: 7342a1125dcc1b35fcbb969043455bc8a99c734c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eac0304984a7caa026023d250da35441a8b95aa3e4755d9c5efc12175b8cee108f1ef5e96af81b4654028905f535f8ce99e72bd0695bf7fdf307a60f788c2838
|
7
|
+
data.tar.gz: a9e4d18207fe3eb2a920125ab4e2df1bf6174957b1f06b874096d62ae7b8d786798b0f17dd9851d2c21847b627d83cb65f068c06a2908d809dddbf6045d25e54
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# PVC Glue
|
2
2
|
|
3
|
-
Pico Virtual Cloud
|
3
|
+
Pico Virtual Cloud Glue creates a tightly integrated (very small) virtual cloud for your Rails application.
|
4
4
|
|
5
5
|
An opinionated cloud application manager for Rails applications using your own servers.
|
6
6
|
|
@@ -158,7 +158,7 @@ Add these lines to your application's Gemfile. `dotenv-rails` must be listed fi
|
|
158
158
|
|
159
159
|
Then add these lines to your application's Gemfile, whereever you like (usually at the end):
|
160
160
|
|
161
|
-
gem 'pvcglue', "~> 0.1.
|
161
|
+
gem 'pvcglue', "~> 0.1.15", :group => :development
|
162
162
|
gem 'pvcglue_dbutils', "~> 0.5.3"
|
163
163
|
|
164
164
|
And then execute:
|
data/bin/pvc
CHANGED
@@ -4,11 +4,11 @@ require 'pvcglue/cli'
|
|
4
4
|
# Allow use of Capistrano style environment syntax and convert to 'standard' syntax
|
5
5
|
# Example: `pvc production bootstrap` ==> `pvc bootstrap --stage=production`
|
6
6
|
# TODO: refactor to use a list of user specified environments
|
7
|
-
if ARGV.count >= 2 && %w[alpha beta gamma delta preview production staging all].include?(ARGV[0])
|
7
|
+
if ARGV.count >= 2 && %w[local test alpha beta gamma delta preview production staging all].include?(ARGV[0])
|
8
8
|
ARGV[0], ARGV[1] = ARGV[1], "--stage=#{ARGV[0]}"
|
9
9
|
end
|
10
10
|
|
11
11
|
# puts ARGV.inspect
|
12
12
|
|
13
13
|
Pvcglue::CLI.start
|
14
|
-
puts "Done
|
14
|
+
puts "----- Done -----"
|
data/lib/pvcglue.rb
CHANGED
data/lib/pvcglue/capistrano.rb
CHANGED
data/lib/pvcglue/cli.rb
CHANGED
@@ -148,6 +148,24 @@ module Pvcglue
|
|
148
148
|
sh(server)
|
149
149
|
end
|
150
150
|
|
151
|
+
desc "deploy", "deploy the app"
|
152
|
+
method_option :stage, :required => true, :aliases => "-s"
|
153
|
+
|
154
|
+
def deploy
|
155
|
+
Pvcglue::Capistrano.deploy
|
156
|
+
end
|
157
|
+
|
158
|
+
desc "rake", "run rake task on remote stage"
|
159
|
+
method_option :stage, :required => true, :aliases => "-s"
|
160
|
+
|
161
|
+
def rake(*tasks)
|
162
|
+
if Pvcglue.cloud.stage_name == 'production'
|
163
|
+
# if Pvcglue.cloud.stage_name == 'local'
|
164
|
+
raise(Thor::Error, "\nDidn't think so!\n") unless yes?("\n\nStop! Think! Are you sure you want to do this on the #{Pvcglue.cloud.stage_name} stage? (y/N)")
|
165
|
+
end
|
166
|
+
Pvcglue::Capistrano.rake(tasks)
|
167
|
+
end
|
168
|
+
|
151
169
|
desc "pvcify", "update capistrano, database.yml and other configurations"
|
152
170
|
method_option :stage, :required => true, :aliases => "-s"
|
153
171
|
|
@@ -156,12 +174,70 @@ module Pvcglue
|
|
156
174
|
Pvcglue::Db.configure_database_yml
|
157
175
|
end
|
158
176
|
|
159
|
-
desc "
|
177
|
+
desc "start", "start local virtual machines (build first, if required)"
|
160
178
|
method_option :stage, :required => true, :aliases => "-s"
|
161
179
|
|
162
|
-
def
|
163
|
-
Pvcglue::
|
180
|
+
def start
|
181
|
+
Pvcglue::Local.start
|
182
|
+
end
|
183
|
+
|
184
|
+
desc "stop", "shut down local virtual machines"
|
185
|
+
method_option :stage, :required => true, :aliases => "-s"
|
186
|
+
|
187
|
+
def stop
|
188
|
+
Pvcglue::Local.stop
|
189
|
+
end
|
190
|
+
|
191
|
+
desc "restart", "stop and then start local virtual machines"
|
192
|
+
method_option :stage, :required => true, :aliases => "-s"
|
193
|
+
|
194
|
+
def restart
|
195
|
+
Pvcglue::Local.restart
|
196
|
+
end
|
197
|
+
|
198
|
+
desc "destroy", "destory local virtual machines"
|
199
|
+
method_option :stage, :required => true, :aliases => "-s"
|
200
|
+
|
201
|
+
def destroy
|
202
|
+
Pvcglue::Local.destroy
|
203
|
+
end
|
204
|
+
|
205
|
+
desc "suspend", "suspend local virtual machines"
|
206
|
+
method_option :stage, :required => true, :aliases => "-s"
|
207
|
+
|
208
|
+
def suspend
|
209
|
+
Pvcglue::Local.suspend
|
210
|
+
end
|
211
|
+
|
212
|
+
desc "status", "show status of local virtual machines"
|
213
|
+
method_option :stage, :required => true, :aliases => "-s"
|
214
|
+
|
215
|
+
def status
|
216
|
+
Pvcglue::Local.status
|
217
|
+
end
|
218
|
+
|
219
|
+
desc "kill", "force shutdown (power off) local virtual machines - may cause data corruption"
|
220
|
+
method_option :stage, :required => true, :aliases => "-s"
|
221
|
+
|
222
|
+
def kill
|
223
|
+
Pvcglue::Local.kill
|
224
|
+
end
|
225
|
+
|
226
|
+
desc "rebuild", "destroy, build and start local virtual machines"
|
227
|
+
method_option :stage, :required => true, :aliases => "-s"
|
228
|
+
|
229
|
+
def rebuild
|
230
|
+
Pvcglue::Local.rebuild
|
164
231
|
end
|
232
|
+
|
233
|
+
desc "update_config", "debug use"
|
234
|
+
method_option :stage, :required => true, :aliases => "-s"
|
235
|
+
|
236
|
+
def update_config
|
237
|
+
Pvcglue::Local.update_local_config_from_cache
|
238
|
+
end
|
239
|
+
|
240
|
+
|
165
241
|
end
|
166
242
|
|
167
243
|
end
|
@@ -9,6 +9,7 @@ module Pvcglue
|
|
9
9
|
class Configuration < Thor
|
10
10
|
|
11
11
|
attr_accessor :cloud_manager
|
12
|
+
attr_accessor :local_cloud_manager
|
12
13
|
attr_accessor :cloud_name
|
13
14
|
attr_accessor :application_name
|
14
15
|
attr_accessor :context
|
@@ -21,19 +22,36 @@ module Pvcglue
|
|
21
22
|
ENV['PVCGLUE_ENV_PREFIX'] || 'PVCGLUE'
|
22
23
|
end
|
23
24
|
|
25
|
+
def self.project_file_name
|
26
|
+
File.join(self.application_dir, file_name)
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.application_dir
|
30
|
+
Dir.pwd
|
31
|
+
end
|
24
32
|
|
25
33
|
# silence Thor warnings, as these are not Thor commands. (But we still need 'say' and 'ask' and friends.)
|
26
34
|
no_commands do
|
27
35
|
|
28
36
|
def initialize
|
29
|
-
|
30
|
-
|
31
|
-
|
37
|
+
if Pvcglue::Manager.local_mode?
|
38
|
+
init(:local_cloud_manager)
|
39
|
+
@cloud_manager = @local_cloud_manager
|
40
|
+
else
|
41
|
+
init(:cloud_manager) || configure_manager
|
42
|
+
end
|
43
|
+
|
44
|
+
# raise(Thor::Error, "The manager has not been configured. :(") if cloud_manager.nil?
|
45
|
+
raise("The manager has not been configured. :(") if cloud_manager.nil?
|
32
46
|
init_except_manager
|
33
47
|
end
|
34
48
|
|
35
49
|
def init_except_manager
|
36
|
-
|
50
|
+
if Pvcglue::Manager.local_mode?
|
51
|
+
@cloud_name = 'local_cloud'
|
52
|
+
else
|
53
|
+
init(:cloud_name, 'cluster_one')
|
54
|
+
end
|
37
55
|
init(:application_name, find_app_name)
|
38
56
|
end
|
39
57
|
|
@@ -84,17 +102,31 @@ module Pvcglue
|
|
84
102
|
end
|
85
103
|
|
86
104
|
def project_file_name
|
87
|
-
|
105
|
+
self.class.project_file_name
|
88
106
|
end
|
89
107
|
|
90
108
|
def user_file_name
|
91
109
|
File.join(Dir.home, self.class.file_name)
|
92
110
|
end
|
93
111
|
|
112
|
+
# Thanks to http://stackoverflow.com/a/1509957/444774
|
113
|
+
def underscore(camel_cased_word)
|
114
|
+
camel_cased_word.to_s.gsub(/::/, '/').
|
115
|
+
gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2').
|
116
|
+
gsub(/([a-z\d])([A-Z])/, '\1_\2').
|
117
|
+
tr("-", "_").
|
118
|
+
downcase
|
119
|
+
end
|
120
|
+
|
94
121
|
def find_app_name
|
95
|
-
# try
|
122
|
+
# try known files...anyone know a better way, without loading Rails?
|
96
123
|
rack_up = File.join(application_dir, 'config.ru')
|
97
|
-
$1
|
124
|
+
app_name = underscore($1) if File.exists?(rack_up) && File.read(rack_up) =~ /^run (.*)::/
|
125
|
+
unless app_name
|
126
|
+
file_name = File.join(application_dir, 'config', 'application.rb')
|
127
|
+
app_name = underscore($1) if File.exists?(file_name) && File.read(file_name) =~ /^module (.*)/
|
128
|
+
end
|
129
|
+
app_name
|
98
130
|
end
|
99
131
|
|
100
132
|
def options
|
@@ -118,7 +150,7 @@ module Pvcglue
|
|
118
150
|
end
|
119
151
|
|
120
152
|
def application_dir
|
121
|
-
|
153
|
+
self.class.application_dir
|
122
154
|
end
|
123
155
|
|
124
156
|
def app_maintenance_files_dir
|
@@ -126,7 +158,7 @@ module Pvcglue
|
|
126
158
|
end
|
127
159
|
|
128
160
|
def ruby_version_file_name
|
129
|
-
File.join(application_dir,'.ruby-version')
|
161
|
+
File.join(application_dir, '.ruby-version')
|
130
162
|
end
|
131
163
|
|
132
164
|
def ruby_version
|
@@ -0,0 +1,231 @@
|
|
1
|
+
module Pvcglue
|
2
|
+
class Local
|
3
|
+
MACHINES = %w(manager lb web web_2 db memcached)
|
4
|
+
|
5
|
+
def self.vagrant(command)
|
6
|
+
raise(Thor::Error, "This command can only be used for the 'local' and 'test' stages.") unless Pvcglue.cloud.stage_name.in? %w(local test)
|
7
|
+
raise(Thor::Error, "Vagrant (www.vagrantup.com) does not appear to be installed. :(") unless vagrant_available?
|
8
|
+
Bundler.with_clean_env { system("vagrant #{command}") }
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.vagrant_available?
|
12
|
+
# puts Bundler.with_clean_env { `vagrant --version` }
|
13
|
+
Bundler.with_clean_env { `vagrant --version` } =~ /Vagrant \d+\.\d+\.\d+/
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.start
|
17
|
+
if vagrant("up #{machines_in_stage}")
|
18
|
+
update_local_config(get_info_for_machines)
|
19
|
+
else
|
20
|
+
remove_cache_info_for_machines
|
21
|
+
raise(Thor::Error, "Error starting virtual machines. :(")
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.machines_in_stage
|
26
|
+
"/#{Pvcglue.cloud.stage_name}-\\|manager/" # must escape '|' for shell
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.update_local_config_from_cache
|
30
|
+
data = File.read(cache_file_name)
|
31
|
+
machines = JSON.parse(data)
|
32
|
+
update_local_config(machines)
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.update_local_config(machines)
|
36
|
+
machines = machines.with_indifferent_access
|
37
|
+
Pvcglue::Manager.set_local_mode
|
38
|
+
manager_file_name = Pvcglue::Configuration.project_file_name
|
39
|
+
data = File.exists?(manager_file_name) ? TOML.load_file(manager_file_name) : {}
|
40
|
+
# puts data.inspect
|
41
|
+
# puts machines.inspect
|
42
|
+
# puts machines[:manager][:public_ip].inspect
|
43
|
+
manager_ip = machines[:manager][:public_ip].to_s # to_s in case it's nil
|
44
|
+
raise(Thor::Error, "Manager IP is not valid. :(") unless manager_ip =~ /\b(?:\d{1,3}\.){3}\d{1,3}\b/
|
45
|
+
data["local_cloud_manager"] = manager_ip
|
46
|
+
# data["#{Pvcglue.cloud.stage_name}_cloud_manager"] = manager_ip
|
47
|
+
File.write(manager_file_name, TOML.dump(data.stringify_keys))
|
48
|
+
|
49
|
+
app_name = Pvcglue.configuration.application_name
|
50
|
+
data = {}
|
51
|
+
data = TOML.load_file(::Pvcglue.cloud.local_file_name) if File.exists?(::Pvcglue.cloud.local_file_name)
|
52
|
+
data = TOML.load_file(Pvcglue.configuration.cloud_cache_file_name) if data.empty? && File.exists?(Pvcglue.configuration.cloud_cache_file_name)
|
53
|
+
# TODO: get repo_url from git, if possible
|
54
|
+
if data.empty?
|
55
|
+
data = {app_name =>
|
56
|
+
{"excluded_db_tables" => ["versions"],
|
57
|
+
"name" => app_name,
|
58
|
+
"repo_url" => "git@github.com:talyric/pvcglue-dev-box.git", # TODO: get with git
|
59
|
+
"ssh_allowed_from_all_port" => "22222",
|
60
|
+
"swapfile_size" => 128,
|
61
|
+
"time_zone" => "America/Los_Angeles",
|
62
|
+
"authorized_keys" => {"example" => File.read(File.expand_path('~/.ssh/id_rsa.pub'))}, # TODO: error checking
|
63
|
+
"dev_ip_addresses" => {"example" => "127.0.0.1"},
|
64
|
+
"gems" => {"delayed_job" => false, "whenever" => false},
|
65
|
+
"stages" =>
|
66
|
+
{"local" =>
|
67
|
+
{"db_rebuild" => true,
|
68
|
+
"domains" => ["#{app_name}.local"],
|
69
|
+
"ssl" => "none",
|
70
|
+
"roles" =>
|
71
|
+
{"caching" =>
|
72
|
+
{"memcached" => {"private_ip" => "0.0.0.0", "public_ip" => "0.0.0.0"}},
|
73
|
+
"db" => {"db" => {"private_ip" => "0.0.0.0", "public_ip" => "0.0.0.0"}},
|
74
|
+
"lb" =>
|
75
|
+
{"lb" =>
|
76
|
+
{"allow_public_access" => true,
|
77
|
+
"private_ip" => "0.0.0.0",
|
78
|
+
"public_ip" => "0.0.0.0"}},
|
79
|
+
"web" => {"web_1" => {"private_ip" => "0.0.0.0", "public_ip" => "0.0.0.0"}}}},
|
80
|
+
"test" =>
|
81
|
+
{"db_rebuild" => false,
|
82
|
+
"domains" => ["#{app_name}.test"],
|
83
|
+
"ssl" => "none",
|
84
|
+
"roles" =>
|
85
|
+
{"caching" =>
|
86
|
+
{"memcached" => {"private_ip" => "0.0.0.0", "public_ip" => "0.0.0.0"}},
|
87
|
+
"db" => {"db" => {"private_ip" => "0.0.0.0", "public_ip" => "0.0.0.0"}},
|
88
|
+
"lb" =>
|
89
|
+
{"lb" =>
|
90
|
+
{"allow_public_access" => true,
|
91
|
+
"private_ip" => "0.0.0.0",
|
92
|
+
"public_ip" => "0.0.0.0"}},
|
93
|
+
"web" =>
|
94
|
+
{"web_1" => {"private_ip" => "0.0.0.0", "public_ip" => "0.0.0.0"}}}}}}}
|
95
|
+
end
|
96
|
+
data = data.with_indifferent_access
|
97
|
+
|
98
|
+
# pp data
|
99
|
+
# pp machines
|
100
|
+
# puts "*"*80
|
101
|
+
# puts machines[:memcached][:public_ip].inspect
|
102
|
+
# puts "*"*80
|
103
|
+
# puts data[app_name].inspect
|
104
|
+
# puts "*"*80
|
105
|
+
# puts data[app_name][:stages].inspect
|
106
|
+
# puts "*"*80
|
107
|
+
# puts data[app_name][:stages][:local].inspect
|
108
|
+
# puts "*"*80
|
109
|
+
# puts data[app_name][:stages][:local][:roles].inspect
|
110
|
+
# puts "*"*80
|
111
|
+
# puts data[app_name][:stages][:local][:roles][:caching].inspect
|
112
|
+
# puts "*"*80
|
113
|
+
# puts data[app_name][:stages][:local][:roles][:caching][:memcached].inspect
|
114
|
+
# puts "*"*80
|
115
|
+
# puts data[app_name][:stages][:local][:roles][:caching][:memcached][:public_ip].inspect
|
116
|
+
# puts "*"*80
|
117
|
+
stage_name = Pvcglue.cloud.stage_name
|
118
|
+
data[app_name][:stages][stage_name][:roles][:caching][:memcached][:public_ip] = machines[:memcached][:public_ip]
|
119
|
+
data[app_name][:stages][stage_name][:roles][:caching][:memcached][:private_ip] = machines[:memcached][:private_ip]
|
120
|
+
data[app_name][:stages][stage_name][:roles][:db][:db][:public_ip] = machines[:db][:public_ip]
|
121
|
+
data[app_name][:stages][stage_name][:roles][:db][:db][:private_ip] = machines[:db][:private_ip]
|
122
|
+
data[app_name][:stages][stage_name][:roles][:lb][:lb][:public_ip] = machines[:lb][:public_ip]
|
123
|
+
data[app_name][:stages][stage_name][:roles][:lb][:lb][:private_ip] = machines[:lb][:private_ip]
|
124
|
+
data[app_name][:stages][stage_name][:roles][:web][:web_1][:public_ip] = machines[:web][:public_ip]
|
125
|
+
data[app_name][:stages][stage_name][:roles][:web][:web_1][:private_ip] = machines[:web][:private_ip]
|
126
|
+
# data[app_name][:stages][:local][:roles][:web][:web_2][:public_ip] = machines[:web_2][:public_ip]
|
127
|
+
# data[app_name][:stages][:local][:roles][:web][:web_2][:private_ip] = machines[:web_2][:private_ip]
|
128
|
+
|
129
|
+
Pvcglue.cloud.data = data
|
130
|
+
File.write(::Pvcglue.cloud.local_file_name, TOML.dump(Pvcglue.cloud.data))
|
131
|
+
File.write(Pvcglue.configuration.cloud_cache_file_name, TOML.dump(Pvcglue.cloud.data))
|
132
|
+
end
|
133
|
+
|
134
|
+
def self.stop
|
135
|
+
vagrant("halt #{machines_in_stage}")
|
136
|
+
end
|
137
|
+
|
138
|
+
def self.restart
|
139
|
+
vagrant("reload #{machines_in_stage}")
|
140
|
+
end
|
141
|
+
|
142
|
+
def self.rebuild
|
143
|
+
vagrant("destroy #{machines_in_stage} --force")
|
144
|
+
start
|
145
|
+
end
|
146
|
+
|
147
|
+
def self.destroy
|
148
|
+
vagrant("destroy #{machines_in_stage} --force")
|
149
|
+
end
|
150
|
+
|
151
|
+
def self.suspend
|
152
|
+
vagrant("suspend #{machines_in_stage}")
|
153
|
+
end
|
154
|
+
|
155
|
+
def self.kill
|
156
|
+
vagrant("halt #{machines_in_stage} --force")
|
157
|
+
end
|
158
|
+
|
159
|
+
def self.status
|
160
|
+
vagrant("status")
|
161
|
+
end
|
162
|
+
|
163
|
+
def self.remove_cache_info_for_machines
|
164
|
+
File.delete(cache_file_name)
|
165
|
+
end
|
166
|
+
|
167
|
+
=begin
|
168
|
+
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
|
169
|
+
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
|
170
|
+
inet 127.0.0.1/8 scope host lo
|
171
|
+
valid_lft forever preferred_lft forever
|
172
|
+
inet6 ::1/128 scope host
|
173
|
+
valid_lft forever preferred_lft forever
|
174
|
+
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
|
175
|
+
link/ether 08:00:27:e7:ab:02 brd ff:ff:ff:ff:ff:ff
|
176
|
+
inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
|
177
|
+
valid_lft forever preferred_lft forever
|
178
|
+
inet6 fe80::a00:27ff:fee7:ab02/64 scope link
|
179
|
+
valid_lft forever preferred_lft forever
|
180
|
+
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
|
181
|
+
link/ether 08:00:27:8e:64:5a brd ff:ff:ff:ff:ff:ff
|
182
|
+
inet 10.10.10.208/24 brd 10.10.10.255 scope global eth1
|
183
|
+
valid_lft forever preferred_lft forever
|
184
|
+
inet6 fe80::a00:27ff:fe8e:645a/64 scope link
|
185
|
+
valid_lft forever preferred_lft forever
|
186
|
+
4: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
|
187
|
+
link/ether 08:00:27:9a:14:92 brd ff:ff:ff:ff:ff:ff
|
188
|
+
inet 172.28.128.3/24 brd 172.28.128.255 scope global eth2
|
189
|
+
valid_lft forever preferred_lft forever
|
190
|
+
inet6 fe80::a00:27ff:fe9a:1492/64 scope link
|
191
|
+
valid_lft forever preferred_lft forever
|
192
|
+
=end
|
193
|
+
|
194
|
+
|
195
|
+
def self.get_info_for_machines
|
196
|
+
machines = {}
|
197
|
+
MACHINES.each do |machine|
|
198
|
+
machines[machine] = {}
|
199
|
+
machine_name = machine == 'manager' ? machine : "#{Pvcglue.cloud.stage_name}-#{machine}"
|
200
|
+
puts "Getting networking info from #{machine_name}..."
|
201
|
+
data = `vagrant ssh #{machine_name} -c "ip a"`
|
202
|
+
puts data
|
203
|
+
data.scan(/inet (.*)\/.*global (eth[12])/) do |ip, eth|
|
204
|
+
type = eth == 'eth2' ? :private_ip : :public_ip
|
205
|
+
machines[machine][type] = ip
|
206
|
+
end
|
207
|
+
puts "Adding you public key to the root user for #{machine_name}..."
|
208
|
+
# cat ~/.ssh/id_rsa.pub | vagrant ssh manager -c 'sudo tee /root/.ssh/authorized_keys'
|
209
|
+
raise $? unless system %Q(cat ~/.ssh/id_rsa.pub | vagrant ssh #{machine_name} -c 'sudo tee /root/.ssh/authorized_keys')
|
210
|
+
end
|
211
|
+
FileUtils.mkdir_p(File.dirname(cache_file_name)) # the 'tmp' directory may not always exist
|
212
|
+
File.write(cache_file_name, machines.to_json)
|
213
|
+
machines
|
214
|
+
end
|
215
|
+
|
216
|
+
def self.cache_file_name
|
217
|
+
# TODO: Remove caching, maybe?
|
218
|
+
File.join(Pvcglue::Configuration.application_dir, 'tmp', 'pvcglue-machines.json')
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
|
223
|
+
# def self.local
|
224
|
+
# @local ||= Local.new
|
225
|
+
# end
|
226
|
+
|
227
|
+
# def self.local=(config)
|
228
|
+
# @local = config
|
229
|
+
# end
|
230
|
+
|
231
|
+
end
|
data/lib/pvcglue/manager.rb
CHANGED
@@ -75,9 +75,31 @@ module Pvcglue
|
|
75
75
|
Pvcglue.configuration.configure_manager
|
76
76
|
end
|
77
77
|
|
78
|
+
desc "mode", "set mode (default or local)"
|
79
|
+
|
80
|
+
def mode(mode = "default")
|
81
|
+
raise(Thor::Error, "invalid manager mode :( (Hint: try 'default' or 'local'.)") unless mode.in?(%w(default local))
|
82
|
+
if mode == 'default' && Pvcglue::Manager.local_mode?
|
83
|
+
Pvcglue::Manager.set_default_mode
|
84
|
+
elsif mode == 'local' && !Pvcglue::Manager.local_mode?
|
85
|
+
Pvcglue::Manager.set_local_mode
|
86
|
+
else
|
87
|
+
puts "The manager is already set to the #{mode} mode."
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
78
91
|
# ------------------------------------------------------------------------------------------------------------------
|
79
92
|
|
93
|
+
def self.set_local_mode
|
94
|
+
File.write(Pvcglue::Manager.mode_file_name, %q(description = "The existence of this file sets the pvcglue manager mode to 'local'. Use `pvc manager mode default` to reset."))
|
95
|
+
end
|
96
|
+
|
97
|
+
def self.set_default_mode
|
98
|
+
File.delete(Pvcglue::Manager.mode_file_name) if Pvcglue::Manager.local_mode?
|
99
|
+
end
|
100
|
+
|
80
101
|
def self.initialize_cloud_data
|
102
|
+
# return if get_local_cloud_data
|
81
103
|
unless read_cached_cloud_data
|
82
104
|
Pvcglue::Packages.apply('manager-get-config'.to_sym, :manager, manager_node, 'pvcglue', 'manager')
|
83
105
|
# Pvcglue::Packages.apply('manager-get-config'.to_sym, :manager, manager_node, 'pvcglue') # Can not use package as it causes infinite recursion, we'll just do it manually
|
@@ -94,6 +116,15 @@ module Pvcglue
|
|
94
116
|
end
|
95
117
|
end
|
96
118
|
|
119
|
+
# def self.get_local_cloud_data
|
120
|
+
# return unless Pvcglue.cloud.stage_name.in? %w(local test)
|
121
|
+
# puts "*"*80
|
122
|
+
# puts Pvcglue.cloud.stage_name
|
123
|
+
# puts "*"*80
|
124
|
+
# raise(Thor::Error, "stopped. :(")
|
125
|
+
#
|
126
|
+
# end
|
127
|
+
|
97
128
|
def self.write_cloud_data_cache
|
98
129
|
File.write(Pvcglue.configuration.cloud_cache_file_name, TOML.dump(Pvcglue.cloud.data))
|
99
130
|
end
|
@@ -149,6 +180,14 @@ module Pvcglue
|
|
149
180
|
clear_cloud_data_cache
|
150
181
|
end
|
151
182
|
|
183
|
+
def self.local_mode?
|
184
|
+
File.exists?(Pvcglue::Manager.mode_file_name)
|
185
|
+
end
|
186
|
+
|
187
|
+
def self.mode_file_name
|
188
|
+
File.join(Pvcglue::Configuration.application_dir, '.pvcglue-manager-mode-local.toml')
|
189
|
+
end
|
190
|
+
|
152
191
|
end
|
153
192
|
|
154
193
|
end
|
data/lib/pvcglue/packages/rvm.rb
CHANGED
@@ -9,6 +9,19 @@ set :linked_dirs, %w{log tmp/pids tmp/cache tmp/sockets}
|
|
9
9
|
|
10
10
|
set :bundle_flags, '--deployment' # Remove the `--quiet` flag
|
11
11
|
|
12
|
+
# Thanks to marinosbern!
|
13
|
+
# From http://stackoverflow.com/a/22234123/444774
|
14
|
+
desc 'Invoke a rake command on the remote server--Example usage: cap staging invoke[db:migrate]'
|
15
|
+
task :invoke, [:command] => 'deploy:set_rails_env' do |task, args|
|
16
|
+
on primary(:app) do
|
17
|
+
within current_path do
|
18
|
+
with :rails_env => fetch(:rails_env) do
|
19
|
+
rake args[:command]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
12
25
|
namespace :deploy do
|
13
26
|
<% if Pvcglue.cloud.gems[:delayed_job] %>
|
14
27
|
def args
|
data/lib/pvcglue/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pvcglue
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.17
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Lyric
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-04-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -228,6 +228,7 @@ files:
|
|
228
228
|
- lib/pvcglue/db.rb
|
229
229
|
- lib/pvcglue/deploy.rb
|
230
230
|
- lib/pvcglue/env.rb
|
231
|
+
- lib/pvcglue/local.rb
|
231
232
|
- lib/pvcglue/manager.rb
|
232
233
|
- lib/pvcglue/nodes.rb
|
233
234
|
- lib/pvcglue/packages.rb
|