class Service::Client

Interface to OneFlow REST API through a Ruby client

Public Class Methods

new(opts = {}) click to toggle source

The options are read from ENV and FS if not passed

@param [Hash] opts Required configuration to interact with OneFlow @option opts [String] :url Endpoint where OneFlow is running. Defaults to ‘localhost:2474’ @option opts [String] :username OpenNebula user @option opts [String] :password OpenNebula user password @option opts [String] :user_agent Defaults to Ruby. Oneflow will behave accordingly.

# File lib/opennebula/oneflow_client.rb, line 342
def initialize(opts = {})
    endpoint  = '/.one/oneflow_endpoint'
    @username = opts[:username] || ENV['ONEFLOW_USER']
    @password = opts[:password] || ENV['ONEFLOW_PASSWORD']

    if opts[:url]
        url = opts[:url]
    elsif ENV['ONEFLOW_URL']
        url = ENV['ONEFLOW_URL']
    elsif ENV['HOME'] && File.exist?(ENV['HOME'] + endpoint)
        url = File.read(ENV['HOME'] + endpoint).strip
    elsif File.exist?('/var/lib/one/.one/oneflow_endpoint')
        url = File.read('/var/lib/one/.one/oneflow_endpoint').strip
    else
        url = 'http://localhost:2474'
    end

    if @username.nil? && @password.nil?
        if 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 = one_auth.rstrip

        @username, @password = one_auth.split(':')
    end

    @uri = URI.parse(url)

    @user_agent = "OpenNebula #{CloudClient::VERSION} " <<
        "(#{opts[:user_agent]||'Ruby'})"

    @host = nil
    @port = nil

    return unless ENV['http_proxy']

    uri_proxy = URI.parse(ENV['http_proxy'])
    flag = false

    #  Check if we need to bypass the proxy
    if ENV['no_proxy']
        ENV['no_proxy'].split(',').each do |item|
            item = item.strip

            if (IPAddress @uri.host rescue nil).nil?
                if (IPAddress(item) rescue nil).nil?
                    flag |= (item == @uri.host)
                end
            else
                unless (IPAddress item rescue nil).nil?
                    flag |= IPAddress(item).include? IPAddress(@uri.host)
                end
            end
        end
    end

    return if flag

    @host = uri_proxy.host
    @port = uri_proxy.port
end

Public Instance Methods

delete(path, body = nil) click to toggle source
# File lib/opennebula/oneflow_client.rb, line 421
def delete(path, body = nil)
    req = Net::HTTP::Proxy(@host, @port)::Delete.new(path)
    req.body = body if body

    do_request(req)
end
get(path) click to toggle source
# File lib/opennebula/oneflow_client.rb, line 415
def get(path)
    req = Net::HTTP::Proxy(@host, @port)::Get.new(path)

    do_request(req)
end
login() click to toggle source
# File lib/opennebula/oneflow_client.rb, line 445
def login
    req = Net::HTTP::Proxy(@host, @port)::Post.new('/login')

    do_request(req)
end
logout() click to toggle source
# File lib/opennebula/oneflow_client.rb, line 451
def logout
    req = Net::HTTP::Proxy(@host, @port)::Post.new('/logout')

    do_request(req)
end
post(path, body) click to toggle source
# File lib/opennebula/oneflow_client.rb, line 428
def post(path, body)
    req = Net::HTTP::Proxy(@host, @port)::Post.new(path)
    req.body = body

    if path.start_with?('/service_template') && !@content_type.nil?
        req.content_type = @content_type
    end
    do_request(req)
end
put(path, body) click to toggle source
# File lib/opennebula/oneflow_client.rb, line 438
def put(path, body)
    req = Net::HTTP::Proxy(@host, @port)::Put.new(path)
    req.body = body

    do_request(req)
end
set_content_type(content_type) click to toggle source
# File lib/opennebula/oneflow_client.rb, line 411
def set_content_type(content_type)
    @content_type = content_type
end

Private Instance Methods

do_request(req) click to toggle source
# File lib/opennebula/oneflow_client.rb, line 459
def do_request(req)
    req.basic_auth @username, @password

    req['User-Agent'] = @user_agent

    if !@uri.path.nil?
        req.instance_variable_set(:@path, @uri.path + req.path)
    end

    CloudClient.http_start(@uri, @timeout) do |http|
        http.request(req)
    end
end