puppet 6.18.0-x64-mingw32 → 6.21.1-x64-mingw32

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 (276) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +2 -16
  3. data/Gemfile +2 -0
  4. data/Gemfile.lock +37 -34
  5. data/README.md +1 -2
  6. data/Rakefile +4 -12
  7. data/lib/puppet/agent/locker.rb +0 -7
  8. data/lib/puppet/application.rb +10 -6
  9. data/lib/puppet/application/agent.rb +9 -3
  10. data/lib/puppet/application/apply.rb +3 -2
  11. data/lib/puppet/application/device.rb +1 -0
  12. data/lib/puppet/application/doc.rb +1 -1
  13. data/lib/puppet/application/filebucket.rb +2 -2
  14. data/lib/puppet/application/lookup.rb +5 -5
  15. data/lib/puppet/application/script.rb +1 -0
  16. data/lib/puppet/application_support.rb +7 -0
  17. data/lib/puppet/configurer.rb +50 -8
  18. data/lib/puppet/defaults.rb +67 -35
  19. data/lib/puppet/environments.rb +84 -59
  20. data/lib/puppet/face/catalog.rb +1 -1
  21. data/lib/puppet/face/config.rb +56 -16
  22. data/lib/puppet/face/epp.rb +12 -2
  23. data/lib/puppet/face/facts.rb +60 -0
  24. data/lib/puppet/face/node.rb +3 -3
  25. data/lib/puppet/face/node/clean.rb +2 -2
  26. data/lib/puppet/face/status.rb +1 -1
  27. data/lib/puppet/ffi/posix.rb +10 -0
  28. data/lib/puppet/ffi/posix/constants.rb +14 -0
  29. data/lib/puppet/ffi/posix/functions.rb +24 -0
  30. data/lib/puppet/file_bucket/dipper.rb +1 -1
  31. data/lib/puppet/functions/epp.rb +1 -0
  32. data/lib/puppet/functions/inline_epp.rb +1 -0
  33. data/lib/puppet/functions/new.rb +8 -3
  34. data/lib/puppet/http.rb +1 -0
  35. data/lib/puppet/http/client.rb +1 -1
  36. data/lib/puppet/http/resolver.rb +5 -8
  37. data/lib/puppet/http/resolver/server_list.rb +18 -36
  38. data/lib/puppet/http/resolver/settings.rb +4 -4
  39. data/lib/puppet/http/resolver/srv.rb +5 -5
  40. data/lib/puppet/http/service.rb +3 -1
  41. data/lib/puppet/http/service/compiler.rb +1 -1
  42. data/lib/puppet/http/service/file_server.rb +1 -1
  43. data/lib/puppet/http/service/puppetserver.rb +39 -0
  44. data/lib/puppet/http/session.rb +5 -4
  45. data/lib/puppet/indirector/catalog/compiler.rb +1 -1
  46. data/lib/puppet/indirector/fact_search.rb +60 -0
  47. data/lib/puppet/indirector/facts/json.rb +27 -0
  48. data/lib/puppet/indirector/facts/yaml.rb +4 -59
  49. data/lib/puppet/indirector/json.rb +5 -1
  50. data/lib/puppet/indirector/msgpack.rb +1 -1
  51. data/lib/puppet/indirector/node/json.rb +8 -0
  52. data/lib/puppet/indirector/report/json.rb +34 -0
  53. data/lib/puppet/indirector/request.rb +4 -4
  54. data/lib/puppet/indirector/yaml.rb +1 -1
  55. data/lib/puppet/module_tool/applications/installer.rb +48 -2
  56. data/lib/puppet/module_tool/errors/shared.rb +17 -2
  57. data/lib/puppet/network/formats.rb +2 -1
  58. data/lib/puppet/network/http/api/master/v3/environments.rb +0 -1
  59. data/lib/puppet/node/facts.rb +17 -0
  60. data/lib/puppet/pal/pal_impl.rb +70 -17
  61. data/lib/puppet/parser/ast/leaf.rb +3 -2
  62. data/lib/puppet/parser/templatewrapper.rb +1 -1
  63. data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -3
  64. data/lib/puppet/pops/evaluator/deferred_resolver.rb +5 -3
  65. data/lib/puppet/pops/evaluator/evaluator_impl.rb +22 -3
  66. data/lib/puppet/pops/evaluator/runtime3_converter.rb +2 -2
  67. data/lib/puppet/pops/model/ast_transformer.rb +1 -1
  68. data/lib/puppet/pops/types/p_meta_type.rb +1 -1
  69. data/lib/puppet/pops/types/p_type_set_type.rb +4 -0
  70. data/lib/puppet/property/list.rb +1 -1
  71. data/lib/puppet/provider/group/groupadd.rb +13 -8
  72. data/lib/puppet/provider/package/apt.rb +34 -2
  73. data/lib/puppet/provider/package/aptitude.rb +6 -0
  74. data/lib/puppet/provider/package/dpkg.rb +1 -1
  75. data/lib/puppet/provider/package/pip2.rb +17 -0
  76. data/lib/puppet/provider/package/puppetserver_gem.rb +180 -0
  77. data/lib/puppet/provider/package/yum.rb +1 -0
  78. data/lib/puppet/provider/service/debian.rb +2 -0
  79. data/lib/puppet/provider/user/aix.rb +2 -2
  80. data/lib/puppet/provider/user/useradd.rb +62 -8
  81. data/lib/puppet/reference/configuration.rb +6 -5
  82. data/lib/puppet/resource/type.rb +2 -1
  83. data/lib/puppet/rest/route.rb +2 -2
  84. data/lib/puppet/settings.rb +62 -20
  85. data/lib/puppet/settings/alias_setting.rb +37 -0
  86. data/lib/puppet/settings/base_setting.rb +26 -2
  87. data/lib/puppet/transaction/report.rb +11 -7
  88. data/lib/puppet/type/file/source.rb +1 -1
  89. data/lib/puppet/type/filebucket.rb +1 -1
  90. data/lib/puppet/type/package.rb +3 -3
  91. data/lib/puppet/util/autoload.rb +1 -8
  92. data/lib/puppet/util/connection.rb +8 -8
  93. data/lib/puppet/util/fact_dif.rb +62 -0
  94. data/lib/puppet/util/posix.rb +54 -5
  95. data/lib/puppet/util/rubygems.rb +5 -1
  96. data/lib/puppet/util/run_mode.rb +5 -1
  97. data/lib/puppet/util/windows/service.rb +1 -1
  98. data/lib/puppet/version.rb +1 -1
  99. data/locales/puppet.pot +289 -268
  100. data/man/man5/puppet.conf.5 +33 -17
  101. data/man/man8/puppet-agent.8 +7 -4
  102. data/man/man8/puppet-apply.8 +2 -2
  103. data/man/man8/puppet-catalog.8 +1 -1
  104. data/man/man8/puppet-config.8 +6 -6
  105. data/man/man8/puppet-describe.8 +1 -1
  106. data/man/man8/puppet-device.8 +2 -2
  107. data/man/man8/puppet-doc.8 +1 -1
  108. data/man/man8/puppet-epp.8 +1 -1
  109. data/man/man8/puppet-facts.8 +32 -1
  110. data/man/man8/puppet-filebucket.8 +3 -3
  111. data/man/man8/puppet-generate.8 +1 -1
  112. data/man/man8/puppet-help.8 +1 -1
  113. data/man/man8/puppet-key.8 +1 -1
  114. data/man/man8/puppet-lookup.8 +1 -1
  115. data/man/man8/puppet-man.8 +1 -1
  116. data/man/man8/puppet-module.8 +1 -1
  117. data/man/man8/puppet-node.8 +7 -4
  118. data/man/man8/puppet-parser.8 +1 -1
  119. data/man/man8/puppet-plugin.8 +1 -1
  120. data/man/man8/puppet-report.8 +4 -1
  121. data/man/man8/puppet-resource.8 +1 -1
  122. data/man/man8/puppet-script.8 +2 -2
  123. data/man/man8/puppet-ssl.8 +1 -1
  124. data/man/man8/puppet-status.8 +2 -2
  125. data/man/man8/puppet.8 +2 -2
  126. data/spec/fixtures/integration/application/agent/cached_deferred_catalog.json +91 -0
  127. data/spec/fixtures/unit/provider/package/puppetserver_gem/gem-list-local-packages +30 -0
  128. data/spec/fixtures/unit/provider/user/aix/aix_passwd_file.out +4 -0
  129. data/spec/integration/application/agent_spec.rb +183 -22
  130. data/spec/integration/application/apply_spec.rb +19 -0
  131. data/spec/integration/application/filebucket_spec.rb +7 -7
  132. data/spec/integration/application/plugin_spec.rb +3 -3
  133. data/spec/integration/configurer_spec.rb +14 -0
  134. data/spec/integration/defaults_spec.rb +19 -1
  135. data/spec/integration/environments/setting_hooks_spec.rb +1 -1
  136. data/spec/integration/resource/type_collection_spec.rb +2 -6
  137. data/spec/integration/transaction_spec.rb +4 -9
  138. data/spec/integration/util/windows/adsi_spec.rb +5 -3
  139. data/spec/integration/util/windows/registry_spec.rb +0 -10
  140. data/spec/lib/puppet_spec/settings.rb +6 -1
  141. data/spec/shared_contexts/types_setup.rb +2 -0
  142. data/spec/spec_helper.rb +1 -4
  143. data/spec/unit/agent_spec.rb +8 -6
  144. data/spec/unit/application/agent_spec.rb +0 -1
  145. data/spec/unit/application/config_spec.rb +224 -4
  146. data/spec/unit/application/doc_spec.rb +2 -2
  147. data/spec/unit/application/facts_spec.rb +3 -1
  148. data/spec/unit/application/filebucket_spec.rb +0 -2
  149. data/spec/unit/application_spec.rb +60 -13
  150. data/spec/unit/configurer_spec.rb +39 -6
  151. data/spec/unit/confine/feature_spec.rb +1 -1
  152. data/spec/unit/confine_spec.rb +8 -2
  153. data/spec/unit/defaults_spec.rb +20 -1
  154. data/spec/unit/environments_spec.rb +176 -32
  155. data/spec/unit/face/config_spec.rb +62 -11
  156. data/spec/unit/face/node_spec.rb +2 -13
  157. data/spec/unit/file_serving/configuration/parser_spec.rb +0 -1
  158. data/spec/unit/file_serving/metadata_spec.rb +3 -3
  159. data/spec/unit/file_serving/terminus_helper_spec.rb +11 -4
  160. data/spec/unit/file_system_spec.rb +1 -2
  161. data/spec/unit/forge/module_release_spec.rb +2 -7
  162. data/spec/unit/functions/inline_epp_spec.rb +26 -1
  163. data/spec/unit/http/resolver_spec.rb +24 -4
  164. data/spec/unit/http/service/ca_spec.rb +2 -2
  165. data/spec/unit/http/service/compiler_spec.rb +51 -2
  166. data/spec/unit/http/service/file_server_spec.rb +2 -2
  167. data/spec/unit/http/service/puppetserver_spec.rb +82 -0
  168. data/spec/unit/http/service/report_spec.rb +2 -2
  169. data/spec/unit/http/service_spec.rb +1 -1
  170. data/spec/unit/http/session_spec.rb +8 -20
  171. data/spec/unit/indirector/catalog/json_spec.rb +1 -1
  172. data/spec/unit/indirector/catalog/rest_spec.rb +1 -1
  173. data/spec/unit/indirector/face_spec.rb +0 -1
  174. data/spec/unit/indirector/facts/facter_spec.rb +0 -1
  175. data/spec/unit/indirector/facts/json_spec.rb +255 -0
  176. data/spec/unit/indirector/facts/rest_spec.rb +1 -1
  177. data/spec/unit/indirector/file_bucket_file/selector_spec.rb +26 -8
  178. data/spec/unit/indirector/indirection_spec.rb +8 -12
  179. data/spec/unit/indirector/json_spec.rb +8 -8
  180. data/spec/unit/indirector/key/file_spec.rb +0 -1
  181. data/spec/unit/indirector/msgpack_spec.rb +8 -8
  182. data/spec/unit/indirector/node/json_spec.rb +33 -0
  183. data/spec/unit/indirector/node/rest_spec.rb +1 -1
  184. data/spec/{integration/indirector/report/yaml.rb → unit/indirector/report/json_spec.rb} +13 -24
  185. data/spec/unit/indirector/report/yaml_spec.rb +72 -8
  186. data/spec/unit/indirector/request_spec.rb +4 -4
  187. data/spec/unit/indirector/rest_spec.rb +1 -1
  188. data/spec/unit/indirector/status/rest_spec.rb +1 -1
  189. data/spec/unit/indirector/yaml_spec.rb +7 -7
  190. data/spec/unit/indirector_spec.rb +2 -2
  191. data/spec/unit/module_tool/applications/installer_spec.rb +66 -0
  192. data/spec/unit/network/authconfig_spec.rb +0 -3
  193. data/spec/unit/network/http/api/indirected_routes_spec.rb +0 -9
  194. data/spec/unit/network/http/api/master/v3/environments_spec.rb +12 -23
  195. data/spec/unit/network/http/handler_spec.rb +0 -5
  196. data/spec/unit/parser/compiler_spec.rb +3 -19
  197. data/spec/unit/parser/resource_spec.rb +14 -8
  198. data/spec/unit/parser/templatewrapper_spec.rb +4 -3
  199. data/spec/unit/pops/evaluator/deferred_resolver_spec.rb +20 -0
  200. data/spec/unit/property_spec.rb +1 -0
  201. data/spec/unit/provider/exec_spec.rb +4 -3
  202. data/spec/unit/provider/group/groupadd_spec.rb +5 -2
  203. data/spec/unit/provider/nameservice_spec.rb +66 -65
  204. data/spec/unit/provider/package/apt_spec.rb +28 -23
  205. data/spec/unit/provider/package/aptitude_spec.rb +1 -1
  206. data/spec/unit/provider/package/base_spec.rb +6 -5
  207. data/spec/unit/provider/package/dpkg_spec.rb +22 -7
  208. data/spec/unit/provider/package/openbsd_spec.rb +2 -0
  209. data/spec/unit/provider/package/pacman_spec.rb +18 -12
  210. data/spec/unit/provider/package/pip2_spec.rb +36 -0
  211. data/spec/unit/provider/package/pip_spec.rb +6 -11
  212. data/spec/unit/provider/package/pkgdmg_spec.rb +0 -4
  213. data/spec/unit/provider/package/puppetserver_gem_spec.rb +137 -0
  214. data/spec/unit/provider/package/yum_spec.rb +31 -0
  215. data/spec/unit/provider/service/base_spec.rb +2 -4
  216. data/spec/unit/provider/service/bsd_spec.rb +5 -1
  217. data/spec/unit/provider/service/daemontools_spec.rb +1 -1
  218. data/spec/unit/provider/service/debian_spec.rb +3 -5
  219. data/spec/unit/provider/service/freebsd_spec.rb +1 -1
  220. data/spec/unit/provider/service/gentoo_spec.rb +4 -5
  221. data/spec/unit/provider/service/init_spec.rb +4 -5
  222. data/spec/unit/provider/service/launchd_spec.rb +5 -6
  223. data/spec/unit/provider/service/openrc_spec.rb +4 -5
  224. data/spec/unit/provider/service/openwrt_spec.rb +1 -1
  225. data/spec/unit/provider/service/redhat_spec.rb +1 -1
  226. data/spec/unit/provider/service/runit_spec.rb +2 -1
  227. data/spec/unit/provider/service/smf_spec.rb +1 -1
  228. data/spec/unit/provider/service/src_spec.rb +3 -5
  229. data/spec/unit/provider/service/systemd_spec.rb +3 -1
  230. data/spec/unit/provider/service/upstart_spec.rb +4 -5
  231. data/spec/unit/provider/user/aix_spec.rb +5 -0
  232. data/spec/unit/provider/user/hpux_spec.rb +1 -1
  233. data/spec/unit/provider/user/pw_spec.rb +2 -0
  234. data/spec/unit/provider/user/useradd_spec.rb +56 -3
  235. data/spec/unit/provider_spec.rb +8 -10
  236. data/spec/unit/puppet_pal_catalog_spec.rb +45 -0
  237. data/spec/unit/resource/capability_finder_spec.rb +6 -1
  238. data/spec/unit/resource/type_spec.rb +1 -1
  239. data/spec/unit/resource_spec.rb +11 -10
  240. data/spec/unit/rest/route_spec.rb +4 -4
  241. data/spec/unit/settings_spec.rb +576 -239
  242. data/spec/unit/ssl/base_spec.rb +0 -1
  243. data/spec/unit/ssl/host_spec.rb +0 -5
  244. data/spec/unit/ssl/ssl_provider_spec.rb +14 -8
  245. data/spec/unit/transaction/additional_resource_generator_spec.rb +3 -7
  246. data/spec/unit/transaction/event_manager_spec.rb +14 -11
  247. data/spec/unit/transaction/report_spec.rb +2 -0
  248. data/spec/unit/transaction_spec.rb +13 -4
  249. data/spec/unit/type/file/content_spec.rb +0 -1
  250. data/spec/unit/type/file/selinux_spec.rb +0 -2
  251. data/spec/unit/type/file/source_spec.rb +1 -1
  252. data/spec/unit/type/file_spec.rb +0 -6
  253. data/spec/unit/type/filebucket_spec.rb +1 -1
  254. data/spec/unit/type/group_spec.rb +13 -6
  255. data/spec/unit/type/resources_spec.rb +7 -7
  256. data/spec/unit/type/service_spec.rb +1 -1
  257. data/spec/unit/type/tidy_spec.rb +0 -1
  258. data/spec/unit/type_spec.rb +2 -2
  259. data/spec/unit/util/at_fork_spec.rb +2 -2
  260. data/spec/unit/util/autoload_spec.rb +5 -1
  261. data/spec/unit/util/backups_spec.rb +1 -2
  262. data/spec/unit/util/execution_spec.rb +15 -11
  263. data/spec/unit/util/inifile_spec.rb +6 -14
  264. data/spec/unit/util/log_spec.rb +8 -7
  265. data/spec/unit/util/logging_spec.rb +3 -3
  266. data/spec/unit/util/posix_spec.rb +363 -15
  267. data/spec/unit/util/rubygems_spec.rb +2 -2
  268. data/spec/unit/util/run_mode_spec.rb +6 -6
  269. data/spec/unit/util/selinux_spec.rb +76 -52
  270. data/spec/unit/util/storage_spec.rb +3 -1
  271. data/spec/unit/util/suidmanager_spec.rb +44 -41
  272. data/spec/unit/util_spec.rb +13 -6
  273. metadata +32 -10
  274. data/spec/integration/application/config_spec.rb +0 -74
  275. data/spec/unit/face/catalog_spec.rb +0 -6
  276. data/spec/unit/face/module_spec.rb +0 -3
@@ -13,14 +13,14 @@ class Puppet::HTTP::Resolver::Settings < Puppet::HTTP::Resolver
13
13
  # @param [Puppet::HTTP::Session] session
14
14
  # @param [Symbol] name the name of the service to be resolved
15
15
  # @param [Puppet::SSL::SSLContext] ssl_context
16
- # @param [Proc] error_handler (nil) optional callback for each error
17
- # encountered while resolving a route.
16
+ # @param [Proc] canceled_handler (nil) optional callback allowing a resolver
17
+ # to cancel resolution.
18
18
  #
19
19
  # @return [Puppet::HTTP::Service] if the service successfully connects,
20
20
  # return it. Otherwise, return nil.
21
21
  #
22
- def resolve(session, name, ssl_context: nil, error_handler: nil)
22
+ def resolve(session, name, ssl_context: nil, canceled_handler: nil)
23
23
  service = Puppet::HTTP::Service.create_service(@client, session, name)
24
- check_connection?(session, service, ssl_context: ssl_context, error_handler: error_handler) ? service : nil
24
+ check_connection?(session, service, ssl_context: ssl_context) ? service : nil
25
25
  end
26
26
  end
@@ -25,21 +25,21 @@ class Puppet::HTTP::Resolver::SRV < Puppet::HTTP::Resolver
25
25
  # @param [Puppet::HTTP::Session] session
26
26
  # @param [Symbol] name the service being resolved
27
27
  # @param [Puppet::SSL::SSLContext] ssl_context
28
- # @param [Proc] error_handler (nil) optional callback for each error
29
- # encountered while resolving a route.
28
+ # @param [Proc] canceled_handler (nil) optional callback allowing a resolver
29
+ # to cancel resolution.
30
30
  #
31
31
  # @return [Puppet::HTTP::Service] if an available service is found, return
32
32
  # it. Return nil otherwise.
33
33
  #
34
- def resolve(session, name, ssl_context: nil, error_handler: nil)
34
+ def resolve(session, name, ssl_context: nil, canceled_handler: nil)
35
35
  # Here we pass our HTTP service name as the DNS SRV service name
36
36
  # This is fine for :ca, but note that :puppet and :file are handled
37
37
  # specially in `each_srv_record`.
38
38
  @delegate.each_srv_record(@srv_domain, name) do |server, port|
39
39
  service = Puppet::HTTP::Service.create_service(@client, session, name, server, port)
40
- return service if check_connection?(session, service, ssl_context: ssl_context, error_handler: error_handler)
40
+ return service if check_connection?(session, service, ssl_context: ssl_context)
41
41
  end
42
42
 
43
- return nil
43
+ nil
44
44
  end
45
45
  end
@@ -10,7 +10,7 @@ class Puppet::HTTP::Service
10
10
 
11
11
  # @api private
12
12
  # @return [Array<Symbol>] available services
13
- SERVICE_NAMES = [:ca, :fileserver, :puppet, :report].freeze
13
+ SERVICE_NAMES = [:ca, :fileserver, :puppet, :puppetserver, :report].freeze
14
14
 
15
15
  # @api private
16
16
  # @return [Array<Symbol>] format types that are unsupported
@@ -43,6 +43,8 @@ class Puppet::HTTP::Service
43
43
  Puppet::HTTP::Service::FileServer.new(client, session, server, port)
44
44
  when :puppet
45
45
  ::Puppet::HTTP::Service::Compiler.new(client, session, server, port)
46
+ when :puppetserver
47
+ ::Puppet::HTTP::Service::Puppetserver.new(client, session, server, port)
46
48
  when :report
47
49
  Puppet::HTTP::Service::Report.new(client, session, server, port)
48
50
  else
@@ -22,7 +22,7 @@ class Puppet::HTTP::Service::Compiler < Puppet::HTTP::Service
22
22
  # create the service.
23
23
  #
24
24
  def initialize(client, session, server, port)
25
- url = build_url(API, server || Puppet[:server], port || Puppet[:masterport])
25
+ url = build_url(API, server || Puppet[:server], port || Puppet[:serverport])
26
26
  super(client, session, url)
27
27
  end
28
28
 
@@ -27,7 +27,7 @@ class Puppet::HTTP::Service::FileServer < Puppet::HTTP::Service
27
27
  # create the service.
28
28
  #
29
29
  def initialize(client, session, server, port)
30
- url = build_url(API, server || Puppet[:server], port || Puppet[:masterport])
30
+ url = build_url(API, server || Puppet[:server], port || Puppet[:serverport])
31
31
  super(client, session, url)
32
32
  end
33
33
 
@@ -0,0 +1,39 @@
1
+ # The puppetserver service.
2
+ #
3
+ # @api private
4
+ #
5
+ class Puppet::HTTP::Service::Puppetserver < Puppet::HTTP::Service
6
+ # @param [Puppet::HTTP::Client] client
7
+ # @param [Puppet::HTTP::Session] session
8
+ # @param [String] server If an explicit server is given,
9
+ # create a service using that server. If server is nil, the default value
10
+ # is used to create the service.
11
+ # @param [Integer] port If an explicit port is given, create
12
+ # a service using that port. If port is nil, the default value is used to
13
+ # create the service.
14
+ # @api private
15
+ #
16
+ def initialize(client, session, server, port)
17
+ url = build_url('', server || Puppet[:server], port || Puppet[:serverport])
18
+ super(client, session, url)
19
+ end
20
+
21
+ # Request the puppetserver's simple status
22
+ #
23
+ # @param [Puppet::SSL::SSLContext] ssl_context to use when establishing
24
+ # the connection.
25
+ # @return Puppet::HTTP::Response The HTTP response
26
+ # @api private
27
+ #
28
+ def get_simple_status(ssl_context: nil)
29
+ response = @client.get(
30
+ with_base_url("/status/v1/simple/master"),
31
+ headers: add_puppet_headers({}),
32
+ options: {ssl_context: ssl_context}
33
+ )
34
+
35
+ process_response(response)
36
+
37
+ [response, response.body.to_s]
38
+ end
39
+ end
@@ -64,20 +64,21 @@ class Puppet::HTTP::Session
64
64
  cached = @resolved_services[name]
65
65
  return cached if cached
66
66
 
67
- resolution_exceptions = []
68
- error_handler = proc { |e| resolution_exceptions << e }
67
+ canceled = false
68
+ canceled_handler = lambda { |cancel| canceled = cancel }
69
69
 
70
70
  @resolvers.each do |resolver|
71
71
  Puppet.debug("Resolving service '#{name}' using #{resolver.class}")
72
- service = resolver.resolve(self, name, ssl_context: ssl_context, error_handler: error_handler)
72
+ service = resolver.resolve(self, name, ssl_context: ssl_context, canceled_handler: canceled_handler)
73
73
  if service
74
74
  @resolved_services[name] = service
75
75
  Puppet.debug("Resolved service '#{name}' to #{service.url}")
76
76
  return service
77
+ elsif canceled
78
+ break
77
79
  end
78
80
  end
79
81
 
80
- resolution_exceptions.each { |e| Puppet.log_exception(e) }
81
82
  raise Puppet::HTTP::RouteError, "No more routes to #{name}"
82
83
  end
83
84
 
@@ -75,7 +75,7 @@ class Puppet::Resource::Catalog::Compiler < Puppet::Indirector::Code
75
75
 
76
76
  # Is our compiler part of a network, or are we just local?
77
77
  def networked?
78
- Puppet.run_mode.master?
78
+ Puppet.run_mode.server?
79
79
  end
80
80
 
81
81
  private
@@ -0,0 +1,60 @@
1
+ # module containing common methods used by json and yaml facts indirection terminus
2
+ module Puppet::Indirector::FactSearch
3
+ def node_matches?(facts, options)
4
+ options.each do |key, value|
5
+ type, name, operator = key.to_s.split(".")
6
+ operator ||= 'eq'
7
+
8
+ return false unless node_matches_option?(type, name, operator, value, facts)
9
+ end
10
+ return true
11
+ end
12
+
13
+ def node_matches_option?(type, name, operator, value, facts)
14
+ case type
15
+ when "meta"
16
+ case name
17
+ when "timestamp"
18
+ compare_timestamp(operator, facts.timestamp, Time.parse(value))
19
+ end
20
+ when "facts"
21
+ compare_facts(operator, facts.values[name], value)
22
+ end
23
+ end
24
+
25
+ def compare_facts(operator, value1, value2)
26
+ return false unless value1
27
+
28
+ case operator
29
+ when "eq"
30
+ value1.to_s == value2.to_s
31
+ when "le"
32
+ value1.to_f <= value2.to_f
33
+ when "ge"
34
+ value1.to_f >= value2.to_f
35
+ when "lt"
36
+ value1.to_f < value2.to_f
37
+ when "gt"
38
+ value1.to_f > value2.to_f
39
+ when "ne"
40
+ value1.to_s != value2.to_s
41
+ end
42
+ end
43
+
44
+ def compare_timestamp(operator, value1, value2)
45
+ case operator
46
+ when "eq"
47
+ value1 == value2
48
+ when "le"
49
+ value1 <= value2
50
+ when "ge"
51
+ value1 >= value2
52
+ when "lt"
53
+ value1 < value2
54
+ when "gt"
55
+ value1 > value2
56
+ when "ne"
57
+ value1 != value2
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,27 @@
1
+ require 'puppet/node/facts'
2
+ require 'puppet/indirector/json'
3
+ require 'puppet/indirector/fact_search'
4
+
5
+ class Puppet::Node::Facts::Json < Puppet::Indirector::JSON
6
+ desc "Store client facts as flat files, serialized using JSON, or
7
+ return deserialized facts from disk."
8
+
9
+ include Puppet::Indirector::FactSearch
10
+
11
+ def search(request)
12
+ node_names = []
13
+ Dir.glob(json_dir_path).each do |file|
14
+ facts = load_json_from_file(file, '')
15
+ if facts && node_matches?(facts, request.options)
16
+ node_names << facts.name
17
+ end
18
+ end
19
+ node_names
20
+ end
21
+
22
+ private
23
+
24
+ def json_dir_path
25
+ self.path("*")
26
+ end
27
+ end
@@ -1,10 +1,13 @@
1
1
  require 'puppet/node/facts'
2
2
  require 'puppet/indirector/yaml'
3
+ require 'puppet/indirector/fact_search'
3
4
 
4
5
  class Puppet::Node::Facts::Yaml < Puppet::Indirector::Yaml
5
6
  desc "Store client facts as flat files, serialized using YAML, or
6
7
  return deserialized facts from disk."
7
8
 
9
+ include Puppet::Indirector::FactSearch
10
+
8
11
  def search(request)
9
12
  node_names = []
10
13
  Dir.glob(yaml_dir_path).each do |file|
@@ -20,65 +23,7 @@ class Puppet::Node::Facts::Yaml < Puppet::Indirector::Yaml
20
23
 
21
24
  # Return the path to a given node's file.
22
25
  def yaml_dir_path
23
- base = Puppet.run_mode.master? ? Puppet[:yamldir] : Puppet[:clientyamldir]
26
+ base = Puppet.run_mode.server? ? Puppet[:yamldir] : Puppet[:clientyamldir]
24
27
  File.join(base, 'facts', '*.yaml')
25
28
  end
26
-
27
- def node_matches?(facts, options)
28
- options.each do |key, value|
29
- type, name, operator = key.to_s.split(".")
30
- operator ||= 'eq'
31
-
32
- return false unless node_matches_option?(type, name, operator, value, facts)
33
- end
34
- return true
35
- end
36
-
37
- def node_matches_option?(type, name, operator, value, facts)
38
- case type
39
- when "meta"
40
- case name
41
- when "timestamp"
42
- compare_timestamp(operator, facts.timestamp, Time.parse(value))
43
- end
44
- when "facts"
45
- compare_facts(operator, facts.values[name], value)
46
- end
47
- end
48
-
49
- def compare_facts(operator, value1, value2)
50
- return false unless value1
51
-
52
- case operator
53
- when "eq"
54
- value1.to_s == value2.to_s
55
- when "le"
56
- value1.to_f <= value2.to_f
57
- when "ge"
58
- value1.to_f >= value2.to_f
59
- when "lt"
60
- value1.to_f < value2.to_f
61
- when "gt"
62
- value1.to_f > value2.to_f
63
- when "ne"
64
- value1.to_s != value2.to_s
65
- end
66
- end
67
-
68
- def compare_timestamp(operator, value1, value2)
69
- case operator
70
- when "eq"
71
- value1 == value2
72
- when "le"
73
- value1 <= value2
74
- when "ge"
75
- value1 >= value2
76
- when "lt"
77
- value1 < value2
78
- when "gt"
79
- value1 > value2
80
- when "ne"
81
- value1 != value2
82
- end
83
- end
84
29
  end
@@ -41,12 +41,16 @@ class Puppet::Indirector::JSON < Puppet::Indirector::Terminus
41
41
  raise ArgumentError, _("invalid key")
42
42
  end
43
43
 
44
- base = Puppet.run_mode.master? ? Puppet[:server_datadir] : Puppet[:client_datadir]
44
+ base = data_dir
45
45
  File.join(base, self.class.indirection_name.to_s, name.to_s + ext)
46
46
  end
47
47
 
48
48
  private
49
49
 
50
+ def data_dir()
51
+ Puppet.run_mode.server? ? Puppet[:server_datadir] : Puppet[:client_datadir]
52
+ end
53
+
50
54
  def load_json_from_file(file, key)
51
55
  json = nil
52
56
 
@@ -48,7 +48,7 @@ class Puppet::Indirector::Msgpack < Puppet::Indirector::Terminus
48
48
  raise ArgumentError, _("invalid key")
49
49
  end
50
50
 
51
- base = Puppet.run_mode.master? ? Puppet[:server_datadir] : Puppet[:client_datadir]
51
+ base = Puppet.run_mode.server? ? Puppet[:server_datadir] : Puppet[:client_datadir]
52
52
  File.join(base, self.class.indirection_name.to_s, name.to_s + ext)
53
53
  end
54
54
 
@@ -0,0 +1,8 @@
1
+ require 'puppet/node'
2
+ require 'puppet/indirector/json'
3
+
4
+ class Puppet::Node::Json < Puppet::Indirector::JSON
5
+ desc "Store node information as flat files, serialized using JSON,
6
+ or deserialize stored JSON nodes."
7
+
8
+ end
@@ -0,0 +1,34 @@
1
+ require 'puppet/transaction/report'
2
+ require 'puppet/indirector/json'
3
+
4
+ class Puppet::Transaction::Report::Json < Puppet::Indirector::JSON
5
+ include Puppet::Util::SymbolicFileMode
6
+
7
+ desc "Store last report as a flat file, serialized using JSON."
8
+
9
+ # Force report to be saved there
10
+ def path(name,ext='.json')
11
+ Puppet[:lastrunreport]
12
+ end
13
+
14
+ def save(request)
15
+ filename = path(request.key)
16
+ mode = Puppet.settings.setting(:lastrunreport).mode
17
+
18
+ unless valid_symbolic_mode?(mode)
19
+ raise Puppet::DevError, _("replace_file mode: %{mode} is invalid") % { mode: mode }
20
+ end
21
+
22
+ mode = symbolic_mode_to_int(normalize_symbolic_mode(mode))
23
+
24
+ FileUtils.mkdir_p(File.dirname(filename))
25
+
26
+ begin
27
+ Puppet::FileSystem.replace_file(filename, mode) do |fh|
28
+ fh.print JSON.dump(request.instance)
29
+ end
30
+ rescue TypeError => detail
31
+ Puppet.err _("Could not save %{indirection} %{request}: %{detail}") % { indirection: self.name, request: request.key, detail: detail }
32
+ end
33
+ end
34
+ end
@@ -231,9 +231,9 @@ class Puppet::Indirector::Request
231
231
  debug_once _("Selected port from the first entry of the `server_list` setting: %{port}") % {port: primary_server[1]}
232
232
  primary_server[1]
233
233
  else
234
- #TRANSLATORS 'masterport' is the name of a setting and should not be translated
235
- debug_once _("Selected port from the `masterport` setting: %{port}") % {port: Puppet.settings[:masterport]}
236
- Puppet.settings[:masterport]
234
+ #TRANSLATORS 'serverport' is the name of a setting and should not be translated
235
+ debug_once _("Selected port from the `serverport` setting: %{port}") % {port: Puppet.settings[:serverport]}
236
+ Puppet.settings[:serverport]
237
237
  end
238
238
  end
239
239
  end
@@ -277,7 +277,7 @@ class Puppet::Indirector::Request
277
277
  # If the URI class can look up the scheme, it will provide a port,
278
278
  # otherwise it will default to '0'.
279
279
  if uri.port.to_i == 0 and uri.scheme == "puppet"
280
- @port = Puppet.settings[:masterport].to_i
280
+ @port = Puppet.settings[:serverport].to_i
281
281
  else
282
282
  @port = uri.port.to_i
283
283
  end
@@ -40,7 +40,7 @@ class Puppet::Indirector::Yaml < Puppet::Indirector::Terminus
40
40
  raise ArgumentError, _("invalid key")
41
41
  end
42
42
 
43
- base = Puppet.run_mode.master? ? Puppet[:yamldir] : Puppet[:clientyamldir]
43
+ base = Puppet.run_mode.server? ? Puppet[:yamldir] : Puppet[:clientyamldir]
44
44
  File.join(base, self.class.indirection_name.to_s, name.to_s + ext)
45
45
  end
46
46
 
@@ -131,8 +131,54 @@ module Puppet::ModuleTool
131
131
  begin
132
132
  Puppet.info _("Resolving dependencies ...")
133
133
  releases = SemanticPuppet::Dependency.resolve(graph)
134
- rescue SemanticPuppet::Dependency::UnsatisfiableGraph
135
- raise NoVersionsSatisfyError, results.merge(:requested_name => name)
134
+ rescue SemanticPuppet::Dependency::UnsatisfiableGraph => e
135
+ unsatisfied = nil
136
+
137
+ if e.respond_to?(:unsatisfied)
138
+ constraints = {}
139
+ # If the module we're installing satisfies all its
140
+ # dependencies, but would break an already installed
141
+ # module that depends on it, show what would break.
142
+ if name == e.unsatisfied
143
+ graph.constraints[name].each do |mod, range, _|
144
+ next unless mod.split.include?('constraint')
145
+
146
+ # If the user requested a specific version or range,
147
+ # only show the modules with non-intersecting ranges
148
+ if options[:version]
149
+ requested_range = SemanticPuppet::VersionRange.parse(options[:version])
150
+ constraint_range = SemanticPuppet::VersionRange.parse(range)
151
+
152
+ if requested_range.intersection(constraint_range) == SemanticPuppet::VersionRange::EMPTY_RANGE
153
+ constraints[mod.split.first] = range
154
+ end
155
+ else
156
+ constraints[mod.split.first] = range
157
+ end
158
+ end
159
+
160
+ # If the module fails to satisfy one of its
161
+ # dependencies, show the unsatisfiable module
162
+ else
163
+ unsatisfied_range = graph.dependencies[name].max.constraints[e.unsatisfied].first[1]
164
+ constraints[e.unsatisfied] = unsatisfied_range
165
+ end
166
+
167
+ installed_module = @environment.module_by_forge_name(e.unsatisfied.tr('-', '/'))
168
+ current_version = installed_module.version if installed_module
169
+
170
+ unsatisfied = {
171
+ :name => e.unsatisfied,
172
+ :constraints => constraints,
173
+ :current_version => current_version
174
+ }
175
+ end
176
+
177
+ raise NoVersionsSatisfyError, results.merge(
178
+ :requested_name => name,
179
+ :requested_version => options[:version] || graph.dependencies[name].max.version.to_s,
180
+ :unsatisfied => unsatisfied
181
+ )
136
182
  end
137
183
 
138
184
  unless forced?