cap-rightscale 0.3.13 → 0.4.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.3.13
1
+ 0.4.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.3.13"
8
+ s.version = "0.4.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"]
@@ -74,13 +74,14 @@ module Capistrano
74
74
  rescue => e
75
75
  STDERR.puts("#{e.class}: #{e.pretty_inspect}")
76
76
  warn("Backtrace:\n#{e.backtrace.pretty_inspect}")
77
- exit(1)
77
+ raise
78
78
  end
79
79
 
80
80
  unless Tag.status_code == 200
81
- STDERR.puts("Errors: STATUS is NOT 200 OK")
81
+ message = "Errors: STATUS is NOT 200 OK"
82
+ STDERR.puts(message)
82
83
  warn(Tag.headers)
83
- exit(1)
84
+ raise message
84
85
  end
85
86
  tags
86
87
  end
@@ -9,14 +9,6 @@ module Capistrano
9
9
  attr_writer :validate_echo, :use_nickname, :use_public_ip, :use_rs_cache
10
10
  attr_accessor :rs_cache_lifetime
11
11
 
12
- def get_rs_instance
13
- @rs_instance ||= Capistrano::RightScale::Resource.instance
14
- end
15
-
16
- def get_cache_instance
17
- @cache_instance ||= Capistrano::RightScale::Cache.instance
18
- end
19
-
20
12
  def get_rs_confpath
21
13
  get_rs_instance.confpath
22
14
  end
@@ -61,24 +53,28 @@ module Capistrano
61
53
  start = Time.now
62
54
  logger.info("SETTING ROLE: #{role}")
63
55
 
64
- # Set rightscale's parameters
65
- _array_id = params[:array_id]
66
- params.delete(:array_id) # remove rightscale's parameters
67
-
68
56
  host_list = use_rs_cache ? get_cache_instance.load_server_cache(role, @caller) : [] # Get cache
69
57
 
70
58
  if host_list && host_list.size > 0
59
+ [:array_id, :except_tags].each {|key| params.delete(key)} # remove rightscale's parameters
71
60
  logger.info("restore cache of servers:\n#{host_list.pretty_inspect}")
72
61
  role(role, params) { host_list } # set cache to role()
73
62
  else
74
63
  # Request RightScale API
75
- array = get_rs_instance.array(_array_id)
64
+ array = get_rs_instance.array(params[:array_id])
76
65
  logger.info("querying rightscale for server_array #{array.nickname}...")
77
66
  dept = get_rs_instance.deployment(array.deployment_href.match(/[0-9]+$/).to_s, :server_settings => 'true')
78
67
  deployment_name = dept.nickname
79
68
  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
80
76
 
81
- host_list = get_rs_instance.array_instances(array.id).select {|i| i[:state] == "operational"}.map do |instance|
77
+ host_list = srvs.map do |instance|
82
78
  hostname = instance[:nickname].sub(/ #[0-9]+$/, "-%03d" % instance[:nickname].match(/[0-9]+$/).to_s.to_i)
83
79
  hostname << ".#{domainname}" if domainname && hostname.match(/#{domainname}/).nil?
84
80
  ip = use_public_ip ? instance[:ip_address] : instance[:private_ip_address]
@@ -89,6 +85,7 @@ start = Time.now
89
85
  host_list = RSUtils.valid_echo(host_list, logger) if validate_echo
90
86
 
91
87
  if host_list && host_list.size > 0
88
+ [:array_id, :except_tags].each {|key| params.delete(key)} # remove rightscale's parameters
92
89
  role(role, params) { host_list }
93
90
  get_cache_instance.dump_server_cache(role, host_list, @caller) if use_rs_cache # Dump cache
94
91
  end
@@ -114,27 +111,28 @@ puts "Time: #{Time.now - start}"
114
111
  start = Time.now
115
112
  logger.info("SETTING ROLE: #{role}")
116
113
 
117
- # Set rightscale's parameters
118
- _dept_id = params[:deployment]
119
- _name_prefix = params[:name_prefix]
120
-
121
- params.delete(:deployment)
122
- params.delete(:name_prefix) if params.has_key?(:name_prefix)
123
-
124
114
  host_list = use_rs_cache ? get_cache_instance.load_server_cache(role, @caller) : [] # Get cache
125
115
 
126
- if host_list && host_list.size > 0
116
+ if host_list.size > 0
117
+ [:deployment, :name_prefix, :except_tags].each {|key| params.delete(key)} # remove rightscale's parameters
127
118
  logger.info("restore cache of servers:\n#{host_list.pretty_inspect}")
128
119
  role(role, params) { host_list } # set cache to role()
129
120
  else
121
+
130
122
  # Request RightScale API
131
- dept = get_rs_instance.deployment(_dept_id, :server_settings => 'true')
132
- logger.info("querying rightscale for servers #{_name_prefix} in deployment #{dept.nickname}...")
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}...")
133
125
  srvs = dept.servers.select {|s| s[:state] == "operational"}
134
- srvs = srvs.select {|s| /#{_name_prefix}/ =~ s[:nickname]} if _name_prefix
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
135
133
 
136
134
  host_list = srvs.map do |server|
137
- hostname = server[:nickname]
135
+ hostname = server[:nickname].sub(/ #[0-9]+$/, "-%03d" % server[:nickname].match(/[0-9]+$/).to_s.to_i)
138
136
  hostname << ".#{domainname}" if domainname && hostname.match(/#{domainname}/).nil?
139
137
  ip = use_public_ip ? server[:settings][:ip_address] : server[:settings][:private_ip_address]
140
138
 
@@ -144,6 +142,7 @@ start = Time.now
144
142
  host_list = RSUtils.valid_echo(host_list, logger) if validate_echo
145
143
 
146
144
  if host_list && host_list.size > 0
145
+ [:array_id, :except_tags].each {|key| params.delete(key)} # remove rightscale's parameters
147
146
  role(role, params) { host_list }
148
147
  get_cache_instance.dump_server_cache(role, host_list, @caller) if use_rs_cache # Dump cache
149
148
  end
@@ -170,47 +169,41 @@ puts "Time: #{Time.now - start}"
170
169
  start = Time.now
171
170
  logger.info("SETTING ROLE: #{role}")
172
171
 
173
- # Set rightscale's parameters
174
- _dept_id = params[:deployment]
175
- _tags = params[:tags]
176
-
177
- params.delete(:deployment)
178
- params.delete(:tags)
179
-
180
172
  host_list = use_rs_cache ? get_cache_instance.load_server_cache(role, @caller) : [] # Get cache
181
173
 
182
174
  if host_list && host_list.size > 0
175
+ [:deployment, :tags, :except_tags].each {|key| params.delete(key)} # remove rightscale's parameters
183
176
  logger.info("restore cache of servers:\n#{host_list.pretty_inspect}")
184
177
  role(role, params) { host_list } # set cache to role()
185
178
  else
186
179
  # Request RightScale API
187
- dept = get_rs_instance.__send__(:deployment, _dept_id, :server_settings => 'true')
188
- logger.info("querying rightscale for servers matching tags #{_tags} in deployment #{dept.nickname}...")
180
+ dept = get_rs_instance.deployment(params[:deployment], :server_settings => 'true')
181
+ logger.info("querying rightscale for servers matching tags #{params[:tags]} in deployment #{dept.nickname}...")
189
182
  srvs = dept.servers.select {|s| s[:state] == "operational"}
190
183
 
191
- ts_params = {:resource_type => "ec2_instance", :tags => [_tags]}
192
- ts = get_rs_instance.__send__(:tag, ts_params).
193
- select {|s| s.state == "operational"}.
194
- select {|s| s.deployment_href.match(/[0-9]+$/).to_s == _dept_id.to_s}
184
+ ts_params = {:resource_type => "ec2_instance", :tags => [params[:tags]]}
185
+ srvs = servers_with_tags_set(params[:deployment], srvs, ts_params, :intersect)
186
+ return [] if srvs.size == 0 # Not found servers matching tag
195
187
 
196
- # diff servers in deployment and servers matching tags in deployment
197
- srvs_ids = srvs.map {|s| s[:href].match(/[0-9]+$/).to_s}
198
- ts_ids = ts.map {|s| s.href.sub("/current", "").match(/[0-9]+$/).to_s}
199
- found_ids = srvs_ids & ts_ids
200
-
201
- if found_ids.size > 0
202
- host_list = srvs.select {|s| found_ids.include?(s[:href].match(/[0-9]+$/).to_s)}.map do |server|
203
- hostname = server[:nickname]
204
- hostname << ".#{domainname}" if domainname && hostname.match(/#{domainname}/).nil?
205
- ip = use_public_ip ? server[:settings][:ip_address] : server[:settings][:private_ip_address]
206
-
207
- logger.info("Found server: #{hostname}(#{ip})")
208
- use_nickname ? hostname : ip
209
- end
210
- host_list = RSUtils.valid_echo(host_list, logger) if validate_echo
188
+ if params.include?(:except_tags)
189
+ except_tags_params = {:resource_type => "ec2_instance", :tags => [params[:except_tags]]}
190
+ srvs = servers_with_tags_set(params[:deployment], srvs, except_tags_params, :minus)
191
+ return [] if srvs.size == 0 # Not found servers matching tag
192
+ end
193
+
194
+ host_list = srvs.map do |server|
195
+ hostname = server[:nickname]
196
+ hostname << ".#{domainname}" if domainname && hostname.match(/#{domainname}/).nil?
197
+ ip = use_public_ip ? server[:settings][:ip_address] : server[:settings][:private_ip_address]
198
+
199
+ logger.info("Found server: #{hostname}(#{ip})")
200
+ use_nickname ? hostname : ip
211
201
  end
212
202
 
203
+ host_list = RSUtils.valid_echo(host_list, logger) if validate_echo
204
+
213
205
  if host_list && host_list.size > 0
206
+ [:deployment, :tags, :except_tags].each {|key| params.delete(key)} # remove rightscale's parameters
214
207
  role(role, params) { host_list }
215
208
  get_cache_instance.dump_server_cache(role, host_list, @caller) if use_rs_cache # Dump cache
216
209
  end
@@ -226,6 +219,53 @@ puts "Time: #{Time.now - start}"
226
219
  return true
227
220
  end
228
221
 
222
+ def get_rs_instance
223
+ @rs_instance ||= Capistrano::RightScale::Resource.instance
224
+ end
225
+
226
+ def get_cache_instance
227
+ @cache_instance ||= Capistrano::RightScale::Cache.instance
228
+ end
229
+
230
+ # set(union, intersect, minus) servers in deployment and servers matching tags in deployment
231
+ def servers_with_tags_set(deployment_id, servers, tags_params, operator)
232
+ servers_ids = servers.map {|s| s[:href].match(/[0-9]+$/).to_s}
233
+
234
+ ts = servers_with_tags_in_deployment(deployment_id, tags_params)
235
+ return [] if ts.size == 0
236
+
237
+ ts_ids = ts.map {|s| s.href.sub("/current", "").match(/[0-9]+$/).to_s}
238
+ case operator
239
+ when :intersect then
240
+ oper_ids = servers_ids & ts_ids
241
+ when :minus then
242
+ oper_ids = servers_ids - ts_ids
243
+ end
244
+ return [] if oper_ids.size == 0
245
+
246
+ servers.select {|s| oper_ids.include?(s[:href].match(/[0-9]+$/).to_s)} || []
247
+ end
248
+
249
+ def intersect_servers_with_tags(deployment, servers, tags_params, tags_api)
250
+ ts = tags_api.call
251
+ return [] if ts.size == 0
252
+
253
+ ts_ids = ts.map {|s| s.href.sub("/current", "").match(/[0-9]+$/).to_s}
254
+ intersect_ids = servers_ids & ts_ids
255
+ intersect_ids.size > 0 ? intersect_ids : []
256
+ end
257
+
258
+ def servers_with_tags_in_deployment(deployment_id, params)
259
+ begin
260
+ servers = get_rs_instance.tag(params).
261
+ select {|s| s.state == "operational"}.
262
+ select {|s| s.deployment_href.match(/[0-9]+$/).to_s == deployment_id.to_s}
263
+ rescue => e
264
+ {}
265
+ end
266
+ servers
267
+ end
268
+
229
269
  def validate_echo
230
270
  @validate_echo ||= false
231
271
  end
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: 9
4
+ hash: 15
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 3
9
- - 13
10
- version: 0.3.13
8
+ - 4
9
+ - 0
10
+ version: 0.4.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Satoshi Ohki