rudy 0.8.5 → 0.9.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/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
|