cap-rightscale 0.5.0 → 0.6.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.5.0
1
+ 0.6.0
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{cap-rightscale}
8
- s.version = "0.5.0"
8
+ s.version = "0.6.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"]
@@ -14,7 +14,6 @@ Gem::Specification.new do |s|
14
14
  s.email = %q{roothybrid7@gmail.com}
15
15
  s.extra_rdoc_files = [
16
16
  "LICENSE.txt",
17
- "README.jp.rdoc",
18
17
  "README.rdoc"
19
18
  ]
20
19
  s.files = [
@@ -2,7 +2,7 @@ module Capistrano
2
2
  class Configuration
3
3
  module RightScale
4
4
  attr_writer :use_rs_cache
5
- attr_accessor :validate_echo, :use_nickname, :use_public_ip, :rs_confpath, :rs_lifetime, :rs_domain
5
+ attr_accessor :validate_echo, :use_nickname, :use_public_ip, :rs_confpath, :rs_lifetime, :rs_domain, :validate_resolv
6
6
 
7
7
  def rs_array_number_format(format)
8
8
  @array_num_format = format
@@ -21,6 +21,9 @@ module Capistrano
21
21
  # === Parameters
22
22
  # * _role_ - Capistrano role symbol (ex. :app, :web, :db)
23
23
  # * _params[:array_id]_ - ex. :array_id => 1[https://my.rightscale.com/server_arrays/{id}]
24
+ # * _params[:domain]_ domain name(user defined) - ex. :domain => "example.com"
25
+ # * _params[:except_tags]_ except servers matching tags
26
+ # - ex. :except_tags => ["xx_app:state=broken", "xx_app:state=out_of_service"]
24
27
  # * _params[:xxx]_ - ex. :user => "www", :port => 2345, etc...
25
28
  # === Examples
26
29
  # array_id = 1
@@ -31,19 +34,19 @@ start = Time.now
31
34
  return [] unless check_role(role)
32
35
  raise ArgumentError, ":array_id is not included in params!![#{params}]" unless params.has_key?(:array_id)
33
36
  @caller ||= File.basename(caller.map {|x| /(.*?):(\d+)/ =~ x; $1}.first, ".*")
34
- @rs_array_keys ||= [:array_id, :except_tags]
37
+ @rs_array_keys ||= [:array_id, :domain, :except_tags]
35
38
 
36
- logger.info("SETTING ROLE: #{role}")
39
+ logger.debug("SETTING ROLE: #{role}")
37
40
 
38
41
  servers = use_rs_cache ? role_with_load_cache(role, @rs_array_keys, params) : []
39
42
 
40
43
  if servers.size == 0
41
44
  # Request RightScale API
42
45
  array = rs_instance.array(params[:array_id])
43
- logger.info("querying rightscale for server_array #{array.nickname}...")
46
+ logger.debug("querying rightscale for server_array #{array.nickname}...")
44
47
  deployment = rs_instance.deployment(array.deployment_href.match(/[0-9]+$/).to_s, :server_settings => 'true')
45
48
  deployment_name = deployment.nickname
46
- logger.info("Deployment #{deployment_name}:")
49
+ logger.debug("Deployment #{deployment_name}:")
47
50
  servers = rs_instance.array_instances(array.id).select {|i| i[:state] == "operational" }
48
51
  servers = servers_with_tags_set(
49
52
  deployment.id, servers, params[:except_tags], :minus) if params.include?(:except_tags)
@@ -51,17 +54,19 @@ start = Time.now
51
54
  servers = servers.map do |instance|
52
55
  hostname = instance[:nickname].sub(
53
56
  / #[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?
57
+ dom = params[:domain] || rs_domain
58
+ hostname += ".#{dom}" if dom
55
59
  ip = use_public_ip ? instance[:ip_address] : instance[:private_ip_address]
56
60
 
57
- logger.info("Found server: #{hostname}(#{ip})")
61
+ logger.debug("Found server: #{instance[:nickname]}(#{ip})")
58
62
  use_nickname ? hostname : ip
59
63
  end
64
+ servers = RSUtils.valid_resolv(servers, logger) if validate_resolv && use_nickname
60
65
  servers = RSUtils.valid_echo(servers, logger) if validate_echo
61
66
 
62
67
  role_with_dump_cache(role, servers, @rs_array_keys, params, use_rs_cache) if servers.size > 0
63
68
  end
64
- logger.debug("Time: #{Time.now - start}")
69
+ logger.trace("Time: #{Time.now - start}")
65
70
  servers || []
66
71
  end
67
72
 
@@ -70,6 +75,9 @@ logger.debug("Time: #{Time.now - start}")
70
75
  # * _role_ - Capistrano role symbol (ex. :app, :web, :db)
71
76
  # * _params[:name_prefix]_ - ex. :name_prefix => "db" (RightScale instance nickname)
72
77
  # * _params[:deployment]_ - ex. :deployment => 1[https://my.rightscale.com/deployments/{id}]
78
+ # * _params[:domain]_ domain name(user defined) - ex. :domain => "example.com"
79
+ # * _params[:except_tags]_ except servers matching tags
80
+ # - ex. :except_tags => ["xx_app:state=broken", "xx_app:state=out_of_service"]
73
81
  # * _params[:xxx]_ - ex. :user => "www", :port => 2345, etc...
74
82
  # === Examples
75
83
  # deployment_id = 1
@@ -80,16 +88,16 @@ start = Time.now
80
88
  return [] unless check_role(role)
81
89
  raise ArgumentError, ":deployment is not included in params!![#{params}]" unless params.has_key?(:deployment)
82
90
  @caller ||= File.basename(caller.map {|x| /(.*?):(\d+)/ =~ x; $1 }.first, ".*")
83
- @rs_server_keys ||= [:array_id, :name_prefix, :except_tags]
91
+ @rs_server_keys ||= [:array_id, :name_prefix, :domain, :except_tags]
84
92
 
85
- logger.info("SETTING ROLE: #{role}")
93
+ logger.debug("SETTING ROLE: #{role}")
86
94
 
87
95
  servers = use_rs_cache ? role_with_load_cache(role, @rs_server_keys, params) : []
88
96
 
89
97
  if servers.size == 0
90
98
  # Request RightScale API
91
99
  deployment = rs_instance.deployment(params[:deployment], :server_settings => 'true')
92
- logger.info(
100
+ logger.debug(
93
101
  "querying rightscale for servers #{params[:name_prefix]} in deployment #{deployment.nickname}...")
94
102
  servers = deployment.servers.select {|s| s[:state] == "operational" }
95
103
  servers = servers.select {|s| /#{params[:name_prefix]}/ =~ s[:nickname] } if params[:name_prefix]
@@ -98,30 +106,36 @@ start = Time.now
98
106
 
99
107
  servers = servers.map do |server|
100
108
  hostname = server[:nickname]
101
- hostname << ".#{rs_domain}" if rs_domain && hostname.match(/#{rs_domain}/).nil?
109
+ dom = params[:domain] || rs_domain
110
+ hostname += ".#{dom}" if dom
102
111
  ip = use_public_ip ? server[:settings][:ip_address] : server[:settings][:private_ip_address]
103
112
 
104
- logger.info("Found server: #{hostname}(#{ip})")
113
+ logger.debug("Found server: #{server[:nickname]}(#{ip})")
105
114
  use_nickname ? hostname : ip
106
115
  end
116
+ servers = RSUtils.valid_resolv(servers, logger) if validate_resolv && use_nickname
107
117
  servers = RSUtils.valid_echo(servers, logger) if validate_echo
108
118
 
109
119
  role_with_dump_cache(role, servers, @rs_server_keys, params, use_rs_cache) if servers.size > 0
110
120
  end
111
- logger.debug("Time: #{Time.now - start}")
121
+ logger.trace("Time: #{Time.now - start}")
112
122
  servers || []
113
123
  end
114
124
 
115
125
  # Get servers matching tags in deployment
116
126
  # === Parameters
117
127
  # * _role_ - Capistrano role symbol (ex. :app, :web, :db)
128
+ # * _params[:deployment]_ - ex. :deployment => 1[https://my.rightscale.com/deployments/{id}]
118
129
  # * _params[:tags]_ - ex. :tags => "xx_db:role=master",
119
130
  # "xx_web:role", "xx_lb" (RightScale tags partial matchs 'namespece:predicate=value')
120
- # * _params[:deployment]_ - ex. :deployment => 1[https://my.rightscale.com/deployments/{id}]
131
+ # * _params[:name_prefix]_ - ex. :name_prefix => "db" (RightScale instance nickname)
132
+ # * _params[:domain]_ domain name(user defined) - ex. :domain => "example.com"
133
+ # * _params[:except_tags]_ except servers matching tags
134
+ # - ex. :except_tags => ["xx_app:state=broken", "xx_app:state=out_of_service"]
121
135
  # * _params[:xxx]_ - ex. :user => "www", :port => 2345, etc...
122
136
  # === Examples
123
137
  # deployment_id = 1
124
- # nickname :db, :tags => "xx_db:role", :deployment => deployment_id, :port => 3306
138
+ # nickname :db, :name_prefix => "db", :tags => "xx_db:role", :deployment => deployment_id, :port => 3306
125
139
  def tag(role, params)
126
140
  start = Time.now
127
141
  _init unless initialized?
@@ -129,17 +143,19 @@ start = Time.now
129
143
  raise ArgumentError, ":tags is not included in params!![#{params}]" unless params.has_key?(:tags)
130
144
  raise ArgumentError, ":deployment is not included in params!![#{params}]" unless params.has_key?(:deployment)
131
145
  @caller ||= File.basename(caller.map {|x| /(.*?):(\d+)/ =~ x; $1 }.first, ".*")
132
- @rs_tag_keys ||= [:deployment, :tags, :except_tags]
146
+ @rs_tag_keys ||= [:deployment, :tags, :name_prefix, :domain, :except_tags]
133
147
 
134
- logger.info("SETTING ROLE: #{role}")
148
+ logger.debug("SETTING ROLE: #{role}")
135
149
 
136
150
  servers = use_rs_cache ? role_with_load_cache(role, @rs_tag_keys, params) : []
137
151
 
138
152
  if servers.size == 0
139
153
  # Request RightScale API
140
154
  deployment = rs_instance.deployment(params[:deployment], :server_settings => 'true')
141
- logger.info("querying rightscale for servers matching tags #{params[:tags]} in deployment #{deployment.nickname}...")
155
+ logger.debug("querying rightscale for servers #{params[:name_prefix]} " +
156
+ "matching tags #{params[:tags]} in deployment #{deployment.nickname}...")
142
157
  servers = deployment.servers.select {|s| s[:state] == "operational" }
158
+ servers = servers.select {|s| /#{params[:name_prefix]}/ =~ s[:nickname] } if params[:name_prefix]
143
159
 
144
160
  servers = servers_with_tags_set(params[:deployment], servers, params[:tags], :intersect)
145
161
  if params.include?(:except_tags) && servers.size > 0
@@ -148,18 +164,19 @@ start = Time.now
148
164
 
149
165
  servers = servers.map do |server|
150
166
  hostname = server[:nickname]
151
- hostname << ".#{rs_domain}" if rs_domain && hostname.match(/#{rs_domain}/).nil?
167
+ dom = params[:domain] || rs_domain
168
+ hostname += ".#{dom}" if dom
152
169
  ip = use_public_ip ? server[:settings][:ip_address] : server[:settings][:private_ip_address]
153
170
 
154
- logger.info("Found server: #{hostname}(#{ip})")
171
+ logger.debug("Found server: #{server[:nickname]}(#{ip})")
155
172
  use_nickname ? hostname : ip
156
173
  end
157
-
174
+ servers = RSUtils.valid_resolv(servers, logger) if validate_resolv && use_nickname
158
175
  servers = RSUtils.valid_echo(servers, logger) if validate_echo
159
176
 
160
177
  role_with_dump_cache(role, servers, @rs_tag_keys, params, use_rs_cache) if servers.size > 0
161
178
  end
162
- logger.debug("Time: #{Time.now - start}")
179
+ logger.trace("Time: #{Time.now - start}")
163
180
  servers || []
164
181
  end
165
182
 
@@ -212,7 +229,7 @@ logger.debug("Time: #{Time.now - start}")
212
229
 
213
230
  if servers.size > 0
214
231
  rs_keys.each {|key| params.delete(key) } # remove rightscale's parameters
215
- servers.each {|s| logger.info("restore server from cache: #{s}") }
232
+ servers.each {|s| logger.debug("restore server from cache: #{s}") }
216
233
  role(role, params) { servers }
217
234
  end
218
235
 
@@ -269,7 +286,7 @@ logger.debug("Time: #{Time.now - start}")
269
286
  @use_rs_cache
270
287
  end
271
288
 
272
- private :validate_echo, :use_nickname, :use_public_ip, :use_rs_cache
289
+ private :validate_echo, :use_nickname, :use_public_ip, :use_rs_cache, :validate_resolv
273
290
  end
274
291
  end
275
292
  end
@@ -7,10 +7,9 @@ namespace :rs do
7
7
  desc "Clear rightscale's server list cache"
8
8
  namespace :cache do
9
9
  task :clear do
10
- logger.info("Clear cache all")
11
- prefix = ENV['STAGE'] ? ENV['STAGE'] : ""
12
- logger.trace(Dir.glob("#{Dir.tmpdir}/cap-rightscale-#{ENV['USER']}-*/#{prefix}*").each {|f| f } || "")
13
- FileUtils.rm(Dir.glob("#{Dir.tmpdir}/cap-rightscale-#{ENV['USER']}-*/#{prefix}*"), {:force => true})
10
+ logger.debug("Clear cache all")
11
+ logger.trace(Dir.glob("#{Dir.tmpdir}/cap-rightscale-#{ENV['USER']}-*/*").each {|f| f } || "")
12
+ FileUtils.rm(Dir.glob("#{Dir.tmpdir}/cap-rightscale-#{ENV['USER']}-*/*"), {:force => true})
14
13
  end
15
14
  end
16
15
  end
@@ -1,5 +1,6 @@
1
- require 'ping'
2
1
  require 'thread'
2
+ require 'resolv'
3
+ require 'ping'
3
4
 
4
5
  class RSUtils
5
6
  class << self
@@ -15,18 +16,38 @@ class RSUtils
15
16
  end
16
17
  end
17
18
 
19
+ def valid_resolv(servers, logger)
20
+ hosts = servers
21
+ @dns ||= Resolv::DNS.new
22
+
23
+ hosts = hosts.map do |host|
24
+ result = @dns.getaddress(host) rescue nil
25
+ if result.nil?
26
+ logger.debug("ResolvError: No address for #{host}")
27
+ host = nil
28
+ else
29
+ logger.debug("Resolved server: #{host} => #{result}")
30
+ end
31
+ host
32
+ end
33
+ hosts.delete(nil)
34
+
35
+ hosts || []
36
+ end
37
+
18
38
  def valid_echo(servers, logger)
19
39
  hosts = servers
20
40
  threads = []
41
+
21
42
  hosts.each do |host|
22
- threads << Thread.new {Ping.pingecho(host)}
43
+ threads << Thread.new(host) {|h| Ping.pingecho(h) }
23
44
  end
24
45
  threads.each_with_index do |t,i|
25
46
  unless t.value
26
- logger.info("Server dead or Network problem: #{hosts[i]}")
47
+ logger.debug("Server dead or Network problem: #{hosts[i]}")
27
48
  hosts[i] = nil
28
49
  else
29
- logger.info("Server alive: #{hosts[i]}")
50
+ logger.debug("Server alive: #{hosts[i]}")
30
51
  end
31
52
  end
32
53
  hosts.delete(nil)
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: 11
4
+ hash: 7
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 5
8
+ - 6
9
9
  - 0
10
- version: 0.5.0
10
+ version: 0.6.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Satoshi Ohki
@@ -133,7 +133,6 @@ extensions: []
133
133
 
134
134
  extra_rdoc_files:
135
135
  - LICENSE.txt
136
- - README.jp.rdoc
137
136
  - README.rdoc
138
137
  files:
139
138
  - .document
@@ -160,7 +159,6 @@ files:
160
159
  - rsapiconfig.yml.sample
161
160
  - spec/cap-rightscale_spec.rb
162
161
  - spec/spec_helper.rb
163
- - README.jp.rdoc
164
162
  has_rdoc: true
165
163
  homepage: http://github.com/roothybrid7/cap-rightscale
166
164
  licenses:
data/README.jp.rdoc DELETED
@@ -1,19 +0,0 @@
1
- = cap-rightscale
2
-
3
- Capistrano extension that maps RightScale parameters to Roles
4
-
5
- == Contributing to cap-rightscale
6
-
7
- * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
8
- * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it
9
- * Fork the project
10
- * Start a feature/bugfix branch
11
- * Commit and push until you are happy with your contribution
12
- * Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
13
- * Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
14
-
15
- == Copyright
16
-
17
- Copyright (c) 2011 Satoshi Ohki. See LICENSE.txt for
18
- further details.
19
-