mcollective-client 2.6.1 → 2.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/lib/mcollective.rb +2 -1
- data/lib/mcollective/client.rb +32 -6
- data/lib/mcollective/config.rb +4 -0
- data/lib/mcollective/exceptions.rb +2 -1
- data/lib/mcollective/message.rb +15 -2
- data/lib/mcollective/monkey_patches.rb +1 -1
- data/lib/mcollective/optionparser.rb +4 -0
- data/lib/mcollective/pluginpackager.rb +9 -0
- data/lib/mcollective/pluginpackager/agent_definition.rb +3 -3
- data/lib/mcollective/pluginpackager/standard_definition.rb +1 -1
- data/lib/mcollective/rpc/actionrunner.rb +21 -5
- data/lib/mcollective/rpc/client.rb +16 -16
- data/lib/mcollective/vendor/require_vendored.rb +0 -1
- data/spec/unit/client_spec.rb +81 -55
- data/spec/unit/message_spec.rb +30 -0
- data/spec/unit/optionparser_spec.rb +6 -0
- data/spec/unit/pluginpackager/agent_definition_spec.rb +21 -2
- data/spec/unit/pluginpackager/standard_definition_spec.rb +5 -1
- data/spec/unit/plugins/mcollective/connector/activemq_spec.rb +11 -2
- data/spec/unit/plugins/mcollective/connector/rabbitmq_spec.rb +22 -5
- data/spec/unit/plugins/mcollective/data/collective_data_spec.rb +33 -0
- data/spec/unit/plugins/mcollective/packagers/modulepackage_packager_spec.rb +5 -0
- data/spec/unit/rpc/actionrunner_spec.rb +36 -7
- data/spec/unit/rpc/client_spec.rb +165 -31
- data/spec/unit/runner_spec.rb +18 -0
- metadata +228 -234
data/spec/unit/message_spec.rb
CHANGED
@@ -300,6 +300,36 @@ module MCollective
|
|
300
300
|
m.decode!
|
301
301
|
}.to raise_error('callerid in request is not valid, surpressing reply to potentially forged request')
|
302
302
|
end
|
303
|
+
|
304
|
+
it 'should handle the securityprovider failing to decodemsg - log for reply' do
|
305
|
+
security = mock('securityprovider')
|
306
|
+
security.expects(:decodemsg).raises('squirrel attack')
|
307
|
+
|
308
|
+
PluginManager.expects("[]").with("security_plugin").returns(security).once
|
309
|
+
|
310
|
+
m = Message.new("payload", "message", :type => :reply)
|
311
|
+
m.stubs(:headers).returns({'mc_sender' => 'trees'})
|
312
|
+
Log.expects(:warn).with("Failed to decode a message from 'trees': squirrel attack")
|
313
|
+
|
314
|
+
expect {
|
315
|
+
m.decode!
|
316
|
+
}.to_not raise_error
|
317
|
+
end
|
318
|
+
|
319
|
+
it 'should handle the securityprovider failing to decodemsg' do
|
320
|
+
security = mock('securityprovider')
|
321
|
+
security.expects(:decodemsg).raises('squirrel attack')
|
322
|
+
|
323
|
+
PluginManager.expects("[]").with("security_plugin").returns(security).once
|
324
|
+
|
325
|
+
m = Message.new("payload", "message", :type => :request)
|
326
|
+
Log.expects(:warn).never
|
327
|
+
|
328
|
+
expect {
|
329
|
+
m.decode!
|
330
|
+
}.to raise_error(/squirrel attack/)
|
331
|
+
end
|
332
|
+
|
303
333
|
end
|
304
334
|
|
305
335
|
describe "#validate_compound_filter" do
|
@@ -197,6 +197,12 @@ module MCollective
|
|
197
197
|
@parser.instance_variable_get(:@options)[:discovery_options].should == ['nodes.txt']
|
198
198
|
end
|
199
199
|
|
200
|
+
it 'should parse the --nodes option' do
|
201
|
+
ARGV << '--connection-timeout=1'
|
202
|
+
@parser.parse
|
203
|
+
@parser.instance_variable_get(:@options)[:connection_timeout].should == 1
|
204
|
+
end
|
205
|
+
|
200
206
|
it 'should fail on the --nodes option if discovery_method or discovery_options have already been set' do
|
201
207
|
end
|
202
208
|
|
@@ -87,6 +87,7 @@ module MCollective
|
|
87
87
|
describe "#agent" do
|
88
88
|
before do
|
89
89
|
AgentDefinition.any_instance.expects(:client).once
|
90
|
+
PluginPackager.expects(:get_plugin_path).with(".").returns(".")
|
90
91
|
end
|
91
92
|
|
92
93
|
it "should not populate the agent files if the agent directory is empty" do
|
@@ -101,14 +102,27 @@ module MCollective
|
|
101
102
|
PluginPackager.stubs(:check_dir_present).returns(true)
|
102
103
|
File.stubs(:join).with(".", "agent").returns("tmpdir/agent")
|
103
104
|
File.stubs(:join).with("tmpdir/agent", "*.ddl").returns("tmpdir/agent/*.ddl")
|
104
|
-
File.stubs(:join).with("tmpdir/agent", "
|
105
|
+
File.stubs(:join).with("tmpdir/agent", "**", "**").returns("tmpdir/agent/**/**")
|
105
106
|
Dir.stubs(:glob).with("tmpdir/agent/*.ddl").returns([])
|
106
|
-
Dir.stubs(:glob).with("tmpdir/agent
|
107
|
+
Dir.stubs(:glob).with("tmpdir/agent/**/**").returns(["implementation.rb"])
|
107
108
|
|
108
109
|
agent = AgentDefinition.new(configuration, {}, "agent")
|
109
110
|
agent.packagedata[:agent][:files].should == ["implementation.rb"]
|
110
111
|
end
|
111
112
|
|
113
|
+
it "should recursively populate the file list if the agent directory contains subdirectories" do
|
114
|
+
AgentDefinition.any_instance.expects(:common).returns(nil)
|
115
|
+
PluginPackager.stubs(:check_dir_present).returns(true)
|
116
|
+
File.stubs(:join).with(".", "agent").returns("tmpdir/agent")
|
117
|
+
File.stubs(:join).with("tmpdir/agent", "*.ddl").returns("tmpdir/agent/*.ddl")
|
118
|
+
File.stubs(:join).with("tmpdir/agent", "**", "**").returns("tmpdir/agent/**/**")
|
119
|
+
Dir.stubs(:glob).with("tmpdir/agent/*.ddl").returns([])
|
120
|
+
Dir.stubs(:glob).with("tmpdir/agent/**/**").returns(["implementation.rb", "test/test.rb"])
|
121
|
+
|
122
|
+
agent = AgentDefinition.new(configuration, {}, "agent")
|
123
|
+
agent.packagedata[:agent][:files].should == ["implementation.rb", "test/test.rb"]
|
124
|
+
end
|
125
|
+
|
112
126
|
it "should add common package as dependency if present" do
|
113
127
|
AgentDefinition.any_instance.expects(:common).returns({:files=> ["test.rb"]})
|
114
128
|
PluginPackager.expects(:check_dir_present).with("tmpdir/agent").returns(true)
|
@@ -125,6 +139,10 @@ module MCollective
|
|
125
139
|
end
|
126
140
|
|
127
141
|
describe "#common" do
|
142
|
+
before :each do
|
143
|
+
PluginPackager.expects(:get_plugin_path).with(".").returns(".")
|
144
|
+
end
|
145
|
+
|
128
146
|
it "should populate the common files if there are any" do
|
129
147
|
AgentDefinition.any_instance.expects(:agent)
|
130
148
|
AgentDefinition.any_instance.expects(:client)
|
@@ -163,6 +181,7 @@ module MCollective
|
|
163
181
|
AgentDefinition.any_instance.expects(:agent).returns(nil)
|
164
182
|
File.expects(:join).with(".", "application").returns("clientdir")
|
165
183
|
File.expects(:join).with(".", "aggregate").returns("aggregatedir")
|
184
|
+
PluginPackager.expects(:get_plugin_path).with(".").returns(".")
|
166
185
|
end
|
167
186
|
|
168
187
|
it "should populate client files if all directories are present" do
|
@@ -73,6 +73,9 @@ module MCollective
|
|
73
73
|
end
|
74
74
|
|
75
75
|
describe "#plugin" do
|
76
|
+
before :each do
|
77
|
+
PluginPackager.expects(:get_plugin_path).with(".").returns(".")
|
78
|
+
end
|
76
79
|
|
77
80
|
it "should return nil if the plugin doesn't contain any files" do
|
78
81
|
StandardDefinition.any_instance.expects(:common).returns(nil)
|
@@ -102,8 +105,9 @@ module MCollective
|
|
102
105
|
end
|
103
106
|
|
104
107
|
describe "#common" do
|
105
|
-
before do
|
108
|
+
before :each do
|
106
109
|
StandardDefinition.any_instance.expects(:plugin).returns(false)
|
110
|
+
PluginPackager.expects(:get_plugin_path).with(".").returns(".")
|
107
111
|
end
|
108
112
|
|
109
113
|
it "should return nil if common doesn't contain any files" do
|
@@ -110,7 +110,7 @@ module MCollective
|
|
110
110
|
Activemq.any_instance.stubs(:get_bool_option).with("activemq.backup", "false").returns(true)
|
111
111
|
Activemq.any_instance.stubs(:get_option).with("activemq.timeout", -1).returns(1)
|
112
112
|
Activemq.any_instance.stubs(:get_option).with("activemq.connect_timeout", 30).returns(5)
|
113
|
-
Activemq.any_instance.stubs(:get_option).with("activemq.max_hbrlck_fails",
|
113
|
+
Activemq.any_instance.stubs(:get_option).with("activemq.max_hbrlck_fails", 0).returns(0)
|
114
114
|
Activemq.any_instance.stubs(:get_option).with("activemq.max_hbread_fails", 2).returns(2)
|
115
115
|
Activemq.any_instance.stubs(:get_bool_option).with("activemq.base64", 'false').returns(false)
|
116
116
|
Activemq.any_instance.stubs(:get_option).with("activemq.priority", 0).returns(0)
|
@@ -150,8 +150,8 @@ module MCollective
|
|
150
150
|
:use_exponential_back_off => true,
|
151
151
|
:max_reconnect_attempts => 5,
|
152
152
|
:initial_reconnect_delay => 0.01,
|
153
|
+
:max_hbrlck_fails => 0,
|
153
154
|
:max_hbread_fails => 2,
|
154
|
-
:max_hbrlck_fails => 2,
|
155
155
|
:randomize => true,
|
156
156
|
:reliable => true,
|
157
157
|
:logger => "logger",
|
@@ -651,6 +651,15 @@ module MCollective
|
|
651
651
|
headers["timestamp"].should == "1368557431000"
|
652
652
|
headers["expires"].should == "1368557541000"
|
653
653
|
end
|
654
|
+
|
655
|
+
it "should set mc_sender based on the identity" do
|
656
|
+
message = mock
|
657
|
+
message.expects(:type).returns(:foo)
|
658
|
+
message.stubs(:ttl).returns(100)
|
659
|
+
|
660
|
+
headers = connector.headers_for(message)
|
661
|
+
headers['mc_sender'].should == 'rspec'
|
662
|
+
end
|
654
663
|
end
|
655
664
|
|
656
665
|
describe "#make_target" do
|
@@ -111,7 +111,7 @@ module MCollective
|
|
111
111
|
Rabbitmq.any_instance.stubs(:get_bool_option).with("rabbitmq.backup", "false").returns(true)
|
112
112
|
Rabbitmq.any_instance.stubs(:get_option).with("rabbitmq.timeout", -1).returns(1)
|
113
113
|
Rabbitmq.any_instance.stubs(:get_option).with("rabbitmq.connect_timeout", 30).returns(5)
|
114
|
-
Rabbitmq.any_instance.stubs(:get_option).with("rabbitmq.max_hbrlck_fails",
|
114
|
+
Rabbitmq.any_instance.stubs(:get_option).with("rabbitmq.max_hbrlck_fails", 0).returns(0)
|
115
115
|
Rabbitmq.any_instance.stubs(:get_option).with("rabbitmq.max_hbread_fails", 2).returns(2)
|
116
116
|
Rabbitmq.any_instance.stubs(:get_bool_option).with("rabbitmq.base64", 'false').returns(false)
|
117
117
|
Rabbitmq.any_instance.stubs(:get_option).with("rabbitmq.pool.size").returns(2)
|
@@ -150,8 +150,8 @@ module MCollective
|
|
150
150
|
:use_exponential_back_off => true,
|
151
151
|
:max_reconnect_attempts => 5,
|
152
152
|
:initial_reconnect_delay => 0.01,
|
153
|
+
:max_hbrlck_fails => 0,
|
153
154
|
:max_hbread_fails => 2,
|
154
|
-
:max_hbrlck_fails => 2,
|
155
155
|
:randomize => true,
|
156
156
|
:reliable => true,
|
157
157
|
:logger => "logger",
|
@@ -453,8 +453,18 @@ module MCollective
|
|
453
453
|
msg.stubs(:ttl).returns(60)
|
454
454
|
msg.expects(:discovered_hosts).returns(["one", "two"])
|
455
455
|
|
456
|
-
connection.expects(:publish).with('/exchange/mcollective_directed/one',
|
457
|
-
|
456
|
+
connection.expects(:publish).with('/exchange/mcollective_directed/one',
|
457
|
+
'msg',
|
458
|
+
{ 'reply-to' => '/topic/mcollective',
|
459
|
+
'expiration' => '70000',
|
460
|
+
'mc_sender' => 'rspec',
|
461
|
+
})
|
462
|
+
connection.expects(:publish).with('/exchange/mcollective_directed/two',
|
463
|
+
'msg',
|
464
|
+
{ 'reply-to' => '/topic/mcollective',
|
465
|
+
'expiration' => '70000',
|
466
|
+
'mc_sender' => 'rspec',
|
467
|
+
})
|
458
468
|
|
459
469
|
connector.publish(msg)
|
460
470
|
end
|
@@ -551,7 +561,14 @@ module MCollective
|
|
551
561
|
|
552
562
|
message.expects(:request).returns(request)
|
553
563
|
|
554
|
-
connector.target_for(message).should == {
|
564
|
+
connector.target_for(message).should == {
|
565
|
+
:name => "foo",
|
566
|
+
:headers => {
|
567
|
+
"expiration" => "70000",
|
568
|
+
'mc_sender' => 'rspec',
|
569
|
+
},
|
570
|
+
:id => "",
|
571
|
+
}
|
555
572
|
end
|
556
573
|
|
557
574
|
it "should create new request targets" do
|
@@ -0,0 +1,33 @@
|
|
1
|
+
#!/usr/bin/env rspec
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
require File.dirname(__FILE__) + "/../../../../../plugins/mcollective/data/collective_data.rb"
|
6
|
+
|
7
|
+
module MCollective
|
8
|
+
module Data
|
9
|
+
describe Collective_data do
|
10
|
+
describe "#query_data" do
|
11
|
+
before :each do
|
12
|
+
@ddl = mock('DDL')
|
13
|
+
@ddl.stubs(:dataquery_interface).returns({:output => {}})
|
14
|
+
@ddl.stubs(:meta).returns({:timeout => 1})
|
15
|
+
DDL.stubs(:new).returns(@ddl)
|
16
|
+
@plugin = Collective_data.new
|
17
|
+
|
18
|
+
Config.instance.stubs(:collectives).returns([ "collective_a", "collective_b" ])
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'should return true if you are a member of the named collective' do
|
22
|
+
@plugin.query_data("collective_a")
|
23
|
+
@plugin.result[:member].should == true
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'should return false if you are a member of the named collective' do
|
27
|
+
@plugin.query_data("no_such_collective")
|
28
|
+
@plugin.result[:member].should == false
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -125,6 +125,11 @@ module MCollective
|
|
125
125
|
describe '#make_module' do
|
126
126
|
it 'should copy the package content to the tmp build dir' do
|
127
127
|
file = mock()
|
128
|
+
|
129
|
+
['./agent/rspec.rb', './agent/rspec.ddl', './application/rspec.rb'].each do |m|
|
130
|
+
File.stubs(:expand_path).with(m).returns(m)
|
131
|
+
end
|
132
|
+
|
128
133
|
File.stubs(:directory?).with('rspec_tmp/manifests').returns(false, true)
|
129
134
|
File.stubs(:directory?).with('rspec_tmp/files/agent/mcollective/agent').returns(false, true)
|
130
135
|
File.stubs(:directory?).with('rspec_tmp/files/common/mcollective/agent').returns(false, true)
|
@@ -189,25 +189,54 @@ module MCollective
|
|
189
189
|
Config.instance.expects(:libdir).returns(["#{File::SEPARATOR}libdir1", "#{File::SEPARATOR}libdir2"])
|
190
190
|
|
191
191
|
action_in_first_dir = File.join(File::SEPARATOR, "libdir1", "agent", "spectester", "action.sh")
|
192
|
+
action_in_first_dir_new = File.join(File::SEPARATOR, "libdir1", "mcollective", "agent", "spectester", "action.sh")
|
192
193
|
action_in_last_dir = File.join(File::SEPARATOR, "libdir2", "agent", "spectester", "action.sh")
|
194
|
+
action_in_last_dir_new = File.join(File::SEPARATOR, "libdir2", "mcollective", "agent", "spectester", "action.sh")
|
193
195
|
|
194
|
-
File.expects("
|
195
|
-
File.expects("
|
196
|
-
|
196
|
+
File.expects("exists?").with(action_in_first_dir).returns(true)
|
197
|
+
File.expects("exists?").with(action_in_first_dir_new).returns(false)
|
198
|
+
File.expects("exists?").with(action_in_last_dir).never
|
199
|
+
File.expects("exists?").with(action_in_last_dir_new).never
|
197
200
|
ActionRunner.new("action.sh", @req, :json).command.should == action_in_first_dir
|
198
201
|
end
|
199
202
|
|
200
|
-
it "should find the match
|
203
|
+
it "should find the match in the last libdir" do
|
201
204
|
Config.instance.expects(:libdir).returns(["#{File::SEPARATOR}libdir1", "#{File::SEPARATOR}libdir2"])
|
202
205
|
|
203
206
|
action_in_first_dir = File.join(File::SEPARATOR, "libdir1", "agent", "spectester", "action.sh")
|
207
|
+
action_in_first_dir_new = File.join(File::SEPARATOR, "libdir1", "mcollective", "agent", "spectester", "action.sh")
|
204
208
|
action_in_last_dir = File.join(File::SEPARATOR, "libdir2", "agent", "spectester", "action.sh")
|
209
|
+
action_in_last_dir_new = File.join(File::SEPARATOR, "libdir2", "mcollective", "agent", "spectester", "action.sh")
|
205
210
|
|
206
|
-
File.expects("
|
207
|
-
File.expects("
|
208
|
-
|
211
|
+
File.expects("exists?").with(action_in_first_dir).returns(false)
|
212
|
+
File.expects("exists?").with(action_in_first_dir_new).returns(false)
|
213
|
+
File.expects("exists?").with(action_in_last_dir).returns(true)
|
214
|
+
File.expects("exists?").with(action_in_last_dir_new).returns(false)
|
209
215
|
ActionRunner.new("action.sh", @req, :json).command.should == action_in_last_dir
|
210
216
|
end
|
217
|
+
|
218
|
+
it "should find the match in the 'new' directory layout" do
|
219
|
+
Config.instance.expects(:libdir).returns(["#{File::SEPARATOR}libdir1", "#{File::SEPARATOR}libdir2"])
|
220
|
+
|
221
|
+
action_in_new_dir = File.join(File::SEPARATOR, "libdir1", "mcollective", "agent", "spectester", "action.sh")
|
222
|
+
action_in_old_dir = File.join(File::SEPARATOR, "libdir1", "agent", "spectester", "action.sh")
|
223
|
+
|
224
|
+
File.expects("exists?").with(action_in_new_dir).returns(true)
|
225
|
+
File.expects("exists?").with(action_in_old_dir).returns(false)
|
226
|
+
ActionRunner.new("action.sh", @req, :json).command.should == action_in_new_dir
|
227
|
+
end
|
228
|
+
|
229
|
+
it "if the script is both the old and new locations, the new location should be preferred" do
|
230
|
+
Config.instance.expects(:libdir).returns(["#{File::SEPARATOR}libdir1", "#{File::SEPARATOR}libdir2"])
|
231
|
+
|
232
|
+
action_in_new_dir = File.join(File::SEPARATOR, "libdir1", "mcollective", "agent", "spectester", "action.sh")
|
233
|
+
action_in_old_dir = File.join(File::SEPARATOR, "libdir1", "agent", "spectester", "action.sh")
|
234
|
+
|
235
|
+
File.expects("exists?").with(action_in_new_dir).returns(true)
|
236
|
+
File.expects("exists?").with(action_in_old_dir).returns(true)
|
237
|
+
|
238
|
+
ActionRunner.new("action.sh", @req, :json).command.should == action_in_new_dir
|
239
|
+
end
|
211
240
|
end
|
212
241
|
end
|
213
242
|
end
|
@@ -923,7 +923,11 @@ module MCollective
|
|
923
923
|
|
924
924
|
rpcclient = Client.new("foo", {:options => {:filter => {"identity" => ["/foo/"], "agent" => []}, :config => "/nonexisting"}})
|
925
925
|
|
926
|
-
rpcclient.client.expects(:discover).with({
|
926
|
+
rpcclient.client.expects(:discover).with({
|
927
|
+
'identity' => ['/foo/'],
|
928
|
+
'agent' => ['foo'],
|
929
|
+
'collective' => 'mcollective',
|
930
|
+
}, 2).once.returns(["foo"])
|
927
931
|
|
928
932
|
rpcclient.discover
|
929
933
|
rpcclient.instance_variable_get("@force_direct_request").should == false
|
@@ -934,9 +938,25 @@ module MCollective
|
|
934
938
|
@stderr.expects(:print).with("Discovering hosts using the mc method for 2 second(s) .... ")
|
935
939
|
@stderr.expects(:puts).with(1)
|
936
940
|
|
937
|
-
rpcclient = Client.new("foo", {
|
938
|
-
|
939
|
-
|
941
|
+
rpcclient = Client.new("foo", {
|
942
|
+
:options => {
|
943
|
+
:filter => Util.empty_filter,
|
944
|
+
:config => "/nonexisting",
|
945
|
+
:verbose => true,
|
946
|
+
:disctimeout => 2,
|
947
|
+
:stderr => @stderr,
|
948
|
+
:stdout => @stdout,
|
949
|
+
},
|
950
|
+
})
|
951
|
+
|
952
|
+
rpcclient.client.expects(:discover).with({
|
953
|
+
'identity' => [],
|
954
|
+
'compound' => [],
|
955
|
+
'fact' => [],
|
956
|
+
'agent' => ['foo'],
|
957
|
+
'cf_class' => [],
|
958
|
+
'collective' => 'mcollective',
|
959
|
+
}, 2).returns(["foo"])
|
940
960
|
|
941
961
|
rpcclient.discover
|
942
962
|
end
|
@@ -945,8 +965,24 @@ module MCollective
|
|
945
965
|
@stderr.expects(:print).never
|
946
966
|
@stderr.expects(:puts).never
|
947
967
|
|
948
|
-
rpcclient = Client.new("foo", {
|
949
|
-
|
968
|
+
rpcclient = Client.new("foo", {
|
969
|
+
:options => {
|
970
|
+
:filter => Util.empty_filter,
|
971
|
+
:config => "/nonexisting",
|
972
|
+
:verbose => false,
|
973
|
+
:disctimeout => 2,
|
974
|
+
:stderr => @stderr,
|
975
|
+
:stdout => @stdout,
|
976
|
+
},
|
977
|
+
})
|
978
|
+
rpcclient.client.expects(:discover).with({
|
979
|
+
'identity' => [],
|
980
|
+
'compound' => [],
|
981
|
+
'fact' => [],
|
982
|
+
'agent' => ['foo'],
|
983
|
+
'cf_class' => [],
|
984
|
+
'collective' => 'mcollective',
|
985
|
+
}, 2).returns(["foo"])
|
950
986
|
|
951
987
|
rpcclient.discover
|
952
988
|
end
|
@@ -955,16 +991,44 @@ module MCollective
|
|
955
991
|
Stats.any_instance.expects(:time_discovery).with(:start)
|
956
992
|
Stats.any_instance.expects(:time_discovery).with(:end)
|
957
993
|
|
958
|
-
rpcclient = Client.new("foo", {
|
959
|
-
|
994
|
+
rpcclient = Client.new("foo", {
|
995
|
+
:options => {
|
996
|
+
:filter => Util.empty_filter,
|
997
|
+
:config => "/nonexisting",
|
998
|
+
:verbose => false,
|
999
|
+
:disctimeout => 2,
|
1000
|
+
},
|
1001
|
+
})
|
1002
|
+
rpcclient.client.expects(:discover).with({
|
1003
|
+
'identity' => [],
|
1004
|
+
'compound' => [],
|
1005
|
+
'fact' => [],
|
1006
|
+
'agent' => ['foo'],
|
1007
|
+
'cf_class' => [],
|
1008
|
+
'collective' => 'mcollective',
|
1009
|
+
}, 2).returns(["foo"])
|
960
1010
|
|
961
1011
|
rpcclient.discover
|
962
1012
|
end
|
963
1013
|
|
964
1014
|
it "should discover using limits in :first rpclimit mode given a number" do
|
965
1015
|
Config.instance.stubs(:rpclimitmethod).returns(:first)
|
966
|
-
rpcclient = Client.new("foo", {
|
967
|
-
|
1016
|
+
rpcclient = Client.new("foo", {
|
1017
|
+
:options => {
|
1018
|
+
:filter => Util.empty_filter,
|
1019
|
+
:config => "/nonexisting",
|
1020
|
+
:verbose => false,
|
1021
|
+
:disctimeout => 2,
|
1022
|
+
},
|
1023
|
+
})
|
1024
|
+
rpcclient.client.expects(:discover).with({
|
1025
|
+
'identity' => [],
|
1026
|
+
'compound' => [],
|
1027
|
+
'fact' => [],
|
1028
|
+
'agent' => ['foo'],
|
1029
|
+
'cf_class' => [],
|
1030
|
+
'collective' => 'mcollective',
|
1031
|
+
}, 2, 1).returns(["foo"])
|
968
1032
|
|
969
1033
|
rpcclient.limit_targets = 1
|
970
1034
|
|
@@ -973,8 +1037,22 @@ module MCollective
|
|
973
1037
|
|
974
1038
|
it "should not discover using limits in :first rpclimit mode given a string" do
|
975
1039
|
Config.instance.stubs(:rpclimitmethod).returns(:first)
|
976
|
-
rpcclient = Client.new("foo", {
|
977
|
-
|
1040
|
+
rpcclient = Client.new("foo", {
|
1041
|
+
:options => {
|
1042
|
+
:filter => Util.empty_filter,
|
1043
|
+
:config => "/nonexisting",
|
1044
|
+
:verbose => false,
|
1045
|
+
:disctimeout => 2,
|
1046
|
+
},
|
1047
|
+
})
|
1048
|
+
rpcclient.client.expects(:discover).with({
|
1049
|
+
'identity' => [],
|
1050
|
+
'compound' => [],
|
1051
|
+
'fact' => [],
|
1052
|
+
'agent' => ['foo'],
|
1053
|
+
'cf_class' => [],
|
1054
|
+
'collective' => 'mcollective',
|
1055
|
+
}, 2).returns(["foo"])
|
978
1056
|
rpcclient.limit_targets = "10%"
|
979
1057
|
|
980
1058
|
rpcclient.discover
|
@@ -983,16 +1061,44 @@ module MCollective
|
|
983
1061
|
it "should not discover using limits when not in :first mode" do
|
984
1062
|
Config.instance.stubs(:rpclimitmethod).returns(:random)
|
985
1063
|
|
986
|
-
rpcclient = Client.new("foo", {
|
987
|
-
|
1064
|
+
rpcclient = Client.new("foo", {
|
1065
|
+
:options => {
|
1066
|
+
:filter => Util.empty_filter,
|
1067
|
+
:config => "/nonexisting",
|
1068
|
+
:verbose => false,
|
1069
|
+
:disctimeout => 2,
|
1070
|
+
},
|
1071
|
+
})
|
1072
|
+
rpcclient.client.expects(:discover).with({
|
1073
|
+
'identity' => [],
|
1074
|
+
'compound' => [],
|
1075
|
+
'fact' => [],
|
1076
|
+
'agent' => ['foo'],
|
1077
|
+
'cf_class' => [],
|
1078
|
+
'collective' => 'mcollective',
|
1079
|
+
}, 2).returns(["foo"])
|
988
1080
|
|
989
1081
|
rpcclient.limit_targets = 1
|
990
1082
|
rpcclient.discover
|
991
1083
|
end
|
992
1084
|
|
993
1085
|
it "should ensure force_direct mode is false when doing traditional discovery" do
|
994
|
-
rpcclient = Client.new("foo", {
|
995
|
-
|
1086
|
+
rpcclient = Client.new("foo", {
|
1087
|
+
:options => {
|
1088
|
+
:filter => Util.empty_filter,
|
1089
|
+
:config => "/nonexisting",
|
1090
|
+
:verbose => false,
|
1091
|
+
:disctimeout => 2,
|
1092
|
+
},
|
1093
|
+
})
|
1094
|
+
rpcclient.client.expects(:discover).with({
|
1095
|
+
'identity' => [],
|
1096
|
+
'compound' => [],
|
1097
|
+
'fact' => [],
|
1098
|
+
'agent' => ['foo'],
|
1099
|
+
'cf_class' => [],
|
1100
|
+
'collective' => 'mcollective',
|
1101
|
+
}, 2).returns(["foo"])
|
996
1102
|
|
997
1103
|
rpcclient.instance_variable_set("@force_direct_request", true)
|
998
1104
|
rpcclient.discover
|
@@ -1000,16 +1106,44 @@ module MCollective
|
|
1000
1106
|
end
|
1001
1107
|
|
1002
1108
|
it "should store discovered nodes in stats" do
|
1003
|
-
rpcclient = Client.new("foo", {
|
1004
|
-
|
1109
|
+
rpcclient = Client.new("foo", {
|
1110
|
+
:options => {
|
1111
|
+
:filter => Util.empty_filter,
|
1112
|
+
:config => "/nonexisting",
|
1113
|
+
:verbose => false,
|
1114
|
+
:disctimeout => 2,
|
1115
|
+
},
|
1116
|
+
})
|
1117
|
+
rpcclient.client.expects(:discover).with({
|
1118
|
+
'identity' => [],
|
1119
|
+
'compound' => [],
|
1120
|
+
'fact' => [],
|
1121
|
+
'agent' => ['foo'],
|
1122
|
+
'cf_class' => [],
|
1123
|
+
'collective' => 'mcollective',
|
1124
|
+
}, 2).returns(["foo"])
|
1005
1125
|
|
1006
1126
|
rpcclient.discover
|
1007
1127
|
rpcclient.stats.discovered_nodes.should == ["foo"]
|
1008
1128
|
end
|
1009
1129
|
|
1010
1130
|
it "should save discovered nodes in RPC" do
|
1011
|
-
rpcclient = Client.new("foo", {
|
1012
|
-
|
1131
|
+
rpcclient = Client.new("foo", {
|
1132
|
+
:options => {
|
1133
|
+
:filter => Util.empty_filter,
|
1134
|
+
:config => "/nonexisting",
|
1135
|
+
:verbose => false,
|
1136
|
+
:disctimeout => 2,
|
1137
|
+
},
|
1138
|
+
})
|
1139
|
+
rpcclient.client.expects(:discover).with({
|
1140
|
+
'identity' => [],
|
1141
|
+
'compound' => [],
|
1142
|
+
'fact' => [],
|
1143
|
+
'agent' => ['foo'],
|
1144
|
+
'cf_class' => [],
|
1145
|
+
'collective' => 'mcollective',
|
1146
|
+
}, 2).returns(["foo"])
|
1013
1147
|
|
1014
1148
|
RPC.expects(:discovered).with(["foo"]).once
|
1015
1149
|
rpcclient.discover
|
@@ -1018,31 +1152,31 @@ module MCollective
|
|
1018
1152
|
|
1019
1153
|
describe "#determine_batch_mode" do
|
1020
1154
|
let(:rpcclient) do
|
1021
|
-
rpcclient = Client.new("foo",
|
1022
|
-
{:options => {:filter => Util.empty_filter,
|
1023
|
-
:config => "/nonexisting",
|
1024
|
-
:verbose => false,
|
1155
|
+
rpcclient = Client.new("foo",
|
1156
|
+
{:options => {:filter => Util.empty_filter,
|
1157
|
+
:config => "/nonexisting",
|
1158
|
+
:verbose => false,
|
1025
1159
|
:disctimeout => 2}})
|
1026
1160
|
end
|
1027
1161
|
|
1028
1162
|
it "should return true when batch_mode should be set" do
|
1029
1163
|
rpcclient.send(:determine_batch_mode, "1").should == true
|
1030
|
-
rpcclient.send(:determine_batch_mode, 1).should == true
|
1031
|
-
rpcclient.send(:determine_batch_mode, "1%").should == true
|
1164
|
+
rpcclient.send(:determine_batch_mode, 1).should == true
|
1165
|
+
rpcclient.send(:determine_batch_mode, "1%").should == true
|
1032
1166
|
end
|
1033
1167
|
|
1034
1168
|
it "should return false when batch_mode shouldn't be set" do
|
1035
1169
|
rpcclient.send(:determine_batch_mode, "0").should == false
|
1036
|
-
rpcclient.send(:determine_batch_mode, 0).should == false
|
1170
|
+
rpcclient.send(:determine_batch_mode, 0).should == false
|
1037
1171
|
end
|
1038
1172
|
end
|
1039
1173
|
|
1040
1174
|
describe "#validate_batch_size" do
|
1041
1175
|
let(:rpcclient) do
|
1042
|
-
rpcclient = Client.new("foo",
|
1043
|
-
{:options => {:filter => Util.empty_filter,
|
1044
|
-
:config => "/nonexisting",
|
1045
|
-
:verbose => false,
|
1176
|
+
rpcclient = Client.new("foo",
|
1177
|
+
{:options => {:filter => Util.empty_filter,
|
1178
|
+
:config => "/nonexisting",
|
1179
|
+
:verbose => false,
|
1046
1180
|
:disctimeout => 2}})
|
1047
1181
|
end
|
1048
1182
|
|