-
Notifications
You must be signed in to change notification settings - Fork 2.2k
(PUP-10039) Add ServerList resolver #7856
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,18 @@ | ||
class Puppet::HTTP::Resolver | ||
def resolve(session, name, &block) | ||
def initialize(client) | ||
@client = client | ||
end | ||
|
||
def resolve(session, name, ssl_context: nil) | ||
raise NotImplementedError | ||
end | ||
|
||
def check_connection?(session, service, ssl_context: nil) | ||
service.connect(ssl_context: ssl_context) | ||
return true | ||
rescue Puppet::HTTP::ConnectionError => e | ||
session.add_exception(e) | ||
Puppet.debug("Connection to #{service.url} failed, trying next route: #{e.message}") | ||
return false | ||
end | ||
end |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
class Puppet::HTTP::Resolver::ServerList < Puppet::HTTP::Resolver | ||
def initialize(client, server_list:, default_port:) | ||
@client = client | ||
@server_list = server_list | ||
@default_port = default_port | ||
end | ||
|
||
def resolve(session, name, ssl_context: nil) | ||
@server_list.each do |server| | ||
host = server[0] | ||
port = server[1] || @default_port | ||
uri = URI("https://#{host}:#{port}/status/v1/simple/master") | ||
if get_success?(uri, session, ssl_context: ssl_context) | ||
return Puppet::HTTP::Service.create_service(@client, name, host, port) | ||
end | ||
end | ||
|
||
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) } | ||
end | ||
|
||
def get_success?(uri, session, ssl_context: nil) | ||
response = @client.get(uri, ssl_context: ssl_context) | ||
return true if response.success? | ||
|
||
Puppet.debug(_("Puppet server %{host}:%{port} is unavailable: %{code} %{reason}") % | ||
{ host: host, port: port, code: response.code, reason: response.message }) | ||
return false | ||
rescue => detail | ||
session.add_exception(detail) | ||
#TRANSLATORS 'server_list' is the name of a setting and should not be translated | ||
Puppet.debug _("Unable to connect to server from server_list setting: %{detail}") % {detail: detail} | ||
return false | ||
end | ||
end |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,6 @@ | ||
class Puppet::HTTP::Resolver::Settings < Puppet::HTTP::Resolver | ||
def resolve(session, name, &block) | ||
yield session.create_service(name) | ||
def resolve(session, name, ssl_context: nil) | ||
service = Puppet::HTTP::Service.create_service(@client, name) | ||
check_connection?(session, service, ssl_context: ssl_context) ? service : nil | ||
end | ||
end |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,15 +1,19 @@ | ||
class Puppet::HTTP::Resolver::SRV < Puppet::HTTP::Resolver | ||
def initialize(domain: srv_domain, dns: Resolv::DNS.new) | ||
def initialize(client, domain:, dns: Resolv::DNS.new) | ||
@client = client | ||
@srv_domain = domain | ||
@delegate = Puppet::Network::Resolver.new(dns) | ||
end | ||
|
||
def resolve(session, name, &block) | ||
def resolve(session, name, ssl_context: nil) | ||
# Here we pass our HTTP service name as the DNS SRV service name | ||
# This is fine for :ca, but note that :puppet and :file are handled | ||
# specially in `each_srv_record`. | ||
@delegate.each_srv_record(@srv_domain, name) do |server, port| | ||
yield session.create_service(name, server, port) | ||
service = Puppet::HTTP::Service.create_service(@client, name, server, port) | ||
return service if check_connection?(session, service, ssl_context: ssl_context) | ||
end | ||
|
||
return nil | ||
end | ||
end |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -3,6 +3,7 @@ def initialize(client, resolvers) | |
@client = client | ||
@resolvers = resolvers | ||
@resolved_services = {} | ||
@resolution_exceptions = [] | ||
end | ||
|
||
def route_to(name, ssl_context: nil) | ||
|
@@ -11,29 +12,23 @@ def route_to(name, ssl_context: nil) | |
cached = @resolved_services[name] | ||
return cached if cached | ||
|
||
errors = [] | ||
@resolution_exceptions = [] | ||
|
||
@resolvers.each do |resolver| | ||
Puppet.debug("Resolving service '#{name}' using #{resolver.class}") | ||
resolver.resolve(self, name) do |service| | ||
begin | ||
service.connect(ssl_context: ssl_context) | ||
@resolved_services[name] = service | ||
Puppet.debug("Resolved service '#{name}' to #{service.url}") | ||
return service | ||
rescue Puppet::HTTP::ConnectionError => e | ||
errors << e | ||
Puppet.debug("Connection to #{service.url} failed, trying next route: #{e.message}") | ||
end | ||
service = resolver.resolve(self, name, ssl_context: ssl_context) | ||
if service | ||
@resolved_services[name] = service | ||
Puppet.debug("Resolved service '#{name}' to #{service.url}") | ||
return service | ||
end | ||
end | ||
|
||
errors.each { |e| Puppet.log_exception(e) } | ||
|
||
@resolution_exceptions.each { |e| Puppet.log_exception(e) } | ||
raise Puppet::HTTP::RouteError, "No more routes to #{name}" | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I mucked with the code to play with this a bit more: I added the ServerList resolver to the CA service, and I removed the
|
||
end | ||
|
||
def create_service(name, server = nil, port = nil) | ||
Puppet::HTTP::Service.create_service(@client, name, server, port) | ||
def add_exception(exception) | ||
@resolution_exceptions << exception | ||
end | ||
melissa marked this conversation as resolved.
Show resolved
Hide resolved
|
||
end |
Uh oh!
There was an error while loading. Please reload this page.