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 CHANGED
@@ -1 +1 @@
1
- 0.4.6
1
+ 0.5.0
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{cap-rightscale}
8
- s.version = "0.4.6"
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-05}
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 = [
@@ -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,4 +1,6 @@
1
1
  require 'cap-rightscale/configuration/rightscale'
2
+ require 'cap-rightscale/configuration/rightscale/cache'
3
+ require 'cap-rightscale/configuration/rightscale/resource'
2
4
 
3
5
  module Capistrano
4
6
  class Configuration
@@ -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
- attr_reader :domainname
9
- attr_writer :validate_echo, :use_nickname, :use_public_ip, :use_rs_cache
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 rs_enable(*args)
21
- args.each do |arg|
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
- def rs_disable(*args)
27
- args.each do |arg|
28
- __send__("#{arg}=".to_sym, false) if respond_to?("#{arg}=".to_sym)
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
- host_list = use_rs_cache ? get_cache_instance.load_server_cache(role, @caller) : [] # Get cache
38
+ servers = use_rs_cache ? role_with_load_cache(role, @rs_array_keys, params) : []
57
39
 
58
- if host_list.size > 0
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 = get_rs_instance.array(params[:array_id])
42
+ array = rs_instance.array(params[:array_id])
65
43
  logger.info("querying rightscale for server_array #{array.nickname}...")
66
- dept = get_rs_instance.deployment(array.deployment_href.match(/[0-9]+$/).to_s, :server_settings => 'true')
67
- deployment_name = dept.nickname
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
- srvs = get_rs_instance.array_instances(array.id).select {|i| i[:state] == "operational"}
70
-
71
- if params.include?(:except_tags)
72
- except_tags_params = {:resource_type => "ec2_instance", :tags => params[:except_tags]}
73
- srvs = servers_with_tags_set(params[:deployment], srvs, except_tags_params, :minus)
74
- return [] if srvs.size == 0 # Not found servers matching tag
75
- end
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
- host_list = RSUtils.valid_echo(host_list, logger) if validate_echo
60
+ servers = RSUtils.valid_echo(servers, logger) if validate_echo
86
61
 
87
- if host_list.size > 0
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
- host_list || []
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
- host_list = use_rs_cache ? get_cache_instance.load_server_cache(role, @caller) : [] # Get cache
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
- dept = get_rs_instance.deployment(params[:deployment], :server_settings => 'true')
124
- logger.info("querying rightscale for servers #{params[:name_prefix]} in deployment #{dept.nickname}...")
125
- srvs = dept.servers.select {|s| s[:state] == "operational"}
126
- srvs = srvs.select {|s| /#{params[:name_prefix]}/ =~ s[:nickname]} if params[:name_prefix]
127
-
128
- if params.include?(:except_tags)
129
- except_tags_params = {:resource_type => "ec2_instance", :tags => params[:except_tags]}
130
- srvs = servers_with_tags_set(params[:deployment], srvs, except_tags_params, :minus)
131
- return [] if srvs.size == 0 # Not found servers matching tag
132
- end
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
- host_list = RSUtils.valid_echo(host_list, logger) if validate_echo
107
+ servers = RSUtils.valid_echo(servers, logger) if validate_echo
143
108
 
144
- if host_list.size > 0
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
- host_list || []
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
- host_list = use_rs_cache ? get_cache_instance.load_server_cache(role, @caller) : [] # Get cache
136
+ servers = use_rs_cache ? role_with_load_cache(role, @rs_tag_keys, params) : []
174
137
 
175
- if host_list.size > 0
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
- dept = get_rs_instance.deployment(params[:deployment], :server_settings => 'true')
182
- logger.info("querying rightscale for servers matching tags #{params[:tags]} in deployment #{dept.nickname}...")
183
- srvs = dept.servers.select {|s| s[:state] == "operational"}
184
-
185
- ts_params = {:resource_type => "ec2_instance", :tags => params[:tags]}
186
- srvs = servers_with_tags_set(params[:deployment], srvs, ts_params, :intersect)
187
- return [] if srvs.size == 0 # Not found servers matching tag
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
- host_list = srvs.map do |server|
149
+ servers = servers.map do |server|
196
150
  hostname = server[:nickname]
197
- hostname << ".#{domainname}" if domainname && hostname.match(/#{domainname}/).nil?
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
- host_list = RSUtils.valid_echo(host_list, logger) if validate_echo
158
+ servers = RSUtils.valid_echo(servers, logger) if validate_echo
205
159
 
206
- if host_list.size > 0
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
- host_list || []
163
+ servers || []
214
164
  end
215
165
 
216
166
  private
217
- def check_role(role)
218
- return false if ENV['HOSTS']
219
- return false if ENV['ROLES'] && ENV['ROLES'].split(',').include?("#{role}") == false
220
- return true
221
- end
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
- def get_rs_instance
224
- @rs_instance ||= Capistrano::RightScale::Resource.instance
225
- end
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
- def get_cache_instance
228
- @cache_instance ||= Capistrano::RightScale::Cache.instance
182
+ @initialized = true
229
183
  end
184
+ end
230
185
 
231
- # set(union, intersect, minus) servers in deployment and servers matching tags in deployment
232
- def servers_with_tags_set(deployment_id, servers, tags_params, operator)
233
- servers_ids = servers.map {|s| s[:href].match(/[0-9]+$/).to_s}
186
+ def initialized?
187
+ @initialized
188
+ end
234
189
 
235
- ts = servers_with_tags_in_deployment(deployment_id, tags_params)
236
- return [] if ts.size == 0
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
- ts_ids = ts.map {|s| s.href.sub("/current", "").match(/[0-9]+$/).to_s}
239
- case operator
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
- servers.select {|s| oper_ids.include?(s[:href].match(/[0-9]+$/).to_s)} || []
248
- end
198
+ t
199
+ end
249
200
 
250
- def intersect_servers_with_tags(deployment, servers, tags_params, tags_api)
251
- ts = tags_api.call
252
- return [] if ts.size == 0
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
- ts_ids = ts.map {|s| s.href.sub("/current", "").match(/[0-9]+$/).to_s}
255
- intersect_ids = servers_ids & ts_ids
256
- intersect_ids.size > 0 ? intersect_ids : []
257
- end
206
+ def cache_instance
207
+ @cache_instance ||= Capistrano::RightScale::Cache.instance.instance_eval { @logger = logger; self }
208
+ end
258
209
 
259
- def servers_with_tags_in_deployment(deployment_id, params)
260
- begin
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
- def validate_echo
271
- @validate_echo ||= false
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
- # register deploy host's /etc/hosts OR dns record(replace 's/ #/-000/' to ServerArray name)
275
- def use_nickname
276
- @use_nickname ||= false
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
- def use_public_ip
280
- @use_public_ip ||= false
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
- def use_rs_cache
284
- if @use_rs_cache.nil? && ENV['RSCACHE']
285
- env = ENV['RSCACHE'].downcase
286
- @use_rs_cache = false if env == "false"
287
- end
288
- @use_rs_cache = true if @use_rs_cache.nil?
289
- @use_rs_cache
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 = 86400
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
- if Time.now - server_cache[role][:cache] > lifetime
29
- server_list = []
30
- elsif server_cache[role][:servers]
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
- server_list
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
- STDERR.puts("#{e.class}: #{e.pretty_inspect}")
59
- warn("Backtrace:\n#{e.backtrace.pretty_inspect}")
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 = File.join(ENV['HOME'], ".rsconf", "rsapiconfig.yml")
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
- STDERR.puts <<-"USAGE"
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
- Set param: set_rs_confpath <authfile_path>
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
- STDERR.puts("#{e.class}: #{e.pretty_inspect}")
43
- STDERR.puts("Backtrace:\n#{e.backtrace.pretty_inspect}")
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
- STDERR.puts("Errors: Unknown Errors")
51
+ @logger.important("Error: Unknown Error when accessing RightScale API")
50
52
  exit(1)
51
53
  elsif status_code != 200
52
- STDERR.puts("Errors: HTTP STATUS CODE is #{status_code}")
53
- STDERR.puts(RightResource::Base.headers)
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
- STDERR.puts("#{e.class}: #{e.pretty_inspect}")
84
- STDERR.puts("Backtrace:\n#{e.backtrace.pretty_inspect}")
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
- STDERR.puts("Errors: Unknown Errors")
92
+ @logger.important("Error: Unknown Error when accessing RightScale API")
91
93
  exit(1)
92
94
  elsif status_code != 200
93
- STDERR.puts("Errors: HTTP STATUS CODE is #{status_code}")
94
- STDERR.puts(Tag.headers)
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 :rightscale do
1
+ namespace :rs do
2
2
  desc "None task"
3
3
  task :none do
4
4
  nil
@@ -1,4 +1,4 @@
1
- namespace :rightscale do
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
- pp Dir.glob("#{Dir.tmpdir}/cap-rightscale-#{ENV['USER']}-*/#{prefix}*")
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(host_list, logger)
19
- hosts = host_list
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 Firewall blocking: #{hosts[i]}")
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: 3
4
+ hash: 11
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 4
9
- - 6
10
- version: 0.4.6
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-05 00:00:00 +09:00
18
+ date: 2011-02-06 00:00:00 +09:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency