rudy 0.4.0 → 0.6.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 (135) hide show
  1. data/CHANGES.txt +54 -30
  2. data/README.rdoc +100 -12
  3. data/Rakefile +103 -8
  4. data/Rudyfile +119 -0
  5. data/bin/ird +175 -0
  6. data/bin/rudy +259 -156
  7. data/bin/rudy-ec2 +228 -95
  8. data/bin/rudy-s3 +76 -0
  9. data/bin/rudy-sdb +67 -0
  10. data/lib/annoy.rb +270 -0
  11. data/lib/console.rb +30 -9
  12. data/lib/escape.rb +305 -0
  13. data/lib/rudy.rb +151 -182
  14. data/lib/rudy/aws.rb +56 -49
  15. data/lib/rudy/aws/ec2.rb +47 -292
  16. data/lib/rudy/aws/ec2/address.rb +157 -0
  17. data/lib/rudy/aws/ec2/group.rb +301 -0
  18. data/lib/rudy/aws/ec2/image.rb +168 -0
  19. data/lib/rudy/aws/ec2/instance.rb +434 -0
  20. data/lib/rudy/aws/ec2/keypair.rb +104 -0
  21. data/lib/rudy/aws/ec2/snapshot.rb +98 -0
  22. data/lib/rudy/aws/ec2/volume.rb +230 -0
  23. data/lib/rudy/aws/ec2/zone.rb +77 -0
  24. data/lib/rudy/aws/s3.rb +54 -0
  25. data/lib/rudy/aws/sdb.rb +298 -0
  26. data/lib/rudy/aws/sdb/error.rb +46 -0
  27. data/lib/rudy/{metadata/backup.rb → backup.rb} +26 -51
  28. data/lib/rudy/cli.rb +157 -0
  29. data/lib/rudy/cli/aws/ec2/addresses.rb +105 -0
  30. data/lib/rudy/cli/aws/ec2/candy.rb +208 -0
  31. data/lib/rudy/cli/aws/ec2/groups.rb +121 -0
  32. data/lib/rudy/cli/aws/ec2/images.rb +196 -0
  33. data/lib/rudy/cli/aws/ec2/instances.rb +194 -0
  34. data/lib/rudy/cli/aws/ec2/keypairs.rb +53 -0
  35. data/lib/rudy/cli/aws/ec2/snapshots.rb +49 -0
  36. data/lib/rudy/cli/aws/ec2/volumes.rb +104 -0
  37. data/lib/rudy/cli/aws/ec2/zones.rb +22 -0
  38. data/lib/rudy/cli/aws/s3/buckets.rb +50 -0
  39. data/lib/rudy/cli/aws/s3/store.rb +22 -0
  40. data/lib/rudy/cli/aws/sdb/domains.rb +41 -0
  41. data/lib/rudy/cli/candy.rb +8 -0
  42. data/lib/rudy/{command → cli}/config.rb +34 -24
  43. data/lib/rudy/cli/disks.rb +35 -0
  44. data/lib/rudy/cli/machines.rb +94 -0
  45. data/lib/rudy/cli/routines.rb +57 -0
  46. data/lib/rudy/config.rb +77 -72
  47. data/lib/rudy/config/objects.rb +29 -0
  48. data/lib/rudy/disks.rb +248 -0
  49. data/lib/rudy/global.rb +121 -0
  50. data/lib/rudy/huxtable.rb +340 -0
  51. data/lib/rudy/machines.rb +245 -0
  52. data/lib/rudy/metadata.rb +123 -13
  53. data/lib/rudy/routines.rb +47 -0
  54. data/lib/rudy/routines/helpers/diskhelper.rb +101 -0
  55. data/lib/rudy/routines/helpers/scripthelper.rb +91 -0
  56. data/lib/rudy/routines/release.rb +34 -0
  57. data/lib/rudy/routines/shutdown.rb +57 -0
  58. data/lib/rudy/routines/startup.rb +58 -0
  59. data/lib/rudy/scm/svn.rb +1 -1
  60. data/lib/rudy/utils.rb +322 -4
  61. data/lib/storable.rb +26 -17
  62. data/lib/sysinfo.rb +274 -0
  63. data/lib/tryouts.rb +6 -13
  64. data/rudy.gemspec +128 -42
  65. data/support/randomize-root-password +45 -0
  66. data/support/rudy-ec2-startup +9 -9
  67. data/support/update-ec2-ami-tools +20 -0
  68. data/test/05_config/00_setup_test.rb +20 -0
  69. data/test/05_config/30_machines_test.rb +69 -0
  70. data/test/20_sdb/00_setup_test.rb +16 -0
  71. data/test/20_sdb/10_domains_test.rb +115 -0
  72. data/test/25_ec2/00_setup_test.rb +29 -0
  73. data/test/25_ec2/10_keypairs_test.rb +41 -0
  74. data/test/25_ec2/20_groups_test.rb +131 -0
  75. data/test/25_ec2/30_addresses_test.rb +38 -0
  76. data/test/25_ec2/40_volumes_test.rb +49 -0
  77. data/test/25_ec2/50_snapshots_test.rb +74 -0
  78. data/test/26_ec2_instances/00_setup_test.rb +28 -0
  79. data/test/26_ec2_instances/10_instances_test.rb +83 -0
  80. data/test/26_ec2_instances/50_images_test.rb +13 -0
  81. data/test/30_sdb_metadata/00_setup_test.rb +21 -0
  82. data/test/30_sdb_metadata/10_disks_test.rb +109 -0
  83. data/test/30_sdb_metadata/20_backups_test.rb +102 -0
  84. data/test/coverage.txt +51 -0
  85. data/test/helper.rb +36 -0
  86. data/vendor/highline-1.5.1/CHANGELOG +222 -0
  87. data/vendor/highline-1.5.1/INSTALL +35 -0
  88. data/vendor/highline-1.5.1/LICENSE +7 -0
  89. data/vendor/highline-1.5.1/README +63 -0
  90. data/vendor/highline-1.5.1/Rakefile +82 -0
  91. data/vendor/highline-1.5.1/TODO +6 -0
  92. data/vendor/highline-1.5.1/examples/ansi_colors.rb +38 -0
  93. data/vendor/highline-1.5.1/examples/asking_for_arrays.rb +18 -0
  94. data/vendor/highline-1.5.1/examples/basic_usage.rb +75 -0
  95. data/vendor/highline-1.5.1/examples/color_scheme.rb +32 -0
  96. data/vendor/highline-1.5.1/examples/limit.rb +12 -0
  97. data/vendor/highline-1.5.1/examples/menus.rb +65 -0
  98. data/vendor/highline-1.5.1/examples/overwrite.rb +19 -0
  99. data/vendor/highline-1.5.1/examples/page_and_wrap.rb +322 -0
  100. data/vendor/highline-1.5.1/examples/password.rb +7 -0
  101. data/vendor/highline-1.5.1/examples/trapping_eof.rb +22 -0
  102. data/vendor/highline-1.5.1/examples/using_readline.rb +17 -0
  103. data/vendor/highline-1.5.1/lib/highline.rb +758 -0
  104. data/vendor/highline-1.5.1/lib/highline/color_scheme.rb +120 -0
  105. data/vendor/highline-1.5.1/lib/highline/compatibility.rb +17 -0
  106. data/vendor/highline-1.5.1/lib/highline/import.rb +43 -0
  107. data/vendor/highline-1.5.1/lib/highline/menu.rb +395 -0
  108. data/vendor/highline-1.5.1/lib/highline/question.rb +463 -0
  109. data/vendor/highline-1.5.1/lib/highline/system_extensions.rb +193 -0
  110. data/vendor/highline-1.5.1/setup.rb +1360 -0
  111. data/vendor/highline-1.5.1/test/tc_color_scheme.rb +56 -0
  112. data/vendor/highline-1.5.1/test/tc_highline.rb +823 -0
  113. data/vendor/highline-1.5.1/test/tc_import.rb +54 -0
  114. data/vendor/highline-1.5.1/test/tc_menu.rb +429 -0
  115. data/vendor/highline-1.5.1/test/ts_all.rb +15 -0
  116. metadata +141 -38
  117. data/lib/aws_sdb.rb +0 -3
  118. data/lib/aws_sdb/error.rb +0 -42
  119. data/lib/aws_sdb/service.rb +0 -215
  120. data/lib/rudy/aws/simpledb.rb +0 -53
  121. data/lib/rudy/command/addresses.rb +0 -46
  122. data/lib/rudy/command/backups.rb +0 -175
  123. data/lib/rudy/command/base.rb +0 -841
  124. data/lib/rudy/command/deploy.rb +0 -12
  125. data/lib/rudy/command/disks.rb +0 -213
  126. data/lib/rudy/command/environment.rb +0 -73
  127. data/lib/rudy/command/groups.rb +0 -61
  128. data/lib/rudy/command/images.rb +0 -91
  129. data/lib/rudy/command/instances.rb +0 -85
  130. data/lib/rudy/command/machines.rb +0 -161
  131. data/lib/rudy/command/metadata.rb +0 -41
  132. data/lib/rudy/command/release.rb +0 -174
  133. data/lib/rudy/command/volumes.rb +0 -66
  134. data/lib/rudy/metadata/disk.rb +0 -138
  135. data/tryouts/console_tryout.rb +0 -91
@@ -0,0 +1,45 @@
1
+ #!/bin/sh
2
+
3
+ #
4
+ # Randomizes the root password on first boot
5
+ #
6
+ # * When the file /root/firstboot is present, this script will
7
+ # randomize the root password.
8
+ #
9
+ # who: delano@solutious.com
10
+ # when: 2009-03-13
11
+ #
12
+
13
+ # NOTE: Works on Gentoo
14
+ # TODO: Fix for debian
15
+
16
+ if [ -f "/root/firstrun" ] ; then
17
+ dd if=/dev/urandom count=50|md5sum|passwd --stdin root
18
+ rm -f /root/firstrun
19
+ else
20
+ echo "* Firstrun *" && touch /root/firstrun
21
+ fi
22
+
23
+ # New Gentoo (to be tested)
24
+ #if [ -f "/root/firstrun" ] ; then
25
+ # pword=`dd if=/dev/urandom count=51 | sha1sum`
26
+ # echo $pword | passwd --stdin root
27
+ # rm -f /root/firstrun
28
+ #else
29
+ # echo "* Firstrun *" && touch /root/firstrun
30
+ #fi
31
+
32
+ # Fix for debian
33
+ #if [ -f "/root/firstrun" ] ; then
34
+ # pword=`dd if=/dev/urandom count=51 | sha1sum`
35
+ # echo "root:$pword" | chpasswd
36
+ # rm -f /root/firstrun
37
+ #else
38
+ # echo "* Firstrun *" && touch /root/firstrun
39
+ #fi
40
+
41
+ # Random root password for Gentoo:
42
+ #dd if=/dev/urandom count=51 | sha1sum | passwd --stdin root
43
+
44
+ # Random root password for Debian/Ubuntu:
45
+ #echo "root:`dd if=/dev/urandom count=51 | sha1sum`" | chpasswd
@@ -9,7 +9,7 @@
9
9
 
10
10
  # Runs when an ec2 instance startups up.
11
11
  # Grabs configuration from the run time user data and stores it locally.
12
- # See Rudy::Command::Instances#start_instance for the expected yaml format.
12
+ # See Rudy::CLI::Machines#start_instance for the expected yaml format.
13
13
 
14
14
  # Put this in /etc/init.d. Then:
15
15
  # * chmod 755 rudy-ec2-startup
@@ -33,8 +33,8 @@ METADATA = 'http://169.254.169.254/2008-02-01/meta-data'
33
33
 
34
34
  METADATAPARAMS = ['instance-id', 'instance-type']
35
35
 
36
- RUDY_CONFIG_DIR=File.join('.rudy')
37
- RUDY_CONFIG_FILE=File.join('config')
36
+ Rudy::CONFIG_DIR=File.join('.rudy')
37
+ Rudy::CONFIG_FILE=File.join('config')
38
38
 
39
39
  module Rudy
40
40
  module EC2Startup
@@ -74,10 +74,10 @@ module Rudy
74
74
  # We don't want sensitive config values available in the log
75
75
  puts "CONFIG: " << config_yaml
76
76
 
77
- zone = config[:zone] ? config[:zone].downcase : "zone"
78
- environment = config[:environment] ? config[:environment].downcase : "env"
79
- role = config[:role] ? config[:role].downcase : "role"
80
- position = config[:position] ? config[:position].downcase : "00"
77
+ zone = config[:zone] ? config[:zone].to_s.downcase : "zone"
78
+ environment = config[:environment] ? config[:environment].to_s.downcase : "env"
79
+ role = config[:role] ? config[:role].to_s.downcase : "role"
80
+ position = config[:position] ? config[:position].to_s.downcase : "00"
81
81
 
82
82
  hostname = [zone, environment, role, position].join('-')
83
83
  log "Setting hostname: #{hostname}"
@@ -91,9 +91,9 @@ module Rudy
91
91
  # (when we're not running as that user.)
92
92
  config[:userdata].each_pair do |n,hash|
93
93
  fileparts = (n == :root) ? ['/root'] : [user_home_dir(n)]
94
- fileparts << RUDY_CONFIG_DIR
94
+ fileparts << Rudy::CONFIG_DIR
95
95
  dirpath = File.join(fileparts)
96
- filepath = File.join(dirpath, RUDY_CONFIG_FILE)
96
+ filepath = File.join(dirpath, Rudy::CONFIG_FILE)
97
97
 
98
98
  # Backwards compatability
99
99
  if !File.directory?(dirpath)
@@ -0,0 +1,20 @@
1
+ #!/bin/sh
2
+
3
+ #
4
+ # Installs the latest EC2 AMI Tools
5
+ #
6
+ # * Downloads zip to /tmp
7
+ # * Unzips and removes /usr/ec2 (if it exists)
8
+ # * Moves tools to /usr/ec2
9
+ #
10
+ # who: delano@solutious.com
11
+ # when: 2009-03-13
12
+ #
13
+
14
+ cd /tmp
15
+ echo " + Updating ec2-ami-tools"
16
+ wget http://s3.amazonaws.com/ec2-downloads/ec2-ami-tools.zip && \
17
+ unzip ec2-ami-tools.zip && rm ec2*.zip* && rm -rf /usr/ec2 && \
18
+ mv ec2-* ec2 && mv ec2 /usr/ && \
19
+ echo " + Updated ec2-ami-tools"
20
+
@@ -0,0 +1,20 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'helper')
2
+
3
+ module Rudy::Test
4
+
5
+ class Case_05_Config < Test::Unit::TestCase
6
+ include Rudy::Huxtable
7
+
8
+ @@logger = STDERR #StringIO.new
9
+ @@zone = @@global.zone.to_s
10
+
11
+ context "#{name}_00 Setup" do
12
+ should "(00) have class variables setup" do
13
+ stop_test !@@global.is_a?(Rudy::Global), "We don't have global (#{@@global})"
14
+ stop_test !@@config.is_a?(Rudy::Config), "We don't have an instance of Rudy::Config (#{@@config})"
15
+ end
16
+ end
17
+
18
+
19
+ end
20
+ end
@@ -0,0 +1,69 @@
1
+
2
+ module Rudy::Test
3
+ class Case_05_Config
4
+
5
+ context "#{name}_30 Machines" do
6
+
7
+ should "(10) have accounts.aws" do
8
+ stop_test !@@config.accounts.is_a?(Rudy::Config::Accounts), "Not an Accounts class"
9
+
10
+ stop_test @@config.accounts.aws.accountnum.nil?, "No account"
11
+ stop_test @@config.accounts.aws.accesskey.nil?, "No accesskey"
12
+ stop_test @@config.accounts.aws.secretkey.nil?, "No secretkey"
13
+ end
14
+
15
+ should "(20) have defaults" do
16
+ assert @@config.defaults.is_a?(Rudy::Config::Defaults), "Not a Defaults class"
17
+ assert !@@config.defaults.region.nil?, "No default region"
18
+ assert !@@config.defaults.zone.nil?, "No default zone"
19
+ assert !@@config.defaults.environment.nil?, "No default environment"
20
+ assert !@@config.defaults.role.nil?, "No default role"
21
+ end
22
+
23
+ should "(30) have machines" do
24
+ assert @@config.machines.is_a?(Rudy::Config::Machines), "Not a Machines class"
25
+ assert !@@config.machines.keys.empty?, "Nothing in machine config"
26
+ end
27
+
28
+ should "(31) have 2 disks" do
29
+ reg, zon = @@config.defaults.region, @@config.defaults.zone
30
+ env, rol = @@config.defaults.environment, @@config.defaults.role
31
+
32
+ end
33
+
34
+ # Disabled for 0.5.0 (routines config removed)
35
+ xshould "(40) have routines" do
36
+ assert @@config.routines.is_a?(Rudy::Config::Routines), "Not a Routines class"
37
+ end
38
+
39
+ # Disabled for 0.5.0 (most machines config removed)
40
+ xshould "(50) be able to find and find_deferred" do
41
+ reg, zon = @@config.defaults.region, @@config.defaults.zone
42
+ env, rol = @@config.defaults.environment, @@config.defaults.role
43
+
44
+ #Caesars.enable_debug
45
+
46
+ conf = @@config.machines[env][rol]
47
+ conf_find = @@config.machines.find(env, rol)
48
+ conf_find_def = @@config.machines.find_deferred(env, rol)
49
+
50
+ assert_equal conf, conf_find, "config hash and find not equal"
51
+ assert_equal conf_find_def, conf_find, "find and find_deferred not equal"
52
+ end
53
+
54
+ should "(51) find different config for each zone" do
55
+ reg, zon = @@config.defaults.region, @@config.defaults.zone
56
+ env, rol = @@config.defaults.environment, @@config.defaults.role
57
+
58
+ us_ami = @@config.machines.find(:"us-east-1b", :ami)
59
+ eu_ami = @@config.machines.find(:"eu-west-1b", :ami)
60
+
61
+ assert us_ami.is_a?(String), "No ami for us-east-1b zone"
62
+ assert eu_ami.is_a?(String), "No ami for eu-west-1b"
63
+ assert us_ami != eu_ami, "EU (#{eu_ami}) and US (#{us_ami}) AMIs are the same"
64
+ end
65
+
66
+ end
67
+
68
+ end
69
+ end
@@ -0,0 +1,16 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'helper')
2
+
3
+ module Rudy::Test
4
+ # Expects:
5
+ # * There to be no pre-existing keypairs, addresses, etc... (except
6
+ # the default group)
7
+ # * It can destroy instances, images, etc...
8
+ #
9
+ # DO NOT RUN THIS TEST ON A PRODUCTION AWS ACCOUNT!!
10
+ #
11
+ class Case_20_AWS_SDB < Test::Unit::TestCase
12
+ include Rudy::Huxtable
13
+
14
+ end
15
+
16
+ end
@@ -0,0 +1,115 @@
1
+ module Rudy::Test
2
+ class Case_20_AWS_SDB
3
+
4
+
5
+ def get_domain
6
+
7
+ end
8
+
9
+ context "#{name}_10 Domains" do
10
+
11
+ setup do
12
+ @sdb = Rudy::AWS::SDB.new(@@global.accesskey, @@global.secretkey, @@global.region)
13
+ @domain_list = @sdb.list_domains || []
14
+ @domain = @domain_list.first
15
+ end
16
+
17
+ should "(10) create domain" do
18
+ dname = 'test_' << Rudy::Utils.strand
19
+ assert @sdb.create_domain(dname), "Domain not created (#{dname})"
20
+ end
21
+
22
+ should "(20) list domains" do
23
+ domain_list = @sdb.list_domains
24
+ assert domain_list.is_a?(Array), "Not an Array"
25
+ assert !domain_list.empty?, "No Domains"
26
+ end
27
+
28
+ should "(30) store objects" do
29
+
30
+ assert !@domain.nil?, "No domain"
31
+
32
+ produce = lambda {
33
+ {
34
+ 'orange' => rand(100) * 10,
35
+ 'celery' => rand(100) * 100,
36
+ 'grapes' => :green
37
+ }
38
+ }
39
+
40
+ @sdb.put(@domain, 'produce1', produce.call, :replace)
41
+ @sdb.put(@domain, 'produce2', produce.call, :replace)
42
+
43
+ # TODO: Need assertion here!
44
+
45
+ end
46
+
47
+ should "(40) get objects" do
48
+ assert !@domain.nil?, "No domain"
49
+ item = @sdb.get(@domain, 'produce1')
50
+ assert_equal Hash, item.class # good stuff
51
+ assert_equal ['green'], item['grapes']
52
+ end
53
+
54
+ should "(50) query objects" do
55
+
56
+ assert !@domain.nil?, "No domain"
57
+
58
+ items = @sdb.query(@domain, "[ 'grapes' = 'green' ]")
59
+ assert items.is_a?(Array), "Not an Array"
60
+ assert_equal 2, items.size, "More than 2 objects"
61
+ end
62
+
63
+ should "(51) query objects with attributes" do
64
+
65
+ assert !@domain.nil?, "No domain"
66
+
67
+ items = @sdb.query_with_attributes(@domain, "[ 'grapes' = 'green' ]")
68
+ assert items.is_a?(Hash), "Not a Hash"
69
+ assert_equal 2, items.keys.size, "More than 2 objects"
70
+ assert items['produce1']['celery'].first.to_i > 1000, "Celery less than 1000"
71
+ end
72
+
73
+ should "(60) select objects" do
74
+ assert !@domain.nil?, "No domain"
75
+ q = "select * from #{@domain}"
76
+
77
+ items = @sdb.select(q)
78
+ assert items.is_a?(Hash), "Not a Hash"
79
+ assert_equal 2, items.keys.size, "More than 2 objects"
80
+
81
+ # {"produce1"=>{"celery"=>["5200"], "grapes"=>["green"], "orange"=>["550"]}}
82
+ assert items['produce1']['celery'].first.to_i > 1000, "Celery less than 1000"
83
+ end
84
+
85
+
86
+ should "(70) destroy objects" do
87
+ assert !@domain.nil?, "No domain"
88
+ q = "select * from #{@domain}"
89
+ items = @sdb.select(q)
90
+ assert items.is_a?(Hash), "Not a Hash"
91
+ items.keys.each do |item|
92
+ assert @sdb.destroy(@domain, item), "Not destroyed (#{item})"
93
+ end
94
+ sleep 1 # Eventual consistency. Items may still appear.
95
+ q = "select * from #{@domain}"
96
+ items = @sdb.select(q)
97
+ assert items.nil?, "Some items not destroyed (#{items})"
98
+ end
99
+
100
+ should "(99) destroy domains" do
101
+
102
+ assert !@domain.nil?, "No domain"
103
+
104
+ @domain_list.each do |domain|
105
+ assert @sdb.destroy_domain(domain), "Not destroyed (#{domain})"
106
+ end
107
+
108
+ domain_list = @sdb.list_domains
109
+ assert domain_list.empty?, "Not empty"
110
+ end
111
+
112
+ end
113
+
114
+ end
115
+ end
@@ -0,0 +1,29 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'helper')
2
+
3
+ module Rudy::Test
4
+ # Expects:
5
+ # * There to be no pre-existing keypairs, addresses, etc... (except
6
+ # the default group)
7
+ # * It can destroy instances, images, etc...
8
+ #
9
+ # DO NOT RUN THIS TEST ON A PRODUCTION AWS ACCOUNT!!
10
+ #
11
+ class Case_25_EC2 < Test::Unit::TestCase
12
+ include Rudy::Huxtable
13
+
14
+ @@zone = @@global.zone.to_s
15
+
16
+
17
+ context "#{name}_00 Setup" do
18
+ should "(10) have class variables setup" do
19
+ stop_test !@@global.is_a?(Rudy::Global), "We don't have global (#{@@global})"
20
+ stop_test !@@config.is_a?(Rudy::Config), "We don't have an instance of Rudy::Config (#{@@config})"
21
+ stop_test !@@global.accountnum, "No account number"
22
+ end
23
+ should "(11) be zone" do
24
+ stop_test !@@zone, "No zone"
25
+ end
26
+ end
27
+ end
28
+
29
+ end
@@ -0,0 +1,41 @@
1
+
2
+ module Rudy::Test
3
+
4
+ class Case_25_EC2
5
+
6
+ context "#{name}_10 KeyPairs" do
7
+ setup do
8
+ @@test_name ||= 'test-' << Rudy::Utils.strand
9
+ @ec2key = Rudy::AWS::EC2::KeyPairs.new(@@global.accesskey, @@global.secretkey, @@global.region)
10
+ #@ami = @@config.machines.find(@@zone.to_sym, :ami)
11
+ end
12
+
13
+
14
+ should "(10) create keypair" do
15
+ keypair = @ec2key.create(@@test_name)
16
+ assert keypair.is_a?(Rudy::AWS::EC2::KeyPair), "Not a KeyPair"
17
+ assert !keypair.name.empty?, "No name"
18
+ assert !keypair.fingerprint.empty?, "No fingerprint"
19
+ assert !keypair.private_key.empty?, "No private key"
20
+ end
21
+
22
+ should "(20) list keypairs" do
23
+ keypairs = @ec2key.list || []
24
+ assert keypairs.size > 0, "No keypairs"
25
+ end
26
+
27
+ should "(21) get specific keypair" do
28
+ assert @ec2key.get(@@test_name).is_a?(Rudy::AWS::EC2::KeyPair), "Not a KeyPair (#{@@test_name})"
29
+ end
30
+
31
+ should "(50) destroy keypairs" do
32
+ keypairs = @ec2key.list || []
33
+ assert keypairs.size > 0, "No keypairs"
34
+ keypairs.each do |kp|
35
+ @ec2key.destroy(kp.name)
36
+ end
37
+ end
38
+ end
39
+
40
+ end
41
+ end
@@ -0,0 +1,131 @@
1
+
2
+ module Rudy::Test
3
+
4
+ class Case_25_EC2
5
+
6
+ def get_groups
7
+ # Ruby 1.8 throws an undefined method error when this is at the
8
+ # bottom of the class
9
+ group_list = @ec2group.list_as_hash
10
+ # "default" cannot be deleted so we exempt it
11
+ group_list.reject { |gname,group| gname == "default" }
12
+ end
13
+
14
+
15
+ context "#{name}_20 Groups" do
16
+ setup do
17
+ @ec2group = Rudy::AWS::EC2::Groups.new(@@global.accesskey, @@global.secretkey, @@global.region)
18
+ @accountnum = @@config.accounts.aws.accountnum
19
+ end
20
+
21
+ should "(00) not be existing groups" do
22
+
23
+ group_list = get_groups
24
+ stop_test !group_list.empty?, "Destroy the existing groups (#{group_list.keys.join(', ')})"
25
+ stop_test !@accountnum, "Need an account number for group authorization"
26
+ end
27
+
28
+ should "(01) create group with name" do
29
+ group_list = get_groups
30
+ test_name ||= 'test-' << Rudy::Utils.strand
31
+ str = Rudy::Utils.strand
32
+ group = @ec2group.create(test_name)
33
+ assert group.is_a?(Rudy::AWS::EC2::Group), "Not a Group object (#{group.class.to_s})"
34
+ assert_equal group.name, test_name, "Group name not set"
35
+ assert_equal group.description, "Security Group #{test_name}", "Group description not 'Security Group #{test_name}'"
36
+ assert @ec2group.exists?(test_name), "Group #{test_name} doesn't exist"
37
+ end
38
+
39
+ should "(02) create group with name and description" do
40
+ test_name ||= 'test-' << Rudy::Utils.strand
41
+ str = Rudy::Utils.strand
42
+ desc = "Description for #{test_name}"
43
+ group = @ec2group.create(test_name, desc)
44
+ assert group.is_a?(Rudy::AWS::EC2::Group), "Not a Group object"
45
+ assert_equal group.name, test_name, "Group name not set"
46
+ assert_equal group.description, desc, "Group description not set"
47
+ assert @ec2group.exists?(test_name), "Group #{test_name} doesn't exist"
48
+ end
49
+
50
+ should "(10) list available groups" do
51
+ group_list = @ec2group.list
52
+ assert group_list.is_a?(Array), "Group list is not an Array"
53
+
54
+ group_list_hash = @ec2group.list_as_hash
55
+ assert group_list_hash.is_a?(Hash), "Group list is not an Hash"
56
+
57
+ group_list.each do |group|
58
+ assert group.is_a?(Rudy::AWS::EC2::Group), "Not a group"
59
+ end
60
+ end
61
+
62
+ should "(20) authorize/revoke group rules for address" do
63
+ external_ip_address = Rudy::Utils::external_ip_address
64
+ external_ip_address ||= '192.168.0.1/32'
65
+
66
+ test_name ||= 'test-' << Rudy::Utils.strand
67
+
68
+ group = @ec2group.create(test_name)
69
+ protocols = ['tcp', 'udp']
70
+ addresses = [external_ip_address]
71
+ ports = [[3100,3150],[3200,3250]]
72
+
73
+ ret = @ec2group.authorize(test_name, addresses, ports, protocols)
74
+ assert ret, "Authorize did not return true"
75
+
76
+ group = @ec2group.get(test_name)
77
+
78
+ assert group.is_a?(Rudy::AWS::EC2::Group), "Not a group (#{group})"
79
+ assert group.addresses.is_a?(Hash), "Addresses is not a hash (#{group.addresses})"
80
+
81
+ group.addresses.each_pair do |address,rules|
82
+ assert rules.is_a?(Array), "Not an Array"
83
+ assert_equal 7, rules.size, "Not 7 rules"
84
+ puts "TODO: Check port ranges"
85
+ end
86
+
87
+ ret = @ec2group.revoke(test_name, addresses, ports, protocols)
88
+ assert ret, "Revoke did not return true"
89
+ sleep 1 # Wait for eventual consistency
90
+ group = @ec2group.get(test_name)
91
+ assert group.addresses.is_a?(Hash), "Addresses is not a hash"
92
+ assert group.addresses.empty?, "Some addresses not revoked #{group.addresses.to_s}"
93
+ end
94
+
95
+
96
+ should "(21) authorize/revoke group permissions for account/group" do
97
+ test_name ||= 'test-' << Rudy::Utils.strand
98
+ group = @ec2group.create(test_name)
99
+ should_have = "#{@accountnum}:#{test_name}"
100
+
101
+ ret = @ec2group.authorize_group(test_name, test_name, @accountnum)
102
+ assert ret, "Authorize failed (#{should_have})"
103
+ group = @ec2group.get(test_name)
104
+ assert group.is_a?(Rudy::AWS::EC2::Group), "Not a Group object"
105
+ assert group.groups.is_a?(Hash), "Groups is not a Hash (#{group.groups.class})"
106
+ assert_equal should_have, group.groups.keys.first, "Authorized group is not #{should_have}"
107
+ # TODO: Check port ranges
108
+
109
+ ret = @ec2group.revoke_group(test_name, test_name, @accountnum)
110
+ assert ret, "Revoke failed (#{should_have})"
111
+ group = @ec2group.get(test_name)
112
+ assert group.is_a?(Rudy::AWS::EC2::Group), "Not a Group object"
113
+ assert group.groups.is_a?(Hash), "Groups is not a Hash (#{group.groups.class})"
114
+ assert !group.groups.has_key?(should_have), "Still authorized for #{should_have}"
115
+ end
116
+
117
+
118
+ should "(50) destroy groups" do
119
+ group_list = get_groups
120
+ assert !group_list.empty?, "No groups"
121
+ group_list.each_pair do |gname,group|
122
+ assert @ec2group.destroy(group.name), "Not destroyed (#{group.name})"
123
+ end
124
+ end
125
+
126
+
127
+ end
128
+
129
+
130
+ end
131
+ end