Skip to content

Commit b6044ca

Browse files
committed
Merge branch '5.5.x' into 55x_64x_mergeup
* 5.5.x: Revert "(PUP-10142) Add white space for #initialize_default_settings!" (PUP-10227) Preserve expectation for http.finish (PUP-10142) Add white space for #initialize_default_settings! (PUP-10142) Refactor settings default initialization (PUP-10287) mailalias: comma inside commands fix (PUP-10227) Close the HTTP connection Conflicts: lib/puppet/defaults.rb lib/puppet/network/http/pool.rb lib/puppet/provider/mailalias/aliases.rb spec/fixtures/integration/provider/mailalias/aliases/test1 spec/unit/network/http/connection_spec.rb Mailalias was removed in puppet 6 Replaced `Puppet.settings` with `settings` in: settings.override_default(:catalog_cache_terminus, :store_configs) Updates the nocache_pool to finish the connection if it's been started. In 5.5.x, the nocache pool did not explicitly start and finish connections, but that was modified in d46a3b1.
2 parents d385ceb + be223e5 commit b6044ca

File tree

8 files changed

+102
-32
lines changed

8 files changed

+102
-32
lines changed

lib/puppet.rb

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
require 'puppet/external/pson/version'
2323
require 'puppet/external/pson/pure'
2424
require 'puppet/gettext/config'
25+
require 'puppet/defaults'
2526

2627

2728
#------------------------------------------------------------
@@ -87,6 +88,7 @@ def self.[](param)
8788

8889
# Store a new default value.
8990
def self.define_settings(section, hash)
91+
Puppet.deprecation_warning('The method Puppet.define_settings is deprecated and will be removed in a future release')
9092
@@settings.define_settings(section, hash)
9193
end
9294

@@ -121,8 +123,9 @@ def self.run_mode
121123
Puppet::Util::RunMode[@@settings.preferred_run_mode]
122124
end
123125

124-
# Load all of the settings.
125-
require 'puppet/defaults'
126+
# Modify the settings with defaults defined in `initialize_default_settings` method in puppet/defaults.rb. This can
127+
# be used in the initialization of new Puppet::Settings objects in the puppetserver project.
128+
Puppet.initialize_default_settings!(settings)
126129

127130
# Now that settings are loaded we have the code loaded to be able to issue
128131
# deprecation warnings. Warn if we're on a deprecated ruby version.

lib/puppet/defaults.rb

Lines changed: 29 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,11 @@ def self.default_vendormoduledir
6565

6666
AS_DURATION = %q{This setting can be a time interval in seconds (30 or 30s), minutes (30m), hours (6h), days (2d), or years (5y).}
6767

68-
define_settings(:main,
68+
# @api public
69+
# @param args [Puppet::Settings] the settings object to define default settings for
70+
# @return void
71+
def self.initialize_default_settings!(settings)
72+
settings.define_settings(:main,
6973
:confdir => {
7074
:default => nil,
7175
:type => :directory,
@@ -102,7 +106,7 @@ def self.default_vendormoduledir
102106
}
103107
)
104108

105-
define_settings(:main,
109+
settings.define_settings(:main,
106110
:logdir => {
107111
:default => nil,
108112
:type => :directory,
@@ -206,7 +210,7 @@ def self.default_vendormoduledir
206210
}
207211
)
208212

209-
define_settings(:main,
213+
settings.define_settings(:main,
210214
:priority => {
211215
:default => nil,
212216
:type => :priority,
@@ -523,12 +527,12 @@ def self.default_vendormoduledir
523527
:hiera_config => {
524528
:default => lambda do
525529
config = nil
526-
codedir = Puppet.settings[:codedir]
530+
codedir = settings[:codedir]
527531
if codedir.is_a?(String)
528532
config = File.expand_path(File.join(codedir, 'hiera.yaml'))
529533
config = nil unless Puppet::FileSystem.exist?(config)
530534
end
531-
config = File.expand_path(File.join(Puppet.settings[:confdir], 'hiera.yaml')) if config.nil?
535+
config = File.expand_path(File.join(settings[:confdir], 'hiera.yaml')) if config.nil?
532536
config
533537
end,
534538
:desc => "The hiera configuration file. Puppet only reads this file on startup, so you must restart the puppet master every time you edit it.",
@@ -582,7 +586,7 @@ def self.default_vendormoduledir
582586
:http_proxy_password =>{
583587
:default => "none",
584588
:hook => proc do |value|
585-
if Puppet.settings[:http_proxy_password] =~ /[@!# \/]/
589+
if settings[:http_proxy_password] =~ /[@!# \/]/
586590
raise "Passwords set in the http_proxy_password setting must be valid as part of a URL, and any reserved characters must be URL-encoded. We received: #{value}"
587591
end
588592
end,
@@ -726,7 +730,7 @@ def self.default_vendormoduledir
726730
}
727731
)
728732

729-
Puppet.define_settings(:module_tool,
733+
settings.define_settings(:module_tool,
730734
:module_repository => {
731735
:default => 'https://forgeapi.puppet.com',
732736
:desc => "The module repository",
@@ -745,7 +749,7 @@ def self.default_vendormoduledir
745749
}
746750
)
747751

748-
Puppet.define_settings(
752+
settings.define_settings(
749753
:main,
750754

751755
# We have to downcase the fqdn, because the current ssl stuff (as opposed to in master) doesn't have good facilities for
@@ -1027,7 +1031,7 @@ def self.default_vendormoduledir
10271031
}
10281032
)
10291033

1030-
define_settings(
1034+
settings.define_settings(
10311035
:ca,
10321036
:ca_name => {
10331037
:default => "Puppet CA: $certname",
@@ -1128,7 +1132,7 @@ def self.default_vendormoduledir
11281132

11291133
# Define the config default.
11301134

1131-
define_settings(:application,
1135+
settings.define_settings(:application,
11321136
:config_file_name => {
11331137
:type => :string,
11341138
:default => Puppet::Settings.default_config_file_name,
@@ -1153,7 +1157,7 @@ def self.default_vendormoduledir
11531157
},
11541158
)
11551159

1156-
define_settings(:environment,
1160+
settings.define_settings(:environment,
11571161
:manifest => {
11581162
:default => nil,
11591163
:type => :file_or_directory,
@@ -1196,7 +1200,7 @@ def self.default_vendormoduledir
11961200
}
11971201
)
11981202

1199-
define_settings(:master,
1203+
settings.define_settings(:master,
12001204
:user => {
12011205
:default => "puppet",
12021206
:desc => "The user Puppet Server will run as. Used to ensure
@@ -1389,7 +1393,7 @@ def self.default_vendormoduledir
13891393
}
13901394
)
13911395

1392-
define_settings(:device,
1396+
settings.define_settings(:device,
13931397
:devicedir => {
13941398
:default => "$vardir/devices",
13951399
:type => :directory,
@@ -1404,7 +1408,7 @@ def self.default_vendormoduledir
14041408
}
14051409
)
14061410

1407-
define_settings(:agent,
1411+
settings.define_settings(:agent,
14081412
:node_name_value => {
14091413
:default => "$certname",
14101414
:desc => "The explicit value used for the node name for all requests the agent
@@ -1748,7 +1752,7 @@ def self.default_vendormoduledir
17481752

17491753
# Plugin information.
17501754

1751-
define_settings(
1755+
settings.define_settings(
17521756
:main,
17531757
:plugindest => {
17541758
:type => :directory,
@@ -1791,7 +1795,7 @@ def self.default_vendormoduledir
17911795

17921796
# Central fact information.
17931797

1794-
define_settings(
1798+
settings.define_settings(
17951799
:main,
17961800
:factpath => {
17971801
:type => :path,
@@ -1808,7 +1812,7 @@ def self.default_vendormoduledir
18081812
}
18091813
)
18101814

1811-
define_settings(
1815+
settings.define_settings(
18121816
:transaction,
18131817
:tags => {
18141818
:default => "",
@@ -1836,7 +1840,7 @@ def self.default_vendormoduledir
18361840
}
18371841
)
18381842

1839-
define_settings(
1843+
settings.define_settings(
18401844
:main,
18411845
:external_nodes => {
18421846
:default => "none",
@@ -1861,7 +1865,7 @@ def self.default_vendormoduledir
18611865
}
18621866
)
18631867

1864-
define_settings(
1868+
settings.define_settings(
18651869
:ldap,
18661870
:ldapssl => {
18671871
:default => false,
@@ -1930,7 +1934,7 @@ def self.default_vendormoduledir
19301934
}
19311935
)
19321936

1933-
define_settings(:master,
1937+
settings.define_settings(:master,
19341938
:storeconfigs => {
19351939
:default => false,
19361940
:type => :boolean,
@@ -1948,7 +1952,7 @@ def self.default_vendormoduledir
19481952
require 'puppet/node/facts'
19491953
if value
19501954
Puppet::Resource::Catalog.indirection.cache_class = :store_configs
1951-
Puppet.settings.override_default(:catalog_cache_terminus, :store_configs)
1955+
settings.override_default(:catalog_cache_terminus, :store_configs)
19521956
Puppet::Node::Facts.indirection.cache_class = :store_configs
19531957
Puppet::Resource.indirection.terminus_class = :store_configs
19541958
end
@@ -1963,7 +1967,7 @@ def self.default_vendormoduledir
19631967
}
19641968
)
19651969

1966-
define_settings(:parser,
1970+
settings.define_settings(:parser,
19671971
:max_errors => {
19681972
:default => 10,
19691973
:desc => <<-'EOT'
@@ -2015,7 +2019,7 @@ def self.default_vendormoduledir
20152019
EOT
20162020
}
20172021
)
2018-
define_settings(:puppetdoc,
2022+
settings.define_settings(:puppetdoc,
20192023
:document_all => {
20202024
:default => false,
20212025
:type => :boolean,
@@ -2024,7 +2028,7 @@ def self.default_vendormoduledir
20242028
}
20252029
)
20262030

2027-
define_settings(
2031+
settings.define_settings(
20282032
:main,
20292033
:rich_data => {
20302034
:default => true,
@@ -2041,5 +2045,5 @@ def self.default_vendormoduledir
20412045
EOT
20422046
}
20432047
)
2044-
2048+
end
20452049
end

lib/puppet/network/http/connection.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,10 @@ def do_request(request, options)
213213
current_request[header] = value
214214
end
215215
when 429, 503
216+
if connection.started?
217+
Puppet.debug("Closing connection for #{current_site}")
218+
connection.finish
219+
end
216220
response = handle_retry_after(current_response)
217221
else
218222
response = current_response

lib/puppet/network/http/nocache_pool.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ def with_connection(site, verifier, &block)
1515
begin
1616
yield http
1717
ensure
18+
return unless http.started?
1819
Puppet.debug("Closing connection for #{site}")
1920
http.finish
2021
end

lib/puppet/network/http/pool.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ def with_connection(site, verifier, &block)
3333
reuse = false
3434
raise detail
3535
ensure
36-
if reuse
36+
if reuse && http.started?
3737
release(site, verifier, http)
3838
else
3939
close_connection(site, http)
@@ -56,13 +56,17 @@ def pool
5656
end
5757

5858
# Safely close a persistent connection.
59+
# Don't try to close a connection that's already closed.
5960
#
6061
# @api private
6162
def close_connection(site, http)
63+
return false unless http.started?
6264
Puppet.debug("Closing connection for #{site}")
6365
http.finish
66+
true
6467
rescue => detail
6568
Puppet.log_exception(detail, _("Failed to close connection for %{site}: %{detail}") % { site: site, detail: detail })
69+
nil
6670
end
6771

6872
# Borrow and take ownership of a persistent connection. If a new

spec/unit/network/http/connection_spec.rb

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,12 +160,33 @@ def retry_after(datetime)
160160
end
161161

162162
it "should return a 503 response if Retry-After is not convertible to an Integer or RFC 2822 Date" do
163-
stub_request(:get, url).to_return(status: [503, 'Service Unavailable'], headers: {'Retry-After' => 'foo'})
163+
retry_after('foo')
164164

165165
result = subject.get('/foo')
166166
expect(result.code).to eq("503")
167167
end
168168

169+
it "should close the connection before sleeping" do
170+
retry_after('42')
171+
172+
http1 = Net::HTTP.new(host, port)
173+
http1.use_ssl = true
174+
allow(http1).to receive(:started?).and_return(true)
175+
176+
http2 = Net::HTTP.new(host, port)
177+
http2.use_ssl = true
178+
allow(http1).to receive(:started?).and_return(true)
179+
180+
# The "with_connection" method is required to yield started connections
181+
pool = Puppet.lookup(:http_pool)
182+
allow(pool).to receive(:with_connection).and_yield(http1).and_yield(http2)
183+
184+
expect(http1).to receive(:finish).ordered
185+
expect(::Kernel).to receive(:sleep).with(42).ordered
186+
187+
subject.get('/foo')
188+
end
189+
169190
it "should sleep and retry if Retry-After is an Integer" do
170191
retry_after('42')
171192

@@ -189,6 +210,7 @@ def retry_after(datetime)
189210

190211
it "should sleep for no more than the Puppet runinterval" do
191212
retry_after('60')
213+
192214
Puppet[:runinterval] = 30
193215

194216
expect(::Kernel).to receive(:sleep).with(30)

spec/unit/network/http/nocache_pool_spec.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
let(:verifier) { double('verifier', :setup_connection => nil) }
99

1010
it 'yields a started connection' do
11-
http = double('http', start: nil, finish: nil)
11+
http = double('http', start: nil, finish: nil, started?: true)
1212

1313
factory = Puppet::Network::HTTP::Factory.new
1414
allow(factory).to receive(:create_connection).and_return(http)
@@ -20,8 +20,8 @@
2020
end
2121

2222
it 'yields a new connection each time' do
23-
http1 = double('http1', start: nil, finish: nil)
24-
http2 = double('http2', start: nil, finish: nil)
23+
http1 = double('http1', start: nil, finish: nil, started?: true)
24+
http2 = double('http2', start: nil, finish: nil, started?: true)
2525

2626
factory = Puppet::Network::HTTP::Factory.new
2727
allow(factory).to receive(:create_connection).and_return(http1, http2)

0 commit comments

Comments
 (0)