puppet 6.14.0 → 6.15.0

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 (195) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +15 -15
  3. data/ext/windows/service/daemon.rb +3 -3
  4. data/lib/puppet.rb +1 -1
  5. data/lib/puppet/agent.rb +2 -10
  6. data/lib/puppet/application/agent.rb +2 -1
  7. data/lib/puppet/application/filebucket.rb +5 -14
  8. data/lib/puppet/application/ssl.rb +2 -2
  9. data/lib/puppet/configurer.rb +7 -3
  10. data/lib/puppet/configurer/plugin_handler.rb +1 -1
  11. data/lib/puppet/defaults.rb +22 -2
  12. data/lib/puppet/environments.rb +4 -5
  13. data/lib/puppet/face/plugin.rb +1 -1
  14. data/lib/puppet/file_system/file_impl.rb +13 -9
  15. data/lib/puppet/forge/repository.rb +1 -1
  16. data/lib/puppet/functions/call.rb +1 -1
  17. data/lib/puppet/functions/reduce.rb +2 -4
  18. data/lib/puppet/http.rb +2 -0
  19. data/lib/puppet/http/client.rb +191 -52
  20. data/lib/puppet/http/external_client.rb +96 -0
  21. data/lib/puppet/http/redirector.rb +34 -0
  22. data/lib/puppet/http/resolver.rb +46 -3
  23. data/lib/puppet/http/resolver/server_list.rb +75 -15
  24. data/lib/puppet/http/resolver/settings.rb +22 -2
  25. data/lib/puppet/http/resolver/srv.rb +28 -2
  26. data/lib/puppet/http/response.rb +63 -1
  27. data/lib/puppet/http/retry_after_handler.rb +39 -0
  28. data/lib/puppet/http/service.rb +67 -1
  29. data/lib/puppet/http/service/ca.rb +71 -9
  30. data/lib/puppet/http/service/compiler.rb +213 -11
  31. data/lib/puppet/http/service/file_server.rb +105 -4
  32. data/lib/puppet/http/service/report.rb +36 -3
  33. data/lib/puppet/http/session.rb +59 -8
  34. data/lib/puppet/indirector/catalog/rest.rb +2 -1
  35. data/lib/puppet/indirector/facts/rest.rb +2 -1
  36. data/lib/puppet/indirector/file_bucket_file/rest.rb +48 -0
  37. data/lib/puppet/indirector/file_metadata/rest.rb +4 -2
  38. data/lib/puppet/indirector/node/rest.rb +2 -1
  39. data/lib/puppet/indirector/report/yaml.rb +23 -0
  40. data/lib/puppet/indirector/status/rest.rb +2 -1
  41. data/lib/puppet/metatype/manager.rb +80 -80
  42. data/lib/puppet/network/http/base_pool.rb +6 -1
  43. data/lib/puppet/network/http/pool.rb +2 -4
  44. data/lib/puppet/network/http_pool.rb +1 -0
  45. data/lib/puppet/node/environment.rb +11 -1
  46. data/lib/puppet/pal/pal_impl.rb +1 -29
  47. data/lib/puppet/parser/compiler.rb +14 -7
  48. data/lib/puppet/parser/functions.rb +18 -13
  49. data/lib/puppet/pops/loaders.rb +7 -5
  50. data/lib/puppet/provider/group/windows_adsi.rb +3 -3
  51. data/lib/puppet/provider/package/apt.rb +61 -1
  52. data/lib/puppet/provider/package/dnfmodule.rb +39 -12
  53. data/lib/puppet/provider/package/gem.rb +41 -7
  54. data/lib/puppet/provider/package/pacman.rb +2 -5
  55. data/lib/puppet/provider/package/pip.rb +105 -33
  56. data/lib/puppet/provider/package/pip3.rb +0 -2
  57. data/lib/puppet/provider/package/pkgdmg.rb +1 -1
  58. data/lib/puppet/provider/package/pkgng.rb +16 -4
  59. data/lib/puppet/provider/package/puppet_gem.rb +6 -2
  60. data/lib/puppet/provider/package/rpm.rb +6 -213
  61. data/lib/puppet/provider/package/yum.rb +92 -19
  62. data/lib/puppet/provider/service/systemd.rb +2 -1
  63. data/lib/puppet/reports/http.rb +13 -11
  64. data/lib/puppet/resource/type_collection.rb +20 -16
  65. data/lib/puppet/ssl.rb +1 -0
  66. data/lib/puppet/ssl/host.rb +4 -4
  67. data/lib/puppet/ssl/oids.rb +1 -0
  68. data/lib/puppet/ssl/state_machine.rb +50 -33
  69. data/lib/puppet/transaction/report.rb +2 -2
  70. data/lib/puppet/type.rb +6 -1
  71. data/lib/puppet/type/file/source.rb +4 -2
  72. data/lib/puppet/type/package.rb +25 -2
  73. data/lib/puppet/type/user.rb +0 -19
  74. data/lib/puppet/util/at_fork.rb +1 -1
  75. data/lib/puppet/util/autoload.rb +3 -0
  76. data/lib/puppet/util/instance_loader.rb +14 -10
  77. data/lib/puppet/util/package/version/debian.rb +175 -0
  78. data/lib/puppet/util/package/version/gem.rb +15 -0
  79. data/lib/puppet/util/package/version/pip.rb +167 -0
  80. data/lib/puppet/util/package/version/range.rb +50 -0
  81. data/lib/puppet/util/package/version/range/gt.rb +14 -0
  82. data/lib/puppet/util/package/version/range/gt_eq.rb +14 -0
  83. data/lib/puppet/util/package/version/range/lt.rb +14 -0
  84. data/lib/puppet/util/package/version/range/lt_eq.rb +14 -0
  85. data/lib/puppet/util/package/version/range/min_max.rb +21 -0
  86. data/lib/puppet/util/package/version/range/simple.rb +11 -0
  87. data/lib/puppet/util/package/version/rpm.rb +73 -0
  88. data/lib/puppet/util/pidlock.rb +13 -7
  89. data/lib/puppet/util/platform.rb +5 -0
  90. data/lib/puppet/util/rpm_compare.rb +193 -0
  91. data/lib/puppet/util/windows/adsi.rb +2 -2
  92. data/lib/puppet/util/windows/process.rb +15 -14
  93. data/lib/puppet/util/windows/security.rb +1 -0
  94. data/lib/puppet/util/windows/sid.rb +3 -3
  95. data/lib/puppet/version.rb +1 -1
  96. data/locales/puppet.pot +207 -201
  97. data/man/man5/puppet.conf.5 +11 -3
  98. data/man/man8/puppet-agent.8 +1 -1
  99. data/man/man8/puppet-apply.8 +1 -1
  100. data/man/man8/puppet-catalog.8 +1 -1
  101. data/man/man8/puppet-config.8 +1 -1
  102. data/man/man8/puppet-describe.8 +1 -1
  103. data/man/man8/puppet-device.8 +1 -1
  104. data/man/man8/puppet-doc.8 +1 -1
  105. data/man/man8/puppet-epp.8 +1 -1
  106. data/man/man8/puppet-facts.8 +1 -1
  107. data/man/man8/puppet-filebucket.8 +1 -1
  108. data/man/man8/puppet-generate.8 +1 -1
  109. data/man/man8/puppet-help.8 +1 -1
  110. data/man/man8/puppet-key.8 +1 -1
  111. data/man/man8/puppet-lookup.8 +1 -1
  112. data/man/man8/puppet-man.8 +1 -1
  113. data/man/man8/puppet-module.8 +1 -1
  114. data/man/man8/puppet-node.8 +1 -1
  115. data/man/man8/puppet-parser.8 +1 -1
  116. data/man/man8/puppet-plugin.8 +1 -1
  117. data/man/man8/puppet-report.8 +1 -1
  118. data/man/man8/puppet-resource.8 +1 -1
  119. data/man/man8/puppet-script.8 +1 -1
  120. data/man/man8/puppet-ssl.8 +1 -1
  121. data/man/man8/puppet-status.8 +1 -1
  122. data/man/man8/puppet.8 +2 -2
  123. data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +67 -0
  124. data/spec/fixtures/ssl/unknown-127.0.0.1.pem +48 -0
  125. data/spec/fixtures/ssl/unknown-ca-key.pem +67 -0
  126. data/spec/fixtures/ssl/unknown-ca.pem +59 -0
  127. data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-installed.txt → dnf-module-list-enabled.txt} +2 -0
  128. data/spec/fixtures/unit/provider/package/pkgng/pkg.version +2 -0
  129. data/spec/fixtures/unit/provider/package/yum/yum-check-update-subscription-manager.txt +9 -0
  130. data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +9 -0
  131. data/spec/integration/application/agent_spec.rb +329 -0
  132. data/spec/integration/application/apply_spec.rb +132 -3
  133. data/spec/integration/application/filebucket_spec.rb +190 -0
  134. data/spec/integration/application/plugin_spec.rb +50 -0
  135. data/spec/integration/http/client_spec.rb +34 -40
  136. data/spec/integration/indirector/report/yaml.rb +83 -0
  137. data/spec/integration/module_tool/forge_spec.rb +2 -15
  138. data/spec/integration/network/http_pool_spec.rb +11 -19
  139. data/spec/integration/node/environment_spec.rb +15 -0
  140. data/spec/integration/util/windows/adsi_spec.rb +1 -1
  141. data/spec/lib/puppet/test_ca.rb +2 -2
  142. data/spec/lib/puppet_spec/https.rb +10 -7
  143. data/spec/lib/puppet_spec/puppetserver.rb +119 -0
  144. data/spec/shared_contexts/https.rb +29 -0
  145. data/spec/unit/agent_spec.rb +33 -25
  146. data/spec/unit/application/agent_spec.rb +5 -1
  147. data/spec/unit/application/device_spec.rb +2 -2
  148. data/spec/unit/application/filebucket_spec.rb +22 -2
  149. data/spec/unit/configurer_spec.rb +1 -1
  150. data/spec/unit/defaults_spec.rb +24 -1
  151. data/spec/unit/environments_spec.rb +8 -0
  152. data/spec/unit/file_system_spec.rb +10 -0
  153. data/spec/unit/http/client_spec.rb +105 -46
  154. data/spec/unit/http/external_client_spec.rb +201 -0
  155. data/spec/unit/http/resolver_spec.rb +20 -0
  156. data/spec/unit/http/service/ca_spec.rb +25 -2
  157. data/spec/unit/http/service/compiler_spec.rb +184 -6
  158. data/spec/unit/http/service/file_server_spec.rb +35 -3
  159. data/spec/unit/http/service/report_spec.rb +3 -1
  160. data/spec/unit/http/service_spec.rb +3 -3
  161. data/spec/unit/http/session_spec.rb +56 -7
  162. data/spec/unit/indirector/file_bucket_file/rest_spec.rb +82 -2
  163. data/spec/unit/network/http/pool_spec.rb +3 -3
  164. data/spec/unit/node/environment_spec.rb +16 -0
  165. data/spec/unit/provider/group/windows_adsi_spec.rb +43 -10
  166. data/spec/unit/provider/package/apt_spec.rb +30 -0
  167. data/spec/unit/provider/package/dnfmodule_spec.rb +33 -14
  168. data/spec/unit/provider/package/gem_spec.rb +40 -0
  169. data/spec/unit/provider/package/pacman_spec.rb +6 -21
  170. data/spec/unit/provider/package/pip_spec.rb +26 -3
  171. data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
  172. data/spec/unit/provider/package/pkgng_spec.rb +38 -0
  173. data/spec/unit/provider/package/puppet_gem_spec.rb +8 -0
  174. data/spec/unit/provider/package/rpm_spec.rb +0 -212
  175. data/spec/unit/provider/package/yum_spec.rb +235 -1
  176. data/spec/unit/provider/service/systemd_spec.rb +10 -1
  177. data/spec/unit/provider/user/windows_adsi_spec.rb +3 -3
  178. data/spec/unit/puppet_pal_2pec.rb +0 -29
  179. data/spec/unit/reports/http_spec.rb +70 -52
  180. data/spec/unit/ssl/host_spec.rb +4 -2
  181. data/spec/unit/ssl/oids_spec.rb +1 -0
  182. data/spec/unit/ssl/state_machine_spec.rb +38 -6
  183. data/spec/unit/transaction/report_spec.rb +4 -0
  184. data/spec/unit/util/at_fork_spec.rb +2 -2
  185. data/spec/unit/util/package/version/debian_spec.rb +83 -0
  186. data/spec/unit/util/package/version/pip_spec.rb +464 -0
  187. data/spec/unit/util/package/version/range_spec.rb +154 -0
  188. data/spec/unit/util/package/version/rpm_spec.rb +121 -0
  189. data/spec/unit/util/pidlock_spec.rb +83 -47
  190. data/spec/unit/util/rpm_compare_spec.rb +196 -0
  191. data/spec/unit/util/windows/adsi_spec.rb +4 -4
  192. data/spec/unit/util/windows/sid_spec.rb +2 -2
  193. data/tasks/generate_cert_fixtures.rake +15 -1
  194. metadata +51 -6
  195. data/spec/integration/faces/plugin_spec.rb +0 -63
@@ -0,0 +1,96 @@
1
+ #
2
+ # Adapts an external http_client_class to the HTTP client API. The former
3
+ # is typically registered by puppetserver and only implements a subset of
4
+ # the Puppet::Network::HTTP::Connection methods. As a result, only the
5
+ # `get` and `post` methods are supported. Calling `delete`, etc will
6
+ # raise a NotImplementedError.
7
+ #
8
+ # @api private
9
+ class Puppet::HTTP::ExternalClient < Puppet::HTTP::Client
10
+ # Create an external http client
11
+ #
12
+ # @param [Class] http_client_class The class to create to handle the request
13
+ # @api private
14
+ def initialize(http_client_class)
15
+ @http_client_class = http_client_class
16
+ end
17
+
18
+ # (see Puppet::HTTP::Client#get)
19
+ # @api private
20
+ def get(url, headers: {}, params: {}, options: {}, &block)
21
+ url = encode_query(url, params)
22
+
23
+ options[:use_ssl] = url.scheme == 'https'
24
+ if options[:user] && options[:password]
25
+ options[:basic_auth] = { user: options[:user], password: options[:password] }
26
+ end
27
+
28
+ client = @http_client_class.new(url.host, url.port, options)
29
+ response = Puppet::HTTP::Response.new(client.get(url.request_uri, headers, options), url)
30
+
31
+ if block_given?
32
+ yield response
33
+ else
34
+ response
35
+ end
36
+ rescue Puppet::HTTP::HTTPError
37
+ raise
38
+ rescue => e
39
+ raise Puppet::HTTP::HTTPError.new(e.message, e)
40
+ end
41
+
42
+ # (see Puppet::HTTP::Client#post)
43
+ # @api private
44
+ def post(url, body, headers: {}, params: {}, options: {}, &block)
45
+ raise ArgumentError.new("'post' requires a string 'body' argument") unless body.is_a?(String)
46
+ url = encode_query(url, params)
47
+
48
+ options[:use_ssl] = url.scheme == 'https'
49
+ if options[:user] && options[:password]
50
+ options[:basic_auth] = { user: options[:user], password: options[:password] }
51
+ end
52
+
53
+ client = @http_client_class.new(url.host, url.port, options)
54
+ response = Puppet::HTTP::Response.new(client.post(url.request_uri, body, headers, options), url)
55
+
56
+ if block_given?
57
+ yield response
58
+ else
59
+ response
60
+ end
61
+ rescue Puppet::HTTP::HTTPError, ArgumentError
62
+ raise
63
+ rescue => e
64
+ raise Puppet::HTTP::HTTPError.new(e.message, e)
65
+ end
66
+
67
+ # Close the external http client.
68
+ #
69
+ # @api private
70
+ def close
71
+ # This is a noop as puppetserver doesn't provide a way to close its http client.
72
+ end
73
+
74
+ # The following are intentionally not documented
75
+
76
+ def create_session
77
+ raise NotImplementedError
78
+ end
79
+
80
+ def connect(uri, options: {}, &block)
81
+ raise NotImplementedError
82
+ end
83
+
84
+ def head(url, headers: {}, params: {}, options: {})
85
+ raise NotImplementedError
86
+ end
87
+
88
+ def put(url, headers: {}, params: {}, options: {})
89
+ raise NotImplementedError
90
+ end
91
+
92
+ def delete(url, headers: {}, params: {}, options: {})
93
+ raise NotImplementedError
94
+ end
95
+
96
+ end
@@ -1,8 +1,30 @@
1
+ #
2
+ # @api private
3
+ #
4
+ # Handle HTTP redirects
5
+ #
1
6
  class Puppet::HTTP::Redirector
7
+ #
8
+ # @api private
9
+ #
10
+ # Create a new redirect handler
11
+ #
12
+ # @param [Integer] redirect_limit maximum number of redirects allowed
13
+ #
2
14
  def initialize(redirect_limit)
3
15
  @redirect_limit = redirect_limit
4
16
  end
5
17
 
18
+ #
19
+ # @api private
20
+ #
21
+ # Determine of the HTTP response code indicates a redirect
22
+ #
23
+ # @param [Net::HTTP] request request that received the response
24
+ # @param [Puppet::HTTP::Response] response
25
+ #
26
+ # @return [Boolean] true if the response code is 301, 302, or 307.
27
+ #
6
28
  def redirect?(request, response)
7
29
  # Net::HTTPRedirection is not used because historically puppet
8
30
  # has only handled these, and we're not a browser
@@ -14,6 +36,18 @@ class Puppet::HTTP::Redirector
14
36
  end
15
37
  end
16
38
 
39
+ #
40
+ # @api private
41
+ #
42
+ # Implement the HTTP request redirection
43
+ #
44
+ # @param [Net::HTTP] request request that has been redirected
45
+ # @param [Puppet::HTTP::Response] response
46
+ # @param [Integer] redirects the current number of redirects
47
+ #
48
+ # @return [Net::HTTP] A new request based on the original request, but with
49
+ # the redirected location
50
+ #
17
51
  def redirect_to(request, response, redirects)
18
52
  raise Puppet::HTTP::TooManyRedirects.new(request.uri) if redirects >= @redirect_limit
19
53
 
@@ -1,17 +1,60 @@
1
+ #
2
+ # @api private
3
+ #
4
+ # Resolver base class. Each resolver represents a different strategy for
5
+ # resolving a service name into a list of candidate servers and ports.
6
+ #
7
+ # @abstract Subclass and override {#resolve} to create a new resolver.
8
+ #
1
9
  class Puppet::HTTP::Resolver
10
+ #
11
+ # @api private
12
+ #
13
+ # Create a new resolver
14
+ #
15
+ # @param [Puppet::HTTP::Client] client
16
+ #
2
17
  def initialize(client)
3
18
  @client = client
4
19
  end
5
20
 
6
- def resolve(session, name, ssl_context: nil)
21
+ #
22
+ # @api private
23
+ #
24
+ # Return a working server/port for the resolver. This is the base
25
+ # implementation and is meant to be a placeholder.
26
+ #
27
+ # @param [Puppet::HTTP::Session] session
28
+ # @param [Symbol] name the service to resolve
29
+ # @param [Puppet::SSL::SSLContext] ssl_context (nil) optional ssl context to
30
+ # use when creating a connection
31
+ # @param [Proc] error_handler (nil) optional callback for each error
32
+ # encountered while resolving a route.
33
+ #
34
+ # @raise [NotImplementedError] this base class is not implemented
35
+ #
36
+ def resolve(session, name, ssl_context: nil, error_handler: nil)
7
37
  raise NotImplementedError
8
38
  end
9
39
 
10
- def check_connection?(session, service, ssl_context: nil)
40
+ #
41
+ # @api private
42
+ #
43
+ # Check a given connection to establish if it can be relied on for future use
44
+ #
45
+ # @param [Puppet::HTTP::Session] session
46
+ # @param [Puppet::HTTP::Service] service
47
+ # @param [Puppet::SSL::SSLContext] ssl_context
48
+ # @param [Proc] error_handler (nil) optional callback for each error
49
+ # encountered while resolving a route.
50
+ #
51
+ # @return [Boolean] Returns true if a connection is successful, false otherwise
52
+ #
53
+ def check_connection?(session, service, ssl_context: nil, error_handler: nil)
11
54
  service.connect(ssl_context: ssl_context)
12
55
  return true
13
56
  rescue Puppet::HTTP::ConnectionError => e
14
- session.add_exception(e)
57
+ error_handler.call(e) if error_handler
15
58
  Puppet.debug("Connection to #{service.url} failed, trying next route: #{e.message}")
16
59
  return false
17
60
  end
@@ -1,36 +1,96 @@
1
+ #
2
+ # @api private
3
+ #
4
+ # Use the server_list setting to resolve a service. This resolver is only used
5
+ # if server_list is set either on the command line or in the configuration file.
6
+ #
1
7
  class Puppet::HTTP::Resolver::ServerList < Puppet::HTTP::Resolver
8
+ #
9
+ # @api private
10
+ #
11
+ # @param [Puppet::HTTP::Client] client
12
+ # @param [Array<String>] server_list_setting array of servers set via the
13
+ # configuration or the command line
14
+ # @param [Integer] default_port if a port is not set for a server in
15
+ # server_list, use this port
16
+ # @param [Array<Symbol>] services array of services that server_list can be
17
+ # used to resolve. If a service is not included in this array, this resolver
18
+ # will return nil.
19
+ #
2
20
  def initialize(client, server_list_setting:, default_port:, services: )
3
21
  @client = client
4
22
  @server_list_setting = server_list_setting
5
23
  @default_port = default_port
6
24
  @services = services
25
+ @resolved_url = nil
7
26
  end
8
27
 
9
- def resolve(session, name, ssl_context: nil)
10
- if @services.include?(name)
11
- @server_list_setting.value.each do |server|
12
- host = server[0]
13
- port = server[1] || @default_port
14
- uri = URI("https://#{host}:#{port}/status/v1/simple/master")
15
- if get_success?(uri, session, ssl_context: ssl_context)
16
- return Puppet::HTTP::Service.create_service(@client, session, name, host, port)
17
- end
28
+ #
29
+ # @api private
30
+ #
31
+ # Walk the server_list to find a server and port that will connect successfully.
32
+ #
33
+ # @param [Puppet::HTTP::Session] session <description>
34
+ # @param [Symbol] name the name of the service being resolved
35
+ # @param [Puppet::SSL::SSLContext] ssl_context
36
+ # @param [Proc] error_handler (nil) optional callback for each error
37
+ # encountered while resolving a route.
38
+ #
39
+ # @return [nil] return nil if the service to be resolved does not support
40
+ # server_list
41
+ # @return [Puppet::HTTP::Service] a validated service to use for future HTTP
42
+ # requests
43
+ #
44
+ # @raise [Puppet::Error] raise if none of the servers defined in server_list
45
+ # are available
46
+ #
47
+ def resolve(session, name, ssl_context: nil, error_handler: nil)
48
+ # If we're configured to use an explicit service host, e.g. report_server
49
+ # then don't use server_list to resolve the `:report` service.
50
+ return nil unless @services.include?(name)
51
+
52
+ # If we resolved the URL already, use its host & port for the service
53
+ if @resolved_url
54
+ return Puppet::HTTP::Service.create_service(@client, session, name, @resolved_url.host, @resolved_url.port)
55
+ end
56
+
57
+ # Return the first simple service status endpoint we can connect to
58
+ @server_list_setting.value.each do |server|
59
+ host = server[0]
60
+ port = server[1] || @default_port
61
+ uri = URI("https://#{host}:#{port}/status/v1/simple/master")
62
+ if get_success?(uri, session, ssl_context: ssl_context, error_handler: error_handler)
63
+ @resolved_url = uri
64
+ return Puppet::HTTP::Service.create_service(@client, session, name, host, port)
18
65
  end
19
- raise Puppet::Error, _("Could not select a functional puppet master from server_list: '%{server_list}'") % { server_list: @server_list_setting.print(@server_list_setting.value) }
20
- else
21
- return nil
22
66
  end
67
+
68
+ raise Puppet::Error, _("Could not select a functional puppet master from server_list: '%{server_list}'") % { server_list: @server_list_setting.print(@server_list_setting.value) }
23
69
  end
24
70
 
25
- def get_success?(uri, session, ssl_context: nil)
26
- response = @client.get(uri, ssl_context: ssl_context)
71
+ #
72
+ # @api private
73
+ #
74
+ # Check if a server and port is available
75
+ #
76
+ # @param [URI] uri A URI created from the server and port to test
77
+ # @param [Puppet::HTTP::Session] session
78
+ # @param [Puppet::SSL::SSLContext] ssl_context
79
+ # @param [Proc] error_handler (nil) optional callback for each error
80
+ # encountered while resolving a route.
81
+ #
82
+ # @return [Boolean] true if a successful response is returned by the server,
83
+ # false otherwise
84
+ #
85
+ def get_success?(uri, session, ssl_context: nil, error_handler: nil)
86
+ response = @client.get(uri, options: {ssl_context: ssl_context})
27
87
  return true if response.success?
28
88
 
29
89
  Puppet.debug(_("Puppet server %{host}:%{port} is unavailable: %{code} %{reason}") %
30
90
  { host: uri.host, port: uri.port, code: response.code, reason: response.reason })
31
91
  return false
32
92
  rescue => detail
33
- session.add_exception(detail)
93
+ error_handler.call(detail) if error_handler
34
94
  #TRANSLATORS 'server_list' is the name of a setting and should not be translated
35
95
  Puppet.debug _("Unable to connect to server from server_list setting: %{detail}") % {detail: detail}
36
96
  return false
@@ -1,6 +1,26 @@
1
+ #
2
+ # @api private
3
+ #
4
+ # Resolve a service using settings. This is the default resolver if none of the
5
+ # other resolvers find a functional connection.
6
+ #
1
7
  class Puppet::HTTP::Resolver::Settings < Puppet::HTTP::Resolver
2
- def resolve(session, name, ssl_context: nil)
8
+ #
9
+ # @api private
10
+ #
11
+ # Resolve a service using the default server and port settings for this service.
12
+ #
13
+ # @param [Puppet::HTTP::Session] session
14
+ # @param [Symbol] name the name of the service to be resolved
15
+ # @param [Puppet::SSL::SSLContext] ssl_context
16
+ # @param [Proc] error_handler (nil) optional callback for each error
17
+ # encountered while resolving a route.
18
+ #
19
+ # @return [Puppet::HTTP::Service] if the service successfully connects,
20
+ # return it. Otherwise, return nil.
21
+ #
22
+ def resolve(session, name, ssl_context: nil, error_handler: nil)
3
23
  service = Puppet::HTTP::Service.create_service(@client, session, name)
4
- check_connection?(session, service, ssl_context: ssl_context) ? service : nil
24
+ check_connection?(session, service, ssl_context: ssl_context, error_handler: error_handler) ? service : nil
5
25
  end
6
26
  end
@@ -1,17 +1,43 @@
1
+ #
2
+ # @api private
3
+ #
4
+ # Resolve a service using SRV
5
+ #
1
6
  class Puppet::HTTP::Resolver::SRV < Puppet::HTTP::Resolver
7
+ #
8
+ # @api private
9
+ #
10
+ # @param [Puppet::HTTP::Client] client
11
+ # @param [String] domain srv domain
12
+ # @param [Resolv::DNS] dns
13
+ #
2
14
  def initialize(client, domain:, dns: Resolv::DNS.new)
3
15
  @client = client
4
16
  @srv_domain = domain
5
17
  @delegate = Puppet::Network::Resolver.new(dns)
6
18
  end
7
19
 
8
- def resolve(session, name, ssl_context: nil)
20
+ #
21
+ # @api private
22
+ #
23
+ # Walk the available srv records and return the first that successfully connects
24
+ #
25
+ # @param [Puppet::HTTP::Session] session
26
+ # @param [Symbol] name the service being resolved
27
+ # @param [Puppet::SSL::SSLContext] ssl_context
28
+ # @param [Proc] error_handler (nil) optional callback for each error
29
+ # encountered while resolving a route.
30
+ #
31
+ # @return [Puppet::HTTP::Service] if an available service is found, return
32
+ # it. Return nil otherwise.
33
+ #
34
+ def resolve(session, name, ssl_context: nil, error_handler: nil)
9
35
  # Here we pass our HTTP service name as the DNS SRV service name
10
36
  # This is fine for :ca, but note that :puppet and :file are handled
11
37
  # specially in `each_srv_record`.
12
38
  @delegate.each_srv_record(@srv_domain, name) do |server, port|
13
39
  service = Puppet::HTTP::Service.create_service(@client, session, name, server, port)
14
- return service if check_connection?(session, service, ssl_context: ssl_context)
40
+ return service if check_connection?(session, service, ssl_context: ssl_context, error_handler: error_handler)
15
41
  end
16
42
 
17
43
  return nil
@@ -1,37 +1,99 @@
1
+ #
2
+ # @api private
3
+ #
4
+ # Represents the response returned from the server from an HTTP request
5
+ #
1
6
  class Puppet::HTTP::Response
2
- attr_reader :nethttp, :url
7
+ # @api private
8
+ # @return [Net::HTTP] the Net::HTTP response
9
+ attr_reader :nethttp
3
10
 
11
+ # @api private
12
+ # @return [URI] the response uri
13
+ attr_reader :url
14
+
15
+ #
16
+ # @api private
17
+ #
18
+ # Object to represent the response returned from an HTTP request
19
+ #
20
+ # @param [Net::HTTP] nethttp the request response
21
+ # @param [URI] url
22
+ #
4
23
  def initialize(nethttp, url)
5
24
  @nethttp = nethttp
6
25
  @url = url
7
26
  end
8
27
 
28
+ #
29
+ # @api private
30
+ #
31
+ # Extract the response code
32
+ #
33
+ # @return [Integer] Response code for the request
34
+ #
9
35
  def code
10
36
  @nethttp.code.to_i
11
37
  end
12
38
 
39
+ #
40
+ # @api private
41
+ #
42
+ # Extract the response message
43
+ #
44
+ # @return [String] Response message for the request
45
+ #
13
46
  def reason
14
47
  @nethttp.message
15
48
  end
16
49
 
50
+ #
51
+ # @api private
52
+ #
53
+ # Returns the entire response body. Can be used instead of
54
+ # Puppet::HTTP::Response.read_body, but both methods cannot be used for the
55
+ # same response.
56
+ #
57
+ # @return [String] Response body for the request
58
+ #
17
59
  def body
18
60
  @nethttp.body
19
61
  end
20
62
 
63
+ #
64
+ # @api private
65
+ #
66
+ # Streams the response body to the caller in chunks. Can be used instead of
67
+ # Puppet::HTTP::Response.body, but both methods cannot be used for the same
68
+ # response.
69
+ #
70
+ # @yield [String] Streams the response body in chunks
71
+ #
72
+ # @raise [ArgumentError] raise if a block is not given
73
+ #
21
74
  def read_body(&block)
22
75
  raise ArgumentError, "A block is required" unless block_given?
23
76
 
24
77
  @nethttp.read_body(&block)
25
78
  end
26
79
 
80
+ #
81
+ # @api private
82
+ #
83
+ # Check if the request received a response of success
84
+ #
85
+ # @return [Boolean] Returns true if the response indicates success
86
+ #
27
87
  def success?
28
88
  @nethttp.is_a?(Net::HTTPSuccess)
29
89
  end
30
90
 
91
+ # @api private
31
92
  def [](name)
32
93
  @nethttp[name]
33
94
  end
34
95
 
96
+ # @api private
35
97
  def drain
36
98
  body
37
99
  true