solutious-rudy 0.8.5 → 0.9.0

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