amazon-ec2 0.1.0 → 0.2.0
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.
- data/History.txt +166 -95
- data/License.txt +67 -20
- data/Manifest.txt +17 -6
- data/README.txt +112 -2
- data/Rakefile +15 -5
- data/bin/ec2-gem-example.rb +61 -0
- data/bin/ec2sh +73 -0
- data/bin/setup.rb +19 -0
- data/lib/EC2.rb +142 -61
- data/lib/EC2/console.rb +44 -0
- data/lib/EC2/exceptions.rb +136 -0
- data/lib/EC2/image_attributes.rb +137 -29
- data/lib/EC2/images.rb +120 -73
- data/lib/EC2/instances.rb +168 -98
- data/lib/EC2/keypairs.rb +79 -23
- data/lib/EC2/responses.rb +142 -321
- data/lib/EC2/security_groups.rb +209 -117
- data/lib/EC2/version.rb +11 -2
- data/test/test_EC2.rb +44 -13
- data/test/test_EC2_console.rb +54 -0
- data/test/test_EC2_image_attributes.rb +188 -0
- data/test/test_EC2_images.rb +191 -0
- data/test/test_EC2_instances.rb +303 -0
- data/test/test_EC2_keypairs.rb +123 -0
- data/test/test_EC2_responses.rb +102 -0
- data/test/test_EC2_security_groups.rb +205 -0
- data/test/test_EC2_version.rb +44 -0
- data/test/test_helper.rb +16 -8
- data/website/index.html +378 -86
- data/website/index.txt +339 -88
- data/website/stylesheets/screen.css +8 -8
- metadata +89 -16
- data/examples/ec2-example.rb +0 -48
- data/test/test_responses.rb +0 -17
@@ -0,0 +1,123 @@
|
|
1
|
+
#--
|
2
|
+
# Amazon Web Services EC2 Query API Ruby library
|
3
|
+
#
|
4
|
+
# Ruby Gem Name:: amazon-ec2
|
5
|
+
# Author:: Glenn Rempe (mailto:glenn@elasticworkbench.com)
|
6
|
+
# Copyright:: Copyright (c) 2007 Glenn Rempe
|
7
|
+
# License:: Distributes under the same terms as Ruby
|
8
|
+
# Home:: http://amazon-ec2.rubyforge.org
|
9
|
+
#++
|
10
|
+
|
11
|
+
require File.dirname(__FILE__) + '/test_helper.rb'
|
12
|
+
|
13
|
+
context "EC2 keypairs " do
|
14
|
+
|
15
|
+
setup do
|
16
|
+
@ec2 = EC2::Base.new( :access_key_id => "not a key", :secret_access_key => "not a secret" )
|
17
|
+
|
18
|
+
@create_keypair_response_body = <<-RESPONSE
|
19
|
+
<CreateKeyPairResponse xmlns="http://ec2.amazonaws.com/doc/2007-01-19">
|
20
|
+
<keyName>example-key-name</keyName>
|
21
|
+
<keyFingerprint>1f:51:ae:28:bf:89:e9:d8:1f:25:5d:37:2d:7d:b8:ca:9f:f5:f1:6f</keyFingerprint>
|
22
|
+
<keyMaterial>-----BEGIN RSA PRIVATE KEY-----
|
23
|
+
MIIEoQIBAAKCAQBuLFg5ujHrtm1jnutSuoO8Xe56LlT+HM8v/xkaa39EstM3/aFxTHgElQiJLChp
|
24
|
+
HungXQ29VTc8rc1bW0lkdi23OH5eqkMHGhvEwqa0HWASUMll4o3o/IX+0f2UcPoKCOVUR+jx71Sg
|
25
|
+
5AU52EQfanIn3ZQ8lFW7Edp5a3q4DhjGlUKToHVbicL5E+g45zfB95wIyywWZfeW/UUF3LpGZyq/
|
26
|
+
ebIUlq1qTbHkLbCC2r7RTn8vpQWp47BGVYGtGSBMpTRP5hnbzzuqj3itkiLHjU39S2sJCJ0TrJx5
|
27
|
+
i8BygR4s3mHKBj8l+ePQxG1kGbF6R4yg6sECmXn17MRQVXODNHZbAgMBAAECggEAY1tsiUsIwDl5
|
28
|
+
91CXirkYGuVfLyLflXenxfI50mDFms/mumTqloHO7tr0oriHDR5K7wMcY/YY5YkcXNo7mvUVD1pM
|
29
|
+
ZNUJs7rw9gZRTrf7LylaJ58kOcyajw8TsC4e4LPbFaHwS1d6K8rXh64o6WgW4SrsB6ICmr1kGQI7
|
30
|
+
3wcfgt5ecIu4TZf0OE9IHjn+2eRlsrjBdeORi7KiUNC/pAG23I6MdDOFEQRcCSigCj+4/mciFUSA
|
31
|
+
SWS4dMbrpb9FNSIcf9dcLxVM7/6KxgJNfZc9XWzUw77Jg8x92Zd0fVhHOux5IZC+UvSKWB4dyfcI
|
32
|
+
tE8C3p9bbU9VGyY5vLCAiIb4qQKBgQDLiO24GXrIkswF32YtBBMuVgLGCwU9h9HlO9mKAc2m8Cm1
|
33
|
+
jUE5IpzRjTedc9I2qiIMUTwtgnw42auSCzbUeYMURPtDqyQ7p6AjMujp9EPemcSVOK9vXYL0Ptco
|
34
|
+
xW9MC0dtV6iPkCN7gOqiZXPRKaFbWADp16p8UAIvS/a5XXk5jwKBgQCKkpHi2EISh1uRkhxljyWC
|
35
|
+
iDCiK6JBRsMvpLbc0v5dKwP5alo1fmdR5PJaV2qvZSj5CYNpMAy1/EDNTY5OSIJU+0KFmQbyhsbm
|
36
|
+
rdLNLDL4+TcnT7c62/aH01ohYaf/VCbRhtLlBfqGoQc7+sAc8vmKkesnF7CqCEKDyF/dhrxYdQKB
|
37
|
+
gC0iZzzNAapayz1+JcVTwwEid6j9JqNXbBc+Z2YwMi+T0Fv/P/hwkX/ypeOXnIUcw0Ih/YtGBVAC
|
38
|
+
DQbsz7LcY1HqXiHKYNWNvXgwwO+oiChjxvEkSdsTTIfnK4VSCvU9BxDbQHjdiNDJbL6oar92UN7V
|
39
|
+
rBYvChJZF7LvUH4YmVpHAoGAbZ2X7XvoeEO+uZ58/BGKOIGHByHBDiXtzMhdJr15HTYjxK7OgTZm
|
40
|
+
gK+8zp4L9IbvLGDMJO8vft32XPEWuvI8twCzFH+CsWLQADZMZKSsBasOZ/h1FwhdMgCMcY+Qlzd4
|
41
|
+
JZKjTSu3i7vhvx6RzdSedXEMNTZWN4qlIx3kR5aHcukCgYA9T+Zrvm1F0seQPbLknn7EqhXIjBaT
|
42
|
+
P8TTvW/6bdPi23ExzxZn7KOdrfclYRph1LHMpAONv/x2xALIf91UB+v5ohy1oDoasL0gij1houRe
|
43
|
+
2ERKKdwz0ZL9SWq6VTdhr/5G994CK72fy5WhyERbDjUIdHaK3M849JJuf8cSrvSb4g==
|
44
|
+
-----END RSA PRIVATE KEY-----</keyMaterial>
|
45
|
+
</CreateKeyPairResponse>
|
46
|
+
RESPONSE
|
47
|
+
|
48
|
+
@describe_keypairs_response_body = <<-RESPONSE
|
49
|
+
<DescribeKeyPairsResponse xmlns="http://ec2.amazonaws.com/doc/2007-01-19">
|
50
|
+
<keySet>
|
51
|
+
<item>
|
52
|
+
<keyName>example-key-name</keyName>
|
53
|
+
<keyFingerprint>1f:51:ae:28:bf:89:e9:d8:1f:25:5d:37:2d:7d:b8:ca:9f:f5:f1:6f</keyFingerprint>
|
54
|
+
</item>
|
55
|
+
</keySet>
|
56
|
+
</DescribeKeyPairsResponse>
|
57
|
+
RESPONSE
|
58
|
+
|
59
|
+
@delete_keypair_body = <<-RESPONSE
|
60
|
+
<DeleteKeyPair xmlns="http://ec2.amazonaws.com/doc/2007-01-19">
|
61
|
+
<return>true</return>
|
62
|
+
</DeleteKeyPair>
|
63
|
+
RESPONSE
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
|
68
|
+
specify "should be able to be created" do
|
69
|
+
@ec2.stubs(:make_request).with('CreateKeyPair', {"KeyName"=>"example-key-name"}).
|
70
|
+
returns stub(:body => @create_keypair_response_body, :is_a? => true)
|
71
|
+
|
72
|
+
@ec2.create_keypair( :key_name => "example-key-name" ).should.be.an.instance_of EC2::Response
|
73
|
+
|
74
|
+
response = @ec2.create_keypair( :key_name => "example-key-name" )
|
75
|
+
response.keyName.should.equal "example-key-name"
|
76
|
+
response.keyFingerprint.should.equal "1f:51:ae:28:bf:89:e9:d8:1f:25:5d:37:2d:7d:b8:ca:9f:f5:f1:6f"
|
77
|
+
response.keyMaterial.should.not.equal ""
|
78
|
+
response.keyMaterial.should.not.be.nil
|
79
|
+
end
|
80
|
+
|
81
|
+
|
82
|
+
specify "method create_keypair should reject bad arguments" do
|
83
|
+
@ec2.stubs(:make_request).with('CreateKeyPair', {"KeyName"=>"example-key-name"}).
|
84
|
+
returns stub(:body => @create_keypair_response_body, :is_a? => true)
|
85
|
+
|
86
|
+
lambda { @ec2.create_keypair( :key_name => "example-key-name" ) }.should.not.raise(EC2::ArgumentError)
|
87
|
+
lambda { @ec2.create_keypair() }.should.raise(EC2::ArgumentError)
|
88
|
+
lambda { @ec2.create_keypair( :key_name => nil ) }.should.raise(EC2::ArgumentError)
|
89
|
+
lambda { @ec2.create_keypair( :key_name => "" ) }.should.raise(EC2::ArgumentError)
|
90
|
+
end
|
91
|
+
|
92
|
+
|
93
|
+
specify "should be able to be described with describe_keypairs" do
|
94
|
+
@ec2.stubs(:make_request).with('DescribeKeyPairs', {"KeyName.1"=>"example-key-name"}).
|
95
|
+
returns stub(:body => @describe_keypairs_response_body, :is_a? => true)
|
96
|
+
@ec2.describe_keypairs( :key_name => "example-key-name" ).should.be.an.instance_of EC2::Response
|
97
|
+
response = @ec2.describe_keypairs( :key_name => "example-key-name" )
|
98
|
+
response.keySet.item[0].keyName.should.equal "example-key-name"
|
99
|
+
response.keySet.item[0].keyFingerprint.should.equal "1f:51:ae:28:bf:89:e9:d8:1f:25:5d:37:2d:7d:b8:ca:9f:f5:f1:6f"
|
100
|
+
end
|
101
|
+
|
102
|
+
|
103
|
+
specify "should be able to be deleted with delete_keypairs" do
|
104
|
+
@ec2.stubs(:make_request).with('DeleteKeyPair', {"KeyName"=>"example-key-name"}).
|
105
|
+
returns stub(:body => @delete_keypair_body, :is_a? => true)
|
106
|
+
@ec2.delete_keypair( :key_name => "example-key-name" ).should.be.an.instance_of EC2::Response
|
107
|
+
response = @ec2.delete_keypair( :key_name => "example-key-name" )
|
108
|
+
response.return.should.equal "true"
|
109
|
+
end
|
110
|
+
|
111
|
+
|
112
|
+
specify "method delete_keypair should reject bad argument" do
|
113
|
+
@ec2.stubs(:make_request).with('DeleteKeyPair', {"KeyName"=>"example-key-name"}).
|
114
|
+
returns stub(:body => @delete_keypair_body, :is_a? => true)
|
115
|
+
|
116
|
+
lambda { @ec2.delete_keypair( :key_name => "example-key-name" ) }.should.not.raise(EC2::ArgumentError)
|
117
|
+
lambda { @ec2.delete_keypair() }.should.raise(EC2::ArgumentError)
|
118
|
+
lambda { @ec2.delete_keypair( :key_name => nil ) }.should.raise(EC2::ArgumentError)
|
119
|
+
lambda { @ec2.delete_keypair( :key_name => "" ) }.should.raise(EC2::ArgumentError)
|
120
|
+
end
|
121
|
+
|
122
|
+
|
123
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
#--
|
2
|
+
# Amazon Web Services EC2 Query API Ruby library
|
3
|
+
#
|
4
|
+
# Ruby Gem Name:: amazon-ec2
|
5
|
+
# Author:: Glenn Rempe (mailto:glenn@elasticworkbench.com)
|
6
|
+
# Copyright:: Copyright (c) 2007 Glenn Rempe
|
7
|
+
# License:: Distributes under the same terms as Ruby
|
8
|
+
# Home:: http://amazon-ec2.rubyforge.org
|
9
|
+
#++
|
10
|
+
|
11
|
+
require File.dirname(__FILE__) + '/test_helper.rb'
|
12
|
+
|
13
|
+
context "The Response classes " do
|
14
|
+
|
15
|
+
|
16
|
+
setup do
|
17
|
+
@http_xml = <<-RESPONSE
|
18
|
+
<RebootInstancesResponse xmlns="http://ec2.amazonaws.com/doc/2007-01-19">
|
19
|
+
<return>true</return>
|
20
|
+
</RebootInstancesResponse>
|
21
|
+
RESPONSE
|
22
|
+
|
23
|
+
@response = EC2::Response.parse(:xml => @http_xml)
|
24
|
+
|
25
|
+
# test out adding arbitrary new values to the OpenStruct
|
26
|
+
@response.name = "foo"
|
27
|
+
@response.number = '123'
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
specify "should properly run the to_string(short) method for the short version" do
|
32
|
+
# sample response looks like: "#<EC2::Response:0x100A45F2E ...>". Our response should look
|
33
|
+
# exactly the same, except it should have different hex digits in the middle (after 0x)
|
34
|
+
# that are nine chars long.
|
35
|
+
@response.to_string(true).should =~ /^#<EC2::Response:0x[0-9A-F]{1,9} ...>/
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
specify "should properly run the to_string(false) method for the long version" do
|
40
|
+
@response.to_string(false).should =~ /^#<EC2::Response:0x[0-9A-F]{1,9} name=\"foo\" number=\"123\" parent=nil return=\"true\"/
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
specify "should properly run the to_string(false) method for the long version when called with no params" do
|
45
|
+
@response.to_string.should =~ /^#<EC2::Response:0x[0-9A-F]{1,9} name=\"foo\" number=\"123\" parent=nil return=\"true\"/
|
46
|
+
end
|
47
|
+
|
48
|
+
|
49
|
+
specify "should provide the same results from to_s as from to_string(false) " do
|
50
|
+
@response.to_s.should =~ /^#<EC2::Response:0x[0-9A-F]{1,9} name=\"foo\" number=\"123\" parent=nil return=\"true\"/
|
51
|
+
end
|
52
|
+
|
53
|
+
|
54
|
+
specify "should be a kind of type OpenStruct" do
|
55
|
+
@response.kind_of?(OpenStruct).should.equal true
|
56
|
+
@response.kind_of?(Enumerable).should.equal true
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
specify "should return its members" do
|
61
|
+
@response.members.length.should.equal 6
|
62
|
+
test_array = ["return", "xmlns", "number", "name", "parent", "xml"].sort
|
63
|
+
@response.members.sort.should.equal test_array
|
64
|
+
end
|
65
|
+
|
66
|
+
|
67
|
+
specify "should properly respond to its 'each' method" do
|
68
|
+
answer = @response.each do |f| f ; end
|
69
|
+
answer.name.should.equal "foo"
|
70
|
+
answer.number.should.equal '123'
|
71
|
+
end
|
72
|
+
|
73
|
+
|
74
|
+
specify "should respond to the '[]' method" do
|
75
|
+
@response[:name].should.equal "foo"
|
76
|
+
end
|
77
|
+
|
78
|
+
|
79
|
+
specify "should respond correctly to the '[]=' method and set a variable" do
|
80
|
+
@response[:name].should.equal "foo"
|
81
|
+
@response[:name]="bar"
|
82
|
+
@response[:name].should.equal "bar"
|
83
|
+
end
|
84
|
+
|
85
|
+
|
86
|
+
specify "should respond correctly to the 'each_pair' method" do
|
87
|
+
@response.each_pair {|k,v|
|
88
|
+
case k
|
89
|
+
when "name"
|
90
|
+
v.should.equal "foo"
|
91
|
+
when "number"
|
92
|
+
v.should.equal '123'
|
93
|
+
end
|
94
|
+
}
|
95
|
+
end
|
96
|
+
|
97
|
+
specify "should return the original amazon XML response in the 'xml' attribute of the response object." do
|
98
|
+
@response.xml.should.equal @http_xml
|
99
|
+
end
|
100
|
+
|
101
|
+
|
102
|
+
end
|
@@ -0,0 +1,205 @@
|
|
1
|
+
#--
|
2
|
+
# Amazon Web Services EC2 Query API Ruby library
|
3
|
+
#
|
4
|
+
# Ruby Gem Name:: amazon-ec2
|
5
|
+
# Author:: Glenn Rempe (mailto:glenn@elasticworkbench.com)
|
6
|
+
# Copyright:: Copyright (c) 2007 Glenn Rempe
|
7
|
+
# License:: Distributes under the same terms as Ruby
|
8
|
+
# Home:: http://amazon-ec2.rubyforge.org
|
9
|
+
#++
|
10
|
+
|
11
|
+
require File.dirname(__FILE__) + '/test_helper.rb'
|
12
|
+
|
13
|
+
context "EC2 security groups " do
|
14
|
+
|
15
|
+
setup do
|
16
|
+
@ec2 = EC2::Base.new( :access_key_id => "not a key", :secret_access_key => "not a secret" )
|
17
|
+
|
18
|
+
@create_security_group_response_body = <<-RESPONSE
|
19
|
+
<CreateSecurityGroupResponse xmlns="http://ec2.amazonaws.com/doc/2007-01-19">
|
20
|
+
<return>true</return>
|
21
|
+
</CreateSecurityGroupResponse>
|
22
|
+
RESPONSE
|
23
|
+
|
24
|
+
@delete_security_group_response_body = <<-RESPONSE
|
25
|
+
<DeleteSecurityGroupResponse xmlns="http://ec2.amazonaws.com/doc/2007-01-19">
|
26
|
+
<return>true</return>
|
27
|
+
</DeleteSecurityGroupResponse>
|
28
|
+
RESPONSE
|
29
|
+
|
30
|
+
@describe_security_groups_response_body = <<-RESPONSE
|
31
|
+
<DescribeSecurityGroupsResponse xm-lns="http://ec2.amazonaws.com/doc/2007-01-19">
|
32
|
+
<securityGroupInfo>
|
33
|
+
<item>
|
34
|
+
<ownerId>UYY3TLBUXIEON5NQVUUX6OMPWBZIQNFM</ownerId>
|
35
|
+
<groupName>WebServers</groupName>
|
36
|
+
<groupDescription>Web</groupDescription>
|
37
|
+
<ipPermissions>
|
38
|
+
<item>
|
39
|
+
<ipProtocol>tcp</ipProtocol>
|
40
|
+
<fromPort>80</fromPort>
|
41
|
+
<toPort>80</toPort>
|
42
|
+
<groups/>
|
43
|
+
<ipRanges>
|
44
|
+
<item>
|
45
|
+
<cidrIp>0.0.0.0/0</cidrIp>
|
46
|
+
</item>
|
47
|
+
</ipRanges>
|
48
|
+
</item>
|
49
|
+
</ipPermissions>
|
50
|
+
</item>
|
51
|
+
<item>
|
52
|
+
<ownerId>UYY3TLBUXIEON5NQVUUX6OMPWBZIQNFM</ownerId>
|
53
|
+
<groupName>RangedPortsBySource</groupName>
|
54
|
+
<groupDescription>A</groupDescription>
|
55
|
+
<ipPermissions>
|
56
|
+
<item>
|
57
|
+
<ipProtocol>tcp</ipProtocol>
|
58
|
+
<fromPort>6000</fromPort>
|
59
|
+
<toPort>7000</toPort>
|
60
|
+
<groups/>
|
61
|
+
<ipRanges/>
|
62
|
+
</item>
|
63
|
+
</ipPermissions>
|
64
|
+
</item>
|
65
|
+
</securityGroupInfo>
|
66
|
+
</DescribeSecurityGroupsResponse>
|
67
|
+
RESPONSE
|
68
|
+
|
69
|
+
@authorize_security_group_ingress_response_body = <<-RESPONSE
|
70
|
+
<AuthorizeSecurityGroupIngressResponse xm-lns="http://ec2.amazonaws.com/doc/2007-01-19">
|
71
|
+
<return>true</return>
|
72
|
+
</AuthorizeSecurityGroupIngressResponse>
|
73
|
+
RESPONSE
|
74
|
+
|
75
|
+
@revoke_security_group_ingress_response_body = <<-RESPONSE
|
76
|
+
<RevokeSecurityGroupIngressResponse xm-lns="http://ec2.amazonaws.com/doc/2007-01-19">
|
77
|
+
<return>true</return>
|
78
|
+
</RevokeSecurityGroupIngressResponse>
|
79
|
+
RESPONSE
|
80
|
+
|
81
|
+
end
|
82
|
+
|
83
|
+
|
84
|
+
specify "should be able to be created" do
|
85
|
+
@ec2.stubs(:make_request).with('CreateSecurityGroup', {"GroupName"=>"WebServers", "GroupDescription"=>"Web"}).
|
86
|
+
returns stub(:body => @create_security_group_response_body, :is_a? => true)
|
87
|
+
@ec2.create_security_group( :group_name => "WebServers", :group_description => "Web" ).should.be.an.instance_of EC2::Response
|
88
|
+
end
|
89
|
+
|
90
|
+
|
91
|
+
specify "method create_security_group should reject bad arguments" do
|
92
|
+
@ec2.stubs(:make_request).with('CreateSecurityGroup', {"GroupName"=>"WebServers", "GroupDescription"=>"Web"}).
|
93
|
+
returns stub(:body => @create_security_group_response_body, :is_a? => true)
|
94
|
+
|
95
|
+
lambda { @ec2.create_security_group( :group_name => "WebServers", :group_description => "Web" ) }.should.not.raise(EC2::ArgumentError)
|
96
|
+
lambda { @ec2.create_security_group() }.should.raise(EC2::ArgumentError)
|
97
|
+
|
98
|
+
# :group_name can't be nil or empty
|
99
|
+
lambda { @ec2.create_security_group( :group_name => "", :group_description => "Web" ) }.should.raise(EC2::ArgumentError)
|
100
|
+
lambda { @ec2.create_security_group( :group_name => nil, :group_description => "Web" ) }.should.raise(EC2::ArgumentError)
|
101
|
+
|
102
|
+
# :group_description can't be nil or empty
|
103
|
+
lambda { @ec2.create_security_group( :group_name => "WebServers", :group_description => "" ) }.should.raise(EC2::ArgumentError)
|
104
|
+
lambda { @ec2.create_security_group( :group_name => "WebServers", :group_description => nil ) }.should.raise(EC2::ArgumentError)
|
105
|
+
end
|
106
|
+
|
107
|
+
|
108
|
+
specify "should be able to be deleted" do
|
109
|
+
@ec2.stubs(:make_request).with('DeleteSecurityGroup', {"GroupName"=>"WebServers"}).
|
110
|
+
returns stub(:body => @delete_security_group_response_body, :is_a? => true)
|
111
|
+
@ec2.delete_security_group( :group_name => "WebServers" ).should.be.an.instance_of EC2::Response
|
112
|
+
end
|
113
|
+
|
114
|
+
|
115
|
+
specify "method delete_security_group should reject bad arguments" do
|
116
|
+
@ec2.stubs(:make_request).with('DeleteSecurityGroup', {"GroupName"=>"WebServers"}).
|
117
|
+
returns stub(:body => @delete_security_group_response_body, :is_a? => true)
|
118
|
+
|
119
|
+
lambda { @ec2.delete_security_group( :group_name => "WebServers" ) }.should.not.raise(EC2::ArgumentError)
|
120
|
+
lambda { @ec2.delete_security_group() }.should.raise(EC2::ArgumentError)
|
121
|
+
|
122
|
+
# :group_name can't be nil or empty
|
123
|
+
lambda { @ec2.delete_security_group( :group_name => "" ) }.should.raise(EC2::ArgumentError)
|
124
|
+
lambda { @ec2.delete_security_group( :group_name => nil ) }.should.raise(EC2::ArgumentError)
|
125
|
+
end
|
126
|
+
|
127
|
+
|
128
|
+
specify "should be able to be described with describe_security_groups" do
|
129
|
+
@ec2.stubs(:make_request).with('DescribeSecurityGroups', { "GroupName.1" => "WebServers", "GroupName.2" => "RangedPortsBySource" }).
|
130
|
+
returns stub(:body => @describe_security_groups_response_body, :is_a? => true)
|
131
|
+
@ec2.describe_security_groups( :group_name => ["WebServers", "RangedPortsBySource"] ).should.be.an.instance_of EC2::Response
|
132
|
+
|
133
|
+
response = @ec2.describe_security_groups( :group_name => ["WebServers", "RangedPortsBySource"] )
|
134
|
+
|
135
|
+
response.securityGroupInfo.item[0].ownerId.should.equal "UYY3TLBUXIEON5NQVUUX6OMPWBZIQNFM"
|
136
|
+
response.securityGroupInfo.item[0].groupName.should.equal "WebServers"
|
137
|
+
response.securityGroupInfo.item[0].groupDescription.should.equal "Web"
|
138
|
+
response.securityGroupInfo.item[0].ipPermissions.item[0].ipProtocol.should.equal "tcp"
|
139
|
+
response.securityGroupInfo.item[0].ipPermissions.item[0].fromPort.should.equal "80"
|
140
|
+
response.securityGroupInfo.item[0].ipPermissions.item[0].toPort.should.equal "80"
|
141
|
+
response.securityGroupInfo.item[0].ipPermissions.item[0].groups.should.be.nil
|
142
|
+
response.securityGroupInfo.item[0].ipPermissions.item[0].ipRanges.item[0].cidrIp.should.equal "0.0.0.0/0"
|
143
|
+
|
144
|
+
response.securityGroupInfo.item[1].ownerId.should.equal "UYY3TLBUXIEON5NQVUUX6OMPWBZIQNFM"
|
145
|
+
response.securityGroupInfo.item[1].groupName.should.equal "RangedPortsBySource"
|
146
|
+
response.securityGroupInfo.item[1].groupDescription.should.equal "A"
|
147
|
+
response.securityGroupInfo.item[1].ipPermissions.item[0].ipProtocol.should.equal "tcp"
|
148
|
+
response.securityGroupInfo.item[1].ipPermissions.item[0].fromPort.should.equal "6000"
|
149
|
+
response.securityGroupInfo.item[1].ipPermissions.item[0].toPort.should.equal "7000"
|
150
|
+
response.securityGroupInfo.item[1].ipPermissions.item[0].groups.should.be.nil
|
151
|
+
response.securityGroupInfo.item[1].ipPermissions.item[0].ipRanges.should.be.nil
|
152
|
+
end
|
153
|
+
|
154
|
+
|
155
|
+
specify "method describe_security_groups should reject bad arguments" do
|
156
|
+
@ec2.stubs(:make_request).with('DescribeSecurityGroups', {"GroupName.1"=>"WebServers"}).
|
157
|
+
returns stub(:body => @describe_security_groups_response_body, :is_a? => true)
|
158
|
+
|
159
|
+
lambda { @ec2.describe_security_groups( :group_name => "WebServers" ) }.should.not.raise(EC2::ArgumentError)
|
160
|
+
|
161
|
+
end
|
162
|
+
|
163
|
+
|
164
|
+
specify "permissions should be able to be added to a security group with authorize_security_group_ingress." do
|
165
|
+
@ec2.stubs(:make_request).with('AuthorizeSecurityGroupIngress', { "GroupName"=>"WebServers",
|
166
|
+
"IpProtocol"=>"tcp",
|
167
|
+
"FromPort"=>"8000",
|
168
|
+
"ToPort"=>"80",
|
169
|
+
"CidrIp"=>"0.0.0.0/24",
|
170
|
+
"SourceSecurityGroupName"=>"Source SG Name",
|
171
|
+
"SourceSecurityGroupOwnerId"=>"123"}).
|
172
|
+
returns stub(:body => @authorize_security_group_ingress_response_body, :is_a? => true)
|
173
|
+
|
174
|
+
@ec2.authorize_security_group_ingress( :group_name => "WebServers",
|
175
|
+
:ip_protocol => "tcp",
|
176
|
+
:from_port => "8000",
|
177
|
+
:to_port => "80",
|
178
|
+
:cidr_ip => "0.0.0.0/24",
|
179
|
+
:source_security_group_name => "Source SG Name",
|
180
|
+
:source_security_group_owner_id => "123"
|
181
|
+
).should.be.an.instance_of EC2::Response
|
182
|
+
end
|
183
|
+
|
184
|
+
|
185
|
+
specify "permissions should be able to be revoked from a security group with revoke_security_group_ingress." do
|
186
|
+
@ec2.stubs(:make_request).with('RevokeSecurityGroupIngress', { "GroupName"=>"WebServers",
|
187
|
+
"IpProtocol"=>"tcp",
|
188
|
+
"FromPort"=>"8000",
|
189
|
+
"ToPort"=>"80",
|
190
|
+
"CidrIp"=>"0.0.0.0/24",
|
191
|
+
"SourceSecurityGroupName"=>"Source SG Name",
|
192
|
+
"SourceSecurityGroupOwnerId"=>"123"}).
|
193
|
+
returns stub(:body => @revoke_security_group_ingress_response_body, :is_a? => true)
|
194
|
+
|
195
|
+
@ec2.revoke_security_group_ingress( :group_name => "WebServers",
|
196
|
+
:ip_protocol => "tcp",
|
197
|
+
:from_port => "8000",
|
198
|
+
:to_port => "80",
|
199
|
+
:cidr_ip => "0.0.0.0/24",
|
200
|
+
:source_security_group_name => "Source SG Name",
|
201
|
+
:source_security_group_owner_id => "123"
|
202
|
+
).should.be.an.instance_of EC2::Response
|
203
|
+
end
|
204
|
+
|
205
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
#--
|
2
|
+
# Amazon Web Services EC2 Query API Ruby library
|
3
|
+
#
|
4
|
+
# Ruby Gem Name:: amazon-ec2
|
5
|
+
# Author:: Glenn Rempe (mailto:glenn@elasticworkbench.com)
|
6
|
+
# Copyright:: Copyright (c) 2007 Glenn Rempe
|
7
|
+
# License:: Distributes under the same terms as Ruby
|
8
|
+
# Home:: http://amazon-ec2.rubyforge.org
|
9
|
+
#++
|
10
|
+
|
11
|
+
require File.dirname(__FILE__) + '/test_helper.rb'
|
12
|
+
|
13
|
+
context "The EC2 Gem " do
|
14
|
+
|
15
|
+
|
16
|
+
setup do
|
17
|
+
@major = 0
|
18
|
+
@minor = 2
|
19
|
+
@tiny = 0
|
20
|
+
@string = [@major, @minor, @tiny].join('.')
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
specify "should have an up to date MAJOR version" do
|
25
|
+
EC2::VERSION::MAJOR.should.equal @major
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
specify "should have an up to date MINOR version" do
|
30
|
+
EC2::VERSION::MINOR.should.equal @minor
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
specify "should have an up to date TINY version" do
|
35
|
+
EC2::VERSION::TINY.should.equal @tiny
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
specify "should return a proper version string when #STRING is called" do
|
40
|
+
EC2::VERSION::STRING.should.equal @string
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
end
|