rudy 0.4.0 → 0.6.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 +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