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
@@ -1,14 +1,58 @@
1
1
  require 'puppet/file_serving/metadata'
2
2
 
3
+ #
4
+ # @api private
5
+ #
6
+ # The FileServer service is used to retrieve file metadata and content
7
+ #
3
8
  class Puppet::HTTP::Service::FileServer < Puppet::HTTP::Service
9
+ # @api private
10
+ # @return [String] Default API for the FileServer service
4
11
  API = '/puppet/v3'.freeze
12
+
13
+ # @api private
14
+ # @return [RegEx] RegEx used to determine if a path contains a leading slash
5
15
  PATH_REGEX = /^\//
6
16
 
17
+ #
18
+ # @api private
19
+ #
20
+ # @param [Puppet::HTTP::Client] client
21
+ # @param [Puppet::HTTP::Session] session
22
+ # @param [String] server (Puppet[:ca_server]) If an explicit server is given,
23
+ # create a service using that server. If server is nil, the default value
24
+ # is used to create the service.
25
+ # @param [Integer] port (Puppet[:ca_port]) If an explicit port is given, create
26
+ # a service using that port. If port is nil, the default value is used to
27
+ # create the service.
28
+ #
7
29
  def initialize(client, session, server, port)
8
30
  url = build_url(API, server || Puppet[:server], port || Puppet[:masterport])
9
31
  super(client, session, url)
10
32
  end
11
33
 
34
+ #
35
+ # @api private
36
+ #
37
+ # Submit a GET request to the server to retrieve the metadata for a specified
38
+ # file
39
+ #
40
+ # @param [String] path path to the file to retrieve data from
41
+ # @param [String] environment the name of the environment we are operating in
42
+ # @param [Symbol] links Can be one of either `:follow` or `:manage`, defines
43
+ # how links are handled.
44
+ # @param [String] checksum_type The digest algorithm used to verify the file.
45
+ # Currently if fips is enabled, this defaults to `sha256`. Otherwise, it
46
+ # defaults to `md5`.
47
+ # @param [Symbol] source_permissions Can be one of `:use`, `:use_when_creating`,
48
+ # or `:ignore`. This parameter tells the server if it should include the
49
+ # file permissions in the response. If set to `:ignore`, the server will
50
+ # return default permissions.
51
+ #
52
+ # @return [Array<Puppet::HTTP::Response, Puppet::FileServing::Metadata>] An
53
+ # array with the request response and the deserialized metadata for the
54
+ # file returned from the server
55
+ #
12
56
  def get_file_metadata(path:, environment:, links: :manage, checksum_type: Puppet[:digest_algorithm], source_permissions: :ignore)
13
57
  validate_path(path)
14
58
 
@@ -27,9 +71,41 @@ class Puppet::HTTP::Service::FileServer < Puppet::HTTP::Service
27
71
 
28
72
  process_response(response)
29
73
 
30
- deserialize(response, Puppet::FileServing::Metadata)
74
+ [response, deserialize(response, Puppet::FileServing::Metadata)]
31
75
  end
32
76
 
77
+ #
78
+ # @api private
79
+ #
80
+ # Submit a GET request to the server to retrieve the metadata for multiple files
81
+ #
82
+ # @param [String] path path to the file(s) to retrieve data from
83
+ # @param [String] environment the name of the environment we are operating in
84
+ # @param [Symbol] recurse Can be `:true`, `:false`, or `:remote`. Defines if
85
+ # we recursively return the contents of the directory. Used in conjunction
86
+ # with `:recurselimit`. See the reference documentation for the file type
87
+ # for more details.
88
+ # @param [Integer] recurselimit When `recurse` is set, `recurselimit` defines
89
+ # how far Puppet should descend into subdirectories. `0` is effectively the
90
+ # same as `recurse => false`, `1` will return files and directories directly
91
+ # inside the defined directory, `2` will return the direct content of the
92
+ # directory as well as the contents of the _first_ level of subdirectories.
93
+ # The pattern continues for each incremental value. See the reference
94
+ # documentation for the file type for more details.
95
+ # @param [Array<String>] ignore An optional array of files to ignore, ie `['CVS', '.git', '.hg']`
96
+ # @param [Symbol] links Can be one of either `:follow` or `:manage`, defines
97
+ # how links are handled.
98
+ # @param [String] checksum_type The digest algorithm used to verify the file.
99
+ # Currently if fips is enabled, this defaults to `sha256`. Otherwise, it's `md5`.
100
+ # @param [Symbol] source_permissions Can be one of `:use`, `:use_when_creating`,
101
+ # or `:ignore`. This parameter tells the server if it should include the
102
+ # file permissions in the report. If set to `:ignore`, the server will return
103
+ # default permissions.
104
+ #
105
+ # @return [Array<Puppet::HTTP::Response, Array<Puppet::FileServing::Metadata>>]
106
+ # An array with the request response and an array of the deserialized
107
+ # metadata for each file returned from the server
108
+ #
33
109
  def get_file_metadatas(path: nil, environment:, recurse: :false, recurselimit: nil, ignore: nil, links: :manage, checksum_type: Puppet[:digest_algorithm], source_permissions: :ignore)
34
110
  validate_path(path)
35
111
 
@@ -51,9 +127,21 @@ class Puppet::HTTP::Service::FileServer < Puppet::HTTP::Service
51
127
 
52
128
  process_response(response)
53
129
 
54
- deserialize_multiple(response, Puppet::FileServing::Metadata)
130
+ [response, deserialize_multiple(response, Puppet::FileServing::Metadata)]
55
131
  end
56
132
 
133
+ #
134
+ # @api private
135
+ #
136
+ # Submit a GET request to the server to retrieve content of a file
137
+ #
138
+ # @param [String] path path to the file to retrieve data from
139
+ # @param [String] environment the name of the environment we are operating in
140
+ #
141
+ # @yield [Sting] Yields the body of the response returned from the server
142
+ #
143
+ # @return [Puppet::HTTP::Response] The request response
144
+ #
57
145
  def get_file_content(path:, environment:, &block)
58
146
  validate_path(path)
59
147
 
@@ -72,9 +160,22 @@ class Puppet::HTTP::Service::FileServer < Puppet::HTTP::Service
72
160
 
73
161
  process_response(response)
74
162
 
75
- nil
163
+ response
76
164
  end
77
165
 
166
+ #
167
+ # @api private
168
+ #
169
+ # Submit a GET request to
170
+ #
171
+ # @param [String] path path to the file to retrieve data from
172
+ # @param [String] environment the name of the environment we are operating in
173
+ # @param [String] code_id Defines the version of the resource to return
174
+ #
175
+ # @yield [String] Yields the body of the response returned
176
+ #
177
+ # @return [Puppet::HTTP::Response] The request response
178
+ #
78
179
  def get_static_file_content(path:, environment:, code_id:, &block)
79
180
  validate_path(path)
80
181
 
@@ -94,7 +195,7 @@ class Puppet::HTTP::Service::FileServer < Puppet::HTTP::Service
94
195
 
95
196
  process_response(response)
96
197
 
97
- nil
198
+ response
98
199
  end
99
200
 
100
201
  private
@@ -1,21 +1,54 @@
1
+ #
2
+ # @api private
3
+ #
4
+ # The Report service is used to submit run reports to the report server
5
+ #
1
6
  class Puppet::HTTP::Service::Report < Puppet::HTTP::Service
7
+
8
+ # @api private
9
+ # @return [String] Default API for the report service
2
10
  API = '/puppet/v3'.freeze
3
11
 
12
+ #
13
+ # @api private
14
+ #
15
+ # @param [Puppet::HTTP::Client] client
16
+ # @param [Puppet::HTTP::Session] session
17
+ # @param [String] server (Puppet[:ca_server]) If an explicit server is given,
18
+ # create a service using that server. If server is nil, the default value
19
+ # is used to create the service.
20
+ # @param [Integer] port (Puppet[:ca_port]) If an explicit port is given, create
21
+ # a service using that port. If port is nil, the default value is used to
22
+ # create the service.
23
+ #
4
24
  def initialize(client, session, server, port)
5
25
  url = build_url(API, server || Puppet[:report_server], port || Puppet[:report_port])
6
26
  super(client, session, url)
7
27
  end
8
28
 
29
+ #
30
+ # @api private
31
+ #
32
+ # Submit a report to the report server
33
+ #
34
+ # @param [String] name the name of the report being submitted
35
+ # @param [Puppet::Transaction::Report] report run report to be submitted
36
+ # @param [String] environment name of the agent environment
37
+ #
38
+ # @return [Puppet::HTTP::Response] response returned by the server
39
+ #
9
40
  def put_report(name, report, environment:)
10
41
  formatter = Puppet::Network::FormatHandler.format_for(Puppet[:preferred_serialization_format])
11
- headers = add_puppet_headers('Accept' => get_mime_types(Puppet::Transaction::Report).join(', '))
42
+ headers = add_puppet_headers(
43
+ 'Accept' => get_mime_types(Puppet::Transaction::Report).join(', '),
44
+ 'Content-Type' => formatter.mime
45
+ )
12
46
 
13
47
  response = @client.put(
14
48
  with_base_url("/report/#{name}"),
49
+ serialize(formatter, report),
15
50
  headers: headers,
16
51
  params: { environment: environment },
17
- content_type: formatter.mime,
18
- body: serialize(formatter, report)
19
52
  )
20
53
 
21
54
  # override parent's process_response handling
@@ -1,3 +1,8 @@
1
+ #
2
+ # @api private
3
+ #
4
+ # The session is the mechanism by which services may be connected to and accessed.
5
+ #
1
6
  class Puppet::HTTP::Session
2
7
  # capabilities for a site
3
8
  CAP_LOCALES = 'locales'.freeze
@@ -9,14 +14,43 @@ class Puppet::HTTP::Session
9
14
  # puppet version where JSON was enabled by default
10
15
  SUPPORTED_JSON_DEFAULT = Gem::Version.new("5.0.0")
11
16
 
17
+ #
18
+ # @api private
19
+ #
20
+ # Create a new HTTP session. The session is the mechanism by which services
21
+ # may be connected to and accessed.
22
+ #
23
+ # @param [Puppet::HTTP::Client] client the container for this session
24
+ # @param [Array<Puppet::HTTP::Resolver>] resolvers array of resolver strategies
25
+ # to implement.
26
+ #
12
27
  def initialize(client, resolvers)
13
28
  @client = client
14
29
  @resolvers = resolvers
15
30
  @resolved_services = {}
16
- @resolution_exceptions = []
17
31
  @server_versions = {}
18
32
  end
19
33
 
34
+ #
35
+ # @api private
36
+ #
37
+ # If an explicit server and port are specified on the command line or
38
+ # configuration file, this method always returns a Service with that host and
39
+ # port. Otherwise, we walk the list of resolvers in priority order:
40
+ # - DNS SRV
41
+ # - Server List
42
+ # - Puppet server/port settings
43
+ # If a given resolver fails to connect, it tries the next available resolver
44
+ # until a successful connection is found and returned. The successful service
45
+ # is cached and returned if `route_to` is called again.
46
+ #
47
+ # @param [Symbol] name the service to resolve
48
+ # @param [URI] url (nil) optional explicit url to use, if it is already known
49
+ # @param [Puppet::SSL::SSLContext] ssl_context ssl_context ssl context to be
50
+ # used for connections
51
+ #
52
+ # @return [Puppet::HTTP::Service] the resolved service
53
+ #
20
54
  def route_to(name, url: nil, ssl_context: nil)
21
55
  raise ArgumentError, "Unknown service #{name}" unless Puppet::HTTP::Service.valid_name?(name)
22
56
 
@@ -30,11 +64,12 @@ class Puppet::HTTP::Session
30
64
  cached = @resolved_services[name]
31
65
  return cached if cached
32
66
 
33
- @resolution_exceptions = []
67
+ resolution_exceptions = []
68
+ error_handler = proc { |e| resolution_exceptions << e }
34
69
 
35
70
  @resolvers.each do |resolver|
36
71
  Puppet.debug("Resolving service '#{name}' using #{resolver.class}")
37
- service = resolver.resolve(self, name, ssl_context: ssl_context)
72
+ service = resolver.resolve(self, name, ssl_context: ssl_context, error_handler: error_handler)
38
73
  if service
39
74
  @resolved_services[name] = service
40
75
  Puppet.debug("Resolved service '#{name}' to #{service.url}")
@@ -42,14 +77,18 @@ class Puppet::HTTP::Session
42
77
  end
43
78
  end
44
79
 
45
- @resolution_exceptions.each { |e| Puppet.log_exception(e) }
80
+ resolution_exceptions.each { |e| Puppet.log_exception(e) }
46
81
  raise Puppet::HTTP::RouteError, "No more routes to #{name}"
47
82
  end
48
83
 
49
- def add_exception(exception)
50
- @resolution_exceptions << exception
51
- end
52
-
84
+ #
85
+ # @api private
86
+ #
87
+ # Collect per-site server versions. This will allow us to modify future
88
+ # requests based on the version of puppetserver we are talking to.
89
+ #
90
+ # @param [Puppet::HTTP::Response] response the request response containing headers
91
+ #
53
92
  def process_response(response)
54
93
  version = response[Puppet::HTTP::HEADER_PUPPET_VERSION]
55
94
  if version
@@ -58,6 +97,18 @@ class Puppet::HTTP::Session
58
97
  end
59
98
  end
60
99
 
100
+ #
101
+ # @api private
102
+ #
103
+ # Determine if a session supports a capability. Depending on the server version
104
+ # we are talking to, we know certain features are available or not. These
105
+ # specifications are defined here so we can modify our requests appropriately.
106
+ #
107
+ # @param [Symbol] name name of the service to check
108
+ # @param [String] capability the capability, ie `locales` or `json`
109
+ #
110
+ # @return [Boolean]
111
+ #
61
112
  def supports?(name, capability)
62
113
  raise ArgumentError, "Unknown service #{name}" unless Puppet::HTTP::Service.valid_name?(name)
63
114
 
@@ -15,7 +15,7 @@ class Puppet::Resource::Catalog::Rest < Puppet::Indirector::REST
15
15
 
16
16
  session = Puppet.lookup(:http_session)
17
17
  api = session.route_to(:puppet)
18
- api.post_catalog(
18
+ _, catalog = api.post_catalog(
19
19
  request.key,
20
20
  facts: request.options[:facts_for_catalog],
21
21
  environment: request.environment.to_s,
@@ -25,6 +25,7 @@ class Puppet::Resource::Catalog::Rest < Puppet::Indirector::REST
25
25
  static_catalog: request.options[:static_catalog],
26
26
  checksum_type: checksum_type
27
27
  )
28
+ catalog
28
29
  rescue Puppet::HTTP::ResponseError => e
29
30
  if e.response.code == 404
30
31
  return nil unless request.options[:fail_on_404]
@@ -9,10 +9,11 @@ class Puppet::Node::Facts::Rest < Puppet::Indirector::REST
9
9
 
10
10
  session = Puppet.lookup(:http_session)
11
11
  api = session.route_to(:puppet)
12
- api.get_facts(
12
+ _, facts = api.get_facts(
13
13
  request.key,
14
14
  environment: request.environment.to_s
15
15
  )
16
+ facts
16
17
  rescue Puppet::HTTP::ResponseError => e
17
18
  if e.response.code == 404
18
19
  return nil unless request.options[:fail_on_404]
@@ -4,5 +4,53 @@ require 'puppet/file_bucket/file'
4
4
  module Puppet::FileBucketFile
5
5
  class Rest < Puppet::Indirector::REST
6
6
  desc "This is a REST based mechanism to send/retrieve file to/from the filebucket"
7
+
8
+ def head(request)
9
+ return super unless use_http_client?
10
+
11
+ session = Puppet.lookup(:http_session)
12
+ api = session.route_to(:puppet)
13
+ api.head_filebucket_file(
14
+ request.key,
15
+ environment: request.environment.to_s,
16
+ bucket_path: request.options[:bucket_path],
17
+ )
18
+ rescue Puppet::HTTP::ResponseError => e
19
+ return nil if e.response.code == 404
20
+ raise convert_to_http_error(e.response.nethttp)
21
+ end
22
+
23
+ def find(request)
24
+ return super unless use_http_client?
25
+
26
+ session = Puppet.lookup(:http_session)
27
+ api = session.route_to(:puppet)
28
+ _, filebucket_file = api.get_filebucket_file(
29
+ request.key,
30
+ environment: request.environment.to_s,
31
+ bucket_path: request.options[:bucket_path],
32
+ diff_with: request.options[:diff_with],
33
+ list_all: request.options[:list_all],
34
+ fromdate: request.options[:fromdate],
35
+ todate: request.options[:todate],
36
+ )
37
+ filebucket_file
38
+ rescue Puppet::HTTP::ResponseError => e
39
+ raise convert_to_http_error(e.response.nethttp)
40
+ end
41
+
42
+ def save(request)
43
+ return super unless use_http_client?
44
+
45
+ session = Puppet.lookup(:http_session)
46
+ api = session.route_to(:puppet)
47
+ api.put_filebucket_file(
48
+ request.key,
49
+ body: request.instance.render,
50
+ environment: request.environment.to_s,
51
+ )
52
+ rescue Puppet::HTTP::ResponseError => e
53
+ raise convert_to_http_error(e.response.nethttp)
54
+ end
7
55
  end
8
56
  end
@@ -14,13 +14,14 @@ class Puppet::Indirector::FileMetadata::Rest < Puppet::Indirector::REST
14
14
  session = Puppet.lookup(:http_session)
15
15
  api = session.route_to(:fileserver, url: url)
16
16
 
17
- api.get_file_metadata(
17
+ _, file_metadata = api.get_file_metadata(
18
18
  path: URI.unescape(url.path),
19
19
  environment: request.environment.to_s,
20
20
  links: request.options[:links],
21
21
  checksum_type: request.options[:checksum_type],
22
22
  source_permissions: request.options[:source_permissions]
23
23
  )
24
+ file_metadata
24
25
  rescue Puppet::HTTP::ResponseError => e
25
26
  if e.response.code == 404
26
27
  return nil unless request.options[:fail_on_404]
@@ -40,7 +41,7 @@ class Puppet::Indirector::FileMetadata::Rest < Puppet::Indirector::REST
40
41
  session = Puppet.lookup(:http_session)
41
42
  api = session.route_to(:fileserver, url: url)
42
43
 
43
- api.get_file_metadatas(
44
+ _, file_metadatas = api.get_file_metadatas(
44
45
  path: URI.unescape(url.path),
45
46
  environment: request.environment.to_s,
46
47
  recurse: request.options[:recurse],
@@ -50,6 +51,7 @@ class Puppet::Indirector::FileMetadata::Rest < Puppet::Indirector::REST
50
51
  checksum_type: request.options[:checksum_type],
51
52
  source_permissions: request.options[:source_permissions],
52
53
  )
54
+ file_metadatas
53
55
  rescue Puppet::HTTP::ResponseError => e
54
56
  # since it's search, return empty array instead of nil
55
57
  return [] if e.response.code == 404
@@ -10,12 +10,13 @@ class Puppet::Node::Rest < Puppet::Indirector::REST
10
10
 
11
11
  session = Puppet.lookup(:http_session)
12
12
  api = session.route_to(:puppet)
13
- api.get_node(
13
+ _, node = api.get_node(
14
14
  request.key,
15
15
  environment: request.environment.to_s,
16
16
  configured_environment: request.options[:configured_environment],
17
17
  transaction_uuid: request.options[:transaction_uuid]
18
18
  )
19
+ node
19
20
  rescue Puppet::HTTP::ResponseError => e
20
21
  if e.response.code == 404
21
22
  return nil unless request.options[:fail_on_404]