Merge branch 'gilles'

Conflicts:
	lib/fog/compute/aws.rb
This commit is contained in:
geemus 2011-03-15 16:24:49 -07:00
commit 6edd53f510
8 changed files with 269 additions and 23 deletions

View File

@ -69,6 +69,8 @@ module Fog
request :terminate_instances request :terminate_instances
request :start_instances request :start_instances
request :stop_instances request :stop_instances
request :monitor_instances
request :unmonitor_instances
class Mock class Mock
@ -134,6 +136,7 @@ module Fog
@aws_access_key_id = options[:aws_access_key_id] @aws_access_key_id = options[:aws_access_key_id]
@region = options[:region] || 'us-east-1' @region = options[:region] || 'us-east-1'
reset_data reset_data
@owner_id = @data[:owner_id] @owner_id = @data[:owner_id]
end end

View File

@ -215,6 +215,29 @@ module Fog
connection.volumes(:server => self) connection.volumes(:server => self)
end end
#I tried to call it monitoring= and be smart with attributes[]
#but in #save a merge_attribute is called after run_instance
#thus making an un-necessary request. Use this until finding a clever solution
def monitor=(boolean)
#we don't have a server yet. the status silently goes in the attributes for run_instances
if !identity
self.monitoring=boolean
end
case boolean
when true
response = connection.monitor_instances(identity)
when false
response = connection.unmonitor_instances(identity)
else
raise ArgumentError.new("only Boolean allowed here")
end
#set the attribute, there is only one instance_id here
response.body['instancesSet'][0]['monitoring'] == 'enabled' ? self.monitoring=true : self.monitoring=false
end
end end
end end

View File

@ -0,0 +1,35 @@
module Fog
module Parsers
module AWS
module Compute
class MonitorUnmonitorInstances < Fog::Parsers::Base
def reset
@response = {}
@instance_set = []
@current_instance_set = {}
end
def end_element(name)
case name
when 'requestId'
@response['requestId'] = @value
when 'instanceId'
@current_instance_set['instanceId'] = @value
when 'item'
@instance_set << @current_instance_set
@current_instance_set = {}
when 'state'
@current_instance_set['monitoring'] = @value
when 'instancesSet'
@response['instancesSet'] = @instance_set
end
end
end
end
end
end
end

View File

@ -0,0 +1,52 @@
module Fog
module AWS
class Compute
class Real
require 'fog/compute/parsers/aws/monitor_unmonitor_instances'
# Monitor specified instance
# http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-MonitorInstances.html
#
# ==== Parameters
# * instance_ids<~Array> - Arrays of instances Ids to monitor
#
# ==== Returns
# * response<~Excon::Response>:
# * body<~Hash>:
# * 'requestId'<~String> - Id of request
# * 'instancesSet': http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-ItemType-MonitorInstancesResponseSetItemType.html
def monitor_instances(instance_ids)
params = AWS.indexed_param('InstanceId', instance_ids)
request({
'Action' => 'MonitorInstances',
:idempotent => true,
:parser => Fog::Parsers::AWS::Compute::MonitorUnmonitorInstances.new
}.merge!(params))
end
end
class Mock
def monitor_instances(instance_ids)
response = Excon::Response.new
response.status = 200
[*instance_ids].each do |instance_id|
if instance = @data[:instances][instance_id]
instance['monitoring']['state'] = 'enabled'
else
raise Fog::AWS::Compute::NotFound.new("The instance ID '#{instance_ids}' does not exist")
end
end
instances_set = [*instance_ids].inject([]) { |memo, id| memo << {'instanceId' => id, 'monitoring' => 'enabled'} }
response.body = {'requestId' => 'some_request_id', 'instancesSet' => instances_set}
response
end
end
end
end
end

View File

@ -0,0 +1,53 @@
module Fog
module AWS
class Compute
class Real
require 'fog/compute/parsers/aws/monitor_unmonitor_instances'
# UnMonitor specified instance
# http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-UnmonitorInstances.html
#
# ==== Parameters
# * instance_ids<~Array> - Arrays of instances Ids to monitor
#
# ==== Returns
# * response<~Excon::Response>:
# * body<~Hash>:
# * 'requestId'<~String> - Id of request
# * 'instancesSet': http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-ItemType-MonitorInstancesResponseSetItemType.html
def unmonitor_instances(instance_ids)
params = AWS.indexed_param('InstanceId', instance_ids)
request({
'Action' => 'UnmonitorInstances',
:idempotent => true,
:parser => Fog::Parsers::AWS::Compute::MonitorUnmonitorInstances.new
}.merge!(params))
end
end
class Mock
def unmonitor_instances(instance_ids)
response = Excon::Response.new
response.status = 200
[*instance_ids].each do |instance_id|
if instance = @data[:instances][instance_id]
instance['monitoring']['state'] = 'enabled'
else
raise Fog::AWS::Compute::NotFound.new("The instance ID '#{instance_ids}' does not exist")
end
end
instances_set = [*instance_ids].inject([]) { |memo, id| memo << {'instanceId' => id, 'monitoring' => 'disabled'} }
response.body = {'requestId' => 'some_request_id', 'instancesSet' => instances_set}
response
end
end
end
end
end

View File

@ -0,0 +1,47 @@
Shindo.tests("AWS::Compute::Server | monitor", ['aws']) do
config = compute_providers[AWS]
if !Fog.mocking? || config[:mocked]
@instance = AWS[:compute].servers.new(config[:server_attributes])
end
tests('new instance') do
test('monitor') do
@instance.monitoring = true
@instance.attributes[:monitoring] == true
end
test('unmonitor') do
@instance.monitoring = false
@instance.attributes[:monitoring] == false
end
end
tests('existing instance') do
@instance.save
test('monitor') do
#what I'd really like to test is if connection.monitor_instances is being called
#this is a safeguard
@instance.identity != nil
@instance.monitoring = false
@instance.monitor = true
@instance.monitoring == true
end
test('unmonitor') do
#what I'd really like to test is if connection.monitor_instances is being called
#this is a safeguard
@instance.identity != nil
@instance.monitoring = true
@instance.monitor = false
@instance.monitoring == false
end
end
end

View File

@ -4,29 +4,13 @@ for provider, config in compute_providers
server_tests(provider[:compute], (config[:server_attributes] || {}), config[:mocked]) do server_tests(provider[:compute], (config[:server_attributes] || {}), config[:mocked]) do
tests('responds_to(:bootstrap)') do if Fog.mocking? && !config[:mocked]
pending if Fog.mocking? && !config[:mocked] pending
@instance.responds_to(:bootstrap) else
end responds_to(:boostrap)
responds_to(:public_ip_address)
tests('responds_to(:private_ip_address)') do responds_to(:scp)
pending if Fog.mocking? && !config[:mocked] responds_to(:ssh)
@instance.responds_to(:public_ip_address)
end
tests('responds_to(:public_ip_address)') do
pending if Fog.mocking? && !config[:mocked]
@instance.responds_to(:public_ip_address)
end
tests('responds_to(:scp)') do
pending if Fog.mocking? && !config[:mocked]
@instance.responds_to(:ssh)
end
tests('responds_to(:ssh)') do
pending if Fog.mocking? && !config[:mocked]
@instance.responds_to(:ssh)
end end
end end

View File

@ -0,0 +1,49 @@
require 'fog/compute/parsers/aws/monitor_unmonitor_instances'
Shindo.tests('AWS::Compute::MonitorUnmonitorInstances | monitor/unmonitor parser') do
tests('success') do
tests('#parse') do
aws_result = <<-AWS
<UnmonitorInstancesResponse xmlns="http://ec2.amazonaws.com/doc/2010-11-15/">
<requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
<instancesSet>
<item>
<instanceId>i-43a4412a</instanceId>
<monitoring>
<state>enabled</state>
</monitoring>
</item>
<item>
<instanceId>i-23a3397d</instanceId>
<monitoring>
<state>disabled</state>
</monitoring>
</item>
</instancesSet>
</UnmonitorInstancesResponse>
AWS
parser = Fog::Parsers::AWS::Compute::MonitorUnmonitorInstances.new
body = Nokogiri::XML::SAX::PushParser.new(parser)
body << aws_result
test('requestId') { parser.response['requestId'] == '59dbff89-35bd-4eac-99ed-be587EXAMPLE' }
test('enabled') do
selected = parser.response['instancesSet'].select { |item| item['instanceId'] == 'i-43a4412a' }[0]
selected['monitoring'] == 'enabled'
end
test('disabled') do
selected = parser.response['instancesSet'].select { |item| item['instanceId'] == 'i-23a3397d' }[0]
selected['monitoring'] == 'disabled'
end
end
end
end