Skip to content

Commit ea5c6f5

Browse files
committed
(maint) Changes discussed w/ Josh
1 parent 2b32e56 commit ea5c6f5

File tree

8 files changed

+67
-40
lines changed

8 files changed

+67
-40
lines changed

lib/puppet/http/client.rb

+2-2
Original file line numberDiff line numberDiff line change
@@ -147,10 +147,10 @@ def build_resolvers
147147
resolvers = []
148148

149149
if Puppet[:use_srv_records]
150-
resolvers << Puppet::HTTP::Resolver::SRV.new(domain: Puppet[:srv_domain])
150+
resolvers << Puppet::HTTP::Resolver::SRV.new(self, domain: Puppet[:srv_domain])
151151
end
152152

153-
resolvers << Puppet::HTTP::Resolver::Settings.new
153+
resolvers << Puppet::HTTP::Resolver::Settings.new(self)
154154
resolvers.freeze
155155
end
156156
end

lib/puppet/http/resolver.rb

+14-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,18 @@
11
class Puppet::HTTP::Resolver
2-
def resolve(session, name, &block)
2+
def initialize(client)
3+
@client = client
4+
end
5+
6+
def resolve(session, name, ssl_context: nil, &block)
37
raise NotImplementedError
48
end
9+
10+
def check_connection?(session, service, ssl_context: nil)
11+
service.connect(ssl_context: ssl_context)
12+
return true
13+
rescue Puppet::HTTP::ConnectionError => e
14+
session.add_exception(e)
15+
Puppet.debug("Connection to #{service.url} failed, trying next route: #{e.message}")
16+
return false
17+
end
518
end

lib/puppet/http/resolver/serverlist.rb

+20-13
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,33 @@ def initialize(client, server_list: Puppet[:server_list], default_port: Puppet[:
55
@default_port = default_port
66
end
77

8-
def resolve(session, name, &block)
8+
def resolve(session, name, ssl_context: nil, &block)
99
success = false
1010
@server_list.each do |server|
1111
host = server[0]
1212
port = server[1] || @default_port
13-
begin
14-
response = @client.get(URI("https://#{host}:#{port}/status/v1/simple/master"))
15-
if response.success?
16-
success = true
17-
yield session.create_service(name, host, port)
18-
end
19-
20-
Puppet.debug(_("Puppet server %{host}:%{port} is unavailable: %{code} %{reason}") %
21-
{ host: host, port: port, code: response.code, reason: response.message })
22-
rescue => detail
23-
#TRANSLATORS 'server_list' is the name of a setting and should not be translated
24-
Puppet.debug _("Unable to connect to server from server_list setting: %{detail}") % {detail: detail}
13+
uri = URI("https://#{host}:#{port}/status/v1/simple/master")
14+
service = Puppet::HTTP::Service.create_service(@client, name, host, port)
15+
if check_connection?(uri, session, service, ssl_context: ssl_context)
16+
success = true
17+
return service
2518
end
2619
end
2720

2821
raise Puppet::Error, _("Could not select a functional puppet master from server_list: '%{server_list}'") % { server_list: Puppet.settings.value(:server_list, Puppet[:environment].to_sym, true) } unless success
2922
end
23+
24+
def check_connection?(uri, session, service, ssl_context: nil)
25+
response = @client.get(uri, ssl_context: ssl_context)
26+
return true if response.success?
27+
28+
Puppet.debug(_("Puppet server %{host}:%{port} is unavailable: %{code} %{reason}") %
29+
{ host: host, port: port, code: response.code, reason: response.message })
30+
return false
31+
rescue => detail
32+
session.add_exception(detail)
33+
#TRANSLATORS 'server_list' is the name of a setting and should not be translated
34+
Puppet.debug _("Unable to connect to server from server_list setting: %{detail}") % {detail: detail}
35+
return false
36+
end
3037
end

lib/puppet/http/resolver/settings.rb

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
class Puppet::HTTP::Resolver::Settings < Puppet::HTTP::Resolver
2-
def resolve(session, name, &block)
3-
yield session.create_service(name)
2+
def resolve(session, name, ssl_context: nil, &block)
3+
service = Puppet::HTTP::Service.create_service(@client, name)
4+
return service if check_connection?(session, service, ssl_context: ssl_context)
45
end
56
end

lib/puppet/http/resolver/srv.rb

+5-3
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
class Puppet::HTTP::Resolver::SRV < Puppet::HTTP::Resolver
2-
def initialize(domain: srv_domain, dns: Resolv::DNS.new)
2+
def initialize(client, domain:, dns: Resolv::DNS.new)
3+
@client = client
34
@srv_domain = domain
45
@delegate = Puppet::Network::Resolver.new(dns)
56
end
67

7-
def resolve(session, name, &block)
8+
def resolve(session, name, ssl_context: nil, &block)
89
# Here we pass our HTTP service name as the DNS SRV service name
910
# This is fine for :ca, but note that :puppet and :file are handled
1011
# specially in `each_srv_record`.
1112
@delegate.each_srv_record(@srv_domain, name) do |server, port|
12-
yield session.create_service(name, server, port)
13+
service = Puppet::HTTP::Service.create_service(@client, name, server, port)
14+
return service if check_connection?(session, service, ssl_context: ssl_context)
1315
end
1416
end
1517
end

lib/puppet/http/session.rb

+9-14
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ def initialize(client, resolvers)
33
@client = client
44
@resolvers = resolvers
55
@resolved_services = {}
6+
@resolution_exceptions = []
67
end
78

89
def route_to(name, ssl_context: nil)
@@ -15,25 +16,19 @@ def route_to(name, ssl_context: nil)
1516

1617
@resolvers.each do |resolver|
1718
Puppet.debug("Resolving service '#{name}' using #{resolver.class}")
18-
resolver.resolve(self, name) do |service|
19-
begin
20-
service.connect(ssl_context: ssl_context)
21-
@resolved_services[name] = service
22-
Puppet.debug("Resolved service '#{name}' to #{service.url}")
23-
return service
24-
rescue Puppet::HTTP::ConnectionError => e
25-
errors << e
26-
Puppet.debug("Connection to #{service.url} failed, trying next route: #{e.message}")
27-
end
19+
service = resolver.resolve(self, name, ssl_context: ssl_context)
20+
if service
21+
@resolved_services[name] = service
22+
Puppet.debug("Resolved service '#{name}' to #{service.url}")
23+
return service
2824
end
2925
end
3026

31-
errors.each { |e| Puppet.log_exception(e) }
32-
27+
@resolution_exceptions.each { |e| Puppet.log_exception(e) }
3328
raise Puppet::HTTP::RouteError, "No more routes to #{name}"
3429
end
3530

36-
def create_service(name, server = nil, port = nil)
37-
Puppet::HTTP::Service.create_service(@client, name, server, port)
31+
def add_exception(exception)
32+
@resolution_exceptions << exception
3833
end
3934
end

spec/unit/http/resolver_spec.rb

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
let(:uri) { URI.parse('https://www.example.com') }
1010

1111
context 'when resolving using settings' do
12-
let(:subject) { Puppet::HTTP::Resolver::Settings.new }
12+
let(:subject) { Puppet::HTTP::Resolver::Settings.new(client) }
1313

1414
it 'yields a service based on the current ca_server and ca_port settings' do
1515
Puppet[:ca_server] = 'ca.example.com'
@@ -82,7 +82,7 @@
8282

8383
context 'when resolving using SRV' do
8484
let(:dns) { double('dns') }
85-
let(:subject) { Puppet::HTTP::Resolver::SRV.new(domain: 'example.com', dns: dns) }
85+
let(:subject) { Puppet::HTTP::Resolver::SRV.new(client, domain: 'example.com', dns: dns) }
8686

8787
def stub_srv(host, port)
8888
srv = Resolv::DNS::Resource::IN::SRV.new(0, 0, port, host)

spec/unit/http/session_spec.rb

+12-3
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
double('good', url: uri, connect: nil)
1111
}
1212
let(:bad_service) {
13-
service = double('good', url: uri)
13+
service = double('bad', url: uri)
1414
allow(service).to receive(:connect).and_raise(Puppet::HTTP::ConnectionError, 'whoops')
1515
service
1616
}
@@ -23,9 +23,18 @@ def initialize(service)
2323
@count = 0
2424
end
2525

26-
def resolve(session, name, &block)
26+
def resolve(session, name, ssl_context: nil, &block)
2727
@count += 1
28-
yield @service
28+
return @service if check_connection?(session, @service, ssl_context: ssl_context)
29+
end
30+
31+
def check_connection?(session, service, ssl_context: nil)
32+
service.connect(ssl_context: ssl_context)
33+
return true
34+
rescue Puppet::HTTP::ConnectionError => e
35+
session.add_exception(e)
36+
Puppet.debug("Connection to #{service.url} failed, trying next route: #{e.message}")
37+
return false
2938
end
3039
end
3140

0 commit comments

Comments
 (0)