class OpenNebula::Client

The client class, represents the connection with the core and handles the xml-rpc calls.

Constants

XMLPARSER

Attributes

one_auth[RW]
one_endpoint[R]

Public Class Methods

new(secret=nil, endpoint=nil, options={}) click to toggle source

Creates a new client object that will be used to call OpenNebula functions.

@param [String, nil] secret user credentials (“user:password”) or

nil to get the credentials from user auth file

@param [String, nil] endpoint OpenNebula server endpoint

(http://host:2633/RPC2) or nil to get it form the environment
variable ONE_XMLRPC or use the default endpoint

@param [Hash] options @option params [Integer] :timeout connection timeout in seconds,

defaults to 30

@option params [String] :http_proxy HTTP proxy string used for

connecting to the endpoint; defaults to no proxy

@option params [Boolean] :sync Use only one http connection for

all calls. It should not be used for multithreaded programs.
It's the only mode that can be used with :cert_dir and
:disable_ssl_verify

@option params [String] :cert_dir Extra directory where to import

trusted issuer certificates. Use with :sync = true

@option params [String] :disable_ssl_verify Disable SSL certificate

verification. Use only for testing and with :sync = true

@return [OpenNebula::Client]

# File lib/opennebula/client.rb, line 119
def initialize(secret=nil, endpoint=nil, options={})
    if secret
        @one_auth = secret
    elsif ENV["ONE_AUTH"] and !ENV["ONE_AUTH"].empty? and
            File.file?(ENV["ONE_AUTH"])
        @one_auth = File.read(ENV["ONE_AUTH"])
    elsif ENV["HOME"] and File.file?(ENV["HOME"]+"/.one/one_auth")
        @one_auth = File.read(ENV["HOME"]+"/.one/one_auth")
    elsif File.file?("/var/lib/one/.one/one_auth")
        @one_auth = File.read("/var/lib/one/.one/one_auth")
    else
        raise "ONE_AUTH file not present"
    end

    @one_auth.rstrip!

    if endpoint
        @one_endpoint = endpoint
    elsif ENV["ONE_XMLRPC"]
        @one_endpoint = ENV["ONE_XMLRPC"]
    elsif ENV['HOME'] and File.exists?(ENV['HOME']+"/.one/one_endpoint")
        @one_endpoint = File.read(ENV['HOME']+"/.one/one_endpoint")
    elsif File.exists?("/var/lib/one/.one/one_endpoint")
        @one_endpoint = File.read("/var/lib/one/.one/one_endpoint")
    else
        @one_endpoint = "http://localhost:2633/RPC2"
    end

    @async = !options[:sync]

    timeout=nil
    timeout=options[:timeout] if options[:timeout]

    http_proxy=nil
    http_proxy=options[:http_proxy] if options[:http_proxy]

    @server = XMLRPC::Client.new2(@one_endpoint, http_proxy, timeout)
    @server.http_header_extra = {'accept-encoding' => 'identity'}

    http = @server.instance_variable_get("@http")

    if options[:cert_dir] || ENV['ONE_CERT_DIR']
        raise "SSL options don't work in async mode" if @async

        cert_dir = options[:cert_dir] || ENV['ONE_CERT_DIR']
        cert_files = Dir["#{cert_dir}/*"]

        cert_store = OpenSSL::X509::Store.new
        cert_store.set_default_paths
        cert_files.each {|cert| cert_store.add_file(cert) }

        http.cert_store = cert_store
    end

    if options[:disable_ssl_verify] || ENV['ONE_DISABLE_SSL_VERIFY']
        raise "SSL options don't work in async mode" if @async

        http.verify_mode = OpenSSL::SSL::VERIFY_NONE
    end

    if defined?(OxStreamParser)
        @server.set_parser(OxStreamParser.new)
    elsif OpenNebula::NOKOGIRI
        @server.set_parser(NokogiriStreamParser.new)
    elsif XMLPARSER
        @server.set_parser(XMLRPC::XMLParser::XMLStreamParser.new)
    end
end

Public Instance Methods

call(action, *args) click to toggle source
# File lib/opennebula/client.rb, line 188
def call(action, *args)
    begin
        if @async
            response = @server.call_async("one."+action, @one_auth, *args)
        else
            response = @server.call("one."+action, @one_auth, *args)
        end

        if response[0] == false
            Error.new(response[1], response[2])
        else
            response[1] #response[1..-1]
        end
    rescue Exception => e
        Error.new(e.message)
    end
end
get_version() click to toggle source
# File lib/opennebula/client.rb, line 206
def get_version()
    call("system.version")
end