This is the central ruby class for Etcd. It provides methods for all etcd api calls. It also provides few additional methods beyond the core etcd api, like Etcd::Client#lock and Etcd::Keys#eternal_watch, they are defined in separate modules and included in this class
Creates an Etcd::Client object. It accepts a hash
opts
as argument
@param [Hash] opts The options for new Etcd::Client object @opts [String] :host IP address of the etcd server (default 127.0.0.1) @opts [Fixnum] :port Port number of the etcd server (default 4001) @opts [Fixnum] :read_timeout set HTTP read timeouts (default 60) rubocop:disable CyclomaticComplexity
# File lib/etcd/client.rb, line 51 def initialize(opts = {}) @host = opts[:host] || '127.0.0.1' @port = opts[:port] || 4001 @config = Config.new @config.read_timeout = opts[:read_timeout] || 60 @config.use_ssl = opts[:use_ssl] || false @config.verify_mode = opts.key?(:verify_mode) ? opts[:verify_mode] : OpenSSL::SSL::VERIFY_PEER @config.user_name = opts[:user_name] || nil @config.password = opts[:password] || nil @config.ca_file = opts.key?(:ca_file) ? opts[:ca_file] : nil # Provide a OpenSSL X509 cert here and not the path. See README @config.ssl_cert = opts.key?(:ssl_cert) ? opts[:ssl_cert] : nil # Provide the key (content) and not just the filename here. @config.ssl_key = opts.key?(:ssl_key) ? opts[:ssl_key] : nil yield @config if block_given? end
This method sends api request to etcd server.
This method has following parameters as argument
path - etcd server path (etcd server end point)
method - the request method used
options - any additional parameters used by request method (optional)
rubocop:disable MethodLength, CyclomaticComplexity
# File lib/etcd/client.rb, line 91 def api_execute(path, method, options = {}) params = options[:params] case method when :get req = build_http_request(Net::HTTP::Get, path, params) when :post req = build_http_request(Net::HTTP::Post, path, nil, params) when :put req = build_http_request(Net::HTTP::Put, path, nil, params) when :delete req = build_http_request(Net::HTTP::Delete, path, params) else fail "Unknown http action: #{method}" end http = Net::HTTP.new(host, port) http.read_timeout = options[:timeout] || read_timeout setup_https(http) req.basic_auth(user_name, password) if [user_name, password].all? Log.debug("Invoking: '#{req.class}' against '#{path}") res = http.request(req) Log.debug("Response code: #{res.code}") Log.debug("Response body: #{res.body}") process_http_request(res) end
rubocop:enable MethodLength
# File lib/etcd/client.rb, line 149 def build_http_request(klass, path, params = nil, body = nil) path += '?' + URI.encode_www_form(params) unless params.nil? req = klass.new(path) req.body = URI.encode_www_form(body) unless body.nil? Etcd::Log.debug("Built #{klass} path:'#{path}' body:'#{req.body}'") req end
Get the current leader
# File lib/etcd/client.rb, line 80 def leader api_execute(version_prefix + '/stats/leader', :get).body.strip end
need to have original request to process the response when it redirects
# File lib/etcd/client.rb, line 134 def process_http_request(res) case res when HTTP_SUCCESS Log.debug('Http success') res when HTTP_CLIENT_ERROR fail Error.from_http_response(res) else Log.debug('Http error') Log.debug(res.body) res.error! end end
# File lib/etcd/client.rb, line 116 def setup_https(http) http.use_ssl = use_ssl http.verify_mode = verify_mode if config.ssl_cert Log.debug('Setting up ssl cert') http.cert = config.ssl_cert end if config.ssl_key Log.debug('Setting up ssl key') http.key = config.ssl_key end if config.ca_file Log.debug('Setting up ssl ca file to :' + config.ca_file) http.ca_file = config.ca_file end end
Returns the etcd daemon version
# File lib/etcd/client.rb, line 75 def version api_execute('/version', :get).body end
Returns the etcd api version that will be used for across API methods
# File lib/etcd/client.rb, line 70 def version_prefix '/v2' end