blob: 60ff5adf01c21db636e3e4198eca356201772cd5 [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership. The
# ASF licenses this file to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance with the
# License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
module Deltacloud::Client
class Connection
attr_accessor :connection
attr_reader :request_driver
attr_reader :request_provider
attr_reader :entrypoint
include Deltacloud::Client::Helpers::Model
include Deltacloud::Client::Methods::Address
include Deltacloud::Client::Methods::Api
include Deltacloud::Client::Methods::BackwardCompatibility
include Deltacloud::Client::Methods::Blob
include Deltacloud::Client::Methods::Bucket
include Deltacloud::Client::Methods::Common
include Deltacloud::Client::Methods::Driver
include Deltacloud::Client::Methods::Firewall
include Deltacloud::Client::Methods::HardwareProfile
include Deltacloud::Client::Methods::Image
include Deltacloud::Client::Methods::Instance
include Deltacloud::Client::Methods::InstanceState
include Deltacloud::Client::Methods::Key
include Deltacloud::Client::Methods::Realm
include Deltacloud::Client::Methods::StorageSnapshot
include Deltacloud::Client::Methods::StorageVolume
include Deltacloud::Client::Methods::LoadBalancer
include Deltacloud::Client::Methods::Metric
def initialize(opts={})
@request_driver = opts[:driver]
@request_provider = opts[:provider]
@connection = Faraday.new(:url => opts[:url]) do |f|
# NOTE: The order of this is somehow important for VCR
# recording.
f.request :url_encoded
f.headers = deltacloud_request_headers
f.basic_auth opts[:api_user], opts[:api_password]
f.use Deltacloud::ErrorResponse
f.adapter :net_http
end
cache_entrypoint!
@request_driver ||= current_driver
@request_provider ||= current_provider
end
# Change the current driver and return copy of the client
# This allows chained calls like: client.driver(:ec2).instances
#
# - driver_id -> The new driver id (:mock, :ec2, :rhevm, ...)
# - api_user -> API user name
# - api_password -> API password
# - api_provider -> API provider (aka API_PROVIDER string)
#
def use(driver_id, api_user, api_password, api_provider=nil, &block)
new_client = self.class.new(
:url => @connection.url_prefix.to_s,
:api_user => api_user,
:api_password => api_password,
:provider => api_provider,
:driver => driver_id
)
new_client.cache_entrypoint!
yield new_client if block_given?
new_client
end
# Change the API provider but keep the current client credentials.
# This allows to change the EC2 region and list instances in that
# region without need to supply credentials.
#
# client.use_provider('eu-west-1') { |p| p.instances }
#
# - provider_id -> API provider (aka API_PROVIDER)
#
def use_provider(provider_id, &block)
new_client = self.clone
new_connection = @connection.clone
new_connection.headers['X-Deltacloud-Provider'] = provider_id
new_client.connection = new_connection
new_client.cache_entrypoint!(true)
yield new_client if block_given?
new_client
end
# Cache the API entrypoint (/api) for the current connection,
# so we don't need to query /api everytime we ask if certain
# collection/operation is supported
#
# - force -> If 'true' force to refresh stored cached entrypoint
#
def cache_entrypoint!(force=false)
@entrypoint = nil if force
@entrypoint ||= connection.get(path).body
end
# Check if the credentials used are valid for the current @connection
#
def valid_credentials?
begin
r = connection.get(path, { :force_auth => 'true' })
r.status == 200
rescue error(:authentication_error)
false
end
end
private
# Default Deltacloud HTTP headers. Common for *all* requests
# to Deltacloud API
#
def deltacloud_request_headers
headers = {}
headers['Accept'] = 'application/xml'
headers['X-Deltacloud-Driver'] = @request_driver.to_s \
if @request_driver
headers['X-Deltacloud-Provider'] = @request_provider.to_s \
if @request_provider
headers
end
end
end