puppet 6.14.0-universal-darwin → 6.15.0-universal-darwin

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,12 +1,37 @@
1
1
  require 'date'
2
2
  require 'time'
3
3
 
4
+ #
5
+ # @api private
6
+ #
7
+ # Parse information relating to responses containing a Retry-After headers
8
+ #
4
9
  class Puppet::HTTP::RetryAfterHandler
10
+ #
11
+ # @api private
12
+ #
13
+ # Create a handler to allow the system to sleep between HTTP requests
14
+ #
15
+ # @param [Integer] retry_limit number of retries allowed
16
+ # @param [Integer] max_sleep maximum sleep time allowed
17
+ #
5
18
  def initialize(retry_limit, max_sleep)
6
19
  @retry_limit = retry_limit
7
20
  @max_sleep = max_sleep
8
21
  end
9
22
 
23
+ #
24
+ # @api private
25
+ #
26
+ # Does the response from the server tell us to wait until we attempt the next
27
+ # retry?
28
+ #
29
+ # @param [Net::HTTP] request
30
+ # @param [Puppet::HTTP::Response] response
31
+ #
32
+ # @return [Boolean] Return true if the response code is 429 or 503, return
33
+ # false otherwise
34
+ #
10
35
  def retry_after?(request, response)
11
36
  case response.code
12
37
  when 429, 503
@@ -16,6 +41,20 @@ class Puppet::HTTP::RetryAfterHandler
16
41
  end
17
42
  end
18
43
 
44
+ #
45
+ # @api private
46
+ #
47
+ # The amount of time to wait before attempting a retry
48
+ #
49
+ # @param [Net::HTTP] request
50
+ # @param [Puppet::HTTP::Response] response
51
+ # @param [Integer] retries number of retries attempted so far
52
+ #
53
+ # @return [Integer] the amount of time to wait
54
+ #
55
+ # @raise [Puppet::HTTP::TooManyRetryAfters] raise if we have hit our retry
56
+ # limit
57
+ #
19
58
  def retry_after_interval(request, response, retries)
20
59
  raise Puppet::HTTP::TooManyRetryAfters.new(request.uri) if retries >= @retry_limit
21
60
 
@@ -1,9 +1,40 @@
1
+ #
2
+ # @api private
3
+ #
4
+ # Represents a puppet web service
5
+ #
1
6
  class Puppet::HTTP::Service
7
+ # @api private
8
+ # @return [URI] the url associated with this service
2
9
  attr_reader :url
3
10
 
11
+ # @api private
12
+ # @return [Array<Symbol>] available services
4
13
  SERVICE_NAMES = [:ca, :fileserver, :puppet, :report].freeze
14
+
15
+ # @api private
16
+ # @return [Array<Symbol>] format types that are unsupported
5
17
  EXCLUDED_FORMATS = [:yaml, :b64_zlib_yaml, :dot].freeze
6
18
 
19
+ #
20
+ # @api private
21
+ #
22
+ # Create a new web service, which contains the URL used to connect to the
23
+ # service. The four services implemented are `:ca`, `:fileserver`, `:puppet`,
24
+ # and `:report`.
25
+ #
26
+ # The `:ca` and `:report` services handle certs and reports, respectively. The
27
+ # `:fileserver` service handles puppet file metadata and content requests. And
28
+ # the default service, `:puppet`, handles nodes, facts, and catalogs.
29
+ #
30
+ # @param [Puppet::HTTP::Client] client the owner of the session
31
+ # @param [Puppet::HTTP::Session] session the owner of the service
32
+ # @param [Symbol] name the type of service to create
33
+ # @param [<Type>] server optional, the server to connect to
34
+ # @param [<Type>] port optional, the port to connect to
35
+ #
36
+ # @return [Puppet::HTTP::Service] an instance of the service type requested
37
+ #
7
38
  def self.create_service(client, session, name, server = nil, port = nil)
8
39
  case name
9
40
  when :ca
@@ -19,24 +50,59 @@ class Puppet::HTTP::Service
19
50
  end
20
51
  end
21
52
 
53
+ #
54
+ # @api private
55
+ #
56
+ # Check if the service named is included in the list of available services.
57
+ #
58
+ # @param [Symbol] name
59
+ #
60
+ # @return [Boolean]
61
+ #
22
62
  def self.valid_name?(name)
23
63
  SERVICE_NAMES.include?(name)
24
64
  end
25
65
 
66
+ #
67
+ # @api private
68
+ #
69
+ # Create a new service
70
+ #
71
+ # @param [Puppet::HTTP::Client] client
72
+ # @param [Puppet::HTTP::Session] session
73
+ # @param [URI] url The url to connect to
74
+ #
26
75
  def initialize(client, session, url)
27
76
  @client = client
28
77
  @session = session
29
78
  @url = url
30
79
  end
31
80
 
81
+ #
82
+ # @api private
83
+ #
84
+ # Return the url with the given path encoded and appended
85
+ #
86
+ # @param [String] path the string to append to the base url
87
+ #
88
+ # @return [URI] the URI object containing the encoded path
89
+ #
32
90
  def with_base_url(path)
33
91
  u = @url.dup
34
92
  u.path += Puppet::Util.uri_encode(path)
35
93
  u
36
94
  end
37
95
 
96
+ #
97
+ # @api private
98
+ #
99
+ # Open a connection using the given ssl context
100
+ #
101
+ # @param [Puppet::SSL::SSLContext] ssl_context (nil) optional ssl context to
102
+ # connect with
103
+ #
38
104
  def connect(ssl_context: nil)
39
- @client.connect(@url, ssl_context: ssl_context)
105
+ @client.connect(@url, options: {ssl_context: ssl_context})
40
106
  end
41
107
 
42
108
  protected
@@ -1,24 +1,70 @@
1
+ #
2
+ # @api private
3
+ #
4
+ # The Ca service is used to handle certificate requests
5
+ #
1
6
  class Puppet::HTTP::Service::Ca < Puppet::HTTP::Service
7
+ # @api private
8
+ # @return [Hash] default headers for the ca service
2
9
  HEADERS = { 'Accept' => 'text/plain' }.freeze
10
+
11
+ # @api private
12
+ # @return [String] default API for the ca service
3
13
  API = '/puppet-ca/v1'.freeze
4
14
 
15
+ #
16
+ # @api private
17
+ #
18
+ # @param [Puppet::HTTP::Client] client
19
+ # @param [Puppet::HTTP::Session] session
20
+ # @param [String] server (Puppet[:ca_server]) If an explicit server is given,
21
+ # create a service using that server. If server is nil, the default value
22
+ # is used to create the service.
23
+ # @param [Integer] port (Puppet[:ca_port]) If an explicit port is given, create
24
+ # a service using that port. If port is nil, the default value is used to
25
+ # create the service.
26
+ #
5
27
  def initialize(client, session, server, port)
6
28
  url = build_url(API, server || Puppet[:ca_server], port || Puppet[:ca_port])
7
29
  super(client, session, url)
8
30
  end
9
31
 
32
+ #
33
+ # @api private
34
+ #
35
+ # Submit a GET request to retrieve the named certificate from the server
36
+ #
37
+ # @param [String] name name of the certificate to request
38
+ # @param [Puppet::SSL::SSLContext] ssl_context
39
+ #
40
+ # @return [Array<Puppet::HTTP::Response, String>] An array containing the
41
+ # request response and the stringified body of the request response
42
+ #
10
43
  def get_certificate(name, ssl_context: nil)
11
44
  response = @client.get(
12
45
  with_base_url("/certificate/#{name}"),
13
46
  headers: add_puppet_headers(HEADERS),
14
- ssl_context: ssl_context
47
+ options: {ssl_context: ssl_context}
15
48
  )
16
49
 
17
50
  process_response(response)
18
51
 
19
- response.body.to_s
52
+ [response, response.body.to_s]
20
53
  end
21
54
 
55
+ #
56
+ # @api private
57
+ #
58
+ # Submit a GET request to retrieve the certificate revocation list from the
59
+ # server
60
+ #
61
+ # @param [Time] if_modified_since If not nil, only download the CRL if it has
62
+ # been modified since the specified time.
63
+ # @param [Puppet::SSL::SSLContext] ssl_context
64
+ #
65
+ # @return [Array<Puppet::HTTP::Response, String>] An array containing the
66
+ # request response and the stringified body of the request response
67
+ #
22
68
  def get_certificate_revocation_list(if_modified_since: nil, ssl_context: nil)
23
69
  headers = add_puppet_headers(HEADERS)
24
70
  headers['If-Modified-Since'] = if_modified_since.httpdate if if_modified_since
@@ -26,25 +72,41 @@ class Puppet::HTTP::Service::Ca < Puppet::HTTP::Service
26
72
  response = @client.get(
27
73
  with_base_url("/certificate_revocation_list/ca"),
28
74
  headers: headers,
29
- ssl_context: ssl_context
75
+ options: {ssl_context: ssl_context}
30
76
  )
31
77
 
32
78
  process_response(response)
33
79
 
34
- response.body.to_s
80
+ [response, response.body.to_s]
35
81
  end
36
82
 
83
+ #
84
+ # @api private
85
+ #
86
+ # Submit a PUT request to send a certificate request to the server
87
+ #
88
+ # @param [String] name The name of the certificate request being sent
89
+ # @param [OpenSSL::X509::Request] csr Certificate request to send to the
90
+ # server
91
+ # @param [Puppet::SSL::SSLContext] ssl_context
92
+ #
93
+ # @return [Puppet::HTTP::Response] The request response
94
+ #
37
95
  def put_certificate_request(name, csr, ssl_context: nil)
96
+ headers = add_puppet_headers(HEADERS)
97
+ headers['Content-Type'] = 'text/plain'
98
+
38
99
  response = @client.put(
39
100
  with_base_url("/certificate_request/#{name}"),
40
- headers: add_puppet_headers(HEADERS),
41
- content_type: 'text/plain',
42
- body: csr.to_pem,
43
- ssl_context: ssl_context
101
+ csr.to_pem,
102
+ headers: headers,
103
+ options: {
104
+ ssl_context: ssl_context
105
+ }
44
106
  )
45
107
 
46
108
  process_response(response)
47
109
 
48
- response.body.to_s
110
+ response
49
111
  end
50
112
  end
@@ -1,11 +1,46 @@
1
+ #
2
+ # @api private
3
+ #
4
+ # The Compiler service is used to submit and retrieve data from the
5
+ # puppetserver.
6
+ #
1
7
  class Puppet::HTTP::Service::Compiler < Puppet::HTTP::Service
8
+ # @api private
9
+ # @return [String] Default API for the Compiler 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[:server], port || Puppet[:masterport])
6
26
  super(client, session, url)
7
27
  end
8
28
 
29
+ #
30
+ # @api private
31
+ #
32
+ # Submit a GET request to retrieve a node from the server
33
+ #
34
+ # @param [String] name The name of the node being requested
35
+ # @param [String] environment The name of the environment we are operating in
36
+ # @param [String] configured_environment Optional, the name of the configured
37
+ # environment. If unset, `environment` is used.
38
+ # @param [String] transaction_uuid An agent generated transaction uuid, used
39
+ # for connecting catalogs and reports.
40
+ #
41
+ # @return [Array<Puppet::HTTP::Response, Puppet::Node>] An array containing
42
+ # the request response and the deserialized requested node
43
+ #
9
44
  def get_node(name, environment:, configured_environment: nil, transaction_uuid: nil)
10
45
  headers = add_puppet_headers('Accept' => get_mime_types(Puppet::Node).join(', '))
11
46
 
@@ -21,9 +56,35 @@ class Puppet::HTTP::Service::Compiler < Puppet::HTTP::Service
21
56
 
22
57
  process_response(response)
23
58
 
24
- deserialize(response, Puppet::Node)
59
+ [response, deserialize(response, Puppet::Node)]
25
60
  end
26
61
 
62
+ #
63
+ # @api private
64
+ #
65
+ # Submit a POST request to submit a catalog to the server
66
+ #
67
+ # @param [String] name The name of the catalog to be submitted
68
+ # @param [Puppet::Node::Facts] facts Facts for this catalog
69
+ # @param [String] environment The name of the environment we are operating in
70
+ # @param [String] configured_environment Optional, the name of the configured
71
+ # environment. If unset, `environment` is used.
72
+ # @param [String] transaction_uuid An agent generated transaction uuid, used
73
+ # for connecting catalogs and reports.
74
+ # @param [String] job_uuid A unique job identifier defined when the orchestrator
75
+ # starts a puppet run via pxp-agent. This is used to correlate catalogs and
76
+ # reports with the orchestrator job.
77
+ # @param [Boolean] static_catalog Indicates if the file metadata(s) are inlined
78
+ # in the catalog. This informs the agent if it needs to make a second request
79
+ # to retrieve metadata in addition to the initial catalog request.
80
+ # @param [Array<String>] checksum_type An array of accepted checksum type.
81
+ # Currently defaults to `["md5", "sha256", "sha384", "sha512", "sha224"]`,
82
+ # or `["sha256", "sha384", "sha512", "sha224"]` if fips is enabled.
83
+ #
84
+ # @return [Array<Puppet::HTTP::Response, Puppet::Resource::Catalog>] An array
85
+ # containing the request response and the deserialized catalog returned by
86
+ # the server
87
+ #
27
88
  def post_catalog(name, facts:, environment:, configured_environment: nil, transaction_uuid: nil, job_uuid: nil, static_catalog: true, checksum_type: Puppet[:supported_checksum_types])
28
89
  if Puppet[:preferred_serialization_format] == "pson"
29
90
  formatter = Puppet::Network::FormatHandler.format_for(:pson)
@@ -50,22 +111,36 @@ class Puppet::HTTP::Service::Compiler < Puppet::HTTP::Service
50
111
  "#{key}=#{Puppet::Util.uri_query_encode(value.to_s)}"
51
112
  end.join("&")
52
113
 
53
- headers = add_puppet_headers('Accept' => get_mime_types(Puppet::Resource::Catalog).join(', '))
114
+ headers = add_puppet_headers(
115
+ 'Accept' => get_mime_types(Puppet::Resource::Catalog).join(', '),
116
+ 'Content-Type' => 'application/x-www-form-urlencoded'
117
+ )
54
118
 
55
119
  response = @client.post(
56
120
  with_base_url("/catalog/#{name}"),
121
+ body,
57
122
  headers: headers,
58
123
  # for legacy reasons we always send environment as a query parameter too
59
124
  params: { environment: environment },
60
- content_type: 'application/x-www-form-urlencoded',
61
- body: body,
62
125
  )
63
126
 
64
127
  process_response(response)
65
128
 
66
- deserialize(response, Puppet::Resource::Catalog)
129
+ [response, deserialize(response, Puppet::Resource::Catalog)]
67
130
  end
68
131
 
132
+ #
133
+ # @api private
134
+ #
135
+ # Submit a GET request to retrieve the facts for the named node
136
+ #
137
+ # @param [String] name Name of the node to retrieve facts for
138
+ # @param [String] environment Name of the environment we are operating in
139
+ #
140
+ # @return [Array<Puppet::HTTP::Response, Puppet::Node::Facts>] An array
141
+ # containing the request response and the deserialized facts for the
142
+ # specified node
143
+ #
69
144
  def get_facts(name, environment:)
70
145
  headers = add_puppet_headers('Accept' => get_mime_types(Puppet::Node::Facts).join(', '))
71
146
 
@@ -77,27 +152,50 @@ class Puppet::HTTP::Service::Compiler < Puppet::HTTP::Service
77
152
 
78
153
  process_response(response)
79
154
 
80
- deserialize(response, Puppet::Node::Facts)
155
+ [response, deserialize(response, Puppet::Node::Facts)]
81
156
  end
82
157
 
158
+ #
159
+ # @api private
160
+ #
161
+ # Submits a PUT request to submit facts for the node to the server
162
+ #
163
+ # @param [String] name Name of the node we are submitting facts for
164
+ # @param [String] environment Name of the environment we are operating in
165
+ # @param [Puppet::Node::Facts] facts Facts for the named node
166
+ #
167
+ # @return [Puppet::HTTP::Response] The request response
168
+ #
83
169
  def put_facts(name, environment:, facts:)
84
170
  formatter = Puppet::Network::FormatHandler.format_for(Puppet[:preferred_serialization_format])
85
171
 
86
- headers = add_puppet_headers('Accept' => get_mime_types(Puppet::Node::Facts).join(', '))
172
+ headers = add_puppet_headers(
173
+ 'Accept' => get_mime_types(Puppet::Node::Facts).join(', '),
174
+ 'Content-Type' => formatter.mime
175
+ )
87
176
 
88
177
  response = @client.put(
89
178
  with_base_url("/facts/#{name}"),
179
+ serialize(formatter, facts),
90
180
  headers: headers,
91
181
  params: { environment: environment },
92
- content_type: formatter.mime,
93
- body: serialize(formatter, facts),
94
182
  )
95
183
 
96
184
  process_response(response)
97
185
 
98
- true
186
+ response
99
187
  end
100
188
 
189
+ #
190
+ # @api private
191
+ #
192
+ # Submit a GET request to find the status of a compiler
193
+ #
194
+ # @param [String] name The name of the node that a status being requested for
195
+ #
196
+ # @return [Array<Puppet::HTTP::Response, Puppet::Status>] An array containing
197
+ # the request response and the deserialized status returned from the server
198
+ #
101
199
  def get_status(name)
102
200
  headers = add_puppet_headers('Accept' => get_mime_types(Puppet::Status).join(', '))
103
201
 
@@ -112,6 +210,110 @@ class Puppet::HTTP::Service::Compiler < Puppet::HTTP::Service
112
210
 
113
211
  process_response(response)
114
212
 
115
- deserialize(response, Puppet::Status)
213
+ [response, deserialize(response, Puppet::Status)]
214
+ end
215
+
216
+ #
217
+ # @api private
218
+ #
219
+ # Submit a GET request to retrieve a file stored with filebucket
220
+ #
221
+ # @param [String] path The request path, formatted by Puppet::FileBucket::Dipper
222
+ # @param [String] environment Name of the environment we are operating in.
223
+ # This should not impact filebucket at all, but is included to be consistent
224
+ # with legacy code.
225
+ # @param [String] bucket_path
226
+ # @param [String] diff_with a checksum to diff against if we are comparing
227
+ # files that are both stored in the bucket
228
+ # @param [String] list_all
229
+ # @param [String] fromdate
230
+ # @param [String] todate
231
+ #
232
+ # @return [Array<Puppet::HTTP::Response, Puppet::FileBucket::File>] An array
233
+ # containing the request response and the deserialized file returned from
234
+ # the server.
235
+ #
236
+ def get_filebucket_file(path, environment:, bucket_path: nil, diff_with: nil, list_all: nil, fromdate: nil, todate: nil)
237
+ headers = add_puppet_headers('Accept' => 'application/octet-stream')
238
+
239
+ response = @client.get(
240
+ with_base_url("/file_bucket_file/#{path}"),
241
+ headers: headers,
242
+ params: {
243
+ environment: environment,
244
+ bucket_path: bucket_path,
245
+ diff_with: diff_with,
246
+ list_all: list_all,
247
+ fromdate: fromdate,
248
+ todate: todate
249
+ }
250
+ )
251
+
252
+ process_response(response)
253
+
254
+ [response, deserialize(response, Puppet::FileBucket::File)]
255
+ end
256
+
257
+ #
258
+ # @api private
259
+ #
260
+ # Submit a PUT request to store a file with filebucket
261
+ #
262
+ # @param [String] path The request path, formatted by Puppet::FileBucket::Dipper
263
+ # @param [String] body The contents of the file to be backed
264
+ # @param [String] environment Name of the environment we are operating in.
265
+ # This should not impact filebucket at all, but is included to be consistent
266
+ # with legacy code.
267
+ #
268
+ # @return [Puppet::HTTP::Response] The response request
269
+ #
270
+ def put_filebucket_file(path, body:, environment:)
271
+ headers = add_puppet_headers({
272
+ 'Accept' => 'application/octet-stream',
273
+ 'Content-Type' => 'application/octet-stream'
274
+ })
275
+
276
+ response = @client.put(
277
+ with_base_url("/file_bucket_file/#{path}"),
278
+ body,
279
+ headers: headers,
280
+ params: {
281
+ environment: environment
282
+ }
283
+ )
284
+
285
+ process_response(response)
286
+
287
+ response
288
+ end
289
+
290
+ #
291
+ # @api private
292
+ #
293
+ # Submit a HEAD request to check the status of a file stored with filebucket
294
+ #
295
+ # @param [String] path The request path, formatted by Puppet::FileBucket::Dipper
296
+ # @param [String] environment Name of the environment we are operating in.
297
+ # This should not impact filebucket at all, but is included to be consistent
298
+ # with legacy code.
299
+ # @param [String] bucket_path
300
+ #
301
+ # @return [Puppet::HTTP::Response] The request response
302
+ #
303
+ def head_filebucket_file(path, environment:, bucket_path: nil)
304
+ headers = add_puppet_headers('Accept' => 'application/octet-stream')
305
+
306
+ response = @client.head(
307
+ with_base_url("/file_bucket_file/#{path}"),
308
+ headers: headers,
309
+ params: {
310
+ environment: environment,
311
+ bucket_path: bucket_path
312
+ }
313
+ )
314
+
315
+ process_response(response)
316
+
317
+ response
116
318
  end
117
319
  end