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::Core::Connection}
@option options [Boolean] :persistent
Sets a persistent HTTP {Fog::Core::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] || API_URL @auth_connection = Fog::Core::Connection.new(@auth_url) @api_url = options[:brightbox_api_url] || API_URL @connection_options = options[:connection_options] || {} @persistent = options[:persistent] || false @connection = Fog::Core::Connection.new(@api_url, @persistent, @connection_options) # Authentication options client_id = options[:brightbox_client_id] client_secret = options[:brightbox_secret] username = options[:brightbox_username] password = options[:brightbox_password] @configured_account = options[: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 218 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) get_access_token unless access_token_available? authenticated_request(options) rescue Excon::Errors::Unauthorized get_access_token authenticated_request(options) end