amazon-ec2 0.9.15 → 0.9.17

Sign up to get free protection for your applications and to get access to all the features.
@@ -37,6 +37,7 @@ module AWS
37
37
  raise ArgumentError, ":addressing_type has been deprecated." if options[:addressing_type]
38
38
  raise ArgumentError, ":spot_price must be provided" if options[:spot_price].nil? || options[:spot_price].empty?
39
39
  raise ArgumentError, ":base64_encoded must be 'true' or 'false'" unless [true, false].include?(options[:base64_encoded])
40
+ raise ArgumentError, ":instance_type must specify a valid instance type" unless options[:instance_type].nil? || ["t1.micro", "m1.small", "m1.large", "m1.xlarge", "m2.xlarge", "c1.medium", "c1.xlarge", "m2.2xlarge", "m2.4xlarge", "cc1.4xlarge"].include?(options[:instance_type])
40
41
 
41
42
  user_data = extract_user_data(options)
42
43
 
@@ -2,7 +2,7 @@ module AWS
2
2
  module EC2
3
3
 
4
4
  class Base < AWS::Base
5
-
5
+
6
6
  # This method returns historical information about spot prices.
7
7
  #
8
8
  # Amazon periodically sets the spot price for each instance type based on
@@ -16,7 +16,7 @@ module AWS
16
16
  def describe_spot_price_history( options = {} )
17
17
  raise ArgumentError, ":start_time must be a Time object" unless options[:start_time].nil? || options[:start_time].kind_of?(Time)
18
18
  raise ArgumentError, ":end_time must be a Time object" unless options[:end_time].nil? || options[:end_time].kind_of?(Time)
19
- raise ArgumentError, ":instance_type must specify a valid instance type" unless options[:instance_type].nil? || ["m1.small", "m1.large", "m1.xlarge", "c1.medium", "c1.xlarge", "m2.2xlarge", "m2.4xlarge"].include?(options[:instance_type])
19
+ raise ArgumentError, ":instance_type must specify a valid instance type" unless options[:instance_type].nil? || ["t1.micro", "m1.small", "m1.large", "m1.xlarge", "m2.xlarge", "c1.medium", "c1.xlarge", "m2.2xlarge", "m2.4xlarge", "cc1.4xlarge"].include?(options[:instance_type])
20
20
  raise ArgumentError, ":product_description must be 'Linux/UNIX' or 'Windows'" unless options[:product_description].nil? || ["Linux/UNIX", "Windows"].include?(options[:product_description])
21
21
 
22
22
  params = {}
@@ -24,7 +24,7 @@ module AWS
24
24
  params.merge!("EndTime" => options[:end_time].iso8601) if options[:end_time]
25
25
  params.merge!("InstanceType" => options[:instance_type]) if options[:instance_type]
26
26
  params.merge!("ProductDescription" => options[:product_description]) if options[:product_description]
27
-
27
+
28
28
  return response_generator(:action => "DescribeSpotPriceHistory", :params => params)
29
29
  end
30
30
 
@@ -0,0 +1,47 @@
1
+ module AWS
2
+ module EC2
3
+ class Base < AWS::Base
4
+
5
+ # The CreateTags operation adds or overwrites tags for the specified resource(s).
6
+ #
7
+ # @option options [Array] :resource_id ([]) The ids of the resource(s) to tag
8
+ # @option options [Array] :tag ([]) An array of Hashes representing the tags { tag_name => tag_value }. Use nil or empty string to get a tag without a value
9
+ #
10
+ def create_tags( options = {} )
11
+ raise ArgumentError, "No :resource_id provided" if options[:resource_id].nil? || options[:resource_id].empty?
12
+ raise ArgumentError, "No :tag provided" if options[:tag].nil? || options[:tag].empty?
13
+
14
+ params = pathlist("ResourceId", options[:resource_id] )
15
+ params.merge!(pathkvlist('Tag', options[:tag], 'Key', 'Value', {}))
16
+ return response_generator(:action => "CreateTags", :params => params)
17
+ end
18
+
19
+ # The DescribeTags operation lists the tags, If you do not specify any filters, all tags will be returned.
20
+ #
21
+ # @option options [optional, Array] :filter ([]) An array of Hashes representing the filters. Note that the values in the hashes have to be arrays. E.g. [{:key => ['name']}, {:resource_type => ['instance']},...]
22
+ #
23
+ def describe_tags( options = {} )
24
+ params = {}
25
+ if options[:filter]
26
+ params.merge!(pathkvlist('Filter', options[:filter], 'Name', 'Value', {:resource_id => 'resource-id', :resource_type => 'resource-type' }))
27
+ end
28
+ return response_generator(:action => "DescribeTags", :params => params)
29
+ end
30
+
31
+ # The DeleteTags operation deletes tags for the specified resource(s).
32
+ #
33
+ # @option options [Array] :resource_id ([]) The ids of the resource(s) to tag
34
+ # @option options [Array] :tag ([]) An array of Hashes representing the tags { tag_name => tag_value }. If a value is given (instead of nil/empty string), then the tag is only deleted if it has this value
35
+ #
36
+ def delete_tags( options = {} )
37
+ raise ArgumentError, "No :resource_id provided" if options[:resource_id].nil? || options[:resource_id].empty?
38
+ raise ArgumentError, "No :tag provided" if options[:tag].nil? || options[:tag].empty?
39
+
40
+ params = pathlist("ResourceId", options[:resource_id] )
41
+ params.merge!(pathkvlist('Tag', options[:tag], 'Key', 'Value', {}))
42
+ return response_generator(:action => "DeleteTags", :params => params)
43
+ end
44
+ end
45
+ end
46
+ end
47
+
@@ -88,7 +88,7 @@ module AWS
88
88
  "VolumeId" => options[:volume_id],
89
89
  "InstanceId" => options[:instance_id],
90
90
  "Device" => options[:device],
91
- "Force" => options[:force]
91
+ "Force" => options[:force].to_s
92
92
  }
93
93
  return response_generator(:action => "DetachVolume", :params => params)
94
94
  end
@@ -8,8 +8,6 @@ module AWS
8
8
  # export ELB_URL='https://elasticloadbalancing.amazonaws.com'
9
9
  if ENV['ELB_URL']
10
10
  ELB_URL = ENV['ELB_URL']
11
- VALID_HOSTS = ['elasticloadbalancing.amazonaws.com']
12
- raise ArgumentError, "Invalid ELB_URL environment variable : #{ELB_URL}" unless VALID_HOSTS.include?(ELB_URL)
13
11
  DEFAULT_HOST = URI.parse(ELB_URL).host
14
12
  else
15
13
  # Default US API endpoint
@@ -8,8 +8,6 @@ module AWS
8
8
  # export RDS_URL='https://rds.amazonaws.com'
9
9
  if ENV['RDS_URL']
10
10
  RDS_URL = ENV['RDS_URL']
11
- VALID_HOSTS = ['rds.amazonaws.com']
12
- raise ArgumentError, "Invalid RDS_URL environment variable : #{RDS_URL}" unless VALID_HOSTS.include?(RDS_URL)
13
11
  DEFAULT_HOST = URI.parse(RDS_URL).host
14
12
  else
15
13
  # Default US API endpoint
@@ -14,7 +14,7 @@ module AWS
14
14
  # @option options [String] :port is the port the database accepts connections on (3306)
15
15
  # @option options [String] :db_name contains the name of the database to create when created (nil)
16
16
  # @option options [String] :db_parameter_group is the database parameter group to associate with this instance (nil)
17
- # @option options [String] :db_security_groups are the list of db security groups to associate with the instance (nil)
17
+ # @option options [Array] :db_security_groups are the list of db security groups to associate with the instance (nil)
18
18
  # @option options [String] :availability_zone is the availability_zone to create the instance in (nil)
19
19
  # @option options [String] :preferred_maintenance_window in format: ddd:hh24:mi-ddd:hh24:mi (nil)
20
20
  # @option options [String] :backup_retention_period is the number of days which automated backups are retained (1)
@@ -43,7 +43,7 @@ module AWS
43
43
  params["Port"] = options[:port].to_s if options.has?(:port)
44
44
  params["DBName"] = options[:db_name] if options.has?(:db_name)
45
45
  params["DBParameterGroup"] = options[:db_parameter_group] if options.has?(:db_parameter_group)
46
- params["DBSecurityGroups"] = options[:db_security_groups] if options.has?(:db_security_groups)
46
+ params.merge!(pathlist("DBSecurityGroups.member", [options[:db_security_groups]].flatten)) if options.has_key?(:db_security_groups)
47
47
  params["AvailabilityZone"] = options[:availability_zone] if options.has?(:availability_zone)
48
48
  params["PreferredMaintenanceWindow"] = options[:preferred_maintenance_window] if options.has?(:preferred_maintenance_window)
49
49
  params["BackupRetentionPeriod"] = options[:backup_retention_period].to_s if options.has?(:backup_retention_period)
@@ -344,7 +344,7 @@ module AWS
344
344
  # @option options [String] :port is the port the database accepts connections on (3306)
345
345
  # @option options [String] :db_name contains the name of the database to create when created (nil)
346
346
  # @option options [String] :db_parameter_group_name is the database parameter group to associate with this instance (nil)
347
- # @option options [String] :db_security_groups are the list of db security groups to associate with the instance (nil)
347
+ # @option options [Array] :db_security_groups are the list of db security groups to associate with the instance (nil)
348
348
  # @option options [String] :availability_zone is the availability_zone to create the instance in (nil)
349
349
  # @option options [String] :preferred_maintenance_window in format: ddd:hh24:mi-ddd:hh24:mi (nil)
350
350
  # @option options [String] :backup_retention_period is the number of days which automated backups are retained (1)
@@ -367,7 +367,7 @@ module AWS
367
367
  params["Port"] = options[:port].to_s if options.has?(:port)
368
368
  params["DBName"] = options[:db_name] if options.has?(:db_name)
369
369
  params["DBParameterGroupName"] = options[:db_parameter_group_name] if options.has?(:db_parameter_group_name)
370
- params["DBSecurityGroups"] = options[:db_security_groups] if options.has?(:db_security_groups)
370
+ params.merge!(pathlist("DBSecurityGroups.member", [options[:db_security_groups]].flatten)) if options.has_key?(:db_security_groups)
371
371
  params["AvailabilityZone"] = options[:availability_zone] if options.has?(:availability_zone)
372
372
  params["PreferredMaintenanceWindow"] = options[:preferred_maintenance_window] if options.has?(:preferred_maintenance_window)
373
373
  params["BackupRetentionPeriod"] = options[:backup_retention_period].to_s if options.has?(:backup_retention_period)
@@ -471,7 +471,7 @@ module AWS
471
471
  # @option options [optional, Boolean] :use_latest_restorable_time specifies that the db be restored to the latest restored time. Conditional, cannot be specified if :restore_time parameter is provided.
472
472
  # @option options [optional, Date] :restore_time specifies the date and time to restore from. Conditional, cannot be specified if :use_latest_restorable_time parameter is true.
473
473
  # @option options [String] :target_db_instance_identifier is the name of the new database instance to be created.
474
- # @option options [optional, String] :db_instance_class specifies the class of the compute and memory of the EC2 instance, Options : db.m1.small | db.m1.large | db.m1.xlarge | db.m2.2xlarge | db.m2.4xlarge
474
+ # @option options [optional, String] :db_instance_class specifies the class of the compute and memory of the EC2 instance, Options : db.m1.small | db.m1.large | db.m1.xlarge | db.m2.2xlarge | db.m2.4xlarge | db.cc1.4xlarge
475
475
  # @option options [optional, Integer] :port is the port which the db can accept connections on. Constraints: Value must be 1115-65535
476
476
  # @option options [optional, String] :availability_zone is the EC2 zone which the db instance will be created
477
477
  #
@@ -0,0 +1,3 @@
1
+ module AWS
2
+ VERSION = "0.9.17"
3
+ end
@@ -61,8 +61,8 @@ context "The EC2 method " do
61
61
  end
62
62
 
63
63
  specify "AWS.encode should return the expected string" do
64
- AWS.encode("secretaccesskey", "foobar123", urlencode=true).should.equal "e3jeuDc3DIX2mW8cVqWiByj4j5g%3D"
65
- AWS.encode("secretaccesskey", "foobar123", urlencode=false).should.equal "e3jeuDc3DIX2mW8cVqWiByj4j5g="
64
+ AWS.encode("secretaccesskey", "foobar123", urlencode=true).should.equal "CPzGGhtvlG3P3yp88fPZp0HKouUV8mQK1ZcdFGQeAug%3D"
65
+ AWS.encode("secretaccesskey", "foobar123", urlencode=false).should.equal "CPzGGhtvlG3P3yp88fPZp0HKouUV8mQK1ZcdFGQeAug="
66
66
  end
67
67
 
68
68
  end
@@ -217,6 +217,27 @@ context "EC2 instances " do
217
217
  </UnmonitorInstancesResponse>
218
218
 
219
219
  RESPONSE
220
+
221
+ @describe_instance_attribute_response_body = <<-RESPONSE
222
+ <DescribeInstanceAttributeResponse xmlns="http://ec2.amazonaws.com/doc/2010-08-31/">
223
+ <instanceId>i-10a64379</instanceId>
224
+ <kernel>
225
+ <value>aki-f70657b2</value>
226
+ </kernel>
227
+ </DescribeInstanceAttributeResponse>
228
+ RESPONSE
229
+
230
+ @modify_instance_attribute_response_body = <<-RESPONSE
231
+ <ModifyInstanceAttributeResponse xmlns="http://ec2.amazonaws.com/doc/2010-08-31/">
232
+ <return>true</return>
233
+ </ModifyInstanceAttributeResponse>
234
+ RESPONSE
235
+
236
+ @reset_instance_attribute_response_body = <<-RESPONSE
237
+ <ResetInstanceAttributeResponse xmlns="http://ec2.amazonaws.com/doc/2010-08-31/">
238
+ <return>true</return>
239
+ </ResetInstanceAttributeResponse>
240
+ RESPONSE
220
241
  end
221
242
 
222
243
 
@@ -304,9 +325,13 @@ context "EC2 instances " do
304
325
  lambda { @ec2.run_instances( :image_id => "ami-60a54009", :min_count => 2, :max_count => 1 ) }.should.raise(AWS::ArgumentError)
305
326
 
306
327
  # :instance_type
307
- @ec2.stubs(:make_request).with('RunInstances', "ImageId" => "ami-60a54009", "MinCount" => '1', "MaxCount" => '1', "InstanceType" => 'm1.small').
308
- returns stub(:body => @run_instances_response_body, :is_a? => true)
309
- lambda { @ec2.run_instances( :image_id => "ami-60a54009", :instance_type => "m1.small" ) }.should.not.raise(AWS::ArgumentError)
328
+
329
+ ["t1.micro", "m1.small", "m1.large", "m1.xlarge", "m2.xlarge", "c1.medium", "c1.xlarge", "m2.2xlarge", "m2.4xlarge", "cc1.4xlarge"].each do |type|
330
+ @ec2.stubs(:make_request).with('RunInstances', "ImageId" => "ami-60a54009", "MinCount" => '1', "MaxCount" => '1', "InstanceType" => type).
331
+ returns stub(:body => @run_instances_response_body, :is_a? => true)
332
+ lambda { @ec2.run_instances( :image_id => "ami-60a54009", :instance_type => type ) }.should.not.raise(AWS::ArgumentError)
333
+ end
334
+
310
335
  lambda { @ec2.run_instances( :image_id => "ami-60a54009", :instance_type => "m1.notarealsize" ) }.should.raise(AWS::ArgumentError)
311
336
 
312
337
  # :monitoring_enabled
@@ -608,4 +633,72 @@ context "EC2 instances " do
608
633
  @response.instancesSet.item[1].monitoring.state.should.equal "disabling"
609
634
  end
610
635
 
636
+ specify "should get an ArgumentError when trying to describe/modify/reset an instance attribute without an istance id" do
637
+ lambda { @ec2.describe_instance_attribute(:attribute => "ramdisk") }.should.raise(AWS::ArgumentError)
638
+ lambda { @ec2.modify_instance_attribute(:attribute => "ramdisk") }.should.raise(AWS::ArgumentError)
639
+ lambda { @ec2.reset_instance_attribute(:attribute => "ramdisk") }.should.raise(AWS::ArgumentError)
640
+
641
+ lambda { @ec2.describe_instance_attribute(:attribute => "ramdisk", :instance_id => nil) }.should.raise(AWS::ArgumentError)
642
+ lambda { @ec2.modify_instance_attribute(:attribute => "ramdisk", :instance_id => nil) }.should.raise(AWS::ArgumentError)
643
+ lambda { @ec2.reset_instance_attribute(:attribute => "ramdisk", :instance_id => nil) }.should.raise(AWS::ArgumentError)
644
+
645
+ lambda { @ec2.describe_instance_attribute(:attribute => "ramdisk", :instance_id => "") }.should.raise(AWS::ArgumentError)
646
+ lambda { @ec2.modify_instance_attribute(:attribute => "ramdisk", :instance_id => "") }.should.raise(AWS::ArgumentError)
647
+ lambda { @ec2.reset_instance_attribute(:attribute => "ramdisk", :instance_id => "") }.should.raise(AWS::ArgumentError)
648
+ end
649
+
650
+ specify "should get an ArgumentError when trying to describe/modify/reset an instance attribute without an attribute" do
651
+ lambda { @ec2.describe_instance_attribute(:instance_id => "i-33457a5a") }.should.raise(AWS::ArgumentError)
652
+ lambda { @ec2.modify_instance_attribute(:instance_id => "i-33457a5a") }.should.raise(AWS::ArgumentError)
653
+ lambda { @ec2.reset_instance_attribute(:instance_id => "i-33457a5a") }.should.raise(AWS::ArgumentError)
654
+
655
+ lambda { @ec2.describe_instance_attribute(:instance_id => "i-33457a5a", :attribute => nil) }.should.raise(AWS::ArgumentError)
656
+ lambda { @ec2.modify_instance_attribute(:instance_id => "i-33457a5a", :attribute => nil) }.should.raise(AWS::ArgumentError)
657
+ lambda { @ec2.reset_instance_attribute(:instance_id => "i-33457a5a", :attribute => nil) }.should.raise(AWS::ArgumentError)
658
+
659
+ lambda { @ec2.describe_instance_attribute(:instance_id => "i-33457a5a", :attribute => "") }.should.raise(AWS::ArgumentError)
660
+ lambda { @ec2.modify_instance_attribute(:instance_id => "i-33457a5a", :attribute => "") }.should.raise(AWS::ArgumentError)
661
+ lambda { @ec2.reset_instance_attribute(:instance_id => "i-33457a5a", :attribute => "") }.should.raise(AWS::ArgumentError)
662
+ end
663
+
664
+ specify "should get an ArgumentError when trying to describe/modify/reset an instance attribute without a valid attribute" do
665
+ lambda { @ec2.describe_instance_attribute(:instance_id => "i-33457a5a", :attribute => 'party') }.should.raise(AWS::ArgumentError)
666
+ lambda { @ec2.modify_instance_attribute(:instance_id => "i-33457a5a", :attribute => 'party') }.should.raise(AWS::ArgumentError)
667
+ lambda { @ec2.reset_instance_attribute(:instance_id => "i-33457a5a", :attribute => 'party') }.should.raise(AWS::ArgumentError)
668
+ end
669
+
670
+ specify "should not get an ArgumentError when trying to describe/modify/reset an instance attribute with a valid attribute" do
671
+ @ec2.stubs(:make_request).returns stub(:body => @describe_instance_attribute_response_body, :is_a? => true)
672
+ %w(instanceType kernel ramdisk userData disableApiTermination instanceInitiatedShutdownBehavior rootDevice blockDeviceMapping).each do |a|
673
+ lambda { @ec2.describe_instance_attribute(:instance_id => "i-33457a5a", :attribute => a) }.should.not.raise(AWS::ArgumentError)
674
+ lambda { @ec2.modify_instance_attribute(:instance_id => "i-33457a5a", :attribute => 'party') }.should.raise(AWS::ArgumentError)
675
+ end
676
+ %w(kernel ramdisk).each do |a|
677
+ lambda { @ec2.reset_instance_attribute(:instance_id => "i-33457a5a", :attribute => 'party') }.should.raise(AWS::ArgumentError)
678
+ end
679
+ end
680
+
681
+ specify "should successfully describe instance attribute" do
682
+ @ec2.stubs(:make_request).with('DescribeInstanceAttribute', {"InstanceId"=>"i-33457a5a", "Attribute" => "kernel"}).
683
+ returns stub(:body => @describe_instance_attribute_response_body, :is_a? => true)
684
+ @response = @ec2.describe_instance_attribute(:instance_id => "i-33457a5a", :attribute => 'kernel')
685
+ @response.class.should.equal Hash
686
+ @response.kernel.value.should.equal "aki-f70657b2"
687
+ end
688
+
689
+ specify "should successfully modify instance attribute" do
690
+ @ec2.stubs(:make_request).with('ModifyInstanceAttribute', {"InstanceId"=>"i-33457a5a", "Attribute" => "disableApiTermination", "Value" => "true"}).
691
+ returns stub(:body => @modify_instance_attribute_response_body, :is_a? => true)
692
+ @response = @ec2.modify_instance_attribute(:instance_id => "i-33457a5a", :attribute => 'disableApiTermination', :value => true)
693
+ @response.class.should.equal Hash
694
+ @response.return.should.equal "true"
695
+ end
696
+
697
+ specify "should successfully reset instance attribute" do
698
+ @ec2.stubs(:make_request).with('ResetInstanceAttribute', {"InstanceId"=>"i-33457a5a", "Attribute" => "kernel"}).
699
+ returns stub(:body => @reset_instance_attribute_response_body, :is_a? => true)
700
+ @response = @ec2.reset_instance_attribute(:instance_id => "i-33457a5a", :attribute => 'kernel')
701
+ @response.class.should.equal Hash
702
+ @response.return.should.equal "true"
703
+ end
611
704
  end
@@ -0,0 +1,46 @@
1
+ #--
2
+ # Amazon Web Services EC2 Query API Ruby library
3
+ #
4
+ # Ruby Gem Name:: amazon-ec2
5
+ # Author:: Glenn Rempe (mailto:glenn@rempe.us)
6
+ # Copyright:: Copyright (c) 2007-2008 Glenn Rempe
7
+ # License:: Distributes under the same terms as Ruby
8
+ # Home:: http://github.com/grempe/amazon-ec2/tree/master
9
+ #++
10
+
11
+ require File.dirname(__FILE__) + '/test_helper.rb'
12
+
13
+ context "The EC2 password " do
14
+
15
+ before do
16
+ @ec2 = AWS::EC2::Base.new( :access_key_id => "not a key", :secret_access_key => "not a secret" )
17
+
18
+ @get_password_data_response_body = <<-RESPONSE
19
+ <GetPasswordDataResponse xmlns="http://ec2.amazonaws.com/doc/2010-06-15/">
20
+ <instanceId>i-2574e22a</instanceId>
21
+ <timestamp>2009-10-24 15:00:00</timestamp>
22
+ <passwordData>TGludXggdmVyc2lvbiAyLjYuMTYteGVuVSAoYnVpbGRlckBwYXRjaGJhdC5hbWF6b25zYSkgKGdj</passwordData></GetPasswordDataResponse>
23
+ RESPONSE
24
+
25
+ end
26
+
27
+
28
+ specify "should return an encrypted password encoded by base64 " do
29
+ @ec2.stubs(:make_request).with('GetPasswordData', {"InstanceId"=>"i-2574e22a"}).
30
+ returns stub(:body => @get_password_data_response_body, :is_a? => true)
31
+ @ec2.get_password_data( :instance_id => "i-2574e22a" ).should.be.an.instance_of Hash
32
+ response = @ec2.get_password_data( :instance_id => "i-2574e22a" )
33
+ response.instanceId.should.equal "i-2574e22a"
34
+ response.timestamp.should.equal "2009-10-24 15:00:00"
35
+ response.passwordData.should.equal "TGludXggdmVyc2lvbiAyLjYuMTYteGVuVSAoYnVpbGRlckBwYXRjaGJhdC5hbWF6b25zYSkgKGdj"
36
+ end
37
+
38
+
39
+ specify "method get_password_data should raise an exception when called without nil/empty string arguments" do
40
+ lambda { @ec2.get_password_data() }.should.raise(AWS::ArgumentError)
41
+ lambda { @ec2.get_password_data(:instance_id => nil) }.should.raise(AWS::ArgumentError)
42
+ lambda { @ec2.get_password_data(:instance_id => "") }.should.raise(AWS::ArgumentError)
43
+ end
44
+
45
+
46
+ end
@@ -107,6 +107,17 @@ context "An EC2 spot instances request " do
107
107
 
108
108
  end
109
109
 
110
+ specify "should be able to be requested with various instance sizes" do
111
+ ["t1.micro", "m1.small", "m1.large", "m1.xlarge", "m2.xlarge", "c1.medium", "c1.xlarge", "m2.2xlarge", "m2.4xlarge", "cc1.4xlarge"].each do |type|
112
+ @ec2.stubs(:make_request).with('RequestSpotInstances', {"SpotPrice"=>"0.50", 'LaunchSpecification.InstanceType' => type, 'LaunchSpecification.ImageId' => 'ami-60a54009', "InstanceCount"=>"1"}).
113
+ returns stub(:body => @create_spot_instances_request_response_body, :is_a? => true)
114
+ lambda { @ec2.request_spot_instances( :image_id => "ami-60a54009", :instance_type => type, :spot_price => '0.50' ) }.should.not.raise(AWS::ArgumentError)
115
+ end
116
+ end
117
+
118
+ specify "should raise an exception with a bad instance type" do
119
+ lambda { @ec2.request_spot_instances({"SpotPrice"=>"0.50", 'LaunchSpecification.InstanceType' => 'm1.notarealsize', "InstanceCount"=>"1"}) }.should.raise(AWS::ArgumentError)
120
+ end
110
121
 
111
122
  specify "should be able to be created" do
112
123
  @ec2.stubs(:make_request).with('RequestSpotInstances', {"SpotPrice"=>"0.50", 'LaunchSpecification.InstanceType' => 'm1.small', "InstanceCount"=>"1"}).
@@ -39,13 +39,21 @@ context "Spot price history " do
39
39
  specify "should reject an end_time which is not a Time object" do
40
40
  lambda { @ec2.describe_spot_price_history(:end_time => 42) }.should.raise(AWS::ArgumentError)
41
41
  end
42
-
42
+
43
+ specify "should be able to be requested with various instance types" do
44
+ ["t1.micro", "m1.small", "m1.large", "m1.xlarge", "m2.xlarge", "c1.medium", "c1.xlarge", "m2.2xlarge", "m2.4xlarge", "cc1.4xlarge"].each do |type|
45
+ @ec2.stubs(:make_request).with('DescribeSpotPriceHistory', {'InstanceType' => type}).
46
+ returns stub(:body => @describe_spot_price_history_response_body, :is_a? => true)
47
+ lambda { @ec2.describe_spot_price_history( :instance_type => type ) }.should.not.raise(AWS::ArgumentError)
48
+ end
49
+ end
50
+
43
51
  specify "should reject an invalid instance type" do
44
52
  lambda { @ec2.describe_spot_price_history(:instance_type => 'm1.tiny') }.should.raise(AWS::ArgumentError)
45
53
  end
46
-
54
+
47
55
  specify "should reject an invalid product description" do
48
56
  lambda { @ec2.describe_spot_price_history(:product_description => 'Solaris') }.should.raise(AWS::ArgumentError)
49
57
  end
50
-
58
+
51
59
  end
@@ -139,4 +139,20 @@ context "EC2 volumes " do
139
139
  response.status.should.equal "detaching"
140
140
  end
141
141
 
142
+ specify "should be able to be force detached with a string" do
143
+ @ec2.stubs(:make_request).with('DetachVolume', {"VolumeId" => "vol-4d826724", "InstanceId"=>"i-6058a509", "Device"=>"", "Force"=>"true"}).
144
+ returns stub(:body => @detach_volume_response_body, :is_a? => true)
145
+
146
+ response = @ec2.detach_volume( :volume_id => "vol-4d826724", :instance_id => "i-6058a509", :force => 'true' )
147
+ response.volumeId.should.equal "vol-4d826724"
148
+ end
149
+
150
+ specify "should be able to be force detached with a Boolean" do
151
+ @ec2.stubs(:make_request).with('DetachVolume', {"VolumeId" => "vol-4d826724", "InstanceId"=>"i-6058a509", "Device"=>"", "Force"=>"true"}).
152
+ returns stub(:body => @detach_volume_response_body, :is_a? => true)
153
+
154
+ response = @ec2.detach_volume( :volume_id => "vol-4d826724", :instance_id => "i-6058a509", :force => true )
155
+ response.volumeId.should.equal "vol-4d826724"
156
+ end
157
+
142
158
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: amazon-ec2
3
3
  version: !ruby/object:Gem::Version
4
- hash: 37
4
+ hash: 25
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 9
9
- - 15
10
- version: 0.9.15
9
+ - 17
10
+ version: 0.9.17
11
11
  platform: ruby
12
12
  authors:
13
13
  - Glenn Rempe
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-06-10 00:00:00 -07:00
18
+ date: 2010-11-21 00:00:00 -08:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -42,12 +42,12 @@ dependencies:
42
42
  requirements:
43
43
  - - ">="
44
44
  - !ruby/object:Gem::Version
45
- hash: 43
45
+ hash: 41
46
46
  segments:
47
47
  - 0
48
48
  - 9
49
- - 8
50
- version: 0.9.8
49
+ - 9
50
+ version: 0.9.9
51
51
  type: :development
52
52
  version_requirements: *id002
53
53
  - !ruby/object:Gem::Dependency
@@ -74,12 +74,12 @@ dependencies:
74
74
  requirements:
75
75
  - - ">="
76
76
  - !ruby/object:Gem::Version
77
- hash: 55
77
+ hash: 41
78
78
  segments:
79
79
  - 0
80
80
  - 9
81
- - 6
82
- version: 0.9.6
81
+ - 9
82
+ version: 0.9.9
83
83
  type: :development
84
84
  version_requirements: *id004
85
85
  - !ruby/object:Gem::Dependency
@@ -90,17 +90,35 @@ dependencies:
90
90
  requirements:
91
91
  - - ">="
92
92
  - !ruby/object:Gem::Version
93
- hash: 1
93
+ hash: 3
94
94
  segments:
95
95
  - 0
96
- - 3
97
- - 9
98
- version: 0.3.9
96
+ - 5
97
+ - 4
98
+ version: 0.5.4
99
99
  type: :development
100
100
  version_requirements: *id005
101
+ - !ruby/object:Gem::Dependency
102
+ name: yard
103
+ prerelease: false
104
+ requirement: &id006 !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ hash: 3
110
+ segments:
111
+ - 0
112
+ - 6
113
+ - 2
114
+ version: 0.6.2
115
+ type: :development
116
+ version_requirements: *id006
101
117
  description: A Ruby library for accessing the Amazon Web Services EC2, ELB, RDS, Cloudwatch, and Autoscaling APIs.
102
- email: glenn@rempe.us
118
+ email:
119
+ - glenn@rempe.us
103
120
  executables:
121
+ - awshell
104
122
  - ec2-gem-example.rb
105
123
  - ec2-gem-profile.rb
106
124
  - ec2sh
@@ -111,17 +129,18 @@ extra_rdoc_files:
111
129
  - ChangeLog
112
130
  - LICENSE
113
131
  - README.rdoc
114
- - README_dev.rdoc
115
132
  files:
116
133
  - .gitignore
117
134
  - .yardopts
118
135
  - ChangeLog
136
+ - Gemfile
137
+ - Gemfile.lock
119
138
  - LICENSE
120
139
  - README.rdoc
121
- - README_dev.rdoc
122
140
  - Rakefile
123
141
  - VERSION
124
142
  - amazon-ec2.gemspec
143
+ - bin/awshell
125
144
  - bin/ec2-gem-example.rb
126
145
  - bin/ec2-gem-profile.rb
127
146
  - bin/ec2sh
@@ -141,12 +160,14 @@ files:
141
160
  - lib/AWS/EC2/images.rb
142
161
  - lib/AWS/EC2/instances.rb
143
162
  - lib/AWS/EC2/keypairs.rb
163
+ - lib/AWS/EC2/password.rb
144
164
  - lib/AWS/EC2/products.rb
145
165
  - lib/AWS/EC2/security_groups.rb
146
166
  - lib/AWS/EC2/snapshots.rb
147
167
  - lib/AWS/EC2/spot_instance_requests.rb
148
168
  - lib/AWS/EC2/spot_prices.rb
149
169
  - lib/AWS/EC2/subnets.rb
170
+ - lib/AWS/EC2/tags.rb
150
171
  - lib/AWS/EC2/volumes.rb
151
172
  - lib/AWS/ELB.rb
152
173
  - lib/AWS/ELB/load_balancers.rb
@@ -154,10 +175,7 @@ files:
154
175
  - lib/AWS/RDS/rds.rb
155
176
  - lib/AWS/exceptions.rb
156
177
  - lib/AWS/responses.rb
157
- - perftools/ec2prof
158
- - perftools/ec2prof-results.dot
159
- - perftools/ec2prof-results.txt
160
- - perftools/ec2prof.symbols
178
+ - lib/AWS/version.rb
161
179
  - test/test_Autoscaling_groups.rb
162
180
  - test/test_EC2.rb
163
181
  - test/test_EC2_availability_zones.rb
@@ -167,6 +185,7 @@ files:
167
185
  - test/test_EC2_images.rb
168
186
  - test/test_EC2_instances.rb
169
187
  - test/test_EC2_keypairs.rb
188
+ - test/test_EC2_password.rb
170
189
  - test/test_EC2_products.rb
171
190
  - test/test_EC2_responses.rb
172
191
  - test/test_EC2_s3_xmlsimple.rb
@@ -222,7 +241,7 @@ rubyforge_project: amazon-ec2
222
241
  rubygems_version: 1.3.7
223
242
  signing_key:
224
243
  specification_version: 3
225
- summary: Amazon EC2 Ruby Gem
244
+ summary: Amazon EC2 Ruby gem
226
245
  test_files:
227
246
  - test/test_Autoscaling_groups.rb
228
247
  - test/test_EC2.rb
@@ -233,6 +252,7 @@ test_files:
233
252
  - test/test_EC2_images.rb
234
253
  - test/test_EC2_instances.rb
235
254
  - test/test_EC2_keypairs.rb
255
+ - test/test_EC2_password.rb
236
256
  - test/test_EC2_products.rb
237
257
  - test/test_EC2_responses.rb
238
258
  - test/test_EC2_s3_xmlsimple.rb
@@ -243,5 +263,5 @@ test_files:
243
263
  - test/test_EC2_subnets.rb
244
264
  - test/test_EC2_volumes.rb
245
265
  - test/test_ELB_load_balancers.rb
246
- - test/test_helper.rb
247
266
  - test/test_RDS.rb
267
+ - test/test_helper.rb