#-- # Amazon Web Services EC2 Query API Ruby library # # Ruby Gem Name:: amazon-ec2 # Author:: Glenn Rempe (mailto:glenn@rempe.us) # Copyright:: Copyright (c) 2007-2008 Glenn Rempe # License:: Distributes under the same terms as Ruby # Home:: http://github.com/grempe/amazon-ec2/tree/master #++ require File.dirname(__FILE__) + '/test_helper.rb' context "An EC2 image " do before do @ec2 = AWS::EC2::Base.new( :access_key_id => "not a key", :secret_access_key => "not a secret" ) @create_image_response_body = <<-RESPONSE ami-4fa54026 RESPONSE @register_image_response_body = <<-RESPONSE ami-61a54008 RESPONSE @describe_image_response_body = <<-RESPONSE ami-61a54008 foobar1/image.manifest.xml available AAAATLBUXIEON5NQVUUX6OMPWBZIAAAA true 774F4FF8 ami-61a54009 foobar2/image.manifest.xml deregistered ZZZZTLBUXIEON5NQVUUX6OMPWBZIZZZZ false RESPONSE @deregister_image_response_body = <<-RESPONSE true RESPONSE end specify "should be able to be created" do @ec2.stubs(:make_request).with('CreateImage', {"InstanceId"=>"fooid", "Name" => "fooname", "Description" => "foodesc", "NoReboot" => "true"}). returns stub(:body => @create_image_response_body, :is_a? => true) @ec2.create_image(:instance_id => "fooid", :name => "fooname", :description => "foodesc", :no_reboot => true).should.be.an.instance_of Hash @ec2.create_image(:instance_id => "fooid", :name => "fooname", :description => "foodesc", :no_reboot => true).imageId.should.equal "ami-4fa54026" end specify "method create_image should raise an exception when called with nil/empty string arguments" do lambda { @ec2.create_image() }.should.raise(AWS::ArgumentError) lambda { @ec2.create_image(:instance_id => "", :name => "fooname") }.should.raise(AWS::ArgumentError) lambda { @ec2.create_image(:instance_id => "fooid", :name => "") }.should.raise(AWS::ArgumentError) lambda { @ec2.create_image(:instance_id => nil, :name => "fooname") }.should.raise(AWS::ArgumentError) lambda { @ec2.create_image(:instance_id => "fooid", :name => nil) }.should.raise(AWS::ArgumentError) end specify "method create_image should raise an exception when called with bad arguments" do lambda { @ec2.create_image(:instance_id => "fooid", :name => "f"*2) }.should.raise(AWS::ArgumentError) lambda { @ec2.create_image(:instance_id => "fooid", :name => "f"*129) }.should.raise(AWS::ArgumentError) lambda { @ec2.create_image(:instance_id => "fooid", :name => "f"*128, :description => "f"*256) }.should.raise(AWS::ArgumentError) lambda { @ec2.create_image(:instance_id => "fooid", :name => "f"*128, :no_reboot => "true") }.should.raise(AWS::ArgumentError) lambda { @ec2.create_image(:instance_id => "fooid", :name => "f"*128, :no_reboot => "false") }.should.raise(AWS::ArgumentError) end specify "should be able to be registered with manifest" do @ec2.stubs(:make_request).with('RegisterImage', {"ImageLocation"=>"mybucket-myimage.manifest.xml"}). returns stub(:body => @register_image_response_body, :is_a? => true) @ec2.register_image(:image_location => "mybucket-myimage.manifest.xml").imageId.should.equal "ami-61a54008" @ec2.register_image(:image_location => "mybucket-myimage.manifest.xml").should.be.an.instance_of Hash end specify "should be able to be registered with snapshot" do @ec2.stubs(:make_request).with('RegisterImage', { "Name" => "image_name", "Architecture" => "i386", "KernelId" => "aki-01234567", "RamdiskId" => "ari-01234567", "RootDeviceName" => "/dev/sda1", "BlockDeviceMapping.1.DeviceName" => "/dev/sda1", "BlockDeviceMapping.1.Ebs.SnapshotId" => "snap-01234567", "BlockDeviceMapping.1.Ebs.DeleteOnTermination" => "true", }).returns stub(:body => @register_image_response_body, :is_a? => true) ret = @ec2.register_image({ :name => "image_name", :architecture => "i386", :kernel_id => "aki-01234567", :ramdisk_id => "ari-01234567", :root_device_name => "/dev/sda1", :block_device_mapping => [{ :device_name => "/dev/sda1", :ebs_snapshot_id => "snap-01234567", :ebs_delete_on_termination => true, }] }) ret.imageId.should.equal "ami-61a54008" ret.should.be.an.instance_of Hash end specify "method register_image should raise an exception when called without :name or :root_device_name" do lambda { @ec2.register_image() }.should.raise(AWS::ArgumentError) lambda { @ec2.register_image(:image_location => "", :root_device_name => "") }.should.raise(AWS::ArgumentError) end specify "should be able to be described and return the correct Ruby response class for parent and members" do @ec2.stubs(:make_request).with('DescribeImages', {}). returns stub(:body => @describe_image_response_body, :is_a? => true) @ec2.describe_images.should.be.an.instance_of Hash response = @ec2.describe_images response.should.be.an.instance_of Hash end specify "should be able to be described with no params and return an imagesSet" do @ec2.stubs(:make_request).with('DescribeImages', {}). returns stub(:body => @describe_image_response_body, :is_a? => true) @ec2.describe_images.imagesSet.item.length.should.equal 2 end specify "should be able to be described by an Array of ImageId.N ID's and return an array of Items" do @ec2.stubs(:make_request).with('DescribeImages', {"ImageId.1"=>"ami-61a54008", "ImageId.2"=>"ami-61a54009"}). returns stub(:body => @describe_image_response_body, :is_a? => true) @ec2.describe_images( :image_id => ["ami-61a54008", "ami-61a54009"] ).imagesSet.item.length.should.equal 2 response = @ec2.describe_images( :image_id => ["ami-61a54008", "ami-61a54009"] ) # test first 'Item' object returned response.imagesSet.item[0].imageId.should.equal "ami-61a54008" response.imagesSet.item[0].imageLocation.should.equal "foobar1/image.manifest.xml" response.imagesSet.item[0].imageState.should.equal "available" response.imagesSet.item[0].imageOwnerId.should.equal "AAAATLBUXIEON5NQVUUX6OMPWBZIAAAA" response.imagesSet.item[0].isPublic.should.equal "true" response.imagesSet.item[0].productCodes.item[0].productCode.should.equal "774F4FF8" # test second 'Item' object returned response.imagesSet.item[1].imageId.should.equal "ami-61a54009" response.imagesSet.item[1].imageLocation.should.equal "foobar2/image.manifest.xml" response.imagesSet.item[1].imageState.should.equal "deregistered" response.imagesSet.item[1].imageOwnerId.should.equal "ZZZZTLBUXIEON5NQVUUX6OMPWBZIZZZZ" response.imagesSet.item[1].isPublic.should.equal "false" end specify "should be able to be described by an owners with Owner.N ID's and return an array of Items" do @ec2.stubs(:make_request).with('DescribeImages', "Owner.1" => "AAAATLBUXIEON5NQVUUX6OMPWBZIAAAA", "Owner.2" => "ZZZZTLBUXIEON5NQVUUX6OMPWBZIZZZZ"). returns stub(:body => @describe_image_response_body, :is_a? => true) @ec2.describe_images( :owner_id => ["AAAATLBUXIEON5NQVUUX6OMPWBZIAAAA", "ZZZZTLBUXIEON5NQVUUX6OMPWBZIZZZZ"] ).imagesSet.item.length.should.equal 2 # owner ID's response = @ec2.describe_images( :owner_id => ["AAAATLBUXIEON5NQVUUX6OMPWBZIAAAA", "ZZZZTLBUXIEON5NQVUUX6OMPWBZIZZZZ"] ) response.imagesSet.item[0].imageId.should.equal "ami-61a54008" response.imagesSet.item[1].imageId.should.equal "ami-61a54009" end specify "should be able to be described by an owner of 'self' and return an array of Items that I own" do @ec2.stubs(:make_request).with('DescribeImages', "Owner.1" => "self"). returns stub(:body => @describe_image_response_body, :is_a? => true) @ec2.describe_images( :owner_id => "self" ).imagesSet.item.length.should.equal 2 # 'self' - Those that I own response = @ec2.describe_images( :owner_id => "self" ) response.imagesSet.item[0].imageId.should.equal "ami-61a54008" end specify "should be able to be described by an owner of 'amazon' and return an array of Items that are Amazon Public AMI's" do @ec2.stubs(:make_request).with('DescribeImages', "Owner.1" => "amazon"). returns stub(:body => @describe_image_response_body, :is_a? => true) @ec2.describe_images( :owner_id => "amazon" ).imagesSet.item.length.should.equal 2 # 'amazon' - Those that are owned and created by AWS response = @ec2.describe_images( :owner_id => "amazon" ) response.imagesSet.item[0].imageId.should.equal "ami-61a54008" end specify "should be able to be described by an owners with Owner.N ID's who can execute AMI's and return an array of Items" do @ec2.stubs(:make_request).with('DescribeImages', "ExecutableBy.1" => "AAAATLBUXIEON5NQVUUX6OMPWBZIAAAA", "ExecutableBy.2" => "ZZZZTLBUXIEON5NQVUUX6OMPWBZIZZZZ"). returns stub(:body => @describe_image_response_body, :is_a? => true) @ec2.describe_images( :executable_by => ["AAAATLBUXIEON5NQVUUX6OMPWBZIAAAA", "ZZZZTLBUXIEON5NQVUUX6OMPWBZIZZZZ"] ).imagesSet.item.length.should.equal 2 # executable by owner ID's response = @ec2.describe_images( :executable_by => ["AAAATLBUXIEON5NQVUUX6OMPWBZIAAAA", "ZZZZTLBUXIEON5NQVUUX6OMPWBZIZZZZ"] ) response.imagesSet.item[0].imageId.should.equal "ami-61a54008" response.imagesSet.item[1].imageId.should.equal "ami-61a54009" end specify "should be able to be described by an owners with Owner.N of 'self' who can execute AMI's and return an array of Items" do @ec2.stubs(:make_request).with('DescribeImages', "ExecutableBy.1" => "self"). returns stub(:body => @describe_image_response_body, :is_a? => true) @ec2.describe_images( :executable_by => "self" ).imagesSet.item.length.should.equal 2 # executable by owner ID's response = @ec2.describe_images( :executable_by => "self" ) response.imagesSet.item[0].imageId.should.equal "ami-61a54008" response.imagesSet.item[1].imageId.should.equal "ami-61a54009" end specify "should be able to be described by an owners with Owner.N of 'all' who can execute AMI's and return an array of Items" do @ec2.stubs(:make_request).with('DescribeImages', "ExecutableBy.1" => "all"). returns stub(:body => @describe_image_response_body, :is_a? => true) @ec2.describe_images( :executable_by => "all" ).imagesSet.item.length.should.equal 2 # executable by owner ID's response = @ec2.describe_images( :executable_by => "all" ) response.imagesSet.item[0].imageId.should.equal "ami-61a54008" response.imagesSet.item[1].imageId.should.equal "ami-61a54009" end specify "should be able to be de-registered" do @ec2.stubs(:make_request).with('DeregisterImage', {"ImageId"=>"ami-61a54008"}). returns stub(:body => @deregister_image_response_body, :is_a? => true) @ec2.deregister_image(:image_id => "ami-61a54008" ).should.be.an.instance_of Hash @ec2.deregister_image(:image_id => "ami-61a54008" ).return.should.equal "true" end specify "method deregister_image should raise an exception when called without nil/empty string arguments" do lambda { @ec2.deregister_image() }.should.raise(AWS::ArgumentError) lambda { @ec2.deregister_image( :image_id => nil ) }.should.raise(AWS::ArgumentError) lambda { @ec2.deregister_image( :image_id => "" ) }.should.raise(AWS::ArgumentError) end end