fog 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. data/Gemfile.lock +2 -2
  2. data/fog.gemspec +2 -2
  3. data/lib/fog.rb +7 -3
  4. data/lib/fog/aws/ec2.rb +30 -18
  5. data/lib/fog/aws/models/ec2/flavors.rb +3 -2
  6. data/lib/fog/aws/models/ec2/server.rb +1 -1
  7. data/lib/fog/aws/requests/ec2/associate_address.rb +5 -4
  8. data/lib/fog/aws/requests/ec2/attach_volume.rb +10 -11
  9. data/lib/fog/aws/requests/ec2/authorize_security_group_ingress.rb +33 -19
  10. data/lib/fog/aws/requests/ec2/create_key_pair.rb +2 -3
  11. data/lib/fog/aws/requests/ec2/create_security_group.rb +4 -5
  12. data/lib/fog/aws/requests/ec2/delete_security_group.rb +2 -3
  13. data/lib/fog/aws/requests/ec2/delete_snapshot.rb +2 -3
  14. data/lib/fog/aws/requests/ec2/delete_volume.rb +2 -3
  15. data/lib/fog/aws/requests/ec2/describe_addresses.rb +2 -3
  16. data/lib/fog/aws/requests/ec2/describe_availability_zones.rb +10 -6
  17. data/lib/fog/aws/requests/ec2/describe_instances.rb +2 -3
  18. data/lib/fog/aws/requests/ec2/describe_key_pairs.rb +2 -3
  19. data/lib/fog/aws/requests/ec2/describe_regions.rb +10 -6
  20. data/lib/fog/aws/requests/ec2/describe_security_groups.rb +2 -3
  21. data/lib/fog/aws/requests/ec2/describe_snapshots.rb +2 -3
  22. data/lib/fog/aws/requests/ec2/describe_volumes.rb +2 -3
  23. data/lib/fog/aws/requests/ec2/detach_volume.rb +2 -3
  24. data/lib/fog/aws/requests/ec2/disassociate_address.rb +2 -3
  25. data/lib/fog/aws/requests/ec2/get_console_output.rb +3 -4
  26. data/lib/fog/aws/requests/ec2/reboot_instances.rb +2 -3
  27. data/lib/fog/aws/requests/ec2/release_address.rb +2 -3
  28. data/lib/fog/aws/requests/ec2/revoke_security_group_ingress.rb +24 -15
  29. data/lib/fog/aws/requests/ec2/terminate_instances.rb +3 -3
  30. data/lib/fog/aws/requests/s3/put_object.rb +3 -0
  31. data/spec/aws/requests/ec2/describe_instances_spec.rb +2 -2
  32. data/spec/aws/requests/ec2/get_console_output_spec.rb +2 -2
  33. data/spec/aws/requests/ec2/reboot_instances_spec.rb +2 -2
  34. data/spec/aws/requests/ec2/terminate_instances_spec.rb +2 -2
  35. data/tests/aws/requests/ec2/address_tests.rb +13 -25
  36. data/tests/aws/requests/ec2/availability_zone_tests.rb +1 -1
  37. data/tests/aws/requests/ec2/key_pair_tests.rb +2 -2
  38. data/tests/aws/requests/ec2/region_tests.rb +1 -1
  39. data/tests/aws/requests/ec2/security_group_tests.rb +7 -7
  40. data/tests/aws/requests/ec2/snapshot_tests.rb +2 -2
  41. data/tests/aws/requests/ec2/volume_tests.rb +5 -5
  42. metadata +3 -3
@@ -62,13 +62,13 @@ specs:
62
62
  - net-ssh:
63
63
  version: 2.0.22
64
64
  - nokogiri:
65
- version: 1.4.1
65
+ version: 1.4.2
66
66
  - rspec:
67
67
  version: 1.3.0
68
68
  - ruby-hmac:
69
69
  version: 0.4.0
70
70
  - shindo:
71
- version: 0.1.2
71
+ version: 0.1.3
72
72
  hash: 4e55927c1be02ee00fc3353e71caecdebd9d4817
73
73
  sources:
74
74
  - Rubygems:
@@ -7,8 +7,8 @@ Gem::Specification.new do |s|
7
7
  ## If your rubyforge_project name is different, then edit it and comment out
8
8
  ## the sub! line in the Rakefile
9
9
  s.name = 'fog'
10
- s.version = '0.1.2'
11
- s.date = '2010-05-24'
10
+ s.version = '0.1.3'
11
+ s.date = '2010-05-26'
12
12
  s.rubyforge_project = 'fog'
13
13
 
14
14
  ## Make sure your summary is short. The description may be as long
data/lib/fog.rb CHANGED
@@ -25,6 +25,10 @@ require 'fog/model'
25
25
  require 'fog/parser'
26
26
  require 'fog/ssh'
27
27
 
28
+ module Fog
29
+ class Error < StandardError; end
30
+ end
31
+
28
32
  require 'fog/aws'
29
33
  require 'fog/local'
30
34
  require 'fog/rackspace'
@@ -34,8 +38,10 @@ require 'fog/vcloud'
34
38
 
35
39
  module Fog
36
40
 
41
+ class MockNotImplemented < Fog::Error; end
42
+
37
43
  unless const_defined?(:VERSION)
38
- VERSION = '0.1.2'
44
+ VERSION = '0.1.3'
39
45
  end
40
46
 
41
47
  module Mock
@@ -50,8 +56,6 @@ module Fog
50
56
  end
51
57
  end
52
58
 
53
- class MockNotImplemented < StandardError; end
54
-
55
59
  def self.mock!
56
60
  @mocking = true
57
61
  end
@@ -2,6 +2,8 @@ module Fog
2
2
  module AWS
3
3
  module EC2
4
4
 
5
+ class Error < Fog::Error; end
6
+
5
7
  def self.new(options={})
6
8
 
7
9
  unless @required
@@ -96,40 +98,42 @@ module Fog
96
98
 
97
99
  def self.data
98
100
  @data ||= Hash.new do |hash, key|
101
+ owner_id = Fog::AWS::Mock.owner_id
99
102
  hash[key] = {
100
103
  :deleted_at => {},
101
- :addresses => {},
102
- :instances => {},
103
- :key_pairs => {},
104
- :limits => { :addresses => 5 },
104
+ :addresses => {},
105
+ :instances => {},
106
+ :key_pairs => {},
107
+ :limits => { :addresses => 5 },
108
+ :owner_id => owner_id,
105
109
  :security_groups => {
106
110
  'default' => {
107
111
  'groupDescription' => 'default group',
108
112
  'groupName' => 'default',
109
113
  'ipPermissions' => [
110
114
  {
111
- 'groups' => [{'groupName' => 'default', 'userId' => @owner_id}],
115
+ 'groups' => [{'groupName' => 'default', 'userId' => owner_id}],
112
116
  'fromPort' => -1,
113
117
  'toPort' => -1,
114
118
  'ipProtocol' => 'icmp',
115
119
  'ipRanges' => []
116
120
  },
117
121
  {
118
- 'groups' => [{'groupName' => 'default', 'userId' => @owner_id}],
122
+ 'groups' => [{'groupName' => 'default', 'userId' => owner_id}],
119
123
  'fromPort' => 0,
120
124
  'toPort' => 65535,
121
125
  'ipProtocol' => 'tcp',
122
126
  'ipRanges' => []
123
127
  },
124
128
  {
125
- 'groups' => [{'groupName' => 'default', 'userId' => @owner_id}],
129
+ 'groups' => [{'groupName' => 'default', 'userId' => owner_id}],
126
130
  'fromPort' => 0,
127
131
  'toPort' => 65535,
128
132
  'ipProtocol' => 'udp',
129
133
  'ipRanges' => []
130
134
  }
131
135
  ],
132
- 'ownerId' => @owner_id
136
+ 'ownerId' => owner_id
133
137
  }
134
138
  },
135
139
  :snapshots => {},
@@ -146,8 +150,8 @@ module Fog
146
150
 
147
151
  def initialize(options={})
148
152
  @aws_access_key_id = options[:aws_access_key_id]
149
- @owner_id = Fog::AWS::Mock.owner_id
150
153
  @data = self.class.data[@aws_access_key_id]
154
+ @owner_id = @data[:owner_id]
151
155
  end
152
156
 
153
157
  end
@@ -210,15 +214,23 @@ module Fog
210
214
  }
211
215
  )
212
216
 
213
- response = @connection.request({
214
- :body => body,
215
- :expects => 200,
216
- :headers => { 'Content-Type' => 'application/x-www-form-urlencoded' },
217
- :idempotent => idempotent,
218
- :host => @host,
219
- :method => 'POST',
220
- :parser => parser
221
- })
217
+ begin
218
+ response = @connection.request({
219
+ :body => body,
220
+ :expects => 200,
221
+ :headers => { 'Content-Type' => 'application/x-www-form-urlencoded' },
222
+ :idempotent => idempotent,
223
+ :host => @host,
224
+ :method => 'POST',
225
+ :parser => parser
226
+ })
227
+ rescue Excon::Errors::Error => error
228
+ if match = error.message.match(/<Code>(.*)<\/Code><Message>(.*)<\/Message>/)
229
+ raise Fog::AWS::EC2::Error.new("#{match[1]} => #{match[2]}")
230
+ else
231
+ raise error
232
+ end
233
+ end
222
234
 
223
235
  response
224
236
  end
@@ -30,8 +30,9 @@ module Fog
30
30
  { :bits => 32, :cores => 5, :disk => 350, :id => 'c1.medium', :name => 'High-CPU Medium', :ram => 1740.8},
31
31
  { :bits => 64, :cores => 20, :disk => 1690, :id => 'c1.xlarge', :name => 'High-CPU Extra Large', :ram => 7168},
32
32
 
33
- { :bits => 64, :cores => 13, :disk => 850, :id => 'm2.2xlarge', :name => 'High Memory Double Extra Large', :ram => 35020.8},
34
- { :bits => 64, :cores => 26, :disk => 1690, :id => 'm2.4xlarge', :name => 'High Memory Quadruple Extra Large', :ram => 70041.6},
33
+ { :bits => 64, :cores => 6.5, :disk => 420, :id => 'm2.xlarge', :name => 'High-Memory Extra Large', :ram => 17510.4},
34
+ { :bits => 64, :cores => 13, :disk => 850, :id => 'm2.2xlarge', :name => 'High Memory Double Extra Large', :ram => 35020.8},
35
+ { :bits => 64, :cores => 26, :disk => 1690, :id => 'm2.4xlarge', :name => 'High Memory Quadruple Extra Large', :ram => 70041.6},
35
36
  ]
36
37
  load(data)
37
38
  self
@@ -117,7 +117,7 @@ module Fog
117
117
 
118
118
  options = {
119
119
  'BlockDeviceMapping' => @block_device_mapping,
120
- 'InstanceType' => flavor.id,
120
+ 'InstanceType' => flavor_id,
121
121
  'KernelId' => @kernel_id,
122
122
  'KeyName' => @key_name,
123
123
  'Monitoring.Enabled' => @monitoring,
@@ -43,11 +43,12 @@ module Fog
43
43
  'requestId' => Fog::AWS::Mock.request_id,
44
44
  'return' => true
45
45
  }
46
- else
47
- response.status = 400
48
- raise(Excon::Errors.status_error({:expects => 200}, response))
46
+ response
47
+ elsif !instance
48
+ raise Fog::AWS::EC2::Error.new("InvalidInstanceID.NotFound => The instance ID '#{instance_id}' does not exist")
49
+ elsif !address
50
+ raise Fog::AWS::EC2::Error.new("AuthFailure => The address '#{public_ip}' does not belong to you.")
49
51
  end
50
- response
51
52
  end
52
53
 
53
54
  end
@@ -54,24 +54,23 @@ module Fog
54
54
  response.body = {
55
55
  'requestId' => Fog::AWS::Mock.request_id
56
56
  }.merge!(data)
57
- else
58
- response.status = 400
59
- raise(Excon::Errors.status_error({:expects => 200}, response))
57
+ response
58
+ elsif !instance
59
+ raise Fog::AWS::EC2::Error.new("InvalidInstanceID.NotFound => The instance ID '#{instance_id}' does not exist.")
60
+ elsif !volume
61
+ raise Fog::AWS::EC2::Error.new("InvalidVolume.NotFound => The volume '#{volume_id}' does not exist.")
60
62
  end
61
63
  else
62
- response.status = 400
63
- response.body = {
64
- 'Code' => 'MissingParameter'
65
- }
64
+ message = 'MissingParameter => '
66
65
  if !instance_id
67
- response['Message'] = 'The request must contain the parameter instance_id'
66
+ message << 'The request must contain the parameter instance_id'
68
67
  elsif !volume_id
69
- response['Message'] = 'The request must contain the parameter volume_id'
68
+ message << 'The request must contain the parameter volume_id'
70
69
  else
71
- response['Message'] = 'The request must contain the parameter device'
70
+ message << 'The request must contain the parameter device'
72
71
  end
72
+ raise Fog::AWS::EC2::Error.new(message)
73
73
  end
74
- response
75
74
  end
76
75
 
77
76
  end
@@ -37,33 +37,47 @@ module Fog
37
37
  def authorize_security_group_ingress(options = {})
38
38
  response = Excon::Response.new
39
39
  group = @data[:security_groups][options['GroupName']]
40
- group['ipPermissions'] ||= []
41
40
 
42
- if options['GroupName'] && options['SourceSecurityGroupName'] && options['SourceSecurityGroupOwnerId']
43
- ['icmp', 'tcp', 'udp'].each do |protocol|
41
+ if group
42
+ group['ipPermissions'] ||= []
43
+ if options['GroupName'] && options['SourceSecurityGroupName'] && options['SourceSecurityGroupOwnerId']
44
+ ['tcp', 'udp'].each do |protocol|
45
+ group['ipPermissions'] << {
46
+ 'groups' => [{'groupName' => options['GroupName'], 'userId' => @owner_id}],
47
+ 'fromPort' => 1,
48
+ 'ipRanges' => [],
49
+ 'ipProtocol' => protocol,
50
+ 'toPort' => 65535
51
+ }
52
+ end
44
53
  group['ipPermissions'] << {
45
54
  'groups' => [{'groupName' => options['GroupName'], 'userId' => @owner_id}],
46
- 'fromPort' => 1,
55
+ 'fromPort' => -1,
47
56
  'ipRanges' => [],
48
- 'ipProtocol' => protocol,
49
- 'toPort' => 65535
57
+ 'ipProtocol' => 'icmp',
58
+ 'toPort' => -1
50
59
  }
60
+ else
61
+ group['ipPermissions'] << {
62
+ 'groups' => [],
63
+ 'fromPort' => options['FromPort'],
64
+ 'ipRanges' => [],
65
+ 'ipProtocol' => options['IpProtocol'],
66
+ 'toPort' => options['ToPort']
67
+ }
68
+ if options['CidrIp']
69
+ group['ipPermissions'].last['ipRanges'] << { 'cidrIp' => options['CidrIp'] }
70
+ end
51
71
  end
52
- else
53
- group['ipPermissions'] << {
54
- 'groups' => [],
55
- 'fromPort' => options['FromPort'],
56
- 'ipRanges' => [{ 'cidrIp' => options['CidrIp'] }],
57
- 'ipProtocol' => options['IpProtocol'],
58
- 'toPort' => options['ToPort']
72
+ response.status = 200
73
+ response.body = {
74
+ 'requestId' => Fog::AWS::Mock.request_id,
75
+ 'return' => true
59
76
  }
77
+ response
78
+ else
79
+ raise Fog::AWS::EC2::Error.new("InvalidGroup.NotFound => The security group '#{options['GroupName']}' does not exist")
60
80
  end
61
- response.status = 200
62
- response.body = {
63
- 'requestId' => Fog::AWS::Mock.request_id,
64
- 'return' => true
65
- }
66
- response
67
81
  end
68
82
 
69
83
  end
@@ -40,11 +40,10 @@ module Fog
40
40
  response.body = {
41
41
  'requestId' => Fog::AWS::Mock.request_id
42
42
  }.merge!(data)
43
+ response
43
44
  else
44
- response.status = 400
45
- raise(Excon::Errors.status_error({:expects => 200}, response))
45
+ raise Fog::AWS::EC2::Error.new("InvalidKeyPair.Duplicate => The keypair '#{key_name}' already exists.")
46
46
  end
47
- response
48
47
  end
49
48
 
50
49
  end
@@ -31,8 +31,8 @@ module Fog
31
31
  response = Excon::Response.new
32
32
  unless @data[:security_groups][name]
33
33
  data = {
34
- 'groupDescription' => description,
35
- 'groupName' => name,
34
+ 'groupDescription' => CGI.escape(description).gsub('%20', '+'),
35
+ 'groupName' => CGI.escape(name).gsub('%20', '+'),
36
36
  'ipPermissions' => [],
37
37
  'ownerId' => @owner_id
38
38
  }
@@ -41,11 +41,10 @@ module Fog
41
41
  'requestId' => Fog::AWS::Mock.request_id,
42
42
  'return' => true
43
43
  }
44
+ response
44
45
  else
45
- response.status = 400
46
- raise(Excon::Errors.status_error({:expects => 200}, response))
46
+ raise Fog::AWS::EC2::Error.new("InvalidGroup.Duplicate => The security group '#{name}' already exists")
47
47
  end
48
- response
49
48
  end
50
49
 
51
50
  end
@@ -34,11 +34,10 @@ module Fog
34
34
  'requestId' => Fog::AWS::Mock.request_id,
35
35
  'return' => true
36
36
  }
37
+ response
37
38
  else
38
- response.status = 400
39
- raise(Excon::Errors.status_error({:expects => 200}, response))
39
+ raise Fog::AWS::EC2::Error.new("InvalidGroup.NotFound => The security group '#{name}' does not exist")
40
40
  end
41
- response
42
41
  end
43
42
  end
44
43
  end
@@ -34,11 +34,10 @@ module Fog
34
34
  'requestId' => Fog::AWS::Mock.request_id,
35
35
  'return' => true
36
36
  }
37
+ response
37
38
  else
38
- response.status = 400
39
- raise(Excon::Errors.status_error({:expects => 200}, response))
39
+ raise Fog::AWS::EC2::Error.new("InvalidSnapshot.NotFound => The snapshot '#{snapshot_id}' does not exist.")
40
40
  end
41
- response
42
41
  end
43
42
 
44
43
  end
@@ -36,11 +36,10 @@ module Fog
36
36
  'requestId' => Fog::AWS::Mock.request_id,
37
37
  'return' => true
38
38
  }
39
+ response
39
40
  else
40
- response.status = 400
41
- raise(Excon::Errors.status_error({:expects => 200}, response))
41
+ raise Fog::AWS::EC2::Error.new("InvalidVolume.NotFound => The volume '#{volume_id}' does not exist.")
42
42
  end
43
- response
44
43
  end
45
44
 
46
45
  end
@@ -42,11 +42,10 @@ module Fog
42
42
  'requestId' => Fog::AWS::Mock.request_id,
43
43
  'addressesSet' => addresses_set
44
44
  }
45
+ response
45
46
  else
46
- response.status = 400
47
- raise(Excon::Errors.status_error({:expects => 200}, response))
47
+ raise Fog::AWS::EC2::Error.new("InvalidAddress.NotFound => Address #{public_ip.inspect} not found.")
48
48
  end
49
- response
50
49
  end
51
50
 
52
51
  end
@@ -44,12 +44,16 @@ module Fog
44
44
  availability_zone_info = zones.values
45
45
  end
46
46
 
47
- response.status = 200
48
- response.body = {
49
- 'requestId' => Fog::AWS::Mock.request_id,
50
- 'availabilityZoneInfo' => availability_zone_info
51
- }
52
- response
47
+ if zone_name.length == 0 || zone_name.length == availability_zone_info.length
48
+ response.status = 200
49
+ response.body = {
50
+ 'requestId' => Fog::AWS::Mock.request_id,
51
+ 'availabilityZoneInfo' => availability_zone_info
52
+ }
53
+ response
54
+ else
55
+ raise Fog::AWS::EC2::Error.new("InvalidParameterValue => Invalid availability zone: #{zone_name.inspect}")
56
+ end
53
57
  end
54
58
 
55
59
  end
@@ -115,11 +115,10 @@ module Fog
115
115
  'requestId' => Fog::AWS::Mock.request_id,
116
116
  'reservationSet' => reservation_set.values
117
117
  }
118
+ response
118
119
  else
119
- response.status = 400
120
- raise(Excon::Errors.status_error({:expects => 200}, response))
120
+ raise Fog::AWS::EC2::Error.new("InvalidInstanceID.NotFound => The instance ID #{instance_id.inspect} does not exist")
121
121
  end
122
- response
123
122
  end
124
123
 
125
124
  end
@@ -44,11 +44,10 @@ module Fog
44
44
  key.reject {|key,value| !['keyFingerprint', 'keyName'].include?(key)}
45
45
  end
46
46
  }
47
+ response
47
48
  else
48
- response.status = 400
49
- raise(Excon::Errors.status_error({:expects => 200}, response))
49
+ raise Fog::AWS::EC2::Error.new("InvalidKeyPair.NotFound => The key pair #{key_name.inspect} does not exist")
50
50
  end
51
- response
52
51
  end
53
52
 
54
53
  end
@@ -41,12 +41,16 @@ module Fog
41
41
  region_info = regions.values
42
42
  end
43
43
 
44
- response.status = 200
45
- response.body = {
46
- 'requestId' => Fog::AWS::Mock.request_id,
47
- 'regionInfo' => region_info
48
- }
49
- response
44
+ if region_name.length == 0 || region_name.length == region_info.length
45
+ response.status = 200
46
+ response.body = {
47
+ 'requestId' => Fog::AWS::Mock.request_id,
48
+ 'regionInfo' => region_info
49
+ }
50
+ response
51
+ else
52
+ raise Fog::AWS::EC2::Error.new("InvalidParameterValue => Invalid region: #{region_name.inspect}")
53
+ end
50
54
  end
51
55
 
52
56
  end
@@ -52,11 +52,10 @@ module Fog
52
52
  'requestId' => Fog::AWS::Mock.request_id,
53
53
  'securityGroupInfo' => security_group_info
54
54
  }
55
+ response
55
56
  else
56
- response.status = 400
57
- raise(Excon::Errors.status_error({:expects => 200}, response))
57
+ raise Fog::AWS::EC2::Error.new("InvalidGroup.NotFound => The security group #{group_name.inspect} does not exist")
58
58
  end
59
- response
60
59
  end
61
60
 
62
61
  end
@@ -66,11 +66,10 @@ module Fog
66
66
  'requestId' => Fog::AWS::Mock.request_id,
67
67
  'snapshotSet' => snapshot_set
68
68
  }
69
+ response
69
70
  else
70
- response.status = 400
71
- raise(Excon::Errors.status_error({:expects => 200}, response))
71
+ raise Fog::AWS::EC2::Error.new("InvalidSnapshot.NotFound => The snapshot #{snapshot_id.inspect} does not exist.")
72
72
  end
73
- response
74
73
  end
75
74
 
76
75
  end
@@ -72,11 +72,10 @@ module Fog
72
72
  'requestId' => Fog::AWS::Mock.request_id,
73
73
  'volumeSet' => volume_set
74
74
  }
75
+ response
75
76
  else
76
- response.status = 400
77
- raise(Excon::Errors.status_error({:expects => 200}, response))
77
+ raise Fog::AWS::EC2::Error.new("InvalidVolume.NotFound => The volume #{volume_id.inspect} does not exist.")
78
78
  end
79
- response
80
79
  end
81
80
 
82
81
  end
@@ -44,11 +44,10 @@ module Fog
44
44
  response.body = {
45
45
  'requestId' => Fog::AWS::Mock.request_id
46
46
  }.merge!(data)
47
+ response
47
48
  else
48
- response.status = 400
49
- raise(Excon::Errors.status_error({:expects => 200}, response))
49
+ raise Fog::AWS::EC2::Error.new("InvalidVolume.NotFound => The volume '#{volume_id}' does not exist.")
50
50
  end
51
- response
52
51
  end
53
52
 
54
53
  end
@@ -40,11 +40,10 @@ module Fog
40
40
  'requestId' => Fog::AWS::Mock.request_id,
41
41
  'return' => true
42
42
  }
43
+ response
43
44
  else
44
- response.status = 400
45
- raise(Excon::Errors.status_error({:expects => 200}, response))
45
+ raise Fog::AWS::EC2::Error.new("AuthFailure => The address '#{public_ip}' does not belong to you.")
46
46
  end
47
- response
48
47
  end
49
48
 
50
49
  end
@@ -38,11 +38,10 @@ module Fog
38
38
  'requestId' => Fog::AWS::Mock.request_id,
39
39
  'timestamp' => Time.now
40
40
  }
41
- else
42
- response.status = 400
43
- raise(Excon::Errors.status_error({:expects => 200}, response))
41
+ response
42
+ else;
43
+ raise Fog::AWS::EC2::Error.new("InvalidInstanceID.NotFound => The instance ID '#{instance_id}' does not exist")
44
44
  end
45
- response
46
45
  end
47
46
 
48
47
  end
@@ -38,11 +38,10 @@ module Fog
38
38
  'requestId' => Fog::AWS::Mock.request_id,
39
39
  'return' => true
40
40
  }
41
+ response
41
42
  else
42
- response.status = 400
43
- raise(Excon::Errors.status_error({:expects => 200}, response))
43
+ raise Fog::AWS::EC2::Error.new("InvalidInstanceID.NotFound => The instance ID #{instance_id.inspect} does not exist")
44
44
  end
45
- response
46
45
  end
47
46
 
48
47
  end
@@ -31,11 +31,10 @@ module Fog
31
31
  'requestId' => Fog::AWS::Mock.request_id,
32
32
  'return' => true
33
33
  }
34
+ response
34
35
  else
35
- response.status = 400
36
- raise(Excon::Errors.status_error({:expects => 200}, response))
36
+ raise Fog::AWS::EC2::Error.new("AuthFailure => The address '#{public_ip}' does not belong to you.")
37
37
  end
38
- response
39
38
  end
40
39
 
41
40
  end
@@ -35,27 +35,36 @@ module Fog
35
35
  class Mock
36
36
 
37
37
  def revoke_security_group_ingress(options = {})
38
- if options['GroupName'] && options['SourceSecurityGroupName'] && options['SourceSecurityGroupOwnerId']
39
- raise MockNotImplemented.new("Contributions welcome!")
40
- else
41
- response = Excon::Response.new
42
- group = @data[:security_groups][options['GroupName']]
43
-
44
- ingress = group['ipPermissions'].select {|permission|
45
- permission['fromPort'] == options['FromPort'] &&
46
- permission['ipProtocol'] == options['IpProtocol'] &&
47
- permission['toPort'] == options['ToPort'] &&
48
- permission['ipRanges'].first['cidrIp'] == options['CidrIp']
49
- }.first
50
-
51
- group['ipPermissions'].delete(ingress)
52
-
38
+ response = Excon::Response.new
39
+ group = @data[:security_groups][options['GroupName']]
40
+ if group
41
+ if options['GroupName'] && options['SourceSecurityGroupName'] && options['SourceSecurityGroupOwnerId']
42
+ group['ipPermissions'].delete_if {|permission|
43
+ permission['groups'].first['groupName'] == options['GroupName']
44
+ }
45
+ else
46
+ ingress = group['ipPermissions'].select {|permission|
47
+ permission['fromPort'] == options['FromPort'] &&
48
+ permission['ipProtocol'] == options['IpProtocol'] &&
49
+ permission['toPort'] == options['ToPort'] &&
50
+ (
51
+ permission['ipRanges'].empty? ||
52
+ (
53
+ permission['ipRanges'].first &&
54
+ permission['ipRanges'].first['cidrIp'] == options['CidrIp']
55
+ )
56
+ )
57
+ }.first
58
+ group['ipPermissions'].delete(ingress)
59
+ end
53
60
  response.status = 200
54
61
  response.body = {
55
62
  'requestId' => Fog::AWS::Mock.request_id,
56
63
  'return' => true
57
64
  }
58
65
  response
66
+ else
67
+ raise Fog::AWS::EC2::Error.new("InvalidGroup.NotFound => The security group '#{options['GroupName']}' does not exist")
59
68
  end
60
69
  end
61
70
 
@@ -77,11 +77,11 @@ module Fog
77
77
  detach_volume(volume['volumeId'])
78
78
  end
79
79
  end
80
+
81
+ response
80
82
  else
81
- response.status = 400
82
- raise(Excon::Errors.status_error({:expects => 200}, response))
83
+ raise Fog::AWS::EC2::Error.new("InvalidInstanceID.NotFound => The instance ID '#{instance_id}' does not exist")
83
84
  end
84
- response
85
85
  end
86
86
 
87
87
  end
@@ -43,6 +43,9 @@ module Fog
43
43
 
44
44
  def put_object(bucket_name, object_name, data, options = {})
45
45
  data = Fog::AWS::S3.parse_data(data)
46
+ unless data[:body].is_a?(String)
47
+ data[:body] = data[:body].read
48
+ end
46
49
  response = Excon::Response.new
47
50
  if (bucket = @data[:buckets][bucket_name])
48
51
  response.status = 200
@@ -94,10 +94,10 @@ describe 'EC2.describe_instances' do
94
94
  end
95
95
  describe 'failure' do
96
96
 
97
- it 'should raise a BadRequest error if the instance does not exist' do
97
+ it 'should raise a Fog::AWS::EC2::Error if the instance does not exist' do
98
98
  lambda {
99
99
  AWS[:ec2].describe_instances('i-00000000')
100
- }.should raise_error(Excon::Errors::BadRequest)
100
+ }.should raise_error(Fog::AWS::EC2::Error)
101
101
  end
102
102
 
103
103
  end
@@ -25,10 +25,10 @@ describe 'EC2.get_console_output' do
25
25
  end
26
26
  describe 'failure' do
27
27
 
28
- it "should raise a BadRequest error if the instance does not exist" do
28
+ it "should raise a Fog::AWS::EC2::Error if the instance does not exist" do
29
29
  lambda {
30
30
  AWS[:ec2].get_console_output('i-00000000')
31
- }.should raise_error(Excon::Errors::BadRequest)
31
+ }.should raise_error(Fog::AWS::EC2::Error)
32
32
  end
33
33
 
34
34
  end
@@ -20,10 +20,10 @@ describe 'EC2.reboot_instances' do
20
20
  end
21
21
  describe 'failure' do
22
22
 
23
- it "should raise a BadRequest error if the instance does not exist" do
23
+ it "should raise a Fog::AWS::EC2::Error if the instance does not exist" do
24
24
  lambda {
25
25
  AWS[:ec2].reboot_instances('i-00000000')
26
- }.should raise_error(Excon::Errors::BadRequest)
26
+ }.should raise_error(Fog::AWS::EC2::Error)
27
27
  end
28
28
 
29
29
  end
@@ -25,10 +25,10 @@ describe 'EC2.terminate_instances' do
25
25
  end
26
26
  describe 'failure' do
27
27
 
28
- it 'should raise a BadRequest error if the instance does not exist' do
28
+ it 'should raise a Fog::AWS::EC2::Error if the instance does not exist' do
29
29
  lambda {
30
30
  AWS[:ec2].terminate_instances('i-00000000')
31
- }.should raise_error(Excon::Errors::BadRequest)
31
+ }.should raise_error(Fog::AWS::EC2::Error)
32
32
  end
33
33
 
34
34
  end
@@ -22,28 +22,12 @@ Shindo.tests('AWS::EC2 | address requests', ['aws']) do
22
22
  AWS[:ec2].describe_addresses(@public_ip).body
23
23
  end
24
24
 
25
- tests("#associate_addresses('#{@server.identity}', '#{@public_Ip}')") do
26
-
27
- formats(AWS::EC2::Formats::BASIC) do
28
- AWS[:ec2].associate_address(@server.identity, @public_ip).body
29
- end
30
-
31
- tests('server.ip_address').returns(@public_ip) do
32
- @server.reload.ip_address
33
- end
34
-
25
+ tests("#associate_addresses('#{@server.identity}', '#{@public_Ip}')").formats(AWS::EC2::Formats::BASIC) do
26
+ AWS[:ec2].associate_address(@server.identity, @public_ip).body
35
27
  end
36
28
 
37
- tests("#dissassociate_address('#{@public_ip}')") do
38
-
39
- formats(AWS::EC2::Formats::BASIC) do
40
- AWS[:ec2].disassociate_address(@public_ip).body
41
- end
42
-
43
- test("server.ip_address is not #{@public_ip}") do
44
- @server.reload.ip_address != @public_ip
45
- end
46
-
29
+ tests("#dissassociate_address('#{@public_ip}')").formats(AWS::EC2::Formats::BASIC) do
30
+ AWS[:ec2].disassociate_address(@public_ip).body
47
31
  end
48
32
 
49
33
  tests("#release_address('#{@public_ip}')").formats(AWS::EC2::Formats::BASIC) do
@@ -55,23 +39,27 @@ Shindo.tests('AWS::EC2 | address requests', ['aws']) do
55
39
 
56
40
  @address = AWS[:ec2].addresses.create
57
41
 
58
- tests("#describe_addresses('127.0.0.1')").raises(Excon::Errors::BadRequest) do
42
+ tests("#describe_addresses('127.0.0.1')").raises(Fog::AWS::EC2::Error) do
59
43
  AWS[:ec2].describe_addresses('127.0.0.1')
60
44
  end
61
45
 
62
- tests("#associate_addresses('i-00000000', '#{@address.identity}')").raises(Excon::Errors::BadRequest) do
46
+ tests("#associate_addresses('i-00000000', '#{@address.identity}')").raises(Fog::AWS::EC2::Error) do
63
47
  AWS[:ec2].associate_address('i-00000000', @address.identity)
64
48
  end
65
49
 
66
- tests("#associate_addresses('#{@server.identity}', '127.0.0.1')").raises(Excon::Errors::BadRequest) do
50
+ tests("#associate_addresses('#{@server.identity}', '127.0.0.1')").raises(Fog::AWS::EC2::Error) do
67
51
  AWS[:ec2].associate_address(@server.identity, '127.0.0.1')
68
52
  end
69
53
 
70
- tests("#disassociate_addresses('127.0.0.1') raises BadRequest error").raises(Excon::Errors::BadRequest) do
54
+ tests("#associate_addresses('i-00000000', '127.0.0.1')").raises(Fog::AWS::EC2::Error) do
55
+ AWS[:ec2].associate_address('i-00000000', '127.0.0.1')
56
+ end
57
+
58
+ tests("#disassociate_addresses('127.0.0.1') raises BadRequest error").raises(Fog::AWS::EC2::Error) do
71
59
  AWS[:ec2].disassociate_address('127.0.0.1')
72
60
  end
73
61
 
74
- tests("#release_address('127.0.0.1')").raises(Excon::Errors::BadRequest) do
62
+ tests("#release_address('127.0.0.1')").raises(Fog::AWS::EC2::Error) do
75
63
  AWS[:ec2].release_address('127.0.0.1')
76
64
  end
77
65
 
@@ -14,7 +14,7 @@ Shindo.tests('AWS::EC2 | availability zone requests', ['aws']) do
14
14
 
15
15
  tests('failure') do
16
16
 
17
- tests("#describe_availability_zones('not-a-zone')").raises(Excon::Errors::BadRequest) do
17
+ tests("#describe_availability_zones('not-a-zone')").raises(Fog::AWS::EC2::Error) do
18
18
  AWS[:ec2].describe_availability_zones('not-a-zone')
19
19
  end
20
20
 
@@ -29,11 +29,11 @@ Shindo.tests('AWS::EC2 | key pair requests', ['aws']) do
29
29
 
30
30
  @key_pair = AWS[:ec2].key_pairs.create(:name => 'fog_key_pair')
31
31
 
32
- tests("duplicate #create_key_pair('#{@key_pair.name}')").raises(Excon::Errors::BadRequest) do
32
+ tests("duplicate #create_key_pair('#{@key_pair.name}')").raises(Fog::AWS::EC2::Error) do
33
33
  AWS[:ec2].create_key_pair(@key_pair.name)
34
34
  end
35
35
 
36
- tests("#describe_key_pair('not_a_key_name')").raises(Excon::Errors::BadRequest) do
36
+ tests("#describe_key_pair('not_a_key_name')").raises(Fog::AWS::EC2::Error) do
37
37
  AWS[:ec2].describe_key_pairs('not_a_key_name').body
38
38
  end
39
39
 
@@ -14,7 +14,7 @@ Shindo.tests('AWS::EC2 | region requests', ['aws']) do
14
14
 
15
15
  tests('failure') do
16
16
 
17
- tests("#describe_regions('not-a-region')").raises(Excon::Errors::BadRequest) do
17
+ tests("#describe_regions('not-a-region')").raises(Fog::AWS::EC2::Error) do
18
18
  AWS[:ec2].describe_regions('not-a-region')
19
19
  end
20
20
  end
@@ -59,11 +59,11 @@ Shindo.tests('AWS::EC2 | security group requests', ['aws']) do
59
59
 
60
60
  @security_group = AWS[:ec2].security_groups.create(:description => 'tests group', :name => 'fog_security_group')
61
61
 
62
- tests("duplicate #create_security_group(#{@security_group.name}, #{@security_group.description})").raises(Excon::Errors::BadRequest) do
62
+ tests("duplicate #create_security_group(#{@security_group.name}, #{@security_group.description})").raises(Fog::AWS::EC2::Error) do
63
63
  AWS[:ec2].create_security_group(@security_group.name, @security_group.description)
64
64
  end
65
65
 
66
- tests("#authorize_security_group_ingress({'FromPort' => 80, 'GroupName' => 'not_a_group_name', 'IpProtocol' => 'tcp', 'toPort' => 80})").raises(Excon::Errors::BadRequest) do
66
+ tests("#authorize_security_group_ingress({'FromPort' => 80, 'GroupName' => 'not_a_group_name', 'IpProtocol' => 'tcp', 'toPort' => 80})").raises(Fog::AWS::EC2::Error) do
67
67
  AWS[:ec2].authorize_security_group_ingress({
68
68
  'FromPort' => 80,
69
69
  'GroupName' => 'not_a_group_name',
@@ -72,7 +72,7 @@ Shindo.tests('AWS::EC2 | security group requests', ['aws']) do
72
72
  })
73
73
  end
74
74
 
75
- tests("#authorize_security_group_ingress({'GroupName' => 'not_a_group_name', 'SourceSecurityGroupName' => 'not_a_group_name', 'SourceSecurityGroupOwnerId' => '#{@owner_id}'})").raises(Excon::Errors::BadRequest) do
75
+ tests("#authorize_security_group_ingress({'GroupName' => 'not_a_group_name', 'SourceSecurityGroupName' => 'not_a_group_name', 'SourceSecurityGroupOwnerId' => '#{@owner_id}'})").raises(Fog::AWS::EC2::Error) do
76
76
  AWS[:ec2].authorize_security_group_ingress({
77
77
  'GroupName' => 'not_a_group_name',
78
78
  'SourceSecurityGroupName' => 'not_a_group_name',
@@ -80,11 +80,11 @@ Shindo.tests('AWS::EC2 | security group requests', ['aws']) do
80
80
  })
81
81
  end
82
82
 
83
- tests("#describe_security_group('not_a_group_name)").raises(Excon::Errors::BadRequest) do
83
+ tests("#describe_security_group('not_a_group_name)").raises(Fog::AWS::EC2::Error) do
84
84
  AWS[:ec2].describe_security_groups('not_a_group_name')
85
85
  end
86
86
 
87
- tests("#revoke_security_group_ingress({'FromPort' => 80, 'GroupName' => 'not_a_group_name', 'IpProtocol' => 'tcp', 'toPort' => 80})").raises(Excon::Errors::BadRequest) do
87
+ tests("#revoke_security_group_ingress({'FromPort' => 80, 'GroupName' => 'not_a_group_name', 'IpProtocol' => 'tcp', 'toPort' => 80})").raises(Fog::AWS::EC2::Error) do
88
88
  AWS[:ec2].revoke_security_group_ingress({
89
89
  'FromPort' => 80,
90
90
  'GroupName' => 'not_a_group_name',
@@ -93,7 +93,7 @@ Shindo.tests('AWS::EC2 | security group requests', ['aws']) do
93
93
  })
94
94
  end
95
95
 
96
- tests("#revoke_security_group_ingress({'GroupName' => 'not_a_group_name', 'SourceSecurityGroupName' => 'not_a_group_name', 'SourceSecurityGroupOwnerId' => '#{@owner_id}'})").raises(Excon::Errors::BadRequest) do
96
+ tests("#revoke_security_group_ingress({'GroupName' => 'not_a_group_name', 'SourceSecurityGroupName' => 'not_a_group_name', 'SourceSecurityGroupOwnerId' => '#{@owner_id}'})").raises(Fog::AWS::EC2::Error) do
97
97
  AWS[:ec2].revoke_security_group_ingress({
98
98
  'GroupName' => 'not_a_group_name',
99
99
  'SourceSecurityGroupName' => 'not_a_group_name',
@@ -101,7 +101,7 @@ Shindo.tests('AWS::EC2 | security group requests', ['aws']) do
101
101
  })
102
102
  end
103
103
 
104
- tests("#delete_security_group('not_a_group_name')").raises(Excon::Errors::BadRequest) do
104
+ tests("#delete_security_group('not_a_group_name')").raises(Fog::AWS::EC2::Error) do
105
105
  AWS[:ec2].delete_security_group('not_a_group_name')
106
106
  end
107
107
 
@@ -28,11 +28,11 @@ Shindo.tests('AWS::EC2 | snapshot requests', ['aws']) do
28
28
  end
29
29
  tests ('failure') do
30
30
 
31
- tests("#describe_snapshot('snap-00000000')").raises(Excon::Errors::BadRequest) do
31
+ tests("#describe_snapshot('snap-00000000')").raises(Fog::AWS::EC2::Error) do
32
32
  AWS[:ec2].describe_snapshots('snap-00000000')
33
33
  end
34
34
 
35
- tests("#delete_snapshot('snap-00000000')").raises(Excon::Errors::BadRequest) do
35
+ tests("#delete_snapshot('snap-00000000')").raises(Fog::AWS::EC2::Error) do
36
36
  AWS[:ec2].delete_snapshot('snap-00000000')
37
37
  end
38
38
 
@@ -41,23 +41,23 @@ Shindo.tests('AWS::EC2 | volume requests', ['aws']) do
41
41
 
42
42
  @volume = AWS[:ec2].volumes.create(:availability_zone => @server.availability_zone, :size => 1)
43
43
 
44
- tests("#describe_volume('vol-00000000')").raises(Excon::Errors::BadRequest) do
44
+ tests("#describe_volume('vol-00000000')").raises(Fog::AWS::EC2::Error) do
45
45
  AWS[:ec2].describe_volumes('vol-00000000')
46
46
  end
47
47
 
48
- tests("#attach_volume('i-00000000', '#{@volume.identity}', '/dev/sdh')").raises(Excon::Errors::BadRequest) do
48
+ tests("#attach_volume('i-00000000', '#{@volume.identity}', '/dev/sdh')").raises(Fog::AWS::EC2::Error) do
49
49
  AWS[:ec2].attach_volume('i-00000000', @volume.identity, '/dev/sdh')
50
50
  end
51
51
 
52
- tests("#attach_volume('#{@server.identity}', 'vol-00000000', '/dev/sdh')").raises(Excon::Errors::BadRequest) do
52
+ tests("#attach_volume('#{@server.identity}', 'vol-00000000', '/dev/sdh')").raises(Fog::AWS::EC2::Error) do
53
53
  AWS[:ec2].attach_volume(@server.identity, 'vol-00000000', '/dev/sdh')
54
54
  end
55
55
 
56
- tests("#detach_volume('vol-00000000')").raises(Excon::Errors::BadRequest) do
56
+ tests("#detach_volume('vol-00000000')").raises(Fog::AWS::EC2::Error) do
57
57
  AWS[:ec2].detach_volume('vol-00000000')
58
58
  end
59
59
 
60
- tests("#delete_volume('vol-00000000')").raises(Excon::Errors::BadRequest) do
60
+ tests("#delete_volume('vol-00000000')").raises(Fog::AWS::EC2::Error) do
61
61
  AWS[:ec2].delete_volume('vol-00000000')
62
62
  end
63
63
 
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 1
8
- - 2
9
- version: 0.1.2
8
+ - 3
9
+ version: 0.1.3
10
10
  platform: ruby
11
11
  authors:
12
12
  - geemus (Wesley Beary)
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-05-24 00:00:00 -07:00
17
+ date: 2010-05-26 00:00:00 -07:00
18
18
  default_executable: fog
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency