class Puppet::HTTP::Resolver::ServerList
Use the server_list setting to resolve a service. This resolver is only used if server_list is set either on the command line or in the configuration file.
@api public
Public Class Methods
Create a server list resolver.
@param [Puppet::HTTP::Client] client @param [Array<String>] server_list_setting array of servers set via the
configuration or the command line
@param [Integer] default_port if a port is not set for a server in
server_list, use this port
@param [Array<Symbol>] services array of services that server_list can be
used to resolve. If a service is not included in this array, this resolver will return nil.
# File lib/puppet/http/resolver/server_list.rb 19 def initialize(client, server_list_setting:, default_port:, services: ) 20 @client = client 21 @server_list_setting = server_list_setting 22 @default_port = default_port 23 @services = services 24 end
Public Instance Methods
Walk the server_list to find a server and port that will connect successfully.
@param [Puppet::HTTP::Session] session @param [Symbol] name the name of the service being resolved @param [Puppet::SSL::SSLContext] ssl_context @param [Proc] canceled_handler optional callback allowing a resolver
to cancel resolution.
@return [nil] return nil if the service to be resolved does not support
server_list
@return [Puppet::HTTP::Service] a validated service to use for future HTTP
requests
@raise [Puppet::Error] raise if none of the servers defined in server_list
are available
@api public
# File lib/puppet/http/resolver/server_list.rb 43 def resolve(session, name, ssl_context: nil, canceled_handler: nil) 44 # If we're configured to use an explicit service host, e.g. report_server 45 # then don't use server_list to resolve the `:report` service. 46 return nil unless @services.include?(name) 47 48 # If we resolved the URL already, use its host & port for the service 49 if @resolved_url 50 return Puppet::HTTP::Service.create_service(@client, session, name, @resolved_url.host, @resolved_url.port) 51 end 52 53 # Return the first simple service status endpoint we can connect to 54 @server_list_setting.value.each_with_index do |server, index| 55 host = server[0] 56 port = server[1] || @default_port 57 58 service = Puppet::HTTP::Service.create_service(@client, session, :puppetserver, host, port) 59 begin 60 service.get_simple_status(ssl_context: ssl_context) 61 @resolved_url = service.url 62 return Puppet::HTTP::Service.create_service(@client, session, name, @resolved_url.host, @resolved_url.port) 63 rescue Puppet::HTTP::ResponseError => detail 64 if index < @server_list_setting.value.length - 1 65 Puppet.warning(_("Puppet server %{host}:%{port} is unavailable: %{code} %{reason}") % 66 { host: service.url.host, port: service.url.port, code: detail.response.code, reason: detail.response.reason } + 67 ' ' + _("Trying with next server from server_list.")) 68 else 69 Puppet.log_exception(detail, _("Puppet server %{host}:%{port} is unavailable: %{code} %{reason}") % 70 { host: service.url.host, port: service.url.port, code: detail.response.code, reason: detail.response.reason }) 71 end 72 rescue Puppet::HTTP::HTTPError => detail 73 if index < @server_list_setting.value.length - 1 74 Puppet.warning(_("Unable to connect to server from server_list setting: %{detail}") % {detail: detail} + 75 ' ' + _("Trying with next server from server_list.")) 76 else 77 Puppet.log_exception(detail, _("Unable to connect to server from server_list setting: %{detail}") % {detail: detail}) 78 end 79 end 80 end 81 82 # don't fallback to other resolvers 83 canceled_handler.call(true) if canceled_handler 84 85 # not found 86 nil 87 end