rudy 0.8.5 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES.txt +110 -18
- data/README.rdoc +40 -44
- data/Rudyfile +35 -50
- data/bin/rudy +88 -57
- data/bin/rudy-ec2 +2 -16
- data/bin/rudy-s3 +0 -10
- data/bin/rudy-sdb +11 -12
- data/lib/rudy.rb +59 -91
- data/lib/rudy/aws.rb +4 -45
- data/lib/rudy/aws/ec2.rb +57 -20
- data/lib/rudy/aws/ec2/address.rb +10 -11
- data/lib/rudy/aws/ec2/group.rb +10 -9
- data/lib/rudy/aws/ec2/image.rb +8 -8
- data/lib/rudy/aws/ec2/instance.rb +18 -19
- data/lib/rudy/aws/ec2/keypair.rb +14 -19
- data/lib/rudy/aws/ec2/snapshot.rb +16 -9
- data/lib/rudy/aws/ec2/volume.rb +39 -26
- data/lib/rudy/aws/ec2/zone.rb +5 -4
- data/lib/rudy/aws/s3.rb +2 -1
- data/lib/rudy/aws/sdb.rb +35 -86
- data/lib/rudy/backups.rb +24 -0
- data/lib/rudy/cli.rb +5 -131
- data/lib/rudy/cli/aws/ec2/addresses.rb +19 -27
- data/lib/rudy/cli/aws/ec2/candy.rb +45 -20
- data/lib/rudy/cli/aws/ec2/groups.rb +9 -13
- data/lib/rudy/cli/aws/ec2/images.rb +5 -133
- data/lib/rudy/cli/aws/ec2/instances.rb +25 -25
- data/lib/rudy/cli/aws/ec2/keypairs.rb +7 -11
- data/lib/rudy/cli/aws/ec2/snapshots.rb +5 -9
- data/lib/rudy/cli/aws/ec2/volumes.rb +22 -23
- data/lib/rudy/cli/aws/ec2/zones.rb +2 -3
- data/lib/rudy/cli/aws/sdb/domains.rb +5 -6
- data/lib/rudy/cli/aws/sdb/objects.rb +33 -0
- data/lib/rudy/cli/aws/sdb/select.rb +23 -0
- data/lib/rudy/cli/backups.rb +38 -0
- data/lib/rudy/cli/base.rb +104 -0
- data/lib/rudy/cli/candy.rb +1 -2
- data/lib/rudy/cli/config.rb +20 -7
- data/lib/rudy/cli/disks.rb +7 -9
- data/lib/rudy/cli/execbase.rb +56 -0
- data/lib/rudy/cli/machines.rb +242 -45
- data/lib/rudy/cli/metadata.rb +24 -10
- data/lib/rudy/cli/networks.rb +34 -0
- data/lib/rudy/cli/routines.rb +32 -6
- data/lib/rudy/cli/status.rb +60 -0
- data/lib/rudy/config.rb +55 -32
- data/lib/rudy/config/objects.rb +44 -30
- data/lib/rudy/disks.rb +25 -0
- data/lib/rudy/exceptions.rb +99 -0
- data/lib/rudy/global.rb +67 -28
- data/lib/rudy/guidelines.rb +3 -2
- data/lib/rudy/huxtable.rb +67 -58
- data/lib/rudy/machines.rb +41 -263
- data/lib/rudy/metadata.rb +212 -38
- data/lib/rudy/metadata/backup.rb +123 -78
- data/lib/rudy/metadata/disk.rb +153 -170
- data/lib/rudy/metadata/machine.rb +179 -0
- data/lib/rudy/mixins.rb +2 -1
- data/lib/rudy/mixins/hash.rb +3 -1
- data/lib/rudy/mixins/symbol.rb +8 -0
- data/lib/rudy/routines.rb +127 -344
- data/lib/rudy/routines/base.rb +229 -0
- data/lib/rudy/routines/handlers/base.rb +48 -0
- data/lib/rudy/routines/handlers/depends.rb +49 -0
- data/lib/rudy/routines/handlers/disks.rb +249 -0
- data/lib/rudy/routines/handlers/group.rb +44 -0
- data/lib/rudy/routines/handlers/host.rb +70 -0
- data/lib/rudy/routines/handlers/keypair.rb +70 -0
- data/lib/rudy/routines/handlers/machines.rb +15 -0
- data/lib/rudy/routines/handlers/script.rb +85 -0
- data/lib/rudy/routines/handlers/user.rb +45 -0
- data/lib/rudy/routines/passthrough.rb +19 -23
- data/lib/rudy/routines/reboot.rb +98 -50
- data/lib/rudy/routines/shutdown.rb +65 -14
- data/lib/rudy/routines/startup.rb +112 -17
- data/lib/rudy/utils.rb +35 -68
- data/rudy.gemspec +82 -25
- data/tryouts/01_mixins/01_hash_tryouts.rb +20 -0
- data/tryouts/10_require_time/10_rudy_tryouts.rb +33 -0
- data/tryouts/10_require_time/15_global_tryouts.rb +58 -0
- data/tryouts/12_config/10_load_config_tryouts.rb +43 -0
- data/tryouts/12_config/20_defaults_tryouts.rb +16 -0
- data/tryouts/12_config/30_accounts_tryouts.rb +17 -0
- data/tryouts/12_config/40_machines_tryouts.rb +53 -0
- data/tryouts/12_config/50_commands_tryouts.rb +17 -0
- data/tryouts/12_config/60_routines_tryouts.rb +16 -0
- data/tryouts/15_huxtable/10_huxtable_tryouts.rb +47 -0
- data/tryouts/15_huxtable/20_user_tryouts.rb +47 -0
- data/tryouts/20_simpledb/10_domains_tryouts.rb +36 -0
- data/tryouts/20_simpledb/20_objects_tryouts.rb +56 -0
- data/tryouts/25_ec2/10_keypairs_tryouts.rb +54 -0
- data/tryouts/25_ec2/20_groups_tryouts.rb +56 -0
- data/tryouts/25_ec2/21_groups_authorize_address_tryouts.rb +53 -0
- data/tryouts/25_ec2/22_groups_authorize_account_tryouts.rb +54 -0
- data/tryouts/25_ec2/30_addresses_tryouts.rb +42 -0
- data/tryouts/25_ec2/40_volumes_tryouts.rb +53 -0
- data/tryouts/25_ec2/50_snapshots_tryouts.rb +75 -0
- data/tryouts/26_ec2_instances/10_instance_tryouts.rb +107 -0
- data/tryouts/26_ec2_instances/50_images_tryouts.rb +7 -0
- data/tryouts/30_metadata/10_include_tryouts.rb +45 -0
- data/tryouts/30_metadata/13_object_tryouts.rb +19 -0
- data/tryouts/30_metadata/50_disk_tryouts.rb +115 -0
- data/tryouts/30_metadata/51_disk_digest_tryouts.rb +24 -0
- data/tryouts/30_metadata/53_disk_list_tryouts.rb +35 -0
- data/tryouts/30_metadata/56_disk_volume_tryouts.rb +68 -0
- data/tryouts/30_metadata/60_backup_tryouts.rb +101 -0
- data/tryouts/30_metadata/63_backup_list_tryouts.rb +38 -0
- data/tryouts/30_metadata/64_backup_disk_tryouts.rb +65 -0
- data/tryouts/30_metadata/66_backup_snapshot_tryouts.rb +76 -0
- data/tryouts/30_metadata/70_machine_tryouts.rb +85 -0
- data/tryouts/30_metadata/73_machine_list_tryouts.rb +58 -0
- data/tryouts/30_metadata/76_machine_instance_tryouts.rb +64 -0
- data/tryouts/30_metadata/77_machines_tryouts.rb +45 -0
- data/tryouts/40_routines/10_keypair_handler_tryouts.rb +52 -0
- data/tryouts/40_routines/11_group_handler_tryouts.rb +36 -0
- data/tryouts/80_cli/10_rudyec2_tryouts.rb +8 -0
- data/tryouts/80_cli/60_rudy_tryouts.rb +41 -0
- data/tryouts/exploration/console.rb +91 -0
- data/tryouts/exploration/machine.rb +23 -0
- data/tryouts/failer +6 -0
- metadata +116 -32
- data/bin/ird +0 -153
- data/lib/rudy/metadata/backups.rb +0 -67
- data/lib/rudy/metadata/debug.rb +0 -38
- data/lib/rudy/metadata/disks.rb +0 -67
- data/lib/rudy/metadata/objectbase.rb +0 -108
- data/lib/rudy/routines/helper.rb +0 -76
- data/lib/rudy/routines/helpers/dependshelper.rb +0 -34
- data/lib/rudy/routines/helpers/diskhelper.rb +0 -403
- data/lib/rudy/routines/helpers/scripthelper.rb +0 -197
- data/lib/rudy/routines/helpers/userhelper.rb +0 -37
- data/support/rudy-ec2-startup +0 -200
@@ -0,0 +1,54 @@
|
|
1
|
+
|
2
|
+
group "EC2"
|
3
|
+
library :rudy, 'lib'
|
4
|
+
|
5
|
+
|
6
|
+
tryouts "Keypairs" do
|
7
|
+
set :global, Rudy::Huxtable.global
|
8
|
+
set :keypair_name, 'key-' << Rudy::Utils.strand
|
9
|
+
|
10
|
+
setup do
|
11
|
+
Rudy::Huxtable.update_config
|
12
|
+
Rudy::AWS::EC2.connect global.accesskey, global.secretkey, global.region
|
13
|
+
end
|
14
|
+
|
15
|
+
drill "no existing keypairs", false do
|
16
|
+
Rudy::AWS::EC2::Keypairs.any?
|
17
|
+
end
|
18
|
+
|
19
|
+
dream [Rudy::AWS::EC2::Keypair, false]
|
20
|
+
drill "create keypair" do
|
21
|
+
k = Rudy::AWS::EC2::Keypairs.create keypair_name
|
22
|
+
[k.class, k.private_key.nil?]
|
23
|
+
end
|
24
|
+
|
25
|
+
drill "get keypair", :class, Rudy::AWS::EC2::Keypair do
|
26
|
+
Rudy::AWS::EC2::Keypairs.get keypair_name
|
27
|
+
end
|
28
|
+
|
29
|
+
drill "has fingerprint", :empty?, false do
|
30
|
+
k = Rudy::AWS::EC2::Keypairs.get keypair_name
|
31
|
+
k.fingerprint
|
32
|
+
end
|
33
|
+
|
34
|
+
drill "private key is not available later", nil do
|
35
|
+
k = Rudy::AWS::EC2::Keypairs.get keypair_name
|
36
|
+
k.private_key
|
37
|
+
end
|
38
|
+
|
39
|
+
dream :class, Array
|
40
|
+
dream :empty?, false
|
41
|
+
drill "list keypairs" do
|
42
|
+
Rudy::AWS::EC2::Keypairs.list
|
43
|
+
end
|
44
|
+
|
45
|
+
drill "destroy keypairs", nil do
|
46
|
+
keypairs = Rudy::AWS::EC2::Keypairs.list
|
47
|
+
keypairs.each do |kp|
|
48
|
+
Rudy::AWS::EC2::Keypairs.destroy kp.name
|
49
|
+
end
|
50
|
+
Rudy::AWS::EC2::Keypairs.list
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
@@ -0,0 +1,56 @@
|
|
1
|
+
group "EC2"
|
2
|
+
library :rudy, 'lib'
|
3
|
+
|
4
|
+
tryouts "Groups" do
|
5
|
+
set :global, Rudy::Huxtable.global
|
6
|
+
set :group_name, 'grp-' << Rudy::Utils.strand
|
7
|
+
set :group_desc, 'desc-' << group_name
|
8
|
+
setup do
|
9
|
+
Rudy::Huxtable.update_config
|
10
|
+
Rudy::AWS::EC2.connect global.accesskey, global.secretkey, global.region
|
11
|
+
end
|
12
|
+
|
13
|
+
dream :class, Rudy::AWS::EC2::Group
|
14
|
+
dream :name, group_name
|
15
|
+
dream :description, "Security Group #{group_name}"
|
16
|
+
drill "create group with name" do
|
17
|
+
Rudy::AWS::EC2::Groups.create group_name
|
18
|
+
end
|
19
|
+
|
20
|
+
dream :class, Rudy::AWS::EC2::Group
|
21
|
+
dream :name, "#{group_name}2"
|
22
|
+
dream :description, group_desc
|
23
|
+
drill "create group with name and description" do
|
24
|
+
Rudy::AWS::EC2::Groups.create "#{group_name}2", group_desc
|
25
|
+
end
|
26
|
+
|
27
|
+
drill "list as Array", :class, Array do
|
28
|
+
Rudy::AWS::EC2::Groups.list
|
29
|
+
end
|
30
|
+
|
31
|
+
drill "list as Hash", :class, Hash do
|
32
|
+
Rudy::AWS::EC2::Groups.list_as_hash
|
33
|
+
end
|
34
|
+
|
35
|
+
dream :size, 1 # will equal 2 if test fails
|
36
|
+
drill "list returns Group objects" do
|
37
|
+
list = Rudy::AWS::EC2::Groups.list
|
38
|
+
list.collect! do |group|
|
39
|
+
group.is_a?(Rudy::AWS::EC2::Group)
|
40
|
+
end
|
41
|
+
list.uniq
|
42
|
+
end
|
43
|
+
|
44
|
+
dream :class, Array
|
45
|
+
dream :size, 1
|
46
|
+
drill "destroy groups" do
|
47
|
+
list = Rudy::AWS::EC2::Groups.list
|
48
|
+
list.collect! do |group|
|
49
|
+
next if group.name == "default" # can't delete this default group
|
50
|
+
Rudy::AWS::EC2::Groups.destroy group.name
|
51
|
+
end
|
52
|
+
Rudy::AWS::EC2::Groups.list
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
|
@@ -0,0 +1,53 @@
|
|
1
|
+
group "EC2"
|
2
|
+
library :rudy, 'lib'
|
3
|
+
|
4
|
+
tryouts "Groups Authorize Address" do
|
5
|
+
set :global, Rudy::Huxtable.global
|
6
|
+
set :group_name, 'grp-' << Rudy::Utils.strand
|
7
|
+
set :protocols, ['tcp', 'udp']
|
8
|
+
set :external_ip, Rudy::Utils::external_ip_address || '192.168.0.1/32'
|
9
|
+
set :addresses, [external_ip]
|
10
|
+
set :ports, [[3100,3150],[3200,3250]]
|
11
|
+
setup do
|
12
|
+
Rudy::Huxtable.update_config
|
13
|
+
Rudy::AWS::EC2.connect global.accesskey, global.secretkey, global.region
|
14
|
+
Rudy::AWS::EC2::Groups.create group_name
|
15
|
+
end
|
16
|
+
clean do
|
17
|
+
Rudy::AWS::EC2::Groups.destroy group_name
|
18
|
+
end
|
19
|
+
|
20
|
+
drill "authorize group rules returns true", true do
|
21
|
+
Rudy::AWS::EC2::Groups.authorize group_name, addresses, ports, protocols
|
22
|
+
end
|
23
|
+
|
24
|
+
dream :proc, lambda { |group|
|
25
|
+
group.addresses.each_pair do |address,rules|
|
26
|
+
return false unless rules.is_a? Array
|
27
|
+
return false unless rules.size == 7
|
28
|
+
end
|
29
|
+
true
|
30
|
+
}
|
31
|
+
drill "group (#{group_name}) contains new rules" do
|
32
|
+
stash :group, Rudy::AWS::EC2::Groups.get(group_name)
|
33
|
+
end
|
34
|
+
|
35
|
+
drill "revoke group rules returns true", true do
|
36
|
+
Rudy::AWS::EC2::Groups.revoke(group_name, addresses, ports, protocols)
|
37
|
+
end
|
38
|
+
|
39
|
+
dream :proc, lambda { |group|
|
40
|
+
group.addresses.each_pair do |address,rules|
|
41
|
+
return false unless rules.is_a? Array
|
42
|
+
return false unless rules.size == 3
|
43
|
+
end
|
44
|
+
true
|
45
|
+
}
|
46
|
+
drill "group does not contain new rules" do
|
47
|
+
group = Rudy::AWS::EC2::Groups.get(group_name)
|
48
|
+
stash :group, group
|
49
|
+
group
|
50
|
+
end
|
51
|
+
|
52
|
+
|
53
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
group "EC2"
|
2
|
+
library :rudy, 'lib'
|
3
|
+
|
4
|
+
tryouts "Groups Authorize/Revoke Account" do
|
5
|
+
set :global, Rudy::Huxtable.global
|
6
|
+
set :group_name, 'grp-' << Rudy::Utils.strand
|
7
|
+
setup do
|
8
|
+
Rudy::Huxtable.update_config
|
9
|
+
Rudy::AWS::EC2.connect global.accesskey, global.secretkey, global.region
|
10
|
+
Rudy::AWS::EC2::Groups.create group_name
|
11
|
+
end
|
12
|
+
clean do
|
13
|
+
Rudy::AWS::EC2::Groups.destroy group_name
|
14
|
+
end
|
15
|
+
|
16
|
+
dream :class, String
|
17
|
+
dream :empty?, false
|
18
|
+
drill "has account num" do
|
19
|
+
Rudy::Huxtable.config.accounts.aws.accountnum
|
20
|
+
end
|
21
|
+
|
22
|
+
drill "authorize group rules returns true", true do
|
23
|
+
accountnum = Rudy::Huxtable.config.accounts.aws.accountnum
|
24
|
+
Rudy::AWS::EC2::Groups.authorize_group group_name, group_name, accountnum
|
25
|
+
end
|
26
|
+
|
27
|
+
dream :class, Rudy::AWS::EC2::Group
|
28
|
+
dream :proc, lambda { |group|
|
29
|
+
accountnum = Rudy::Huxtable.config.accounts.aws.accountnum
|
30
|
+
should_have = "#{accountnum}:#{group_name}"
|
31
|
+
return false unless group.groups.is_a?(Hash)
|
32
|
+
group.groups.has_key?(should_have) == true
|
33
|
+
}
|
34
|
+
drill "group (#{group_name}) contains new rules" do
|
35
|
+
stash :group, Rudy::AWS::EC2::Groups.get(group_name)
|
36
|
+
end
|
37
|
+
|
38
|
+
drill "revoke group rules returns true", true do
|
39
|
+
accountnum = Rudy::Huxtable.config.accounts.aws.accountnum
|
40
|
+
Rudy::AWS::EC2::Groups.revoke_group group_name, group_name, accountnum
|
41
|
+
end
|
42
|
+
|
43
|
+
dream :proc, lambda { |group|
|
44
|
+
accountnum = Rudy::Huxtable.config.accounts.aws.accountnum
|
45
|
+
should_have = "#{accountnum}:#{group_name}"
|
46
|
+
return false unless group.groups.is_a?(Hash)
|
47
|
+
group.groups.has_key?(should_have) == false
|
48
|
+
}
|
49
|
+
drill "group (#{group_name}) does not contain new rules" do
|
50
|
+
stash :group, Rudy::AWS::EC2::Groups.get(group_name)
|
51
|
+
end
|
52
|
+
|
53
|
+
|
54
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
group "EC2"
|
2
|
+
library :rudy, 'lib'
|
3
|
+
|
4
|
+
tryouts "Addresses" do
|
5
|
+
set :global, Rudy::Huxtable.global
|
6
|
+
set :group_name, 'grp-' << Rudy::Utils.strand
|
7
|
+
set :group_desc, 'desc-' << group_name
|
8
|
+
setup do
|
9
|
+
Rudy::Huxtable.update_config
|
10
|
+
Rudy::AWS::EC2.connect global.accesskey, global.secretkey, global.region
|
11
|
+
end
|
12
|
+
|
13
|
+
drill "should not be existing addresses", false do
|
14
|
+
Rudy::AWS::EC2::Addresses.any?
|
15
|
+
end
|
16
|
+
|
17
|
+
dream :class, Rudy::AWS::EC2::Address
|
18
|
+
dream :proc, lambda { |a| a.ipaddress.size > 0 }
|
19
|
+
drill "create address" do
|
20
|
+
Rudy::AWS::EC2::Addresses.create
|
21
|
+
end
|
22
|
+
|
23
|
+
dream :class, Array
|
24
|
+
dream :empty?, false
|
25
|
+
drill "list addresses" do
|
26
|
+
stash :address, Rudy::AWS::EC2::Addresses.list
|
27
|
+
end
|
28
|
+
|
29
|
+
dream :class, Hash
|
30
|
+
dream :empty?, false
|
31
|
+
drill "list addresses as Hash" do
|
32
|
+
Rudy::AWS::EC2::Addresses.list_as_hash
|
33
|
+
end
|
34
|
+
|
35
|
+
drill "destroy all addresses", true do
|
36
|
+
Rudy::AWS::EC2::Addresses.list.each do |a|
|
37
|
+
Rudy::AWS::EC2::Addresses.destroy a
|
38
|
+
end
|
39
|
+
Rudy::AWS::EC2::Addresses.list.nil?
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
group "EC2"
|
2
|
+
library :rudy, 'lib'
|
3
|
+
|
4
|
+
tryouts "Volumes" do
|
5
|
+
set :global, Rudy::Huxtable.global
|
6
|
+
setup do
|
7
|
+
Rudy::Huxtable.update_config
|
8
|
+
Rudy::AWS::EC2.connect global.accesskey, global.secretkey, global.region
|
9
|
+
end
|
10
|
+
|
11
|
+
drill "no existing volumes", false do
|
12
|
+
Rudy::AWS::EC2::Volumes.any? :available
|
13
|
+
end
|
14
|
+
|
15
|
+
dream :class, Rudy::AWS::EC2::Volume
|
16
|
+
dream :size, 2
|
17
|
+
dream(:zone) { Rudy::Huxtable.global.zone }
|
18
|
+
dream :proc, lambda { |v| !v.awsid.nil? }
|
19
|
+
drill "create a 2GB volume" do
|
20
|
+
Rudy::AWS::EC2::Volumes.create 2, Rudy::Huxtable.global.zone
|
21
|
+
end
|
22
|
+
|
23
|
+
dream :class, Array
|
24
|
+
dream :empty?, false
|
25
|
+
drill "list available volumes" do
|
26
|
+
Rudy::AWS::EC2::Volumes.list :available
|
27
|
+
end
|
28
|
+
|
29
|
+
dream :class, Hash
|
30
|
+
dream :empty?, false
|
31
|
+
drill "list available volumes as hash" do
|
32
|
+
Rudy::AWS::EC2::Volumes.list_as_hash :available
|
33
|
+
end
|
34
|
+
|
35
|
+
dream :class, Rudy::AWS::EC2::Volume
|
36
|
+
dream :size, 2
|
37
|
+
dream :available?, true
|
38
|
+
drill "get a specific volume" do
|
39
|
+
volid = Rudy::AWS::EC2::Volumes.list(:available).first.awsid
|
40
|
+
Rudy::AWS::EC2::Volumes.get volid
|
41
|
+
end
|
42
|
+
|
43
|
+
drill "destroy all volumes", false do
|
44
|
+
volumes = Rudy::AWS::EC2::Volumes.list
|
45
|
+
volumes.each do |vol|
|
46
|
+
next unless vol.available?
|
47
|
+
Rudy::AWS::EC2::Volumes.destroy(vol.awsid)
|
48
|
+
end
|
49
|
+
Rudy::AWS::EC2::Volumes.any? :available
|
50
|
+
end
|
51
|
+
|
52
|
+
|
53
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
group "EC2"
|
2
|
+
library :rudy, 'lib'
|
3
|
+
|
4
|
+
tryouts "Snapshots" do
|
5
|
+
set :global, Rudy::Huxtable.global
|
6
|
+
setup do
|
7
|
+
Rudy::Huxtable.update_config
|
8
|
+
Rudy::AWS::EC2.connect global.accesskey, global.secretkey, global.region
|
9
|
+
Rudy::AWS::EC2::Volumes.create 3, global.zone
|
10
|
+
end
|
11
|
+
clean do
|
12
|
+
Rudy::AWS::EC2::Volumes.list(:available) do |v|
|
13
|
+
Rudy::AWS::EC2::Volumes.destroy v
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
drill "no existing snapshots", false do
|
18
|
+
Rudy::AWS::EC2::Snapshots.any?
|
19
|
+
end
|
20
|
+
|
21
|
+
dream :class, Rudy::AWS::EC2::Snapshot
|
22
|
+
drill "create snapshot" do
|
23
|
+
vol = Rudy::AWS::EC2::Volumes.list(:available).first
|
24
|
+
Rudy::AWS::EC2::Snapshots.create vol.awsid
|
25
|
+
end
|
26
|
+
|
27
|
+
dream :class, Array
|
28
|
+
dream :empty?, false
|
29
|
+
drill "list snapshots as Array" do
|
30
|
+
Rudy::AWS::EC2::Snapshots.list
|
31
|
+
end
|
32
|
+
|
33
|
+
dream :class, Hash
|
34
|
+
dream :empty?, false
|
35
|
+
drill "list snapshots as Hash" do
|
36
|
+
Rudy::AWS::EC2::Snapshots.list_as_hash
|
37
|
+
end
|
38
|
+
|
39
|
+
dream :class, Rudy::AWS::EC2::Snapshot
|
40
|
+
drill "get snapshot from id" do
|
41
|
+
snap = Rudy::AWS::EC2::Snapshots.list.first
|
42
|
+
Rudy::AWS::EC2::Snapshots.get snap.awsid
|
43
|
+
end
|
44
|
+
|
45
|
+
dream :class, Rudy::AWS::EC2::Volume
|
46
|
+
dream :size, 3
|
47
|
+
dream :proc, lambda { |v| v.creating? || v.available? }
|
48
|
+
dream :proc, lambda { |v|
|
49
|
+
snap = Rudy::AWS::EC2::Snapshots.list.first
|
50
|
+
v.snapid == snap.awsid
|
51
|
+
}
|
52
|
+
drill "create volume from snapshot" do
|
53
|
+
snap = Rudy::AWS::EC2::Snapshots.list.first
|
54
|
+
Rudy::AWS::EC2::Volumes.create 3, global.zone, snap.awsid
|
55
|
+
end
|
56
|
+
|
57
|
+
drill "destroy snapshots", false do
|
58
|
+
Rudy::AWS::EC2::Snapshots.list.each do |snap|
|
59
|
+
Rudy::AWS::EC2::Snapshots.destroy snap.awsid
|
60
|
+
end
|
61
|
+
Rudy::AWS::EC2::Snapshots.any?
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
__END__
|
66
|
+
|
67
|
+
|
68
|
+
should "(90) destroy snapshots" do
|
69
|
+
assert @ec2snap.any?, "No snapshots"
|
70
|
+
snap_list = @ec2snap.list
|
71
|
+
snap_list.each do |snap|
|
72
|
+
next unless snap.completed?
|
73
|
+
assert @ec2snap.destroy(snap.awsid), "Not destroyed (#{snap.awsid})"
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
group "EC2 Instances"
|
2
|
+
library :rudy, 'lib'
|
3
|
+
|
4
|
+
tryouts "Instances" do
|
5
|
+
set :global, Rudy::Huxtable.global
|
6
|
+
set :config, Rudy::Huxtable.config
|
7
|
+
setup do
|
8
|
+
Rudy::Huxtable.update_config
|
9
|
+
Rudy::AWS::EC2.connect global.accesskey, global.secretkey, global.region
|
10
|
+
@ami = config.machines.find(global.region, :ami)
|
11
|
+
end
|
12
|
+
clean do
|
13
|
+
Rudy::AWS::EC2::Addresses.list.each do |add|
|
14
|
+
Rudy::AWS::EC2::Addresses.destroy add.ipaddress
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
dream :class, String
|
19
|
+
dream :empty?, false
|
20
|
+
drill("has ami") { @ami }
|
21
|
+
|
22
|
+
drill "no machines running", false do
|
23
|
+
Rudy::AWS::EC2::Instances.any? :running
|
24
|
+
end
|
25
|
+
|
26
|
+
dream :class, Rudy::AWS::EC2::Instance
|
27
|
+
dream :running?, true
|
28
|
+
drill "create instance" do
|
29
|
+
list = Rudy::AWS::EC2::Instances.create :ami => @ami, :group => "default"
|
30
|
+
list.each do |instance|
|
31
|
+
Rudy::Utils.waiter {
|
32
|
+
Rudy::AWS::EC2::Instances.running?(instance)
|
33
|
+
}
|
34
|
+
end
|
35
|
+
Rudy::AWS::EC2::Instances.get list.first.awsid
|
36
|
+
end
|
37
|
+
|
38
|
+
dream :class, Array
|
39
|
+
dream [:running, :pending, :shutting_down, :terminated, :degraded]
|
40
|
+
drill "have known states" do
|
41
|
+
Rudy::AWS::EC2::Instances::KNOWN_STATES
|
42
|
+
end
|
43
|
+
|
44
|
+
dream :class, Array
|
45
|
+
dream :empty?, false
|
46
|
+
drill "list instances as Array" do
|
47
|
+
Rudy::AWS::EC2::Instances.list :running
|
48
|
+
end
|
49
|
+
|
50
|
+
dream :class, Hash
|
51
|
+
dream :empty?, false
|
52
|
+
drill "list instances as Hash" do
|
53
|
+
Rudy::AWS::EC2::Instances.list_as_hash :running
|
54
|
+
end
|
55
|
+
|
56
|
+
# NOTE: This drill will probably fail b/c console output takes
|
57
|
+
# a few minutes to become available.
|
58
|
+
dream :class, String
|
59
|
+
dream :empty?, false
|
60
|
+
xdrill "have console output" do
|
61
|
+
inst = Rudy::AWS::EC2::Instances.list(:running).first
|
62
|
+
Rudy::AWS::EC2::Instances.console inst.awsid
|
63
|
+
end
|
64
|
+
|
65
|
+
dream true
|
66
|
+
|
67
|
+
drill "assign IP address to instance", true do
|
68
|
+
address = Rudy::AWS::EC2::Addresses.create
|
69
|
+
instance = Rudy::AWS::EC2::Instances.list(:running).first
|
70
|
+
Rudy::AWS::EC2::Addresses.associate(address, instance)
|
71
|
+
instance = Rudy::AWS::EC2::Instances.get instance.awsid
|
72
|
+
stash :address, address.ipaddress
|
73
|
+
stash :instance_ip, instance.dns_public
|
74
|
+
address.ipaddress == IPSocket.getaddress(instance.dns_public)
|
75
|
+
end
|
76
|
+
|
77
|
+
xdrill "can unassign an IP address (TODO)" do
|
78
|
+
|
79
|
+
end
|
80
|
+
|
81
|
+
# NOTE: Restart is generally disabled until it checks that it's
|
82
|
+
# unavailable and then comes available (there's no restart status)
|
83
|
+
xdrill "restart instance (TODO)", true do
|
84
|
+
instance = Rudy::AWS::EC2::Instances.list(:running).first
|
85
|
+
Rudy::AWS::EC2::Instances.restart instance
|
86
|
+
end
|
87
|
+
|
88
|
+
dream :class, Rudy::AWS::EC2::Instance
|
89
|
+
dream :shutting_down?, true
|
90
|
+
drill "destroy instance" do
|
91
|
+
instance = Rudy::AWS::EC2::Instances.list(:running).first
|
92
|
+
Rudy::AWS::EC2::Instances.destroy instance
|
93
|
+
instance = Rudy::AWS::EC2::Instances.get instance.awsid
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
97
|
+
|
98
|
+
__END__
|
99
|
+
|
100
|
+
should "(99) destroy instance" do
|
101
|
+
assert @ec2inst.any?(:running), "No instances running"
|
102
|
+
instances = @ec2inst.list(:running)
|
103
|
+
return skip("No running instances") unless instances
|
104
|
+
instances.each do |instance|
|
105
|
+
assert @ec2inst.destroy(instance), "Did not destroy"
|
106
|
+
end
|
107
|
+
end
|