puppet 2.6.0 → 2.6.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of puppet might be problematic. Click here for more details.

Files changed (246) hide show
  1. data/CHANGELOG +123 -0
  2. data/conf/redhat/puppet.spec +8 -2
  3. data/conf/solaris/smf/svc-puppetd +1 -1
  4. data/conf/solaris/smf/svc-puppetmasterd +1 -1
  5. data/conf/suse/client.init +4 -4
  6. data/conf/suse/fileserver.conf +12 -0
  7. data/conf/suse/logrotate +10 -0
  8. data/conf/suse/puppet.conf +25 -0
  9. data/conf/suse/puppet.spec +114 -49
  10. data/conf/suse/ruby-env.patch +17 -0
  11. data/conf/suse/server.init +4 -4
  12. data/ext/logcheck/puppet +23 -23
  13. data/ext/puppet-load.rb +357 -0
  14. data/ext/puppetstoredconfigclean.rb +3 -3
  15. data/ext/rack/files/config.ru +3 -5
  16. data/ext/vim/syntax/puppet.vim +6 -5
  17. data/install.rb +12 -11
  18. data/lib/puppet.rb +1 -1
  19. data/lib/puppet/agent.rb +3 -1
  20. data/lib/puppet/application.rb +2 -3
  21. data/lib/puppet/application/agent.rb +4 -0
  22. data/lib/puppet/application/apply.rb +14 -6
  23. data/lib/puppet/application/describe.rb +1 -1
  24. data/lib/puppet/application/doc.rb +2 -36
  25. data/lib/puppet/application/master.rb +0 -3
  26. data/lib/puppet/application/queue.rb +1 -0
  27. data/lib/puppet/configurer.rb +4 -0
  28. data/lib/puppet/daemon.rb +1 -1
  29. data/lib/puppet/defaults.rb +38 -44
  30. data/lib/puppet/file_serving/indirection_hooks.rb +2 -2
  31. data/lib/puppet/indirector/facts/memory.rb +1 -1
  32. data/lib/puppet/indirector/node/exec.rb +1 -1
  33. data/lib/puppet/indirector/node/ldap.rb +9 -53
  34. data/lib/puppet/indirector/node/memory.rb +1 -1
  35. data/lib/puppet/indirector/yaml.rb +6 -9
  36. data/lib/puppet/network/format_handler.rb +6 -0
  37. data/lib/puppet/network/formats.rb +4 -4
  38. data/lib/puppet/network/http/handler.rb +1 -1
  39. data/lib/puppet/network/http/rack.rb +3 -0
  40. data/lib/puppet/network/http/rack/rest.rb +1 -1
  41. data/lib/puppet/network/rest_authconfig.rb +6 -3
  42. data/lib/puppet/node/environment.rb +15 -5
  43. data/lib/puppet/parameter/value_collection.rb +3 -3
  44. data/lib/puppet/parser/ast/function.rb +0 -1
  45. data/lib/puppet/parser/ast/leaf.rb +1 -1
  46. data/lib/puppet/parser/ast/resource.rb +4 -3
  47. data/lib/puppet/parser/ast/resource_reference.rb +9 -2
  48. data/lib/puppet/parser/compiler.rb +12 -14
  49. data/lib/puppet/parser/files.rb +1 -1
  50. data/lib/puppet/parser/functions.rb +2 -2
  51. data/lib/puppet/parser/functions/defined.rb +1 -1
  52. data/lib/puppet/parser/functions/extlookup.rb +157 -0
  53. data/lib/puppet/parser/functions/file.rb +1 -1
  54. data/lib/puppet/parser/functions/inline_template.rb +6 -5
  55. data/lib/puppet/parser/functions/md5.rb +5 -0
  56. data/lib/puppet/parser/functions/realize.rb +1 -1
  57. data/lib/puppet/parser/functions/regsubst.rb +19 -19
  58. data/lib/puppet/parser/functions/require.rb +2 -3
  59. data/lib/puppet/parser/functions/split.rb +1 -1
  60. data/lib/puppet/parser/functions/sprintf.rb +1 -1
  61. data/lib/puppet/parser/functions/template.rb +4 -2
  62. data/lib/puppet/parser/functions/versioncmp.rb +12 -12
  63. data/lib/puppet/parser/lexer.rb +13 -14
  64. data/lib/puppet/parser/resource.rb +2 -7
  65. data/lib/puppet/parser/resource/param.rb +1 -1
  66. data/lib/puppet/parser/scope.rb +35 -0
  67. data/lib/puppet/parser/type_loader.rb +1 -1
  68. data/lib/puppet/property.rb +5 -5
  69. data/lib/puppet/provider.rb +3 -3
  70. data/lib/puppet/provider/group/groupadd.rb +1 -1
  71. data/lib/puppet/provider/group/ldap.rb +3 -3
  72. data/lib/puppet/provider/group/pw.rb +1 -1
  73. data/lib/puppet/provider/package/apple.rb +1 -1
  74. data/lib/puppet/provider/package/apt.rb +5 -1
  75. data/lib/puppet/provider/package/aptitude.rb +1 -1
  76. data/lib/puppet/provider/package/aptrpm.rb +1 -1
  77. data/lib/puppet/provider/package/blastwave.rb +1 -1
  78. data/lib/puppet/provider/package/dpkg.rb +2 -2
  79. data/lib/puppet/provider/package/fink.rb +1 -1
  80. data/lib/puppet/provider/package/gem.rb +1 -1
  81. data/lib/puppet/provider/package/openbsd.rb +1 -1
  82. data/lib/puppet/provider/package/rpm.rb +1 -1
  83. data/lib/puppet/provider/package/rug.rb +1 -1
  84. data/lib/puppet/provider/package/sunfreeware.rb +2 -2
  85. data/lib/puppet/provider/package/up2date.rb +1 -1
  86. data/lib/puppet/provider/package/urpmi.rb +1 -1
  87. data/lib/puppet/provider/package/yum.rb +1 -1
  88. data/lib/puppet/provider/package/zypper.rb +1 -1
  89. data/lib/puppet/provider/service/base.rb +1 -1
  90. data/lib/puppet/provider/service/bsd.rb +2 -2
  91. data/lib/puppet/provider/service/debian.rb +2 -2
  92. data/lib/puppet/provider/service/gentoo.rb +2 -2
  93. data/lib/puppet/provider/service/init.rb +2 -2
  94. data/lib/puppet/provider/service/redhat.rb +2 -2
  95. data/lib/puppet/provider/user/ldap.rb +3 -3
  96. data/lib/puppet/provider/user/pw.rb +1 -1
  97. data/lib/puppet/provider/user/user_role_add.rb +1 -1
  98. data/lib/puppet/provider/user/useradd.rb +1 -1
  99. data/lib/puppet/rails/host.rb +1 -0
  100. data/lib/puppet/reference/configuration.rb +37 -34
  101. data/lib/puppet/reference/indirection.rb +3 -4
  102. data/lib/puppet/reference/metaparameter.rb +0 -8
  103. data/lib/puppet/reference/network.rb +6 -4
  104. data/lib/puppet/reference/providers.rb +4 -4
  105. data/lib/puppet/reference/report.rb +5 -6
  106. data/lib/puppet/reference/type.rb +14 -14
  107. data/lib/puppet/reports/http.rb +1 -1
  108. data/lib/puppet/reports/rrdgraph.rb +8 -9
  109. data/lib/puppet/reports/store.rb +2 -2
  110. data/lib/puppet/reports/tagmail.rb +12 -13
  111. data/lib/puppet/resource.rb +15 -115
  112. data/lib/puppet/resource/catalog.rb +1 -1
  113. data/lib/puppet/resource/type.rb +26 -3
  114. data/lib/puppet/resource/type_collection.rb +3 -6
  115. data/lib/puppet/simple_graph.rb +4 -5
  116. data/lib/puppet/transaction/resource_harness.rb +1 -1
  117. data/lib/puppet/type.rb +100 -92
  118. data/lib/puppet/type/augeas.rb +44 -45
  119. data/lib/puppet/type/computer.rb +2 -2
  120. data/lib/puppet/type/cron.rb +29 -29
  121. data/lib/puppet/type/exec.rb +66 -67
  122. data/lib/puppet/type/file.rb +25 -25
  123. data/lib/puppet/type/file/content.rb +7 -1
  124. data/lib/puppet/type/file/ensure.rb +13 -13
  125. data/lib/puppet/type/file/mode.rb +6 -6
  126. data/lib/puppet/type/file/selcontext.rb +5 -5
  127. data/lib/puppet/type/file/source.rb +36 -26
  128. data/lib/puppet/type/filebucket.rb +5 -6
  129. data/lib/puppet/type/group.rb +1 -2
  130. data/lib/puppet/type/host.rb +3 -6
  131. data/lib/puppet/type/k5login.rb +3 -3
  132. data/lib/puppet/type/macauthorization.rb +1 -2
  133. data/lib/puppet/type/mailalias.rb +0 -1
  134. data/lib/puppet/type/maillist.rb +0 -1
  135. data/lib/puppet/type/mcx.rb +9 -9
  136. data/lib/puppet/type/mount.rb +9 -10
  137. data/lib/puppet/type/notify.rb +0 -1
  138. data/lib/puppet/type/package.rb +34 -36
  139. data/lib/puppet/type/resources.rb +1 -5
  140. data/lib/puppet/type/schedule.rb +9 -12
  141. data/lib/puppet/type/selboolean.rb +2 -7
  142. data/lib/puppet/type/selmodule.rb +3 -4
  143. data/lib/puppet/type/service.rb +9 -9
  144. data/lib/puppet/type/ssh_authorized_key.rb +2 -3
  145. data/lib/puppet/type/sshkey.rb +4 -7
  146. data/lib/puppet/type/stage.rb +5 -4
  147. data/lib/puppet/type/tidy.rb +3 -3
  148. data/lib/puppet/type/user.rb +1 -2
  149. data/lib/puppet/type/whit.rb +7 -0
  150. data/lib/puppet/type/yumrepo.rb +16 -3
  151. data/lib/puppet/type/zfs.rb +1 -2
  152. data/lib/puppet/type/zone.rb +28 -28
  153. data/lib/puppet/type/zpool.rb +10 -5
  154. data/lib/puppet/util/autoload.rb +17 -5
  155. data/lib/puppet/util/cacher.rb +15 -10
  156. data/lib/puppet/util/command_line/puppetdoc +5 -5
  157. data/lib/puppet/util/command_line/puppetrun +0 -2
  158. data/lib/puppet/util/command_line/ralsh +13 -13
  159. data/lib/puppet/util/docs.rb +5 -12
  160. data/lib/puppet/util/monkey_patches.rb +5 -2
  161. data/lib/puppet/util/nagios_maker.rb +4 -5
  162. data/lib/puppet/util/provider_features.rb +2 -2
  163. data/lib/puppet/util/rdoc.rb +1 -1
  164. data/lib/puppet/util/rdoc/parser.rb +5 -3
  165. data/lib/puppet/util/reference.rb +3 -52
  166. data/man/man5/puppet.conf.5 +2072 -1526
  167. data/man/man8/filebucket.8 +104 -106
  168. data/man/man8/pi.8 +14 -47
  169. data/man/man8/puppet.8 +8 -9
  170. data/man/man8/puppetca.8 +168 -129
  171. data/man/man8/puppetd.8 +282 -226
  172. data/man/man8/puppetdoc.8 +103 -103
  173. data/man/man8/puppetmasterd.8 +51 -71
  174. data/man/man8/puppetqd.8 +18 -53
  175. data/man/man8/puppetrun.8 +163 -143
  176. data/man/man8/ralsh.8 +77 -114
  177. data/spec/integration/indirector/bucket_file/rest_spec.rb +1 -0
  178. data/spec/integration/indirector/certificate/rest_spec.rb +1 -0
  179. data/spec/integration/indirector/certificate_request/rest_spec.rb +1 -0
  180. data/spec/integration/indirector/certificate_revocation_list/rest_spec.rb +1 -0
  181. data/spec/integration/indirector/report/rest_spec.rb +1 -0
  182. data/spec/integration/indirector/rest_spec.rb +1 -0
  183. data/spec/integration/network/server/webrick_spec.rb +1 -0
  184. data/spec/integration/parser/compiler_spec.rb +43 -0
  185. data/spec/integration/provider/mailalias/aliases_spec.rb +5 -5
  186. data/spec/integration/ssl/certificate_authority_spec.rb +1 -0
  187. data/spec/integration/ssl/certificate_request_spec.rb +1 -0
  188. data/spec/integration/ssl/certificate_revocation_list_spec.rb +1 -0
  189. data/spec/integration/ssl/host_spec.rb +1 -0
  190. data/spec/monkey_patches/add_confine_and_runnable_to_rspec_dsl.rb +0 -1
  191. data/spec/monkey_patches/publicize_methods.rb +11 -0
  192. data/spec/shared_behaviours/file_serving.rb +12 -1
  193. data/spec/spec_helper.rb +6 -25
  194. data/spec/unit/application/apply_spec.rb +22 -4
  195. data/spec/unit/application/cert_spec.rb +1 -1
  196. data/spec/unit/application/doc_spec.rb +0 -19
  197. data/spec/unit/application/master_spec.rb +1 -1
  198. data/spec/unit/application_spec.rb +2 -12
  199. data/spec/unit/indirector/node/ldap_spec.rb +19 -21
  200. data/spec/unit/indirector/yaml_spec.rb +18 -6
  201. data/spec/unit/network/http/rack/rest_spec.rb +3 -3
  202. data/spec/unit/network/http/webrick/rest_spec.rb +1 -0
  203. data/spec/unit/node/environment_spec.rb +32 -3
  204. data/spec/unit/node/facts_spec.rb +13 -2
  205. data/spec/unit/parameter/value_collection_spec.rb +2 -2
  206. data/spec/unit/parser/ast/leaf_spec.rb +4 -0
  207. data/spec/unit/parser/ast/resource_reference_spec.rb +0 -5
  208. data/spec/unit/parser/ast/resource_spec.rb +7 -0
  209. data/spec/unit/parser/compiler_spec.rb +12 -1
  210. data/spec/unit/parser/files_spec.rb +3 -3
  211. data/spec/unit/parser/functions/extlookup_spec.rb +95 -0
  212. data/spec/unit/parser/functions/include_spec.rb +33 -0
  213. data/spec/unit/parser/functions/require_spec.rb +1 -1
  214. data/spec/unit/parser/functions/tag_spec.rb +1 -0
  215. data/spec/unit/parser/lexer_spec.rb +10 -1
  216. data/spec/unit/parser/resource_spec.rb +3 -9
  217. data/spec/unit/parser/type_loader_spec.rb +1 -1
  218. data/spec/unit/provider/ssh_authorized_key/parsed_spec.rb +4 -2
  219. data/spec/unit/rails/resource_spec.rb +1 -1
  220. data/spec/unit/reports/tagmail_spec.rb +2 -2
  221. data/spec/unit/resource/catalog_spec.rb +1 -1
  222. data/spec/unit/resource/type_collection_spec.rb +35 -0
  223. data/spec/unit/resource/type_spec.rb +19 -1
  224. data/spec/unit/resource_spec.rb +0 -36
  225. data/spec/unit/simple_graph_spec.rb +12 -2
  226. data/spec/unit/transaction/resource_harness_spec.rb +1 -1
  227. data/spec/unit/type/file/content_spec.rb +2 -1
  228. data/spec/unit/type/schedule_spec.rb +1 -1
  229. data/spec/unit/type/service_spec.rb +8 -0
  230. data/spec/unit/type/user_spec.rb +5 -0
  231. data/spec/unit/util/backups_spec.rb +0 -1
  232. data/spec/unit/util/rdoc/parser_spec.rb +3 -3
  233. data/spec/unit/util/rdoc_spec.rb +13 -0
  234. data/test/certmgr/support.rb +2 -1
  235. data/test/language/parser.rb +6 -6
  236. data/test/lib/puppettest.rb +3 -23
  237. data/test/lib/puppettest/fakes.rb +1 -1
  238. data/test/lib/puppettest/support/assertions.rb +0 -2
  239. data/test/lib/puppettest/support/utils.rb +25 -20
  240. data/test/ral/manager/attributes.rb +4 -1
  241. metadata +15 -9
  242. data/conf/suse/puppet.suse.patch +0 -16
  243. data/ext/extlookup.rb +0 -181
  244. data/ext/puppetlast +0 -16
  245. data/tasks/rake/tracdocs.rake +0 -8
  246. data/test/lib/mocha_standalone.rb +0 -2
@@ -19,8 +19,8 @@ module Puppet::FileServing::IndirectionHooks
19
19
  return PROTOCOL_MAP["file"] if request.key =~ /^#{::File::SEPARATOR}/
20
20
  return PROTOCOL_MAP["file"] if request.protocol == "file"
21
21
 
22
- # We're heading over the wire the protocol is 'puppet' and we've got a server name or we're not named 'puppet'
23
- if request.protocol == "puppet" and (request.server or Puppet.settings[:name] != "puppet")
22
+ # We're heading over the wire the protocol is 'puppet' and we've got a server name or we're not named 'apply' or 'puppet'
23
+ if request.protocol == "puppet" and (request.server or !["puppet","apply"].include?(Puppet.settings[:name]))
24
24
  return PROTOCOL_MAP["puppet"]
25
25
  end
26
26
 
@@ -3,7 +3,7 @@ require 'puppet/indirector/memory'
3
3
 
4
4
  class Puppet::Node::Facts::Memory < Puppet::Indirector::Memory
5
5
  desc "Keep track of facts in memory but nowhere else. This is used for
6
- one-time compiles, such as what the stand-alone ``puppet`` does.
6
+ one-time compiles, such as what the stand-alone `puppet` does.
7
7
  To use this terminus, you must load it with the data you want it
8
8
  to contain."
9
9
  end
@@ -3,7 +3,7 @@ require 'puppet/indirector/exec'
3
3
 
4
4
  class Puppet::Node::Exec < Puppet::Indirector::Exec
5
5
  desc "Call an external program to get node information. See
6
- the `ExternalNodes`:trac: page for more information."
6
+ the [External Nodes](http://docs.puppetlabs.com/guides/external_nodes.html) page for more information."
7
7
  include Puppet::Util
8
8
 
9
9
  def command
@@ -3,9 +3,9 @@ require 'puppet/indirector/ldap'
3
3
 
4
4
  class Puppet::Node::Ldap < Puppet::Indirector::Ldap
5
5
  desc "Search in LDAP for node configuration information. See
6
- the `LdapNodes`:trac: page for more information. This will first
6
+ the [LDAP Nodes](http://projects.puppetlabs.com/projects/puppet/wiki/Ldap_Nodes) page for more information. This will first
7
7
  search for whatever the certificate name is, then (if that name
8
- contains a '.') for the short name, then 'default'."
8
+ contains a `.`) for the short name, then `default`."
9
9
 
10
10
  # The attributes that Puppet class information is stored in.
11
11
  def class_attributes
@@ -19,30 +19,10 @@ class Puppet::Node::Ldap < Puppet::Indirector::Ldap
19
19
  # LAK:NOTE Unfortunately, the ldap support is too stupid to throw anything
20
20
  # but LDAP::ResultError, even on bad connections, so we are rough handed
21
21
  # with our error handling.
22
- def name2hash(name,name_env,node_type)
22
+ def name2hash(name)
23
23
  info = nil
24
- ldapsearch(search_filter(name)) {
25
- |entry| info = entry2hash(entry)
26
- if info[:environment]
27
- if name_env == info[:environment]
28
- return info
29
- else
30
- info = nil
31
- end
32
- else
33
- info_env = "production"
34
- if name_env == info[:environment]
35
- return info
36
- else
37
- info = nil
38
- end
39
- end
40
- }
41
- if node_type == 'parent'
42
- raise Puppet::Error.new("Could not find node '#{name}' with environment '#{name_env}'")
43
- end
44
-
45
- info = name2hash('default',name_env,'parent')
24
+ ldapsearch(search_filter(name)) { |entry| info = entry2hash(entry) }
25
+ info
46
26
  end
47
27
 
48
28
  # Look for our node in ldap.
@@ -53,18 +33,9 @@ class Puppet::Node::Ldap < Puppet::Indirector::Ldap
53
33
 
54
34
  node = nil
55
35
  names.each do |name|
56
- facts = Puppet::Node::Facts.find(name)
57
- if facts.values["environment"]
58
- name_env = facts.values["environment"]
59
- else
60
- name_env = "production"
61
- end
62
- info = name2hash(name,name_env,'child')
63
- next if info == nil
36
+ next unless info = name2hash(name)
64
37
 
65
- if info
66
- break if node = info2node(request.key, info)
67
- end
38
+ break if node = info2node(request.key, info)
68
39
  end
69
40
 
70
41
  node
@@ -200,29 +171,14 @@ class Puppet::Node::Ldap < Puppet::Indirector::Ldap
200
171
 
201
172
  # Find information for our parent and merge it into the current info.
202
173
  def find_and_merge_parent(parent, information)
203
-
204
- if information[:environment]
205
- name_env = information[:environment]
206
- else
207
- name_env = 'production'
208
- end
209
-
210
- parent_info = name2hash(parent,name_env,'parent')
211
- if parent_info
174
+ parent_info = name2hash(parent) || raise(Puppet::Error.new("Could not find parent node '#{parent}'"))
212
175
  information[:classes] += parent_info[:classes]
213
176
  parent_info[:parameters].each do |param, value|
214
- # Specifically test for whether it's set, so false values are handled
215
- # correctly.
177
+ # Specifically test for whether it's set, so false values are handled correctly.
216
178
  information[:parameters][param] = value unless information[:parameters].include?(param)
217
179
  end
218
-
219
180
  information[:environment] ||= parent_info[:environment]
220
181
  parent_info[:parent]
221
- else
222
- raise Puppet::Error.new("Could not find parent node '#{parent}'")
223
- nil
224
- end
225
-
226
182
  end
227
183
 
228
184
  # Take a name and a hash, and return a node instance.
@@ -3,7 +3,7 @@ require 'puppet/indirector/memory'
3
3
 
4
4
  class Puppet::Node::Memory < Puppet::Indirector::Memory
5
5
  desc "Keep track of nodes in memory but nowhere else. This is used for
6
- one-time compiles, such as what the stand-alone ``puppet`` does.
6
+ one-time compiles, such as what the stand-alone `puppet` does.
7
7
  To use this terminus, you must load it with the data you want it
8
8
  to contain; it is only useful for developers and should generally not
9
9
  be chosen by a normal user."
@@ -41,19 +41,16 @@ class Puppet::Indirector::Yaml < Puppet::Indirector::Terminus
41
41
  end
42
42
  end
43
43
 
44
- # Get the yaml directory
45
- def base
46
- Puppet.run_mode.master? ? Puppet[:yamldir] : Puppet[:clientyamldir]
47
- end
48
-
49
44
  # Return the path to a given node's file.
50
- def path(name)
51
- File.join(base, self.class.indirection_name.to_s, name.to_s + ".yaml")
45
+ def path(name,ext='.yaml')
46
+ base = Puppet.run_mode.master? ? Puppet[:yamldir] : Puppet[:clientyamldir]
47
+ File.join(base, self.class.indirection_name.to_s, name.to_s + ext)
52
48
  end
53
49
 
54
- # Do a glob on the yaml directory, loading each file found
55
50
  def search(request)
56
- Dir.glob(File.join(base, self.class.indirection_name.to_s, request.key)).collect { |f| YAML.load_file(f) }
51
+ Dir.glob(path(request.key,'')).collect do |file|
52
+ YAML.load_file(file)
53
+ end
57
54
  end
58
55
 
59
56
  private
@@ -37,6 +37,12 @@ module Puppet::Network::FormatHandler
37
37
  instance
38
38
  end
39
39
 
40
+ def self.create_serialized_formats(name,options = {},&block)
41
+ ["application/x-#{name}", "application/#{name}", "text/x-#{name}", "text/#{name}"].each { |mime_type|
42
+ create name, {:mime => mime_type}.update(options), &block
43
+ }
44
+ end
45
+
40
46
  def self.extended(klass)
41
47
  klass.extend(ClassMethods)
42
48
 
@@ -1,6 +1,6 @@
1
1
  require 'puppet/network/format_handler'
2
2
 
3
- Puppet::Network::FormatHandler.create(:yaml, :mime => "text/yaml") do
3
+ Puppet::Network::FormatHandler.create_serialized_formats(:yaml) do
4
4
  # Yaml doesn't need the class name; it's serialized.
5
5
  def intern(klass, text)
6
6
  YAML.load(text)
@@ -29,7 +29,7 @@ end
29
29
  # This is a "special" format which is used for the moment only when sending facts
30
30
  # as REST GET parameters (see Puppet::Configurer::FactHandler).
31
31
  # This format combines a yaml serialization, then zlib compression and base64 encoding.
32
- Puppet::Network::FormatHandler.create(:b64_zlib_yaml, :mime => "text/b64_zlib_yaml") do
32
+ Puppet::Network::FormatHandler.create_serialized_formats(:b64_zlib_yaml) do
33
33
  require 'base64'
34
34
 
35
35
  def use_zlib?
@@ -127,7 +127,7 @@ Puppet::Network::FormatHandler.create(:raw, :mime => "application/x-raw", :weigh
127
127
  end
128
128
  end
129
129
 
130
- Puppet::Network::FormatHandler.create(:pson, :mime => "text/pson", :weight => 10, :required_methods => [:render_method, :intern_method]) do
130
+ Puppet::Network::FormatHandler.create_serialized_formats(:pson, :weight => 10, :required_methods => [:render_method, :intern_method]) do
131
131
  confine :true => Puppet.features.pson?
132
132
 
133
133
  def intern(klass, text)
@@ -159,4 +159,4 @@ Puppet::Network::FormatHandler.create(:pson, :mime => "text/pson", :weight => 10
159
159
  end
160
160
 
161
161
  # This is really only ever going to be used for Catalogs.
162
- Puppet::Network::FormatHandler.create(:dot, :mime => "text/dot", :required_methods => [:render_method])
162
+ Puppet::Network::FormatHandler.create_serialized_formats(:dot, :required_methods => [:render_method])
@@ -117,7 +117,7 @@ module Puppet::Network::HTTP::Handler
117
117
  result = indirection_request.model.search(indirection_request.key, indirection_request.to_hash)
118
118
 
119
119
  if result.nil? or (result.is_a?(Array) and result.empty?)
120
- return do_exception(response, "Could not find instances in #{indirection_request.indirection_name} with '#{indirection_request.to_hash.inspect}'", 404)
120
+ return do_exception(response, "Could not find instances in #{indirection_request.indirection_name} with '#{indirection_request.key}'", 404)
121
121
  end
122
122
 
123
123
  format = format_to_use(request)
@@ -1,3 +1,6 @@
1
+ require 'rack'
2
+ require 'rack/request'
3
+ require 'rack/response'
1
4
 
2
5
  require 'puppet/network/http'
3
6
  require 'puppet/network/http/rack/rest'
@@ -41,7 +41,7 @@ class Puppet::Network::HTTP::RackREST < Puppet::Network::HTTP::RackHttpHandler
41
41
  unless result.is_a?(File)
42
42
  response.write result
43
43
  else
44
- response["Content-Length"] = result.stat.size
44
+ response["Content-Length"] = result.stat.size.to_s
45
45
  response.body = RackFile.new(result)
46
46
  end
47
47
  end
@@ -3,6 +3,7 @@ require 'puppet/network/authconfig'
3
3
  module Puppet
4
4
  class Network::RestAuthConfig < Network::AuthConfig
5
5
 
6
+ extend MonitorMixin
6
7
  attr_accessor :rights
7
8
 
8
9
  DEFAULT_ACL = [
@@ -20,9 +21,11 @@ module Puppet
20
21
  ]
21
22
 
22
23
  def self.main
23
- add_acl = @main.nil?
24
- super
25
- @main.insert_default_acl if add_acl and !@main.exists?
24
+ synchronize do
25
+ add_acl = @main.nil?
26
+ super
27
+ @main.insert_default_acl if add_acl and !@main.exists?
28
+ end
26
29
  @main
27
30
  end
28
31
 
@@ -1,4 +1,5 @@
1
1
  require 'puppet/util/cacher'
2
+ require 'monitor'
2
3
 
3
4
  # Just define it, so this class has fewer load dependencies.
4
5
  class Puppet::Node
@@ -67,14 +68,23 @@ class Puppet::Node::Environment
67
68
 
68
69
  def initialize(name)
69
70
  @name = name
71
+ extend MonitorMixin
70
72
  end
71
73
 
72
74
  def known_resource_types
73
- if @known_resource_types.nil? or @known_resource_types.stale?
74
- @known_resource_types = Puppet::Resource::TypeCollection.new(self)
75
- @known_resource_types.perform_initial_import
76
- end
77
- @known_resource_types
75
+ # This makes use of short circuit evaluation to get the right thread-safe
76
+ # per environment semantics with an efficient most common cases; we almost
77
+ # always just return our thread's known-resource types. Only at the start
78
+ # of a compilation (after our thread var has been set to nil) or when the
79
+ # environment has changed do we delve deeper.
80
+ Thread.current[:known_resource_types] = nil if (krt = Thread.current[:known_resource_types]) && krt.environment != self
81
+ Thread.current[:known_resource_types] ||= synchronize {
82
+ if @known_resource_types.nil? or @known_resource_types.stale?
83
+ @known_resource_types = Puppet::Resource::TypeCollection.new(self)
84
+ @known_resource_types.perform_initial_import
85
+ end
86
+ @known_resource_types
87
+ }
78
88
  end
79
89
 
80
90
  def module(name)
@@ -21,14 +21,14 @@ class Puppet::Parameter::ValueCollection
21
21
  @doc += " Valid values are "
22
22
  @doc += @strings.collect do |value|
23
23
  if aliases = value.aliases and ! aliases.empty?
24
- "``#{value.name}`` (also called ``#{aliases.join(", ")}``)"
24
+ "`#{value.name}` (also called `#{aliases.join(", ")}`)"
25
25
  else
26
- "``#{value.name}``"
26
+ "`#{value.name}`"
27
27
  end
28
28
  end.join(", ") + "."
29
29
  end
30
30
 
31
- @doc += " Values can match ``" + regexes.join("``, ``") + "``." unless regexes.empty?
31
+ @doc += " Values can match `" + regexes.join("`, `") + "`." unless regexes.empty?
32
32
  end
33
33
 
34
34
  @doc
@@ -11,7 +11,6 @@ class Puppet::Parser::AST
11
11
  @settor = true
12
12
 
13
13
  def evaluate(scope)
14
-
15
14
  # Make sure it's a defined function
16
15
  raise Puppet::ParseError, "Unknown function #{@name}" unless Puppet::Parser::Functions.function(@name)
17
16
 
@@ -42,7 +42,7 @@ class Puppet::Parser::AST
42
42
  # The base string class.
43
43
  class String < AST::Leaf
44
44
  def evaluate(scope)
45
- @value
45
+ @value.dup
46
46
  end
47
47
 
48
48
  def to_s
@@ -33,11 +33,12 @@ class Resource < AST::ResourceReference
33
33
  # This is where our implicit iteration takes place; if someone
34
34
  # passed an array as the name, then we act just like the called us
35
35
  # many times.
36
+ fully_qualified_type, resource_titles = scope.resolve_type_and_titles(type, resource_titles)
37
+
36
38
  resource_titles.flatten.collect { |resource_title|
37
39
  exceptwrap :type => Puppet::ParseError do
38
-
39
- resource = Puppet::Parser::Resource.new(
40
- type, resource_title,
40
+ resource = Puppet::Parser::Resource.new(
41
+ fully_qualified_type, resource_title,
41
42
  :parameters => paramobjects,
42
43
  :file => self.file,
43
44
  :line => self.line,
@@ -7,8 +7,15 @@ class Puppet::Parser::AST::ResourceReference < Puppet::Parser::AST::Branch
7
7
  # Evaluate our object, but just return a simple array of the type
8
8
  # and name.
9
9
  def evaluate(scope)
10
- titles = Array(title.safeevaluate(scope)).collect { |t| Puppet::Resource.new(type, t, :namespaces => scope.namespaces) }
11
- return(titles.length == 1 ? titles.pop : titles)
10
+ titles = Array(title.safeevaluate(scope))
11
+
12
+ a_type, titles = scope.resolve_type_and_titles(type, titles)
13
+
14
+ resources = titles.collect{ |a_title|
15
+ Puppet::Resource.new(a_type, a_title)
16
+ }
17
+
18
+ return(resources.length == 1 ? resources.pop : resources)
12
19
  end
13
20
 
14
21
  def to_s
@@ -19,7 +19,12 @@ class Puppet::Parser::Compiler
19
19
  rescue => detail
20
20
  puts detail.backtrace if Puppet[:trace]
21
21
  raise Puppet::Error, "#{detail} on node #{node.name}"
22
- end
22
+ ensure
23
+ # We get these from the environment and only cache them in a thread
24
+ # variable for the duration of the compilation.
25
+ Thread.current[:known_resource_types] = nil
26
+ Thread.current[:env_module_directories] = nil
27
+ end
23
28
 
24
29
  attr_reader :node, :facts, :collections, :catalog, :node_scope, :resources, :relationships
25
30
 
@@ -51,13 +56,10 @@ class Puppet::Parser::Compiler
51
56
  # Note that this will fail if the resource is not unique.
52
57
  @catalog.add_resource(resource)
53
58
 
54
- set_container_resource(scope, resource)
55
- end
56
59
 
57
- # Add our container edge. If we're a class, then we get treated specially - we can
58
- # control the stage that the class is applied in. Otherwise, we just
59
- # get added to our parent container.
60
- def set_container_resource(scope, resource)
60
+ # Add our container edge. If we're a class, then we get treated specially - we can
61
+ # control the stage that the class is applied in. Otherwise, we just
62
+ # get added to our parent container.
61
63
  return if resource.type.to_s.downcase == "stage"
62
64
 
63
65
  if resource.type.to_s.downcase != "class"
@@ -65,15 +67,14 @@ class Puppet::Parser::Compiler
65
67
  return @catalog.add_edge(scope.resource, resource)
66
68
  end
67
69
 
68
- unless stage = @catalog.resource(:stage, resource[:stage] || :main)
70
+ unless stage = @catalog.resource(:stage, resource[:stage] || (scope && scope.resource && scope.resource[:stage]) || :main)
69
71
  raise ArgumentError, "Could not find stage #{resource[:stage] || :main} specified by #{resource}"
70
72
  end
71
73
 
74
+ resource[:stage] ||= stage.title unless stage.title == :main
72
75
  @catalog.add_edge(stage, resource)
73
76
  end
74
77
 
75
- private :set_container_resource
76
-
77
78
  # Do we use nodes found in the code, vs. the external node sources?
78
79
  def ast_nodes?
79
80
  known_resource_types.nodes?
@@ -284,10 +285,7 @@ class Puppet::Parser::Compiler
284
285
  @main_resource = Puppet::Parser::Resource.new("class", :main, :scope => @topscope, :source => @main)
285
286
  @topscope.resource = @main_resource
286
287
 
287
- @resources << @main_resource
288
- @catalog.add_resource(@main_resource)
289
-
290
- set_container_resource(@topscope, @main_resource)
288
+ add_resource(@topscope, @main_resource)
291
289
 
292
290
  @main_resource.evaluate
293
291
  end
@@ -24,7 +24,7 @@ module Puppet::Parser::Files
24
24
  # Than that would be a "no."
25
25
  end
26
26
  abspat = File::expand_path(start, cwd)
27
- [nil, Dir.glob(abspat + (File.extname(abspat).empty? ? '{,.pp,.rb}' : '' )).uniq.reject { |f| FileTest.directory?(f) }]
27
+ [nil, Dir.glob(abspat + (File.extname(abspat).empty? ? '{.pp,.rb}' : '' )).uniq.reject { |f| FileTest.directory?(f) }]
28
28
  end
29
29
 
30
30
  # Find the concrete file denoted by +file+. If +file+ is absolute,
@@ -20,7 +20,7 @@ module Puppet::Parser::Functions
20
20
  @autoloader = Puppet::Util::Autoload.new(
21
21
  self,
22
22
  "puppet/parser/functions",
23
-
23
+
24
24
  :wrap => false
25
25
  )
26
26
  end
@@ -94,7 +94,7 @@ module Puppet::Parser::Functions
94
94
  ret += "Undocumented.\n"
95
95
  end
96
96
 
97
- ret += "\n\n- **Type**: #{hash[:type]}\n\n"
97
+ ret += "\n\n- *Type*: #{hash[:type]}\n\n"
98
98
  end
99
99
 
100
100
  ret