cap-rightscale 0.4.6 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
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