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

new(client, server_list_setting:, default_port:, services: ) click to toggle source

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

resolve(session, name, ssl_context: nil, canceled_handler: nil) click to toggle source

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