Skip to content

Commit

Permalink
Merge branch 'gilles'
Browse files Browse the repository at this point in the history
Conflicts:
	lib/fog/compute/aws.rb
  • Loading branch information
geemus committed Mar 15, 2011
2 parents 02b83d6 + 556042d commit 6edd53f
Show file tree
Hide file tree
Showing 8 changed files with 269 additions and 23 deletions.
3 changes: 3 additions & 0 deletions lib/fog/compute/aws.rb
Expand Up @@ -69,6 +69,8 @@ class Compute < Fog::Service
request :terminate_instances
request :start_instances
request :stop_instances
request :monitor_instances
request :unmonitor_instances

class Mock

Expand Down Expand Up @@ -134,6 +136,7 @@ def initialize(options={})

@aws_access_key_id = options[:aws_access_key_id]
@region = options[:region] || 'us-east-1'

reset_data
@owner_id = @data[:owner_id]
end
Expand Down
23 changes: 23 additions & 0 deletions lib/fog/compute/models/aws/server.rb
Expand Up @@ -215,6 +215,29 @@ def volumes
connection.volumes(:server => self)
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
Expand Down
35 changes: 35 additions & 0 deletions lib/fog/compute/parsers/aws/monitor_unmonitor_instances.rb
@@ -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
52 changes: 52 additions & 0 deletions lib/fog/compute/requests/aws/monitor_instances.rb
@@ -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
53 changes: 53 additions & 0 deletions lib/fog/compute/requests/aws/unmonitor_instances.rb
@@ -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
47 changes: 47 additions & 0 deletions tests/compute/models/aws/server_monitor_tests.rb
@@ -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
30 changes: 7 additions & 23 deletions tests/compute/models/server_tests.rb
Expand Up @@ -4,29 +4,13 @@

server_tests(provider[:compute], (config[:server_attributes] || {}), config[:mocked]) do

tests('responds_to(:bootstrap)') do
pending if Fog.mocking? && !config[:mocked]
@instance.responds_to(:bootstrap)
end

tests('responds_to(:private_ip_address)') do
pending if Fog.mocking? && !config[:mocked]
@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)
if Fog.mocking? && !config[:mocked]
pending
else
responds_to(:boostrap)
responds_to(:public_ip_address)
responds_to(:scp)
responds_to(:ssh)
end

end
Expand Down
49 changes: 49 additions & 0 deletions tests/compute/parsers/aws/monitor_unmonitor_instances_tests.rb
@@ -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

0 comments on commit 6edd53f

Please sign in to comment.