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.
|
1
|
+
0.6.0
|
data/cap-rightscale.gemspec
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{cap-rightscale}
|
8
|
-
s.version = "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.
|
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.
|
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.
|
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
|
-
|
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.
|
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.
|
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.
|
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.
|
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
|
-
|
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.
|
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.
|
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[:
|
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.
|
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.
|
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
|
-
|
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.
|
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.
|
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.
|
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.
|
11
|
-
|
12
|
-
|
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(
|
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.
|
47
|
+
logger.debug("Server dead or Network problem: #{hosts[i]}")
|
27
48
|
hosts[i] = nil
|
28
49
|
else
|
29
|
-
logger.
|
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:
|
4
|
+
hash: 7
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
8
|
+
- 6
|
9
9
|
- 0
|
10
|
-
version: 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
|
-
|