1
0
Fork 0
mirror of https://github.com/fog/fog.git synced 2022-11-09 13:51:43 -05:00

[Vcloud] Handle Internet Service Monitors for Terremark::Ecloud

This commit is contained in:
freeformz 2010-07-29 06:40:08 +08:00 committed by Wesley Beary
parent 24955b0b17
commit c3365f337d
3 changed files with 95 additions and 13 deletions

View file

@ -34,6 +34,26 @@ module Fog
end
end
def monitor=(new_monitor = {})
if new_monitor.nil?
@monitor = nil
elsif new_monitor.is_a?(Hash)
@monitor = {}
@monitor[:type] = new_monitor[:MonitorType] || new_monitor[:type]
@monitor[:url_send_string] = new_monitor[:UrlSendString] || new_monitor[:url_send_string]
@monitor[:http_headers] = new_monitor[:HttpHeader] || new_monitor[:http_headers]
@monitor[:http_headers] = @monitor[:http_headers].split("\n") unless @monitor[:http_headers].is_a?(Array)
@monitor[:receive_string] = new_monitor[:ReceiveString] || new_monitor[:receive_string]
@monitor[:interval] = new_monitor[:Interval] || new_monitor[:interval]
@monitor[:response_timeout] = new_monitor[:ResponseTimeOut] || new_monitor[:response_timeout]
@monitor[:downtime] = new_monitor[:DownTime] || new_monitor[:downtime]
@monitor[:retries] = new_monitor[:Retries] || new_monitor[:retries]
@monitor[:is_enabled] = new_monitor[:IsEnabled] || new_monitor[:is_enabled]
else
raise RuntimeError.new("monitor needs to either be nil or a Hash")
end
end
def nodes
@nodes ||= Fog::Vcloud::Terremark::Ecloud::Nodes.new( :connection => connection, :href => href + "/nodeServices" )
end
@ -41,8 +61,9 @@ module Fog
private
def _compose_service_data
#For some reason inject didn't work
service_data = {}
self.class.attributes.select{ |attribute| !send(attribute).nil? }.each { |attribute| service_data[attribute] = send(attribute).to_s }
self.class.attributes.select{ |attribute| !send(attribute).nil? }.each { |attribute| service_data[attribute] = send(attribute) }
service_data
end

View file

@ -15,17 +15,23 @@ module Fog
builder.Enabled(service_data[:enabled])
builder.Description(service_data[:description])
builder.RedirectURL(service_data[:redirect_url])
#builder.Monitor {
# builder.MonitorType {}
# builder.UrlSendString {}
# builder.HttpHeader {}
# builder.ReceiveString {}
# builder.Interval {}
# builder.ResponseTimeOut {}
# builder.DownTime {}
# builder.Retries {}
# builder.IsEnabled {}
#}
if monitor = service_data[:monitor]
generate_monitor_section(builder,monitor)
end
}
end
def generate_monitor_section(builder, monitor)
builder.Monitor {
builder.MonitorType(monitor[:type])
builder.UrlSendString(monitor[:url_send_string])
builder.HttpHeader(monitor[:http_headers].join("\n"))
builder.ReceiveString(monitor[:receive_string])
builder.Interval(monitor[:interval])
builder.ResponseTimeOut(monitor[:response_timeout])
builder.DownTime(monitor[:downtime])
builder.Retries(monitor[:retries])
builder.IsEnabled(monitor[:is_enabled])
}
end
@ -39,8 +45,55 @@ module Fog
end
end
def validate_internet_service_monitor(monitor)
#FIXME: Refactor this type of function into something generic
required_opts = [:type, :url_send_string, :http_headers, :receive_string, :is_enabled]
unless required_opts.all? { |opt| monitor.keys.include?(opt) && monitor[opt] }
raise ArgumentError.new("Required Monitor data missing: #{(required_opts - monitor.keys).map(&:inspect).join(", ")}")
end
unless ['HTTP','ECV'].include?(monitor[:type])
raise ArgumentError.new("Supported monitor types are: ECV & HTTP")
end
unless monitor[:http_headers].is_a?(Array) || monitor[:http_headers].is_a?(String)
raise ArgumentError.new("Monitor :http_headers must be a String or Array")
end
unless [true, false, "true", "false"].include?(monitor[:is_enabled])
raise ArgumentError.new("Monitor :is_enabled must be true or false")
end
end
def ensure_monitor_defaults!(monitor)
if monitor[:http_headers].is_a?(String)
monitor[:http_headers] = [ monitor[:http_headers] ]
end
unless monitor[:retries]
monitor[:retries] = 3
end
unless monitor[:response_timeout]
monitor[:response_timeout] = 2
end
unless monitor[:down_time]
monitor[:down_time] = 30
end
unless monitor[:interval]
monitor[:interval] = 5
end
end
def add_internet_service(internet_services_uri, service_data)
validate_internet_service_data(service_data)
if monitor = service_data[:monitor]
validate_internet_service_monitor(monitor)
ensure_monitor_defaults!(monitor)
end
request(
:body => generate_internet_service_request(service_data),
@ -64,7 +117,7 @@ module Fog
validate_internet_service_data(service_data)
internet_services_uri = ensure_unparsed(internet_services_uri)
if ip = ip_from_uri(internet_services_uri)
id = rand(1000)
new_service = service_data.merge!( { :href => Fog::Vcloud::Terremark::Ecloud::Mock.internet_service_href( { :id => id } ),

View file

@ -22,6 +22,9 @@ module Fog
builder.Href(ip_address_data[:href].to_s)
builder.Name(ip_address_data[:name])
}
if monitor = service_data[:monitor]
generate_monitor_section(builder,monitor)
end
}
end
@ -37,6 +40,11 @@ module Fog
validate_public_ip_address_data(ip_address_data)
if monitor = service_data[:monitor]
validate_internet_service_monitor(monitor)
ensure_monitor_defaults!(monitor)
end
request(
:body => generate_internet_service_response(service_data, ip_address_data),
:expects => 200,