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.
Files changed (132) hide show
  1. data/CHANGES.txt +110 -18
  2. data/README.rdoc +40 -44
  3. data/Rudyfile +35 -50
  4. data/bin/rudy +88 -57
  5. data/bin/rudy-ec2 +2 -16
  6. data/bin/rudy-s3 +0 -10
  7. data/bin/rudy-sdb +11 -12
  8. data/lib/rudy.rb +59 -91
  9. data/lib/rudy/aws.rb +4 -45
  10. data/lib/rudy/aws/ec2.rb +57 -20
  11. data/lib/rudy/aws/ec2/address.rb +10 -11
  12. data/lib/rudy/aws/ec2/group.rb +10 -9
  13. data/lib/rudy/aws/ec2/image.rb +8 -8
  14. data/lib/rudy/aws/ec2/instance.rb +18 -19
  15. data/lib/rudy/aws/ec2/keypair.rb +14 -19
  16. data/lib/rudy/aws/ec2/snapshot.rb +16 -9
  17. data/lib/rudy/aws/ec2/volume.rb +39 -26
  18. data/lib/rudy/aws/ec2/zone.rb +5 -4
  19. data/lib/rudy/aws/s3.rb +2 -1
  20. data/lib/rudy/aws/sdb.rb +35 -86
  21. data/lib/rudy/backups.rb +24 -0
  22. data/lib/rudy/cli.rb +5 -131
  23. data/lib/rudy/cli/aws/ec2/addresses.rb +19 -27
  24. data/lib/rudy/cli/aws/ec2/candy.rb +45 -20
  25. data/lib/rudy/cli/aws/ec2/groups.rb +9 -13
  26. data/lib/rudy/cli/aws/ec2/images.rb +5 -133
  27. data/lib/rudy/cli/aws/ec2/instances.rb +25 -25
  28. data/lib/rudy/cli/aws/ec2/keypairs.rb +7 -11
  29. data/lib/rudy/cli/aws/ec2/snapshots.rb +5 -9
  30. data/lib/rudy/cli/aws/ec2/volumes.rb +22 -23
  31. data/lib/rudy/cli/aws/ec2/zones.rb +2 -3
  32. data/lib/rudy/cli/aws/sdb/domains.rb +5 -6
  33. data/lib/rudy/cli/aws/sdb/objects.rb +33 -0
  34. data/lib/rudy/cli/aws/sdb/select.rb +23 -0
  35. data/lib/rudy/cli/backups.rb +38 -0
  36. data/lib/rudy/cli/base.rb +104 -0
  37. data/lib/rudy/cli/candy.rb +1 -2
  38. data/lib/rudy/cli/config.rb +20 -7
  39. data/lib/rudy/cli/disks.rb +7 -9
  40. data/lib/rudy/cli/execbase.rb +56 -0
  41. data/lib/rudy/cli/machines.rb +242 -45
  42. data/lib/rudy/cli/metadata.rb +24 -10
  43. data/lib/rudy/cli/networks.rb +34 -0
  44. data/lib/rudy/cli/routines.rb +32 -6
  45. data/lib/rudy/cli/status.rb +60 -0
  46. data/lib/rudy/config.rb +55 -32
  47. data/lib/rudy/config/objects.rb +44 -30
  48. data/lib/rudy/disks.rb +25 -0
  49. data/lib/rudy/exceptions.rb +99 -0
  50. data/lib/rudy/global.rb +67 -28
  51. data/lib/rudy/guidelines.rb +3 -2
  52. data/lib/rudy/huxtable.rb +67 -58
  53. data/lib/rudy/machines.rb +41 -263
  54. data/lib/rudy/metadata.rb +212 -38
  55. data/lib/rudy/metadata/backup.rb +123 -78
  56. data/lib/rudy/metadata/disk.rb +153 -170
  57. data/lib/rudy/metadata/machine.rb +179 -0
  58. data/lib/rudy/mixins.rb +2 -1
  59. data/lib/rudy/mixins/hash.rb +3 -1
  60. data/lib/rudy/mixins/symbol.rb +8 -0
  61. data/lib/rudy/routines.rb +127 -344
  62. data/lib/rudy/routines/base.rb +229 -0
  63. data/lib/rudy/routines/handlers/base.rb +48 -0
  64. data/lib/rudy/routines/handlers/depends.rb +49 -0
  65. data/lib/rudy/routines/handlers/disks.rb +249 -0
  66. data/lib/rudy/routines/handlers/group.rb +44 -0
  67. data/lib/rudy/routines/handlers/host.rb +70 -0
  68. data/lib/rudy/routines/handlers/keypair.rb +70 -0
  69. data/lib/rudy/routines/handlers/machines.rb +15 -0
  70. data/lib/rudy/routines/handlers/script.rb +85 -0
  71. data/lib/rudy/routines/handlers/user.rb +45 -0
  72. data/lib/rudy/routines/passthrough.rb +19 -23
  73. data/lib/rudy/routines/reboot.rb +98 -50
  74. data/lib/rudy/routines/shutdown.rb +65 -14
  75. data/lib/rudy/routines/startup.rb +112 -17
  76. data/lib/rudy/utils.rb +35 -68
  77. data/rudy.gemspec +82 -25
  78. data/tryouts/01_mixins/01_hash_tryouts.rb +20 -0
  79. data/tryouts/10_require_time/10_rudy_tryouts.rb +33 -0
  80. data/tryouts/10_require_time/15_global_tryouts.rb +58 -0
  81. data/tryouts/12_config/10_load_config_tryouts.rb +43 -0
  82. data/tryouts/12_config/20_defaults_tryouts.rb +16 -0
  83. data/tryouts/12_config/30_accounts_tryouts.rb +17 -0
  84. data/tryouts/12_config/40_machines_tryouts.rb +53 -0
  85. data/tryouts/12_config/50_commands_tryouts.rb +17 -0
  86. data/tryouts/12_config/60_routines_tryouts.rb +16 -0
  87. data/tryouts/15_huxtable/10_huxtable_tryouts.rb +47 -0
  88. data/tryouts/15_huxtable/20_user_tryouts.rb +47 -0
  89. data/tryouts/20_simpledb/10_domains_tryouts.rb +36 -0
  90. data/tryouts/20_simpledb/20_objects_tryouts.rb +56 -0
  91. data/tryouts/25_ec2/10_keypairs_tryouts.rb +54 -0
  92. data/tryouts/25_ec2/20_groups_tryouts.rb +56 -0
  93. data/tryouts/25_ec2/21_groups_authorize_address_tryouts.rb +53 -0
  94. data/tryouts/25_ec2/22_groups_authorize_account_tryouts.rb +54 -0
  95. data/tryouts/25_ec2/30_addresses_tryouts.rb +42 -0
  96. data/tryouts/25_ec2/40_volumes_tryouts.rb +53 -0
  97. data/tryouts/25_ec2/50_snapshots_tryouts.rb +75 -0
  98. data/tryouts/26_ec2_instances/10_instance_tryouts.rb +107 -0
  99. data/tryouts/26_ec2_instances/50_images_tryouts.rb +7 -0
  100. data/tryouts/30_metadata/10_include_tryouts.rb +45 -0
  101. data/tryouts/30_metadata/13_object_tryouts.rb +19 -0
  102. data/tryouts/30_metadata/50_disk_tryouts.rb +115 -0
  103. data/tryouts/30_metadata/51_disk_digest_tryouts.rb +24 -0
  104. data/tryouts/30_metadata/53_disk_list_tryouts.rb +35 -0
  105. data/tryouts/30_metadata/56_disk_volume_tryouts.rb +68 -0
  106. data/tryouts/30_metadata/60_backup_tryouts.rb +101 -0
  107. data/tryouts/30_metadata/63_backup_list_tryouts.rb +38 -0
  108. data/tryouts/30_metadata/64_backup_disk_tryouts.rb +65 -0
  109. data/tryouts/30_metadata/66_backup_snapshot_tryouts.rb +76 -0
  110. data/tryouts/30_metadata/70_machine_tryouts.rb +85 -0
  111. data/tryouts/30_metadata/73_machine_list_tryouts.rb +58 -0
  112. data/tryouts/30_metadata/76_machine_instance_tryouts.rb +64 -0
  113. data/tryouts/30_metadata/77_machines_tryouts.rb +45 -0
  114. data/tryouts/40_routines/10_keypair_handler_tryouts.rb +52 -0
  115. data/tryouts/40_routines/11_group_handler_tryouts.rb +36 -0
  116. data/tryouts/80_cli/10_rudyec2_tryouts.rb +8 -0
  117. data/tryouts/80_cli/60_rudy_tryouts.rb +41 -0
  118. data/tryouts/exploration/console.rb +91 -0
  119. data/tryouts/exploration/machine.rb +23 -0
  120. data/tryouts/failer +6 -0
  121. metadata +116 -32
  122. data/bin/ird +0 -153
  123. data/lib/rudy/metadata/backups.rb +0 -67
  124. data/lib/rudy/metadata/debug.rb +0 -38
  125. data/lib/rudy/metadata/disks.rb +0 -67
  126. data/lib/rudy/metadata/objectbase.rb +0 -108
  127. data/lib/rudy/routines/helper.rb +0 -76
  128. data/lib/rudy/routines/helpers/dependshelper.rb +0 -34
  129. data/lib/rudy/routines/helpers/diskhelper.rb +0 -403
  130. data/lib/rudy/routines/helpers/scripthelper.rb +0 -197
  131. data/lib/rudy/routines/helpers/userhelper.rb +0 -37
  132. 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