puppet 6.14.0-x86-mingw32 → 6.15.0-x86-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.
- checksums.yaml +4 -4
- data/Gemfile.lock +15 -15
- data/ext/windows/service/daemon.rb +3 -3
- data/lib/puppet.rb +1 -1
- data/lib/puppet/agent.rb +2 -10
- data/lib/puppet/application/agent.rb +2 -1
- data/lib/puppet/application/filebucket.rb +5 -14
- data/lib/puppet/application/ssl.rb +2 -2
- data/lib/puppet/configurer.rb +7 -3
- data/lib/puppet/configurer/plugin_handler.rb +1 -1
- data/lib/puppet/defaults.rb +22 -2
- data/lib/puppet/environments.rb +4 -5
- data/lib/puppet/face/plugin.rb +1 -1
- data/lib/puppet/file_system/file_impl.rb +13 -9
- data/lib/puppet/forge/repository.rb +1 -1
- data/lib/puppet/functions/call.rb +1 -1
- data/lib/puppet/functions/reduce.rb +2 -4
- data/lib/puppet/http.rb +2 -0
- data/lib/puppet/http/client.rb +191 -52
- data/lib/puppet/http/external_client.rb +96 -0
- data/lib/puppet/http/redirector.rb +34 -0
- data/lib/puppet/http/resolver.rb +46 -3
- data/lib/puppet/http/resolver/server_list.rb +75 -15
- data/lib/puppet/http/resolver/settings.rb +22 -2
- data/lib/puppet/http/resolver/srv.rb +28 -2
- data/lib/puppet/http/response.rb +63 -1
- data/lib/puppet/http/retry_after_handler.rb +39 -0
- data/lib/puppet/http/service.rb +67 -1
- data/lib/puppet/http/service/ca.rb +71 -9
- data/lib/puppet/http/service/compiler.rb +213 -11
- data/lib/puppet/http/service/file_server.rb +105 -4
- data/lib/puppet/http/service/report.rb +36 -3
- data/lib/puppet/http/session.rb +59 -8
- data/lib/puppet/indirector/catalog/rest.rb +2 -1
- data/lib/puppet/indirector/facts/rest.rb +2 -1
- data/lib/puppet/indirector/file_bucket_file/rest.rb +48 -0
- data/lib/puppet/indirector/file_metadata/rest.rb +4 -2
- data/lib/puppet/indirector/node/rest.rb +2 -1
- data/lib/puppet/indirector/report/yaml.rb +23 -0
- data/lib/puppet/indirector/status/rest.rb +2 -1
- data/lib/puppet/metatype/manager.rb +80 -80
- data/lib/puppet/network/http/base_pool.rb +6 -1
- data/lib/puppet/network/http/pool.rb +2 -4
- data/lib/puppet/network/http_pool.rb +1 -0
- data/lib/puppet/node/environment.rb +11 -1
- data/lib/puppet/pal/pal_impl.rb +1 -29
- data/lib/puppet/parser/compiler.rb +14 -7
- data/lib/puppet/parser/functions.rb +18 -13
- data/lib/puppet/pops/loaders.rb +7 -5
- data/lib/puppet/provider/group/windows_adsi.rb +3 -3
- data/lib/puppet/provider/package/apt.rb +61 -1
- data/lib/puppet/provider/package/dnfmodule.rb +39 -12
- data/lib/puppet/provider/package/gem.rb +41 -7
- data/lib/puppet/provider/package/pacman.rb +2 -5
- data/lib/puppet/provider/package/pip.rb +105 -33
- data/lib/puppet/provider/package/pip3.rb +0 -2
- data/lib/puppet/provider/package/pkgdmg.rb +1 -1
- data/lib/puppet/provider/package/pkgng.rb +16 -4
- data/lib/puppet/provider/package/puppet_gem.rb +6 -2
- data/lib/puppet/provider/package/rpm.rb +6 -213
- data/lib/puppet/provider/package/yum.rb +92 -19
- data/lib/puppet/provider/service/systemd.rb +2 -1
- data/lib/puppet/reports/http.rb +13 -11
- data/lib/puppet/resource/type_collection.rb +20 -16
- data/lib/puppet/ssl.rb +1 -0
- data/lib/puppet/ssl/host.rb +4 -4
- data/lib/puppet/ssl/oids.rb +1 -0
- data/lib/puppet/ssl/state_machine.rb +50 -33
- data/lib/puppet/transaction/report.rb +2 -2
- data/lib/puppet/type.rb +6 -1
- data/lib/puppet/type/file/source.rb +4 -2
- data/lib/puppet/type/package.rb +25 -2
- data/lib/puppet/type/user.rb +0 -19
- data/lib/puppet/util/at_fork.rb +1 -1
- data/lib/puppet/util/autoload.rb +3 -0
- data/lib/puppet/util/instance_loader.rb +14 -10
- data/lib/puppet/util/package/version/debian.rb +175 -0
- data/lib/puppet/util/package/version/gem.rb +15 -0
- data/lib/puppet/util/package/version/pip.rb +167 -0
- data/lib/puppet/util/package/version/range.rb +50 -0
- data/lib/puppet/util/package/version/range/gt.rb +14 -0
- data/lib/puppet/util/package/version/range/gt_eq.rb +14 -0
- data/lib/puppet/util/package/version/range/lt.rb +14 -0
- data/lib/puppet/util/package/version/range/lt_eq.rb +14 -0
- data/lib/puppet/util/package/version/range/min_max.rb +21 -0
- data/lib/puppet/util/package/version/range/simple.rb +11 -0
- data/lib/puppet/util/package/version/rpm.rb +73 -0
- data/lib/puppet/util/pidlock.rb +13 -7
- data/lib/puppet/util/platform.rb +5 -0
- data/lib/puppet/util/rpm_compare.rb +193 -0
- data/lib/puppet/util/windows/adsi.rb +2 -2
- data/lib/puppet/util/windows/process.rb +15 -14
- data/lib/puppet/util/windows/security.rb +1 -0
- data/lib/puppet/util/windows/sid.rb +3 -3
- data/lib/puppet/version.rb +1 -1
- data/locales/puppet.pot +207 -201
- data/man/man5/puppet.conf.5 +11 -3
- data/man/man8/puppet-agent.8 +1 -1
- data/man/man8/puppet-apply.8 +1 -1
- data/man/man8/puppet-catalog.8 +1 -1
- data/man/man8/puppet-config.8 +1 -1
- data/man/man8/puppet-describe.8 +1 -1
- data/man/man8/puppet-device.8 +1 -1
- data/man/man8/puppet-doc.8 +1 -1
- data/man/man8/puppet-epp.8 +1 -1
- data/man/man8/puppet-facts.8 +1 -1
- data/man/man8/puppet-filebucket.8 +1 -1
- data/man/man8/puppet-generate.8 +1 -1
- data/man/man8/puppet-help.8 +1 -1
- data/man/man8/puppet-key.8 +1 -1
- data/man/man8/puppet-lookup.8 +1 -1
- data/man/man8/puppet-man.8 +1 -1
- data/man/man8/puppet-module.8 +1 -1
- data/man/man8/puppet-node.8 +1 -1
- data/man/man8/puppet-parser.8 +1 -1
- data/man/man8/puppet-plugin.8 +1 -1
- data/man/man8/puppet-report.8 +1 -1
- data/man/man8/puppet-resource.8 +1 -1
- data/man/man8/puppet-script.8 +1 -1
- data/man/man8/puppet-ssl.8 +1 -1
- data/man/man8/puppet-status.8 +1 -1
- data/man/man8/puppet.8 +2 -2
- data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +67 -0
- data/spec/fixtures/ssl/unknown-127.0.0.1.pem +48 -0
- data/spec/fixtures/ssl/unknown-ca-key.pem +67 -0
- data/spec/fixtures/ssl/unknown-ca.pem +59 -0
- data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-installed.txt → dnf-module-list-enabled.txt} +2 -0
- data/spec/fixtures/unit/provider/package/pkgng/pkg.version +2 -0
- data/spec/fixtures/unit/provider/package/yum/yum-check-update-subscription-manager.txt +9 -0
- data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +9 -0
- data/spec/integration/application/agent_spec.rb +329 -0
- data/spec/integration/application/apply_spec.rb +132 -3
- data/spec/integration/application/filebucket_spec.rb +190 -0
- data/spec/integration/application/plugin_spec.rb +50 -0
- data/spec/integration/http/client_spec.rb +34 -40
- data/spec/integration/indirector/report/yaml.rb +83 -0
- data/spec/integration/module_tool/forge_spec.rb +2 -15
- data/spec/integration/network/http_pool_spec.rb +11 -19
- data/spec/integration/node/environment_spec.rb +15 -0
- data/spec/integration/util/windows/adsi_spec.rb +1 -1
- data/spec/lib/puppet/test_ca.rb +2 -2
- data/spec/lib/puppet_spec/https.rb +10 -7
- data/spec/lib/puppet_spec/puppetserver.rb +119 -0
- data/spec/shared_contexts/https.rb +29 -0
- data/spec/unit/agent_spec.rb +33 -25
- data/spec/unit/application/agent_spec.rb +5 -1
- data/spec/unit/application/device_spec.rb +2 -2
- data/spec/unit/application/filebucket_spec.rb +22 -2
- data/spec/unit/configurer_spec.rb +1 -1
- data/spec/unit/defaults_spec.rb +24 -1
- data/spec/unit/environments_spec.rb +8 -0
- data/spec/unit/file_system_spec.rb +10 -0
- data/spec/unit/http/client_spec.rb +105 -46
- data/spec/unit/http/external_client_spec.rb +201 -0
- data/spec/unit/http/resolver_spec.rb +20 -0
- data/spec/unit/http/service/ca_spec.rb +25 -2
- data/spec/unit/http/service/compiler_spec.rb +184 -6
- data/spec/unit/http/service/file_server_spec.rb +35 -3
- data/spec/unit/http/service/report_spec.rb +3 -1
- data/spec/unit/http/service_spec.rb +3 -3
- data/spec/unit/http/session_spec.rb +56 -7
- data/spec/unit/indirector/file_bucket_file/rest_spec.rb +82 -2
- data/spec/unit/network/http/pool_spec.rb +3 -3
- data/spec/unit/node/environment_spec.rb +16 -0
- data/spec/unit/provider/group/windows_adsi_spec.rb +43 -10
- data/spec/unit/provider/package/apt_spec.rb +30 -0
- data/spec/unit/provider/package/dnfmodule_spec.rb +33 -14
- data/spec/unit/provider/package/gem_spec.rb +40 -0
- data/spec/unit/provider/package/pacman_spec.rb +6 -21
- data/spec/unit/provider/package/pip_spec.rb +26 -3
- data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
- data/spec/unit/provider/package/pkgng_spec.rb +38 -0
- data/spec/unit/provider/package/puppet_gem_spec.rb +8 -0
- data/spec/unit/provider/package/rpm_spec.rb +0 -212
- data/spec/unit/provider/package/yum_spec.rb +235 -1
- data/spec/unit/provider/service/systemd_spec.rb +10 -1
- data/spec/unit/provider/user/windows_adsi_spec.rb +3 -3
- data/spec/unit/puppet_pal_2pec.rb +0 -29
- data/spec/unit/reports/http_spec.rb +70 -52
- data/spec/unit/ssl/host_spec.rb +4 -2
- data/spec/unit/ssl/oids_spec.rb +1 -0
- data/spec/unit/ssl/state_machine_spec.rb +38 -6
- data/spec/unit/transaction/report_spec.rb +4 -0
- data/spec/unit/util/at_fork_spec.rb +2 -2
- data/spec/unit/util/package/version/debian_spec.rb +83 -0
- data/spec/unit/util/package/version/pip_spec.rb +464 -0
- data/spec/unit/util/package/version/range_spec.rb +154 -0
- data/spec/unit/util/package/version/rpm_spec.rb +121 -0
- data/spec/unit/util/pidlock_spec.rb +83 -47
- data/spec/unit/util/rpm_compare_spec.rb +196 -0
- data/spec/unit/util/windows/adsi_spec.rb +4 -4
- data/spec/unit/util/windows/sid_spec.rb +2 -2
- data/tasks/generate_cert_fixtures.rake +15 -1
- metadata +51 -6
- 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
|
|
data/lib/puppet/http/service.rb
CHANGED
@@ -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
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
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
|
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(
|
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(
|
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
|
-
|
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
|