right_agent 2.0.7-x86-mingw32

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.
Files changed (176) hide show
  1. data/LICENSE +20 -0
  2. data/README.rdoc +82 -0
  3. data/Rakefile +113 -0
  4. data/lib/right_agent.rb +59 -0
  5. data/lib/right_agent/actor.rb +182 -0
  6. data/lib/right_agent/actor_registry.rb +76 -0
  7. data/lib/right_agent/actors/agent_manager.rb +232 -0
  8. data/lib/right_agent/agent.rb +1149 -0
  9. data/lib/right_agent/agent_config.rb +480 -0
  10. data/lib/right_agent/agent_identity.rb +210 -0
  11. data/lib/right_agent/agent_tag_manager.rb +237 -0
  12. data/lib/right_agent/audit_formatter.rb +107 -0
  13. data/lib/right_agent/clients.rb +31 -0
  14. data/lib/right_agent/clients/api_client.rb +383 -0
  15. data/lib/right_agent/clients/auth_client.rb +247 -0
  16. data/lib/right_agent/clients/balanced_http_client.rb +369 -0
  17. data/lib/right_agent/clients/base_retry_client.rb +495 -0
  18. data/lib/right_agent/clients/right_http_client.rb +279 -0
  19. data/lib/right_agent/clients/router_client.rb +493 -0
  20. data/lib/right_agent/command.rb +30 -0
  21. data/lib/right_agent/command/agent_manager_commands.rb +150 -0
  22. data/lib/right_agent/command/command_client.rb +136 -0
  23. data/lib/right_agent/command/command_constants.rb +33 -0
  24. data/lib/right_agent/command/command_io.rb +126 -0
  25. data/lib/right_agent/command/command_parser.rb +87 -0
  26. data/lib/right_agent/command/command_runner.rb +118 -0
  27. data/lib/right_agent/command/command_serializer.rb +63 -0
  28. data/lib/right_agent/connectivity_checker.rb +179 -0
  29. data/lib/right_agent/console.rb +65 -0
  30. data/lib/right_agent/core_payload_types.rb +44 -0
  31. data/lib/right_agent/core_payload_types/cookbook.rb +61 -0
  32. data/lib/right_agent/core_payload_types/cookbook_position.rb +46 -0
  33. data/lib/right_agent/core_payload_types/cookbook_repository.rb +116 -0
  34. data/lib/right_agent/core_payload_types/cookbook_sequence.rb +70 -0
  35. data/lib/right_agent/core_payload_types/dev_repositories.rb +100 -0
  36. data/lib/right_agent/core_payload_types/dev_repository.rb +76 -0
  37. data/lib/right_agent/core_payload_types/event_categories.rb +38 -0
  38. data/lib/right_agent/core_payload_types/executable_bundle.rb +130 -0
  39. data/lib/right_agent/core_payload_types/login_policy.rb +72 -0
  40. data/lib/right_agent/core_payload_types/login_user.rb +79 -0
  41. data/lib/right_agent/core_payload_types/planned_volume.rb +94 -0
  42. data/lib/right_agent/core_payload_types/recipe_instantiation.rb +73 -0
  43. data/lib/right_agent/core_payload_types/repositories_bundle.rb +50 -0
  44. data/lib/right_agent/core_payload_types/right_script_attachment.rb +95 -0
  45. data/lib/right_agent/core_payload_types/right_script_instantiation.rb +94 -0
  46. data/lib/right_agent/core_payload_types/runlist_policy.rb +44 -0
  47. data/lib/right_agent/core_payload_types/secure_document.rb +66 -0
  48. data/lib/right_agent/core_payload_types/secure_document_location.rb +63 -0
  49. data/lib/right_agent/core_payload_types/software_repository_instantiation.rb +61 -0
  50. data/lib/right_agent/daemonize.rb +35 -0
  51. data/lib/right_agent/dispatched_cache.rb +109 -0
  52. data/lib/right_agent/dispatcher.rb +272 -0
  53. data/lib/right_agent/enrollment_result.rb +221 -0
  54. data/lib/right_agent/exceptions.rb +87 -0
  55. data/lib/right_agent/history.rb +145 -0
  56. data/lib/right_agent/log.rb +460 -0
  57. data/lib/right_agent/minimal.rb +46 -0
  58. data/lib/right_agent/monkey_patches.rb +30 -0
  59. data/lib/right_agent/monkey_patches/ruby_patch.rb +55 -0
  60. data/lib/right_agent/monkey_patches/ruby_patch/array_patch.rb +29 -0
  61. data/lib/right_agent/monkey_patches/ruby_patch/darwin_patch.rb +24 -0
  62. data/lib/right_agent/monkey_patches/ruby_patch/linux_patch.rb +24 -0
  63. data/lib/right_agent/monkey_patches/ruby_patch/linux_patch/file_patch.rb +30 -0
  64. data/lib/right_agent/monkey_patches/ruby_patch/object_patch.rb +49 -0
  65. data/lib/right_agent/monkey_patches/ruby_patch/windows_patch.rb +32 -0
  66. data/lib/right_agent/monkey_patches/ruby_patch/windows_patch/file_patch.rb +60 -0
  67. data/lib/right_agent/monkey_patches/ruby_patch/windows_patch/process_patch.rb +63 -0
  68. data/lib/right_agent/monkey_patches/ruby_patch/windows_patch/stdio_patch.rb +27 -0
  69. data/lib/right_agent/monkey_patches/ruby_patch/windows_patch/time_patch.rb +55 -0
  70. data/lib/right_agent/monkey_patches/ruby_patch/windows_patch/win32ole_patch.rb +34 -0
  71. data/lib/right_agent/multiplexer.rb +102 -0
  72. data/lib/right_agent/offline_handler.rb +270 -0
  73. data/lib/right_agent/operation_result.rb +300 -0
  74. data/lib/right_agent/packets.rb +673 -0
  75. data/lib/right_agent/payload_formatter.rb +104 -0
  76. data/lib/right_agent/pending_requests.rb +128 -0
  77. data/lib/right_agent/pid_file.rb +159 -0
  78. data/lib/right_agent/platform.rb +770 -0
  79. data/lib/right_agent/platform/unix/darwin/platform.rb +102 -0
  80. data/lib/right_agent/platform/unix/linux/platform.rb +305 -0
  81. data/lib/right_agent/platform/unix/platform.rb +226 -0
  82. data/lib/right_agent/platform/windows/mingw/platform.rb +447 -0
  83. data/lib/right_agent/platform/windows/mswin/platform.rb +236 -0
  84. data/lib/right_agent/platform/windows/platform.rb +1808 -0
  85. data/lib/right_agent/protocol_version_mixin.rb +69 -0
  86. data/lib/right_agent/retryable_request.rb +195 -0
  87. data/lib/right_agent/scripts/agent_controller.rb +543 -0
  88. data/lib/right_agent/scripts/agent_deployer.rb +400 -0
  89. data/lib/right_agent/scripts/common_parser.rb +160 -0
  90. data/lib/right_agent/scripts/log_level_manager.rb +192 -0
  91. data/lib/right_agent/scripts/stats_manager.rb +268 -0
  92. data/lib/right_agent/scripts/usage.rb +58 -0
  93. data/lib/right_agent/secure_identity.rb +92 -0
  94. data/lib/right_agent/security.rb +32 -0
  95. data/lib/right_agent/security/cached_certificate_store_proxy.rb +77 -0
  96. data/lib/right_agent/security/certificate.rb +102 -0
  97. data/lib/right_agent/security/certificate_cache.rb +89 -0
  98. data/lib/right_agent/security/distinguished_name.rb +56 -0
  99. data/lib/right_agent/security/encrypted_document.rb +83 -0
  100. data/lib/right_agent/security/rsa_key_pair.rb +76 -0
  101. data/lib/right_agent/security/signature.rb +86 -0
  102. data/lib/right_agent/security/static_certificate_store.rb +85 -0
  103. data/lib/right_agent/sender.rb +792 -0
  104. data/lib/right_agent/serialize.rb +29 -0
  105. data/lib/right_agent/serialize/message_pack.rb +107 -0
  106. data/lib/right_agent/serialize/secure_serializer.rb +151 -0
  107. data/lib/right_agent/serialize/secure_serializer_initializer.rb +47 -0
  108. data/lib/right_agent/serialize/serializable.rb +151 -0
  109. data/lib/right_agent/serialize/serializer.rb +159 -0
  110. data/lib/right_agent/subprocess.rb +38 -0
  111. data/lib/right_agent/tracer.rb +124 -0
  112. data/right_agent.gemspec +101 -0
  113. data/spec/actor_registry_spec.rb +80 -0
  114. data/spec/actor_spec.rb +162 -0
  115. data/spec/agent_config_spec.rb +235 -0
  116. data/spec/agent_identity_spec.rb +78 -0
  117. data/spec/agent_spec.rb +734 -0
  118. data/spec/agent_tag_manager_spec.rb +319 -0
  119. data/spec/clients/api_client_spec.rb +423 -0
  120. data/spec/clients/auth_client_spec.rb +272 -0
  121. data/spec/clients/balanced_http_client_spec.rb +576 -0
  122. data/spec/clients/base_retry_client_spec.rb +635 -0
  123. data/spec/clients/router_client_spec.rb +594 -0
  124. data/spec/clients/spec_helper.rb +111 -0
  125. data/spec/command/agent_manager_commands_spec.rb +51 -0
  126. data/spec/command/command_io_spec.rb +93 -0
  127. data/spec/command/command_parser_spec.rb +79 -0
  128. data/spec/command/command_runner_spec.rb +107 -0
  129. data/spec/command/command_serializer_spec.rb +51 -0
  130. data/spec/connectivity_checker_spec.rb +83 -0
  131. data/spec/core_payload_types/dev_repositories_spec.rb +64 -0
  132. data/spec/core_payload_types/dev_repository_spec.rb +33 -0
  133. data/spec/core_payload_types/executable_bundle_spec.rb +67 -0
  134. data/spec/core_payload_types/login_user_spec.rb +102 -0
  135. data/spec/core_payload_types/recipe_instantiation_spec.rb +81 -0
  136. data/spec/core_payload_types/right_script_attachment_spec.rb +65 -0
  137. data/spec/core_payload_types/right_script_instantiation_spec.rb +79 -0
  138. data/spec/core_payload_types/spec_helper.rb +23 -0
  139. data/spec/dispatched_cache_spec.rb +136 -0
  140. data/spec/dispatcher_spec.rb +324 -0
  141. data/spec/enrollment_result_spec.rb +53 -0
  142. data/spec/history_spec.rb +246 -0
  143. data/spec/log_spec.rb +192 -0
  144. data/spec/monkey_patches/eventmachine_spec.rb +62 -0
  145. data/spec/multiplexer_spec.rb +48 -0
  146. data/spec/offline_handler_spec.rb +340 -0
  147. data/spec/operation_result_spec.rb +208 -0
  148. data/spec/packets_spec.rb +461 -0
  149. data/spec/pending_requests_spec.rb +136 -0
  150. data/spec/platform/spec_helper.rb +216 -0
  151. data/spec/platform/unix/darwin/platform_spec.rb +181 -0
  152. data/spec/platform/unix/linux/platform_spec.rb +540 -0
  153. data/spec/platform/unix/spec_helper.rb +149 -0
  154. data/spec/platform/windows/mingw/platform_spec.rb +222 -0
  155. data/spec/platform/windows/mswin/platform_spec.rb +259 -0
  156. data/spec/platform/windows/spec_helper.rb +720 -0
  157. data/spec/retryable_request_spec.rb +306 -0
  158. data/spec/secure_identity_spec.rb +50 -0
  159. data/spec/security/cached_certificate_store_proxy_spec.rb +62 -0
  160. data/spec/security/certificate_cache_spec.rb +71 -0
  161. data/spec/security/certificate_spec.rb +49 -0
  162. data/spec/security/distinguished_name_spec.rb +46 -0
  163. data/spec/security/encrypted_document_spec.rb +55 -0
  164. data/spec/security/rsa_key_pair_spec.rb +55 -0
  165. data/spec/security/signature_spec.rb +66 -0
  166. data/spec/security/static_certificate_store_spec.rb +58 -0
  167. data/spec/sender_spec.rb +1045 -0
  168. data/spec/serialize/message_pack_spec.rb +131 -0
  169. data/spec/serialize/secure_serializer_spec.rb +132 -0
  170. data/spec/serialize/serializable_spec.rb +90 -0
  171. data/spec/serialize/serializer_spec.rb +197 -0
  172. data/spec/spec.opts +2 -0
  173. data/spec/spec.win32.opts +1 -0
  174. data/spec/spec_helper.rb +130 -0
  175. data/spec/tracer_spec.rb +114 -0
  176. metadata +447 -0
@@ -0,0 +1,162 @@
1
+ #
2
+ # Copyright (c) 2009-2011 RightScale Inc
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining
5
+ # a copy of this software and associated documentation files (the
6
+ # "Software"), to deal in the Software without restriction, including
7
+ # without limitation the rights to use, copy, modify, merge, publish,
8
+ # distribute, sublicense, and/or sell copies of the Software, and to
9
+ # permit persons to whom the Software is furnished to do so, subject to
10
+ # the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be
13
+ # included in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+
23
+ require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper'))
24
+
25
+ describe RightScale::Actor do
26
+ class ::WebDocumentImporter
27
+ include RightScale::Actor
28
+ expose_non_idempotent :import, :cancel
29
+ expose_idempotent :special
30
+
31
+ def import; 1 end
32
+ def cancel; 0 end
33
+ def continue; 1 end
34
+ def special; 2 end
35
+ def more_special; 3 end
36
+ end
37
+
38
+ module ::Actors
39
+ class ComedyActor
40
+ include RightScale::Actor
41
+ expose :fun_tricks
42
+ def fun_tricks
43
+ :rabbit_in_the_hat
44
+ end
45
+ end
46
+ end
47
+
48
+ class ::Actors::InvalidActor
49
+ include RightScale::Actor
50
+ expose :non_existing
51
+ end
52
+
53
+ before :each do
54
+ @log = flexmock(RightScale::Log)
55
+ @log.should_receive(:warning).by_default.and_return { |m| raise RightScale::Log.format(*m) }
56
+ @log.should_receive(:error).by_default.and_return { |m| raise RightScale::Log.format(*m) }
57
+ end
58
+
59
+ describe "expose" do
60
+
61
+ before :each do
62
+ @exposed = WebDocumentImporter.instance_variable_get(:@exposed).dup
63
+ end
64
+
65
+ after :each do
66
+ WebDocumentImporter.instance_variable_set(:@exposed, @exposed)
67
+ end
68
+
69
+ context "idempotent" do
70
+
71
+ it "exposes as idempotent" do
72
+ WebDocumentImporter.expose_idempotent(:more_special)
73
+ WebDocumentImporter.provides_for("webfiles").sort.should == [
74
+ "/webfiles/cancel", "/webfiles/import", "/webfiles/more_special", "/webfiles/special"]
75
+ WebDocumentImporter.idempotent?(:special).should be_true
76
+ WebDocumentImporter.idempotent?(:more_special).should be_true
77
+ end
78
+
79
+ it "treats already exposed non-idempotent method as non-idempotent" do
80
+ @log.should_receive(:warning).with(/Method cancel declared both idempotent and non-idempotent/).once
81
+ WebDocumentImporter.expose_idempotent(:cancel)
82
+ WebDocumentImporter.provides_for("webfiles").sort.should == [
83
+ "/webfiles/cancel", "/webfiles/import", "/webfiles/special"]
84
+ WebDocumentImporter.idempotent?(:cancel).should be_false
85
+ end
86
+
87
+ end
88
+
89
+ context "non_idempotent" do
90
+
91
+ it "exposes as non-idempotent" do
92
+ WebDocumentImporter.expose_non_idempotent(:continue)
93
+ WebDocumentImporter.provides_for("webfiles").sort.should == [
94
+ "/webfiles/cancel", "/webfiles/continue", "/webfiles/import", "/webfiles/special"]
95
+ WebDocumentImporter.idempotent?(:import).should be_false
96
+ WebDocumentImporter.idempotent?(:cancel).should be_false
97
+ WebDocumentImporter.idempotent?(:continue).should be_false
98
+ end
99
+
100
+ it "treats already exposed idempotent method as non-idempotent" do
101
+ @log.should_receive(:warning).with(/Method special declared both idempotent and non-idempotent/).once
102
+ WebDocumentImporter.expose_non_idempotent(:special)
103
+ WebDocumentImporter.provides_for("webfiles").sort.should == [
104
+ "/webfiles/cancel", "/webfiles/import", "/webfiles/special"]
105
+ WebDocumentImporter.idempotent?(:special).should be_false
106
+ end
107
+
108
+ it "defaults expose method to declare non_idempotent" do
109
+ WebDocumentImporter.expose(:continue)
110
+ WebDocumentImporter.provides_for("webfiles").sort.should == [
111
+ "/webfiles/cancel", "/webfiles/continue", "/webfiles/import", "/webfiles/special"]
112
+ WebDocumentImporter.idempotent?(:continue).should be_false
113
+ end
114
+
115
+ end
116
+
117
+ end
118
+
119
+ describe "default_prefix" do
120
+
121
+ it "is calculated as default prefix as const path of class name" do
122
+ Actors::ComedyActor.default_prefix.should == "actors/comedy_actor"
123
+ WebDocumentImporter.default_prefix.should == "web_document_importer"
124
+ end
125
+
126
+ end
127
+
128
+ describe "provides_for" do
129
+
130
+ before :each do
131
+ @provides = Actors::ComedyActor.provides_for("money")
132
+ end
133
+
134
+ it "returns an array" do
135
+ @provides.should be_kind_of(Array)
136
+ end
137
+
138
+ it "maps exposed service methods to prefix" do
139
+ @provides.should == ["/money/fun_tricks"]
140
+ wdi_provides = WebDocumentImporter.provides_for("webfiles")
141
+ wdi_provides.should include("/webfiles/import")
142
+ wdi_provides.should include("/webfiles/cancel")
143
+ wdi_provides.should include("/webfiles/special")
144
+ end
145
+
146
+ it "excludes methods not existing in the actor class" do
147
+ @log.should_receive(:warning).with("Exposing non-existing method non_existing in actor money").once
148
+ Actors::InvalidActor.provides_for("money").should_not include("/money/non_existing")
149
+ end
150
+
151
+ end
152
+
153
+ describe "idempotent?" do
154
+
155
+ it "returns whether idempotent" do
156
+ WebDocumentImporter.idempotent?(:import).should be_false
157
+ WebDocumentImporter.idempotent?(:special).should be_true
158
+ end
159
+
160
+ end
161
+
162
+ end
@@ -0,0 +1,235 @@
1
+ #
2
+ # Copyright (c) 2011 RightScale Inc
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining
5
+ # a copy of this software and associated documentation files (the
6
+ # "Software"), to deal in the Software without restriction, including
7
+ # without limitation the rights to use, copy, modify, merge, publish,
8
+ # distribute, sublicense, and/or sell copies of the Software, and to
9
+ # permit persons to whom the Software is furnished to do so, subject to
10
+ # the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be
13
+ # included in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+
23
+ require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper'))
24
+
25
+ describe RightScale::AgentConfig do
26
+
27
+ before(:all) do
28
+ @agent_config = RightScale::AgentConfig
29
+ @pwd_dir = Dir.pwd
30
+ @tmp_dir = RightScale::Platform.filesystem.temp_dir
31
+ @test_dir = File.join(@tmp_dir, 'agent_config_test')
32
+ @agent_id1 = "rs-agent-1-1"
33
+ FileUtils.mkdir_p(@root_dir1 = File.join(@test_dir, 'root1'))
34
+ FileUtils.mkdir_p(@root_dir2 = File.join(@test_dir, 'root2'))
35
+ FileUtils.mkdir_p(@root_dir3 = File.join(@test_dir, 'root3'))
36
+ FileUtils.mkdir_p(@init_dir1 = File.join(@root_dir1, 'init'))
37
+ FileUtils.mkdir_p(@init_dir2 = File.join(@root_dir2, 'init'))
38
+ FileUtils.mkdir_p(@init_dir3 = File.join(@root_dir3, 'init'))
39
+ FileUtils.touch([@config1 = File.join(@init_dir1, 'config.yml'), @config2 = File.join(@init_dir2, 'config.yml')])
40
+ FileUtils.touch([@init2 = File.join(@init_dir2, 'init.rb'), @init3 = File.join(@init_dir3, 'init.rb')])
41
+ FileUtils.mkdir_p(@actors1 = File.join(@root_dir1, 'actors'))
42
+ FileUtils.mkdir_p(@actors3 = File.join(@root_dir3, 'actors'))
43
+ @actors = File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib', 'right_agent', 'actors'))
44
+ FileUtils.mkdir_p(@certs1 = File.join(@root_dir1, 'certs'))
45
+ FileUtils.mkdir_p(@certs2 = File.join(@root_dir2, 'certs'))
46
+ FileUtils.touch([@router_cert1 = File.join(@certs1, 'router.cert')])
47
+ FileUtils.touch([@router_cert2 = File.join(@certs2, 'router.cert')])
48
+ FileUtils.touch([@agent_cert2 = File.join(@certs2, 'agent.cert')])
49
+ FileUtils.touch([@router_key2 = File.join(@certs2, 'router.key')])
50
+ FileUtils.mkdir_p(@lib1 = File.join(@root_dir1, 'lib'))
51
+ FileUtils.mkdir_p(@scripts3 = File.join(@root_dir3, 'scripts'))
52
+ FileUtils.mkdir_p(@cfg_dir = File.join(@test_dir, 'cfg'))
53
+ FileUtils.mkdir_p(@cfg_agent1_dir = File.join(@cfg_dir, 'agent_1'))
54
+ FileUtils.mkdir_p(@pid_dir = File.join(@test_dir, 'pid'))
55
+ @agent_options1 = {
56
+ :identity => @agent_id1,
57
+ :root_dir => [@root_dir1, @root_dir2],
58
+ :log_dir => @tmp_dir,
59
+ :pid_dir => @pid_dir
60
+ }
61
+ File.open(@cfg_agent1 = File.join(@cfg_agent1_dir, 'config.yml'), "w") { |f| f.puts(YAML.dump(@agent_options1)) }
62
+ @agent_id2 = "rs-agent-2-2"
63
+ @agent_options2 = {
64
+ :identity => @agent_id2,
65
+ :root_dir => @root_dir2,
66
+ :pid_dir => @pid_dir
67
+ }
68
+ FileUtils.mkdir_p(@cfg_agent2_dir = File.join(@cfg_dir, 'agent_2'))
69
+ FileUtils.touch([@cfg_agent2 = File.join(@cfg_agent2_dir, 'config.yml')])
70
+ @pid = 12345
71
+ File.open(@cookie_file = File.join(@pid_dir, "#{@agent_id1}.pid"), "w") { |f| f.puts(@pid) }
72
+ @agent_cookie1 = {
73
+ :cookie => "1a2b3c",
74
+ :listen_port => 70000
75
+ }
76
+ File.open(@cookie_file = File.join(@pid_dir, "#{@agent_id1}.cookie"), "w") { |f| f.puts(YAML.dump(@agent_cookie1)) }
77
+ end
78
+
79
+ after(:all) do
80
+ FileUtils.remove_dir(@test_dir)
81
+ end
82
+
83
+ it 'should return protocol version' do
84
+ @agent_config.protocol_version.should == RightScale::AgentConfig::PROTOCOL_VERSION
85
+ end
86
+
87
+ it 'should default root directory to current working directory' do
88
+ @agent_config.root_dir.should == @pwd_dir
89
+ end
90
+
91
+ it 'should set root directory to single directory' do
92
+ @agent_config.root_dir = @root_dir1
93
+ @agent_config.root_dir.should == @root_dir1
94
+ end
95
+
96
+ it 'should set root directory to list of directories' do
97
+ @agent_config.root_dir = [@root_dir1, @root_dir2]
98
+ @agent_config.root_dirs.should == [@root_dir1, @root_dir2]
99
+ end
100
+
101
+ it 'should be able to change root directory' do
102
+ @agent_config.root_dir = [@root_dir1, @root_dir2]
103
+ @agent_config.root_dir.should == [@root_dir1, @root_dir2]
104
+ @agent_config.root_dir = [@root_dir3, @root_dir2]
105
+ @agent_config.root_dir.should == [@root_dir3, @root_dir2]
106
+ @agent_config.root_dir = nil
107
+ @agent_config.root_dir.should == @pwd_dir
108
+ end
109
+
110
+ it 'should default configuration directory to platform specific directory' do
111
+ @agent_config.cfg_dir.should == RightScale::Platform.filesystem.right_agent_cfg_dir
112
+ end
113
+
114
+ it 'should set configuration directory' do
115
+ @agent_config.cfg_dir = @cfg_dir
116
+ @agent_config.cfg_dir.should == @cfg_dir
117
+ end
118
+
119
+ it 'should default process id directory to platform specific directory' do
120
+ @agent_config.pid_dir.should == RightScale::Platform.filesystem.pid_dir
121
+ end
122
+
123
+ it 'should set process id directory' do
124
+ @agent_config.pid_dir = @pid_dir
125
+ @agent_config.pid_dir.should == @pid_dir
126
+ end
127
+
128
+ it 'should return first init/init.rb file path found' do
129
+ @agent_config.root_dir = [@root_dir1, @root_dir2, @root_dir3]
130
+ @agent_config.init_file.should == @init2
131
+ end
132
+
133
+ it 'should return first init/config.yml file path found' do
134
+ @agent_config.root_dir = [@root_dir1, @root_dir2, @root_dir3]
135
+ @agent_config.init_cfg_file.should == @config1
136
+ end
137
+
138
+ it 'should return actors directory paths containing all in root directory paths with one from gem last' do
139
+ @agent_config.root_dir = [@root_dir1, @root_dir2, @root_dir3]
140
+ @agent_config.actors_dirs.should == [@actors1, @actors3, @actors]
141
+ end
142
+
143
+ it 'should return actors directory paths containing other actors directories' do
144
+ module RightScale
145
+ AgentConfig.module_eval { def self.other_actors_dirs; [RightScale::Platform.filesystem.temp_dir] end }
146
+ end
147
+ @agent_config.root_dir = [@root_dir1, @root_dir2]
148
+ @agent_config.actors_dirs.should == [@actors1, @tmp_dir, @actors]
149
+ end
150
+
151
+ it 'should return first certs file path found' do
152
+ @agent_config.root_dir = [@root_dir1, @root_dir2, @root_dir3]
153
+ @agent_config.certs_file('router.cert').should == @router_cert1
154
+ @agent_config.certs_file('router.key').should == @router_key2
155
+ @agent_config.certs_file('agent.key').should be_nil
156
+ end
157
+
158
+ it 'should return all certs file paths found without any duplicates and by root directory order' do
159
+ @agent_config.root_dir = [@root_dir1, @root_dir2, @root_dir3]
160
+ @agent_config.certs_files('*.cert').should == [@router_cert1, @agent_cert2]
161
+ @agent_config.certs_files('*.key').should == [@router_key2]
162
+ @agent_config.certs_files('*.abc').should == []
163
+ end
164
+
165
+ it 'should return the first lib directory path' do
166
+ @agent_config.root_dir = [@root_dir1, @root_dir2, @root_dir3]
167
+ @agent_config.lib_dir.should == @lib1
168
+ end
169
+
170
+ it 'should return the first scripts directory path' do
171
+ @agent_config.root_dir = [@root_dir1, @root_dir2, @root_dir3]
172
+ @agent_config.scripts_dir.should == @scripts3
173
+ end
174
+
175
+ it 'should return the configuration file path for an agent' do
176
+ @agent_config.cfg_dir = @cfg_dir
177
+ @agent_config.cfg_file('agent_1').should == @cfg_agent1
178
+ @agent_config.cfg_file('no_agent').should == File.join(@cfg_dir, 'no_agent', 'config.yml')
179
+ end
180
+
181
+ it 'should check if agent configuration file exists if requested to' do
182
+ @agent_config.cfg_dir = @cfg_dir
183
+ @agent_config.cfg_file('agent_1', exists = true).should == @cfg_agent1
184
+ @agent_config.cfg_file('no_agent', exists = true).should be_nil
185
+ end
186
+
187
+ it 'should return configuration file paths for all agents' do
188
+ @agent_config.cfg_dir = @cfg_dir
189
+ @agent_config.cfg_files.should =~ [@cfg_agent1, @cfg_agent2]
190
+ end
191
+
192
+ it 'should return a list of all configured agents' do
193
+ @agent_config.cfg_dir = @cfg_dir
194
+ @agent_config.cfg_agents.should =~ ['agent_1', 'agent_2']
195
+ end
196
+
197
+ it 'should return agent name for agent identity' do
198
+ @agent_config.cfg_dir = @cfg_dir
199
+ @agent_config.agent_name(@agent_id1).should == 'agent_1'
200
+ @agent_config.agent_name("rs-bogus-0-0").should be_nil
201
+ end
202
+
203
+ it 'should load agent options from a configuration file and symbolize the keys' do
204
+ @agent_config.cfg_dir = @cfg_dir
205
+ @agent_config.load_cfg('agent_1').should == @agent_options1
206
+ @agent_config.load_cfg("no_agent").should be_nil
207
+ end
208
+
209
+ it 'should store agent options in a configuration file in YAML format' do
210
+ @agent_config.cfg_dir = @cfg_dir
211
+ @agent_config.store_cfg("agent_2", @agent_options2) == @agent_config.cfg_file("agent_2")
212
+ @agent_config.load_cfg('agent_2').should == @agent_options2
213
+ end
214
+
215
+ it 'should return the process id file object for an agent' do
216
+ @agent_config.cfg_dir = @cfg_dir
217
+ @agent_config.pid_file('agent_1').identity.should == @agent_id1
218
+ @agent_config.pid_file('no_agent').should be_nil
219
+ end
220
+
221
+ it 'should return the agent options retrieved from the configuration file and associated pid file' do
222
+ @agent_config.cfg_dir = @cfg_dir
223
+ @agent_config.agent_options('agent_1').should == @agent_options1.merge(@agent_cookie1.merge(:pid => @pid, :log_path => @tmp_dir))
224
+ @agent_config.agent_options("no_agent").should == {}
225
+ end
226
+
227
+ it 'should return the name of agents that are running' do
228
+ flexmock(Process).should_receive(:getpgid).with(@pid).and_return(123)
229
+ @agent_config.cfg_dir = @cfg_dir
230
+ @agent_config.cfg_agents.should =~ ['agent_1', 'agent_2']
231
+ @agent_config.running_agents.should =~ ['agent_1']
232
+ @agent_config.running_agents(/core/).should =~ []
233
+ end
234
+
235
+ end
@@ -0,0 +1,78 @@
1
+ #
2
+ # Copyright (c) 2009-2011 RightScale Inc
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining
5
+ # a copy of this software and associated documentation files (the
6
+ # "Software"), to deal in the Software without restriction, including
7
+ # without limitation the rights to use, copy, modify, merge, publish,
8
+ # distribute, sublicense, and/or sell copies of the Software, and to
9
+ # permit persons to whom the Software is furnished to do so, subject to
10
+ # the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be
13
+ # included in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+
23
+ require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper'))
24
+
25
+ describe RightScale::AgentIdentity do
26
+
27
+ it 'should create a token if none is provided' do
28
+ id = RightScale::AgentIdentity.new('prefix', 'agent_type', 1)
29
+ id.token.should_not be_nil
30
+ end
31
+
32
+ it 'should create unique tokens' do
33
+ id = RightScale::AgentIdentity.new('prefix', 'agent_type', 1)
34
+ id.token.should_not be_nil
35
+ id2 = RightScale::AgentIdentity.new('prefix', 'agent_type', 1)
36
+ id2.token.should_not be_nil
37
+ id.token.should_not == id2.token
38
+ end
39
+
40
+ it 'should use preset tokens' do
41
+ id = RightScale::AgentIdentity.new('prefix', 'agent_type', 1, 'token')
42
+ id.token.should == 'token'
43
+ end
44
+
45
+ it 'should serialize' do
46
+ id = RightScale::AgentIdentity.new('prefix', 'agent_type', 1, 'token')
47
+ id2 = RightScale::AgentIdentity.parse(id.to_s)
48
+ id2.prefix.should == id.prefix
49
+ id2.agent_type.should == id.agent_type
50
+ id2.base_id.should == id.base_id
51
+ id2.token.should == id.token
52
+ end
53
+
54
+ it 'should validate' do
55
+ id = RightScale::AgentIdentity.new('prefix', 'agent_type', 1, 'token')
56
+ RightScale::AgentIdentity.valid?(id.to_s).should be_true
57
+ end
58
+
59
+ it "should treat serialized id with nanite, mapper, or router prefix as valid" do
60
+ RightScale::AgentIdentity.valid?("nanite-prefix-agent_type-token-1").should be_true
61
+ RightScale::AgentIdentity.valid?("mapper-prefix-agent_type-token-1").should be_true
62
+ RightScale::AgentIdentity.valid?("router-prefix-agent_type-token-1").should be_true
63
+ end
64
+
65
+ it "should parse serialized id with nanite, mapper, or router prefix but discard this prefix" do
66
+ RightScale::AgentIdentity.parse("nanite-prefix-agent_type-token-1").to_s.should == "prefix-agent_type-token-1"
67
+ RightScale::AgentIdentity.parse("mapper-prefix-agent_type-token-1").to_s.should == "prefix-agent_type-token-1"
68
+ RightScale::AgentIdentity.parse("router-prefix-agent_type-token-1").to_s.should == "prefix-agent_type-token-1"
69
+ end
70
+
71
+ it 'should prefix with nanite to make backward compatible' do
72
+ id = RightScale::AgentIdentity.new('prefix', 'agent_type', 1, 'token')
73
+ RightScale::AgentIdentity.compatible_serialized(id.to_s, version_can_handle_non_nanite_ids).should == "prefix-agent_type-token-1"
74
+ RightScale::AgentIdentity.compatible_serialized(id.to_s, version_cannot_handle_non_nanite_ids).should == "nanite-prefix-agent_type-token-1"
75
+ RightScale::AgentIdentity.compatible_serialized(id.to_s).should == "prefix-agent_type-token-1"
76
+ end
77
+
78
+ end