module Fog::Brightbox::Compute::Shared
The Shared
module consists of code that was duplicated between the Real and Mock
implementations.
Constants
- API_URL
Public Class Methods
Creates a new instance of the Brightbox
Compute
service
@note If you create service using just a refresh token when it
expires the service will no longer be able to authenticate.
@param [Hash] options @option options [String] :brightbox_api_url
Override the default (or configured) API endpoint
@option options [String] :brightbox_auth_url
Override the default (or configured) API authentication endpoint
@option options [String] :brightbox_client_id
Client identifier to authenticate with (overrides configured)
@option options [String] :brightbox_secret
Client secret to authenticate with (overrides configured)
@option options [String] :brightbox_username
Email or user identifier for user based authentication
@option options [String] :brightbox_password
Password for user based authentication
@option options [String] :brightbox_account
Account identifier to scope this connection to
@option options [String] :connection_options
Settings to pass to underlying {Fog::Connection}
@option options [Boolean] :persistent
Sets a persistent HTTP {Fog::Connection}
@option options [String] :brightbox_access_token
Sets the OAuth access token to use rather than requesting a new token
@option options [String] :brightbox_refresh_token
Sets the refresh token to use when requesting a newer access token
@option options [String] (true) :brightbox_token_management Overide the existing behaviour to request access tokens if expired
# File lib/fog/brightbox/compute/shared.rb, line 46 def initialize(options) # Currently authentication and api endpoints are the same but may change @auth_url = options[:brightbox_auth_url] || Fog.credentials[:brightbox_auth_url] || API_URL @auth_connection = Fog::Connection.new(@auth_url) @api_url = options[:brightbox_api_url] || Fog.credentials[:brightbox_api_url] || API_URL @connection_options = options[:connection_options] || {} @persistent = options[:persistent] || false @connection = Fog::Connection.new(@api_url, @persistent, @connection_options) # Authentication options client_id = options[:brightbox_client_id] || Fog.credentials[:brightbox_client_id] client_secret = options[:brightbox_secret] || Fog.credentials[:brightbox_secret] username = options[:brightbox_username] || Fog.credentials[:brightbox_username] password = options[:brightbox_password] || Fog.credentials[:brightbox_password] @configured_account = options[:brightbox_account] || Fog.credentials[:brightbox_account] # Request account can be changed at anytime and changes behaviour of future requests @scoped_account = @configured_account credential_options = {:username => username, :password => password} @credentials = CredentialSet.new(client_id, client_secret, credential_options) # If existing tokens have been cached, allow continued use of them in the service @credentials.update_tokens(options[:brightbox_access_token], options[:brightbox_refresh_token]) @token_management = options.fetch(:brightbox_token_management, true) end
Public Instance Methods
Returns the current access token or nil @return [String,nil]
# File lib/fog/brightbox/compute/shared.rb, line 123 def access_token @credentials.access_token end
Returns true if an access token is set @return [Boolean]
# File lib/fog/brightbox/compute/shared.rb, line 117 def access_token_available? !! @credentials.access_token end
Returns the scoped account being used for requests
-
For API clients this is the owning account
-
For User applications this is the account specified by either
account_id
option on the service or thebrightbox_account
setting in your configuration
@return [Fog::Compute::Brightbox::Account]
# File lib/fog/brightbox/compute/shared.rb, line 104 def account account_data = get_scoped_account.merge(:service => self) Fog::Compute::Brightbox::Account.new(account_data) end
Returns true if authentication is being performed as a user @return [Boolean]
# File lib/fog/brightbox/compute/shared.rb, line 111 def authenticating_as_user? @credentials.user_details? end
Returns an identifier for the default image for use
Currently tries to find the latest version of Ubuntu (i686) from Brightbox
.
Highly recommended that you actually select the image you want to run on your servers yourself!
@return [String] if image is found, returns the identifier @return [NilClass] if no image is found or an error occurs
# File lib/fog/brightbox/compute/shared.rb, line 173 def default_image return @default_image_id unless @default_image_id.nil? @default_image_id = Fog.credentials[:brightbox_default_image] || select_default_image end
Returns the current token expiry time in seconds or nil @return [Number,nil]
# File lib/fog/brightbox/compute/shared.rb, line 135 def expires_in @credentials.expires_in end
Requests a new access token
@return [String] New access token
# File lib/fog/brightbox/compute/shared.rb, line 142 def get_access_token begin get_access_token! rescue Excon::Errors::Unauthorized, Excon::Errors::BadRequest @credentials.update_tokens(nil, nil) end @credentials.access_token end
Requests a new access token and raises if there is a problem
@return [String] New access token @raise [Excon::Errors::BadRequest] The credentials are expired or incorrect
# File lib/fog/brightbox/compute/shared.rb, line 156 def get_access_token! response = request_access_token(@auth_connection, @credentials) update_credentials_from_response(@credentials, response) @credentials.access_token end
Returns the current refresh token or nil @return [String,nil]
# File lib/fog/brightbox/compute/shared.rb, line 129 def refresh_token @credentials.refresh_token end
This returns the account identifier that the request should be scoped by based on the options passed to the request and current configuration
@param [String] options_account Any identifier passed into the request
@return [String, nil] The account identifier to scope the request to or nil
# File lib/fog/brightbox/compute/shared.rb, line 87 def scoped_account(options_account = nil) [options_account, @scoped_account].compact.first end
Sets the scoped account for future requests @param [String] scoped_account
Identifier of the account to scope request to
# File lib/fog/brightbox/compute/shared.rb, line 77 def scoped_account=(scoped_account) @scoped_account = scoped_account end
Resets the scoped account back to intially configured one
# File lib/fog/brightbox/compute/shared.rb, line 92 def scoped_account_reset @scoped_account = @configured_account end
Private Instance Methods
This request makes an authenticated request of the API using currently setup credentials.
@param [Hash] options Excon compatible options
@see github.com/geemus/excon/blob/master/lib/excon/connection.rb
@return [Excon::Response]
# File lib/fog/brightbox/compute/shared.rb, line 220 def authenticated_request(options) headers = options[:headers] || {} headers.merge!("Authorization" => "OAuth #{@credentials.access_token}", "Content-Type" => "application/json") options[:headers] = headers # TODO This is just a wrapper around a call to Excon::Connection#request # so can be extracted from Compute by passing in the connection, # credentials and options @connection.request(options) end
This makes a request of the API based on the configured setting for token management.
@param [Hash] options Excon compatible options @see github.com/geemus/excon/blob/master/lib/excon/connection.rb
@return [Hash] Data of response body
# File lib/fog/brightbox/compute/shared.rb, line 188 def make_request(options) if @token_management managed_token_request(options) else authenticated_request(options) end end
This request checks for access tokens and will ask for a new one if it receives Unauthorized from the API before repeating the request
@param [Hash] options Excon compatible options
@return [Excon::Response]
# File lib/fog/brightbox/compute/shared.rb, line 202 def managed_token_request(options) begin get_access_token unless access_token_available? response = authenticated_request(options) rescue Excon::Errors::Unauthorized get_access_token response = authenticated_request(options) end end