right_agent 2.1.5 → 2.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/right_agent/agent_tag_manager.rb +17 -9
- data/lib/right_agent/clients/api_client.rb +28 -27
- data/lib/right_agent/clients/balanced_http_client.rb +25 -5
- data/lib/right_agent/clients/base_retry_client.rb +76 -42
- data/lib/right_agent/clients/blocking_client.rb +11 -1
- data/lib/right_agent/clients/non_blocking_client.rb +32 -9
- data/lib/right_agent/clients/right_http_client.rb +14 -8
- data/lib/right_agent/clients/router_client.rb +41 -14
- data/lib/right_agent/command/command_client.rb +1 -0
- data/lib/right_agent/http_exceptions.rb +6 -1
- data/lib/right_agent/monkey_patches/ruby_patch/windows_patch/process_patch.rb +2 -2
- data/lib/right_agent/offline_handler.rb +22 -9
- data/lib/right_agent/retryable_request.rb +18 -12
- data/lib/right_agent/scripts/agent_controller.rb +9 -3
- data/lib/right_agent/sender.rb +94 -61
- data/right_agent.gemspec +2 -2
- data/spec/agent_tag_manager_spec.rb +59 -14
- data/spec/clients/api_client_spec.rb +48 -36
- data/spec/clients/balanced_http_client_spec.rb +46 -2
- data/spec/clients/base_retry_client_spec.rb +118 -48
- data/spec/clients/blocking_client_spec.rb +16 -0
- data/spec/clients/non_blocking_client_spec.rb +43 -6
- data/spec/clients/router_client_spec.rb +54 -49
- data/spec/http_exceptions_spec.rb +7 -0
- data/spec/offline_handler_spec.rb +22 -11
- data/spec/retryable_request_spec.rb +35 -20
- data/spec/sender_spec.rb +185 -122
- metadata +3 -3
data/lib/right_agent/sender.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#
|
2
|
-
# Copyright (c) 2009-
|
2
|
+
# Copyright (c) 2009-2014 RightScale Inc
|
3
3
|
#
|
4
4
|
# Permission is hereby granted, free of charge, to any person obtaining
|
5
5
|
# a copy of this software and associated documentation files (the
|
@@ -75,14 +75,14 @@ module RightScale
|
|
75
75
|
# :offline_queueing(Boolean):: Whether to queue request if client currently disconnected,
|
76
76
|
# also requires agent invocation of initialize_offline_queue and start_offline_queue methods below,
|
77
77
|
# as well as enable_offline_mode and disable_offline_mode as client connection status changes
|
78
|
-
# :ping_interval(
|
78
|
+
# :ping_interval(Numeric):: Minimum number of seconds since last message receipt to ping RightNet
|
79
79
|
# to check connectivity, defaults to 0 meaning do not ping
|
80
80
|
# :restart_callback(Proc):: Callback that is activated on each restart vote with votes being initiated
|
81
81
|
# by offline queue exceeding MAX_QUEUED_REQUESTS or by repeated failures to access RightNet when online
|
82
82
|
# :retry_timeout(Numeric):: Maximum number of seconds to retry request before give up
|
83
83
|
# :retry_interval(Numeric):: Number of seconds before initial request retry, increases exponentially
|
84
|
-
# :time_to_live(
|
85
|
-
#
|
84
|
+
# :time_to_live(Numeric):: Number of seconds before a request expires and is to be ignored;
|
85
|
+
# non-positive value means never expire
|
86
86
|
# :async_response(Boolean):: Whether to handle responses asynchronously or to handle them immediately
|
87
87
|
# upon arrival (for use by applications that were written expecting asynchronous AMQP responses)
|
88
88
|
# :secure(Boolean):: true indicates to use Security features of rabbitmq to restrict agents to themselves
|
@@ -188,7 +188,10 @@ module RightScale
|
|
188
188
|
# ones with no shard id
|
189
189
|
# :selector(Symbol):: Which of the matched targets to be selected, either :any or :all,
|
190
190
|
# defaults to :any
|
191
|
-
#
|
191
|
+
# options(Hash):: Request options
|
192
|
+
# :token(String):: Universally unique ID for request; defaults to random generated
|
193
|
+
# :time_to_live(Numeric):: Number of seconds before a request expires and is to be ignored;
|
194
|
+
# non-positive value or nil means never expire; defaults to 0
|
192
195
|
#
|
193
196
|
# === Block
|
194
197
|
# Optional block used to process routing responses asynchronously with the following parameter:
|
@@ -205,8 +208,8 @@ module RightScale
|
|
205
208
|
# SendFailure:: If sending of request failed unexpectedly
|
206
209
|
# TemporarilyOffline:: If cannot send request because RightNet client currently disconnected
|
207
210
|
# and offline queueing is disabled
|
208
|
-
def send_push(type, payload = nil, target = nil,
|
209
|
-
build_and_send_packet(:send_push, type, payload, target,
|
211
|
+
def send_push(type, payload = nil, target = nil, options = {}, &callback)
|
212
|
+
build_and_send_packet(:send_push, type, payload, target, options, &callback)
|
210
213
|
end
|
211
214
|
|
212
215
|
# Send a request to a single target with a response expected
|
@@ -231,7 +234,10 @@ module RightScale
|
|
231
234
|
# :account(Integer):: Restrict to agents with this account id
|
232
235
|
# :shard(Integer):: Restrict to agents with this shard id, or if value is Packet::GLOBAL,
|
233
236
|
# ones with no shard id
|
234
|
-
#
|
237
|
+
# options(Hash):: Request options
|
238
|
+
# :token(String):: Universally unique ID for request; defaults to random generated
|
239
|
+
# :time_to_live(Numeric):: Number of seconds before a request expires and is to be ignored;
|
240
|
+
# non-positive value or nil means never expire; defaults to configured :time_to_live
|
235
241
|
#
|
236
242
|
# === Block
|
237
243
|
# Required block used to process response asynchronously with the following parameter:
|
@@ -243,9 +249,9 @@ module RightScale
|
|
243
249
|
#
|
244
250
|
# === Raise
|
245
251
|
# ArgumentError:: If target invalid or block missing
|
246
|
-
def send_request(type, payload = nil, target = nil,
|
252
|
+
def send_request(type, payload = nil, target = nil, options = {}, &callback)
|
247
253
|
raise ArgumentError, "Missing block for response callback" unless callback
|
248
|
-
build_and_send_packet(:send_request, type, payload, target,
|
254
|
+
build_and_send_packet(:send_request, type, payload, target, options, &callback)
|
249
255
|
end
|
250
256
|
|
251
257
|
# Build and send packet
|
@@ -254,7 +260,7 @@ module RightScale
|
|
254
260
|
# kind(Symbol):: Kind of request: :send_push or :send_request
|
255
261
|
# type(String):: Dispatch route for the request; typically identifies actor and action
|
256
262
|
# payload(Object):: Data to be sent with marshalling en route
|
257
|
-
# target(Hash|NilClass)::
|
263
|
+
# target(Hash|NilClass):: Target for request
|
258
264
|
# :agent_id(String):: Identity of specific target
|
259
265
|
# :tags(Array):: Tags that must all be associated with a target for it to be selected
|
260
266
|
# :scope(Hash):: Scoping to be used to restrict routing
|
@@ -262,20 +268,27 @@ module RightScale
|
|
262
268
|
# :shard(Integer):: Restrict to agents with this shard id, or if value is Packet::GLOBAL,
|
263
269
|
# ones with no shard id
|
264
270
|
# :selector(Symbol):: Which of the matched targets to be selected: :any or :all
|
265
|
-
#
|
266
|
-
#
|
271
|
+
# options(Hash):: Request options
|
272
|
+
# :token(String):: Universally unique ID for request; defaults to random generated
|
273
|
+
# :time_to_live(Numeric):: Number of seconds before a request expires and is to be ignored;
|
274
|
+
# non-positive value or nil means never expire for :send_push and means use configured
|
275
|
+
# time-to-live for :send_request
|
276
|
+
#
|
277
|
+
# === Block
|
278
|
+
# Optional block used to process response asynchronously with the following parameter:
|
279
|
+
# result(Result):: Response with an OperationResult of SUCCESS, RETRY, NON_DELIVERY, or ERROR
|
267
280
|
#
|
268
281
|
# === Return
|
269
282
|
# true:: Always return true
|
270
283
|
#
|
271
284
|
# === Raise
|
272
285
|
# ArgumentError:: If target invalid
|
273
|
-
def build_and_send_packet(kind, type, payload, target,
|
274
|
-
if (packet = build_packet(kind, type, payload, target,
|
286
|
+
def build_and_send_packet(kind, type, payload, target, options = {}, &callback)
|
287
|
+
if (packet = build_packet(kind, type, payload, target, options, &callback))
|
275
288
|
action = type.split('/').last
|
276
289
|
received_at = @request_stats.update(action, packet.token)
|
277
290
|
@request_kind_stats.update((packet.selector == :all ? "fanout" : kind.to_s)[5..-1])
|
278
|
-
send("#{@mode}_send", kind, target, packet, received_at, callback)
|
291
|
+
send("#{@mode}_send", kind, target, packet, received_at, &callback)
|
279
292
|
end
|
280
293
|
true
|
281
294
|
end
|
@@ -286,7 +299,7 @@ module RightScale
|
|
286
299
|
# kind(Symbol):: Kind of request: :send_push or :send_request
|
287
300
|
# type(String):: Dispatch route for the request; typically identifies actor and action
|
288
301
|
# payload(Object):: Data to be sent with marshalling en route
|
289
|
-
# target(Hash|NilClass)::
|
302
|
+
# target(Hash|NilClass):: Target for request
|
290
303
|
# :agent_id(String):: Identity of specific target
|
291
304
|
# :tags(Array):: Tags that must all be associated with a target for it to be selected
|
292
305
|
# :scope(Hash):: Scoping to be used to restrict routing
|
@@ -294,43 +307,52 @@ module RightScale
|
|
294
307
|
# :shard(Integer):: Restrict to agents with this shard id, or if value is Packet::GLOBAL,
|
295
308
|
# ones with no shard id
|
296
309
|
# :selector(Symbol):: Which of the matched targets to be selected: :any or :all
|
297
|
-
#
|
298
|
-
#
|
310
|
+
# options(Hash):: Request options
|
311
|
+
# :token(String):: Universally unique ID for request; defaults to random generated
|
312
|
+
# :time_to_live(Numeric):: Number of seconds before a request expires and is to be ignored;
|
313
|
+
# non-positive value or nil means never expire for :send_push and means use configured
|
314
|
+
# time-to-live for :send_request
|
315
|
+
#
|
316
|
+
# === Block
|
317
|
+
# Optional block used to process response asynchronously with the following parameter:
|
318
|
+
# result(Result):: Response with an OperationResult of SUCCESS, RETRY, NON_DELIVERY, or ERROR
|
299
319
|
#
|
300
320
|
# === Return
|
301
321
|
# (Push|Request|NilClass):: Packet created, or nil if queued instead
|
302
322
|
#
|
303
323
|
# === Raise
|
304
324
|
# ArgumentError:: If target is invalid
|
305
|
-
def build_packet(kind, type, payload, target,
|
325
|
+
def build_packet(kind, type, payload, target, options = {}, &callback)
|
306
326
|
validate_target(target, kind == :send_push)
|
307
|
-
if
|
308
|
-
|
309
|
-
|
327
|
+
if kind == :send_push
|
328
|
+
packet = Push.new(type, payload)
|
329
|
+
packet.selector = target[:selector] || :any if target.is_a?(Hash)
|
330
|
+
packet.persistent = true
|
331
|
+
packet.confirm = true if callback
|
332
|
+
time_to_live = options[:time_to_live] || 0
|
310
333
|
else
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
packet.
|
321
|
-
end
|
322
|
-
packet.from = @identity
|
323
|
-
packet.token = token || RightSupport::Data::UUID.generate
|
324
|
-
if target.is_a?(Hash)
|
325
|
-
if (agent_id = target[:agent_id])
|
326
|
-
packet.target = agent_id
|
327
|
-
else
|
328
|
-
packet.tags = target[:tags] || []
|
329
|
-
packet.scope = target[:scope]
|
330
|
-
end
|
334
|
+
packet = Request.new(type, payload)
|
335
|
+
packet.selector = :any
|
336
|
+
time_to_live = options[:time_to_live] || @options[:time_to_live]
|
337
|
+
end
|
338
|
+
packet.from = @identity
|
339
|
+
packet.token = options[:token] || RightSupport::Data::UUID.generate
|
340
|
+
packet.expires_at = Time.now.to_i + time_to_live if time_to_live && time_to_live > 0
|
341
|
+
if target.is_a?(Hash)
|
342
|
+
if (agent_id = target[:agent_id])
|
343
|
+
packet.target = agent_id
|
331
344
|
else
|
332
|
-
packet.
|
345
|
+
packet.tags = target[:tags] || []
|
346
|
+
packet.scope = target[:scope]
|
333
347
|
end
|
348
|
+
else
|
349
|
+
packet.target = target
|
350
|
+
end
|
351
|
+
|
352
|
+
if queueing?
|
353
|
+
@offline_handler.queue_request(kind, type, payload, target, packet.token, packet.expires_at, &callback)
|
354
|
+
nil
|
355
|
+
else
|
334
356
|
packet
|
335
357
|
end
|
336
358
|
end
|
@@ -577,25 +599,28 @@ module RightScale
|
|
577
599
|
#
|
578
600
|
# === Parameters
|
579
601
|
# kind(Symbol):: Kind of request: :send_push or :send_request
|
580
|
-
# target(Hash|
|
602
|
+
# target(Hash|NilClass):: Target for request
|
581
603
|
# packet(Push|Request):: Request packet to send
|
582
604
|
# received_at(Time):: Time when request received
|
583
|
-
#
|
605
|
+
#
|
606
|
+
# === Block
|
607
|
+
# Optional block used to process response asynchronously with the following parameter:
|
608
|
+
# result(Result):: Response with an OperationResult of SUCCESS, RETRY, NON_DELIVERY, or ERROR
|
584
609
|
#
|
585
610
|
# === Return
|
586
611
|
# true:: Always return true
|
587
|
-
def http_send(kind, target, packet, received_at, callback)
|
612
|
+
def http_send(kind, target, packet, received_at, &callback)
|
588
613
|
if @options[:async_response]
|
589
614
|
EM_S.next_tick do
|
590
615
|
begin
|
591
|
-
http_send_once(kind, target, packet, received_at, callback)
|
616
|
+
http_send_once(kind, target, packet, received_at, &callback)
|
592
617
|
rescue Exception => e
|
593
618
|
Log.error("Failed sending or handling response for #{packet.trace} #{packet.type}", e, :trace)
|
594
619
|
@exception_stats.track("request", e)
|
595
620
|
end
|
596
621
|
end
|
597
622
|
else
|
598
|
-
http_send_once(kind, target, packet, received_at, callback)
|
623
|
+
http_send_once(kind, target, packet, received_at, &callback)
|
599
624
|
end
|
600
625
|
true
|
601
626
|
end
|
@@ -604,22 +629,27 @@ module RightScale
|
|
604
629
|
#
|
605
630
|
# === Parameters
|
606
631
|
# kind(Symbol):: Kind of request: :send_push or :send_request
|
607
|
-
# target(Hash|
|
632
|
+
# target(Hash|NilClass):: Target for request
|
608
633
|
# packet(Push|Request):: Request packet to send
|
609
634
|
# received_at(Time):: Time when request received
|
610
|
-
#
|
635
|
+
#
|
636
|
+
# === Block
|
637
|
+
# Optional block used to process response asynchronously with the following parameter:
|
638
|
+
# result(Result):: Response with an OperationResult of SUCCESS, RETRY, NON_DELIVERY, or ERROR
|
611
639
|
#
|
612
640
|
# === Return
|
613
641
|
# true:: Always return true
|
614
|
-
def http_send_once(kind, target, packet, received_at, callback)
|
642
|
+
def http_send_once(kind, target, packet, received_at, &callback)
|
615
643
|
begin
|
616
644
|
method = packet.class.name.split("::").last.downcase
|
617
|
-
|
645
|
+
options = {:request_uuid => packet.token}
|
646
|
+
options[:time_to_live] = (packet.expires_at - Time.now.to_i) if packet.expires_at > 0
|
647
|
+
result = success_result(@agent.client.send(method, packet.type, packet.payload, target, options))
|
618
648
|
rescue Exceptions::Unauthorized => e
|
619
649
|
result = error_result(e.message)
|
620
650
|
rescue Exceptions::ConnectivityFailure => e
|
621
651
|
if queueing?
|
622
|
-
@offline_handler.queue_request(kind, packet.type, packet.payload, target, callback)
|
652
|
+
@offline_handler.queue_request(kind, packet.type, packet.payload, target, packet.token, packet.expires_at, &callback)
|
623
653
|
result = nil
|
624
654
|
else
|
625
655
|
result = retry_result(e.message)
|
@@ -631,7 +661,7 @@ module RightScale
|
|
631
661
|
rescue Exceptions::Terminating => e
|
632
662
|
result = nil
|
633
663
|
rescue StandardError => e
|
634
|
-
# These errors are either unexpected errors or
|
664
|
+
# These errors are either unexpected errors or HttpExceptions with an http_body
|
635
665
|
# giving details about the error that are conveyed in the error_result
|
636
666
|
if e.respond_to?(:http_body)
|
637
667
|
# No need to log here since any HTTP request errors have already been logged
|
@@ -658,14 +688,17 @@ module RightScale
|
|
658
688
|
#
|
659
689
|
# === Parameters
|
660
690
|
# kind(Symbol):: Kind of request: :send_push or :send_request
|
661
|
-
# target(Hash|
|
662
|
-
# received_at(Time):: Time when request received
|
691
|
+
# target(Hash|NilClass):: Target for request
|
663
692
|
# packet(Push|Request):: Request packet to send
|
664
|
-
#
|
693
|
+
# received_at(Time):: Time when request received
|
694
|
+
#
|
695
|
+
# === Block
|
696
|
+
# Optional block used to process response asynchronously with the following parameter:
|
697
|
+
# result(Result):: Response with an OperationResult of SUCCESS, RETRY, NON_DELIVERY, or ERROR
|
665
698
|
#
|
666
699
|
# === Return
|
667
700
|
# true:: Always return true
|
668
|
-
def amqp_send(kind, target, packet, received_at, callback)
|
701
|
+
def amqp_send(kind, target, packet, received_at, &callback)
|
669
702
|
begin
|
670
703
|
@pending_requests[packet.token] = PendingRequest.new(kind, received_at, callback) if callback
|
671
704
|
if packet.class == Request
|
@@ -676,7 +709,7 @@ module RightScale
|
|
676
709
|
rescue TemporarilyOffline => e
|
677
710
|
if queueing?
|
678
711
|
# Queue request until come back online
|
679
|
-
@offline_handler.queue_request(kind, packet.type, packet.payload, target, callback)
|
712
|
+
@offline_handler.queue_request(kind, packet.type, packet.payload, target, packet.token, packet.expires_at, &callback)
|
680
713
|
@pending_requests.delete(packet.token) if callback
|
681
714
|
else
|
682
715
|
# Send retry response so that requester, e.g., RetryableRequest, can retry
|
@@ -751,7 +784,7 @@ module RightScale
|
|
751
784
|
if @pending_requests[parent_token]
|
752
785
|
count += 1
|
753
786
|
elapsed += interval
|
754
|
-
if elapsed < @retry_timeout
|
787
|
+
if elapsed < @retry_timeout && (packet.expires_at <= 0 || Time.now.to_i < packet.expires_at)
|
755
788
|
packet.tries << packet.token
|
756
789
|
packet.token = RightSupport::Data::UUID.generate
|
757
790
|
@pending_requests[parent_token].retry_parent_token = parent_token if count == 1
|
data/right_agent.gemspec
CHANGED
@@ -25,8 +25,8 @@ require 'rbconfig'
|
|
25
25
|
|
26
26
|
Gem::Specification.new do |spec|
|
27
27
|
spec.name = 'right_agent'
|
28
|
-
spec.version = '2.
|
29
|
-
spec.date = '2014-
|
28
|
+
spec.version = '2.2.0'
|
29
|
+
spec.date = '2014-05-06'
|
30
30
|
spec.authors = ['Lee Kirchhoff', 'Raphael Simon', 'Tony Spataro', 'Scott Messier']
|
31
31
|
spec.email = 'lee@rightscale.com'
|
32
32
|
spec.homepage = 'https://github.com/rightscale/right_agent'
|
@@ -60,6 +60,14 @@ describe RightScale::AgentTagManager do
|
|
60
60
|
@result.should == [@tag]
|
61
61
|
end
|
62
62
|
|
63
|
+
it "applies timeout when retrieving agent tags" do
|
64
|
+
@retryable_request.should_receive(:new).with("/router/query_tags",
|
65
|
+
{:agent_identity => @identity, :hrefs => [@agent_href]}, {:timeout => 30}).and_return(@request).once
|
66
|
+
@request.should_receive(:callback).and_yield({@agent_href => {"tags" => [@tag]}}).once
|
67
|
+
@manager.tags(:timeout => 30) { |r| @result = r }
|
68
|
+
@result.should == [@tag]
|
69
|
+
end
|
70
|
+
|
63
71
|
it "retrieves current agent tags using agent ID if not in :http mode" do
|
64
72
|
@agent.should_receive(:mode).and_return(:amqp)
|
65
73
|
@retryable_request.should_receive(:new).with("/router/query_tags",
|
@@ -123,6 +131,13 @@ describe RightScale::AgentTagManager do
|
|
123
131
|
@result.should == {@agent_href => {"tags" => @tags}}
|
124
132
|
end
|
125
133
|
|
134
|
+
it "applies timeout when querying for agents with tags" do
|
135
|
+
@retryable_request.should_receive(:new).with("/router/query_tags",
|
136
|
+
{:agent_identity => @identity, :tags => [@tag]}, {:timeout => 30}).and_return(@request).once
|
137
|
+
@request.should_receive(:callback).and_yield({@identity => {"tags" => [@tag]}, @agent_href => {"tags" => [@tag]}}).once
|
138
|
+
@manager.query_tags(@tag, :timeout => 30) { |r| @result = r }
|
139
|
+
end
|
140
|
+
|
126
141
|
it "forwards options" do
|
127
142
|
@retryable_request.should_receive(:new).with("/router/query_tags",
|
128
143
|
{:agent_identity => @identity, :tags => @tags}, {:timeout => 9}).and_return(@request).once
|
@@ -181,6 +196,13 @@ describe RightScale::AgentTagManager do
|
|
181
196
|
@result.should == "raw response"
|
182
197
|
end
|
183
198
|
|
199
|
+
it "applies timeout when querying" do
|
200
|
+
@retryable_request.should_receive(:new).with("/router/query_tags",
|
201
|
+
{:agent_identity => @identity, :hrefs => @hrefs, :tags => @tags}, {:timeout => 30}).and_return(@request).once
|
202
|
+
@request.should_receive(:callback).and_yield({@agent_href => {"tags" => @tags}}).once
|
203
|
+
@manager.query_tags_raw(@tags, @hrefs, :timeout => 30) { |r| @result = r }
|
204
|
+
end
|
205
|
+
|
184
206
|
it "forwards timeout option" do
|
185
207
|
@retryable_request.should_receive(:new).with("/router/query_tags",
|
186
208
|
{:agent_identity => @identity, :tags => @tags}, {:timeout => 9}).and_return(@request).once
|
@@ -199,17 +221,22 @@ describe RightScale::AgentTagManager do
|
|
199
221
|
end
|
200
222
|
|
201
223
|
it "adds individual tag to agent" do
|
202
|
-
@retryable_request.should_receive(:new).with("/router/add_tags", {:tags => [@tag]}).and_return(@request).once
|
224
|
+
@retryable_request.should_receive(:new).with("/router/add_tags", {:tags => [@tag]}, {}).and_return(@request).once
|
203
225
|
@manager.add_tags(@tag).should be_true
|
204
226
|
end
|
205
227
|
|
206
228
|
it "adds multiple tags to agent" do
|
207
|
-
@retryable_request.should_receive(:new).with("/router/add_tags", {:tags => @tags}).and_return(@request).once
|
229
|
+
@retryable_request.should_receive(:new).with("/router/add_tags", {:tags => @tags}, {}).and_return(@request).once
|
208
230
|
@manager.add_tags(@tags).should be_true
|
209
231
|
end
|
210
232
|
|
233
|
+
it "applies timeout when adding tags" do
|
234
|
+
@retryable_request.should_receive(:new).with("/router/add_tags", {:tags => [@tag]}, {:timeout => 30}).and_return(@request).once
|
235
|
+
@manager.add_tags(@tag, :timeout => 30).should be_true
|
236
|
+
end
|
237
|
+
|
211
238
|
it "optionally yields raw response" do
|
212
|
-
@retryable_request.should_receive(:new).with("/router/add_tags", {:tags => @tags}).and_return(@request).once
|
239
|
+
@retryable_request.should_receive(:new).with("/router/add_tags", {:tags => @tags}, {}).and_return(@request).once
|
213
240
|
@request.should_receive(:callback).and_yield("result").once
|
214
241
|
@manager.add_tags(@tags) { |r| @result = r }
|
215
242
|
@result.should == "raw response"
|
@@ -218,7 +245,7 @@ describe RightScale::AgentTagManager do
|
|
218
245
|
it "updates local tags" do
|
219
246
|
@agent.should_receive(:tags).and_return([@tag1]).once
|
220
247
|
@agent.should_receive(:tags=).should_receive([@tag]).once
|
221
|
-
@retryable_request.should_receive(:new).with("/router/add_tags", {:tags => [@tag]}).and_return(@request).once
|
248
|
+
@retryable_request.should_receive(:new).with("/router/add_tags", {:tags => [@tag]}, {}).and_return(@request).once
|
222
249
|
@manager.add_tags(@tag).should be_true
|
223
250
|
end
|
224
251
|
end
|
@@ -232,17 +259,22 @@ describe RightScale::AgentTagManager do
|
|
232
259
|
end
|
233
260
|
|
234
261
|
it "removes individual tag to agent" do
|
235
|
-
@retryable_request.should_receive(:new).with("/router/delete_tags", {:tags => [@tag]}).and_return(@request).once
|
262
|
+
@retryable_request.should_receive(:new).with("/router/delete_tags", {:tags => [@tag]}, {}).and_return(@request).once
|
236
263
|
@manager.remove_tags(@tag).should be_true
|
237
264
|
end
|
238
265
|
|
239
266
|
it "removes multiple tags to agent" do
|
240
|
-
@retryable_request.should_receive(:new).with("/router/delete_tags", {:tags => @tags}).and_return(@request).once
|
267
|
+
@retryable_request.should_receive(:new).with("/router/delete_tags", {:tags => @tags}, {}).and_return(@request).once
|
241
268
|
@manager.remove_tags(@tags).should be_true
|
242
269
|
end
|
243
270
|
|
271
|
+
it "applies timeout when removing tags" do
|
272
|
+
@retryable_request.should_receive(:new).with("/router/delete_tags", {:tags => [@tag]}, {:timeout => 30}).and_return(@request).once
|
273
|
+
@manager.remove_tags(@tag, :timeout => 30).should be_true
|
274
|
+
end
|
275
|
+
|
244
276
|
it "optionally yields raw response" do
|
245
|
-
@retryable_request.should_receive(:new).with("/router/delete_tags", {:tags => @tags}).and_return(@request).once
|
277
|
+
@retryable_request.should_receive(:new).with("/router/delete_tags", {:tags => @tags}, {}).and_return(@request).once
|
246
278
|
@request.should_receive(:callback).and_yield("result").once
|
247
279
|
@manager.remove_tags(@tags) { |r| @result = r }
|
248
280
|
@result.should == "raw response"
|
@@ -251,7 +283,7 @@ describe RightScale::AgentTagManager do
|
|
251
283
|
it "updates local tags" do
|
252
284
|
@agent.should_receive(:tags).and_return([]).once
|
253
285
|
@agent.should_receive(:tags=).should_receive([@tag]).once
|
254
|
-
@retryable_request.should_receive(:new).with("/router/delete_tags", {:tags => [@tag]}).and_return(@request).once
|
286
|
+
@retryable_request.should_receive(:new).with("/router/delete_tags", {:tags => [@tag]}, {}).and_return(@request).once
|
255
287
|
@manager.remove_tags(@tag).should be_true
|
256
288
|
end
|
257
289
|
end
|
@@ -276,19 +308,24 @@ describe RightScale::AgentTagManager do
|
|
276
308
|
end
|
277
309
|
|
278
310
|
it "adds tags for agent" do
|
279
|
-
@retryable_request.should_receive(:new).with("/router/add_tags", {:tags => [@tag]}).and_return(@request).once
|
311
|
+
@retryable_request.should_receive(:new).with("/router/add_tags", {:tags => [@tag]}, {}).and_return(@request).once
|
280
312
|
@agent.should_receive(:tags=).never
|
281
313
|
@manager.send(:do_update, [@tag], []).should be_true
|
282
314
|
end
|
283
315
|
|
284
316
|
it "removes tags for agent" do
|
285
|
-
@retryable_request.should_receive(:new).with("/router/delete_tags", {:tags => [@tag1]}).and_return(@request).once
|
317
|
+
@retryable_request.should_receive(:new).with("/router/delete_tags", {:tags => [@tag1]}, {}).and_return(@request).once
|
286
318
|
@agent.should_receive(:tags=).never
|
287
319
|
@manager.send(:do_update, [], [@tag1]).should be_true
|
288
320
|
end
|
289
321
|
|
322
|
+
it "applies timeout" do
|
323
|
+
@retryable_request.should_receive(:new).with("/router/add_tags", {:tags => [@tag]}, {:timeout => 30}).and_return(@request).once
|
324
|
+
@manager.send(:do_update, [@tag], [], :timeout => 30).should be_true
|
325
|
+
end
|
326
|
+
|
290
327
|
it "yields raw response if block given" do
|
291
|
-
@retryable_request.should_receive(:new).with("/router/add_tags", {:tags => [@tag]}).and_return(@request).once
|
328
|
+
@retryable_request.should_receive(:new).with("/router/add_tags", {:tags => [@tag]}, {}).and_return(@request).once
|
292
329
|
@request.should_receive(:raw_response).and_return("raw response").once
|
293
330
|
@agent.should_receive(:tags=).once
|
294
331
|
@manager.send(:do_update, [@tag], []) { |r| @result = r }
|
@@ -296,7 +333,7 @@ describe RightScale::AgentTagManager do
|
|
296
333
|
end
|
297
334
|
|
298
335
|
it "updates local tags if block given and successful" do
|
299
|
-
@retryable_request.should_receive(:new).with("/router/add_tags", {:tags => [@tag]}).and_return(@request).once
|
336
|
+
@retryable_request.should_receive(:new).with("/router/add_tags", {:tags => [@tag]}, {}).and_return(@request).once
|
300
337
|
@request.should_receive(:raw_response).and_return("raw response").once
|
301
338
|
@agent.should_receive(:tags=).with([@tag]).once
|
302
339
|
@manager.send(:do_update, [@tag], []) { |r| @result = r }
|
@@ -304,7 +341,7 @@ describe RightScale::AgentTagManager do
|
|
304
341
|
end
|
305
342
|
|
306
343
|
it "yields error result and does not update local tags" do
|
307
|
-
@retryable_request.should_receive(:new).with("/router/add_tags", {:tags => [@tag]}).and_return(@request).once
|
344
|
+
@retryable_request.should_receive(:new).with("/router/add_tags", {:tags => [@tag]}, {}).and_return(@request).once
|
308
345
|
@request.should_receive(:raw_response).and_return("error").once
|
309
346
|
@request.should_receive(:errback).and_yield("error").once
|
310
347
|
@request.should_receive(:callback).once
|
@@ -320,9 +357,17 @@ describe RightScale::AgentTagManager do
|
|
320
357
|
@request.should_receive(:raw_response).and_return("raw response").once
|
321
358
|
@agent.should_receive(:tags).and_return(@tags).twice
|
322
359
|
@agent.should_receive(:tags=).with([]).once
|
323
|
-
@retryable_request.should_receive(:new).with("/router/delete_tags", {:tags => @tags}).and_return(@request).once
|
360
|
+
@retryable_request.should_receive(:new).with("/router/delete_tags", {:tags => @tags}, {}).and_return(@request).once
|
324
361
|
@manager.clear { |r| @result = r }
|
325
362
|
@result.should == "raw response"
|
326
363
|
end
|
364
|
+
|
365
|
+
it "applies timeout" do
|
366
|
+
@request.should_receive(:raw_response).and_return("raw response").once
|
367
|
+
@agent.should_receive(:tags).and_return(@tags).twice
|
368
|
+
@agent.should_receive(:tags=).with([]).once
|
369
|
+
@retryable_request.should_receive(:new).with("/router/delete_tags", {:tags => @tags}, {:timeout => 30}).and_return(@request).once
|
370
|
+
@manager.clear(:timeout => 30) { |r| @result = r }
|
371
|
+
end
|
327
372
|
end
|
328
373
|
end
|