1
0
Fork 0
mirror of https://github.com/fog/fog.git synced 2022-11-09 13:51:43 -05:00
fog--fog/lib/fog/rackspace/monitoring.rb
Daniel Reichert 166803de25 Added rackspace monitoring with correct namespace
These files were merged from github.com/racker/rackspace-monitoring-rb. The
namespace was different than the convetion in fog so the namespace was modified
to be compliant with the rest of the fog library.
2013-07-03 14:04:58 -07:00

181 lines
5.3 KiB
Ruby

require 'fog'
require 'fog/core'
module Fog
module Rackspace
class Monitoring < Fog::Service
ENDPOINT = 'https://monitoring.api.rackspacecloud.com/v1.0'
requires :rackspace_api_key, :rackspace_username
recognizes :rackspace_auth_url, :persistent, :raise_errors
recognizes :rackspace_auth_token, :rackspace_service_url, :rackspace_account_id
model_path 'rackspace-monitoring/monitoring/models'
model :entity
collection :entities
model :check
collection :checks
model :alarm
collection :alarms
model :alarm_example
collection :alarm_examples
model :agent_token
collection :agent_tokens
model :metric
collection :metrics
model :data_point
collection :data_points
model :check_type
collection :check_types
request_path 'rackspace-monitoring/monitoring/requests'
request :list_agent_tokens
request :list_alarms
request :list_alarm_examples
request :list_checks
request :list_entities
request :list_metrics
request :list_data_points
request :list_check_types
request :list_overview
request :get_agent_token
request :get_alarm
request :get_alarm_example
request :get_check
request :get_entity
request :create_agent_token
request :create_alarm
request :create_check
request :create_entity
request :update_check
request :update_entity
request :update_alarm
request :delete_check
request :delete_entity
request :evaluate_alarm_example
class Mock
end
class Real
def initialize(options={})
@rackspace_api_key = options[:rackspace_api_key]
@rackspace_username = options[:rackspace_username]
@rackspace_auth_url = options[:rackspace_auth_url]
@rackspace_auth_token = options[:rackspace_auth_token]
@rackspace_account_id = options[:rackspace_account_id]
@rackspace_service_url = options[:rackspace_service_url] || ENDPOINT
@rackspace_must_reauthenticate = false
@connection_options = options[:connection_options] || {}
if options.has_key?(:raise_errors)
@raise_errors = options[:raise_errors]
else
@raise_errors = true
end
begin
authenticate
rescue Exception => error
raise_error(error)
end
@persistent = options[:persistent] || false
begin
@connection = Fog::Connection.new("#{@scheme}://#{@host}:#{@port}", @persistent, @connection_options)
rescue Exception => error
raise_error(error)
end
end
def reload
@connection.reset
end
def raise_error(error)
if @raise_errors
raise error
else
print "Error occurred: " + error.message
end
end
def request(params)
begin
begin
response = @connection.request(params.merge({
:headers => {
'Content-Type' => 'application/json',
'X-Auth-Token' => @auth_token
}.merge!(params[:headers] || {}),
:host => @host,
:path => "#{@path}/#{params[:path]}"
}))
rescue Excon::Errors::Unauthorized => error
if error.response.body != 'Bad username or password' # token expiration
@rackspace_must_reauthenticate = true
authenticate
retry
else # bad credentials
raise error
end
rescue Excon::Errors::HTTPStatusError => error
raise case error
when Excon::Errors::NotFound
Fog::Monitoring::Rackspace::NotFound.slurp(error)
else
error
end
end
unless response.body.empty?
response.body = JSON.decode(response.body)
end
response
rescue Exception => error
raise_error(error)
end
end
private
def authenticate
if @rackspace_must_reauthenticate || @rackspace_auth_token.nil? || @account_id.nil?
options = {
:rackspace_api_key => @rackspace_api_key,
:rackspace_username => @rackspace_username,
:rackspace_auth_url => @rackspace_auth_url
}
begin
credentials = Fog::Rackspace.authenticate(options)
rescue Exception => error
raise_error(error)
return
end
@auth_token = credentials['X-Auth-Token']
@account_id = credentials['X-Server-Management-Url'].match(/.*\/([\d]+)$/)[1]
else
@auth_token = @rackspace_auth_token
@account_id = @rackspace_account_id
end
uri = URI.parse("#{@rackspace_service_url}/#{@account_id}")
@host = uri.host
@path = uri.path
@port = uri.port
@scheme = uri.scheme
end
end
end
end
end