cap-rightscale 0.4.6 → 0.5.0
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/VERSION +1 -1
- data/cap-rightscale.gemspec +2 -2
- data/lib/cap-rightscale.rb +8 -0
- data/lib/cap-rightscale/configuration.rb +2 -0
- data/lib/cap-rightscale/configuration/rightscale.rb +155 -173
- data/lib/cap-rightscale/configuration/rightscale/cache.rb +15 -12
- data/lib/cap-rightscale/configuration/rightscale/resource.rb +26 -19
- data/lib/cap-rightscale/recipes.rb +1 -1
- data/lib/cap-rightscale/recipes/rightscale.rb +1 -1
- data/lib/cap-rightscale/recipes/rightscale/cache.rb +2 -2
- data/lib/cap-rightscale/utils/rs_utils.rb +3 -3
- metadata +5 -5
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.5.0
|
data/cap-rightscale.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{cap-rightscale}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.5.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Satoshi Ohki"]
|
12
|
-
s.date = %q{2011-02-
|
12
|
+
s.date = %q{2011-02-06}
|
13
13
|
s.description = %q{Capistrano extension that maps RightScale parameters to Roles.}
|
14
14
|
s.email = %q{roothybrid7@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
data/lib/cap-rightscale.rb
CHANGED
@@ -7,3 +7,11 @@ $:.unshift(File.dirname(__FILE__)) unless
|
|
7
7
|
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
8
8
|
|
9
9
|
require 'cap-rightscale/configuration'
|
10
|
+
require 'cap-rightscale/utils/rs_utils'
|
11
|
+
|
12
|
+
module Capistrano
|
13
|
+
module RightScale
|
14
|
+
RS_DEFAULT_CONFPATH = File.join(ENV['HOME'], ".rsconf", "rsapiconfig.yml")
|
15
|
+
RS_DEFAULT_LIFETIME = 86400
|
16
|
+
end
|
17
|
+
end
|
@@ -1,43 +1,23 @@
|
|
1
|
-
require 'cap-rightscale/utils/rs_utils'
|
2
|
-
require 'cap-rightscale/configuration/rightscale/cache'
|
3
|
-
require 'cap-rightscale/configuration/rightscale/resource'
|
4
|
-
|
5
1
|
module Capistrano
|
6
2
|
class Configuration
|
7
3
|
module RightScale
|
8
|
-
|
9
|
-
|
10
|
-
attr_accessor :rs_cache_lifetime
|
11
|
-
|
12
|
-
def get_rs_confpath
|
13
|
-
get_rs_instance.confpath
|
14
|
-
end
|
15
|
-
|
16
|
-
def set_rs_confpath(path)
|
17
|
-
get_rs_instance.confpath = path
|
18
|
-
end
|
4
|
+
attr_writer :use_rs_cache
|
5
|
+
attr_accessor :validate_echo, :use_nickname, :use_public_ip, :rs_confpath, :rs_lifetime, :rs_domain
|
19
6
|
|
20
|
-
def
|
21
|
-
|
22
|
-
__send__("#{arg}=".to_sym, true) if respond_to?("#{arg}=".to_sym)
|
23
|
-
end
|
7
|
+
def rs_array_number_format(format)
|
8
|
+
@array_num_format = format
|
24
9
|
end
|
25
10
|
|
26
|
-
|
27
|
-
|
28
|
-
|
11
|
+
[:rs_enable, :rs_disable].each do |method|
|
12
|
+
define_method(method) do |*args|
|
13
|
+
bool = method == :rs_enable ? true : false
|
14
|
+
args.each {|arg| __send__("#{arg}=".to_sym, bool) if respond_to?("#{arg}=".to_sym) }
|
29
15
|
end
|
30
16
|
end
|
31
17
|
|
32
|
-
def rs_cache_lifetime(time)
|
33
|
-
get_cache_instance.lifetime = time # seconds
|
34
|
-
end
|
35
|
-
|
36
|
-
def set_domainname(domain)
|
37
|
-
@domainname = domain
|
38
|
-
end
|
39
|
-
|
40
18
|
# Get RightScale Server Array
|
19
|
+
# RightScale nickname registerd deploy host's /etc/hosts
|
20
|
+
# OR dns record(replace 's/ #/-000/' to ServerArray name)
|
41
21
|
# === Parameters
|
42
22
|
# * _role_ - Capistrano role symbol (ex. :app, :web, :db)
|
43
23
|
# * _params[:array_id]_ - ex. :array_id => 1[https://my.rightscale.com/server_arrays/{id}]
|
@@ -46,52 +26,43 @@ module Capistrano
|
|
46
26
|
# array_id = 1
|
47
27
|
# server_array :app, :array_id => array_id, :port => 1234
|
48
28
|
def server_array(role, params)
|
29
|
+
start = Time.now
|
30
|
+
_init unless initialized?
|
49
31
|
return [] unless check_role(role)
|
50
32
|
raise ArgumentError, ":array_id is not included in params!![#{params}]" unless params.has_key?(:array_id)
|
51
33
|
@caller ||= File.basename(caller.map {|x| /(.*?):(\d+)/ =~ x; $1}.first, ".*")
|
34
|
+
@rs_array_keys ||= [:array_id, :except_tags]
|
52
35
|
|
53
|
-
start = Time.now
|
54
36
|
logger.info("SETTING ROLE: #{role}")
|
55
37
|
|
56
|
-
|
38
|
+
servers = use_rs_cache ? role_with_load_cache(role, @rs_array_keys, params) : []
|
57
39
|
|
58
|
-
if
|
59
|
-
[:array_id, :except_tags].each {|key| params.delete(key)} # remove rightscale's parameters
|
60
|
-
logger.info("restore cache of servers:\n#{host_list.pretty_inspect}")
|
61
|
-
role(role, params) { host_list } # set cache to role()
|
62
|
-
else
|
40
|
+
if servers.size == 0
|
63
41
|
# Request RightScale API
|
64
|
-
array =
|
42
|
+
array = rs_instance.array(params[:array_id])
|
65
43
|
logger.info("querying rightscale for server_array #{array.nickname}...")
|
66
|
-
|
67
|
-
deployment_name =
|
44
|
+
deployment = rs_instance.deployment(array.deployment_href.match(/[0-9]+$/).to_s, :server_settings => 'true')
|
45
|
+
deployment_name = deployment.nickname
|
68
46
|
logger.info("Deployment #{deployment_name}:")
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
host_list = srvs.map do |instance|
|
78
|
-
hostname = instance[:nickname].sub(/ #[0-9]+$/, "-%03d" % instance[:nickname].match(/[0-9]+$/).to_s.to_i)
|
79
|
-
hostname << ".#{domainname}" if domainname && hostname.match(/#{domainname}/).nil?
|
47
|
+
servers = rs_instance.array_instances(array.id).select {|i| i[:state] == "operational" }
|
48
|
+
servers = servers_with_tags_set(
|
49
|
+
deployment.id, servers, params[:except_tags], :minus) if params.include?(:except_tags)
|
50
|
+
|
51
|
+
servers = servers.map do |instance|
|
52
|
+
hostname = instance[:nickname].sub(
|
53
|
+
/ #[0-9]+$/, array_number_format % instance[:nickname].match(/[0-9]+$/).to_s.to_i)
|
54
|
+
hostname << ".#{rs_domain}" if rs_domain && hostname.match(/#{rs_domain}/).nil?
|
80
55
|
ip = use_public_ip ? instance[:ip_address] : instance[:private_ip_address]
|
81
56
|
|
82
57
|
logger.info("Found server: #{hostname}(#{ip})")
|
83
58
|
use_nickname ? hostname : ip
|
84
59
|
end
|
85
|
-
|
60
|
+
servers = RSUtils.valid_echo(servers, logger) if validate_echo
|
86
61
|
|
87
|
-
if
|
88
|
-
[:array_id, :except_tags].each {|key| params.delete(key)} # remove rightscale's parameters
|
89
|
-
role(role, params) { host_list }
|
90
|
-
get_cache_instance.dump_server_cache(role, host_list, @caller) if use_rs_cache # Dump cache
|
91
|
-
end
|
62
|
+
role_with_dump_cache(role, servers, @rs_array_keys, params, use_rs_cache) if servers.size > 0
|
92
63
|
end
|
93
64
|
logger.debug("Time: #{Time.now - start}")
|
94
|
-
|
65
|
+
servers || []
|
95
66
|
end
|
96
67
|
|
97
68
|
# Get servers in deployment
|
@@ -104,51 +75,41 @@ logger.debug("Time: #{Time.now - start}")
|
|
104
75
|
# deployment_id = 1
|
105
76
|
# nickname :db, :name_prefix => "db", :deployment => deployment_id, :user => "mysql"
|
106
77
|
def nickname(role, params)
|
78
|
+
start = Time.now
|
79
|
+
_init unless initialized?
|
107
80
|
return [] unless check_role(role)
|
108
81
|
raise ArgumentError, ":deployment is not included in params!![#{params}]" unless params.has_key?(:deployment)
|
109
|
-
@caller ||= File.basename(caller.map {|x| /(.*?):(\d+)/ =~ x; $1}.first, ".*")
|
82
|
+
@caller ||= File.basename(caller.map {|x| /(.*?):(\d+)/ =~ x; $1 }.first, ".*")
|
83
|
+
@rs_server_keys ||= [:array_id, :name_prefix, :except_tags]
|
110
84
|
|
111
|
-
start = Time.now
|
112
85
|
logger.info("SETTING ROLE: #{role}")
|
113
86
|
|
114
|
-
|
115
|
-
|
116
|
-
if host_list.size > 0
|
117
|
-
[:deployment, :name_prefix, :except_tags].each {|key| params.delete(key)} # remove rightscale's parameters
|
118
|
-
logger.info("restore cache of servers:\n#{host_list.pretty_inspect}")
|
119
|
-
role(role, params) { host_list } # set cache to role()
|
120
|
-
else
|
87
|
+
servers = use_rs_cache ? role_with_load_cache(role, @rs_server_keys, params) : []
|
121
88
|
|
89
|
+
if servers.size == 0
|
122
90
|
# Request RightScale API
|
123
|
-
|
124
|
-
logger.info(
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
host_list = srvs.map do |server|
|
135
|
-
hostname = server[:nickname].sub(/ #[0-9]+$/, "-%03d" % server[:nickname].match(/[0-9]+$/).to_s.to_i)
|
136
|
-
hostname << ".#{domainname}" if domainname && hostname.match(/#{domainname}/).nil?
|
91
|
+
deployment = rs_instance.deployment(params[:deployment], :server_settings => 'true')
|
92
|
+
logger.info(
|
93
|
+
"querying rightscale for servers #{params[:name_prefix]} in deployment #{deployment.nickname}...")
|
94
|
+
servers = deployment.servers.select {|s| s[:state] == "operational" }
|
95
|
+
servers = servers.select {|s| /#{params[:name_prefix]}/ =~ s[:nickname] } if params[:name_prefix]
|
96
|
+
servers = servers_with_tags_set(
|
97
|
+
params[:deployment], servers, params[:except_tags], :minus) if params.include?(:except_tags)
|
98
|
+
|
99
|
+
servers = servers.map do |server|
|
100
|
+
hostname = server[:nickname]
|
101
|
+
hostname << ".#{rs_domain}" if rs_domain && hostname.match(/#{rs_domain}/).nil?
|
137
102
|
ip = use_public_ip ? server[:settings][:ip_address] : server[:settings][:private_ip_address]
|
138
103
|
|
139
104
|
logger.info("Found server: #{hostname}(#{ip})")
|
140
105
|
use_nickname ? hostname : ip
|
141
106
|
end
|
142
|
-
|
107
|
+
servers = RSUtils.valid_echo(servers, logger) if validate_echo
|
143
108
|
|
144
|
-
if
|
145
|
-
[:array_id, :except_tags].each {|key| params.delete(key)} # remove rightscale's parameters
|
146
|
-
role(role, params) { host_list }
|
147
|
-
get_cache_instance.dump_server_cache(role, host_list, @caller) if use_rs_cache # Dump cache
|
148
|
-
end
|
109
|
+
role_with_dump_cache(role, servers, @rs_server_keys, params, use_rs_cache) if servers.size > 0
|
149
110
|
end
|
150
111
|
logger.debug("Time: #{Time.now - start}")
|
151
|
-
|
112
|
+
servers || []
|
152
113
|
end
|
153
114
|
|
154
115
|
# Get servers matching tags in deployment
|
@@ -162,132 +123,153 @@ logger.debug("Time: #{Time.now - start}")
|
|
162
123
|
# deployment_id = 1
|
163
124
|
# nickname :db, :tags => "xx_db:role", :deployment => deployment_id, :port => 3306
|
164
125
|
def tag(role, params)
|
126
|
+
start = Time.now
|
127
|
+
_init unless initialized?
|
165
128
|
return [] unless check_role(role)
|
166
129
|
raise ArgumentError, ":tags is not included in params!![#{params}]" unless params.has_key?(:tags)
|
167
130
|
raise ArgumentError, ":deployment is not included in params!![#{params}]" unless params.has_key?(:deployment)
|
168
|
-
@caller ||= File.basename(caller.map {|x| /(.*?):(\d+)/ =~ x; $1}.first, ".*")
|
131
|
+
@caller ||= File.basename(caller.map {|x| /(.*?):(\d+)/ =~ x; $1 }.first, ".*")
|
132
|
+
@rs_tag_keys ||= [:deployment, :tags, :except_tags]
|
169
133
|
|
170
|
-
start = Time.now
|
171
134
|
logger.info("SETTING ROLE: #{role}")
|
172
135
|
|
173
|
-
|
136
|
+
servers = use_rs_cache ? role_with_load_cache(role, @rs_tag_keys, params) : []
|
174
137
|
|
175
|
-
if
|
176
|
-
[:deployment, :tags, :except_tags].each {|key| params.delete(key)} # remove rightscale's parameters
|
177
|
-
logger.info("restore cache of servers:\n#{host_list.pretty_inspect}")
|
178
|
-
role(role, params) { host_list } # set cache to role()
|
179
|
-
else
|
138
|
+
if servers.size == 0
|
180
139
|
# Request RightScale API
|
181
|
-
|
182
|
-
logger.info("querying rightscale for servers matching tags #{params[:tags]} in deployment #{
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
if params.include?(:except_tags)
|
190
|
-
except_tags_params = {:resource_type => "ec2_instance", :tags => params[:except_tags]}
|
191
|
-
srvs = servers_with_tags_set(params[:deployment], srvs, except_tags_params, :minus)
|
192
|
-
return [] if srvs.size == 0 # Not found servers matching tag
|
140
|
+
deployment = rs_instance.deployment(params[:deployment], :server_settings => 'true')
|
141
|
+
logger.info("querying rightscale for servers matching tags #{params[:tags]} in deployment #{deployment.nickname}...")
|
142
|
+
servers = deployment.servers.select {|s| s[:state] == "operational" }
|
143
|
+
|
144
|
+
servers = servers_with_tags_set(params[:deployment], servers, params[:tags], :intersect)
|
145
|
+
if params.include?(:except_tags) && servers.size > 0
|
146
|
+
servers = servers_with_tags_set(params[:deployment], servers, params[:except_tags], :minus)
|
193
147
|
end
|
194
148
|
|
195
|
-
|
149
|
+
servers = servers.map do |server|
|
196
150
|
hostname = server[:nickname]
|
197
|
-
hostname << ".#{
|
151
|
+
hostname << ".#{rs_domain}" if rs_domain && hostname.match(/#{rs_domain}/).nil?
|
198
152
|
ip = use_public_ip ? server[:settings][:ip_address] : server[:settings][:private_ip_address]
|
199
153
|
|
200
154
|
logger.info("Found server: #{hostname}(#{ip})")
|
201
155
|
use_nickname ? hostname : ip
|
202
156
|
end
|
203
157
|
|
204
|
-
|
158
|
+
servers = RSUtils.valid_echo(servers, logger) if validate_echo
|
205
159
|
|
206
|
-
if
|
207
|
-
[:deployment, :tags, :except_tags].each {|key| params.delete(key)} # remove rightscale's parameters
|
208
|
-
role(role, params) { host_list }
|
209
|
-
get_cache_instance.dump_server_cache(role, host_list, @caller) if use_rs_cache # Dump cache
|
210
|
-
end
|
160
|
+
role_with_dump_cache(role, servers, @rs_tag_keys, params, use_rs_cache) if servers.size > 0
|
211
161
|
end
|
212
162
|
logger.debug("Time: #{Time.now - start}")
|
213
|
-
|
163
|
+
servers || []
|
214
164
|
end
|
215
165
|
|
216
166
|
private
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
167
|
+
def check_role(role)
|
168
|
+
return false if ENV['HOSTS']
|
169
|
+
return false if ENV['ROLES'] && ENV['ROLES'].split(',').include?("#{role}") == false
|
170
|
+
return true
|
171
|
+
end
|
222
172
|
|
223
|
-
|
224
|
-
|
225
|
-
|
173
|
+
def _init
|
174
|
+
unless @initialized
|
175
|
+
self.rs_confpath = fetch(:rs_confpath) rescue Capistrano::RightScale::RS_DEFAULT_CONFPATH
|
176
|
+
self.rs_lifetime = fetch(:rs_lifetime) rescue Capistrano::RightScale::RS_DEFAULT_LIFETIME
|
177
|
+
self.rs_lifetime = rs_cache_lifetime(rs_lifetime)
|
178
|
+
self.rs_domain = fetch(:rs_domain) rescue nil
|
179
|
+
rs_instance.confpath = rs_confpath
|
180
|
+
cache_instance.lifetime = rs_lifetime
|
226
181
|
|
227
|
-
|
228
|
-
@cache_instance ||= Capistrano::RightScale::Cache.instance
|
182
|
+
@initialized = true
|
229
183
|
end
|
184
|
+
end
|
230
185
|
|
231
|
-
|
232
|
-
|
233
|
-
|
186
|
+
def initialized?
|
187
|
+
@initialized
|
188
|
+
end
|
234
189
|
|
235
|
-
|
236
|
-
|
190
|
+
# set cache lifetime
|
191
|
+
# -1: infinity, 0: disable cache, '>0': lifetime(sec)
|
192
|
+
def rs_cache_lifetime(time)
|
193
|
+
t = time.to_i
|
237
194
|
|
238
|
-
|
239
|
-
|
240
|
-
when :intersect then
|
241
|
-
oper_ids = servers_ids & ts_ids
|
242
|
-
when :minus then
|
243
|
-
oper_ids = servers_ids - ts_ids
|
244
|
-
end
|
245
|
-
return [] if oper_ids.size == 0
|
195
|
+
t = 0 if t < -1 # invalid value
|
196
|
+
self.use_rs_cache = false if t == 0
|
246
197
|
|
247
|
-
|
248
|
-
|
198
|
+
t
|
199
|
+
end
|
249
200
|
|
250
|
-
|
251
|
-
|
252
|
-
|
201
|
+
# Set Capistrano::Logger to instance for logging
|
202
|
+
def rs_instance
|
203
|
+
@rs_instance ||= Capistrano::RightScale::Resource.instance.instance_eval { @logger = logger; self }
|
204
|
+
end
|
253
205
|
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
end
|
206
|
+
def cache_instance
|
207
|
+
@cache_instance ||= Capistrano::RightScale::Cache.instance.instance_eval { @logger = logger; self }
|
208
|
+
end
|
258
209
|
|
259
|
-
|
260
|
-
|
261
|
-
servers = get_rs_instance.tag(params).
|
262
|
-
select {|s| s.state == "operational"}.
|
263
|
-
select {|s| s.deployment_href.match(/[0-9]+$/).to_s == deployment_id.to_s}
|
264
|
-
rescue => e
|
265
|
-
{}
|
266
|
-
end
|
267
|
-
servers
|
268
|
-
end
|
210
|
+
def role_with_load_cache(role, rs_keys, params)
|
211
|
+
servers = cache_instance.load_server_cache(role, @caller) || [] # Get cache
|
269
212
|
|
270
|
-
|
271
|
-
|
213
|
+
if servers.size > 0
|
214
|
+
rs_keys.each {|key| params.delete(key) } # remove rightscale's parameters
|
215
|
+
servers.each {|s| logger.info("restore server from cache: #{s}") }
|
216
|
+
role(role, params) { servers }
|
272
217
|
end
|
273
218
|
|
274
|
-
|
275
|
-
|
276
|
-
|
219
|
+
servers
|
220
|
+
end
|
221
|
+
|
222
|
+
def role_with_dump_cache(role, servers, rs_keys, params, rs_cache=true)
|
223
|
+
rs_keys.each {|key| params.delete(key) } # remove rightscale's parameters
|
224
|
+
role(role, params) { servers }
|
225
|
+
cache_instance.dump_server_cache(role, servers, @caller) if rs_cache # Dump cache
|
226
|
+
end
|
227
|
+
|
228
|
+
# set(union, intersect, minus) servers in deployment and servers matching tags in deployment
|
229
|
+
def servers_with_tags_set(deployment_id, servers, tags, operator)
|
230
|
+
tags_params = {:resource_type => "ec2_instance", :tags => tags}
|
231
|
+
server_ids = servers.map {|s| s[:href].match(/[0-9]+$/).to_s }
|
232
|
+
|
233
|
+
ts = servers_with_tags_in_deployment(deployment_id, tags_params)
|
234
|
+
return {} if ts.size == 0
|
235
|
+
|
236
|
+
ts_ids = ts.map {|s| s.href.sub("/current", "").match(/[0-9]+$/).to_s }
|
237
|
+
case operator
|
238
|
+
when :intersect then
|
239
|
+
oper_ids = server_ids & ts_ids
|
240
|
+
when :minus then
|
241
|
+
oper_ids = server_ids - ts_ids
|
277
242
|
end
|
243
|
+
return {} if oper_ids.size == 0
|
244
|
+
|
245
|
+
servers.select {|s| oper_ids.include?(s[:href].match(/[0-9]+$/).to_s) } || {}
|
246
|
+
end
|
278
247
|
|
279
|
-
|
280
|
-
|
248
|
+
def servers_with_tags_in_deployment(deployment_id, params)
|
249
|
+
begin
|
250
|
+
servers = rs_instance.tag(params).
|
251
|
+
select {|s| s.state == "operational" }.
|
252
|
+
select {|s| s.deployment_href.match(/[0-9]+$/).to_s == deployment_id.to_s }
|
253
|
+
rescue
|
254
|
+
{}
|
281
255
|
end
|
256
|
+
servers
|
257
|
+
end
|
282
258
|
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
259
|
+
def array_number_format
|
260
|
+
@array_num_format ||= "%d"
|
261
|
+
end
|
262
|
+
|
263
|
+
def use_rs_cache
|
264
|
+
if @use_rs_cache.nil? && ENV['RS_CACHE']
|
265
|
+
env = ENV['RS_CACHE'].downcase
|
266
|
+
@use_rs_cache = false if env == "false"
|
290
267
|
end
|
268
|
+
@use_rs_cache = true if @use_rs_cache.nil?
|
269
|
+
@use_rs_cache
|
270
|
+
end
|
271
|
+
|
272
|
+
private :validate_echo, :use_nickname, :use_public_ip, :use_rs_cache
|
291
273
|
end
|
292
274
|
end
|
293
275
|
end
|
@@ -5,10 +5,11 @@ module Capistrano
|
|
5
5
|
class Cache
|
6
6
|
include Singleton
|
7
7
|
|
8
|
-
attr_accessor :lifetime
|
8
|
+
attr_accessor :lifetime, :logger
|
9
9
|
attr_reader :array, :array_instances, :deployment
|
10
|
+
|
10
11
|
def initialize
|
11
|
-
@lifetime =
|
12
|
+
@lifetime = Capistrano::RightScale::RS_DEFAULT_LIFETIME
|
12
13
|
end
|
13
14
|
|
14
15
|
def load_server_cache(role, prefix=nil)
|
@@ -18,25 +19,22 @@ module Capistrano
|
|
18
19
|
cache_files = Dir.glob("#{Dir.tmpdir}/cap-rightscale-#{ENV['USER']}-*/#{prefix}*#{role}.cache")
|
19
20
|
|
20
21
|
if cache_files.size > 0 && !server_cache
|
21
|
-
c = Marshal.load(open(cache_files.first) {|f| f.read})
|
22
|
+
c = Marshal.load(open(cache_files.first) {|f| f.read })
|
22
23
|
self.instance_variable_set("@#{role}_cache", c)
|
23
24
|
end
|
24
25
|
server_cache = self.instance_variable_get("@#{role}_cache")
|
25
26
|
return [] unless server_cache # No cache entry
|
26
27
|
|
27
28
|
# get servers
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
server_list = server_cache[role][:servers]
|
32
|
-
else
|
33
|
-
server_list = []
|
29
|
+
servers = server_cache[role][:servers].size > 0 ? server_cache[role][:servers] : []
|
30
|
+
if lifetime > 0 && Time.now - server_cache[role][:cache] > lifetime
|
31
|
+
servers = []
|
34
32
|
end
|
35
33
|
rescue => e
|
36
34
|
return [] unless server_cache
|
37
35
|
end
|
38
36
|
|
39
|
-
|
37
|
+
servers
|
40
38
|
end
|
41
39
|
|
42
40
|
def dump_server_cache(role, servers, prefix=nil)
|
@@ -55,10 +53,15 @@ module Capistrano
|
|
55
53
|
begin
|
56
54
|
open(cache_file, "w") {|f| f.write(obj_dump)}
|
57
55
|
rescue => e
|
58
|
-
|
59
|
-
|
56
|
+
@logger.important("#{e.class}: #{e.pretty_inspect}")
|
57
|
+
@logger.trace("Backtrace:\n#{e.backtrace.pretty_inspect}")
|
60
58
|
end
|
61
59
|
end
|
60
|
+
|
61
|
+
private
|
62
|
+
def logger
|
63
|
+
@logger ||= Capistrano::Logger.new
|
64
|
+
end
|
62
65
|
end
|
63
66
|
end
|
64
67
|
end
|
@@ -5,26 +5,28 @@ module Capistrano
|
|
5
5
|
class Resource
|
6
6
|
include Singleton
|
7
7
|
|
8
|
-
attr_accessor :confpath
|
8
|
+
attr_accessor :confpath, :logger
|
9
9
|
attr_reader :array, :array_instances, :deployment
|
10
10
|
def initialize
|
11
|
-
@confpath =
|
11
|
+
@confpath = Capistrano::RightScale::RS_DEFAULT_CONFPATH
|
12
12
|
end
|
13
13
|
|
14
14
|
def connect
|
15
15
|
begin
|
16
|
-
@auth ||= open(confpath) {|f| YAML.load(f)}
|
16
|
+
@auth ||= open(confpath) {|f| YAML.load(f) }
|
17
17
|
@conn ||= RightResource::Connection.new do |c|
|
18
18
|
c.login(:username => @auth["username"], :password => @auth["password"], :account => @auth["account"])
|
19
19
|
end
|
20
20
|
rescue => e
|
21
21
|
auth_data = open(File.join(File.expand_path(
|
22
|
-
File.dirname(__FILE__)), '/../../../../rsapiconfig.yml.sample')) {|f| f.read}
|
23
|
-
|
22
|
+
File.dirname(__FILE__)), '/../../../../rsapiconfig.yml.sample')) {|f| f.read }
|
23
|
+
@logger.important <<-"USAGE"
|
24
24
|
Cannot load RightScale API credentials!!:
|
25
25
|
Put authfile:<rsapiconfig.yml> in <HOME>/.rsconf/
|
26
26
|
OR
|
27
|
-
|
27
|
+
Define param<set_rs_confpath> in Capfile:
|
28
|
+
# Load RightScale API credentials
|
29
|
+
set :set_rs_confpath, <authfile_path>
|
28
30
|
|
29
31
|
Authfile contents: specify your Rightscale API credentials
|
30
32
|
#{auth_data}
|
@@ -39,18 +41,18 @@ USAGE
|
|
39
41
|
begin
|
40
42
|
self.instance_variable_set("@#{method}_#{id}", api.call)
|
41
43
|
rescue => e
|
42
|
-
|
43
|
-
|
44
|
+
@logger.important("#{e.class}: #{e.pretty_inspect}")
|
45
|
+
@logger.trace("Backtrace:\n#{e.backtrace.pretty_inspect}")
|
44
46
|
exit(1)
|
45
47
|
end
|
46
48
|
|
47
49
|
status_code = RightResource::Base.status_code
|
48
50
|
if status_code.nil?
|
49
|
-
|
51
|
+
@logger.important("Error: Unknown Error when accessing RightScale API")
|
50
52
|
exit(1)
|
51
53
|
elsif status_code != 200
|
52
|
-
|
53
|
-
|
54
|
+
@logger.important("Errors: HTTP STATUS CODE is #{status_code}")
|
55
|
+
@logger.trace(RightResource::Base.headers)
|
54
56
|
exit(1)
|
55
57
|
end
|
56
58
|
|
@@ -59,20 +61,20 @@ USAGE
|
|
59
61
|
end
|
60
62
|
|
61
63
|
def array(id)
|
62
|
-
_instance_variable_set(:array, id, lambda {ServerArray.show(id)}) unless
|
64
|
+
_instance_variable_set(:array, id, lambda { ServerArray.show(id) }) unless
|
63
65
|
self.instance_variable_get("@array_#{id}")
|
64
66
|
self.instance_variable_get("@array_#{id}")
|
65
67
|
end
|
66
68
|
|
67
69
|
def array_instances(id)
|
68
70
|
_instance_variable_set(:array_instances, id,
|
69
|
-
lambda {ServerArray.instances(id)}) unless self.instance_variable_get("@array_instances_#{id}")
|
71
|
+
lambda { ServerArray.instances(id) }) unless self.instance_variable_get("@array_instances_#{id}")
|
70
72
|
self.instance_variable_get("@array_instances_#{id}")
|
71
73
|
end
|
72
74
|
|
73
75
|
def deployment(id, params)
|
74
76
|
_instance_variable_set(:deployment, id,
|
75
|
-
lambda {Deployment.show(id, params)}) unless self.instance_variable_get("@deployment_#{id}")
|
77
|
+
lambda { Deployment.show(id, params) }) unless self.instance_variable_get("@deployment_#{id}")
|
76
78
|
self.instance_variable_get("@deployment_#{id}")
|
77
79
|
end
|
78
80
|
|
@@ -80,22 +82,27 @@ USAGE
|
|
80
82
|
begin
|
81
83
|
tags = Tag.search(params) # not stored
|
82
84
|
rescue => e
|
83
|
-
|
84
|
-
|
85
|
+
@logger.important("#{e.class}: #{e.pretty_inspect}")
|
86
|
+
@logger.trace("Backtrace:\n#{e.backtrace.pretty_inspect}")
|
85
87
|
exit(1)
|
86
88
|
end
|
87
89
|
|
88
90
|
status_code = Tag.status_code
|
89
91
|
if status_code.nil?
|
90
|
-
|
92
|
+
@logger.important("Error: Unknown Error when accessing RightScale API")
|
91
93
|
exit(1)
|
92
94
|
elsif status_code != 200
|
93
|
-
|
94
|
-
|
95
|
+
@logger.important("Errors: HTTP STATUS CODE is #{status_code}")
|
96
|
+
@logger.trace(Tag.headers)
|
95
97
|
exit(1)
|
96
98
|
end
|
97
99
|
tags
|
98
100
|
end
|
101
|
+
|
102
|
+
private
|
103
|
+
def logger
|
104
|
+
@logger ||= Capistrano::Logger.new
|
105
|
+
end
|
99
106
|
end
|
100
107
|
end
|
101
108
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# Load recipes
|
2
|
-
recipes = Dir[File.join(File.dirname(__FILE__), "recipes/**/*.rb")].map {|recipe| File.expand_path(recipe)}
|
2
|
+
recipes = Dir[File.join(File.dirname(__FILE__), "recipes/**/*.rb")].map {|recipe| File.expand_path(recipe) }
|
3
3
|
recipes.each do |recipe|
|
4
4
|
Capistrano::Configuration.instance.load recipe
|
5
5
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
namespace :
|
1
|
+
namespace :rs do
|
2
2
|
desc "Alias cache:clear"
|
3
3
|
task :cc do
|
4
4
|
cache.clear
|
@@ -9,7 +9,7 @@ namespace :rightscale do
|
|
9
9
|
task :clear do
|
10
10
|
logger.info("Clear cache all")
|
11
11
|
prefix = ENV['STAGE'] ? ENV['STAGE'] : ""
|
12
|
-
|
12
|
+
logger.trace(Dir.glob("#{Dir.tmpdir}/cap-rightscale-#{ENV['USER']}-*/#{prefix}*").each {|f| f } || "")
|
13
13
|
FileUtils.rm(Dir.glob("#{Dir.tmpdir}/cap-rightscale-#{ENV['USER']}-*/#{prefix}*"), {:force => true})
|
14
14
|
end
|
15
15
|
end
|
@@ -15,15 +15,15 @@ class RSUtils
|
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
-
def valid_echo(
|
19
|
-
hosts =
|
18
|
+
def valid_echo(servers, logger)
|
19
|
+
hosts = servers
|
20
20
|
threads = []
|
21
21
|
hosts.each do |host|
|
22
22
|
threads << Thread.new {Ping.pingecho(host)}
|
23
23
|
end
|
24
24
|
threads.each_with_index do |t,i|
|
25
25
|
unless t.value
|
26
|
-
logger.info("Server dead or
|
26
|
+
logger.info("Server dead or Network problem: #{hosts[i]}")
|
27
27
|
hosts[i] = nil
|
28
28
|
else
|
29
29
|
logger.info("Server alive: #{hosts[i]}")
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cap-rightscale
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 11
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 5
|
9
|
+
- 0
|
10
|
+
version: 0.5.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Satoshi Ohki
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-02-
|
18
|
+
date: 2011-02-06 00:00:00 +09:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|