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,65 @@
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
+ module RightScale
24
+
25
+ module ConsoleHelper
26
+ def self.included(base)
27
+ @@base = base
28
+ end
29
+
30
+ def start_console
31
+ puts "Starting #{@@base.name.split(":").last.downcase} console (#{self.identity})"
32
+ Thread.new do
33
+ Console.start(self)
34
+ end
35
+ end
36
+
37
+ end # ConsoleHelper
38
+
39
+ module Console
40
+ class << self; attr_accessor :instance; end
41
+
42
+ def self.start(binding, quit_on_exit=true)
43
+ require 'irb'
44
+ old_args = ARGV.dup
45
+ ARGV.replace ["--simple-prompt"]
46
+
47
+ IRB.setup(nil)
48
+ self.instance = IRB::Irb.new(IRB::WorkSpace.new(binding))
49
+
50
+ @CONF = IRB.instance_variable_get(:@CONF)
51
+ @CONF[:IRB_RC].call self.instance.context if @CONF[:IRB_RC]
52
+ @CONF[:MAIN_CONTEXT] = self.instance.context
53
+
54
+ catch(:IRB_EXIT) { self.instance.eval_input }
55
+ ensure
56
+ ARGV.replace old_args
57
+ # Clean up tty settings in some evil, evil cases
58
+ begin; catch(:IRB_EXIT) { irb_exit }; rescue Exception; end
59
+ # Make agent exit when irb does
60
+ EM.stop if EM.reactor_running? && quit_on_exit
61
+ end
62
+
63
+ end # Console
64
+
65
+ end # RightScale
@@ -0,0 +1,44 @@
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
+
24
+ CORE_PAYLOAD_TYPES_BASE_DIR = File.join(File.dirname(__FILE__), 'core_payload_types')
25
+
26
+ require File.normalize_path(File.join(CORE_PAYLOAD_TYPES_BASE_DIR, 'cookbook'))
27
+ require File.normalize_path(File.join(CORE_PAYLOAD_TYPES_BASE_DIR, 'cookbook_repository'))
28
+ require File.normalize_path(File.join(CORE_PAYLOAD_TYPES_BASE_DIR, 'cookbook_sequence'))
29
+ require File.normalize_path(File.join(CORE_PAYLOAD_TYPES_BASE_DIR, 'cookbook_position'))
30
+ require File.normalize_path(File.join(CORE_PAYLOAD_TYPES_BASE_DIR, 'dev_repository'))
31
+ require File.normalize_path(File.join(CORE_PAYLOAD_TYPES_BASE_DIR, 'dev_repositories'))
32
+ require File.normalize_path(File.join(CORE_PAYLOAD_TYPES_BASE_DIR, 'executable_bundle'))
33
+ require File.normalize_path(File.join(CORE_PAYLOAD_TYPES_BASE_DIR, 'event_categories'))
34
+ require File.normalize_path(File.join(CORE_PAYLOAD_TYPES_BASE_DIR, 'recipe_instantiation'))
35
+ require File.normalize_path(File.join(CORE_PAYLOAD_TYPES_BASE_DIR, 'repositories_bundle'))
36
+ require File.normalize_path(File.join(CORE_PAYLOAD_TYPES_BASE_DIR, 'software_repository_instantiation'))
37
+ require File.normalize_path(File.join(CORE_PAYLOAD_TYPES_BASE_DIR, 'right_script_attachment'))
38
+ require File.normalize_path(File.join(CORE_PAYLOAD_TYPES_BASE_DIR, 'right_script_instantiation'))
39
+ require File.normalize_path(File.join(CORE_PAYLOAD_TYPES_BASE_DIR, 'login_policy'))
40
+ require File.normalize_path(File.join(CORE_PAYLOAD_TYPES_BASE_DIR, 'login_user'))
41
+ require File.normalize_path(File.join(CORE_PAYLOAD_TYPES_BASE_DIR, 'runlist_policy'))
42
+ require File.normalize_path(File.join(CORE_PAYLOAD_TYPES_BASE_DIR, 'secure_document'))
43
+ require File.normalize_path(File.join(CORE_PAYLOAD_TYPES_BASE_DIR, 'secure_document_location'))
44
+ require File.normalize_path(File.join(CORE_PAYLOAD_TYPES_BASE_DIR, 'planned_volume'))
@@ -0,0 +1,61 @@
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
+
24
+ module RightScale
25
+
26
+ # Individual cookbook
27
+ class Cookbook
28
+
29
+ include Serializable
30
+
31
+ # (String) Cookbook SHA hash.
32
+ attr_accessor :hash
33
+
34
+ # (String) Authentication token
35
+ attr_accessor :token
36
+
37
+ # (String) User readable cookbook name
38
+ attr_accessor :name
39
+
40
+ # Initialize fields from given arguments
41
+ def initialize(*args)
42
+ @hash = args[0] if args.size > 0
43
+ @token = args[1] if args.size > 1
44
+ @name = args[2] if args.size > 2
45
+ end
46
+
47
+ # Array of serialized fields given to constructor
48
+ def serialized_members
49
+ [ @hash, @token, @name ]
50
+ end
51
+
52
+ # Human friendly name used for audits
53
+ #
54
+ # === Return
55
+ # name(String):: Cookbook repository display name
56
+ def display_name
57
+ name = "Cookbook #{@name}:#{@hash}"
58
+ end
59
+ alias :to_s :display_name
60
+ end
61
+ end
@@ -0,0 +1,46 @@
1
+ #--
2
+ # Copyright: Copyright (c) 2010-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 NONINFRINGEMENT.
18
+ # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
19
+ # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20
+ # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21
+ # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ #++
23
+
24
+ module RightScale
25
+ # Cookbook / position pairs.
26
+ class CookbookPosition
27
+ include Serializable
28
+
29
+ # (String) relative position in the filesystem that the cookbook
30
+ # should be expanded at.
31
+ attr_accessor :position
32
+ # (Cookbook) cookbook to expand.
33
+ attr_accessor :cookbook
34
+
35
+ # Initialize fields from given arguments
36
+ def initialize(*args)
37
+ @position = args[0]
38
+ @cookbook = args[1] if args.size > 1
39
+ end
40
+
41
+ # Array of serialized fields given to constructor
42
+ def serialized_members
43
+ [ @position, @cookbook ]
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,116 @@
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
+
24
+ module RightScale
25
+
26
+ # Cookbook repository
27
+ class CookbookRepository
28
+
29
+ include Serializable
30
+
31
+ # List of characters used to build cookbooks sha1 hash path component
32
+ CHARS = ("a".."z").to_a + ("A".."Z").to_a + (0..9).to_a
33
+
34
+ # (Symbol) Type of repository: one of :git, :svn, :download or :local
35
+ # * :git denotes a 'git' repository that should be retrieved via 'git clone'
36
+ # * :svn denotes a 'svn' repository that should be retrieved via 'svn checkout'
37
+ # * :download denotes a tar ball that should be retrieved via HTTP GET (HTTPS if url starts with https://)
38
+ # * :local denotes an already available cookbook (useful for testing)
39
+ attr_accessor :repo_type
40
+
41
+ # (String) URI to repository (e.g. git://github.com/opscode/chef-repo.git)
42
+ attr_accessor :url
43
+
44
+ # (String) git commit or svn branch that should be used to retrieve repository
45
+ # Use 'master' for git and 'trunk' for svn if tag is nil.
46
+ # Not used for raw repositories.
47
+ attr_accessor :tag
48
+
49
+ # (Array) Path to cookbooks inside repostory
50
+ # Append to the location of the repository on disk prior to running chef.
51
+ # Optional (use location of repository as cookbook path if nil)
52
+ attr_accessor :cookbooks_path
53
+
54
+ # (String) Private SSH key used to retrieve git repositories
55
+ # Not used for svn and raw repositories.
56
+ attr_accessor :ssh_key
57
+
58
+ # (String) Username used to retrieve svn and raw repositories
59
+ # Not used for git repositories.
60
+ attr_accessor :username
61
+
62
+ # (String) Password used to retrieve svn and raw repositories
63
+ # Not used for git repositories.
64
+ attr_accessor :password
65
+
66
+ # Initialize fields from given arguments
67
+ def initialize(*args)
68
+ @repo_type = args[0].to_sym
69
+ @url = args[1] if args.size > 1
70
+ @tag = args[2] if args.size > 2
71
+ @cookbooks_path = args[3] if args.size > 3
72
+ @ssh_key = args[4] if args.size > 4
73
+ @username = args[5] if args.size > 5
74
+ @password = args[6] if args.size > 6
75
+ end
76
+
77
+ # Instantiate from hash
78
+ # Keys of hash should be the corresponding symolized field name
79
+ #
80
+ # === Parameters
81
+ # h(Hash):: Hash of values used to initialize cookbook repository
82
+ #
83
+ # === Return
84
+ # repo(RightScale::CookbookRepository):: Corresponding instance
85
+ def self.from_hash(h)
86
+ repo = new(h[:repo_type], h[:url], h[:tag], h[:cookbooks_path], h[:ssh_key], h[:username], h[:password])
87
+ end
88
+
89
+ # Array of serialized fields given to constructor
90
+ def serialized_members
91
+ [ @repo_type, @url, @tag, @cookbooks_path, @ssh_key, @username, @password ]
92
+ end
93
+
94
+ # Human friendly name used for audits
95
+ #
96
+ # === Return
97
+ # name(String):: Cookbook repository display name
98
+ def display_name
99
+ name = @url + (@tag && !@tag.empty? ? ":#{@tag}" : '')
100
+ end
101
+ alias :to_s :display_name
102
+
103
+ # SVN username or git SSH key
104
+ # Provide compatibility for scraper
105
+ def first_credential
106
+ @ssh_key || @username
107
+ end
108
+
109
+ # SVN password
110
+ # Provide compatibility for scraper
111
+ def second_credential
112
+ @password
113
+ end
114
+
115
+ end
116
+ end
@@ -0,0 +1,70 @@
1
+ #--
2
+ # Copyright: Copyright (c) 2010-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 NONINFRINGEMENT.
18
+ # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
19
+ # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20
+ # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21
+ # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ #++
23
+
24
+ module RightScale
25
+ # Sequence of cookbooks and where to put them.
26
+ class CookbookSequence
27
+ include Serializable
28
+
29
+ # (Array) relative cookbook paths to use from the repository root.
30
+ attr_accessor :paths
31
+ # (Array) CookbookPosition objects for each cookbook.
32
+ attr_accessor :positions
33
+ # (String) Hash for the repository this came from
34
+ attr_accessor :hash
35
+
36
+ # Initialize fields from given arguments
37
+ def initialize(*args)
38
+ @paths = args[0]
39
+ @positions = args[1] if args.size > 1
40
+ @hash = args[2] if args.size > 2
41
+ end
42
+
43
+ # Array of serialized fields given to constructor
44
+ def serialized_members
45
+ [ @paths, @positions, @hash ]
46
+ end
47
+
48
+ # Reorder @positions so it respects @path. The comparison rule is
49
+ # as follows:
50
+ # - for two pairs of cookbooks [a_pos, a_cookbook], [b_pos, b_cookbook]
51
+ # - let a_index be the index of the first element of cookbooks_path that is a prefix for a_pos.
52
+ # - let b_index be similarly defined on b_pos.
53
+ # - if a_index != b_index, sort on a_index and b_index.
54
+ # - otherwise lexically sort on a_pos and b_pos.
55
+ def sort_by_path!
56
+ indices = @positions.map {|a|
57
+ @paths.index(@paths.find {|p| a.position.start_with? p})
58
+ }
59
+ @positions = indices.zip(@positions).sort {|a, b|
60
+ aindex, acb = a
61
+ bindex, bcb = b
62
+ if aindex == bindex
63
+ acb.position <=> bcb.position
64
+ else
65
+ aindex <=> bindex
66
+ end
67
+ }.map {|p| p.last}
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,100 @@
1
+ #--
2
+ # Copyright: Copyright (c) 2010-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 NONINFRINGEMENT.
18
+ # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
19
+ # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20
+ # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21
+ # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ #++
23
+
24
+ require File.join(File.dirname(__FILE__), 'dev_repository')
25
+
26
+ module RightScale
27
+ # Sequence of cookbooks to be checked out on the instance.
28
+ class DevRepositories
29
+ include Serializable
30
+
31
+ attr_accessor :repositories
32
+
33
+ # Initialize fields from given arguments
34
+ def initialize(*args)
35
+ @repositories = args[0] || {}
36
+ end
37
+
38
+ # Array of serialized fields given to constructor
39
+ def serialized_members
40
+ [ @repositories ]
41
+ end
42
+
43
+ # Add a repository...
44
+ #
45
+ # === Parameters
46
+ # (Hash):: collection of repos to be checked out on the instance
47
+ # :repo_sha (String):: the hash id (SHA) of the repository
48
+ # :repo_detail (Hash):: info needed to checkout this repo
49
+ # {
50
+ # <Symbol> Type of repository: one of :git, :svn, :download or :local
51
+ # * :git denotes a 'git' repository that should be retrieved via 'git clone'
52
+ # * :svn denotes a 'svn' repository that should be retrieved via 'svn checkout'
53
+ # * :download denotes a tar ball that should be retrieved via HTTP GET (HTTPS if uri starts with https://)
54
+ # * :local denotes cookbook that is already local and doesn't need to be retrieved
55
+ # :repo_type => <Symbol>,
56
+ # <String> URL to repository (e.g. git://github.com/opscode/chef-repo.git)
57
+ # :url => <String>,
58
+ # <String> git commit or svn branch that should be used to retrieve repository
59
+ # Optional, use 'master' for git and 'trunk' for svn if tag is nil.
60
+ # Not used for raw repositories.
61
+ # :tag => <String>,
62
+ # <Array> Path to cookbooks inside repostory
63
+ # Optional (use location of repository as cookbook path if nil)
64
+ # :cookbooks_path => <Array>,
65
+ # <String> Private SSH key used to retrieve git repositories
66
+ # Optional, not used for svn and raw repositories.
67
+ # :ssh_key => <String>,
68
+ # <String> Username used to retrieve svn and raw repositories
69
+ # Optional, not used for git repositories.
70
+ # :username => <String>,
71
+ # <String> Password used to retrieve svn and raw repositories
72
+ # Optional, not used for git repositories.
73
+ # :password => <String>
74
+ # }
75
+ # :cookbook_positions (Array):: List of CookbookPositions to be developed. Represents the subset of cookbooks identified as the "dev cookbooks"
76
+ #
77
+ # === Return
78
+ # result(Hash):: The entry added to the collection of repositories
79
+ def add_repo(repo_sha, repo_detail, cookbook_positions)
80
+ @repositories ||= {}
81
+ @repositories[repo_sha] = DevRepository.new(repo_detail[:repo_type],
82
+ repo_detail[:url],
83
+ repo_detail[:tag],
84
+ repo_detail[:cookboooks_path],
85
+ repo_detail[:ssh_key],
86
+ repo_detail[:username],
87
+ repo_detail[:password],
88
+ repo_sha,
89
+ cookbook_positions)
90
+ end
91
+
92
+ #
93
+ # === Return
94
+ # (Boolean):: true if there are no repositories, false otherwise
95
+ def empty?
96
+ @repositories.count == 0
97
+ end
98
+ end
99
+ end
100
+