mcollective-client 2.2.4 → 2.4.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.

Potentially problematic release.


This version of mcollective-client might be problematic. Click here for more details.

Files changed (66) hide show
  1. checksums.yaml +7 -0
  2. data/lib/mcollective/application.rb +25 -34
  3. data/lib/mcollective/client.rb +91 -33
  4. data/lib/mcollective/config.rb +42 -43
  5. data/lib/mcollective/data/base.rb +1 -1
  6. data/lib/mcollective/data/result.rb +6 -2
  7. data/lib/mcollective/ddl/agentddl.rb +28 -1
  8. data/lib/mcollective/ddl/base.rb +8 -6
  9. data/lib/mcollective/log.rb +11 -3
  10. data/lib/mcollective/logger/file_logger.rb +4 -4
  11. data/lib/mcollective/matcher.rb +9 -1
  12. data/lib/mcollective/message.rb +14 -23
  13. data/lib/mcollective/optionparser.rb +9 -1
  14. data/lib/mcollective/pluginpackager.rb +24 -3
  15. data/lib/mcollective/pluginpackager/agent_definition.rb +12 -12
  16. data/lib/mcollective/pluginpackager/standard_definition.rb +12 -12
  17. data/lib/mcollective/rpc/agent.rb +15 -12
  18. data/lib/mcollective/rpc/client.rb +67 -31
  19. data/lib/mcollective/rpc/helpers.rb +7 -1
  20. data/lib/mcollective/rpc/reply.rb +3 -1
  21. data/lib/mcollective/shell.rb +45 -8
  22. data/lib/mcollective/util.rb +37 -1
  23. data/lib/mcollective/windows_daemon.rb +14 -3
  24. data/spec/spec_helper.rb +2 -0
  25. data/spec/unit/application_spec.rb +45 -26
  26. data/spec/unit/cache_spec.rb +3 -3
  27. data/spec/unit/client_spec.rb +269 -24
  28. data/spec/unit/config_spec.rb +89 -26
  29. data/spec/unit/data/base_spec.rb +1 -0
  30. data/spec/unit/data/result_spec.rb +19 -1
  31. data/spec/unit/data_spec.rb +3 -0
  32. data/spec/unit/ddl/agentddl_spec.rb +32 -0
  33. data/spec/unit/ddl/base_spec.rb +4 -0
  34. data/spec/unit/ddl/dataddl_spec.rb +1 -1
  35. data/spec/unit/log_spec.rb +44 -27
  36. data/spec/unit/logger/base_spec.rb +1 -1
  37. data/spec/unit/matcher_spec.rb +14 -0
  38. data/spec/unit/message_spec.rb +24 -0
  39. data/spec/unit/optionparser_spec.rb +99 -0
  40. data/spec/unit/pluginpackager/agent_definition_spec.rb +48 -17
  41. data/spec/unit/pluginpackager/standard_definition_spec.rb +44 -20
  42. data/spec/unit/pluginpackager_spec.rb +31 -7
  43. data/spec/unit/plugins/mcollective/agent/rpcutil_spec.rb +176 -0
  44. data/spec/unit/plugins/mcollective/application/plugin_spec.rb +81 -0
  45. data/spec/unit/plugins/mcollective/audit/logfile_spec.rb +44 -0
  46. data/spec/unit/plugins/mcollective/connector/activemq_spec.rb +118 -27
  47. data/spec/unit/plugins/mcollective/connector/rabbitmq_spec.rb +168 -34
  48. data/spec/unit/plugins/mcollective/data/agent_data_spec.rb +1 -0
  49. data/spec/unit/plugins/mcollective/data/fstat_data_spec.rb +1 -0
  50. data/spec/unit/plugins/mcollective/discovery/flatfile_spec.rb +10 -0
  51. data/spec/unit/plugins/mcollective/discovery/stdin_spec.rb +65 -0
  52. data/spec/unit/plugins/mcollective/facts/yaml_facts_spec.rb +65 -0
  53. data/spec/unit/plugins/mcollective/packagers/debpackage_packager_spec.rb +240 -219
  54. data/spec/unit/plugins/mcollective/packagers/modulepackage_packager_spec.rb +209 -0
  55. data/spec/unit/plugins/mcollective/packagers/rpmpackage_packager_spec.rb +223 -109
  56. data/spec/unit/rpc/actionrunner_spec.rb +2 -1
  57. data/spec/unit/rpc/agent_spec.rb +130 -1
  58. data/spec/unit/rpc/client_spec.rb +169 -3
  59. data/spec/unit/security/base_spec.rb +0 -1
  60. data/spec/unit/shell_spec.rb +76 -3
  61. data/spec/unit/util_spec.rb +69 -1
  62. data/spec/unit/windows_daemon_spec.rb +30 -9
  63. metadata +104 -90
  64. data/spec/unit/plugins/mcollective/connector/stomp/eventlogger_spec.rb +0 -34
  65. data/spec/unit/plugins/mcollective/connector/stomp_spec.rb +0 -424
  66. data/spec/unit/plugins/mcollective/validator/any_validator_spec.rb +0 -15
@@ -395,7 +395,6 @@ module MCollective
395
395
  end
396
396
 
397
397
  it "should return the correct dimensions if ENV columns and lines are set" do
398
-
399
398
  stdout = mock()
400
399
  stdout.expects(:tty?).returns(true)
401
400
  Util.expects(:windows?).returns(false)
@@ -452,6 +451,36 @@ module MCollective
452
451
  end
453
452
  end
454
453
 
454
+ describe "#absolute_path?" do
455
+ it "should work correctly validate the path" do
456
+ Util.absolute_path?('.', '/', '\\').should == false
457
+ Util.absolute_path?('foo/foo', '/', '\\').should == false
458
+ Util.absolute_path?('foo\\bar', '/', '\\').should == false
459
+ Util.absolute_path?('../foo/bar', '/', '\\').should == false
460
+
461
+ Util.absolute_path?('\\foo/foo', '/', '\\').should == true
462
+ Util.absolute_path?('\\', '/', '\\').should == true
463
+ Util.absolute_path?('/foo', '/', '\\').should == true
464
+ Util.absolute_path?('/foo/foo', '/', '\\').should == true
465
+
466
+ Util.absolute_path?('.', '/', nil).should == false
467
+ Util.absolute_path?('foo/foo', '/', nil).should == false
468
+ Util.absolute_path?('foo\\bar', '/', nil).should == false
469
+ Util.absolute_path?('../foo/bar', '/', nil).should == false
470
+
471
+ Util.absolute_path?('\\foo/foo', '/', nil).should == false
472
+ Util.absolute_path?('\\', '/', nil).should == false
473
+ Util.absolute_path?('/foo', '/', nil).should == true
474
+ Util.absolute_path?('/foo/foo', '/', nil).should == true
475
+ end
476
+
477
+ it "should correctly validate paths on Windows" do
478
+ ['C:\foo', '\foo\bar', '\C\FOO\Bar', '/C/FOO/Bar'].each do |path|
479
+ Util.absolute_path?(path, '/', '\\').should be_true
480
+ end
481
+ end
482
+ end
483
+
455
484
  describe "#versioncmp" do
456
485
  it "should be able to sort a long set of various unordered versions" do
457
486
  ary = %w{ 1.1.6 2.3 1.1a 3.0 1.5 1 2.4 1.1-4 2.3.1 1.2 2.3.0 1.1-3 2.4b 2.4 2.40.2 2.3a.1 3.1 0002 1.1-5 1.1.a 1.06 1.2.10 1.2.8}
@@ -461,5 +490,44 @@ module MCollective
461
490
  newary.should == ["0002", "1", "1.06", "1.1-3", "1.1-4", "1.1-5", "1.1.6", "1.1.a", "1.1a", "1.2", "1.2.8", "1.2.10", "1.5", "2.3", "2.3.0", "2.3.1", "2.3a.1", "2.4", "2.4", "2.4b", "2.40.2", "3.0", "3.1"]
462
491
  end
463
492
  end
493
+
494
+ describe "str_to_bool" do
495
+ it "should transform true like strings into TrueClass" do
496
+ ["1", "y", "yes", "Y", "YES", "t", "true", "T", "TRUE", true].each do |val|
497
+ Util.str_to_bool(val).should be_true
498
+ end
499
+ end
500
+
501
+ it "should transform false like strings into FalseClass" do
502
+ ["0", "n", "no", "N", "NO", "f", "false", "F", "FALSE", false].each do |val|
503
+ Util.str_to_bool(val).should be_false
504
+ end
505
+ end
506
+
507
+ it "should raise an exception if the string does not match the boolean pattern" do
508
+ ["yep", "nope", "yess", "noway", "rspec", "YES!", "NO?"].each do |val|
509
+ expect { Util.str_to_bool(val) }.to raise_error("Cannot convert string value '#{val}' into a boolean.")
510
+ end
511
+ end
512
+ end
513
+
514
+ describe "#templatepath" do
515
+ before do
516
+ config = mock
517
+ config.stubs(:configfile).returns("/rspec/server.cfg")
518
+ Config.stubs(:instance).returns(config)
519
+ end
520
+ it "should look for a template in the config dir" do
521
+ File.stubs(:exists?).with("/rspec/test-help.erb").returns(true)
522
+ Util.templatepath("test-help.erb").should == "/rspec/test-help.erb"
523
+ end
524
+
525
+ it "should look for a template in the default dir" do
526
+ File.stubs(:exists?).with("/rspec/test-help.erb").returns(false)
527
+ File.stubs(:exists?).with("/etc/mcollective/test-help.erb").returns(true)
528
+ Util.templatepath("test-help.erb").should == "/etc/mcollective/test-help.erb"
529
+
530
+ end
531
+ end
464
532
  end
465
533
  end
@@ -18,23 +18,44 @@ module MCollective
18
18
  end
19
19
 
20
20
  it "should start the mainloop" do
21
+ Util.stubs(:windows?).returns(true)
21
22
  WindowsDaemon.expects(:mainloop)
22
23
  WindowsDaemon.daemonize_runner
23
24
  end
24
25
  end
25
26
 
26
- describe "#service_stop" do
27
- it "should disconnect and exit" do
28
- Log.expects(:info)
29
-
30
- connector = mock
31
- connector.expects(:disconnect).once
32
-
33
- PluginManager.expects("[]").with("connector_plugin").returns(connector)
27
+ describe "#service_main" do
28
+ it "should start the runner" do
29
+ runner = mock
30
+ Runner.stubs(:new).returns(runner)
31
+ d = WindowsDaemon.new
32
+ d.stubs(:running?).returns(true,false)
33
+ d.stubs(:state).returns(WindowsDaemon::RUNNING)
34
+ runner.expects(:run)
35
+ d.service_main
36
+ end
34
37
 
38
+ it "should kill any other living threads on exit" do
35
39
  d = WindowsDaemon.new
36
- d.expects("exit!").once
40
+ d.stubs(:running?).returns(false)
41
+ other = mock
42
+ Thread.stubs(:list).returns([Thread.current, other])
43
+ Thread.current.expects(:kill).never
44
+ other.expects(:kill)
45
+ d.service_main
46
+ end
47
+ end
37
48
 
49
+ describe "#service_stop" do
50
+ it "should log, disconnect, stop the runner and exit" do
51
+ runner = mock
52
+ connector = mock
53
+ connector.expects(:disconnect)
54
+ Log.expects(:info)
55
+ PluginManager.stubs(:[]).with("connector_plugin").returns(connector)
56
+ d = WindowsDaemon.new
57
+ d.instance_variable_set(:@runner, runner)
58
+ runner.expects(:stop)
38
59
  d.service_stop
39
60
  end
40
61
  end
metadata CHANGED
@@ -1,75 +1,78 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: mcollective-client
3
- version: !ruby/object:Gem::Version
4
- hash: 15
5
- prerelease:
6
- segments:
7
- - 2
8
- - 2
9
- - 4
10
- version: 2.2.4
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.4.0
11
5
  platform: ruby
12
- authors:
13
- - R.I.Pienaar
6
+ authors:
7
+ - Puppet Labs
14
8
  autorequire:
15
9
  bindir: bin
16
10
  cert_chain: []
17
-
18
- date: 2013-05-20 00:00:00 Z
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
11
+ date: 2014-01-23 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
21
14
  name: systemu
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
24
- none: false
25
- requirements:
26
- - - ">="
27
- - !ruby/object:Gem::Version
28
- hash: 3
29
- segments:
30
- - 0
31
- version: "0"
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
32
20
  type: :runtime
33
- version_requirements: *id001
34
- - !ruby/object:Gem::Dependency
35
- name: json
36
21
  prerelease: false
37
- requirement: &id002 !ruby/object:Gem::Requirement
38
- none: false
39
- requirements:
40
- - - ">="
41
- - !ruby/object:Gem::Version
42
- hash: 3
43
- segments:
44
- - 0
45
- version: "0"
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: json
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
46
34
  type: :runtime
47
- version_requirements: *id002
48
- - !ruby/object:Gem::Dependency
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
49
42
  name: stomp
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
50
49
  prerelease: false
51
- requirement: &id003 !ruby/object:Gem::Requirement
52
- none: false
53
- requirements:
54
- - - ">="
55
- - !ruby/object:Gem::Version
56
- hash: 3
57
- segments:
58
- - 0
59
- version: "0"
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: i18n
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
60
62
  type: :runtime
61
- version_requirements: *id003
62
- description: Client libraries for the mcollective Application Server
63
- email: rip@puppetlabs.com
64
- executables:
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: Client libraries for the Mcollective Application Server
70
+ email: info@puppetlabs.com
71
+ executables:
65
72
  - mco
66
73
  extensions: []
67
-
68
74
  extra_rdoc_files: []
69
-
70
- files:
71
- - bin/mc-call-agent
72
- - bin/mco
75
+ files:
73
76
  - lib/mcollective.rb
74
77
  - lib/mcollective/agent.rb
75
78
  - lib/mcollective/agents.rb
@@ -146,6 +149,8 @@ files:
146
149
  - lib/mcollective/vendor.rb
147
150
  - lib/mcollective/vendor/require_vendored.rb
148
151
  - lib/mcollective/windows_daemon.rb
152
+ - bin/mc-call-agent
153
+ - bin/mco
149
154
  - spec/Rakefile
150
155
  - spec/fixtures/application/test.rb
151
156
  - spec/fixtures/test-cert.pem
@@ -203,22 +208,25 @@ files:
203
208
  - spec/unit/pluginpackager/agent_definition_spec.rb
204
209
  - spec/unit/pluginpackager/standard_definition_spec.rb
205
210
  - spec/unit/pluginpackager_spec.rb
211
+ - spec/unit/plugins/mcollective/agent/rpcutil_spec.rb
206
212
  - spec/unit/plugins/mcollective/aggregate/average_spec.rb
207
213
  - spec/unit/plugins/mcollective/aggregate/sum_spec.rb
208
214
  - spec/unit/plugins/mcollective/aggregate/summary_spec.rb
215
+ - spec/unit/plugins/mcollective/application/plugin_spec.rb
216
+ - spec/unit/plugins/mcollective/audit/logfile_spec.rb
209
217
  - spec/unit/plugins/mcollective/connector/activemq_spec.rb
210
218
  - spec/unit/plugins/mcollective/connector/rabbitmq_spec.rb
211
- - spec/unit/plugins/mcollective/connector/stomp/eventlogger_spec.rb
212
- - spec/unit/plugins/mcollective/connector/stomp_spec.rb
213
219
  - spec/unit/plugins/mcollective/data/agent_data_spec.rb
214
220
  - spec/unit/plugins/mcollective/data/fstat_data_spec.rb
215
221
  - spec/unit/plugins/mcollective/discovery/flatfile_spec.rb
216
222
  - spec/unit/plugins/mcollective/discovery/mc_spec.rb
223
+ - spec/unit/plugins/mcollective/discovery/stdin_spec.rb
224
+ - spec/unit/plugins/mcollective/facts/yaml_facts_spec.rb
217
225
  - spec/unit/plugins/mcollective/packagers/debpackage_packager_spec.rb
226
+ - spec/unit/plugins/mcollective/packagers/modulepackage_packager_spec.rb
218
227
  - spec/unit/plugins/mcollective/packagers/ospackage_spec.rb
219
228
  - spec/unit/plugins/mcollective/packagers/rpmpackage_packager_spec.rb
220
229
  - spec/unit/plugins/mcollective/security/psk_spec.rb
221
- - spec/unit/plugins/mcollective/validator/any_validator_spec.rb
222
230
  - spec/unit/plugins/mcollective/validator/array_validator_spec.rb
223
231
  - spec/unit/plugins/mcollective/validator/ipv4address_validator_spec.rb
224
232
  - spec/unit/plugins/mcollective/validator/ipv6address_validator_spec.rb
@@ -250,38 +258,41 @@ files:
250
258
  - spec/windows_spec.opts
251
259
  homepage: https://docs.puppetlabs.com/mcollective/
252
260
  licenses: []
253
-
261
+ metadata: {}
254
262
  post_install_message:
255
- rdoc_options: []
256
-
257
- require_paths:
263
+ rdoc_options:
264
+ - --line-numbers
265
+ - --main
266
+ - Mcollective
267
+ - --exclude
268
+ - mcollective/vendor
269
+ - --exclude
270
+ - spec
271
+ - --exclude
272
+ - ext
273
+ - --exclude
274
+ - website
275
+ - --exclude
276
+ - plugins
277
+ require_paths:
258
278
  - lib
259
- required_ruby_version: !ruby/object:Gem::Requirement
260
- none: false
261
- requirements:
262
- - - ">="
263
- - !ruby/object:Gem::Version
264
- hash: 3
265
- segments:
266
- - 0
267
- version: "0"
268
- required_rubygems_version: !ruby/object:Gem::Requirement
269
- none: false
270
- requirements:
271
- - - ">="
272
- - !ruby/object:Gem::Version
273
- hash: 3
274
- segments:
275
- - 0
276
- version: "0"
279
+ required_ruby_version: !ruby/object:Gem::Requirement
280
+ requirements:
281
+ - - '>='
282
+ - !ruby/object:Gem::Version
283
+ version: '0'
284
+ required_rubygems_version: !ruby/object:Gem::Requirement
285
+ requirements:
286
+ - - '>='
287
+ - !ruby/object:Gem::Version
288
+ version: '0'
277
289
  requirements: []
278
-
279
290
  rubyforge_project:
280
- rubygems_version: 1.8.11
291
+ rubygems_version: 2.0.3
281
292
  signing_key:
282
- specification_version: 3
283
- summary: Client libraries for The Marionette Collective
284
- test_files:
293
+ specification_version: 4
294
+ summary: Client libraries for the Mcollective Application Server
295
+ test_files:
285
296
  - spec/Rakefile
286
297
  - spec/fixtures/application/test.rb
287
298
  - spec/fixtures/test-cert.pem
@@ -339,22 +350,25 @@ test_files:
339
350
  - spec/unit/pluginpackager/agent_definition_spec.rb
340
351
  - spec/unit/pluginpackager/standard_definition_spec.rb
341
352
  - spec/unit/pluginpackager_spec.rb
353
+ - spec/unit/plugins/mcollective/agent/rpcutil_spec.rb
342
354
  - spec/unit/plugins/mcollective/aggregate/average_spec.rb
343
355
  - spec/unit/plugins/mcollective/aggregate/sum_spec.rb
344
356
  - spec/unit/plugins/mcollective/aggregate/summary_spec.rb
357
+ - spec/unit/plugins/mcollective/application/plugin_spec.rb
358
+ - spec/unit/plugins/mcollective/audit/logfile_spec.rb
345
359
  - spec/unit/plugins/mcollective/connector/activemq_spec.rb
346
360
  - spec/unit/plugins/mcollective/connector/rabbitmq_spec.rb
347
- - spec/unit/plugins/mcollective/connector/stomp/eventlogger_spec.rb
348
- - spec/unit/plugins/mcollective/connector/stomp_spec.rb
349
361
  - spec/unit/plugins/mcollective/data/agent_data_spec.rb
350
362
  - spec/unit/plugins/mcollective/data/fstat_data_spec.rb
351
363
  - spec/unit/plugins/mcollective/discovery/flatfile_spec.rb
352
364
  - spec/unit/plugins/mcollective/discovery/mc_spec.rb
365
+ - spec/unit/plugins/mcollective/discovery/stdin_spec.rb
366
+ - spec/unit/plugins/mcollective/facts/yaml_facts_spec.rb
353
367
  - spec/unit/plugins/mcollective/packagers/debpackage_packager_spec.rb
368
+ - spec/unit/plugins/mcollective/packagers/modulepackage_packager_spec.rb
354
369
  - spec/unit/plugins/mcollective/packagers/ospackage_spec.rb
355
370
  - spec/unit/plugins/mcollective/packagers/rpmpackage_packager_spec.rb
356
371
  - spec/unit/plugins/mcollective/security/psk_spec.rb
357
- - spec/unit/plugins/mcollective/validator/any_validator_spec.rb
358
372
  - spec/unit/plugins/mcollective/validator/array_validator_spec.rb
359
373
  - spec/unit/plugins/mcollective/validator/ipv4address_validator_spec.rb
360
374
  - spec/unit/plugins/mcollective/validator/ipv6address_validator_spec.rb
@@ -1,34 +0,0 @@
1
- #!/usr/bin/env rspec
2
-
3
- require 'spec_helper'
4
-
5
- MCollective::PluginManager.clear
6
-
7
- require File.dirname(__FILE__) + '/../../../../../../plugins/mcollective/connector/stomp.rb'
8
-
9
- module MCollective
10
- module Connector
11
- class Stomp
12
- describe EventLogger do
13
- before do
14
- end
15
-
16
- it "should have valid call back methods" do
17
- plugin = EventLogger.new
18
-
19
- [:on_miscerr, :on_connecting, :on_connected, :on_disconnect, :on_connectfail, :on_ssl_connecting, :on_ssl_connected].each do |meth|
20
- plugin.respond_to?(meth).should == true
21
- end
22
- end
23
-
24
- describe "#stomp_url" do
25
- it "should create valid stomp urls" do
26
- EventLogger.new.stomp_url({:cur_login => "rspec", :cur_host => "localhost", :cur_port => 123}).should == "stomp://rspec@localhost:123"
27
- EventLogger.new.stomp_url({:cur_login => "rspec", :cur_host => "localhost", :cur_port => 123, :cur_ssl => false}).should == "stomp://rspec@localhost:123"
28
- EventLogger.new.stomp_url({:cur_login => "rspec", :cur_host => "localhost", :cur_port => 123, :cur_ssl => true}).should == "stomp+ssl://rspec@localhost:123"
29
- end
30
- end
31
- end
32
- end
33
- end
34
- end
@@ -1,424 +0,0 @@
1
- #!/usr/bin/env rspec
2
-
3
- require 'spec_helper'
4
-
5
- MCollective::PluginManager.clear
6
-
7
- require File.dirname(__FILE__) + '/../../../../../plugins/mcollective/connector/stomp.rb'
8
-
9
- module MCollective
10
- module Connector
11
- describe Stomp do
12
- before do
13
- unless ::Stomp::Error.constants.map{|c| c.to_s}.include?("NoCurrentConnection")
14
- class ::Stomp::Error::NoCurrentConnection < RuntimeError ; end
15
- end
16
-
17
- @config = mock
18
- @config.stubs(:configured).returns(true)
19
- @config.stubs(:identity).returns("rspec")
20
- @config.stubs(:collectives).returns(["mcollective"])
21
- @config.stubs(:topicprefix).returns("/topic/")
22
- @config.stubs(:topicsep).returns(".")
23
-
24
- logger = mock
25
- logger.stubs(:log)
26
- logger.stubs(:start)
27
- Log.configure(logger)
28
-
29
- Config.stubs(:instance).returns(@config)
30
-
31
- @msg = mock
32
- @msg.stubs(:base64_encode!)
33
- @msg.stubs(:payload).returns("msg")
34
- @msg.stubs(:agent).returns("agent")
35
- @msg.stubs(:type).returns(:reply)
36
- @msg.stubs(:collective).returns("mcollective")
37
-
38
- @subscription = mock
39
- @subscription.stubs("<<").returns(true)
40
- @subscription.stubs("include?").returns(false)
41
- @subscription.stubs("delete").returns(false)
42
-
43
- @connection = mock
44
- @connection.stubs(:subscribe).returns(true)
45
- @connection.stubs(:unsubscribe).returns(true)
46
-
47
- @c = Stomp.new
48
- @c.instance_variable_set("@subscriptions", @subscription)
49
- @c.instance_variable_set("@connection", @connection)
50
- end
51
-
52
- describe "#initialize" do
53
- it "should be deprecated" do
54
- Log.expects(:info).with(regexp_matches(/please migrate to the/))
55
- Stomp.new
56
- end
57
-
58
- it "should set the @config variable" do
59
- c = Stomp.new
60
- c.instance_variable_get("@config").should == @config
61
- end
62
-
63
- it "should set @subscriptions to an empty list" do
64
- c = Stomp.new
65
- c.instance_variable_get("@subscriptions").should == []
66
- end
67
- end
68
-
69
- describe "#connect" do
70
- it "should not try to reconnect if already connected" do
71
- Log.expects(:debug).with("Already connection, not re-initializing connection").once
72
- @c.connect
73
- end
74
-
75
- it "should support old style config" do
76
- @config.expects(:pluginconf).returns({}).at_least_once
77
- @c.expects(:get_bool_option).with("stomp.base64", false)
78
- @c.expects(:get_option).with("stomp.priority", 0)
79
- @c.expects(:get_env_or_option).with("STOMP_SERVER", "stomp.host").returns("host")
80
- @c.expects(:get_env_or_option).with("STOMP_PORT", "stomp.port", 6163).returns(6163)
81
- @c.expects(:get_env_or_option).with("STOMP_USER", "stomp.user").returns("test_user")
82
- @c.expects(:get_env_or_option).with("STOMP_PASSWORD", "stomp.password").returns("test_password")
83
-
84
- connector = mock
85
- connector.expects(:new).with("test_user", "test_password", "host", 6163, true)
86
-
87
- @c.instance_variable_set("@connection", nil)
88
- @c.connect(connector)
89
- end
90
-
91
- it "should support new style config" do
92
- pluginconf = {"stomp.pool.size" => "2",
93
- "stomp.pool.host1" => "host1",
94
- "stomp.pool.port1" => "6163",
95
- "stomp.pool.user1" => "user1",
96
- "stomp.pool.password1" => "password1",
97
- "stomp.pool.ssl1" => "false",
98
- "stomp.pool.host2" => "host2",
99
- "stomp.pool.port2" => "6164",
100
- "stomp.pool.user2" => "user2",
101
- "stomp.pool.password2" => "password2",
102
- "stomp.pool.ssl2" => "true",
103
- "stomp.pool.initial_reconnect_delay" => "0.02",
104
- "stomp.pool.max_reconnect_delay" => "40",
105
- "stomp.pool.use_exponential_back_off" => "false",
106
- "stomp.pool.back_off_multiplier" => "3",
107
- "stomp.pool.max_reconnect_attempts" => "5",
108
- "stomp.pool.randomize" => "true",
109
- "stomp.pool.backup" => "true",
110
- "stomp.pool.connect_timeout" => 30,
111
- "stomp.pool.timeout" => "1"}
112
-
113
-
114
- ENV.delete("STOMP_USER")
115
- ENV.delete("STOMP_PASSWORD")
116
-
117
- @config.expects(:pluginconf).returns(pluginconf).at_least_once
118
-
119
- Stomp::EventLogger.expects(:new).returns("logger")
120
-
121
- connector = mock
122
- connector.expects(:new).with(:backup => true,
123
- :back_off_multiplier => 2,
124
- :max_reconnect_delay => 40.0,
125
- :timeout => 1,
126
- :use_exponential_back_off => false,
127
- :max_reconnect_attempts => 5,
128
- :initial_reconnect_delay => 0.02,
129
- :connect_timeout => 30,
130
- :randomize => true,
131
- :reliable => true,
132
- :logger => "logger",
133
- :hosts => [{:passcode => 'password1',
134
- :host => 'host1',
135
- :port => 6163,
136
- :ssl => false,
137
- :login => 'user1'},
138
- {:passcode => 'password2',
139
- :host => 'host2',
140
- :port => 6164,
141
- :ssl => true,
142
- :login => 'user2'}
143
- ])
144
-
145
- @c.instance_variable_set("@connection", nil)
146
- @c.connect(connector)
147
- end
148
- end
149
-
150
- describe "#receive" do
151
- it "should receive from the middleware" do
152
- payload = mock
153
- payload.stubs(:body).returns("msg")
154
- payload.stubs(:headers).returns("headers")
155
-
156
- @connection.expects(:receive).returns(payload)
157
-
158
- Message.expects(:new).with("msg", payload, :base64 => true, :headers => "headers").returns("message")
159
- @c.instance_variable_set("@base64", true)
160
-
161
- received = @c.receive
162
- received.should == "message"
163
- end
164
-
165
- it "should sleep and retry if recieving while disconnected" do
166
- payload = mock
167
- payload.stubs(:body).returns("msg")
168
- payload.stubs(:headers).returns("headers")
169
-
170
- Message.stubs(:new).returns("rspec")
171
- @connection.expects(:receive).raises(::Stomp::Error::NoCurrentConnection).returns(payload).twice
172
- @c.expects(:sleep).with(1)
173
-
174
- @c.receive.should == "rspec"
175
- end
176
- end
177
-
178
- describe "#publish" do
179
- before do
180
- @connection.stubs("respond_to?").with("publish").returns(true)
181
- @connection.stubs(:publish).with("test", "msg", {}).returns(true)
182
- end
183
-
184
- it "should base64 encode a message if configured to do so" do
185
- @c.instance_variable_set("@base64", true)
186
- @c.expects(:msgheaders).returns({})
187
- @c.expects(:make_target).returns("test")
188
- @connection.expects(:publish).with("test", "msg", {})
189
-
190
- @msg.stubs(:reply_to)
191
-
192
- @c.publish(@msg)
193
- end
194
-
195
- it "should not base64 encode if not configured to do so" do
196
- @c.instance_variable_set("@base64", false)
197
- @c.expects(:msgheaders).returns({})
198
- @c.expects(:make_target).returns("test")
199
-
200
- @connection.expects(:publish).with("test", "msg", {})
201
-
202
- @msg.stubs(:reply_to)
203
-
204
- @c.publish(@msg)
205
- end
206
-
207
- it "should publish direct requests for each discovered host" do
208
- @msg.expects(:type).returns(:direct_request).times(3)
209
- @msg.expects(:discovered_hosts).returns(["one", "two"])
210
-
211
- @c.expects(:make_target).with("agent", :direct_request, "mcollective", "one").returns("target_one")
212
- @c.expects(:make_target).with("agent", :direct_request, "mcollective", "two").returns("target_two")
213
-
214
- @c.expects(:publish_msg).with("target_one", "msg")
215
- @c.expects(:publish_msg).with("target_two", "msg")
216
-
217
- @msg.stubs(:reply_to)
218
-
219
- @c.publish(@msg)
220
- end
221
-
222
- it "should raise an error if specific reply targets are requested" do
223
- @c.instance_variable_set("@base64", false)
224
-
225
- @msg.expects(:reply_to).returns(:foo)
226
-
227
- expect { @c.publish(@msg) }.to raise_error("Cannot set specific reply to targets with the STOMP plugin")
228
- end
229
- end
230
-
231
- describe "#publish_msg" do
232
- it "should use the publish method if it exists" do
233
- @connection.expects("respond_to?").with("publish").returns(true)
234
- @connection.expects(:publish).with("test", "msg", {}).once
235
- @c.stubs(:msgheaders).returns({})
236
-
237
- @c.publish_msg("test", "msg")
238
- end
239
-
240
- it "should use the send method if publish does not exist" do
241
- @connection.expects("respond_to?").with('publish').returns(false)
242
- @connection.expects(:send).with("test", "msg", {}).once
243
- @c.stubs(:msgheaders).returns({})
244
-
245
- @c.publish_msg("test", "msg")
246
- end
247
-
248
- it "should publish the correct message to the correct target with msgheaders" do
249
- @connection.expects("respond_to?").with("publish").returns(true)
250
- @connection.expects(:publish).with("test", "msg", {"test" => "test"}).once
251
- @c.expects(:msgheaders).returns({"test" => "test"})
252
-
253
- @c.publish_msg("test", "msg")
254
- end
255
-
256
- end
257
-
258
- describe "#make_target" do
259
- it "should create correct targets" do
260
- @config.expects(:queueprefix).returns("/queue/").twice
261
-
262
- @c.make_target("test", :broadcast, "mcollective").should == "/topic/mcollective.test.command"
263
- @c.make_target("test", :directed, "mcollective").should == "/queue/mcollective.2bc84dc69b73db9383b9c6711d2011b7"
264
- @c.make_target("test", :direct_request, "mcollective", "rspec").should == "/queue/mcollective.2bc84dc69b73db9383b9c6711d2011b7"
265
- @c.make_target("test", :reply, "mcollective").should == "/topic/mcollective.test.reply"
266
- @c.make_target("test", :request, "mcollective").should == "/topic/mcollective.test.command"
267
- end
268
-
269
- it "should raise an error for unknown collectives" do
270
- expect {
271
- @c.make_target("test", :broadcast, "foo")
272
- }.to raise_error("Unknown collective 'foo' known collectives are 'mcollective'")
273
- end
274
-
275
- it "should raise an error for unknown types" do
276
- expect {
277
- @c.make_target("test", :test, "mcollective")
278
- }.to raise_error("Unknown target type test")
279
- end
280
- end
281
-
282
- describe "#unsubscribe" do
283
- it "should use make_target correctly" do
284
- @c.expects("make_target").with("test", :broadcast, "mcollective").returns({:target => "test", :headers => {}})
285
- @c.unsubscribe("test", :broadcast, "mcollective")
286
- end
287
-
288
- it "should unsubscribe from the target" do
289
- @c.expects("make_target").with("test", :broadcast, "mcollective").returns("test")
290
- @connection.expects(:unsubscribe).with("test").once
291
-
292
- @c.unsubscribe("test", :broadcast, "mcollective")
293
- end
294
-
295
- it "should delete the source from subscriptions" do
296
- @c.expects("make_target").with("test", :broadcast, "mcollective").returns({:target => "test", :headers => {}})
297
- @subscription.expects(:delete).with({:target => "test", :headers => {}}).once
298
-
299
- @c.unsubscribe("test", :broadcast, "mcollective")
300
- end
301
- end
302
-
303
- describe "#subscribe" do
304
- it "should use the make_target correctly" do
305
- @c.expects("make_target").with("test", :broadcast, "mcollective").returns("test")
306
- @c.subscribe("test", :broadcast, "mcollective")
307
- end
308
-
309
- it "should check for existing subscriptions" do
310
- @c.expects("make_target").returns("test").once
311
- @subscription.expects("include?").with("test").returns(false)
312
- @connection.expects(:subscribe).never
313
-
314
- @c.subscribe("test", :broadcast, "mcollective")
315
- end
316
-
317
- it "should subscribe to the middleware" do
318
- @c.expects("make_target").returns("test")
319
- @connection.expects(:subscribe).with("test").once
320
- @c.subscribe("test", :broadcast, "mcollective")
321
- end
322
-
323
- it "should add to the list of subscriptions" do
324
- @c.expects("make_target").returns("test")
325
- @subscription.expects("<<").with("test")
326
- @c.subscribe("test", :broadcast, "mcollective")
327
- end
328
- end
329
-
330
- describe "#disconnect" do
331
- it "should disconnect from the stomp connection" do
332
- @connection.expects(:disconnect)
333
- @c.disconnect
334
- end
335
- end
336
-
337
- describe "#msgheaders" do
338
- it "should return empty headers if priority is 0" do
339
- @c.instance_variable_set("@msgpriority", 0)
340
- @c.msgheaders.should == {}
341
- end
342
-
343
- it "should return a priority if prioritu is non 0" do
344
- @c.instance_variable_set("@msgpriority", 1)
345
- @c.msgheaders.should == {"priority" => 1}
346
- end
347
- end
348
-
349
- describe "#get_env_or_option" do
350
- it "should return the environment variable if set" do
351
- ENV["test"] = "rspec_env_test"
352
-
353
- @c.get_env_or_option("test", nil, nil).should == "rspec_env_test"
354
-
355
- ENV.delete("test")
356
- end
357
-
358
- it "should return the config option if set" do
359
- @config.expects(:pluginconf).returns({"test" => "rspec_test"}).twice
360
- @c.get_env_or_option("test", "test", "test").should == "rspec_test"
361
- end
362
-
363
- it "should return default if nothing else matched" do
364
- @config.expects(:pluginconf).returns({}).once
365
- @c.get_env_or_option("test", "test", "test").should == "test"
366
- end
367
-
368
- it "should raise an error if no default is supplied" do
369
- @config.expects(:pluginconf).returns({}).once
370
-
371
- expect {
372
- @c.get_env_or_option("test", "test")
373
- }.to raise_error("No test environment or plugin.test configuration option given")
374
- end
375
- end
376
-
377
- describe "#get_option" do
378
- it "should return the config option if set" do
379
- @config.expects(:pluginconf).returns({"test" => "rspec_test"}).twice
380
- @c.get_option("test").should == "rspec_test"
381
- end
382
-
383
- it "should return default option was not found" do
384
- @config.expects(:pluginconf).returns({}).once
385
- @c.get_option("test", "test").should == "test"
386
- end
387
-
388
- it "should raise an error if no default is supplied" do
389
- @config.expects(:pluginconf).returns({}).once
390
-
391
- expect {
392
- @c.get_option("test")
393
- }.to raise_error("No plugin.test configuration option given")
394
- end
395
- end
396
-
397
- describe "#get_bool_option" do
398
- it "should return the default if option isnt set" do
399
- @config.expects(:pluginconf).returns({}).once
400
- @c.get_bool_option("test", "default").should == "default"
401
- end
402
-
403
- ["1", "yes", "true"].each do |boolean|
404
- it "should map options to true correctly" do
405
- @config.expects(:pluginconf).returns({"test" => boolean}).twice
406
- @c.get_bool_option("test", "default").should == true
407
- end
408
- end
409
-
410
- ["0", "no", "false"].each do |boolean|
411
- it "should map options to false correctly" do
412
- @config.expects(:pluginconf).returns({"test" => boolean}).twice
413
- @c.get_bool_option("test", "default").should == false
414
- end
415
- end
416
-
417
- it "should return default for non boolean options" do
418
- @config.expects(:pluginconf).returns({"test" => "foo"}).twice
419
- @c.get_bool_option("test", "default").should == "default"
420
- end
421
- end
422
- end
423
- end
424
- end