lib/yao/client.rb in yao-0.8.0 vs lib/yao/client.rb in yao-0.9.0

- old
+ new

@@ -1,7 +1,8 @@ require 'yao/config' require 'faraday' +require 'openssl' require 'yao/plugins/default_client_generator' module Yao Yao.config.param :endpoints, nil @@ -9,65 +10,120 @@ class ClientSet def initialize @pool = {} @admin_pool = {} end + + # #pool and #admin_pool returns Hash like below structure + # + # { + # "identity" => #<Faraday::Connection:...>, + # "image" => #<Faraday::Connection:...>, + # } + # + # @return [Hash { String => Faraday::Connection }] attr_reader :pool, :admin_pool %w(default compute network image metering volume orchestration identity).each do |type| + + # @return [Faraday::Connection] define_method(type) do self.pool[type] end + # @return [Faraday::Connection] define_method("#{type}_admin") do self.admin_pool[type] end end + # endpoints is a Hash like below structure + # + # { + # "identity" => { + # public_url: "https://example.com/mitaka/keystone/v3", + # internal_url: "https://example.com/mitaka/keystone/v3", + # admin_url: "https://example.com/mitaka/admin/keystone/v3" + # }, + # "image" => { + # ... + # }, + # } + # + # @param endpoints [Hash{ String => Hash }] def register_endpoints(endpoints, token: nil) + + # type is String (e.g. network, identity, ... ) + # urls is Hash{ Symbol => String } endpoints.each_pair do |type, urls| + # XXX: neutron just have v2.0 API and endpoint may not have version prefix if type == "network" urls = urls.map {|public_or_admin, url| url = File.join(url, "v2.0") [public_or_admin, url] }.to_h end + # User can override the public_url and admin_url of endpoints by setting Yao.configure + # For example. + # + # Yao.configure do + # endpoints identity: { public: "http://override-endpoint.example.com:35357/v3.0" } + # end + # force_public_url = Yao.config.endpoints[type.to_sym][:public] rescue nil - force_admin_url = Yao.config.endpoints[type.to_sym][:admin] rescue nil + force_admin_url = Yao.config.endpoints[type.to_sym][:admin] rescue nil - self.pool[type] = Yao::Client.gen_client(force_public_url || urls[:public_url], token: token) if force_public_url || urls[:public_url] - self.admin_pool[type] = Yao::Client.gen_client(force_admin_url || urls[:admin_url], token: token) if force_admin_url || urls[:admin_url] + if force_public_url || urls[:public_url] + self.pool[type] = Yao::Client.gen_client(force_public_url || urls[:public_url], token: token) + end + + if force_admin_url || urls[:admin_url] + self.admin_pool[type] = Yao::Client.gen_client(force_admin_url || urls[:admin_url], token: token) + end end end end class << self + + # @return [Yao::Client::ClientSet] attr_accessor :default_client + # @return [Yao::Plugins::DefaultClientGenerator] def client_generator Plugins::Registry.instance[:client_generator][Yao.config.client_generator].new end + # @param endpoint [String] + # @param token [String] + # @return [Faraday::Connection] def gen_client(endpoint, token: nil) Faraday.new( endpoint, client_options ) do |f| client_generator.call(f, token) end end + # @param [String] def reset_client(new_endpoint=nil) set = ClientSet.new set.register_endpoints("default" => {public_url: new_endpoint || Yao.config.endpoint}) self.default_client = set end + # generate Hash options for Faraday.new + # @return [Hash] def client_options opt = {} - opt.merge!({ request: { timeout: Yao.config.timeout }}) if Yao.config.timeout + + if Yao.config.timeout + opt.merge!({ request: { timeout: Yao.config.timeout }}) + end + + # Client Certificate Authentication if Yao.config.client_cert && Yao.config.client_key - require 'openssl' cert = OpenSSL::X509::Certificate.new(File.read(Yao.config.client_cert)) key = OpenSSL::PKey.read(File.read(Yao.config.client_key)) opt.merge!(ssl: { client_cert: cert, client_key: key, @@ -82,9 +138,10 @@ Yao::Client.reset_client(endpoint) end end end + # @return [Yao::Client::ClientSet] def self.default_client Yao::Client.default_client end Yao.config.param :noop_on_write, false